import 'dart:convert'; import 'dart:developer'; import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:http/http.dart'; import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/models/helper_data_models/workorder/fix_remotely_model.dart'; import 'package:test_sa/models/helper_data_models/workorder/need_visit_model.dart'; import 'package:test_sa/models/helper_data_models/workorder/nurse_action_model.dart'; import 'package:test_sa/models/new_models/dashboard_detail.dart'; import 'package:test_sa/models/new_models/workOrderDetail.dart'; import 'package:test_sa/models/service_request/service_report.dart'; import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/service_request/spare_parts.dart'; import 'package:test_sa/models/service_request/supp_engineer_work_orders.dart'; import 'package:test_sa/models/service_request/supplier_engineer_model.dart'; import '../../../models/service_request/wo_call_request.dart'; import '../../../models/user.dart'; import '../../../new_views/common_widgets/app_lazy_loading.dart'; class RequestDetailProvider extends ChangeNotifier { final pageItemNumber = 10; void reset() { nextPage = true; stateCode = null; } bool _isLoading = false; bool get isLoading => _isLoading; set isLoading(bool value) { _isLoading = value; notifyListeners(); } WorkOrderDetail _currentWorkOrder; FixRemotely _fixRemotelyModel; NeedVisit _needVisitModel; NurseActionModel _nurseActionModel; NurseActionModel get nurseActionModel => _nurseActionModel; set nurseActionModel(NurseActionModel value) { _nurseActionModel = value; notifyListeners(); } NeedVisit get needVisitModel => _needVisitModel; set needVisitModel(NeedVisit value) { _needVisitModel = value; notifyListeners(); } FixRemotely get fixRemotelyModel => _fixRemotelyModel; set fixRemotelyModel(FixRemotely value) { _fixRemotelyModel = value; notifyListeners(); } WorkOrderDetail get currentWorkOrder => _currentWorkOrder; set currentWorkOrder(WorkOrderDetail value) { _currentWorkOrder = value; notifyListeners(); } int stateCode; // true if there is next page in product list and false if not bool nextPage = true; TimeOfDay _selectedTime ; TimeOfDay get selectedTime => _selectedTime; set selectedTime(TimeOfDay value) { _selectedTime = value; notifyListeners(); } // list of user requests SparePartsWorkOrders _initialSelectedSparePart = SparePartsWorkOrders(); int _selectedListIndex = 0; int get selectedListIndex => _selectedListIndex; set selectedListIndex(int value) { _selectedListIndex = value; notifyListeners(); } //getWorkOrderById...... Future getWorkOrderById({@required String id}) async { try { isLoading = true; final response = await ApiManager.instance.get(URLs.getWorkOrderByIdUrl+"?workOrderId=$id"); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body)); notifyListeners(); isLoading = false; return currentWorkOrder; } isLoading= false; notifyListeners(); return null; } catch (e) { log("getSubWorkOrderDetails [error] : $e"); isLoading = false; notifyListeners(); return null; } } //engineerAcceptWorkOrder...... Future engineerAcceptWorkOrder({@required String id}) async { try { final body = { "workOrderId": id, }; isLoading = true; final response = await ApiManager.instance.post(URLs.engineerAcceptUrl,body: body); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { CommonResponseModel commonResponseModel = CommonResponseModel.fromJson(json.decode(response.body)); print('response of Engineer accept workorder ${commonResponseModel.toJson()}'); notifyListeners(); isLoading = false; return commonResponseModel; } isLoading= false; notifyListeners(); return CommonResponseModel(); } catch (e) { log("engineer accept [error] : $e"); isLoading = false; notifyListeners(); return CommonResponseModel(); } } //engineerRejectWorkOrder...... Future engineerRejectWorkOrder({@required String id,String feedBack}) async { try { final body = { "workOrderId": id, "feedback": feedBack, }; isLoading = true; final response = await ApiManager.instance.post(URLs.engineerRejectUrl,body: body); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { CommonResponseModel commonResponseModel = CommonResponseModel.fromJson(json.decode(response.body)); print('response of Engineer reject workorder ${commonResponseModel.toJson()}'); notifyListeners(); isLoading = false; return commonResponseModel; } isLoading= false; notifyListeners(); return CommonResponseModel(); } catch (e) { log("engineer accept [error] : $e"); isLoading = false; notifyListeners(); return CommonResponseModel(); } } //engineerFixRemotelyWorkOrder...... Future engineerFixRemotely() async { try { isLoading = true; final response = await ApiManager.instance.post(URLs.engineerFixRemotlyUrl,body: fixRemotelyModel.toJson()); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { CommonResponseModel commonResponseModel = CommonResponseModel.fromJson(json.decode(response.body)); print('response of Engineer fixremotely workorder ${commonResponseModel.toJson()}'); notifyListeners(); isLoading = false; return commonResponseModel; } isLoading= false; notifyListeners(); return CommonResponseModel(); } catch (e) { log("engineer accept [error] : $e"); isLoading = false; notifyListeners(); return CommonResponseModel(); } } //engineerNeedAVisitWorkOrder...... Future engineerNeedVisit() async { try { isLoading = true; final response = await ApiManager.instance.post(URLs.engineerNeedVisitUrl,body: needVisitModel.toJson()); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { CommonResponseModel commonResponseModel = CommonResponseModel.fromJson(json.decode(response.body)); print('response of Engineer fixremotely workorder ${commonResponseModel.toJson()}'); notifyListeners(); isLoading = false; return commonResponseModel; } isLoading= false; notifyListeners(); return CommonResponseModel(); } catch (e) { log("engineer accept [error] : $e"); isLoading = false; notifyListeners(); return CommonResponseModel(); } } //assignEngineerToWorkOrder...... Future assignEngineerWorkOrder({@required String workOrderId,@required String engineerId}) async { try { final body = { "workOrderId": workOrderId, "assignedEngineerId": engineerId, }; isLoading = true; final response = await ApiManager.instance.post(URLs.assignEngineerToWorkOrderUrl,body: body); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { CommonResponseModel commonResponseModel = CommonResponseModel.fromJson(json.decode(response.body)); print('response of Engineer assignEngineer workorder ${commonResponseModel.toJson()}'); notifyListeners(); isLoading = false; return commonResponseModel; } isLoading= false; notifyListeners(); return CommonResponseModel(); } catch (e) { log("engineer accept [error] : $e"); isLoading = false; notifyListeners(); return CommonResponseModel(); } } //Nurse confirm reopen Future nurseReopen() async { try { isLoading = true; final response = await ApiManager.instance.post(URLs.nurseConfirmReopenUrl,body: nurseActionModel.toJson()); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { CommonResponseModel commonResponseModel = CommonResponseModel.fromJson(json.decode(response.body)); print('response of nurse confirmreopen workorder ${commonResponseModel.toJson()}'); notifyListeners(); isLoading = false; return commonResponseModel; } isLoading= false; notifyListeners(); return CommonResponseModel(); } catch (e) { log("engineer accept [error] : $e"); isLoading = false; notifyListeners(); return CommonResponseModel(); } } //Nurse confirm close Future nurseClose() async { try { isLoading = true; final response = await ApiManager.instance.post(URLs.nurseConfirmCloseUrl,body: nurseActionModel.toJson()); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { CommonResponseModel commonResponseModel = CommonResponseModel.fromJson(json.decode(response.body)); print('response of nurse confirmreopen workorder ${commonResponseModel.toJson()}'); notifyListeners(); isLoading = false; return commonResponseModel; } isLoading= false; notifyListeners(); return CommonResponseModel(); } catch (e) { log("engineer accept [error] : $e"); isLoading = false; notifyListeners(); return CommonResponseModel(); } } Future updateRequest({@required User user, @required ServiceRequest request}) async { isLoading = true; notifyListeners(); Map serviceRequest = await getWorkOrderById(id: request.id) ?? ""; final List callSiteContacts = (serviceRequest['callSiteContactPerson'] as List); final Map callSiteContactPerson = callSiteContacts.isEmpty ? {} : callSiteContacts[0]; Response response; try { if ((request.audio ?? "").isNotEmpty) { request.audio = request.audio.substring(request.audio.indexOf("=") + 1, request.audio.length); } } catch (ex) {} var body = { "id": request.id, "callNo": serviceRequest['callNo'], "callCreatedBy": serviceRequest['callCreatedBy'], "requestedDate": request.date ?? "", "requestedTime": request.date ?? "", "priority": request.priority?.toJson(), "defectType": request.defectType?.toJson(), "typeofRequest": request.type?.toJson(), "requestedThrough": request.requestedThrough?.toJson(), "voiceNote": request.audio, "assets": request.deviceId == null ? [] : [request.deviceId], "attachmentsCallRequest": (request.devicePhotos?.isNotEmpty ?? false) ? request.devicePhotos?.map((e) => {"name": e.getFileName})?.toList() : [], "assignedEmployee": { "id": request.engineerId, "name": request.engineerName, }, "callSiteContactPerson": [ { "id": callSiteContactPerson['id'] ?? 0, "employeeCode": callSiteContactPerson['employeeCode'], "name": callSiteContactPerson['name'] ?? user.userName, "telephone": callSiteContactPerson['telephone'] ?? user.phoneNumber, "job": callSiteContactPerson['job'], "email": callSiteContactPerson['email'] ?? user.email, "land": callSiteContactPerson['land'], "contactUserId": user.userID, }, ], "callComments": request.callComments, "noofFollowup": 0, "status": request.statusId == null ? null : { "id": request.statusId, "name": request.statusLabel, "value": request.statusValue, }, "callLastSituation": null, "firstAction": request.firstAction?.toJson(), "loanAvailablity": request.loanAvailability?.toJson(), "comments": request.comments, "firstActionDate": request.visitDate, "visitDate": request.visitDate, "startDate": request.startDate, "endDate": request.endDate, "workingHours": request.workingHours, "callReview": null, "reviewComment": null, //"reviewComment": request.reviewComment, }; try { response = await ApiManager.instance.put( URLs.updateRequestDate, body: body, ); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { // request.engineerName = employee.name; notifyListeners(); } isLoading = false; notifyListeners(); return response.statusCode; } catch (error) { isLoading = false; notifyListeners(); return -1; } } Future createServiceReport(BuildContext context, {@required ServiceReport report, @required User user, @required ServiceRequest request}) async { Response response; try { showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); final body = report.toJson(); final callRequest = CallRequest(id: num.tryParse(request?.id ?? "")).toJson(); final contactPerson = [ { "id": 0, // "employeeCode": "", "name": user.userName, "telephone": user.phoneNumber, // "job": "", "email": user.email, // "land": "", "contactUserId": user.userID, } ]; body.update("contactPersonWorkOrders", (value) => contactPerson, ifAbsent: () => contactPerson); body.update("callRequest", (value) => callRequest, ifAbsent: () => callRequest); response = await ApiManager.instance.post(URLs.createServiceReport, body: body); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { reset(); notifyListeners(); Fluttertoast.showToast(msg: context.translation.successfulRequestMessage); Navigator.of(context).pop(); } else { Fluttertoast.showToast(msg: "${context.translation.failedToCompleteRequest}: ${json.decode(response.body)['message']}"); } Navigator.pop(context); return response.statusCode; } catch (error) { Navigator.pop(context); print(error); return -1; } } Future addSupplierEngineer(SupplierEngineer supplierEngineer) async { isLoading = true; notifyListeners(); Response response; SuppEngineerWorkOrders res; try { response = await ApiManager.instance.post(URLs.addSupplierEngineer, body: supplierEngineer.toJson()); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { res = SuppEngineerWorkOrders.fromJson(json.decode(response.body)["data"]); } isLoading = false; notifyListeners(); return res; } catch (error) { isLoading = false; notifyListeners(); return res; } } SparePartsWorkOrders get initialSelectedSparePart => _initialSelectedSparePart; set initialSelectedSparePart(SparePartsWorkOrders value) { _initialSelectedSparePart = value; notifyListeners(); } }