/// 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? requestNumber; final String employeeId; final String fullName; final String emailAddress; final String mobileNumber; final String? extensionNumber; final List siteIds; final List siteNames; final List? oldSiteIds; // For Change Site request final List? oldSiteNames; // For Change Site request final List? departmentIds; final List? departmentNames; final List? oldDepartmentIds; // For Change Site request - old departments final List? oldDepartmentNames; // For Change Site request - old departments final String role; final String ?status; // Pending, Approved, Rejected final DateTime? requestDate; SiteRequestModel({ this.id, required this.requestType, this.requestNumber, 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, this.oldDepartmentIds, this.oldDepartmentNames, required this.role, this.status, this.requestDate, }); /// Converts model to JSON for API submission Map toJson() { return { 'id': id, 'requestType': requestType, 'requestNumber': requestNumber, '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 json) { final sitesData = _parseSitesFromJson(json); final departmentsData = _parseDepartmentsFromJson(json); return SiteRequestModel( id: json['id']?.toString() ?? json['requestNumber']?.toString() ?? '', requestType: _parseRequestType(json), employeeId: json['employeeId'] ?? '', requestNumber: json['requestNumber'] ?? '', 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'], oldDepartmentIds: departmentsData['oldDepartmentIds'], oldDepartmentNames: departmentsData['oldDepartmentNames'], 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? siteIds, List? siteNames, List? oldSiteIds, List? oldSiteNames, List? departmentIds, List? departmentNames, String? role, String? status, DateTime? requestDate, }) { return SiteRequestModel( id: id ?? this.id, requestType: requestType ?? this.requestType, requestNumber: requestNumber ?? this.requestNumber, 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 _parseSitesFromJson(Map json) { List siteIds = []; List siteNames = []; List? oldSiteIds; List? 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?> _parseDepartmentsFromJson(Map json) { List? departmentIds; List? departmentNames; List? oldDepartmentIds; List? oldDepartmentNames; 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'] ?? ''); // Check for old department data in Change Site requests if (dept['oldDepartmentId'] != null && dept['oldDepartmentId'] != 0) { oldDepartmentIds ??= []; oldDepartmentNames ??= []; oldDepartmentIds.add(dept['oldDepartmentId']?.toString() ?? ''); oldDepartmentNames.add(dept['oldDepartmentName'] ?? ''); } } } return { 'departmentIds': departmentIds, 'departmentNames': departmentNames, 'oldDepartmentIds': oldDepartmentIds, 'oldDepartmentNames': oldDepartmentNames, }; } static String _parseRequestType(Map json) { return json['requestType'] is Map ? (json['requestType']['name'] ?? '') : (json['requestType'] ?? ''); } static String _parseStatus(Map json) { return json['status'] is Map ? (json['status']['name'] ?? 'Pending') : (json['status'] ?? 'Pending'); } static DateTime _parseDate(Map json) { if (json['createdDate'] != null) { return DateTime.parse(json['createdDate']); } else if (json['requestDate'] != null) { return DateTime.parse(json['requestDate']); } return DateTime.now(); } }