You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
194 lines
6.0 KiB
Dart
194 lines
6.0 KiB
Dart
|
3 weeks ago
|
import 'package:flutter/material.dart';
|
||
|
|
import 'package:test_sa/modules/site_request_module/models/dropdown_models.dart';
|
||
|
|
import 'package:test_sa/modules/site_request_module/models/mock_user_model.dart';
|
||
|
|
import 'package:test_sa/modules/site_request_module/models/request_type_model.dart';
|
||
|
|
import 'package:test_sa/modules/site_request_module/models/site_request_model.dart';
|
||
|
|
|
||
|
|
class SiteRequestProvider extends ChangeNotifier {
|
||
|
|
bool _loading = false;
|
||
|
|
bool get loading => _loading;
|
||
|
|
|
||
|
|
set loading(bool value) {
|
||
|
|
_loading = value;
|
||
|
|
notifyListeners();
|
||
|
|
}
|
||
|
|
|
||
|
|
String? _errorMessage;
|
||
|
|
String? get errorMessage => _errorMessage;
|
||
|
|
|
||
|
|
// Mock user data
|
||
|
|
late MockUserModel _currentUser;
|
||
|
|
MockUserModel get currentUser => _currentUser;
|
||
|
|
|
||
|
|
// Request types as Base models
|
||
|
|
final List<RequestTypeModel> _requestTypes = [
|
||
|
|
RequestTypeModel(id: 'add_site', name: 'Add Site'),
|
||
|
|
RequestTypeModel(id: 'change_site', name: 'Change Site'),
|
||
|
|
RequestTypeModel(id: 'remove_site', name: 'Remove Site'),
|
||
|
|
];
|
||
|
|
|
||
|
|
List<RequestTypeModel> get requestTypes => _requestTypes;
|
||
|
|
|
||
|
|
// Mock sites as Base models
|
||
|
|
final List<SiteRequestSiteModel> _allSites = [
|
||
|
|
SiteRequestSiteModel(id: 'site_1', name: 'Site A'),
|
||
|
|
SiteRequestSiteModel(id: 'site_2', name: 'Site B'),
|
||
|
|
SiteRequestSiteModel(id: 'site_3', name: 'Site C'),
|
||
|
|
SiteRequestSiteModel(id: 'site_4', name: 'Site D'),
|
||
|
|
SiteRequestSiteModel(id: 'site_5', name: 'Site E'),
|
||
|
|
];
|
||
|
|
|
||
|
|
List<SiteRequestSiteModel> get allSites => _allSites;
|
||
|
|
|
||
|
|
// Mock departments as Base models
|
||
|
|
final List<SiteRequestDepartmentModel> _allDepartments = [
|
||
|
|
SiteRequestDepartmentModel(id: 'dept_1', name: 'HR'),
|
||
|
|
SiteRequestDepartmentModel(id: 'dept_2', name: 'IT'),
|
||
|
|
SiteRequestDepartmentModel(id: 'dept_3', name: 'Finance'),
|
||
|
|
SiteRequestDepartmentModel(id: 'dept_4', name: 'Operations'),
|
||
|
|
SiteRequestDepartmentModel(id: 'dept_5', name: 'Administration'),
|
||
|
|
];
|
||
|
|
|
||
|
|
List<SiteRequestDepartmentModel> get allDepartments => _allDepartments;
|
||
|
|
|
||
|
|
// History of submitted requests
|
||
|
|
final List<SiteRequestModel> _requestHistory = [];
|
||
|
|
List<SiteRequestModel> get requestHistory => _requestHistory;
|
||
|
|
|
||
|
|
SiteRequestProvider() {
|
||
|
|
_initializeMockUser();
|
||
|
|
}
|
||
|
|
|
||
|
|
void _initializeMockUser() {
|
||
|
|
_currentUser = MockUserModel(
|
||
|
|
employeeId: 'EMP001',
|
||
|
|
fullName: 'John Smith',
|
||
|
|
emailAddress: 'john.smith@test.com',
|
||
|
|
mobileNumber: '+966500000000',
|
||
|
|
extensionNumber: '1234',
|
||
|
|
role: 'Engineer',
|
||
|
|
assignedSites: ['Site A', 'Site B'],
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
// Get available sites based on request type
|
||
|
|
List<SiteRequestSiteModel> getAvailableSites(String requestType) {
|
||
|
|
if (requestType == 'Remove Site') {
|
||
|
|
// Only return currently assigned sites
|
||
|
|
return _allSites.where((site) {
|
||
|
|
return _currentUser.assignedSites.contains(site.name ?? '');
|
||
|
|
}).toList();
|
||
|
|
}
|
||
|
|
// For Add Site and Change Site, return all sites
|
||
|
|
return _allSites;
|
||
|
|
}
|
||
|
|
|
||
|
|
// Check if user has assigned sites for removal
|
||
|
|
bool hasAssignedSites() {
|
||
|
|
return _currentUser.assignedSites.isNotEmpty;
|
||
|
|
}
|
||
|
|
|
||
|
|
// Submit site request (local only, no API)
|
||
|
|
Future<bool> submitSiteRequest(SiteRequestModel request) async {
|
||
|
|
loading = true;
|
||
|
|
_errorMessage = null;
|
||
|
|
notifyListeners();
|
||
|
|
|
||
|
|
// Simulate network delay
|
||
|
|
await Future.delayed(const Duration(seconds: 1));
|
||
|
|
|
||
|
|
try {
|
||
|
|
// Add request to history with a generated ID
|
||
|
|
final requestWithId = request.copyWith(
|
||
|
|
id: 'REQ_${DateTime.now().millisecondsSinceEpoch}',
|
||
|
|
status: 'Pending',
|
||
|
|
requestDate: DateTime.now(),
|
||
|
|
);
|
||
|
|
|
||
|
|
_requestHistory.insert(0, requestWithId);
|
||
|
|
|
||
|
|
loading = false;
|
||
|
|
notifyListeners();
|
||
|
|
return true;
|
||
|
|
} catch (error) {
|
||
|
|
_errorMessage = 'Failed to submit request';
|
||
|
|
loading = false;
|
||
|
|
notifyListeners();
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Get request by ID
|
||
|
|
SiteRequestModel? getRequestById(String id) {
|
||
|
|
try {
|
||
|
|
return _requestHistory.firstWhere((request) => request.id == id);
|
||
|
|
} catch (e) {
|
||
|
|
return null;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Reset provider state
|
||
|
|
void reset() {
|
||
|
|
_loading = false;
|
||
|
|
_errorMessage = null;
|
||
|
|
_requestHistory.clear();
|
||
|
|
_initializeMockUser();
|
||
|
|
notifyListeners();
|
||
|
|
}
|
||
|
|
|
||
|
|
// Add mock history data for testing
|
||
|
|
void addMockHistoryData() {
|
||
|
|
final mockRequests = [
|
||
|
|
SiteRequestModel(
|
||
|
|
id: 'REQ_001',
|
||
|
|
requestType: 'Add Site',
|
||
|
|
employeeId: _currentUser.employeeId,
|
||
|
|
fullName: _currentUser.fullName,
|
||
|
|
emailAddress: _currentUser.emailAddress,
|
||
|
|
mobileNumber: _currentUser.mobileNumber,
|
||
|
|
extensionNumber: _currentUser.extensionNumber,
|
||
|
|
siteIds: ['site_3', 'site_4'],
|
||
|
|
siteNames: ['Site C', 'Site D'],
|
||
|
|
departmentIds: ['dept_2'],
|
||
|
|
departmentNames: ['IT'],
|
||
|
|
role: _currentUser.role,
|
||
|
|
status: 'Approved',
|
||
|
|
requestDate: DateTime.now().subtract(const Duration(days: 5)),
|
||
|
|
),
|
||
|
|
SiteRequestModel(
|
||
|
|
id: 'REQ_002',
|
||
|
|
requestType: 'Change Site',
|
||
|
|
employeeId: _currentUser.employeeId,
|
||
|
|
fullName: _currentUser.fullName,
|
||
|
|
emailAddress: _currentUser.emailAddress,
|
||
|
|
mobileNumber: _currentUser.mobileNumber,
|
||
|
|
extensionNumber: _currentUser.extensionNumber,
|
||
|
|
siteIds: ['site_1'],
|
||
|
|
siteNames: ['Site A'],
|
||
|
|
departmentIds: ['dept_1', 'dept_3'],
|
||
|
|
departmentNames: ['HR', 'Finance'],
|
||
|
|
role: _currentUser.role,
|
||
|
|
status: 'Pending',
|
||
|
|
requestDate: DateTime.now().subtract(const Duration(days: 2)),
|
||
|
|
),
|
||
|
|
SiteRequestModel(
|
||
|
|
id: 'REQ_003',
|
||
|
|
requestType: 'Remove Site',
|
||
|
|
employeeId: _currentUser.employeeId,
|
||
|
|
fullName: _currentUser.fullName,
|
||
|
|
emailAddress: _currentUser.emailAddress,
|
||
|
|
mobileNumber: _currentUser.mobileNumber,
|
||
|
|
extensionNumber: _currentUser.extensionNumber,
|
||
|
|
siteIds: ['site_2'],
|
||
|
|
siteNames: ['Site B'],
|
||
|
|
role: _currentUser.role,
|
||
|
|
status: 'Rejected',
|
||
|
|
requestDate: DateTime.now().subtract(const Duration(days: 10)),
|
||
|
|
),
|
||
|
|
];
|
||
|
|
|
||
|
|
_requestHistory.addAll(mockRequests);
|
||
|
|
notifyListeners();
|
||
|
|
}
|
||
|
|
}
|