You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
148 lines
5.7 KiB
Dart
148 lines
5.7 KiB
Dart
import 'dart:convert';
|
|
|
|
import 'device/device.dart';
|
|
import 'lookup.dart';
|
|
import 'part.dart';
|
|
import 'timer_model.dart';
|
|
|
|
class ServiceReport {
|
|
String? id;
|
|
String? operatingHours;
|
|
DateTime? visitDate;
|
|
DateTime? endDate;
|
|
Lookup? serviceType;
|
|
Lookup? callLastSituation;
|
|
Lookup? status;
|
|
Lookup? type;
|
|
Lookup? reason;
|
|
String? faultDescription;
|
|
String? workPreformed;
|
|
String? travelingHours;
|
|
String? invoiceNumber;
|
|
String? invoiceCode;
|
|
List<Part>? parts;
|
|
String? image;
|
|
Device? device;
|
|
String? quantity;
|
|
String? jobSheetNumber;
|
|
TimerModel? timer;
|
|
|
|
ServiceReport({
|
|
this.id,
|
|
this.visitDate,
|
|
this.endDate,
|
|
this.serviceType,
|
|
this.status,
|
|
this.type,
|
|
this.faultDescription,
|
|
this.travelingHours,
|
|
this.parts,
|
|
this.workPreformed,
|
|
this.reason,
|
|
this.operatingHours,
|
|
this.callLastSituation,
|
|
this.jobSheetNumber,
|
|
this.image,
|
|
this.device,
|
|
this.invoiceCode,
|
|
this.invoiceNumber,
|
|
this.quantity = "1",
|
|
this.timer,
|
|
});
|
|
|
|
Map<String,String> toMap(){
|
|
Map<String,String> _map = {};
|
|
if(id != null) _map["id"] = id??"";
|
|
if(visitDate != null) _map["visit_date"] = ((visitDate?.millisecondsSinceEpoch??0) ~/ 1000).toString();
|
|
if(serviceType != null) _map["service_type"] = serviceType?.id.toString()??"";
|
|
if(status != null) _map["status"] = status?.id.toString()??"";
|
|
if(type != null) _map["service_report_type"] = type?.id.toString()??"";
|
|
if(faultDescription != null && (faultDescription?.isNotEmpty??false)) _map["fault_description"] = faultDescription??"";
|
|
//if(workHours != null && workHours.isNotEmpty) _map["working_hours"] = workHours;
|
|
if(timer != null){
|
|
_map["start_time"] = ((timer?.startAt?.millisecondsSinceEpoch??0) / 1000).toStringAsFixed(0);
|
|
_map["end_time"] = ((timer?.endAt ?? DateTime.now()).millisecondsSinceEpoch / 1000).toStringAsFixed(0);
|
|
_map["working_hours"] = ((timer?.durationInSecond??0) / 60 / 60).toStringAsFixed(5);
|
|
}
|
|
if(travelingHours != null && (travelingHours?.isNotEmpty??false)) _map["traveling_hours"] = travelingHours??"";
|
|
if(workPreformed != null && (workPreformed?.isNotEmpty??false)) _map["work_performed"] = workPreformed??"";
|
|
if(jobSheetNumber != null && (jobSheetNumber?.isNotEmpty??false)) _map["job_sheet_no"] = jobSheetNumber??"";
|
|
if(parts != null && (parts?.isNotEmpty??false)){
|
|
Map<String,int> _partsMap = {};
|
|
parts?.forEach((part) {
|
|
if((part.id?.isNotEmpty??false)) {
|
|
_partsMap[part?.id??""] = part.quantity;
|
|
}
|
|
});
|
|
_map["parts"] = json.encode(_partsMap);
|
|
}
|
|
if(device?.id != null && device?.id != null) _map["eq_id"] = device?.id??"";
|
|
if(quantity != null && (quantity?.isNotEmpty??false)) _map["qty"] = quantity??"";
|
|
if(endDate != null) _map["end_date"] = ((endDate?.millisecondsSinceEpoch??0) ~/ 1000).toString();
|
|
if(reason != null) _map["reasons"] = reason?.id.toString()??"";
|
|
if(operatingHours != null && (operatingHours?.isNotEmpty??false)) _map["operation_hours"] = operatingHours??"";
|
|
if(callLastSituation != null) _map["call_last_situtation"] = callLastSituation?.id.toString()??"";
|
|
if(image != null) _map["image"] = image??"";
|
|
if(invoiceCode != null) _map["invoice_no"] = invoiceCode??"";
|
|
if(invoiceNumber != null) _map["invoice_code"] = invoiceNumber??"";
|
|
return _map;
|
|
}
|
|
|
|
bool validate(){
|
|
if(visitDate == null) return false;
|
|
if(serviceType == null) return false;
|
|
if(status == null) return false;
|
|
if(type == null) return false;
|
|
if(callLastSituation == null) return false;
|
|
if(callLastSituation?.id == 12){
|
|
if(invoiceCode != null || invoiceCode?.isEmpty == true) return false;
|
|
if(invoiceNumber != null || invoiceNumber?.isEmpty== true ) return false;
|
|
}
|
|
if(parts == null) return false;
|
|
//if(endDate == null) return false;
|
|
//if(reason == null) return false;
|
|
if((device?.id == null ||(device?.id?.isEmpty??false)) && type?.id != 1) return false;
|
|
//if(quantity == null || quantity.isEmpty) return false;
|
|
//if(image == null) return false;
|
|
return true;
|
|
}
|
|
|
|
factory ServiceReport.fromJson(Map<String,dynamic> parsedJson,String id){
|
|
List<Part> _parts = [];
|
|
if(parsedJson["parts"] != null){
|
|
if(parsedJson["parts"][0]["id"] != null){
|
|
List partsList = parsedJson["parts"];
|
|
_parts = partsList.map((e) => Part.fromJson(e)).toList();
|
|
}
|
|
|
|
}
|
|
return ServiceReport(
|
|
id: id,
|
|
serviceType: Lookup.fromJson(parsedJson["service_type"]),
|
|
callLastSituation: Lookup.fromJson(parsedJson["call_last_situtation"]),
|
|
reason: Lookup.fromJson(parsedJson["reasons"]),
|
|
status: Lookup.fromJson(parsedJson["service_report_status"]),
|
|
type: Lookup.fromJson(parsedJson["service_report_type"]),
|
|
faultDescription: parsedJson["fault_description"],
|
|
endDate:getDate(parsedJson["end_date"]),
|
|
invoiceCode: parsedJson["invoice_code"],
|
|
invoiceNumber: parsedJson["invoice_no"],
|
|
jobSheetNumber: parsedJson["job_sheet_no"],
|
|
operatingHours: parsedJson["operation_hours"],
|
|
parts: _parts,
|
|
quantity: parsedJson["nid"],
|
|
travelingHours: parsedJson["traveling_hours"],
|
|
visitDate: getDate(parsedJson["visit_date"]),
|
|
//workHours: parsedJson["working_hours"],
|
|
timer: TimerModel(
|
|
durationInSecond: (int.tryParse(parsedJson["working_hours"] ?? "") ?? 0) * 60 *60),
|
|
workPreformed: parsedJson["work_performed"],
|
|
device: parsedJson["eq_nid"] == null ? null : Device(id: parsedJson["eq_nid"],serialNumber: parsedJson["eq_serial"])
|
|
);
|
|
}
|
|
|
|
static getDate(String date){
|
|
return date == null || date.isEmpty
|
|
? null : DateTime.fromMillisecondsSinceEpoch((int.tryParse(date)??0) * 1000);
|
|
}
|
|
} |