Convert (Start Date & End Date) to Timer

pull/1/head
zaid_daoud 2 years ago
parent 147351bd10
commit 45b66e6b2a

@ -23,7 +23,7 @@ class DeviceTransferProvider extends ChangeNotifier {
building = null; building = null;
floor = null; floor = null;
department = null; department = null;
room=""; room = "";
startDate = null; startDate = null;
endDate = null; endDate = null;
} }
@ -44,7 +44,6 @@ class DeviceTransferProvider extends ChangeNotifier {
// failed _loading = false // failed _loading = false
bool isLoading; bool isLoading;
Hospital hospital; Hospital hospital;
Buildings building; Buildings building;
Floors floor; Floors floor;
@ -115,7 +114,7 @@ class DeviceTransferProvider extends ChangeNotifier {
// "transferCode": "string", // "transferCode": "string",
"destBuildingId": building?.id, "destBuildingId": building?.id,
"destFloorId": floor.id, "destFloorId": floor.id,
"destRoom": room, "destRoom": room,
// "senderBuildingId": 0, // "senderBuildingId": 0,
// "senderFloorId": 0, // "senderFloorId": 0,
// "senderDepartmentId": 0, // "senderDepartmentId": 0,
@ -179,8 +178,8 @@ class DeviceTransferProvider extends ChangeNotifier {
"senderMachineStatusId": newModel.status.id, "senderMachineStatusId": newModel.status.id,
"senderComment": newModel.comment, "senderComment": newModel.comment,
"senderWorkingHours": newModel.workingHours, "senderWorkingHours": newModel.workingHours,
"senderStartDate": newModel.startDate?.toIso8601String(), "senderStartDate": newModel.timer?.startAt?.toIso8601String(),
"senderEndDate": newModel.endDate?.toIso8601String(), "senderEndDate": newModel.timer?.endAt?.toIso8601String(),
"senderTravelingHours": newModel.travelingHours, "senderTravelingHours": newModel.travelingHours,
"senderAttachmentName": "${newModel.signature}.png", "senderAttachmentName": "${newModel.signature}.png",
"destSiteId": oldModel.receiver.client.id, "destSiteId": oldModel.receiver.client.id,
@ -189,8 +188,8 @@ class DeviceTransferProvider extends ChangeNotifier {
"receiverMachineStatusId": oldModel.receiver.status.id ?? "", "receiverMachineStatusId": oldModel.receiver.status.id ?? "",
"receiverComment": oldModel.receiver.comment, "receiverComment": oldModel.receiver.comment,
"receiverWorkingHours": oldModel.receiver.workingHours, "receiverWorkingHours": oldModel.receiver.workingHours,
"receiverStartDate": oldModel.receiver.startDate?.toIso8601String(), "receiverStartDate": oldModel.receiver.timer?.startAt?.toIso8601String(),
"receiverEndDate": oldModel.receiver.endDate?.toIso8601String(), "receiverEndDate": oldModel.receiver.timer?.endAt?.toIso8601String(),
"receiverTravelingHours": oldModel.receiver.travelingHours, "receiverTravelingHours": oldModel.receiver.travelingHours,
"receiverAttachmentName": "${oldModel.receiver.signature}.png", "receiverAttachmentName": "${oldModel.receiver.signature}.png",
}); });
@ -202,8 +201,8 @@ class DeviceTransferProvider extends ChangeNotifier {
"senderMachineStatusId": oldModel.sender.status.id, "senderMachineStatusId": oldModel.sender.status.id,
"senderComment": oldModel.sender.comment, "senderComment": oldModel.sender.comment,
"senderWorkingHours": oldModel.sender.workingHours, "senderWorkingHours": oldModel.sender.workingHours,
"senderStartDate": oldModel.sender.startDate?.toIso8601String(), "senderStartDate": oldModel.sender.timer?.startAt?.toIso8601String(),
"senderEndDate": oldModel.sender.endDate?.toIso8601String(), "senderEndDate": oldModel.sender.timer?.endAt?.toIso8601String(),
"senderTravelingHours": oldModel.sender.travelingHours, "senderTravelingHours": oldModel.sender.travelingHours,
"senderAttachmentName": "${oldModel.sender.signature}.png", "senderAttachmentName": "${oldModel.sender.signature}.png",
"destSiteId": newModel.client.id, "destSiteId": newModel.client.id,
@ -212,8 +211,8 @@ class DeviceTransferProvider extends ChangeNotifier {
"receiverMachineStatusId": newModel.status?.id ?? "", "receiverMachineStatusId": newModel.status?.id ?? "",
"receiverComment": newModel.comment, "receiverComment": newModel.comment,
"receiverWorkingHours": newModel.workingHours, "receiverWorkingHours": newModel.workingHours,
"receiverStartDate": newModel.startDate?.toIso8601String(), "receiverStartDate": newModel.timer?.startAt?.toIso8601String(),
"receiverEndDate": newModel.endDate?.toIso8601String(), "receiverEndDate": newModel.timer?.endAt?.toIso8601String(),
"receiverTravelingHours": newModel.travelingHours, "receiverTravelingHours": newModel.travelingHours,
"receiverAttachmentName": "${newModel.signature}.png", "receiverAttachmentName": "${newModel.signature}.png",
}); });
@ -247,5 +246,4 @@ class DeviceTransferProvider extends ChangeNotifier {
return -1; return -1;
} }
} }
} }

