import 'dart:typed_data'; import 'package:flutter/cupertino.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/new_models/assigned_employee.dart'; import 'package:test_sa/models/new_models/building.dart'; import 'package:test_sa/models/new_models/department.dart'; import 'package:test_sa/models/new_models/floor.dart'; import 'package:test_sa/models/new_models/mapped_sites.dart'; import 'package:test_sa/models/new_models/site.dart'; import 'package:test_sa/models/timer_model.dart'; class GasRefillModel { GasRefillModel({ this.id, this.gasRefillNo, this.expectedDate, this.expectedTime, this.startDate, this.startTime, this.endDate, this.endTime, this.engSignature, this.nurseSignature, this.workingHours, this.extensionNo, this.employeeId, this.name, this.createdDate, this.site, this.building, this.floor, this.department, this.assignedEmployee, this.status, this.comment, this.mapSite, this.mappedFloor, this.mappedBuilding, this.mappedDepartment, this.techComment, this.gasRefillDetails, this.localEngineerSignature, this.localNurseSignature, this.timer, this.timerModelList, this.gasRefillTimers, this.gasRefillAttachments, this.gasRefillContactPerson, this.statusValue, }); num? id; // Now nullable String? gasRefillNo; // Now nullable String? expectedDate; // Now nullable String? expectedTime; // Now nullable String? startDate; // Now nullable String? startTime; // Now nullable String? endDate; // Now nullable String? endTime; // Now nullable String? engSignature; // Now nullable String? nurseSignature; // Now nullable double? workingHours; dynamic extensionNo; String? employeeId; String? name; String? createdDate; Site? site; // Now nullable Building? building; // Now nullable Floor? floor; // Now nullable Department? department; // Now nullable MappedSite? mapSite; // Now nullable MappedBuilding? mappedBuilding; // Now nullable MappedFloor? mappedFloor; // Now nullable MappedDepartment? mappedDepartment; // AssignedEmployee? assignedEmployee; // Now nullable Lookup? status; // Now nullable String? comment; // Now nullable String? techComment; // Now nullable List? gasRefillDetails; // Now nullable Uint8List? localNurseSignature; // Now nullable Uint8List? localEngineerSignature; // Now nullable TimerModel? timer = TimerModel(); List? timerModelList = []; List? gasRefillTimers = []; List? gasRefillAttachments; List? gasRefillContactPerson; int? statusValue; GasRefillModel.fromJson(dynamic json) { id = json['id']; gasRefillNo = json['gasRefillNo']; expectedDate = json['expectedDate']; expectedTime = json['expectedTime']; startDate = json['startDate']; startTime = json['startTime']; endDate = json['endDate']; endTime = json['endTime']; comment = json['comment']; techComment = json['techComment']; workingHours = json['workingHours']; extensionNo = json['extensionNo']; employeeId = json['employeeId']; name = json['name']; createdDate = json['createdDate']; if (json['gasRefillTimers'] != null) { gasRefillTimers = []; json['gasRefillTimers'].forEach((v) { gasRefillTimers?.add(GasRefillTimer.fromJson(v)); }); workingHours = json['gasRefillTimers'].fold(0.0, (sum, item) => (sum ?? 0) + DateTime.parse(item['endDate']).difference(DateTime.parse(item['startDate'])).inSeconds) ?? 0; } if (json['gasRefillAttachments'] != null) { gasRefillAttachments = []; json['gasRefillAttachments'].forEach((v) { gasRefillAttachments!.add(GasRefillAttachments.fromJson(v)); }); } if (json['gasRefillContactPerson'] != null) { gasRefillContactPerson = []; json['gasRefillContactPerson'].forEach((v) { gasRefillContactPerson?.add(GasRefillContactPerson.fromJson(v)); }); } // try { // final DateTime? sd = DateTime.tryParse(startDate ?? ""); // final DateTime? st = DateTime.tryParse(startTime ?? ""); // final DateTime? ed = DateTime.tryParse(endDate ?? ""); // final DateTime? et = DateTime.tryParse(endTime ?? ""); // timer = TimerModel( // startAt: st == null ? sd : sd?.add(Duration(hours: st.hour, minutes: st.minute, seconds: st.second)), // Handle potential null 'sd' // endAt: et == null ? ed : ed?.add(Duration(hours: et.hour, minutes: et.minute, seconds: et.second)), // Handle potential null 'ed' // ); // if (timer!.endAt != null && timer!.startAt != null) { // // Use '!' since timer could be null after initialization // timer!.durationInSecond = (timer!.endAt!.difference(timer!.startAt!)).inSeconds; // workingHours = (((timer!.durationInSecond ?? 0) / 60) / 60); // } // } catch (e) { // print(e); // } engSignature = json['engSignature']; nurseSignature = json['nurseSignature']; site = json['site'] != null ? Site.fromJson(json['site']) : null; building = json['building'] != null ? Building.fromJson(json['building']) : null; floor = json['floor'] != null ? Floor.fromJson(json['floor']) : null; department = json['department'] != null ? Department.fromJson(json['department']) : null; mapSite = json['site'] != null ? MappedSite.fromJson(json['site']) : null; print('site i got is ::${mapSite?.toJson()}'); mappedBuilding = mapSite?.buildings?.firstWhere((element) => element.identifier == building?.identifier, orElse: () => MappedBuilding()); mappedFloor = mappedBuilding?.floors?.firstWhere((element) => element.identifier == floor?.identifier, orElse: () => MappedFloor()); mappedDepartment = mappedFloor?.departments?.firstWhere((element) => element.identifier == department?.identifier, orElse: () => MappedDepartment()); assignedEmployee = json['assignedEmployee'] != null ? AssignedEmployee.fromJson(json['assignedEmployee']) : null; status = json['status'] != null ? Lookup.fromJson(json['status']) : null; if (json['gasRefillDetails'] != null) { gasRefillDetails = []; json['gasRefillDetails'].forEach((v) { gasRefillDetails!.add(GasRefillDetails.fromJson(v)); // Use '!' since gasRefillDetails is initialized here }); } } Map toJson() { final map = {}; map['id'] = id ?? 0; map['gasTypeId'] = gasRefillDetails?[0].gasType?.id; map['cylinderTypeId'] = gasRefillDetails?[0].cylinderType?.id; map['cylinderSizeId'] = gasRefillDetails?[0].cylinderSize?.id; map['requestedQty'] = gasRefillDetails?[0].requestedQty; if (mapSite != null) { map['siteId'] = mapSite?.id; // Use '?.' for null safety } if (mappedBuilding != null) { map['buildingId'] = mappedBuilding?.clientBuildingId; // Use '?.' for null safety } if (mappedFloor != null) { map['floorId'] = mappedFloor?.clientFloorId; // Use '?.' for null safety } if (mappedDepartment != null) { map['departmentId'] = mappedDepartment?.departmentId; // Use '?.' for null safety } map['comment'] = comment; if (gasRefillAttachments != null) { map['gasRefillAttachments'] = gasRefillAttachments?.map((v) => v.toJson()).toList(); } //older code..... // map['gasRefillNo'] = "GR-${DateTime.now().toString().split(" ").first}"; // map['expectedTime'] = expectedTime; // // map['startDate'] = startDate; // map['startTime'] = startTime; // map['endDate'] = endDate; // map['endTime'] = endTime; // map['engSignature'] = engSignature; // map['nurseSignature'] = nurseSignature; // map['workingHours'] = workingHours; // map['extensionNo'] = extensionNo; // map['employeeId'] = employeeId; // map['name'] = name; // map['createdDate'] = createdDate; // map['comment'] = comment; // if (site != null) { // map['site'] = site?.toJson(addBuildings: false); // Use '?.' for null safety // } // if (building != null) { // map['building'] = building?.toJson(addFloor: false); // Use '?.' for null safety // } // if (floor != null) { // map['floor'] = floor?.toJson(addDepartments: false); // Use '?.' for null safety // } // if (department != null) { // map['department'] = department?.toJson(); // Use '?.' for null safety // } // if (assignedEmployee != null) { // map['assignedEmployee'] = assignedEmployee?.toJson(); // Use '?.' for null safety // } // if (status != null) { // map['status'] = status?.toJson(); // Use '?.' for null safety // } // if (gasRefillDetails != null) { // map['gasRefillDetails'] = gasRefillDetails!.map((v) => v.toJson()).toList(); // Use '!' since gasRefillDetails could be null // } return map; } Map toUpdateEngineerPayload({required int status}) { final map = {}; map['id'] = id ?? 0; map['deliveredQty'] = gasRefillDetails?[0].deliverdQty; map['statusValue'] = status; map['techComment'] = techComment; if (gasRefillTimers != null) { map['gasRefillTimers'] = gasRefillTimers?.map((v) => v.toJson()).toList(); } if (gasRefillAttachments != null) { map['gasRefillAttachments'] = gasRefillAttachments?.map((v) => v.toJson()).toList(); } return map; } bool validate(BuildContext context) { if (site == null) { Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.destinationSite}"); return false; } else if (building == null) { Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.building}"); return false; } else if (floor == null) { Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.floor}"); return false; } else if (department == null) { Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.department}"); return false; } return true; } fromGasRefillModel(GasRefillModel model) { id = model.id; //userId = model.userId; site = model.site; gasRefillNo = model.gasRefillNo; status = Lookup.fromStatus(model.status); gasRefillDetails = model.gasRefillDetails; building = model.building; floor = model.floor; department = model.department; startDate = model.startDate; endDate = model.endDate; expectedDate = model.expectedDate; comment = model.comment; assignedEmployee = model.assignedEmployee; localEngineerSignature = model.localEngineerSignature; localNurseSignature = model.localNurseSignature; engSignature = model.engSignature; nurseSignature = model.nurseSignature; workingHours = model.workingHours; extensionNo = model.extensionNo; employeeId = model.employeeId; name = model.name; techComment = model.techComment; gasRefillAttachments = model.gasRefillAttachments; createdDate = model.createdDate; workingHours = model.workingHours; gasRefillTimers = model.gasRefillTimers; } GasRefillModel copyWith({ num? id, // Parameters are now nullable String? gasRefillNo, String? expectedDate, String? expectedTime, String? startDate, String? startTime, String? endDate, String? endTime, String? engSignature, String? nurseSignature, double? workingHours, num? extensionNo, num? employeeId, String? name, String? createdDate, Site? site, Building? building, Floor? floor, Department? department, AssignedEmployee? assignedEmployee, Lookup? status, String? comment, List? gasRefillDetails, List? gasRefillTimer, TimerModel? timer, }) => GasRefillModel( id: id ?? this.id, gasRefillNo: gasRefillNo ?? this.gasRefillNo, expectedDate: expectedDate ?? this.expectedDate, expectedTime: expectedTime ?? this.expectedTime, startDate: startDate ?? this.startDate, startTime: startTime ?? this.startTime, endDate: endDate ?? this.endDate, endTime: endTime ?? this.endTime, engSignature: engSignature ?? this.engSignature, nurseSignature: nurseSignature ?? this.nurseSignature, workingHours: workingHours ?? this.workingHours, site: site ?? this.site, building: building ?? this.building, floor: floor ?? this.floor, department: department ?? this.department, assignedEmployee: assignedEmployee ?? this.assignedEmployee, status: status ?? this.status, comment: comment ?? this.comment, gasRefillDetails: gasRefillDetails ?? this.gasRefillDetails, timer: timer ?? this.timer, gasRefillTimers: gasRefillTimer ?? this.gasRefillTimers, ); } class GasRefillDetails { GasRefillDetails({ this.id, this.gasType, this.cylinderType, this.cylinderSize, this.requestedQty, this.deliverdQty, this.selectedForEditing, }); GasRefillDetails.fromJson(dynamic json) { id = json['id']; gasType = json['gasType'] != null ? Lookup.fromJson(json['gasType']) : null; cylinderType = json['cylinderType'] != null ? Lookup.fromJson(json['cylinderType']) : null; cylinderSize = json['cylinderSize'] != null ? Lookup.fromJson(json['cylinderSize']) : null; requestedQty = json['requestedQty']; deliverdQty = json['deliverdQty']; } num? id; // Now nullable Lookup? gasType; // Now nullable Lookup? cylinderType; // Now nullable Lookup? cylinderSize; // Now nullable num? requestedQty; // Now nullable num? deliverdQty; // Now nullable bool? selectedForEditing; // Now nullable GasRefillDetails copyWith({ num? id, // Parameters are now nullable Lookup? gasType, Lookup? cylinderType, Lookup? cylinderSize, num? requestedQty, num? deliverdQty, bool? selectedForEditing, }) => GasRefillDetails( id: id ?? this.id, gasType: gasType ?? this.gasType, cylinderType: cylinderType ?? this.cylinderType, cylinderSize: cylinderSize ?? this.cylinderSize, requestedQty: requestedQty ?? this.requestedQty, deliverdQty: deliverdQty ?? this.deliverdQty, selectedForEditing: selectedForEditing ?? this.selectedForEditing, ); Map toJson() { final map = {}; map['id'] = id ?? 0; if (gasType != null) { map['gasType'] = gasType?.toJson(); // Use '?.' for null safety } if (cylinderType != null) { map['cylinderType'] = cylinderType?.toJson(); // Use '?.' for null safety } if (cylinderSize != null) { map['cylinderSize'] = cylinderSize?.toJson(); // Use '?.' for null safety } map['requestedQty'] = requestedQty; map['deliverdQty'] = deliverdQty; return map; } bool validate(BuildContext context) { if (gasType == null) { Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.gasType}"); return false; } else if (requestedQty == null) { Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.quantity}"); return false; } else if (cylinderType == null) { Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.cylinderType}"); return false; } else if (cylinderSize == null) { Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.cylinderSize}"); return false; } return true; } } class GasRefillTimer { int? id; String? startDate; String? endDate; dynamic workingHours; GasRefillTimer({this.id, this.startDate, this.endDate, this.workingHours}); GasRefillTimer.fromJson(Map json) { id = json['id']; startDate = json['startDate']; endDate = json['endDate']; workingHours = json['workingHours']; } Map toJson() { final Map data = {}; data['id'] = id; data['startDate'] = startDate; data['endDate'] = endDate; data['workingHours'] = workingHours; return data; } } class GasRefillAttachments { int? id; num? gasRefillId; String? attachmentName; GasRefillAttachments({this.id, this.attachmentName, this.gasRefillId}); GasRefillAttachments.fromJson(Map json) { id = json['id']; gasRefillId = json['gasRefillId']; attachmentName = json['attachmentName']; } Map toJson() { final Map data = {}; data['id'] = id; data['gasRefillId'] = gasRefillId; data['attachmentName'] = attachmentName; return data; } } class GasRefillContactPerson { int? id; int? gasRefillId; String? employeeId; String? employeeCode; String? name; String? email; String? mobilePhone; String? extension; GasRefillContactPerson({ this.id, this.gasRefillId, this.employeeId, this.employeeCode, this.name, this.email, this.mobilePhone, this.extension, }); factory GasRefillContactPerson.fromJson(Map json) { return GasRefillContactPerson( id: json['id'], gasRefillId: json['gasRefillId'], employeeId: json['employeeId'], employeeCode: json['employeeCode'], name: json['name'], email: json['email'], mobilePhone: json['mobilePhone'], extension: json['extension'], ); } Map toJson() { return { 'id': id, 'gasRefillId': gasRefillId, 'employeeId': employeeId, 'employeeCode': employeeCode, 'name': name, 'email': email, 'mobilePhone': mobilePhone, 'extension': extension, }; } }