|
|
|
|
/// Model representing a site request with all necessary information
|
|
|
|
|
/// Supports three request types: Add Site, Change Site, and Remove Site
|
|
|
|
|
class SiteRequestModel {
|
|
|
|
|
final String? id;
|
|
|
|
|
final String requestType;
|
|
|
|
|
final String employeeId;
|
|
|
|
|
final String fullName;
|
|
|
|
|
final String emailAddress;
|
|
|
|
|
final String mobileNumber;
|
|
|
|
|
final String? extensionNumber;
|
|
|
|
|
final List<String> siteIds;
|
|
|
|
|
final List<String> siteNames;
|
|
|
|
|
final List<String>? oldSiteIds; // For Change Site request
|
|
|
|
|
final List<String>? oldSiteNames; // For Change Site request
|
|
|
|
|
final List<String>? departmentIds;
|
|
|
|
|
final List<String>? departmentNames;
|
|
|
|
|
final String role;
|
|
|
|
|
final String status; // Pending, Approved, Rejected
|
|
|
|
|
final DateTime requestDate;
|
|
|
|
|
|
|
|
|
|
SiteRequestModel({
|
|
|
|
|
this.id,
|
|
|
|
|
required this.requestType,
|
|
|
|
|
required this.employeeId,
|
|
|
|
|
required this.fullName,
|
|
|
|
|
required this.emailAddress,
|
|
|
|
|
required this.mobileNumber,
|
|
|
|
|
this.extensionNumber,
|
|
|
|
|
required this.siteIds,
|
|
|
|
|
required this.siteNames,
|
|
|
|
|
this.oldSiteIds,
|
|
|
|
|
this.oldSiteNames,
|
|
|
|
|
this.departmentIds,
|
|
|
|
|
this.departmentNames,
|
|
|
|
|
required this.role,
|
|
|
|
|
required this.status,
|
|
|
|
|
required this.requestDate,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
/// Converts model to JSON for API submission
|
|
|
|
|
Map<String, dynamic> toJson() {
|
|
|
|
|
return {
|
|
|
|
|
'id': id,
|
|
|
|
|
'requestType': requestType,
|
|
|
|
|
'employeeId': employeeId,
|
|
|
|
|
'fullName': fullName,
|
|
|
|
|
'emailAddress': emailAddress,
|
|
|
|
|
'mobileNumber': mobileNumber,
|
|
|
|
|
'extensionNumber': extensionNumber,
|
|
|
|
|
'siteIds': siteIds,
|
|
|
|
|
'siteNames': siteNames,
|
|
|
|
|
'oldSiteIds': oldSiteIds,
|
|
|
|
|
'oldSiteNames': oldSiteNames,
|
|
|
|
|
'departmentIds': departmentIds,
|
|
|
|
|
'departmentNames': departmentNames,
|
|
|
|
|
'role': role,
|
|
|
|
|
'status': status,
|
|
|
|
|
'requestDate': requestDate.toIso8601String(),
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Creates model from API response JSON
|
|
|
|
|
factory SiteRequestModel.fromJson(Map<String, dynamic> json) {
|
|
|
|
|
final sitesData = _parseSitesFromJson(json);
|
|
|
|
|
final departmentsData = _parseDepartmentsFromJson(json);
|
|
|
|
|
|
|
|
|
|
return SiteRequestModel(
|
|
|
|
|
id: json['id']?.toString() ?? json['requestNumber']?.toString() ?? '',
|
|
|
|
|
requestType: _parseRequestType(json),
|
|
|
|
|
employeeId: json['employeeId'] ?? '',
|
|
|
|
|
fullName: json['userName'] ?? json['fullName'] ?? '',
|
|
|
|
|
emailAddress: json['email'] ?? json['emailAddress'] ?? '',
|
|
|
|
|
mobileNumber: json['mobileNumber'] ?? '',
|
|
|
|
|
extensionNumber: json['extensionNo'] ?? json['extensionNumber'],
|
|
|
|
|
siteIds: sitesData['siteIds'],
|
|
|
|
|
siteNames: sitesData['siteNames'],
|
|
|
|
|
oldSiteIds: sitesData['oldSiteIds'],
|
|
|
|
|
oldSiteNames: sitesData['oldSiteNames'],
|
|
|
|
|
departmentIds: departmentsData['departmentIds'],
|
|
|
|
|
departmentNames: departmentsData['departmentNames'],
|
|
|
|
|
role: json['role'] ?? '',
|
|
|
|
|
status: _parseStatus(json),
|
|
|
|
|
requestDate: _parseDate(json),
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Creates a copy with optional field updates
|
|
|
|
|
SiteRequestModel copyWith({
|
|
|
|
|
String? id,
|
|
|
|
|
String? requestType,
|
|
|
|
|
String? employeeId,
|
|
|
|
|
String? fullName,
|
|
|
|
|
String? emailAddress,
|
|
|
|
|
String? mobileNumber,
|
|
|
|
|
String? extensionNumber,
|
|
|
|
|
List<String>? siteIds,
|
|
|
|
|
List<String>? siteNames,
|
|
|
|
|
List<String>? oldSiteIds,
|
|
|
|
|
List<String>? oldSiteNames,
|
|
|
|
|
List<String>? departmentIds,
|
|
|
|
|
List<String>? departmentNames,
|
|
|
|
|
String? role,
|
|
|
|
|
String? status,
|
|
|
|
|
DateTime? requestDate,
|
|
|
|
|
}) {
|
|
|
|
|
return SiteRequestModel(
|
|
|
|
|
id: id ?? this.id,
|
|
|
|
|
requestType: requestType ?? this.requestType,
|
|
|
|
|
employeeId: employeeId ?? this.employeeId,
|
|
|
|
|
fullName: fullName ?? this.fullName,
|
|
|
|
|
emailAddress: emailAddress ?? this.emailAddress,
|
|
|
|
|
mobileNumber: mobileNumber ?? this.mobileNumber,
|
|
|
|
|
extensionNumber: extensionNumber ?? this.extensionNumber,
|
|
|
|
|
siteIds: siteIds ?? this.siteIds,
|
|
|
|
|
siteNames: siteNames ?? this.siteNames,
|
|
|
|
|
oldSiteIds: oldSiteIds ?? this.oldSiteIds,
|
|
|
|
|
oldSiteNames: oldSiteNames ?? this.oldSiteNames,
|
|
|
|
|
departmentIds: departmentIds ?? this.departmentIds,
|
|
|
|
|
departmentNames: departmentNames ?? this.departmentNames,
|
|
|
|
|
role: role ?? this.role,
|
|
|
|
|
status: status ?? this.status,
|
|
|
|
|
requestDate: requestDate ?? this.requestDate,
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Private helper methods for parsing
|
|
|
|
|
|
|
|
|
|
static Map<String, dynamic> _parseSitesFromJson(Map<String, dynamic> json) {
|
|
|
|
|
List<String> siteIds = [];
|
|
|
|
|
List<String> siteNames = [];
|
|
|
|
|
List<String>? oldSiteIds;
|
|
|
|
|
List<String>? oldSiteNames;
|
|
|
|
|
|
|
|
|
|
if (json['sites'] != null && json['sites'] is List) {
|
|
|
|
|
for (var site in json['sites']) {
|
|
|
|
|
siteIds.add(site['siteId']?.toString() ?? '');
|
|
|
|
|
siteNames.add(site['siteName'] ?? '');
|
|
|
|
|
|
|
|
|
|
if (site['oldSiteId'] != null && site['oldSiteId'] != 0) {
|
|
|
|
|
oldSiteIds ??= [];
|
|
|
|
|
oldSiteNames ??= [];
|
|
|
|
|
oldSiteIds.add(site['oldSiteId']?.toString() ?? '');
|
|
|
|
|
oldSiteNames.add(site['oldSitName'] ?? '');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
'siteIds': siteIds,
|
|
|
|
|
'siteNames': siteNames,
|
|
|
|
|
'oldSiteIds': oldSiteIds,
|
|
|
|
|
'oldSiteNames': oldSiteNames,
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static Map<String, List<String>?> _parseDepartmentsFromJson(Map<String, dynamic> json) {
|
|
|
|
|
List<String>? departmentIds;
|
|
|
|
|
List<String>? departmentNames;
|
|
|
|
|
|
|
|
|
|
if (json['departments'] != null &&
|
|
|
|
|
json['departments'] is List &&
|
|
|
|
|
(json['departments'] as List).isNotEmpty) {
|
|
|
|
|
departmentIds = [];
|
|
|
|
|
departmentNames = [];
|
|
|
|
|
for (var dept in json['departments']) {
|
|
|
|
|
departmentIds.add(dept['departmentId']?.toString() ?? '');
|
|
|
|
|
departmentNames.add(dept['departmentName'] ?? '');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
'departmentIds': departmentIds,
|
|
|
|
|
'departmentNames': departmentNames,
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static String _parseRequestType(Map<String, dynamic> json) {
|
|
|
|
|
return json['requestType'] is Map
|
|
|
|
|
? (json['requestType']['name'] ?? '')
|
|
|
|
|
: (json['requestType'] ?? '');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static String _parseStatus(Map<String, dynamic> json) {
|
|
|
|
|
return json['status'] is Map
|
|
|
|
|
? (json['status']['name'] ?? 'Pending')
|
|
|
|
|
: (json['status'] ?? 'Pending');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static DateTime _parseDate(Map<String, dynamic> json) {
|
|
|
|
|
if (json['createdDate'] != null) {
|
|
|
|
|
return DateTime.parse(json['createdDate']);
|
|
|
|
|
} else if (json['requestDate'] != null) {
|
|
|
|
|
return DateTime.parse(json['requestDate']);
|
|
|
|
|
}
|
|
|
|
|
return DateTime.now();
|
|
|
|
|
}
|
|
|
|
|
}
|