@ -1,4 +1,5 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:developer';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
@ -237,7 +238,7 @@ class ServiceRequestsProvider extends ChangeNotifier {
"attachmentsCallRequest": request.devicePhotos?.map((e) => {"name": e})?.toList(), "attachmentsCallRequest": request.devicePhotos?.map((e) => {"name": e})?.toList(),
"assignedEmployee": { "assignedEmployee": {
"id": request.engineerId, "id": request.engineerId,
"name": request.engineerName, "name": request.engineerName,
}, },
"callSiteContactPerson": [ "callSiteContactPerson": [
{ {
@ -320,9 +321,9 @@ class ServiceRequestsProvider extends ChangeNotifier {
"currentSituation": null, "currentSituation": null,
"repairLocation": report.repairLocation?.toMap(), "repairLocation": report.repairLocation?.toMap(),
"reason": report.reason?.toMap(), "reason": report.reason?.toMap(),
"startofWorkTime": report.startDate?.toIso8601String() ?? "", "startofWorkTime": report.timer?.startAt?.toIso8601String() ?? "",
"endofWorkTime": report.endDate?.toIso8601String() ?? "", "endofWorkTime": report.timer?.endAt?.toIso8601String() ?? "",
"workingHours": ((report?.endDate?.difference(report?.startDate)?.inMinutes ?? 0) / 60), "workingHours": report?.workingHours,
"travelingHours": report.travelingHours, "travelingHours": report.travelingHours,
"travelingExpenses": report.travelingExpense ?? 0, "travelingExpenses": report.travelingExpense ?? 0,
if (report.faultDescription != null) "faultDescription": report.faultDescription.toJson(), if (report.faultDescription != null) "faultDescription": report.faultDescription.toJson(),
@ -399,12 +400,14 @@ class ServiceRequestsProvider extends ChangeNotifier {
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received // client's request was successfully received
Map<String, dynamic> listJson = json.decode(response.body)["data"]; Map<String, dynamic> listJson = json.decode(response.body)["data"];
log(listJson?.toString());
callRequestForWorkOrder = CallRequestForWorkOrder.fromJson(listJson); callRequestForWorkOrder = CallRequestForWorkOrder.fromJson(listJson);
} }
notifyListeners(); notifyListeners();
return callRequestForWorkOrder; return callRequestForWorkOrder;
} catch (error) { } catch (error) {
print(error);
return null; return null;
} }
} }
@ -479,22 +482,22 @@ class ServiceRequestsProvider extends ChangeNotifier {
// body["job_id"] = request.id; // body["job_id"] = request.id;
// body["report_id"] = request.reportID; // body["report_id"] = request.reportID;
// try { // try {
Map<String, dynamic> body = report.toMap(request); Map<String, dynamic> body = report.toMap(request);
// body["uid"] = user.id; // body["uid"] = user.id;
// body["token"] = user.token; // body["token"] = user.token;
response = await ApiManager.instance.put(URLs.updateServiceReport, body: body); response = await ApiManager.instance.put(URLs.updateServiceReport, body: body);
// response = await post( // response = await post(
// Uri.parse( // Uri.parse(
// host+URLs.updateServiceReport), // host+URLs.updateServiceReport),
// body: body, // body: body,
// ); // );
// stateCode = response.statusCode; // stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
reset(); reset();
notifyListeners(); notifyListeners();
} }
return response.statusCode; return response.statusCode;
// } catch (error) { // } catch (error) {
// print(error); // print(error);
// return -1; // return -1;

