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.site, this.building, this.floor, this.department, this.assignedEmployee, this.status, this.comment, this.gazRefillDetails, this.localEngineerSignature, this.localNurseSignature, this.timer, }); 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']; 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 num? workingHours; // Now nullable 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; // Now nullable 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, num? workingHours, Site? site, Building? building, Floor? floor, Department? department, AssignedEmployee? assignedEmployee, Lookup? status, String? comment, List? gazRefillDetails, 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, ); 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['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 (gazRefillDetails != null) { map['gazRefillDetails'] = gazRefillDetails!.map((v) => v.toJson()).toList(); // Use '!' since gazRefillDetails could be null } return map; } Future validate(BuildContext context) async { if (site == null) { await Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.destinationSite}"); return false; } else if (building == null) { await Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.building}"); return false; } else if (floor == null) { await Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.floor}"); return false; } else if (department == null) { await 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; } } 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; } Future validate(BuildContext context) async { if (gasType == null) { await Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.gasType}"); return false; } else if (cylinderType == null) { await Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.cylinderType}"); return false; } else if (cylinderSize == null) { await Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.cylinderSize}"); return false; } return true; } }