From 45b66e6b2a61f4260be6a5eacc3637c6558af479 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Thu, 6 Jul 2023 11:38:49 +0300 Subject: [PATCH] Convert (Start Date & End Date) to Timer --- .../api/device_transfer_provider.dart | 22 ++- .../api/service_requests_provider.dart | 41 +++--- .../call_request_for_work_order_model.dart | 2 +- lib/models/device/device_transfer.dart | 36 +++-- lib/models/device/device_transfer_info.dart | 37 +++-- lib/models/pantry/pentry.dart | 7 +- lib/models/service_report.dart | 92 ++++++------ .../service_request/search_work_order.dart | 48 ++++--- lib/models/timer_model.dart | 3 +- .../update_device_transfer.dart | 106 +++----------- .../create_sub_workorder_page.dart | 12 +- .../spare_parts_details_bottom_sheet.dart | 2 - .../work_order_details_bottom_sheet.dart | 83 +++-------- .../user/gas_refill/request_gas_refill.dart | 134 +++++++++--------- .../report/create_service_report.dart | 83 +++-------- .../requests/report/edit_service_report.dart | 87 +++--------- lib/views/widgets/parts/part_item.dart | 12 +- lib/views/widgets/timer/app_timer.dart | 12 +- 18 files changed, 333 insertions(+), 486 deletions(-) diff --git a/lib/controllers/providers/api/device_transfer_provider.dart b/lib/controllers/providers/api/device_transfer_provider.dart index a534fbc0..43c5eced 100644 --- a/lib/controllers/providers/api/device_transfer_provider.dart +++ b/lib/controllers/providers/api/device_transfer_provider.dart @@ -23,7 +23,7 @@ class DeviceTransferProvider extends ChangeNotifier { building = null; floor = null; department = null; - room=""; + room = ""; startDate = null; endDate = null; } @@ -44,7 +44,6 @@ class DeviceTransferProvider extends ChangeNotifier { // failed _loading = false bool isLoading; - Hospital hospital; Buildings building; Floors floor; @@ -115,7 +114,7 @@ class DeviceTransferProvider extends ChangeNotifier { // "transferCode": "string", "destBuildingId": building?.id, "destFloorId": floor.id, - "destRoom": room, + "destRoom": room, // "senderBuildingId": 0, // "senderFloorId": 0, // "senderDepartmentId": 0, @@ -179,8 +178,8 @@ class DeviceTransferProvider extends ChangeNotifier { "senderMachineStatusId": newModel.status.id, "senderComment": newModel.comment, "senderWorkingHours": newModel.workingHours, - "senderStartDate": newModel.startDate?.toIso8601String(), - "senderEndDate": newModel.endDate?.toIso8601String(), + "senderStartDate": newModel.timer?.startAt?.toIso8601String(), + "senderEndDate": newModel.timer?.endAt?.toIso8601String(), "senderTravelingHours": newModel.travelingHours, "senderAttachmentName": "${newModel.signature}.png", "destSiteId": oldModel.receiver.client.id, @@ -189,8 +188,8 @@ class DeviceTransferProvider extends ChangeNotifier { "receiverMachineStatusId": oldModel.receiver.status.id ?? "", "receiverComment": oldModel.receiver.comment, "receiverWorkingHours": oldModel.receiver.workingHours, - "receiverStartDate": oldModel.receiver.startDate?.toIso8601String(), - "receiverEndDate": oldModel.receiver.endDate?.toIso8601String(), + "receiverStartDate": oldModel.receiver.timer?.startAt?.toIso8601String(), + "receiverEndDate": oldModel.receiver.timer?.endAt?.toIso8601String(), "receiverTravelingHours": oldModel.receiver.travelingHours, "receiverAttachmentName": "${oldModel.receiver.signature}.png", }); @@ -202,8 +201,8 @@ class DeviceTransferProvider extends ChangeNotifier { "senderMachineStatusId": oldModel.sender.status.id, "senderComment": oldModel.sender.comment, "senderWorkingHours": oldModel.sender.workingHours, - "senderStartDate": oldModel.sender.startDate?.toIso8601String(), - "senderEndDate": oldModel.sender.endDate?.toIso8601String(), + "senderStartDate": oldModel.sender.timer?.startAt?.toIso8601String(), + "senderEndDate": oldModel.sender.timer?.endAt?.toIso8601String(), "senderTravelingHours": oldModel.sender.travelingHours, "senderAttachmentName": "${oldModel.sender.signature}.png", "destSiteId": newModel.client.id, @@ -212,8 +211,8 @@ class DeviceTransferProvider extends ChangeNotifier { "receiverMachineStatusId": newModel.status?.id ?? "", "receiverComment": newModel.comment, "receiverWorkingHours": newModel.workingHours, - "receiverStartDate": newModel.startDate?.toIso8601String(), - "receiverEndDate": newModel.endDate?.toIso8601String(), + "receiverStartDate": newModel.timer?.startAt?.toIso8601String(), + "receiverEndDate": newModel.timer?.endAt?.toIso8601String(), "receiverTravelingHours": newModel.travelingHours, "receiverAttachmentName": "${newModel.signature}.png", }); @@ -247,5 +246,4 @@ class DeviceTransferProvider extends ChangeNotifier { return -1; } } - } diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index e0dec352..edf5a749 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -1,4 +1,5 @@ import 'dart:convert'; +import 'dart:developer'; import 'package:flutter/cupertino.dart'; import 'package:http/http.dart'; @@ -237,7 +238,7 @@ class ServiceRequestsProvider extends ChangeNotifier { "attachmentsCallRequest": request.devicePhotos?.map((e) => {"name": e})?.toList(), "assignedEmployee": { "id": request.engineerId, - "name": request.engineerName, + "name": request.engineerName, }, "callSiteContactPerson": [ { @@ -320,9 +321,9 @@ class ServiceRequestsProvider extends ChangeNotifier { "currentSituation": null, "repairLocation": report.repairLocation?.toMap(), "reason": report.reason?.toMap(), - "startofWorkTime": report.startDate?.toIso8601String() ?? "", - "endofWorkTime": report.endDate?.toIso8601String() ?? "", - "workingHours": ((report?.endDate?.difference(report?.startDate)?.inMinutes ?? 0) / 60), + "startofWorkTime": report.timer?.startAt?.toIso8601String() ?? "", + "endofWorkTime": report.timer?.endAt?.toIso8601String() ?? "", + "workingHours": report?.workingHours, "travelingHours": report.travelingHours, "travelingExpenses": report.travelingExpense ?? 0, if (report.faultDescription != null) "faultDescription": report.faultDescription.toJson(), @@ -399,12 +400,14 @@ class ServiceRequestsProvider extends ChangeNotifier { if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received Map listJson = json.decode(response.body)["data"]; + log(listJson?.toString()); callRequestForWorkOrder = CallRequestForWorkOrder.fromJson(listJson); } notifyListeners(); return callRequestForWorkOrder; } catch (error) { + print(error); return null; } } @@ -479,22 +482,22 @@ class ServiceRequestsProvider extends ChangeNotifier { // body["job_id"] = request.id; // body["report_id"] = request.reportID; // try { - Map body = report.toMap(request); - // body["uid"] = user.id; - // body["token"] = user.token; - response = await ApiManager.instance.put(URLs.updateServiceReport, body: body); - // response = await post( - // Uri.parse( - // host+URLs.updateServiceReport), - // body: body, - // ); - // stateCode = response.statusCode; + Map body = report.toMap(request); + // body["uid"] = user.id; + // body["token"] = user.token; + response = await ApiManager.instance.put(URLs.updateServiceReport, body: body); + // response = await post( + // Uri.parse( + // host+URLs.updateServiceReport), + // body: body, + // ); + // stateCode = response.statusCode; - if (response.statusCode >= 200 && response.statusCode < 300) { - reset(); - notifyListeners(); - } - return response.statusCode; + if (response.statusCode >= 200 && response.statusCode < 300) { + reset(); + notifyListeners(); + } + return response.statusCode; // } catch (error) { // print(error); // return -1; diff --git a/lib/models/call_request_for_work_order_model.dart b/lib/models/call_request_for_work_order_model.dart index 14572afa..188edce4 100644 --- a/lib/models/call_request_for_work_order_model.dart +++ b/lib/models/call_request_for_work_order_model.dart @@ -82,7 +82,7 @@ class Asset { Department department; String room; String testsDay; - String purchasingPrice; + num purchasingPrice; String nbv; String currency; String poNo; diff --git a/lib/models/device/device_transfer.dart b/lib/models/device/device_transfer.dart index a8202f42..c585a8c0 100644 --- a/lib/models/device/device_transfer.dart +++ b/lib/models/device/device_transfer.dart @@ -5,6 +5,8 @@ import 'package:test_sa/models/device/device_transfer_info.dart'; import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/models/lookup.dart'; +import '../timer_model.dart'; + class DeviceTransfer { int id; String userId; @@ -46,21 +48,26 @@ class DeviceTransfer { title: parsedJson["transferCode"], userId: parsedJson["uid"], device: Device( - id: parsedJson["assetId"], - number: parsedJson["assetNumber"], - serialNumber: parsedJson["assetSerialNo"], - destBuildingName: parsedJson["destBuildingName"], - destDepartmentName: parsedJson["destDepartmentName"], - destFloor: parsedJson["destFloor"], - destRoom: parsedJson["destRoom"], - destSiteName: parsedJson["destSiteName"] - ), + id: parsedJson["assetId"], + number: parsedJson["assetNumber"], + serialNumber: parsedJson["assetSerialNo"], + destBuildingName: parsedJson["destBuildingName"], + destDepartmentName: parsedJson["destDepartmentName"], + destFloor: parsedJson["destFloor"], + destRoom: parsedJson["destRoom"], + destSiteName: parsedJson["destSiteName"]), sender: DeviceTransferInfo( travelingHours: parsedJson["senderTravelingHours"], comment: parsedJson["senderComment"], workingHours: parsedJson["senderWorkingHours"], - startDate: parsedJson["senderStartDate"]==null ? null:DateTime.parse(parsedJson["senderStartDate"]), - endDate: parsedJson["senderEndDate"]==null ? null:DateTime.parse(parsedJson["senderEndDate"]), + timer: TimerModel( + startAt: DateTime.tryParse(parsedJson["senderStartDate"] ?? ""), + endAt: DateTime.tryParse(parsedJson["senderEndDate"] ?? ""), + durationInSecond: ((parsedJson["workingHours"] ?? 0) * 60 * 60).toInt(), + stopped: parsedJson["workingHours"] == null ? null : true, + ), + // startDate: parsedJson["senderStartDate"] == null ? null : DateTime.parse(parsedJson["senderStartDate"]), + // endDate: parsedJson["senderEndDate"] == null ? null : DateTime.parse(parsedJson["senderEndDate"]), userId: parsedJson["senderAssignedEmployeeId"], userName: parsedJson["senderAssignedEmployeeName"], assignedEmployeeName: parsedJson["senderAssignedEmployeeName"], @@ -80,8 +87,11 @@ class DeviceTransfer { travelingHours: parsedJson["receiverTravelingHours"], comment: parsedJson["receiverComment"], workingHours: parsedJson["receiverWorkingHours"], - startDate: parsedJson["receiverStartDate"]==null ? null:DateTime.parse(parsedJson["receiverStartDate"]), - endDate: parsedJson["receiverEndDate"]==null ? null:DateTime.parse(parsedJson["receiverEndDate"]), + timer: parsedJson["receiverStartDate"] != null || parsedJson["receiverEndDate"] != null + ? TimerModel(startAt: DateTime.tryParse(parsedJson["receiverStartDate"] ?? ""), endAt: DateTime.tryParse(parsedJson["receiverEndDate"] ?? "")) + : null, + // startDate: parsedJson["receiverStartDate"] == null ? null : DateTime.parse(parsedJson["receiverStartDate"]), + // endDate: parsedJson["receiverEndDate"] == null ? null : DateTime.parse(parsedJson["receiverEndDate"]), userId: parsedJson["receiverAssignedEmployeeId"], userName: parsedJson["receiverAssignedEmployeeName"], assignedEmployeeName: parsedJson["receiverAssignedEmployeeName"], diff --git a/lib/models/device/device_transfer_info.dart b/lib/models/device/device_transfer_info.dart index 41d0843a..00e1d387 100644 --- a/lib/models/device/device_transfer_info.dart +++ b/lib/models/device/device_transfer_info.dart @@ -2,19 +2,22 @@ import 'package:test_sa/models/department.dart'; import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/models/lookup.dart'; +import '../timer_model.dart'; + class DeviceTransferInfo { String userId; String comment; Hospital client; Department department; String workingHours; - DateTime startDate; - DateTime endDate; + // DateTime startDate; + // DateTime endDate; String travelingHours; String userName; String signature; String assignedEmployeeName; Lookup status; + TimerModel timer; DeviceTransferInfo({ this.userId, @@ -23,12 +26,13 @@ class DeviceTransferInfo { this.client, this.userName, this.travelingHours, - this.startDate, - this.endDate, + // this.startDate, + // this.endDate, this.workingHours, this.signature, this.status, - this.assignedEmployeeName + this.assignedEmployeeName, + this.timer, }); Map toJson(bool isSender) { @@ -37,8 +41,10 @@ class DeviceTransferInfo { if (comment != null && comment.isNotEmpty) body["${baseKey}comment"] = comment; if (workingHours != null && workingHours.isNotEmpty) body["${baseKey}working_hours"] = workingHours; - if (startDate != null) body["${baseKey}start_date"] = startDate?.toIso8601String(); - if (endDate != null) body["${baseKey}end_date"] = endDate?.toIso8601String(); + // if (startDate != null) body["${baseKey}start_date"] = startDate?.toIso8601String(); + // if (endDate != null) body["${baseKey}end_date"] = endDate?.toIso8601String(); + if (timer?.startAt != null) body["${baseKey}start_date"] = timer?.startAt?.toIso8601String(); + if (timer?.endAt != null) body["${baseKey}end_date"] = timer?.endAt?.toIso8601String(); if (travelingHours != null && travelingHours.isNotEmpty) body["${baseKey}travel_hours"] = travelingHours; if (status != null) body["${baseKey}status"] = status.id.toString(); if (signature != null && signature.isNotEmpty) body["${baseKey}image"] = signature; @@ -57,8 +63,9 @@ class DeviceTransferInfo { client = Hospital.fromHospital(old.client); department = Department.fromDepartment(old.department); workingHours = old.workingHours; - startDate = old.startDate; - endDate = old.endDate; + // startDate = old.startDate; + // endDate = old.endDate; + timer = old.timer; travelingHours = old.travelingHours; comment = old.comment; if (withSignature) signature = old.signature; @@ -68,14 +75,20 @@ class DeviceTransferInfo { factory DeviceTransferInfo.fromJson(Map parsedJson, String key) { return DeviceTransferInfo( workingHours: parsedJson["${key}working_hours"], - startDate: parsedJson["${key}start_date"], - endDate: parsedJson["${key}end_date"], + // startDate: parsedJson["${key}start_date"], + // endDate: parsedJson["${key}end_date"], + timer: TimerModel( + startAt: DateTime.tryParse(parsedJson["${key}start_date"] ?? ""), + endAt: DateTime.tryParse(parsedJson["${key}end_date"] ?? ""), + durationInSecond: ((parsedJson["${key}working_hours"] ?? 0) * 60 * 60).toInt(), + stopped: parsedJson["${key}working_hours"] == null || (parsedJson["${key}working_hours"] as String).isEmpty ? null : true, + ), travelingHours: parsedJson["${key}travel_hours"], userName: parsedJson["${key}name"], signature: parsedJson["${key}image"], userId: parsedJson["${key}id"], comment: parsedJson["${key}comment"], - assignedEmployeeName:parsedJson["${key}AssignedEmployeeName"], + assignedEmployeeName: parsedJson["${key}AssignedEmployeeName"], client: Hospital(id: parsedJson["${key}SiteId"], name: parsedJson["${key}SiteName"]), department: Department( id: parsedJson["${key}DepartmentId"], diff --git a/lib/models/pantry/pentry.dart b/lib/models/pantry/pentry.dart index 82ef9fd6..45bd477b 100644 --- a/lib/models/pantry/pentry.dart +++ b/lib/models/pantry/pentry.dart @@ -117,7 +117,12 @@ class Pentry { actualVisitDate: DateTime.tryParse(map["actualDate"] ?? ""), expectedVisitDate: DateTime.tryParse(map["expectedDate"] ?? ""), travelingHours: map["travelingHours"], - timer: TimerModel(startAt: DateTime.tryParse(map["startDate"] ?? ""), endAt: DateTime.tryParse(map["endDate"] ?? ""), durationInSecond: (int.tryParse(map["workingHours"] ?? "") ?? 0) * 60 * 60), + timer: TimerModel( + startAt: DateTime.tryParse(map["startDate"] ?? ""), + endAt: DateTime.tryParse(map["endDate"] ?? ""), + durationInSecond: (int.tryParse(map["workingHours"] ?? "") ?? 0) * 60 * 60, + stopped: map["workingHours"] == null ? null : true, + ), // contacts: contacts, ppmCheckLists: ppmCheckLists, calibrationTools: calibrationTools, diff --git a/lib/models/service_report.dart b/lib/models/service_report.dart index 03092c3c..5b4ceca7 100644 --- a/lib/models/service_report.dart +++ b/lib/models/service_report.dart @@ -13,8 +13,8 @@ class ServiceReport { int id; double operatingHours; DateTime visitDate; - DateTime endDate; - DateTime startDate; + // DateTime endDate; + // DateTime startDate; Lookup assetType; Lookup callLastSituation; Lookup currentSituation; @@ -45,40 +45,41 @@ class ServiceReport { String reviewComment; FaultDescription faultDescription; - ServiceReport( - {this.id, - this.visitDate, - this.endDate, - this.assetType, - this.equipmentStatus, - this.type, - this.faultDescriptionId, - this.workingHours, - this.travelingHours, - this.parts, - this.engineer, - this.workPreformed, - this.reason, - this.operatingHours, - this.callLastSituation, - this.currentSituation, - this.jobSheetNumber, - this.image, - this.device, - this.invoiceCode, - this.invoiceNumber, - this.quantity = "1", - this.timer, - this.signatureNurse, - this.signatureEngineer, - this.localNurseSignature, - this.localEngineerSignature, - this.comment, - this.repairLocation, - this.travelingExpense, - this.startDate, - this.reviewComment, - this.faultDescription}); + ServiceReport({ + this.id, + this.visitDate, + // this.endDate, + this.assetType, + this.equipmentStatus, + this.type, + this.faultDescriptionId, + this.workingHours, + this.travelingHours, + this.parts, + this.engineer, + this.workPreformed, + this.reason, + this.operatingHours, + this.callLastSituation, + this.currentSituation, + this.jobSheetNumber, + this.image, + this.device, + this.invoiceCode, + this.invoiceNumber, + this.quantity = "1", + this.timer, + this.signatureNurse, + this.signatureEngineer, + this.localNurseSignature, + this.localEngineerSignature, + this.comment, + this.repairLocation, + this.travelingExpense, + // this.startDate, + this.reviewComment, + this.faultDescription, + }); Map toMap(ServiceRequest request) { Map _map = {}; @@ -139,9 +140,12 @@ class ServiceReport { _map["engSignature"] = signatureEngineer; _map["comment"] = comment; _map["travelingExpenses"] = travelingExpense; - _map["startofWorkTime"] = startDate.toIso8601String(); - _map["endofWorkTime"] = endDate.toIso8601String(); - _map["workingHours"] = endDate?.difference(startDate)?.inHours ?? 0; + // _map["startofWorkTime"] = startDate.toIso8601String(); + // _map["endofWorkTime"] = endDate.toIso8601String(); + // _map["workingHours"] = endDate?.difference(startDate)?.inHours ?? 0; + if (timer?.startAt != null) _map["startofWorkTime"] = timer?.startAt?.toIso8601String(); + if (timer?.endAt != null) _map["endofWorkTime"] = timer?.endAt?.toIso8601String(); + _map["workingHours"] = workingHours; _map["reviewComment"] = reviewComment; return _map; } @@ -192,8 +196,8 @@ class ServiceReport { faultDescription: parsedJson['faultDescription'] != null ? FaultDescription.fromJson(parsedJson['faultDescription']) : null, // faultDescription: parsedJson["faultDescription"], - startDate: DateTime.tryParse(parsedJson["startofWorkTime"]?? ""), - endDate: DateTime.tryParse(parsedJson["endofWorkTime"]??""), + // startDate: DateTime.tryParse(parsedJson["startofWorkTime"] ?? ""), + // endDate: DateTime.tryParse(parsedJson["endofWorkTime"] ?? ""), //invoiceCode: parsedJson["invoice_code"], //invoiceNumber: parsedJson["invoice_no"], //jobSheetNumber: parsedJson["job_sheet_no"], @@ -206,7 +210,11 @@ class ServiceReport { visitDate: DateTime.tryParse(parsedJson["visitDate"]), workingHours: parsedJson["workingHours"], timer: TimerModel( - startAt: DateTime.tryParse(parsedJson["startofWorkTime"]??""), endAt: DateTime.tryParse(parsedJson["endofWorkTime"]??""), durationInSecond: ((parsedJson["workingHours"] ?? 0) * 60 * 60).toInt()), + startAt: DateTime.tryParse(parsedJson["startofWorkTime"] ?? ""), + endAt: DateTime.tryParse(parsedJson["endofWorkTime"] ?? ""), + durationInSecond: ((parsedJson["workingHours"] ?? 0) * 60 * 60).toInt(), + stopped: parsedJson["workingHours"] == null ? null : true, + ), //workPreformed: parsedJson["work_performed"], device: Device.fromJson(parsedJson["callRequest"]["asset"]), signatureNurse: URLs.getFileUrl(parsedJson["nurseSignature"]), diff --git a/lib/models/service_request/search_work_order.dart b/lib/models/service_request/search_work_order.dart index a7d360c0..898fa0e9 100644 --- a/lib/models/service_request/search_work_order.dart +++ b/lib/models/service_request/search_work_order.dart @@ -1,4 +1,5 @@ import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/timer_model.dart'; import '../fault_description.dart'; @@ -21,8 +22,8 @@ class SearchWorkOrder { this.currentSituation, this.repairLocation, this.reason, - this.startofWorkTime, - this.endofWorkTime, + // this.startofWorkTime, + // this.endofWorkTime, this.workingHours, this.travelingHours, this.travelingExpenses, @@ -36,6 +37,7 @@ class SearchWorkOrder { this.engSignature, this.nurseSignature, this.woParentDto, + this.timer, }); SearchWorkOrder.fromJson(dynamic json) { @@ -66,8 +68,13 @@ class SearchWorkOrder { currentSituation = json['currentSituation'] != null ? Lookup.fromJson(json['currentSituation']) : null; repairLocation = json['repairLocation'] != null ? Lookup.fromJson(json['repairLocation']) : null; reason = json['reason'] != null ? Lookup.fromJson(json['reason']) : null; - startofWorkTime = json['startofWorkTime']; - endofWorkTime = json['endofWorkTime']; + // startofWorkTime = json['startofWorkTime']; + // endofWorkTime = json['endofWorkTime']; + if (json['startofWorkTime'] != null || json['endofWorkTime'] != null) { + timer = TimerModel(); + } + if (json['startofWorkTime'] != null) timer.startAt = DateTime.tryParse(json['startofWorkTime']); + if (json['endofWorkTime'] != null) timer.endAt = DateTime.tryParse(json['endofWorkTime']); workingHours = json['workingHours']; travelingHours = json['travelingHours']; travelingExpenses = json['travelingExpenses']; @@ -121,8 +128,9 @@ class SearchWorkOrder { if (wo.currentSituation != null) currentSituation = Lookup.fromJson((wo.currentSituation)?.toMap() ?? {}); repairLocation = Lookup.fromJson((wo.repairLocation ?? repairLocation)?.toMap() ?? {}); reason = Lookup.fromJson((wo.reason ?? reason)?.toMap() ?? {}); - startofWorkTime = wo.startofWorkTime ?? startofWorkTime; - endofWorkTime = wo.endofWorkTime ?? endofWorkTime; + // startofWorkTime = wo.startofWorkTime ?? startofWorkTime; + // endofWorkTime = wo.endofWorkTime ?? endofWorkTime; + timer = wo.timer ?? timer; workingHours = wo.workingHours ?? workingHours; travelingHours = wo.travelingHours ?? travelingHours; travelingExpenses = wo.travelingExpenses ?? travelingExpenses; @@ -155,8 +163,8 @@ class SearchWorkOrder { Lookup currentSituation; Lookup repairLocation; Lookup reason; - String startofWorkTime; - String endofWorkTime; + // String startofWorkTime; + // String endofWorkTime; num workingHours; num travelingHours; num travelingExpenses; @@ -170,6 +178,8 @@ class SearchWorkOrder { String engSignature; String nurseSignature; WoParentDto woParentDto; + TimerModel timer; + SearchWorkOrder copyWith({ num id, num parentWOId, @@ -188,8 +198,8 @@ class SearchWorkOrder { Lookup currentSituation, Lookup repairLocation, Lookup reason, - String startofWorkTime, - String endofWorkTime, + // String startofWorkTime, + // String endofWorkTime, num workingHours, num travelingHours, num travelingExpenses, @@ -203,6 +213,7 @@ class SearchWorkOrder { String engSignature, String nurseSignature, WoParentDto woParentDto, + TimerModel timer, }) => SearchWorkOrder( id: id ?? this.id, @@ -222,8 +233,8 @@ class SearchWorkOrder { currentSituation: currentSituation ?? this.currentSituation, repairLocation: repairLocation ?? this.repairLocation, reason: reason ?? this.reason, - startofWorkTime: startofWorkTime ?? this.startofWorkTime, - endofWorkTime: endofWorkTime ?? this.endofWorkTime, + // startofWorkTime: startofWorkTime ?? this.startofWorkTime, + // endofWorkTime: endofWorkTime ?? this.endofWorkTime, workingHours: workingHours ?? this.workingHours, travelingHours: travelingHours ?? this.travelingHours, travelingExpenses: travelingExpenses ?? this.travelingExpenses, @@ -237,6 +248,7 @@ class SearchWorkOrder { engSignature: engSignature ?? this.engSignature, nurseSignature: nurseSignature ?? this.nurseSignature, woParentDto: woParentDto ?? this.woParentDto, + timer: timer ?? this.timer, ); Map toJson() { final map = {}; @@ -269,20 +281,22 @@ class SearchWorkOrder { map['calllastSituation'] = calllastSituation.toMap(); } map['currentSituation'] = currentSituation?.toMap(); - if (repairLocation != null) { + if (repairLocation?.id != null) { map['repairLocation'] = repairLocation.toMap(); } if (reason != null) { map['reason'] = reason.toMap(); } - map['startofWorkTime'] = startofWorkTime; - map['endofWorkTime'] = endofWorkTime; + // map['startofWorkTime'] = startofWorkTime; + // map['endofWorkTime'] = endofWorkTime; + map['startofWorkTime'] = timer?.startAt?.toIso8601String(); + map['endofWorkTime'] = timer?.endAt?.toIso8601String(); map['workingHours'] = workingHours; map['travelingHours'] = travelingHours; map['travelingExpenses'] = travelingExpenses; - if (faultDescription?.id != null ) { - map['faultDescription'] = faultDescription.toJson(); + if (faultDescription?.id != null) { + map['faultDescription'] = faultDescription.toJson(); } if (sparePartsWorkOrders != null) { map['sparePartsWorkOrders'] = sparePartsWorkOrders.map((v) => v.toJson()).toList(); diff --git a/lib/models/timer_model.dart b/lib/models/timer_model.dart index c6434f93..907d006d 100644 --- a/lib/models/timer_model.dart +++ b/lib/models/timer_model.dart @@ -2,6 +2,7 @@ class TimerModel { DateTime startAt; DateTime endAt; int durationInSecond; + bool stopped; - TimerModel({this.startAt, this.endAt, this.durationInSecond}); + TimerModel({this.startAt, this.endAt, this.durationInSecond, this.stopped}); } diff --git a/lib/views/pages/device_transfer/update_device_transfer.dart b/lib/views/pages/device_transfer/update_device_transfer.dart index 5e8101f1..061b5d21 100644 --- a/lib/views/pages/device_transfer/update_device_transfer.dart +++ b/lib/views/pages/device_transfer/update_device_transfer.dart @@ -19,8 +19,7 @@ import 'package:test_sa/views/widgets/status/gas_refill/gas_status.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import '../../../../controllers/localization/localization.dart'; -import '../../../controllers/validator/validator.dart'; -import '../../widgets/date_and_time/time_picker.dart'; +import '../../widgets/timer/app_timer.dart'; class UpdateDeviceTransfer extends StatefulWidget { final DeviceTransfer model; @@ -46,6 +45,13 @@ class _UpdateDeviceTransferState extends State { final GlobalKey _scaffoldKey = GlobalKey(); _update() async { + if (_formModel?.workingHours == null || _formModel.workingHours.isEmpty) { + await Fluttertoast.showToast(msg: "Working Hours Timer Isn't Started"); + return; + } else if ((_formModel?.timer?.stopped ?? false) == false) { + await Fluttertoast.showToast(msg: "Stop The Timer"); + return; + } _validate = true; if (!_formKey.currentState.validate()) { setState(() {}); @@ -152,96 +158,23 @@ class _UpdateDeviceTransferState extends State { const SizedBox( height: 16, ), + ASubTitle(_subtitle.workingHours), + const SizedBox(height: 8), Row( children: [ Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - const ASubTitle("Start of Work"), - SizedBox( - height: 8 * AppStyle.getScaleFactor(context), - ), - ADateTimePicker( - date: _formModel.startDate, - from: DateTime.now().subtract(const Duration(days: 365)), - to: DateTime.now().add(const Duration(days: 365)), - onDateTimePicker: (date) { - _formModel.startDate = date; - _formModel.workingHours = ((_formModel.endDate?.difference(_formModel.startDate)?.inMinutes ?? 0) / 60)?.toStringAsFixed(2)?.toString() ?? 0; - setState(() {}); - }, - ), - ], - ), - ), - const SizedBox(width: 8), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - const ASubTitle("End of Work"), - SizedBox( - height: 8 * AppStyle.getScaleFactor(context), - ), - ADateTimePicker( - date: _formModel.endDate, - from: DateTime.now().subtract(const Duration(days: 365)), - to: DateTime.now().add(const Duration(days: 365)), - onDateTimePicker: (date) { - _formModel.endDate = date; - _formModel.workingHours = ((_formModel.endDate?.difference(_formModel.startDate)?.inMinutes ?? 0) / 60)?.toStringAsFixed(2)?.toString() ?? 0; - setState(() {}); - }, - ), - ], + child: AppTimer( + timer: _formModel.timer, + onChange: (timer) async { + _formModel.timer = timer; + _formModel.workingHours = (((timer?.durationInSecond ?? 0) / 60) / 60)?.toStringAsFixed(2) ?? "0"; + return true; + }, ), ), ], ), - const SizedBox(height: 4), - ASubTitle(_subtitle.workingHours), - const SizedBox(height: 4), - ATextFormField( - initialValue: null, - textAlign: TextAlign.center, - hintText: _formModel.startDate == null ? "0" : ((_formModel.endDate?.difference(_formModel.startDate)?.inMinutes ?? 0) / 60)?.toStringAsFixed(2)?.toString() ?? "0", - enable: false, - style: Theme.of(context).textTheme.subtitle1, - //validator: (value) => Validator.isNumeric(value) ? null : _subtitle.requiredWord, - textInputType: TextInputType.number, - onSaved: (value) { - // _serviceReport.workHours = value; - }, - ), - // ASubTitle(_subtitle.workingHours), - // const SizedBox( - // height: 4, - // ), - // ATextFormField( - // initialValue: _formModel?.workingHours, - // textAlign: TextAlign.center, - // style: Theme.of(context).textTheme.subtitle1, - // textInputType: TextInputType.number, - // onSaved: (value) { - // _formModel.workingHours = value; - // }, - // ), - // const SizedBox(height: 8,), - // const ASubTitle("Sender Department"), - // if(_validate && _formModel.senderDepartment == null) - // ASubTitle(_subtitle.requiredWord,color: Colors.red,), - // const SizedBox(height: 4,), - // DepartmentButton( - // department: _formModel.senderDepartment, - // onDepartmentPick: (department){ - // _formModel.senderDepartment = department; - // setState(() {}); - // }, - // ), - const SizedBox( - height: 8, - ), + const SizedBox(height: 16), ASubTitle(_subtitle.status), const SizedBox( height: 4, @@ -249,8 +182,7 @@ class _UpdateDeviceTransferState extends State { GasStatusMenu( initialValue: _formModel.status, onSelect: (status) { - if(status==null) - return; + if (status == null) return; _formModel.status = status; setState(() {}); }, diff --git a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart index 9b1ba0b9..fdfd67e5 100644 --- a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart +++ b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart @@ -74,7 +74,7 @@ class _CreateSubWorkOrderPageState extends State { _callRequestForWorkOrder = await Provider.of(context).getCallRequestForWorkOrder(callId: widget.workOrder.callRequest.id.toString()); await assetTypesProvider.getTypes(); _subWorkOrders?.assetType = assetTypesProvider.statuses?.firstWhere( - (element) => element.value == _callRequestForWorkOrder.assetType, + (element) => element.value == _callRequestForWorkOrder?.assetType, orElse: () => null, ); setState(() { @@ -223,8 +223,7 @@ class _CreateSubWorkOrderPageState extends State { initialValue: _subWorkOrders?.faultDescription, onSelect: (status) { _subWorkOrders.faultDescription = status; - if(mounted) - setState(() {}); + if (mounted) setState(() {}); }, ), ], @@ -318,11 +317,8 @@ class _CreateSubWorkOrderPageState extends State { _validate = true; setState(() {}); if (validate()) { - if (_subWorkOrders.startofWorkTime == null) { - Fluttertoast.showToast(msg: "${subtitle.startDate} required"); - return; - } else if (_subWorkOrders.endofWorkTime == null) { - Fluttertoast.showToast(msg: "${subtitle.endDate} required"); + if (_subWorkOrders.timer?.startAt == null || _subWorkOrders.timer?.endAt == null) { + Fluttertoast.showToast(msg: "Working hours required"); return; } else if (_subWorkOrders.calllastSituation == null) { Fluttertoast.showToast(msg: "${subtitle.callLastSituation} required"); diff --git a/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart b/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart index 5c9a8fa7..e7d5fc93 100644 --- a/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart +++ b/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart @@ -135,8 +135,6 @@ class _SparePartsBottomSheetState extends State { return PartItem( part: part, onEdit: (qty) { - print("sss${spare.qty}"); - print(qty); spare.qty = qty; }, onDelete: (part) { diff --git a/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart b/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart index c6ebd386..df6e58f0 100644 --- a/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart +++ b/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/models/service_request/search_work_order.dart'; import 'package:test_sa/models/subtitle.dart'; @@ -10,8 +11,7 @@ import 'package:test_sa/views/widgets/status/report/service_report_repair_locati import '../../../controllers/localization/localization.dart'; import '../../../controllers/providers/api/status_drop_down/report/service_report_maintenance_situation_provider.dart'; -import '../../app_style/sizing.dart'; -import '../../widgets/date_and_time/time_picker.dart'; +import '../../widgets/timer/app_timer.dart'; import '../../widgets/titles/app_sub_title.dart'; class WorkOrderDetailsBottomSheet extends StatefulWidget { @@ -78,75 +78,23 @@ class _WorkOrderDetailsBottomSheetState extends State Validator.isNumeric(value) ? null : _subtitle.requiredWord, - textInputType: TextInputType.number, - onSaved: (value) { - _workOrder.workingHours = double.tryParse( - ((DateTime.tryParse(_workOrder.endofWorkTime ?? "")?.difference(DateTime.tryParse(_workOrder.startofWorkTime ?? ""))?.inMinutes ?? 0) / 60) - ?.toStringAsFixed(2) - ?.toString() ?? - "0"); - }, - ), - const SizedBox(height: 8), + const SizedBox(height: 16), ATextFormField( labelText: "Travel Hours", initialValue: _workOrder.travelingHours?.toString(), @@ -206,6 +154,13 @@ class _WorkOrderDetailsBottomSheetState extends State { ), ], ), - if (_userProvider.user?.type == UsersTypes.engineer) - Column( - children: [ - Row( - children: [ - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - const ASubTitle("Start of Work"), - SizedBox( - height: 8 * AppStyle.getScaleFactor(context), - ), - ADateTimePicker( - date: _gasRefillProvider.startDate, - from: DateTime.now().subtract(const Duration(days: 365)), - to: DateTime.now().add(const Duration(days: 365)), - onDateTimePicker: (date) { - _gasRefillProvider.startDate = date; - setState(() {}); - }, - ), - ], - ), - ), - const SizedBox(width: 8), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - const ASubTitle("End of Work"), - SizedBox( - height: 8 * AppStyle.getScaleFactor(context), - ), - ADateTimePicker( - date: _gasRefillProvider.endDate, - from: DateTime.now().subtract(const Duration(days: 365)), - to: DateTime.now().add(const Duration(days: 365)), - onDateTimePicker: (date) { - _gasRefillProvider.endDate = date; - setState(() {}); - }, - ), - ], - ), - ), - ], - ), - const SizedBox(height: 8), - ASubTitle(_subtitle.workingHours), - const SizedBox(height: 4), - ATextFormField( - initialValue: null, - textAlign: TextAlign.center, - hintText: _gasRefillProvider.startDate == null - ? "0" - : ((_gasRefillProvider.endDate?.difference(_gasRefillProvider.startDate)?.inMinutes ?? 0) / 60)?.toStringAsFixed(2)?.toString() ?? "0", - enable: false, - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => Validator.isNumeric(value) ? null : _subtitle.requiredWord, - textInputType: TextInputType.number, - onSaved: (value) { - // _serviceReport.workHours = value; - }, - ), - ], - ), + // if (_userProvider.user?.type == UsersTypes.engineer) + // Column( + // children: [ + // Row( + // children: [ + // Expanded( + // child: Column( + // crossAxisAlignment: CrossAxisAlignment.stretch, + // children: [ + // const ASubTitle("Start of Work"), + // SizedBox( + // height: 8 * AppStyle.getScaleFactor(context), + // ), + // ADateTimePicker( + // date: _gasRefillProvider.startDate, + // from: DateTime.now().subtract(const Duration(days: 365)), + // to: DateTime.now().add(const Duration(days: 365)), + // onDateTimePicker: (date) { + // _gasRefillProvider.startDate = date; + // setState(() {}); + // }, + // ), + // ], + // ), + // ), + // const SizedBox(width: 8), + // Expanded( + // child: Column( + // crossAxisAlignment: CrossAxisAlignment.stretch, + // children: [ + // const ASubTitle("End of Work"), + // SizedBox( + // height: 8 * AppStyle.getScaleFactor(context), + // ), + // ADateTimePicker( + // date: _gasRefillProvider.endDate, + // from: DateTime.now().subtract(const Duration(days: 365)), + // to: DateTime.now().add(const Duration(days: 365)), + // onDateTimePicker: (date) { + // _gasRefillProvider.endDate = date; + // setState(() {}); + // }, + // ), + // ], + // ), + // ), + // ], + // ), + // const SizedBox(height: 8), + // ASubTitle(_subtitle.workingHours), + // const SizedBox(height: 4), + // ATextFormField( + // initialValue: null, + // textAlign: TextAlign.center, + // hintText: _gasRefillProvider.startDate == null + // ? "0" + // : ((_gasRefillProvider.endDate?.difference(_gasRefillProvider.startDate)?.inMinutes ?? 0) / 60)?.toStringAsFixed(2)?.toString() ?? "0", + // enable: false, + // style: Theme.of(context).textTheme.subtitle1, + // validator: (value) => Validator.isNumeric(value) ? null : _subtitle.requiredWord, + // textInputType: TextInputType.number, + // onSaved: (value) { + // // _serviceReport.workHours = value; + // }, + // ), + // ], + // ), if (widget.gasRefillModel == null) Column( crossAxisAlignment: CrossAxisAlignment.start, diff --git a/lib/views/pages/user/requests/report/create_service_report.dart b/lib/views/pages/user/requests/report/create_service_report.dart index d94ddb69..690bdc92 100644 --- a/lib/views/pages/user/requests/report/create_service_report.dart +++ b/lib/views/pages/user/requests/report/create_service_report.dart @@ -23,24 +23,21 @@ import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; -import 'package:test_sa/views/widgets/date_and_time/time_picker.dart'; import 'package:test_sa/views/widgets/e_signature/e_signature.dart'; import 'package:test_sa/views/widgets/equipment/auto_complete_devices_field.dart'; import 'package:test_sa/views/widgets/images/mini_one_image_picker.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/parts/auto_complete_parts_field.dart'; import 'package:test_sa/views/widgets/parts/part_item.dart'; -import 'package:test_sa/views/widgets/status/employee/engineers_mune.dart'; import 'package:test_sa/views/widgets/status/report/service_report_equipment_status.dart'; import 'package:test_sa/views/widgets/status/report/service_report_last_call.dart'; import 'package:test_sa/views/widgets/status/report/service_report_reasons.dart'; -import 'package:test_sa/views/widgets/status/report/service_report_status.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import '../../../../../controllers/providers/api/status_drop_down/report/service_types_provider.dart'; -import '../../../../widgets/speech_to_text/speech_to_text.dart'; import '../../../../widgets/status/report/service_report_fault_description.dart'; import '../../../../widgets/status/report/service_report_repair_location.dart'; +import '../../../../widgets/timer/app_timer.dart'; class CreateServiceReport extends StatefulWidget { static final String id = "/create-service-report"; @@ -331,7 +328,7 @@ class _CreateServiceReportState extends State with TickerPr child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - // ASubTitle(_subtitle.reportStatus), + // ASubTitle(_subtitle.reportStatus), ASubTitle("Equipment Status"), _validate && _serviceReport.equipmentStatus == null ? ASubTitle( @@ -418,71 +415,23 @@ class _CreateServiceReportState extends State with TickerPr SizedBox( height: 8 * AppStyle.getScaleFactor(context), ), + ASubTitle(_subtitle.workingHours), + const SizedBox(height: 8), Row( children: [ Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - const ASubTitle("Start of Work"), - SizedBox( - height: 8 * AppStyle.getScaleFactor(context), - ), - ADateTimePicker( - date: _serviceReport.startDate, - from: DateTime.now().subtract(const Duration(days: 365)), - to: DateTime.now().add(const Duration(days: 365)), - onDateTimePicker: (date) { - _serviceReport.startDate = date; - setState(() {}); - }, - ), - ], - ), - ), - const SizedBox(width: 8), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - const ASubTitle("End of Work"), - SizedBox( - height: 8 * AppStyle.getScaleFactor(context), - ), - ADateTimePicker( - date: _serviceReport.endDate, - from: DateTime.now().subtract(const Duration(days: 365)), - to: DateTime.now().add(const Duration(days: 365)), - onDateTimePicker: (date) { - _serviceReport.endDate = date; - setState(() {}); - }, - ), - ], + child: AppTimer( + timer: _serviceReport.timer, + onChange: (timer) async { + _serviceReport.timer = timer; + _serviceReport.workingHours = num.tryParse((((timer?.durationInSecond ?? 0) / 60) / 60)?.toStringAsFixed(2) ?? "0"); + return true; + }, ), ), ], ), - const SizedBox(height: 8), - ASubTitle(_subtitle.workingHours), - const SizedBox(height: 4), - ATextFormField( - initialValue: null, - textAlign: TextAlign.center, - hintText: _serviceReport.startDate == null - ? "0" - : ((_serviceReport?.endDate?.difference(_serviceReport?.startDate)?.inMinutes ?? 0) / 60)?.toStringAsFixed(2)?.toString() ?? "0", - enable: false, - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => Validator.isNumeric(value) ? null : _subtitle.requiredWord, - textInputType: TextInputType.number, - onSaved: (value) { - // _serviceReport.workHours = value; - }, - ), - const SizedBox( - height: 8, - ), + const SizedBox(height: 16), // device sn Visibility( visible: widget.request.deviceSerialNumber == null, @@ -636,7 +585,7 @@ class _CreateServiceReportState extends State with TickerPr enable: false, hintText: _serviceReport.faultDescription?.workPerformed ?? "", controller: _workPreformedController, - style: Theme.of(context).textTheme.subtitle1, + style: Theme.of(context).textTheme.titleMedium, validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, textInputType: TextInputType.multiline, onSaved: (value) { @@ -701,7 +650,7 @@ class _CreateServiceReportState extends State with TickerPr ), ATextFormField( initialValue: _serviceReport?.travelingExpense?.toString(), - hintText: _subtitle.travelingExpense, + hintText: "i.e 3, 3.5, 4", textAlign: TextAlign.center, style: Theme.of(context).textTheme.titleMedium, textInputType: TextInputType.number, @@ -929,9 +878,9 @@ class _CreateServiceReportState extends State with TickerPr ), Column( children: List.generate(_serviceReport.parts.length, (index) { - Part _part = _serviceReport.parts[index]; + Part part = _serviceReport.parts[index]; return PartItem( - part: _part, + part: part, onDelete: (part) { _serviceReport.parts.remove(part); setState(() {}); diff --git a/lib/views/pages/user/requests/report/edit_service_report.dart b/lib/views/pages/user/requests/report/edit_service_report.dart index 0db15bb7..4a30278e 100644 --- a/lib/views/pages/user/requests/report/edit_service_report.dart +++ b/lib/views/pages/user/requests/report/edit_service_report.dart @@ -24,22 +24,17 @@ import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; -import 'package:test_sa/views/widgets/date_and_time/time_picker.dart'; import 'package:test_sa/views/widgets/e_signature/e_signature.dart'; import 'package:test_sa/views/widgets/equipment/auto_complete_devices_field.dart'; import 'package:test_sa/views/widgets/images/mini_one_image_picker.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/parts/auto_complete_parts_field.dart'; import 'package:test_sa/views/widgets/parts/part_item.dart'; -import 'package:test_sa/views/widgets/status/employee/engineers_mune.dart'; import 'package:test_sa/views/widgets/status/report/service_report_equipment_status.dart'; import 'package:test_sa/views/widgets/status/report/service_report_fault_description.dart'; import 'package:test_sa/views/widgets/status/report/service_report_last_call.dart'; import 'package:test_sa/views/widgets/status/report/service_report_reasons.dart'; import 'package:test_sa/views/widgets/status/report/service_report_repair_location.dart'; -import 'package:test_sa/views/widgets/status/report/service_report_status.dart'; -import 'package:test_sa/views/widgets/status/report/service_report_type.dart'; -import 'package:test_sa/views/widgets/status/report/service_status.dart'; import 'package:test_sa/views/widgets/timer/app_timer.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; @@ -617,71 +612,25 @@ class _EditServiceReportState extends State with TickerProvid // }, // ), // const SizedBox(height: 8,), + const SizedBox(height: 8), + ASubTitle(_subtitle.workingHours), + const SizedBox(height: 8), Row( children: [ Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - const ASubTitle("Start of Work"), - SizedBox( - height: 8 * AppStyle.getScaleFactor(context), - ), - ADateTimePicker( - date: _serviceReport.startDate, - from: DateTime.now().subtract(const Duration(days: 365)), - to: DateTime.now().add(const Duration(days: 365)), - onDateTimePicker: (date) { - _serviceReport.startDate = date; - setState(() {}); - }, - ), - ], - ), - ), - const SizedBox(width: 8), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - const ASubTitle("End of Work"), - SizedBox( - height: 8 * AppStyle.getScaleFactor(context), - ), - ADateTimePicker( - date: _serviceReport.endDate, - from: DateTime.now().subtract(const Duration(days: 365)), - to: DateTime.now().add(const Duration(days: 365)), - onDateTimePicker: (date) { - _serviceReport.endDate = date; - setState(() {}); - }, - ), - ], + child: AppTimer( + timer: _serviceReport.timer, + enabled: false, + // onChange: (timer) async { + // _serviceReport.timer = timer; + // _serviceReport.workingHours = num.tryParse((((timer?.durationInSecond ?? 0) / 60) / 60)?.toStringAsFixed(2) ?? "0"); + // return true; + // }, ), ), ], ), - const SizedBox(height: 8), - ASubTitle(_subtitle.workingHours), - const SizedBox(height: 4), - ATextFormField( - initialValue: null, - textAlign: TextAlign.center, - hintText: _serviceReport.startDate == null - ? "0" - : ((_serviceReport?.endDate?.difference(_serviceReport?.startDate)?.inMinutes ?? 0) / 60)?.toStringAsFixed(2)?.toString() ?? "0", - enable: false, - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => Validator.isNumeric(value) ? null : _subtitle.requiredWord, - textInputType: TextInputType.number, - onSaved: (value) { - // _serviceReport.workHours = value; - }, - ), - const SizedBox( - height: 8, - ), + const SizedBox(height: 16), if (_showCommentField) const SizedBox( height: 8, @@ -711,8 +660,7 @@ class _EditServiceReportState extends State with TickerProvid onSelect: (status) { print("faluttt:${status?.toJson()}"); _serviceReport.faultDescription = status; - if(mounted) - setState(() {}); + if (mounted) setState(() {}); }, ), const SizedBox(height: 8), @@ -1058,6 +1006,13 @@ class _EditServiceReportState extends State with TickerProvid AButton( text: _subtitle.update, onPressed: () async { + if (_serviceReport?.workingHours == null) { + await Fluttertoast.showToast(msg: "Working Hours Timer Isn't Started"); + return; + } else if ((_serviceReport?.timer?.stopped ?? false) == false) { + await Fluttertoast.showToast(msg: "Stop The Timer"); + return; + } _validate = true; print("jere1245"); // if (!_formKey.currentState.validate()) { @@ -1069,7 +1024,7 @@ class _EditServiceReportState extends State with TickerProvid // setState(() {}); // return; // } - // print("jere14"); + // print("jere14"); _formKey.currentState.save(); _isLoading = true; diff --git a/lib/views/widgets/parts/part_item.dart b/lib/views/widgets/parts/part_item.dart index 7f99f70d..c108d07e 100644 --- a/lib/views/widgets/parts/part_item.dart +++ b/lib/views/widgets/parts/part_item.dart @@ -39,7 +39,11 @@ class _PartItemState extends State { iconData: Icons.add, color: Theme.of(context).primaryColor, onPressed: () { - widget.onEdit(++widget.part.quantity); + if (widget.onEdit == null) { + ++widget.part.quantity; + } else { + widget.onEdit(++widget.part.quantity); + } setState(() {}); }, ), @@ -49,7 +53,11 @@ class _PartItemState extends State { onPressed: widget.part.quantity < 2 ? null : () { - widget.onEdit(--widget.part.quantity); + if (widget.onEdit == null) { + --widget.part.quantity; + } else { + widget.onEdit(--widget.part.quantity); + } setState(() {}); }, ), diff --git a/lib/views/widgets/timer/app_timer.dart b/lib/views/widgets/timer/app_timer.dart index 84c5e4e1..9e887905 100644 --- a/lib/views/widgets/timer/app_timer.dart +++ b/lib/views/widgets/timer/app_timer.dart @@ -9,11 +9,13 @@ class AppTimer extends StatefulWidget { final TimerModel timer; final Future Function(TimerModel) onChange; final TextStyle style; + final bool enabled; const AppTimer({ Key key, this.timer, this.onChange, this.style, + this.enabled = true, }) : super(key: key); @override @@ -32,7 +34,7 @@ class _AppTimerState extends State { _startTimer() async { if (!_running) { final time = DateTime.now(); - bool result = await widget.onChange(TimerModel(startAt: time, endAt: null, durationInSecond: _delay)); + bool result = await widget.onChange(TimerModel(startAt: time, endAt: null, durationInSecond: _delay, stopped: false)); if (!result) return; _running = true; @@ -52,7 +54,7 @@ class _AppTimerState extends State { _stopTimer() async { final time = DateTime.now(); final tempStartAt = _startAt.add(Duration(seconds: _delay)); - bool result = await widget.onChange(TimerModel(startAt: tempStartAt, endAt: time, durationInSecond: _delay)); + bool result = await widget.onChange(TimerModel(startAt: tempStartAt, endAt: time, durationInSecond: _delay, stopped: true)); if (!result) return; _running = false; _endAt = time; @@ -99,7 +101,7 @@ class _AppTimerState extends State { child: ElevatedButton( style: ElevatedButton.styleFrom( minimumSize: const Size(1, 1), padding: EdgeInsets.all(4 * AppStyle.getScaleFactor(context)), backgroundColor: _running ? AColors.green[300] : AColors.grey, foregroundColor: Colors.black), - onPressed: _loading ? null : _onPressed, + onPressed: _loading || widget.enabled == false ? null : _onPressed, child: _loading ? const SizedBox.square( dimension: 18, @@ -108,7 +110,7 @@ class _AppTimerState extends State { )) : Row( children: [ - Icon(_running ? Icons.pause : Icons.play_arrow), + if (widget.enabled) Icon(_running ? Icons.pause : Icons.play_arrow), Expanded( child: Center( child: ValueListenableBuilder( @@ -116,7 +118,7 @@ class _AppTimerState extends State { builder: (context, value, _) { return Text( value, - style: widget.style, + style: widget.enabled ? widget.style : widget.style?.copyWith(color: Colors.black54), ); }), ),