@ -82,7 +82,7 @@ class Asset {
Department department; Department department;
String room; String room;
String testsDay; String testsDay;
String purchasingPrice; num purchasingPrice;
String nbv; String nbv;
String currency; String currency;
String poNo; String poNo;

@ -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/hospital.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import '../timer_model.dart';
class DeviceTransfer { class DeviceTransfer {
int id; int id;
String userId; String userId;
@ -46,21 +48,26 @@ class DeviceTransfer {
title: parsedJson["transferCode"], title: parsedJson["transferCode"],
userId: parsedJson["uid"], userId: parsedJson["uid"],
device: Device( device: Device(
id: parsedJson["assetId"], id: parsedJson["assetId"],
number: parsedJson["assetNumber"], number: parsedJson["assetNumber"],
serialNumber: parsedJson["assetSerialNo"], serialNumber: parsedJson["assetSerialNo"],
destBuildingName: parsedJson["destBuildingName"], destBuildingName: parsedJson["destBuildingName"],
destDepartmentName: parsedJson["destDepartmentName"], destDepartmentName: parsedJson["destDepartmentName"],
destFloor: parsedJson["destFloor"], destFloor: parsedJson["destFloor"],
destRoom: parsedJson["destRoom"], destRoom: parsedJson["destRoom"],
destSiteName: parsedJson["destSiteName"] destSiteName: parsedJson["destSiteName"]),
),
sender: DeviceTransferInfo( sender: DeviceTransferInfo(
travelingHours: parsedJson["senderTravelingHours"], travelingHours: parsedJson["senderTravelingHours"],
comment: parsedJson["senderComment"], comment: parsedJson["senderComment"],
workingHours: parsedJson["senderWorkingHours"], workingHours: parsedJson["senderWorkingHours"],
startDate: parsedJson["senderStartDate"]==null ? null:DateTime.parse(parsedJson["senderStartDate"]), timer: TimerModel(
endDate: parsedJson["senderEndDate"]==null ? null:DateTime.parse(parsedJson["senderEndDate"]), 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"], userId: parsedJson["senderAssignedEmployeeId"],
userName: parsedJson["senderAssignedEmployeeName"], userName: parsedJson["senderAssignedEmployeeName"],
assignedEmployeeName: parsedJson["senderAssignedEmployeeName"], assignedEmployeeName: parsedJson["senderAssignedEmployeeName"],
@ -80,8 +87,11 @@ class DeviceTransfer {
travelingHours: parsedJson["receiverTravelingHours"], travelingHours: parsedJson["receiverTravelingHours"],
comment: parsedJson["receiverComment"], comment: parsedJson["receiverComment"],
workingHours: parsedJson["receiverWorkingHours"], workingHours: parsedJson["receiverWorkingHours"],
startDate: parsedJson["receiverStartDate"]==null ? null:DateTime.parse(parsedJson["receiverStartDate"]), timer: parsedJson["receiverStartDate"] != null || parsedJson["receiverEndDate"] != null
endDate: parsedJson["receiverEndDate"]==null ? null:DateTime.parse(parsedJson["receiverEndDate"]), ? 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"], userId: parsedJson["receiverAssignedEmployeeId"],
userName: parsedJson["receiverAssignedEmployeeName"], userName: parsedJson["receiverAssignedEmployeeName"],
assignedEmployeeName: parsedJson["receiverAssignedEmployeeName"], assignedEmployeeName: parsedJson["receiverAssignedEmployeeName"],

@ -2,19 +2,22 @@ import 'package:test_sa/models/department.dart';
import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/models/hospital.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import '../timer_model.dart';
class DeviceTransferInfo { class DeviceTransferInfo {
String userId; String userId;
String comment; String comment;
Hospital client; Hospital client;
Department department; Department department;
String workingHours; String workingHours;
DateTime startDate; // DateTime startDate;
DateTime endDate; // DateTime endDate;
String travelingHours; String travelingHours;
String userName; String userName;
String signature; String signature;
String assignedEmployeeName; String assignedEmployeeName;
Lookup status; Lookup status;
TimerModel timer;
DeviceTransferInfo({ DeviceTransferInfo({
this.userId, this.userId,
@ -23,12 +26,13 @@ class DeviceTransferInfo {
this.client, this.client,
this.userName, this.userName,
this.travelingHours, this.travelingHours,
this.startDate, // this.startDate,
this.endDate, // this.endDate,
this.workingHours, this.workingHours,
this.signature, this.signature,
this.status, this.status,
this.assignedEmployeeName this.assignedEmployeeName,
this.timer,
}); });
Map<String, String> toJson(bool isSender) { Map<String, String> toJson(bool isSender) {
@ -37,8 +41,10 @@ class DeviceTransferInfo {
if (comment != null && comment.isNotEmpty) body["${baseKey}comment"] = comment; if (comment != null && comment.isNotEmpty) body["${baseKey}comment"] = comment;
if (workingHours != null && workingHours.isNotEmpty) body["${baseKey}working_hours"] = workingHours; if (workingHours != null && workingHours.isNotEmpty) body["${baseKey}working_hours"] = workingHours;
if (startDate != null) body["${baseKey}start_date"] = startDate?.toIso8601String(); // if (startDate != null) body["${baseKey}start_date"] = startDate?.toIso8601String();
if (endDate != null) body["${baseKey}end_date"] = endDate?.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 (travelingHours != null && travelingHours.isNotEmpty) body["${baseKey}travel_hours"] = travelingHours;
if (status != null) body["${baseKey}status"] = status.id.toString(); if (status != null) body["${baseKey}status"] = status.id.toString();
if (signature != null && signature.isNotEmpty) body["${baseKey}image"] = signature; if (signature != null && signature.isNotEmpty) body["${baseKey}image"] = signature;
@ -57,8 +63,9 @@ class DeviceTransferInfo {
client = Hospital.fromHospital(old.client); client = Hospital.fromHospital(old.client);
department = Department.fromDepartment(old.department); department = Department.fromDepartment(old.department);
workingHours = old.workingHours; workingHours = old.workingHours;
startDate = old.startDate; // startDate = old.startDate;
endDate = old.endDate; // endDate = old.endDate;
timer = old.timer;
travelingHours = old.travelingHours; travelingHours = old.travelingHours;
comment = old.comment; comment = old.comment;
if (withSignature) signature = old.signature; if (withSignature) signature = old.signature;
@ -68,14 +75,20 @@ class DeviceTransferInfo {
factory DeviceTransferInfo.fromJson(Map<String, dynamic> parsedJson, String key) { factory DeviceTransferInfo.fromJson(Map<String, dynamic> parsedJson, String key) {
return DeviceTransferInfo( return DeviceTransferInfo(
workingHours: parsedJson["${key}working_hours"], workingHours: parsedJson["${key}working_hours"],
startDate: parsedJson["${key}start_date"], // startDate: parsedJson["${key}start_date"],
endDate: parsedJson["${key}end_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"], travelingHours: parsedJson["${key}travel_hours"],
userName: parsedJson["${key}name"], userName: parsedJson["${key}name"],
signature: parsedJson["${key}image"], signature: parsedJson["${key}image"],
userId: parsedJson["${key}id"], userId: parsedJson["${key}id"],
comment: parsedJson["${key}comment"], comment: parsedJson["${key}comment"],
assignedEmployeeName:parsedJson["${key}AssignedEmployeeName"], assignedEmployeeName: parsedJson["${key}AssignedEmployeeName"],
client: Hospital(id: parsedJson["${key}SiteId"], name: parsedJson["${key}SiteName"]), client: Hospital(id: parsedJson["${key}SiteId"], name: parsedJson["${key}SiteName"]),
department: Department( department: Department(
id: parsedJson["${key}DepartmentId"], id: parsedJson["${key}DepartmentId"],

@ -117,7 +117,12 @@ class Pentry {
actualVisitDate: DateTime.tryParse(map["actualDate"] ?? ""), actualVisitDate: DateTime.tryParse(map["actualDate"] ?? ""),
expectedVisitDate: DateTime.tryParse(map["expectedDate"] ?? ""), expectedVisitDate: DateTime.tryParse(map["expectedDate"] ?? ""),
travelingHours: map["travelingHours"], 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, // contacts: contacts,
ppmCheckLists: ppmCheckLists, ppmCheckLists: ppmCheckLists,
calibrationTools: calibrationTools, calibrationTools: calibrationTools,

@ -13,8 +13,8 @@ class ServiceReport {
int id; int id;
double operatingHours; double operatingHours;
DateTime visitDate; DateTime visitDate;
DateTime endDate; // DateTime endDate;
DateTime startDate; // DateTime startDate;
Lookup assetType; Lookup assetType;
Lookup callLastSituation; Lookup callLastSituation;
Lookup currentSituation; Lookup currentSituation;
@ -45,40 +45,41 @@ class ServiceReport {
String reviewComment; String reviewComment;
FaultDescription faultDescription; FaultDescription faultDescription;
ServiceReport( ServiceReport({
{this.id, this.id,
this.visitDate, this.visitDate,
this.endDate, // this.endDate,
this.assetType, this.assetType,
this.equipmentStatus, this.equipmentStatus,
this.type, this.type,
this.faultDescriptionId, this.faultDescriptionId,
this.workingHours, this.workingHours,
this.travelingHours, this.travelingHours,
this.parts, this.parts,
this.engineer, this.engineer,
this.workPreformed, this.workPreformed,
this.reason, this.reason,
this.operatingHours, this.operatingHours,
this.callLastSituation, this.callLastSituation,
this.currentSituation, this.currentSituation,
this.jobSheetNumber, this.jobSheetNumber,
this.image, this.image,
this.device, this.device,
this.invoiceCode, this.invoiceCode,
this.invoiceNumber, this.invoiceNumber,
this.quantity = "1", this.quantity = "1",
this.timer, this.timer,
this.signatureNurse, this.signatureNurse,
this.signatureEngineer, this.signatureEngineer,
this.localNurseSignature, this.localNurseSignature,
this.localEngineerSignature, this.localEngineerSignature,
this.comment, this.comment,
this.repairLocation, this.repairLocation,
this.travelingExpense, this.travelingExpense,
this.startDate, // this.startDate,
this.reviewComment, this.reviewComment,
this.faultDescription}); this.faultDescription,
});
Map<String, dynamic> toMap(ServiceRequest request) { Map<String, dynamic> toMap(ServiceRequest request) {
Map<String, dynamic> _map = {}; Map<String, dynamic> _map = {};
@ -139,9 +140,12 @@ class ServiceReport {
_map["engSignature"] = signatureEngineer; _map["engSignature"] = signatureEngineer;
_map["comment"] = comment; _map["comment"] = comment;
_map["travelingExpenses"] = travelingExpense; _map["travelingExpenses"] = travelingExpense;
_map["startofWorkTime"] = startDate.toIso8601String(); // _map["startofWorkTime"] = startDate.toIso8601String();
_map["endofWorkTime"] = endDate.toIso8601String(); // _map["endofWorkTime"] = endDate.toIso8601String();
_map["workingHours"] = endDate?.difference(startDate)?.inHours ?? 0; // _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; _map["reviewComment"] = reviewComment;
return _map; return _map;
} }
@ -192,8 +196,8 @@ class ServiceReport {
faultDescription: parsedJson['faultDescription'] != null ? FaultDescription.fromJson(parsedJson['faultDescription']) : null, faultDescription: parsedJson['faultDescription'] != null ? FaultDescription.fromJson(parsedJson['faultDescription']) : null,
// faultDescription: parsedJson["faultDescription"], // faultDescription: parsedJson["faultDescription"],
startDate: DateTime.tryParse(parsedJson["startofWorkTime"]?? ""), // startDate: DateTime.tryParse(parsedJson["startofWorkTime"] ?? ""),
endDate: DateTime.tryParse(parsedJson["endofWorkTime"]??""), // endDate: DateTime.tryParse(parsedJson["endofWorkTime"] ?? ""),
//invoiceCode: parsedJson["invoice_code"], //invoiceCode: parsedJson["invoice_code"],
//invoiceNumber: parsedJson["invoice_no"], //invoiceNumber: parsedJson["invoice_no"],
//jobSheetNumber: parsedJson["job_sheet_no"], //jobSheetNumber: parsedJson["job_sheet_no"],
@ -206,7 +210,11 @@ class ServiceReport {
visitDate: DateTime.tryParse(parsedJson["visitDate"]), visitDate: DateTime.tryParse(parsedJson["visitDate"]),
workingHours: parsedJson["workingHours"], workingHours: parsedJson["workingHours"],
timer: TimerModel( 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"], //workPreformed: parsedJson["work_performed"],
device: Device.fromJson(parsedJson["callRequest"]["asset"]), device: Device.fromJson(parsedJson["callRequest"]["asset"]),
signatureNurse: URLs.getFileUrl(parsedJson["nurseSignature"]), signatureNurse: URLs.getFileUrl(parsedJson["nurseSignature"]),

@ -1,4 +1,5 @@
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/timer_model.dart';
import '../fault_description.dart'; import '../fault_description.dart';
@ -21,8 +22,8 @@ class SearchWorkOrder {
this.currentSituation, this.currentSituation,
this.repairLocation, this.repairLocation,
this.reason, this.reason,
this.startofWorkTime, // this.startofWorkTime,
this.endofWorkTime, // this.endofWorkTime,
this.workingHours, this.workingHours,
this.travelingHours, this.travelingHours,
this.travelingExpenses, this.travelingExpenses,
@ -36,6 +37,7 @@ class SearchWorkOrder {
this.engSignature, this.engSignature,
this.nurseSignature, this.nurseSignature,
this.woParentDto, this.woParentDto,
this.timer,
}); });
SearchWorkOrder.fromJson(dynamic json) { SearchWorkOrder.fromJson(dynamic json) {
@ -66,8 +68,13 @@ class SearchWorkOrder {
currentSituation = json['currentSituation'] != null ? Lookup.fromJson(json['currentSituation']) : null; currentSituation = json['currentSituation'] != null ? Lookup.fromJson(json['currentSituation']) : null;
repairLocation = json['repairLocation'] != null ? Lookup.fromJson(json['repairLocation']) : null; repairLocation = json['repairLocation'] != null ? Lookup.fromJson(json['repairLocation']) : null;
reason = json['reason'] != null ? Lookup.fromJson(json['reason']) : null; reason = json['reason'] != null ? Lookup.fromJson(json['reason']) : null;
startofWorkTime = json['startofWorkTime']; // startofWorkTime = json['startofWorkTime'];
endofWorkTime = json['endofWorkTime']; // 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']; workingHours = json['workingHours'];
travelingHours = json['travelingHours']; travelingHours = json['travelingHours'];
travelingExpenses = json['travelingExpenses']; travelingExpenses = json['travelingExpenses'];
@ -121,8 +128,9 @@ class SearchWorkOrder {
if (wo.currentSituation != null) currentSituation = Lookup.fromJson((wo.currentSituation)?.toMap() ?? {}); if (wo.currentSituation != null) currentSituation = Lookup.fromJson((wo.currentSituation)?.toMap() ?? {});
repairLocation = Lookup.fromJson((wo.repairLocation ?? repairLocation)?.toMap() ?? {}); repairLocation = Lookup.fromJson((wo.repairLocation ?? repairLocation)?.toMap() ?? {});
reason = Lookup.fromJson((wo.reason ?? reason)?.toMap() ?? {}); reason = Lookup.fromJson((wo.reason ?? reason)?.toMap() ?? {});
startofWorkTime = wo.startofWorkTime ?? startofWorkTime; // startofWorkTime = wo.startofWorkTime ?? startofWorkTime;
endofWorkTime = wo.endofWorkTime ?? endofWorkTime; // endofWorkTime = wo.endofWorkTime ?? endofWorkTime;
timer = wo.timer ?? timer;
workingHours = wo.workingHours ?? workingHours; workingHours = wo.workingHours ?? workingHours;
travelingHours = wo.travelingHours ?? travelingHours; travelingHours = wo.travelingHours ?? travelingHours;
travelingExpenses = wo.travelingExpenses ?? travelingExpenses; travelingExpenses = wo.travelingExpenses ?? travelingExpenses;
@ -155,8 +163,8 @@ class SearchWorkOrder {
Lookup currentSituation; Lookup currentSituation;
Lookup repairLocation; Lookup repairLocation;
Lookup reason; Lookup reason;
String startofWorkTime; // String startofWorkTime;
String endofWorkTime; // String endofWorkTime;
num workingHours; num workingHours;
num travelingHours; num travelingHours;
num travelingExpenses; num travelingExpenses;
@ -170,6 +178,8 @@ class SearchWorkOrder {
String engSignature; String engSignature;
String nurseSignature; String nurseSignature;
WoParentDto woParentDto; WoParentDto woParentDto;
TimerModel timer;
SearchWorkOrder copyWith({ SearchWorkOrder copyWith({
num id, num id,
num parentWOId, num parentWOId,
@ -188,8 +198,8 @@ class SearchWorkOrder {
Lookup currentSituation, Lookup currentSituation,
Lookup repairLocation, Lookup repairLocation,
Lookup reason, Lookup reason,
String startofWorkTime, // String startofWorkTime,
String endofWorkTime, // String endofWorkTime,
num workingHours, num workingHours,
num travelingHours, num travelingHours,
num travelingExpenses, num travelingExpenses,
@ -203,6 +213,7 @@ class SearchWorkOrder {
String engSignature, String engSignature,
String nurseSignature, String nurseSignature,
WoParentDto woParentDto, WoParentDto woParentDto,
TimerModel timer,
}) => }) =>
SearchWorkOrder( SearchWorkOrder(
id: id ?? this.id, id: id ?? this.id,
@ -222,8 +233,8 @@ class SearchWorkOrder {
currentSituation: currentSituation ?? this.currentSituation, currentSituation: currentSituation ?? this.currentSituation,
repairLocation: repairLocation ?? this.repairLocation, repairLocation: repairLocation ?? this.repairLocation,
reason: reason ?? this.reason, reason: reason ?? this.reason,
startofWorkTime: startofWorkTime ?? this.startofWorkTime, // startofWorkTime: startofWorkTime ?? this.startofWorkTime,
endofWorkTime: endofWorkTime ?? this.endofWorkTime, // endofWorkTime: endofWorkTime ?? this.endofWorkTime,
workingHours: workingHours ?? this.workingHours, workingHours: workingHours ?? this.workingHours,
travelingHours: travelingHours ?? this.travelingHours, travelingHours: travelingHours ?? this.travelingHours,
travelingExpenses: travelingExpenses ?? this.travelingExpenses, travelingExpenses: travelingExpenses ?? this.travelingExpenses,
@ -237,6 +248,7 @@ class SearchWorkOrder {
engSignature: engSignature ?? this.engSignature, engSignature: engSignature ?? this.engSignature,
nurseSignature: nurseSignature ?? this.nurseSignature, nurseSignature: nurseSignature ?? this.nurseSignature,
woParentDto: woParentDto ?? this.woParentDto, woParentDto: woParentDto ?? this.woParentDto,
timer: timer ?? this.timer,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
@ -269,20 +281,22 @@ class SearchWorkOrder {
map['calllastSituation'] = calllastSituation.toMap(); map['calllastSituation'] = calllastSituation.toMap();
} }
map['currentSituation'] = currentSituation?.toMap(); map['currentSituation'] = currentSituation?.toMap();
if (repairLocation != null) { if (repairLocation?.id != null) {
map['repairLocation'] = repairLocation.toMap(); map['repairLocation'] = repairLocation.toMap();
} }
if (reason != null) { if (reason != null) {
map['reason'] = reason.toMap(); map['reason'] = reason.toMap();
} }
map['startofWorkTime'] = startofWorkTime; // map['startofWorkTime'] = startofWorkTime;
map['endofWorkTime'] = endofWorkTime; // map['endofWorkTime'] = endofWorkTime;
map['startofWorkTime'] = timer?.startAt?.toIso8601String();
map['endofWorkTime'] = timer?.endAt?.toIso8601String();
map['workingHours'] = workingHours; map['workingHours'] = workingHours;
map['travelingHours'] = travelingHours; map['travelingHours'] = travelingHours;
map['travelingExpenses'] = travelingExpenses; map['travelingExpenses'] = travelingExpenses;
if (faultDescription?.id != null ) { if (faultDescription?.id != null) {
map['faultDescription'] = faultDescription.toJson(); map['faultDescription'] = faultDescription.toJson();
} }
if (sparePartsWorkOrders != null) { if (sparePartsWorkOrders != null) {
map['sparePartsWorkOrders'] = sparePartsWorkOrders.map((v) => v.toJson()).toList(); map['sparePartsWorkOrders'] = sparePartsWorkOrders.map((v) => v.toJson()).toList();

@ -2,6 +2,7 @@ class TimerModel {
DateTime startAt; DateTime startAt;
DateTime endAt; DateTime endAt;
int durationInSecond; int durationInSecond;
bool stopped;
TimerModel({this.startAt, this.endAt, this.durationInSecond}); TimerModel({this.startAt, this.endAt, this.durationInSecond, this.stopped});
} }

@ -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 'package:test_sa/views/widgets/titles/app_sub_title.dart';
import '../../../../controllers/localization/localization.dart'; import '../../../../controllers/localization/localization.dart';
import '../../../controllers/validator/validator.dart'; import '../../widgets/timer/app_timer.dart';
import '../../widgets/date_and_time/time_picker.dart';
class UpdateDeviceTransfer extends StatefulWidget { class UpdateDeviceTransfer extends StatefulWidget {
final DeviceTransfer model; final DeviceTransfer model;
@ -46,6 +45,13 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>(); final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
_update() async { _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; _validate = true;
if (!_formKey.currentState.validate()) { if (!_formKey.currentState.validate()) {
setState(() {}); setState(() {});
@ -152,96 +158,23 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
const SizedBox( const SizedBox(
height: 16, height: 16,
), ),
ASubTitle(_subtitle.workingHours),
const SizedBox(height: 8),
Row( Row(
children: [ children: [
Expanded( Expanded(
child: Column( child: AppTimer(
crossAxisAlignment: CrossAxisAlignment.stretch, timer: _formModel.timer,
children: [ onChange: (timer) async {
const ASubTitle("Start of Work"), _formModel.timer = timer;
SizedBox( _formModel.workingHours = (((timer?.durationInSecond ?? 0) / 60) / 60)?.toStringAsFixed(2) ?? "0";
height: 8 * AppStyle.getScaleFactor(context), return true;
), },
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(() {});
},
),
],
), ),
), ),
], ],
), ),
const SizedBox(height: 4), const SizedBox(height: 16),
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,
),
ASubTitle(_subtitle.status), ASubTitle(_subtitle.status),
const SizedBox( const SizedBox(
height: 4, height: 4,
@ -249,8 +182,7 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
GasStatusMenu( GasStatusMenu(
initialValue: _formModel.status, initialValue: _formModel.status,
onSelect: (status) { onSelect: (status) {
if(status==null) if (status == null) return;
return;
_formModel.status = status; _formModel.status = status;
setState(() {}); setState(() {});
}, },

@ -74,7 +74,7 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
_callRequestForWorkOrder = await Provider.of<ServiceRequestsProvider>(context).getCallRequestForWorkOrder(callId: widget.workOrder.callRequest.id.toString()); _callRequestForWorkOrder = await Provider.of<ServiceRequestsProvider>(context).getCallRequestForWorkOrder(callId: widget.workOrder.callRequest.id.toString());
await assetTypesProvider.getTypes(); await assetTypesProvider.getTypes();
_subWorkOrders?.assetType = assetTypesProvider.statuses?.firstWhere( _subWorkOrders?.assetType = assetTypesProvider.statuses?.firstWhere(
(element) => element.value == _callRequestForWorkOrder.assetType, (element) => element.value == _callRequestForWorkOrder?.assetType,
orElse: () => null, orElse: () => null,
); );
setState(() { setState(() {
@ -223,8 +223,7 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
initialValue: _subWorkOrders?.faultDescription, initialValue: _subWorkOrders?.faultDescription,
onSelect: (status) { onSelect: (status) {
_subWorkOrders.faultDescription = status; _subWorkOrders.faultDescription = status;
if(mounted) if (mounted) setState(() {});
setState(() {});
}, },
), ),
], ],
@ -318,11 +317,8 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
_validate = true; _validate = true;
setState(() {}); setState(() {});
if (validate()) { if (validate()) {
if (_subWorkOrders.startofWorkTime == null) { if (_subWorkOrders.timer?.startAt == null || _subWorkOrders.timer?.endAt == null) {
Fluttertoast.showToast(msg: "${subtitle.startDate} required"); Fluttertoast.showToast(msg: "Working hours required");
return;
} else if (_subWorkOrders.endofWorkTime == null) {
Fluttertoast.showToast(msg: "${subtitle.endDate} required");
return; return;
} else if (_subWorkOrders.calllastSituation == null) { } else if (_subWorkOrders.calllastSituation == null) {
Fluttertoast.showToast(msg: "${subtitle.callLastSituation} required"); Fluttertoast.showToast(msg: "${subtitle.callLastSituation} required");

@ -135,8 +135,6 @@ class _SparePartsBottomSheetState extends State<SparePartsBottomSheet> {
return PartItem( return PartItem(
part: part, part: part,
onEdit: (qty) { onEdit: (qty) {
print("sss${spare.qty}");
print(qty);
spare.qty = qty; spare.qty = qty;
}, },
onDelete: (part) { onDelete: (part) {

@ -1,4 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/models/service_request/search_work_order.dart'; import 'package:test_sa/models/service_request/search_work_order.dart';
import 'package:test_sa/models/subtitle.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/localization/localization.dart';
import '../../../controllers/providers/api/status_drop_down/report/service_report_maintenance_situation_provider.dart'; import '../../../controllers/providers/api/status_drop_down/report/service_report_maintenance_situation_provider.dart';
import '../../app_style/sizing.dart'; import '../../widgets/timer/app_timer.dart';
import '../../widgets/date_and_time/time_picker.dart';
import '../../widgets/titles/app_sub_title.dart'; import '../../widgets/titles/app_sub_title.dart';
class WorkOrderDetailsBottomSheet extends StatefulWidget { class WorkOrderDetailsBottomSheet extends StatefulWidget {
@ -78,75 +78,23 @@ class _WorkOrderDetailsBottomSheetState extends State<WorkOrderDetailsBottomShee
}, },
), ),
const SizedBox(height: 8), const SizedBox(height: 8),
ASubTitle(subtitle.workingHours),
const SizedBox(height: 8),
Row( Row(
children: [ children: [
Expanded( Expanded(
child: Column( child: AppTimer(
crossAxisAlignment: CrossAxisAlignment.stretch, timer: _workOrder.timer,
children: [ onChange: (timer) async {
const ASubTitle("Start of Work"), _workOrder.timer = timer;
SizedBox( _workOrder.workingHours = num.tryParse((((timer?.durationInSecond ?? 0) / 60) / 60)?.toStringAsFixed(2) ?? "0");
height: 8 * AppStyle.getScaleFactor(context), return true;
), },
ADateTimePicker(
date: DateTime.tryParse(_workOrder.startofWorkTime ?? ""),
from: DateTime.now().subtract(const Duration(days: 365)),
to: DateTime.now(),
onDateTimePicker: (date) {
_workOrder.startofWorkTime = date?.toIso8601String();
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: DateTime.tryParse(_workOrder.endofWorkTime ?? ""),
from: DateTime.now().subtract(const Duration(days: 365)),
to: DateTime.now(),
onDateTimePicker: (date) {
_workOrder.endofWorkTime = date?.toIso8601String();
setState(() {});
},
),
],
), ),
), ),
], ],
), ),
const SizedBox(height: 8), const SizedBox(height: 16),
ASubTitle(subtitle.workingHours),
const SizedBox(height: 4),
ATextFormField(
textAlign: TextAlign.center,
labelText: _workOrder.startofWorkTime == null
? "0"
: ((DateTime.tryParse(_workOrder.endofWorkTime ?? "")?.difference(DateTime.tryParse(_workOrder.startofWorkTime ?? ""))?.inMinutes ?? 0) / 60)
?.toStringAsFixed(2)
?.toString() ??
"0",
enable: false,
style: Theme.of(context).textTheme.titleMedium,
// validator: (value) => 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),
ATextFormField( ATextFormField(
labelText: "Travel Hours", labelText: "Travel Hours",
initialValue: _workOrder.travelingHours?.toString(), initialValue: _workOrder.travelingHours?.toString(),
@ -206,6 +154,13 @@ class _WorkOrderDetailsBottomSheetState extends State<WorkOrderDetailsBottomShee
AButton( AButton(
text: subtitle.submit, text: subtitle.submit,
onPressed: () async { onPressed: () async {
if (_workOrder?.workingHours == null) {
await Fluttertoast.showToast(msg: "Working Hours Timer Isn't Started");
return;
} else if ((_workOrder?.timer?.stopped ?? false) == false) {
await Fluttertoast.showToast(msg: "Stop The Timer");
return;
}
_formKey.currentState.save(); _formKey.currentState.save();
widget.subWorkOrder.copyFrom(_workOrder); widget.subWorkOrder.copyFrom(_workOrder);
Navigator.pop(context); Navigator.pop(context);

@ -288,73 +288,73 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
), ),
], ],
), ),
if (_userProvider.user?.type == UsersTypes.engineer) // if (_userProvider.user?.type == UsersTypes.engineer)
Column( // Column(
children: [ // children: [
Row( // Row(
children: [ // children: [
Expanded( // Expanded(
child: Column( // child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch, // crossAxisAlignment: CrossAxisAlignment.stretch,
children: [ // children: [
const ASubTitle("Start of Work"), // const ASubTitle("Start of Work"),
SizedBox( // SizedBox(
height: 8 * AppStyle.getScaleFactor(context), // height: 8 * AppStyle.getScaleFactor(context),
), // ),
ADateTimePicker( // ADateTimePicker(
date: _gasRefillProvider.startDate, // date: _gasRefillProvider.startDate,
from: DateTime.now().subtract(const Duration(days: 365)), // from: DateTime.now().subtract(const Duration(days: 365)),
to: DateTime.now().add(const Duration(days: 365)), // to: DateTime.now().add(const Duration(days: 365)),
onDateTimePicker: (date) { // onDateTimePicker: (date) {
_gasRefillProvider.startDate = date; // _gasRefillProvider.startDate = date;
setState(() {}); // setState(() {});
}, // },
), // ),
], // ],
), // ),
), // ),
const SizedBox(width: 8), // const SizedBox(width: 8),
Expanded( // Expanded(
child: Column( // child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch, // crossAxisAlignment: CrossAxisAlignment.stretch,
children: [ // children: [
const ASubTitle("End of Work"), // const ASubTitle("End of Work"),
SizedBox( // SizedBox(
height: 8 * AppStyle.getScaleFactor(context), // height: 8 * AppStyle.getScaleFactor(context),
), // ),
ADateTimePicker( // ADateTimePicker(
date: _gasRefillProvider.endDate, // date: _gasRefillProvider.endDate,
from: DateTime.now().subtract(const Duration(days: 365)), // from: DateTime.now().subtract(const Duration(days: 365)),
to: DateTime.now().add(const Duration(days: 365)), // to: DateTime.now().add(const Duration(days: 365)),
onDateTimePicker: (date) { // onDateTimePicker: (date) {
_gasRefillProvider.endDate = date; // _gasRefillProvider.endDate = date;
setState(() {}); // setState(() {});
}, // },
), // ),
], // ],
), // ),
), // ),
], // ],
), // ),
const SizedBox(height: 8), // const SizedBox(height: 8),
ASubTitle(_subtitle.workingHours), // ASubTitle(_subtitle.workingHours),
const SizedBox(height: 4), // const SizedBox(height: 4),
ATextFormField( // ATextFormField(
initialValue: null, // initialValue: null,
textAlign: TextAlign.center, // textAlign: TextAlign.center,
hintText: _gasRefillProvider.startDate == null // hintText: _gasRefillProvider.startDate == null
? "0" // ? "0"
: ((_gasRefillProvider.endDate?.difference(_gasRefillProvider.startDate)?.inMinutes ?? 0) / 60)?.toStringAsFixed(2)?.toString() ?? "0", // : ((_gasRefillProvider.endDate?.difference(_gasRefillProvider.startDate)?.inMinutes ?? 0) / 60)?.toStringAsFixed(2)?.toString() ?? "0",
enable: false, // enable: false,
style: Theme.of(context).textTheme.subtitle1, // style: Theme.of(context).textTheme.subtitle1,
validator: (value) => Validator.isNumeric(value) ? null : _subtitle.requiredWord, // validator: (value) => Validator.isNumeric(value) ? null : _subtitle.requiredWord,
textInputType: TextInputType.number, // textInputType: TextInputType.number,
onSaved: (value) { // onSaved: (value) {
// _serviceReport.workHours = value; // // _serviceReport.workHours = value;
}, // },
), // ),
], // ],
), // ),
if (widget.gasRefillModel == null) if (widget.gasRefillModel == null)
Column( Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,

@ -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_back_button.dart';
import 'package:test_sa/views/widgets/buttons/app_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/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/e_signature/e_signature.dart';
import 'package:test_sa/views/widgets/equipment/auto_complete_devices_field.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/images/mini_one_image_picker.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.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/auto_complete_parts_field.dart';
import 'package:test_sa/views/widgets/parts/part_item.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_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_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_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 'package:test_sa/views/widgets/titles/app_sub_title.dart';
import '../../../../../controllers/providers/api/status_drop_down/report/service_types_provider.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_fault_description.dart';
import '../../../../widgets/status/report/service_report_repair_location.dart'; import '../../../../widgets/status/report/service_report_repair_location.dart';
import '../../../../widgets/timer/app_timer.dart';
class CreateServiceReport extends StatefulWidget { class CreateServiceReport extends StatefulWidget {
static final String id = "/create-service-report"; static final String id = "/create-service-report";
@ -331,7 +328,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
// ASubTitle(_subtitle.reportStatus), // ASubTitle(_subtitle.reportStatus),
ASubTitle("Equipment Status"), ASubTitle("Equipment Status"),
_validate && _serviceReport.equipmentStatus == null _validate && _serviceReport.equipmentStatus == null
? ASubTitle( ? ASubTitle(
@ -418,71 +415,23 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
SizedBox( SizedBox(
height: 8 * AppStyle.getScaleFactor(context), height: 8 * AppStyle.getScaleFactor(context),
), ),
ASubTitle(_subtitle.workingHours),
const SizedBox(height: 8),
Row( Row(
children: [ children: [
Expanded( Expanded(
child: Column( child: AppTimer(
crossAxisAlignment: CrossAxisAlignment.stretch, timer: _serviceReport.timer,
children: [ onChange: (timer) async {
const ASubTitle("Start of Work"), _serviceReport.timer = timer;
SizedBox( _serviceReport.workingHours = num.tryParse((((timer?.durationInSecond ?? 0) / 60) / 60)?.toStringAsFixed(2) ?? "0");
height: 8 * AppStyle.getScaleFactor(context), return true;
), },
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(() {});
},
),
],
), ),
), ),
], ],
), ),
const SizedBox(height: 8), const SizedBox(height: 16),
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,
),
// device sn // device sn
Visibility( Visibility(
visible: widget.request.deviceSerialNumber == null, visible: widget.request.deviceSerialNumber == null,
@ -636,7 +585,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
enable: false, enable: false,
hintText: _serviceReport.faultDescription?.workPerformed ?? "", hintText: _serviceReport.faultDescription?.workPerformed ?? "",
controller: _workPreformedController, controller: _workPreformedController,
style: Theme.of(context).textTheme.subtitle1, style: Theme.of(context).textTheme.titleMedium,
validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord,
textInputType: TextInputType.multiline, textInputType: TextInputType.multiline,
onSaved: (value) { onSaved: (value) {
@ -701,7 +650,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
), ),
ATextFormField( ATextFormField(
initialValue: _serviceReport?.travelingExpense?.toString(), initialValue: _serviceReport?.travelingExpense?.toString(),
hintText: _subtitle.travelingExpense, hintText: "i.e 3, 3.5, 4",
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: Theme.of(context).textTheme.titleMedium, style: Theme.of(context).textTheme.titleMedium,
textInputType: TextInputType.number, textInputType: TextInputType.number,
@ -929,9 +878,9 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
), ),
Column( Column(
children: List.generate(_serviceReport.parts.length, (index) { children: List.generate(_serviceReport.parts.length, (index) {
Part _part = _serviceReport.parts[index]; Part part = _serviceReport.parts[index];
return PartItem( return PartItem(
part: _part, part: part,
onDelete: (part) { onDelete: (part) {
_serviceReport.parts.remove(part); _serviceReport.parts.remove(part);
setState(() {}); setState(() {});

@ -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_back_button.dart';
import 'package:test_sa/views/widgets/buttons/app_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/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/e_signature/e_signature.dart';
import 'package:test_sa/views/widgets/equipment/auto_complete_devices_field.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/images/mini_one_image_picker.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.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/auto_complete_parts_field.dart';
import 'package:test_sa/views/widgets/parts/part_item.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_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_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_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_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_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/timer/app_timer.dart';
import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart';
@ -617,71 +612,25 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
// }, // },
// ), // ),
// const SizedBox(height: 8,), // const SizedBox(height: 8,),
const SizedBox(height: 8),
ASubTitle(_subtitle.workingHours),
const SizedBox(height: 8),
Row( Row(
children: [ children: [
Expanded( Expanded(
child: Column( child: AppTimer(
crossAxisAlignment: CrossAxisAlignment.stretch, timer: _serviceReport.timer,
children: [ enabled: false,
const ASubTitle("Start of Work"), // onChange: (timer) async {
SizedBox( // _serviceReport.timer = timer;
height: 8 * AppStyle.getScaleFactor(context), // _serviceReport.workingHours = num.tryParse((((timer?.durationInSecond ?? 0) / 60) / 60)?.toStringAsFixed(2) ?? "0");
), // return true;
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(() {});
},
),
],
), ),
), ),
], ],
), ),
const SizedBox(height: 8), const SizedBox(height: 16),
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,
),
if (_showCommentField) if (_showCommentField)
const SizedBox( const SizedBox(
height: 8, height: 8,
@ -711,8 +660,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
onSelect: (status) { onSelect: (status) {
print("faluttt:${status?.toJson()}"); print("faluttt:${status?.toJson()}");
_serviceReport.faultDescription = status; _serviceReport.faultDescription = status;
if(mounted) if (mounted) setState(() {});
setState(() {});
}, },
), ),
const SizedBox(height: 8), const SizedBox(height: 8),
@ -1058,6 +1006,13 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
AButton( AButton(
text: _subtitle.update, text: _subtitle.update,
onPressed: () async { 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; _validate = true;
print("jere1245"); print("jere1245");
// if (!_formKey.currentState.validate()) { // if (!_formKey.currentState.validate()) {
@ -1069,7 +1024,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
// setState(() {}); // setState(() {});
// return; // return;
// } // }
// print("jere14"); // print("jere14");
_formKey.currentState.save(); _formKey.currentState.save();
_isLoading = true; _isLoading = true;

@ -39,7 +39,11 @@ class _PartItemState extends State<PartItem> {
iconData: Icons.add, iconData: Icons.add,
color: Theme.of(context).primaryColor, color: Theme.of(context).primaryColor,
onPressed: () { onPressed: () {
widget.onEdit(++widget.part.quantity); if (widget.onEdit == null) {
++widget.part.quantity;
} else {
widget.onEdit(++widget.part.quantity);
}
setState(() {}); setState(() {});
}, },
), ),
@ -49,7 +53,11 @@ class _PartItemState extends State<PartItem> {
onPressed: widget.part.quantity < 2 onPressed: widget.part.quantity < 2
? null ? null
: () { : () {
widget.onEdit(--widget.part.quantity); if (widget.onEdit == null) {
--widget.part.quantity;
} else {
widget.onEdit(--widget.part.quantity);
}
setState(() {}); setState(() {});
}, },
), ),

@ -9,11 +9,13 @@ class AppTimer extends StatefulWidget {
final TimerModel timer; final TimerModel timer;
final Future<bool> Function(TimerModel) onChange; final Future<bool> Function(TimerModel) onChange;
final TextStyle style; final TextStyle style;
final bool enabled;
const AppTimer({ const AppTimer({
Key key, Key key,
this.timer, this.timer,
this.onChange, this.onChange,
this.style, this.style,
this.enabled = true,
}) : super(key: key); }) : super(key: key);
@override @override
@ -32,7 +34,7 @@ class _AppTimerState extends State<AppTimer> {
_startTimer() async { _startTimer() async {
if (!_running) { if (!_running) {
final time = DateTime.now(); 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; if (!result) return;
_running = true; _running = true;
@ -52,7 +54,7 @@ class _AppTimerState extends State<AppTimer> {
_stopTimer() async { _stopTimer() async {
final time = DateTime.now(); final time = DateTime.now();
final tempStartAt = _startAt.add(Duration(seconds: _delay)); 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; if (!result) return;
_running = false; _running = false;
_endAt = time; _endAt = time;
@ -99,7 +101,7 @@ class _AppTimerState extends State<AppTimer> {
child: ElevatedButton( child: ElevatedButton(
style: ElevatedButton.styleFrom( 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), 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 child: _loading
? const SizedBox.square( ? const SizedBox.square(
dimension: 18, dimension: 18,
@ -108,7 +110,7 @@ class _AppTimerState extends State<AppTimer> {
)) ))
: Row( : Row(
children: [ children: [
Icon(_running ? Icons.pause : Icons.play_arrow), if (widget.enabled) Icon(_running ? Icons.pause : Icons.play_arrow),
Expanded( Expanded(
child: Center( child: Center(
child: ValueListenableBuilder<String>( child: ValueListenableBuilder<String>(
@ -116,7 +118,7 @@ class _AppTimerState extends State<AppTimer> {
builder: (context, value, _) { builder: (context, value, _) {
return Text( return Text(
value, value,
style: widget.style, style: widget.enabled ? widget.style : widget.style?.copyWith(color: Colors.black54),
); );
}), }),
), ),

Loading…
Cancel
Save