import 'dart:convert'; import 'package:test_sa/api/api_client.dart'; import 'package:test_sa/api/user_api_client.dart'; import 'package:test_sa/models/issue.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/service_report.dart'; import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/service_request/service_request_search.dart'; import 'package:test_sa/models/timer_model.dart'; import '../controllers/api_routes/urls.dart'; class ServiceRequestApiClient { static final ServiceRequestApiClient _instance = ServiceRequestApiClient._internal(); final List serviceRequests = []; ServiceRequestApiClient._internal(); factory ServiceRequestApiClient() => _instance; /// ### The result will be added to [serviceRequests] Future createRequest(ServiceRequest serviceRequest) async { final user = UserApiClient().user; await ApiClient().postJsonForObject( (json) { // ServiceRequest.fromJson(json.decode(utf8.decode(response.bodyBytes))[0]) serviceRequests.insert(0, ServiceRequest.fromJson(json[0])); }, '${URLs.host1}${URLs.createRequest}', { "uid": user?.id, "token": user?.token ?? "", "sn_id": serviceRequest.deviceId ?? "", "date": (DateTime.now().millisecondsSinceEpoch).toString(), "client": user?.hospital?.id ?? '', "complaint": serviceRequest.maintenanceIssue, "image": json.encode(serviceRequest.devicePhotos), "priority": (serviceRequest.priority?.id).toString(), "defect_types": (serviceRequest.defectType?.id).toString(), "audio": serviceRequest.audio, }, ); } /// Get Service Requests and Fill [serviceRequests] Future> getRequests({pageItemNumber, ServiceRequestSearch? search}) async { final user = UserApiClient().user; final response = await ApiClient().getJsonForResponse( '${URLs.host1}${URLs.getServiceRequests}', headers: {"Content-Type": "application/json; charset=utf-8"}, queryParameters: { 'uid': user?.id, if (user?.hospital?.id != null) 'client_nid': user?.hospital?.id, 'token': user?.token, 'page': '${(serviceRequests.length) ~/ pageItemNumber}', if (search != null) ...search.queryParameters(), }, ); List requestsListJson = json.decode(utf8.decode(response.bodyBytes)); List serviceRequestsPage = requestsListJson.map((request) => ServiceRequest.fromJson(request)).toList(); serviceRequests.addAll(serviceRequestsPage); return serviceRequestsPage; } Future getServiceById(String? requestId) async { final user = UserApiClient().user; final response = await ApiClient().getJsonForResponse( '${URLs.host1}${URLs.getSingleServiceRequest}', queryParameters: {'call_nid': requestId, 'uid': user?.id, 'token': user?.token}, ); // If the call to the server was successful, parse the JSON. List jsonList = json.decode(utf8.decode(response.bodyBytes)); List requests = jsonList.map((i) => ServiceRequest.fromJson(i)).toList(); return requests[0]; } Future createIssueReport(Issue issue) async { final user = UserApiClient().user; Map body = issue.toMap(); body["uid"] = user?.id ?? ""; body["token"] = user?.token ?? ""; await ApiClient().postJsonForResponse('${URLs.host1}${URLs.createReport}', body); } Future updateDate({String? newDate, Lookup? employee, ServiceRequest? request}) async { final user = UserApiClient().user; Map body = {}; body["uid"] = user?.id ?? ''; body["token"] = user?.token ?? ''; body["nid"] = request?.id ?? ''; body["date"] = newDate ?? ''; body["ass_emp"] = employee?.id?.toString() ?? ''; await ApiClient().postJsonForResponse('${URLs.host1}${URLs.updateRequestDate}', body); request?.engineerName = employee?.label; } Future createServiceReport({required ServiceReport? report, required ServiceRequest? request}) async { final user = UserApiClient().user; Map? body = report?.toMap(); body?["uid"] = user?.id ?? ""; body?["token"] = user?.token ?? ""; body?["job_id"] = request?.id ?? ''; await ApiClient().postJsonForResponse('${URLs.host1}${URLs.createServiceReport}', body); } Future createDuplicatedReport({required ServiceRequest request}) async { final user = UserApiClient().user; await ApiClient().getJsonForResponse( '${URLs.host1}${URLs.createDuplicatedReport}', queryParameters: {'nid': request.id, 'uid': user?.id, 'token': user?.token}, ); } Future updateServiceReport({required ServiceReport report, required ServiceRequest request}) async { final user = UserApiClient().user; Map body = report.toMap(); body["uid"] = user?.id ?? ""; body["token"] = user?.token ?? ""; body["job_id"] = request.id ?? ''; body["report_id"] = request.reportID ?? ''; await ApiClient().postJsonForResponse('${URLs.host1}${URLs.updateServiceReport}', body); } Future updateServiceReportTimer({required TimerModel timer, required ServiceRequest request}) async { final user = UserApiClient().user; Map body = {}; body["uid"] = user?.id ?? ""; body["token"] = user?.token ?? ""; body["job_id"] = request.id ?? ''; body["start_time"] = ((timer.startAt?.millisecondsSinceEpoch ?? 0) / 1000).toStringAsFixed(0); body["end_time"] = ((timer.endAt?.millisecondsSinceEpoch ?? 0) / 1000).toStringAsFixed(0); body["working_hours"] = ((timer.durationInSecond ?? 0) / 60 / 60).toStringAsFixed(5); body["report_id"] = request.reportID ?? ''; await ApiClient().postJsonForResponse('${URLs.host1}${URLs.updateServiceReport}', body); } Future getSingleServiceReport({required String reportId}) async { final user = UserApiClient().user; final response = await ApiClient().getJsonForResponse( '${URLs.host1}${URLs.getServiceReport}', queryParameters: {'report_id': reportId, 'uid': user?.id, 'token': user?.token}, ); return ServiceReport.fromJson(json.decode(utf8.decode(response.bodyBytes)), reportId); } }