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/site.dart'; import 'package:test_sa/models/timer_model.dart'; class GasRefillModel { GasRefillModel( {this.id, this.gazRefillNo, 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.gazRefillDetails, this.localEngineerSignature, this.localNurseSignature, this.timer, this.timerModelList, this.gasRefillTimer, this.gasRefillAttachments, }); GasRefillModel.fromJson(dynamic json) { id = json['id']; gazRefillNo = json['gazRefillNo']; expectedDate = json['expectedDate']; expectedTime = json['expectedTime']; startDate = json['startDate']; startTime = json['startTime']; endDate = json['endDate']; endTime = json['endTime']; comment = json['comment']; workingHours = json['workingHours']; extensionNo = json['extensionNo']; employeeId = json['employeeId']; name = json['name']; createdDate = json['createdDate']; //TODO need to use this when added from backend... if (json['gasRefillTimer'] != null) { gasRefillTimer = []; json['gasRefillTimer'].forEach((v) { gasRefillTimer?.add(GasRefillTimer.fromJson(v)); }); workingHours = json['gasRefillTimer'].fold(0.0, (sum, item) => (sum ?? 0) + DateTime.parse(item['endDateTime']).difference(DateTime.parse(item['startDateTime'])).inSeconds) ?? 0; } if (json['gasRefillAttachments'] != null) { gasRefillAttachments = []; json['gasRefillAttachments'].forEach((v) { gasRefillAttachments!.add(GasRefillAttachments.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; assignedEmployee = json['assignedEmployee'] != null ? AssignedEmployee.fromJson(json['assignedEmployee']) : null; status = json['status'] != null ? Lookup.fromJson(json['status']) : null; if (json['gazRefillDetails'] != null) { gazRefillDetails = []; json['gazRefillDetails'].forEach((v) { gazRefillDetails!.add(GasRefillDetails.fromJson(v)); // Use '!' since gazRefillDetails is initialized here }); } } num? id; // Now nullable String? gazRefillNo; // 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 AssignedEmployee? assignedEmployee; // Now nullable Lookup? status; // Now nullable String? comment; // Now nullable List? gazRefillDetails; // Now nullable Uint8List? localNurseSignature; // Now nullable Uint8List? localEngineerSignature; // Now nullable TimerModel? timer; //TODO need to check when api provided.. List? timerModelList = []; List? gasRefillTimer = []; List? gasRefillAttachments; Map toJson() { final map = {}; map['id'] = id ?? 0; map['gazRefillNo'] = "GR-${DateTime.now().toString().split(" ").first}"; map['expectedDate'] = expectedDate; 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; //TODO need to check parameters here ... if (gasRefillTimer != null) { map['gasRefillTimer'] = gasRefillTimer?.map((v) => v.toJson()).toList(); } if (gasRefillAttachments != null) { map['gasRefillAttachments'] = gasRefillAttachments?.map((v) => v.toJson()).toList(); } 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 (gazRefillDetails != null) { map['gazRefillDetails'] = gazRefillDetails!.map((v) => v.toJson()).toList(); // Use '!' since gazRefillDetails could be null } 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; gazRefillNo = model.gazRefillNo; status = Lookup.fromStatus(model.status); gazRefillDetails = model.gazRefillDetails; 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; createdDate = model.createdDate; } GasRefillModel copyWith({ num? id, // Parameters are now nullable String? gazRefillNo, 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? gazRefillDetails, List? gasRefillTimer, TimerModel? timer, }) => GasRefillModel( id: id ?? this.id, gazRefillNo: gazRefillNo ?? this.gazRefillNo, 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, gazRefillDetails: gazRefillDetails ?? this.gazRefillDetails, timer: timer ?? this.timer, gasRefillTimer : gasRefillTimer ?? this.gasRefillTimer, ); } 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? startTime; String? endTime; dynamic workingHours; GasRefillTimer({this.id, this.startTime, this.endTime, this.workingHours}); GasRefillTimer.fromJson(Map json) { id = json['id']; startTime = json['startDateTime']; endTime = json['endDateTime']; workingHours = json['workingHour']; } Map toJson() { final Map data = {}; data['id'] = id; data['startDateTime'] = startTime; data['endDateTime'] = endTime; data['workingHour'] = workingHours; return data; } } class GasRefillAttachments { int? id; String? attachmentName; GasRefillAttachments({this.id, this.attachmentName}); GasRefillAttachments.fromJson(Map json) { id = json['id']; attachmentName = json['attachmentName']; } Map toJson() { final Map data = {}; data['id'] = id; data['attachmentName'] = attachmentName; return data; } }