From a2e2d9ac12a23a0dc1cad105fd2025f8fe07c5e3 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Sun, 5 Nov 2023 15:42:02 +0300 Subject: [PATCH] Timer For Working Hours --- .../api/asset_transfer_provider.dart | 8 +- lib/models/device/asset_transfer.dart | 383 +++++++++--------- lib/models/new_models/gas_refill_model.dart | 34 +- .../service_request/service_report.dart | 22 + .../update_device_transfer.dart | 89 ++-- .../user/gas_refill/request_gas_refill.dart | 77 ++-- .../work_order/create_service_report.dart | 13 +- .../work_order/edit_service_report.dart | 16 +- lib/views/widgets/timer/app_timer.dart | 4 +- 9 files changed, 349 insertions(+), 297 deletions(-) diff --git a/lib/controllers/providers/api/asset_transfer_provider.dart b/lib/controllers/providers/api/asset_transfer_provider.dart index c53cbc9..e55b282 100644 --- a/lib/controllers/providers/api/asset_transfer_provider.dart +++ b/lib/controllers/providers/api/asset_transfer_provider.dart @@ -1,5 +1,4 @@ import 'dart:convert'; -import 'dart:developer'; import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; @@ -149,11 +148,12 @@ class AssetTransferProvider extends ChangeNotifier { } } - Future updateRequest({ - @required AssetTransfer assetTransfer, - }) async { + Future updateRequest({@required AssetTransfer assetTransfer}) async { Response response; try { + assetTransfer.receiverStartDate = assetTransfer.timer?.startAt?.toIso8601String(); + assetTransfer.receiverEndDate = assetTransfer.timer?.endAt?.toIso8601String(); + assetTransfer.receiverWorkingHours = (((assetTransfer.timer?.durationInSecond ?? 0) / 60) / 60).toStringAsFixed(2); response = await ApiManager.instance.put(URLs.updateDeviceTransfer, body: assetTransfer.toJson()); print(response.body); diff --git a/lib/models/device/asset_transfer.dart b/lib/models/device/asset_transfer.dart index 790dda4..146bb60 100644 --- a/lib/models/device/asset_transfer.dart +++ b/lib/models/device/asset_transfer.dart @@ -2,6 +2,7 @@ import 'package:flutter/src/widgets/framework.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/models/device/asset.dart'; +import 'package:test_sa/models/timer_model.dart'; import 'asset_transfer_attachment.dart'; @@ -40,31 +41,32 @@ class AssetTransfer { this.receiverEngSignature, this.receiverAttachments, this.assetNumber, - this.assetName, - this.manufacturerName, - this.modelName, - this.assetSerialNo, - this.destDepartmentName, - this.destBuildingName, - this.applied, - this.createdOn, - this.destFloorName, - this.destSiteName, - this.manufacturerId, - this.modelId, - this.modifiedOn, - this.receiverAssignedEmployeeName, - this.receiverEngSignatureUrl, - this.receiverMachineStatusName, - this.senderAssignedEmployeeName, - this.senderBuildingName, - this.senderDepartmentName, - this.senderEngSignatureUrl, - this.senderFloorName, - this.senderMachineStatusName, - this.senderSiteName, - this.supplierId, - this.supplierName + this.assetName, + this.manufacturerName, + this.modelName, + this.assetSerialNo, + this.destDepartmentName, + this.destBuildingName, + this.applied, + this.createdOn, + this.destFloorName, + this.destSiteName, + this.manufacturerId, + this.modelId, + this.modifiedOn, + this.receiverAssignedEmployeeName, + this.receiverEngSignatureUrl, + this.receiverMachineStatusName, + this.senderAssignedEmployeeName, + this.senderBuildingName, + this.senderDepartmentName, + this.senderEngSignatureUrl, + this.senderFloorName, + this.senderMachineStatusName, + this.senderSiteName, + this.supplierId, + this.supplierName, + this.timer, }); AssetTransfer.fromJson(dynamic json) { @@ -104,38 +106,47 @@ class AssetTransfer { receiverWorkingHours = json['receiverWorkingHours']; receiverTravelingHours = json['receiverTravelingHours']; receiverEngSignature = json['receiverEngSignature']; + try { + timer = TimerModel(startAt: DateTime.tryParse(receiverStartDate ?? ""), endAt: DateTime.tryParse(receiverEndDate)); + if (timer.endAt != null && timer.startAt != null) { + timer.durationInSecond = (timer.endAt.difference(timer.startAt))?.inSeconds; + receiverWorkingHours = (((timer.durationInSecond ?? 0) / 60) / 60)?.toStringAsFixed(2); + } + } catch (e) { + print(e); + } if (json['receiverAttachments'] != null) { receiverAttachments = []; json['receiverAttachments'].forEach((v) { receiverAttachments.add(AssetTransferAttachment.fromJson(v)); }); } - assetNumber= json['assetNumber']; - assetName= json['assetName']; - manufacturerName= json['manufacturerName']; - modelName= json['modelName']; - assetSerialNo= json['assetSerialNo']; - destDepartmentName= json['destDepartmentName']; - destBuildingName= json['destBuildingName']; - applied= json['applied']; - createdOn= json['createdOn']; - destFloorName= json['destFloorName']; - destSiteName= json['destSiteName']; - manufacturerId= json['manufacturerId']; - modelId= json['modelId']; - modifiedOn= json['modifiedOn']; - receiverAssignedEmployeeName= json['receiverAssignedEmployeeName']; - receiverEngSignatureUrl= json['receiverEngSignatureUrl']; - receiverMachineStatusName= json['receiverMachineStatusName']; - senderAssignedEmployeeName= json['senderAssignedEmployeeName']; - senderBuildingName= json['senderBuildingName']; - senderDepartmentName= json['senderDepartmentName']; - senderEngSignatureUrl= json['senderEngSignatureUrl']; - senderFloorName= json['senderFloorName']; - senderMachineStatusName= json['senderMachineStatusName']; - senderSiteName= json['senderSiteName']; - supplierId= json['supplierId']; - supplierName= json['supplierName']; + assetNumber = json['assetNumber']; + assetName = json['assetName']; + manufacturerName = json['manufacturerName']; + modelName = json['modelName']; + assetSerialNo = json['assetSerialNo']; + destDepartmentName = json['destDepartmentName']; + destBuildingName = json['destBuildingName']; + applied = json['applied']; + createdOn = json['createdOn']; + destFloorName = json['destFloorName']; + destSiteName = json['destSiteName']; + manufacturerId = json['manufacturerId']; + modelId = json['modelId']; + modifiedOn = json['modifiedOn']; + receiverAssignedEmployeeName = json['receiverAssignedEmployeeName']; + receiverEngSignatureUrl = json['receiverEngSignatureUrl']; + receiverMachineStatusName = json['receiverMachineStatusName']; + senderAssignedEmployeeName = json['senderAssignedEmployeeName']; + senderBuildingName = json['senderBuildingName']; + senderDepartmentName = json['senderDepartmentName']; + senderEngSignatureUrl = json['senderEngSignatureUrl']; + senderFloorName = json['senderFloorName']; + senderMachineStatusName = json['senderMachineStatusName']; + senderSiteName = json['senderSiteName']; + supplierId = json['supplierId']; + supplierName = json['supplierName']; } num id; num transferNo; @@ -195,6 +206,7 @@ class AssetTransfer { bool applied; String createdOn; String modifiedOn; + TimerModel timer = TimerModel(); AssetTransfer copyWith({ num id, @@ -255,68 +267,69 @@ class AssetTransfer { String modelName, int manufacturerId, String manufacturerName, - String destDepartmentName + String destDepartmentName, + TimerModel timer, }) => AssetTransfer( - id: id ?? this.id, - transferNo: transferNo ?? this.transferNo, - transferCode: transferCode ?? this.transferCode, - assetId: assetId ?? this.assetId, - destSiteId: destSiteId ?? this.destSiteId, - destBuildingId: destBuildingId ?? this.destBuildingId, - destFloorId: destFloorId ?? this.destFloorId, - destDepartmentId: destDepartmentId ?? this.destDepartmentId, - destRoom: destRoom ?? this.destRoom, - senderSiteId: senderSiteId ?? this.senderSiteId, - senderBuildingId: senderBuildingId ?? this.senderBuildingId, - senderFloorId: senderFloorId ?? this.senderFloorId, - senderDepartmentId: senderDepartmentId ?? this.senderDepartmentId, - senderRoom: senderRoom ?? this.senderRoom, - senderAssignedEmployeeId: senderAssignedEmployeeId ?? this.senderAssignedEmployeeId, - senderMachineStatusId: senderMachineStatusId ?? this.senderMachineStatusId, - senderComment: senderComment ?? this.senderComment, - senderStartDate: senderStartDate ?? this.senderStartDate, - senderEndDate: senderEndDate ?? this.senderEndDate, - senderWorkingHours: senderWorkingHours ?? this.senderWorkingHours, - senderTravelingHours: senderTravelingHours ?? this.senderTravelingHours, - senderEngSignature: senderEngSignature ?? this.senderEngSignature, - senderAttachments: senderAttachments ?? this.senderAttachments, - receiverAssignedEmployeeId: receiverAssignedEmployeeId ?? this.receiverAssignedEmployeeId, - receiverMachineStatusId: receiverMachineStatusId ?? this.receiverMachineStatusId, - receiverComment: receiverComment ?? this.receiverComment, - receiverStartDate: receiverStartDate ?? this.receiverStartDate, - receiverEndDate: receiverEndDate ?? this.receiverEndDate, - receiverWorkingHours: receiverWorkingHours ?? this.receiverWorkingHours, - receiverTravelingHours: receiverTravelingHours ?? this.receiverTravelingHours, - receiverEngSignature: receiverEngSignature ?? this.receiverEngSignature, - receiverAttachments: receiverAttachments ?? this.receiverAttachments, - supplierId : supplierId?? this.supplierId, - supplierName: supplierName??this.supplierName, - destSiteName: destSiteName??this.destSiteName, - destBuildingName: destBuildingName?? this.destBuildingName, - destFloorName: destFloorName??this.destFloorName, - destDepartmentName: destDepartmentName?? this.destDepartmentName, - senderSiteName: senderSiteName??this.senderSiteName, - senderBuildingName: senderBuildingName??this.senderBuildingName, - senderFloorName: senderFloorName??this.senderFloorName, - senderDepartmentName: senderDepartmentName??this.senderDepartmentName, - senderAssignedEmployeeName: senderAssignedEmployeeName??this.senderAssignedEmployeeName, - senderMachineStatusName: senderMachineStatusName??this.senderMachineStatusName, - senderEngSignatureUrl: senderEngSignatureUrl??this.senderEngSignatureUrl, - receiverAssignedEmployeeName: receiverAssignedEmployeeName?? this.receiverAssignedEmployeeName, - receiverMachineStatusName: receiverMachineStatusName??this.receiverMachineStatusName, - receiverEngSignatureUrl: receiverEngSignatureUrl??this.receiverEngSignatureUrl, - applied: applied??this.applied, - createdOn: createdOn?? this.createdOn, - modifiedOn: modifiedOn??this.modifiedOn, - assetSerialNo:assetSerialNo??this.assetSerialNo, - assetNumber:assetNumber??this.assetNumber, - assetName:assetName??this.assetName, - modelId:modelId??this.modelId, - modelName:modelName??this.modelName, - manufacturerId:manufacturerId??this.manufacturerId, - manufacturerName:manufacturerName??this.manufacturerName - ); + id: id ?? this.id, + transferNo: transferNo ?? this.transferNo, + transferCode: transferCode ?? this.transferCode, + assetId: assetId ?? this.assetId, + destSiteId: destSiteId ?? this.destSiteId, + destBuildingId: destBuildingId ?? this.destBuildingId, + destFloorId: destFloorId ?? this.destFloorId, + destDepartmentId: destDepartmentId ?? this.destDepartmentId, + destRoom: destRoom ?? this.destRoom, + senderSiteId: senderSiteId ?? this.senderSiteId, + senderBuildingId: senderBuildingId ?? this.senderBuildingId, + senderFloorId: senderFloorId ?? this.senderFloorId, + senderDepartmentId: senderDepartmentId ?? this.senderDepartmentId, + senderRoom: senderRoom ?? this.senderRoom, + senderAssignedEmployeeId: senderAssignedEmployeeId ?? this.senderAssignedEmployeeId, + senderMachineStatusId: senderMachineStatusId ?? this.senderMachineStatusId, + senderComment: senderComment ?? this.senderComment, + senderStartDate: senderStartDate ?? this.senderStartDate, + senderEndDate: senderEndDate ?? this.senderEndDate, + senderWorkingHours: senderWorkingHours ?? this.senderWorkingHours, + senderTravelingHours: senderTravelingHours ?? this.senderTravelingHours, + senderEngSignature: senderEngSignature ?? this.senderEngSignature, + senderAttachments: senderAttachments ?? this.senderAttachments, + receiverAssignedEmployeeId: receiverAssignedEmployeeId ?? this.receiverAssignedEmployeeId, + receiverMachineStatusId: receiverMachineStatusId ?? this.receiverMachineStatusId, + receiverComment: receiverComment ?? this.receiverComment, + receiverStartDate: receiverStartDate ?? this.receiverStartDate, + receiverEndDate: receiverEndDate ?? this.receiverEndDate, + receiverWorkingHours: receiverWorkingHours ?? this.receiverWorkingHours, + receiverTravelingHours: receiverTravelingHours ?? this.receiverTravelingHours, + receiverEngSignature: receiverEngSignature ?? this.receiverEngSignature, + receiverAttachments: receiverAttachments ?? this.receiverAttachments, + supplierId: supplierId ?? this.supplierId, + supplierName: supplierName ?? this.supplierName, + destSiteName: destSiteName ?? this.destSiteName, + destBuildingName: destBuildingName ?? this.destBuildingName, + destFloorName: destFloorName ?? this.destFloorName, + destDepartmentName: destDepartmentName ?? this.destDepartmentName, + senderSiteName: senderSiteName ?? this.senderSiteName, + senderBuildingName: senderBuildingName ?? this.senderBuildingName, + senderFloorName: senderFloorName ?? this.senderFloorName, + senderDepartmentName: senderDepartmentName ?? this.senderDepartmentName, + senderAssignedEmployeeName: senderAssignedEmployeeName ?? this.senderAssignedEmployeeName, + senderMachineStatusName: senderMachineStatusName ?? this.senderMachineStatusName, + senderEngSignatureUrl: senderEngSignatureUrl ?? this.senderEngSignatureUrl, + receiverAssignedEmployeeName: receiverAssignedEmployeeName ?? this.receiverAssignedEmployeeName, + receiverMachineStatusName: receiverMachineStatusName ?? this.receiverMachineStatusName, + receiverEngSignatureUrl: receiverEngSignatureUrl ?? this.receiverEngSignatureUrl, + applied: applied ?? this.applied, + createdOn: createdOn ?? this.createdOn, + modifiedOn: modifiedOn ?? this.modifiedOn, + assetSerialNo: assetSerialNo ?? this.assetSerialNo, + assetNumber: assetNumber ?? this.assetNumber, + assetName: assetName ?? this.assetName, + modelId: modelId ?? this.modelId, + modelName: modelName ?? this.modelName, + manufacturerId: manufacturerId ?? this.manufacturerId, + timer: timer ?? this.timer, + manufacturerName: manufacturerName ?? this.manufacturerName); Map toJson() { final map = {}; map['id'] = id; @@ -356,12 +369,12 @@ class AssetTransfer { map['receiverAttachments'] = receiverAttachments.map((v) => v.toJson()).toList(); } map["supplierId"] = supplierId; - map["supplierName"] =supplierName; - map["destSiteName"] =destSiteName; - map["destBuildingName"] =destBuildingName; - map["destFloorName"] =destFloorName; - map["destDepartmentName"] =destDepartmentName; - map["senderSiteName"] =senderSiteName; + map["supplierName"] = supplierName; + map["destSiteName"] = destSiteName; + map["destBuildingName"] = destBuildingName; + map["destFloorName"] = destFloorName; + map["destDepartmentName"] = destDepartmentName; + map["senderSiteName"] = senderSiteName; map["senderBuildingName"] = senderBuildingName; map["senderFloorName"] = senderFloorName; map["senderDepartmentName"] = senderDepartmentName; @@ -374,13 +387,13 @@ class AssetTransfer { map["applied"] = applied; map["createdOn"] = createdOn; map["modifiedOn"] = modifiedOn; - map["assetSerialNo"] =assetSerialNo; - map["assetNumber"] =assetNumber; - map["assetName"] =assetName; - map["modelId"] =modelId; - map["modelName"] =modelName; - map["manufacturerId"] =manufacturerId; - map["manufacturerName"] =manufacturerName; + map["assetSerialNo"] = assetSerialNo; + map["assetNumber"] = assetNumber; + map["assetName"] = assetName; + map["modelId"] = modelId; + map["modelName"] = modelName; + map["manufacturerId"] = manufacturerId; + map["manufacturerName"] = manufacturerName; return map; } @@ -425,71 +438,67 @@ class AssetTransfer { return map; } - - - fromDetails(AssetTransfer assetTransfer){ - - id= assetTransfer.id; - transferNo=assetTransfer.transferNo; - transferCode= assetTransfer.transferCode; - assetId=assetTransfer.assetId; - destSiteId= assetTransfer.destSiteId; - destBuildingId=assetTransfer.destBuildingId; - destFloorId=assetTransfer.destFloorId; - destDepartmentId= assetTransfer.destDepartmentId; - destRoom=assetTransfer.destRoom; - senderSiteId=assetTransfer.senderSiteId; - senderBuildingId=assetTransfer.senderBuildingId; - senderFloorId=assetTransfer.senderFloorId; - senderDepartmentId=assetTransfer.senderDepartmentId; - senderRoom=assetTransfer.senderRoom; - senderAssignedEmployeeId= assetTransfer.senderAssignedEmployeeId; - senderMachineStatusId=assetTransfer.senderMachineStatusId; - senderComment=assetTransfer.senderComment; - senderStartDate= assetTransfer.senderStartDate; - senderEndDate= assetTransfer.senderEndDate; - senderWorkingHours= assetTransfer.senderWorkingHours; - senderTravelingHours= assetTransfer.senderTravelingHours; - senderEngSignature=assetTransfer.senderEngSignature; - senderAttachments=assetTransfer.senderAttachments; - receiverAssignedEmployeeId=assetTransfer.receiverAssignedEmployeeId; - receiverMachineStatusId= assetTransfer.receiverMachineStatusId; - receiverComment= assetTransfer.receiverComment; - receiverStartDate=assetTransfer.receiverStartDate; - receiverEndDate= assetTransfer.receiverEndDate; - receiverWorkingHours= assetTransfer.receiverWorkingHours; - receiverTravelingHours= assetTransfer.receiverTravelingHours; - receiverEngSignature= assetTransfer.receiverEngSignature; - receiverAttachments=assetTransfer.receiverAttachments; - supplierId =assetTransfer.supplierId; - supplierName=assetTransfer.supplierName; - destSiteName=assetTransfer.destSiteName; - destBuildingName=assetTransfer.destBuildingName; - destFloorName=assetTransfer.destFloorName; - destDepartmentName=assetTransfer.destDepartmentName; - senderSiteName=assetTransfer.senderSiteName; - senderBuildingName=assetTransfer.senderBuildingName; - senderFloorName=assetTransfer.senderFloorName; - senderDepartmentName=assetTransfer.senderDepartmentName; - senderAssignedEmployeeName=assetTransfer.senderAssignedEmployeeName; - senderMachineStatusName= assetTransfer.senderMachineStatusName; - senderEngSignatureUrl= assetTransfer.senderEngSignatureUrl; - receiverAssignedEmployeeName=assetTransfer.receiverAssignedEmployeeName; - receiverMachineStatusName=assetTransfer.receiverMachineStatusName; - receiverEngSignatureUrl=assetTransfer.receiverEngSignatureUrl; - applied=assetTransfer.applied; - createdOn= assetTransfer.createdOn; - modifiedOn= assetTransfer.modifiedOn; - assetSerialNo=assetTransfer.assetSerialNo; - assetNumber=assetTransfer.assetNumber; - assetName=assetTransfer.assetName; - modelId=assetTransfer.modelId; - modelName=assetTransfer.modelName; - manufacturerId=assetTransfer.manufacturerId; - manufacturerName=assetTransfer.manufacturerName; + fromDetails(AssetTransfer assetTransfer) { + id = assetTransfer.id; + transferNo = assetTransfer.transferNo; + transferCode = assetTransfer.transferCode; + assetId = assetTransfer.assetId; + destSiteId = assetTransfer.destSiteId; + destBuildingId = assetTransfer.destBuildingId; + destFloorId = assetTransfer.destFloorId; + destDepartmentId = assetTransfer.destDepartmentId; + destRoom = assetTransfer.destRoom; + senderSiteId = assetTransfer.senderSiteId; + senderBuildingId = assetTransfer.senderBuildingId; + senderFloorId = assetTransfer.senderFloorId; + senderDepartmentId = assetTransfer.senderDepartmentId; + senderRoom = assetTransfer.senderRoom; + senderAssignedEmployeeId = assetTransfer.senderAssignedEmployeeId; + senderMachineStatusId = assetTransfer.senderMachineStatusId; + senderComment = assetTransfer.senderComment; + senderStartDate = assetTransfer.senderStartDate; + senderEndDate = assetTransfer.senderEndDate; + senderWorkingHours = assetTransfer.senderWorkingHours; + senderTravelingHours = assetTransfer.senderTravelingHours; + senderEngSignature = assetTransfer.senderEngSignature; + senderAttachments = assetTransfer.senderAttachments; + receiverAssignedEmployeeId = assetTransfer.receiverAssignedEmployeeId; + receiverMachineStatusId = assetTransfer.receiverMachineStatusId; + receiverComment = assetTransfer.receiverComment; + receiverStartDate = assetTransfer.receiverStartDate; + receiverEndDate = assetTransfer.receiverEndDate; + receiverWorkingHours = assetTransfer.receiverWorkingHours; + receiverTravelingHours = assetTransfer.receiverTravelingHours; + receiverEngSignature = assetTransfer.receiverEngSignature; + receiverAttachments = assetTransfer.receiverAttachments; + supplierId = assetTransfer.supplierId; + supplierName = assetTransfer.supplierName; + destSiteName = assetTransfer.destSiteName; + destBuildingName = assetTransfer.destBuildingName; + destFloorName = assetTransfer.destFloorName; + destDepartmentName = assetTransfer.destDepartmentName; + senderSiteName = assetTransfer.senderSiteName; + senderBuildingName = assetTransfer.senderBuildingName; + senderFloorName = assetTransfer.senderFloorName; + senderDepartmentName = assetTransfer.senderDepartmentName; + senderAssignedEmployeeName = assetTransfer.senderAssignedEmployeeName; + senderMachineStatusName = assetTransfer.senderMachineStatusName; + senderEngSignatureUrl = assetTransfer.senderEngSignatureUrl; + receiverAssignedEmployeeName = assetTransfer.receiverAssignedEmployeeName; + receiverMachineStatusName = assetTransfer.receiverMachineStatusName; + receiverEngSignatureUrl = assetTransfer.receiverEngSignatureUrl; + applied = assetTransfer.applied; + createdOn = assetTransfer.createdOn; + modifiedOn = assetTransfer.modifiedOn; + assetSerialNo = assetTransfer.assetSerialNo; + assetNumber = assetTransfer.assetNumber; + assetName = assetTransfer.assetName; + modelId = assetTransfer.modelId; + modelName = assetTransfer.modelName; + manufacturerId = assetTransfer.manufacturerId; + manufacturerName = assetTransfer.manufacturerName; } - Future validate(BuildContext context) async { if (assetId == null) { await Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.device}"); diff --git a/lib/models/new_models/gas_refill_model.dart b/lib/models/new_models/gas_refill_model.dart index 55c9601..9f3284f 100644 --- a/lib/models/new_models/gas_refill_model.dart +++ b/lib/models/new_models/gas_refill_model.dart @@ -1,4 +1,3 @@ -import 'dart:developer'; import 'dart:typed_data'; import 'package:flutter/cupertino.dart'; @@ -10,6 +9,7 @@ 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({ @@ -32,7 +32,8 @@ class GasRefillModel { this.status, this.gazRefillDetails, this.localEngineerSignature, - this.localNurseSignature + this.localNurseSignature, + this.timer, }); GasRefillModel.fromJson(dynamic json) { @@ -44,6 +45,22 @@ class GasRefillModel { startTime = json['startTime']; endDate = json['endDate']; endTime = json['endTime']; + try { + final sd = DateTime.tryParse(startDate ?? ""); + final st = DateTime.tryParse(startTime ?? ""); + final ed = DateTime.tryParse(endDate ?? ""); + final et = DateTime.tryParse(endTime ?? ""); + timer = TimerModel( + startAt: st == null ? sd : sd.add(Duration(hours: st.hour, minutes: st.minute, seconds: st.second)), + endAt: et == null ? ed : ed.add(Duration(hours: et.hour, minutes: et.minute, seconds: et.second)), + ); + if (timer.endAt != null && timer.startAt != null) { + timer.durationInSecond = (timer.endAt.difference(timer.startAt))?.inSeconds; + workingHours = (((timer.durationInSecond ?? 0) / 60) / 60); + } + } catch (e) { + print(e); + } engSignature = json['engSignature']; nurseSignature = json['nurseSignature']; workingHours = json['workingHours']; @@ -81,6 +98,7 @@ class GasRefillModel { List gazRefillDetails; Uint8List localNurseSignature; Uint8List localEngineerSignature; + TimerModel timer = TimerModel(); GasRefillModel copyWith({ num id, @@ -101,6 +119,7 @@ class GasRefillModel { AssignedEmployee assignedEmployee, Lookup status, List gazRefillDetails, + TimerModel timer, }) => GasRefillModel( id: id ?? this.id, @@ -121,6 +140,7 @@ class GasRefillModel { assignedEmployee: assignedEmployee ?? this.assignedEmployee, status: status ?? this.status, gazRefillDetails: gazRefillDetails ?? this.gazRefillDetails, + timer: timer ?? this.timer, ); Map toJson() { @@ -200,15 +220,7 @@ class GasRefillModel { } class GasRefillDetails { - GasRefillDetails({ - this.id, - this.gasType, - this.cylinderType, - this.cylinderSize, - this.requestedQty, - this.deliverdQty, - this.selectedForEditing - }); + GasRefillDetails({this.id, this.gasType, this.cylinderType, this.cylinderSize, this.requestedQty, this.deliverdQty, this.selectedForEditing}); GasRefillDetails.fromJson(dynamic json) { id = json['id']; diff --git a/lib/models/service_request/service_report.dart b/lib/models/service_request/service_report.dart index cc59f67..95b0b4c 100644 --- a/lib/models/service_request/service_report.dart +++ b/lib/models/service_request/service_report.dart @@ -9,6 +9,7 @@ import 'package:test_sa/models/service_request/supp_engineer_work_orders.dart'; import 'package:test_sa/models/service_request/supplier_details.dart'; import 'package:test_sa/models/service_request/wo_call_request.dart'; import 'package:test_sa/models/service_request/wo_parent.dart'; +import 'package:test_sa/models/timer_model.dart'; import '../../attachment.dart'; import '../device/asset.dart'; @@ -54,6 +55,7 @@ class ServiceReport { this.woParentDto, this.loanAvailablity, this.assetLoan, + this.timer, }); ServiceReport.fromJson(dynamic json) { @@ -88,6 +90,15 @@ class ServiceReport { startofWorkTime = json['startofWorkTime']; endofWorkTime = json['endofWorkTime']; workingHours = json['workingHours']; + try { + timer = TimerModel(startAt: DateTime.tryParse(startofWorkTime ?? ""), endAt: DateTime.tryParse(endofWorkTime)); + if (timer.endAt != null && timer.startAt != null) { + timer.durationInSecond = (timer.endAt.difference(timer.startAt))?.inSeconds; + workingHours = (((timer.durationInSecond ?? 0) / 60) / 60); + } + } catch (e) { + print(e); + } travelingHours = json['travelingHours']; travelingExpenses = json['travelingExpenses']; faultDescription = json['faultDescription'] != null ? FaultDescription.fromJson(json['faultDescription']) : null; @@ -155,6 +166,7 @@ class ServiceReport { WoParent woParentDto; Lookup loanAvailablity; AssetInfo assetLoan; + TimerModel timer = TimerModel(); ServiceReport copyWith({ num id, num parentWOId, @@ -191,6 +203,7 @@ class ServiceReport { WoParent woParentDto, Lookup loanAvailablity, AssetInfo assetLoan, + TimerModel timer, }) => ServiceReport( id: id ?? this.id, @@ -228,6 +241,7 @@ class ServiceReport { woParentDto: woParentDto ?? this.woParentDto, loanAvailablity: loanAvailablity ?? this.loanAvailablity, assetLoan: assetLoan ?? this.assetLoan, + timer: timer ?? this.timer, ); Map toJson() { final map = {}; @@ -306,6 +320,14 @@ class ServiceReport { } Future validate(BuildContext context) async { + if (timer?.startAt == null) { + await Fluttertoast.showToast(msg: "Working Hours Required"); + return false; + } + if (timer?.endAt == null) { + await Fluttertoast.showToast(msg: "Please Stop The Timer"); + return false; + } if (calllastSituation == null) { await Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.callLastSituation}"); return false; diff --git a/lib/views/pages/device_transfer/update_device_transfer.dart b/lib/views/pages/device_transfer/update_device_transfer.dart index 49ec90d..146b2b1 100644 --- a/lib/views/pages/device_transfer/update_device_transfer.dart +++ b/lib/views/pages/device_transfer/update_device_transfer.dart @@ -11,14 +11,10 @@ import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/device/asset_transfer.dart'; -import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; -import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; -import '../../../../controllers/localization/localization.dart'; import '../../../controllers/validator/validator.dart'; import '../../../extensions/text_extensions.dart'; import '../../../models/lookup.dart'; @@ -27,6 +23,7 @@ import '../../../new_views/common_widgets/default_app_bar.dart'; import '../../../new_views/common_widgets/single_item_drop_down_menu.dart'; import '../../../providers/gas_request_providers/gas_status_provider.dart'; import '../../widgets/e_signature/e_signature.dart'; +import '../../widgets/timer/app_timer.dart'; class UpdateDeviceTransfer extends StatefulWidget { final AssetTransfer model; @@ -51,14 +48,14 @@ class _UpdateDeviceTransferState extends State { final GlobalKey _scaffoldKey = GlobalKey(); _update() async { - // if (_formModel?.timer?.startAt == null) { - // await Fluttertoast.showToast(msg: "Working Hours Required"); - // return false; - // } - // if (_formModel?.timer?.endAt == null) { - // await Fluttertoast.showToast(msg: "Please Stop The Timer"); - // return false; - // } + if (_formModel?.timer?.startAt == null) { + await Fluttertoast.showToast(msg: "Working Hours Required"); + return false; + } + if (_formModel?.timer?.endAt == null) { + await Fluttertoast.showToast(msg: "Please Stop The Timer"); + return false; + } _validate = true; if (!(_formKey.currentState.validate())) { setState(() {}); @@ -68,8 +65,7 @@ class _UpdateDeviceTransferState extends State { _isLoading = true; setState(() {}); - int status = await _deviceTransferProvider.updateRequest( - assetTransfer: _formModel); + int status = await _deviceTransferProvider.updateRequest(assetTransfer: _formModel); _isLoading = false; setState(() {}); if (status >= 200 && status < 300) { @@ -119,16 +115,15 @@ class _UpdateDeviceTransferState extends State { SingleChildScrollView( padding: EdgeInsets.all(12 * AppStyle.getScaleFactor(context)), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.stretch, children: [ _buildCard(), 8.height, AppTextFormField( - initialValue: widget.isSender? _formModel.senderTravelingHours:_formModel.receiverTravelingHours, - labelText: context.translation.travelingHours, - onSaved:(value){ - widget.isSender? _formModel.senderTravelingHours - : _formModel.receiverTravelingHours= value; + initialValue: widget.isSender ? _formModel.senderTravelingHours : _formModel.receiverTravelingHours, + labelText: context.translation.travelingHours, + onSaved: (value) { + widget.isSender ? _formModel.senderTravelingHours : _formModel.receiverTravelingHours = value; //_formModel?.workingHours = double.tryParse(value); // _formModel.travelingHours = value; }, @@ -136,33 +131,32 @@ class _UpdateDeviceTransferState extends State { validator: (value) => Validator.isNumeric(value) ? null : "allow numbers only", ), 8.height, - AppTextFormField( - labelText: context.translation.workingHours, - initialValue: widget.isSender?_formModel.senderWorkingHours:_formModel.receiverWorkingHours, - onSaved:(value){ - widget.isSender? - _formModel?.senderWorkingHours = value:_formModel?.receiverWorkingHours = value; - // _formModel.timer = timer; - // _formModel.workingHours = (((timer?.durationInSecond ?? 0) / 60) / 60)?.toStringAsFixed(2) ?? "0"; + AppTimer( + label: context.translation.workingHours, + timer: _formModel.timer, + enabled: _formModel.receiverEndDate == null, + onChange: (timer) async { + _formModel.timer = timer; + return true; }, - textInputType: TextInputType.number, - validator: (value) => Validator.isNumeric(value) ? null : "allow numbers only", ), 8.height, + ///TBD - Consumer(builder: (context, snapshot, _){ - return SingleItemDropDownMenu( + Consumer(builder: (context, snapshot, _) { + return SingleItemDropDownMenu( context: context, title: context.translation.reportStatus, - initialValue: snapshot.items?.firstWhere((element) => element.name == (widget.isSender?_formModel.senderMachineStatusName:_formModel.receiverMachineStatusName), orElse: () => null), + initialValue: snapshot.items + ?.firstWhere((element) => element.name == (widget.isSender ? _formModel.senderMachineStatusName : _formModel.receiverMachineStatusName), orElse: () => null), onSelect: (value) { - if(widget.isSender) { - _formModel.senderMachineStatusName=value.name; - _formModel.senderMachineStatusId=value.id; + if (widget.isSender) { + _formModel.senderMachineStatusName = value.name; + _formModel.senderMachineStatusId = value.id; print("${value.id}"); - }else{ - _formModel.receiverMachineStatusName=value.name; - _formModel.receiverMachineStatusId=value.id; + } else { + _formModel.receiverMachineStatusName = value.name; + _formModel.receiverMachineStatusId = value.id; } setState(() {}); }, @@ -170,13 +164,12 @@ class _UpdateDeviceTransferState extends State { }), 8.height, AppTextFormField( - initialValue: widget.isSender?_formModel.senderComment:_formModel.receiverComment, + initialValue: widget.isSender ? _formModel.senderComment : _formModel.receiverComment, labelText: context.translation.comments, textInputType: TextInputType.multiline, alignLabelWithHint: true, - onSaved: (value){ - widget.isSender? - _formModel.senderComment = value:_formModel.receiverComment=value; + onSaved: (value) { + widget.isSender ? _formModel.senderComment = value : _formModel.receiverComment = value; }, ), 8.height, @@ -187,10 +180,11 @@ class _UpdateDeviceTransferState extends State { onSaved: (signature) { _signature = signature; if (signature == null || signature.isEmpty) return; - widget.isSender? _formModel.senderEngSignature = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}": - _formModel.receiverEngSignature = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; + widget.isSender + ? _formModel.senderEngSignature = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}" + : _formModel.receiverEngSignature = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; - base64Encode(signature); + base64Encode(signature); }, ), ], @@ -211,7 +205,7 @@ class _UpdateDeviceTransferState extends State { ); } - _buildCard(){ + _buildCard() { return Container( width: MediaQuery.of(context).size.width, decoration: ShapeDecoration( @@ -230,6 +224,7 @@ class _UpdateDeviceTransferState extends State { '${context.translation.assetName}: ${_formModel.assetName}', style: AppTextStyles.bodyText.copyWith(color: Color(0xFF757575)), ), + ///TBD Text( '${context.translation.requesterName}: ', diff --git a/lib/views/pages/user/gas_refill/request_gas_refill.dart b/lib/views/pages/user/gas_refill/request_gas_refill.dart index 2d4c490..ec9062d 100644 --- a/lib/views/pages/user/gas_refill/request_gas_refill.dart +++ b/lib/views/pages/user/gas_refill/request_gas_refill.dart @@ -1,4 +1,3 @@ - import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; @@ -15,7 +14,6 @@ import 'package:test_sa/models/timer_model.dart'; import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; - import '../../../../controllers/providers/api/hospitals_provider.dart'; import '../../../../extensions/text_extensions.dart'; import '../../../../models/new_models/gas_refill_model.dart'; @@ -23,7 +21,7 @@ import '../../../../new_views/common_widgets/app_text_form_field.dart'; import '../../../../new_views/common_widgets/default_app_bar.dart'; import '../../../../new_views/common_widgets/single_item_drop_down_menu.dart'; import '../../../../providers/gas_request_providers/gas_status_provider.dart'; - +import '../../../widgets/timer/app_timer.dart'; class RequestGasRefill extends StatefulWidget { static const String id = "/request-gas-refill"; @@ -67,6 +65,14 @@ class _RequestGasRefillState extends State { } _onSubmit(BuildContext context) async { + if (_formModel.timer?.startAt == null) { + await Fluttertoast.showToast(msg: "Working Hours Required"); + return false; + } + if (_formModel.timer?.endAt == null) { + await Fluttertoast.showToast(msg: "Please Stop The Timer"); + return false; + } if (_formModel.gazRefillDetails.isEmpty) { if (!(await _addNewModel(context))) return; } @@ -133,7 +139,6 @@ class _RequestGasRefillState extends State { @override Widget build(BuildContext context) { - _userProvider = Provider.of(context); _settingProvider = Provider.of(context); if (_gasRefillProvider == null) { @@ -144,8 +149,8 @@ class _RequestGasRefillState extends State { String _clientName; if (widget.gasRefillModel != null) { //_formModel.status = widget.gasRefillModel?.status ?? Lookup(value: 0); - _gasRefillProvider.expectedDateTime = DateTime.tryParse(_formModel.expectedDate??""); - _gasRefillProvider.timer = TimerModel(startAt: DateTime.tryParse(widget.gasRefillModel?.startDate??""), endAt: DateTime.tryParse(widget.gasRefillModel?.endDate??"")); + _gasRefillProvider.expectedDateTime = DateTime.tryParse(_formModel.expectedDate ?? ""); + _gasRefillProvider.timer = TimerModel(startAt: DateTime.tryParse(widget.gasRefillModel?.startDate ?? ""), endAt: DateTime.tryParse(widget.gasRefillModel?.endDate ?? "")); _clientName = _formModel.site.custName; } else { _gasRefillProvider.timer = null; @@ -168,14 +173,14 @@ class _RequestGasRefillState extends State { key: _formKey, child: SafeArea( child: LoadingManager( - isLoading: _isLoading, - isFailedLoading: false, - stateCode: 200, - onRefresh: () async {}, - child: Column( - children: [ - SingleChildScrollView( - child: Column( + isLoading: _isLoading, + isFailedLoading: false, + stateCode: 200, + onRefresh: () async {}, + child: Column( + children: [ + SingleChildScrollView( + child: Column( children: [ Container( width: MediaQuery.of(context).size.width, @@ -191,6 +196,7 @@ class _RequestGasRefillState extends State { children: [ Text(context.translation.gasRefill, style: AppTextStyles.heading5.copyWith(color: const Color(0xFF3B3D4A))), 8.height, + /// TBD Text( 'Gas Request:', @@ -212,28 +218,28 @@ class _RequestGasRefillState extends State { ).paddingAll(16), ), 12.height, - AppTextFormField( - labelText: context.translation.workingHours, - onSaved:(value){ - _formModel?.workingHours = double.tryParse(value); + AppTimer( + label: context.translation.workingHours, + timer: _formModel.timer, + enabled: _formModel.endDate == null, + onChange: (timer) async { + _formModel.timer = timer; + return true; }, - textInputType: TextInputType.number, - controller: _workingHoursController, - validator: (value) => Validator.isNumeric(value) ? null : "allow numbers only", ), 12.height, - SingleItemDropDownMenu( + SingleItemDropDownMenu( context: context, title: context.translation.reportStatus, initialValue: widget.gasRefillModel.status, onSelect: (value) { - _formModel.status=value; + _formModel.status = value; }, ), 12.height, AppTextFormField( labelText: context.translation.deliveredQuantity, - onSaved:(value){ + onSaved: (value) { _currentDetails?.deliverdQty = double.tryParse(value); }, textInputType: TextInputType.number, @@ -241,25 +247,26 @@ class _RequestGasRefillState extends State { validator: (value) => Validator.isNumeric(value) ? null : "allow numbers only", ), 12.height, + /// TBD AppTextFormField( labelText: context.translation.comments, textInputType: TextInputType.multiline, alignLabelWithHint: true, controller: _commentController, - onSaved: (value){ - }, + onSaved: (value) {}, ), ], - ).paddingAll(16) - ).expanded, - AppFilledButton( - label: widget.gasRefillModel == null ? context.translation.submit : context.translation.update, - onPressed:()async{_onSubmit.call(context);}, - ).paddingAll(16), - ], - ) - ), + ).paddingAll(16)) + .expanded, + AppFilledButton( + label: widget.gasRefillModel == null ? context.translation.submit : context.translation.update, + onPressed: () async { + _onSubmit.call(context); + }, + ).paddingAll(16), + ], + )), ), ), ); diff --git a/lib/views/pages/user/requests/work_order/create_service_report.dart b/lib/views/pages/user/requests/work_order/create_service_report.dart index 4383e6f..225f6b7 100644 --- a/lib/views/pages/user/requests/work_order/create_service_report.dart +++ b/lib/views/pages/user/requests/work_order/create_service_report.dart @@ -31,6 +31,7 @@ import '../../../../../new_views/common_widgets/default_app_bar.dart'; import '../../../../../new_views/common_widgets/single_item_drop_down_menu.dart'; import '../../../../widgets/date_and_time/date_picker.dart'; import '../../../../widgets/images/multi_image_picker.dart'; +import '../../../../widgets/timer/app_timer.dart'; /// todo : TBD (compare with the design) class CreateServiceReport extends StatefulWidget { @@ -142,11 +143,13 @@ class _CreateServiceReportState extends State with TickerPr }, ), 8.height, - AppTextFormField( - labelText: context.translation.workingHours, - textInputType: TextInputType.number, - onSaved: (text) { - _serviceReport.workingHours = num.tryParse(text ?? ""); + AppTimer( + label: context.translation.workingHours, + timer: _serviceReport.timer, + enabled: _serviceReport.endofWorkTime == null, + onChange: (timer) async { + _serviceReport.timer = timer; + return true; }, ), 8.height, diff --git a/lib/views/pages/user/requests/work_order/edit_service_report.dart b/lib/views/pages/user/requests/work_order/edit_service_report.dart index 34d2c56..8e03b3a 100644 --- a/lib/views/pages/user/requests/work_order/edit_service_report.dart +++ b/lib/views/pages/user/requests/work_order/edit_service_report.dart @@ -31,6 +31,7 @@ import '../../../../widgets/date_and_time/date_picker.dart'; import '../../../../widgets/e_signature/e_signature.dart'; import '../../../../widgets/images/multi_image_picker.dart'; import '../../../../widgets/status/report/service_report_assistant_employee_menu.dart'; +import '../../../../widgets/timer/app_timer.dart'; class EditServiceReport extends StatefulWidget { static final String id = "/edit-service-report"; @@ -108,7 +109,7 @@ class _EditServiceReportState extends State with TickerProvid children: [ SingleChildScrollView( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.stretch, children: [ Card( child: Column( @@ -131,12 +132,13 @@ class _EditServiceReportState extends State with TickerProvid }, ), 8.height, - AppTextFormField( - labelText: context.translation.workingHours, - textInputType: TextInputType.number, - initialValue: _serviceReport.workingHours?.toString(), - onSaved: (text) { - _serviceReport.workingHours = num.tryParse(text ?? ""); + AppTimer( + label: context.translation.workingHours, + timer: _serviceReport.timer, + enabled: _serviceReport.endofWorkTime == null, + onChange: (timer) async { + _serviceReport.timer = timer; + return true; }, ), 8.height, diff --git a/lib/views/widgets/timer/app_timer.dart b/lib/views/widgets/timer/app_timer.dart index b7bbbcc..d5f7117 100644 --- a/lib/views/widgets/timer/app_timer.dart +++ b/lib/views/widgets/timer/app_timer.dart @@ -14,9 +14,11 @@ class AppTimer extends StatefulWidget { final Future Function(TimerModel) onChange; final TextStyle style; final bool enabled; + final String label; const AppTimer({ Key key, + this.label, this.timer, this.onChange, this.style, @@ -121,7 +123,7 @@ class _AppTimerState extends State { crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.center, children: [ - "Timer".tinyFont(context), + (widget.label ?? "Timer").tinyFont(context), value.bodyText(context).custom(color: AppColor.neutral50), ], );