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.
cloudsolutions-atoms/lib/service_request_latest/request_detail_provider.dart

451 lines
16 KiB
Dart

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<WorkOrderDetail> 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<CommonResponseModel> 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<CommonResponseModel> 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<CommonResponseModel> 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<CommonResponseModel> 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<CommonResponseModel> 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<CommonResponseModel> 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<CommonResponseModel> 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<int> updateRequest({@required User user, @required ServiceRequest request}) async {
isLoading = true;
notifyListeners();
Map<String, dynamic> serviceRequest = await getWorkOrderById(id: request.id) ?? "";
final List callSiteContacts = (serviceRequest['callSiteContactPerson'] as List);
final Map<String, dynamic> 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<int> 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<SuppEngineerWorkOrders> 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();
}
}