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.
cloudsolutions-atoms/lib/modules/site_request_module/providers/site_request_provider.dart

194 lines
6.0 KiB
Dart

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();
}
}