From 59ca4277a9fc2b8290edcba9c6e6890c1b5a86ae Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Sun, 4 Jun 2023 14:13:49 +0300 Subject: [PATCH 01/13] Enhancements --- .../pages/user/requests/create_request.dart | 8 +++-- .../report/create_service_report.dart | 31 +++++++++++-------- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/lib/views/pages/user/requests/create_request.dart b/lib/views/pages/user/requests/create_request.dart index fb676de4..99ff8077 100644 --- a/lib/views/pages/user/requests/create_request.dart +++ b/lib/views/pages/user/requests/create_request.dart @@ -53,6 +53,7 @@ class CreateRequestPageState extends State { ServiceRequest _serviceRequest; final List _deviceImages = []; bool _isLoading = false; + bool _showDatePicker = false; Device _device; Subtitle _subtitle; final GlobalKey _formKey = GlobalKey(); @@ -215,11 +216,12 @@ class CreateRequestPageState extends State { onSelect: (status) { _dateTime = null; _serviceRequest.firstAction = status; + _showDatePicker = _serviceRequest.firstAction != null && _serviceRequest.firstAction.name == "Need a visit"; _serviceRequestsProvider.notifyListeners(); }, ), - if (_serviceRequest.firstAction != null) 12.height, - if (_serviceRequest.firstAction != null) + if (_showDatePicker) 12.height, + if (_showDatePicker) ADatePicker( date: _dateTime, from: DateTime.now(), @@ -288,7 +290,7 @@ class CreateRequestPageState extends State { Fluttertoast.showToast(msg: _subtitle.pickDevice); return; } - if (_serviceRequest.firstAction != null && _dateTime == null) { + if (_serviceRequest.firstAction != null && _serviceRequest.firstAction.name == "Need a visit" && _dateTime == null) { Fluttertoast.showToast(msg: _subtitle.noDateFound); return; } diff --git a/lib/views/pages/user/requests/report/create_service_report.dart b/lib/views/pages/user/requests/report/create_service_report.dart index b2c6cbc2..eeb512c7 100644 --- a/lib/views/pages/user/requests/report/create_service_report.dart +++ b/lib/views/pages/user/requests/report/create_service_report.dart @@ -55,6 +55,7 @@ class _CreateServiceReportState extends State with TickerPr bool _validate = false; ServiceReport _serviceReport; bool _isLoading = false; + bool _showCommentField = false; Subtitle _subtitle; File _image; @@ -282,6 +283,8 @@ class _CreateServiceReportState extends State with TickerPr request: widget.request, onSelect: (status) { _serviceReport.status = status; + _showCommentField = _serviceReport.status?.name == "Resolved"; + setState(() {}); }, ), ], @@ -328,6 +331,21 @@ class _CreateServiceReportState extends State with TickerPr ), ], ), + if (_showCommentField) + const SizedBox( + height: 8, + ), + if (_showCommentField) + ATextFormField( + initialValue: _serviceReport?.comment, + hintText: _subtitle.comment, + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.titleMedium, + textInputType: TextInputType.multiline, + onSaved: (value) { + _serviceReport.comment = value; + }, + ), SizedBox( height: 8 * AppStyle.getScaleFactor(context), ), @@ -587,19 +605,6 @@ class _CreateServiceReportState extends State with TickerPr _serviceReport.travelingExpense = int.tryParse(value) ?? 0; }, ), - const SizedBox( - height: 8, - ), - ATextFormField( - initialValue: _serviceReport?.comment, - hintText: _subtitle.comment, - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.titleMedium, - textInputType: TextInputType.multiline, - onSaved: (value) { - _serviceReport.comment = value; - }, - ), const SizedBox( height: 8, From c0f801c1c1984568c61e35251cc3b5315c882852 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Mon, 5 Jun 2023 10:15:44 +0300 Subject: [PATCH 02/13] Review Comment in Add Work Order Screen --- .../providers/api/service_requests_provider.dart | 4 ++-- lib/models/service_report.dart | 4 ++++ lib/views/pages/user/requests/create_request.dart | 7 +++---- .../pages/user/requests/report/create_service_report.dart | 8 +++----- 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index d8c01d6f..9ed361c8 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -323,7 +323,7 @@ class ServiceRequestsProvider extends ChangeNotifier { "travelingHours": report.travelingHours, "travelingExpenses": report.travelingExpense ?? 0, "faultDescription": { - "id": report.faultDescriptionId ?? 0, + "id": report.faultDescriptionId, "defectName": report.type?.name, "workPerformed": report.workPreformed, "estimatedTime": report.operatingHours, @@ -337,7 +337,7 @@ class ServiceRequestsProvider extends ChangeNotifier { }, ) ?.toList(), - "reviewComment": "", + "reviewComment": report.reviewComment ?? "", "comment": report.comment, "attachmentsWorkOrder": request.devicePhotos?.map((e) => {"name": e})?.toList(), "equipmentStatus": report.status?.toMap(), diff --git a/lib/models/service_report.dart b/lib/models/service_report.dart index 7024bd49..1fca48b5 100644 --- a/lib/models/service_report.dart +++ b/lib/models/service_report.dart @@ -40,6 +40,7 @@ class ServiceReport { Uint8List localNurseSignature; Uint8List localEngineerSignature; int travelingExpense; + String reviewComment; ServiceReport({ this.id, @@ -72,6 +73,7 @@ class ServiceReport { this.repairLocation, this.travelingExpense, this.startDate, + this.reviewComment, }); Map toMap(ServiceRequest request) { @@ -129,6 +131,7 @@ class ServiceReport { _map["startofWorkTime"] = startDate; _map["endofWorkTime"] = endDate; _map["workingHours"] = endDate?.difference(startDate)?.inHours ?? 0; + _map["reviewComment"] = reviewComment; return _map; } @@ -186,6 +189,7 @@ class ServiceReport { device: Device.fromJson(parsedJson["callRequest"]["asset"]), signatureNurse: URLs.getFileUrl(parsedJson["nurseSignature"]), signatureEngineer: URLs.getFileUrl(parsedJson["engSignature"]), + reviewComment: parsedJson['reviewComment'], ); } diff --git a/lib/views/pages/user/requests/create_request.dart b/lib/views/pages/user/requests/create_request.dart index efe3959c..569eeff9 100644 --- a/lib/views/pages/user/requests/create_request.dart +++ b/lib/views/pages/user/requests/create_request.dart @@ -14,7 +14,6 @@ import 'package:test_sa/controllers/validator/validator.dart'; import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/device/device.dart'; -import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/colors.dart'; @@ -271,7 +270,7 @@ class CreateRequestPageState extends State { initialValue: _serviceRequest.callComments, hintText: _subtitle.maintenanceIssue, prefixIconData: FontAwesomeIcons.triangleExclamation, - style: Theme.of(context).textTheme.headline6, + style: Theme.of(context).textTheme.titleLarge, textInputType: TextInputType.multiline, validator: (value) => Validator.hasValue(value) ? null : _subtitle.maintenanceIssueRequired, onSaved: (value) { @@ -286,12 +285,12 @@ class CreateRequestPageState extends State { if (widget.serviceRequest != null) ATextFormField( controller: _commentController, - initialValue: _serviceRequest.comment, + initialValue: _serviceRequest.comments, hintText: _subtitle.comment, style: Theme.of(context).textTheme.titleMedium, textInputType: TextInputType.multiline, onSaved: (value) { - _serviceRequest.comment = value; + _serviceRequest.comments = value; }, ), ], diff --git a/lib/views/pages/user/requests/report/create_service_report.dart b/lib/views/pages/user/requests/report/create_service_report.dart index 0426001e..dfc0beca 100644 --- a/lib/views/pages/user/requests/report/create_service_report.dart +++ b/lib/views/pages/user/requests/report/create_service_report.dart @@ -28,12 +28,10 @@ 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/parts/auto_complete_parts_field.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_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_status.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/titles/app_sub_title.dart'; import '../../../../widgets/speech_to_text/speech_to_text.dart'; @@ -339,13 +337,13 @@ class _CreateServiceReportState extends State with TickerPr ), if (_showCommentField) ATextFormField( - initialValue: _serviceReport?.comment, - hintText: _subtitle.comment, + initialValue: _serviceReport?.reviewComment, + hintText: "Review Comment", textAlign: TextAlign.center, style: Theme.of(context).textTheme.titleMedium, textInputType: TextInputType.multiline, onSaved: (value) { - _serviceReport.comment = value; + _serviceReport.reviewComment = value; }, ), SizedBox( From a19bd39516456628fc9e5720b3405fb0e97ef684 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Mon, 5 Jun 2023 11:19:17 +0300 Subject: [PATCH 03/13] Enhancements on Add Work Order Screen --- lib/controllers/providers/api/service_requests_provider.dart | 2 +- lib/models/service_report.dart | 4 ++-- .../pages/user/requests/report/create_service_report.dart | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index 9ed361c8..1f6c5071 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -294,7 +294,7 @@ class ServiceRequestsProvider extends ChangeNotifier { "id": request.id, }, "assetType": report.assetType?.toMap(), - "assignedEmployee": {"id": report.engineer.id, "name": report.engineer.name}, + "assignedEmployee": {"id": report.engineer?.id, "name": report.engineer?.name ?? ""}, "visitDate": report.visitDate?.toIso8601String() ?? "", // "assistantEmployees": [ // {"id": report.engineer.id, "name": report.engineer.name}, diff --git a/lib/models/service_report.dart b/lib/models/service_report.dart index 1fca48b5..637de4e3 100644 --- a/lib/models/service_report.dart +++ b/lib/models/service_report.dart @@ -140,7 +140,7 @@ class ServiceReport { //if(serviceType == null) return false; if (status == null) return false; if (type == null && assetType == null) return false; - if (engineer == null) return false; + // if (engineer == null) return false; if (callLastSituation == null) return false; if (callLastSituation?.value == 12) { // if(invoiceCode != null || invoiceCode?.isEmpty == true) return false; @@ -148,7 +148,7 @@ class ServiceReport { } if (parts == null) return false; //if(endDate == null) return false; - //if(reason == null) return false; + if (reason == null) return false; //todo uncoment this line //if((device?.id == null || device.id.isEmpty) && type?.id != 1) return false; //if(quantity == null || quantity.isEmpty) return false; diff --git a/lib/views/pages/user/requests/report/create_service_report.dart b/lib/views/pages/user/requests/report/create_service_report.dart index dfc0beca..692027ca 100644 --- a/lib/views/pages/user/requests/report/create_service_report.dart +++ b/lib/views/pages/user/requests/report/create_service_report.dart @@ -402,7 +402,7 @@ class _CreateServiceReportState extends State with TickerPr hintText: _serviceReport.startDate == null ? "0" : _serviceReport?.endDate?.difference(_serviceReport?.startDate)?.inHours?.toString() ?? "0", enable: false, style: Theme.of(context).textTheme.subtitle1, - validator: (value) => Validator.isNumeric(value) ? null : _subtitle.requiredWord, + validator: (value) => Validator.isNumeric(value.isEmpty ? "0" : value) ? null : _subtitle.requiredWord, textInputType: TextInputType.number, onSaved: (value) { // _serviceReport.workHours = value; From 6d6c6c700c78dbe3c27c40a017eaa33c5b911fbe Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Mon, 5 Jun 2023 16:16:17 +0300 Subject: [PATCH 04/13] Enhancements --- .../providers/api/service_requests_provider.dart | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index 1f6c5071..def74dc8 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -137,7 +137,7 @@ class ServiceRequestsProvider extends ChangeNotifier { var body = { "id": 0, "calNo": "", - "callCreatedBy": {"id": user.id, "name": user.userName ?? ""}, + "callCreatedBy": {"id": user.userID, "name": user.userName ?? ""}, "assets": serviceRequest.deviceId == null ? [] : [serviceRequest.deviceId], "requestedDate": DateTime.now().toIso8601String(), "requestedTime": DateTime.now().toIso8601String(), @@ -159,7 +159,7 @@ class ServiceRequestsProvider extends ChangeNotifier { // "job": "", "email": user.email, // "land": "", - "contactUserId": user.id, + "contactUserId": user.userID, }, ], "noofFollowup": 0, @@ -245,7 +245,7 @@ class ServiceRequestsProvider extends ChangeNotifier { "job": callSiteContactPerson['job'], "email": callSiteContactPerson['email'] ?? user.email, "land": callSiteContactPerson['land'], - "contactUserId": user.id, + "contactUserId": user.userID, }, ], "callComments": request.callComments, @@ -310,7 +310,7 @@ class ServiceRequestsProvider extends ChangeNotifier { // "job": "", "email": user.email, // "land": "", - "contactUserId": user.id, + "contactUserId": user.userID, } ], "calllastSituation": report.callLastSituation?.toMap(), From 29466092b020bae6723de41d5364c4daa923a1d9 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Tue, 6 Jun 2023 09:59:09 +0300 Subject: [PATCH 05/13] Service Type Became Read Only --- lib/controllers/api_routes/urls.dart | 2 +- .../api/service_requests_provider.dart | 2 +- .../report/create_service_report.dart | 50 ++++++++++++++----- 3 files changed, 40 insertions(+), 14 deletions(-) diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index 30aed29d..be942bbc 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -55,7 +55,7 @@ class URLs { static get getServiceReportTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=501"; // get static get getServiceReportStatus => "$_baseUrl/Lookups/GetLookup?lookupEnum=521"; // get static get getServiceReportLastCalls => "$_baseUrl/WorkOrder/GetLookupCallLastSituationBasedOnCase"; // get - static get getAssetTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=28"; // get + static get getAssetTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=500"; // get static get getPartNumber => "$_baseUrl/PartCatalog/GetPartAutoComplete"; // get static get getServiceReportPriority => "$_baseUrl/Lookups/GetLookup?lookupEnum=602"; // get static get getServiceReportDefectTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=601"; // get diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index def74dc8..ee264d1d 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -294,7 +294,7 @@ class ServiceRequestsProvider extends ChangeNotifier { "id": request.id, }, "assetType": report.assetType?.toMap(), - "assignedEmployee": {"id": report.engineer?.id, "name": report.engineer?.name ?? ""}, + // "assignedEmployee": {"id": report.engineer?.id, "name": report.engineer?.name ?? ""}, "visitDate": report.visitDate?.toIso8601String() ?? "", // "assistantEmployees": [ // {"id": report.engineer.id, "name": report.engineer.name}, diff --git a/lib/views/pages/user/requests/report/create_service_report.dart b/lib/views/pages/user/requests/report/create_service_report.dart index 692027ca..ffb92ece 100644 --- a/lib/views/pages/user/requests/report/create_service_report.dart +++ b/lib/views/pages/user/requests/report/create_service_report.dart @@ -31,9 +31,9 @@ import 'package:test_sa/views/widgets/parts/part_item.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_status.dart'; -import 'package:test_sa/views/widgets/status/report/service_status.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 '../../../../widgets/speech_to_text/speech_to_text.dart'; import '../../../../widgets/status/report/service_report_repair_location.dart'; @@ -51,7 +51,7 @@ class _CreateServiceReportState extends State with TickerPr UserProvider _userProvider; SettingProvider _settingProvider; ServiceRequestsProvider _serviceRequestsProvider; - + ServiceStatusProvider _assetTypeProvider; bool _validate = false; ServiceReport _serviceReport; bool _isLoading = false; @@ -61,16 +61,18 @@ class _CreateServiceReportState extends State with TickerPr File _image; final GlobalKey _formKey = GlobalKey(); final GlobalKey _scaffoldKey = GlobalKey(); - TextEditingController _faultController = TextEditingController(); - TextEditingController _workPreformedController = TextEditingController(); + final TextEditingController _faultController = TextEditingController(); + final TextEditingController _workPreformedController = TextEditingController(); @override void initState() { _serviceReport = ServiceReport( - visitDate: DateTime.now(), - //type: const Lookup(value: 2), - device: widget.request.device, - parts: []); + visitDate: DateTime.now(), + //type: const Lookup(value: 2), + device: widget.request.device, + parts: [], + ); + super.initState(); } @@ -86,6 +88,11 @@ class _CreateServiceReportState extends State with TickerPr _userProvider = Provider.of(context); _settingProvider = Provider.of(context); _serviceRequestsProvider = Provider.of(context); + _assetTypeProvider = Provider.of(context); + _serviceReport.assetType = _assetTypeProvider.statuses?.firstWhere( + (element) => element.value == widget.request?.device?.hospital?.id, + orElse: () => null, + ); _subtitle = AppLocalization.of(context).subtitle; return Scaffold( key: _scaffoldKey, @@ -251,12 +258,31 @@ class _CreateServiceReportState extends State with TickerPr const SizedBox( height: 4, ), - ServiceAssetTypeMenu( - initialValue: _serviceReport.assetType, - onSelect: (status) { - _serviceReport.assetType = status; + LoadingManager( + isLoading: _assetTypeProvider.isLoading, + isFailedLoading: _assetTypeProvider.statuses == null, + stateCode: _assetTypeProvider.stateCode, + onRefresh: () async { + _assetTypeProvider.reset(); + await _assetTypeProvider.getTypes(user: _userProvider.user, host: _settingProvider.host); + _serviceReport?.assetType = _assetTypeProvider.statuses?.firstWhere( + (element) => element.value == widget.request?.device?.hospital?.id, + orElse: () => null, + ); }, + child: ATextFormField( + initialValue: _serviceReport?.assetType?.name ?? "NULL", + textAlign: TextAlign.center, + enable: false, + style: Theme.of(context).textTheme.titleMedium, + ), ), + // ServiceAssetTypeMenu( + // initialValue: _serviceReport.assetType, + // onSelect: (status) { + // _serviceReport.assetType = status; + // }, + // ), const SizedBox( height: 8, ), From 655f96049cb71fd230fd33093d59c42407543cf0 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Tue, 6 Jun 2023 11:20:56 +0300 Subject: [PATCH 06/13] Fault Description Became a Dropdown Menu --- lib/controllers/api_routes/urls.dart | 1 + .../api/service_requests_provider.dart | 9 +- ...ice_report_fault_description_provider.dart | 70 +++++++++++ lib/main.dart | 2 + lib/models/fault_description.dart | 36 ++++++ lib/models/service_report.dart | 77 ++++++------ .../report/create_service_report.dart | 45 ++++--- .../status/report/fault_desc_menu.dart | 110 ++++++++++++++++++ .../service_report_fault_description.dart | 43 +++++++ 9 files changed, 324 insertions(+), 69 deletions(-) create mode 100644 lib/controllers/providers/api/status_drop_down/report/service_report_fault_description_provider.dart create mode 100644 lib/models/fault_description.dart create mode 100644 lib/views/widgets/status/report/fault_desc_menu.dart create mode 100644 lib/views/widgets/status/report/service_report_fault_description.dart diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index be942bbc..df430e8e 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -59,6 +59,7 @@ class URLs { static get getPartNumber => "$_baseUrl/PartCatalog/GetPartAutoComplete"; // get static get getServiceReportPriority => "$_baseUrl/Lookups/GetLookup?lookupEnum=602"; // get static get getServiceReportDefectTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=601"; // get + static get getServiceReportFaultDescription => "$_baseUrl/CallRequest/GetCallRequestForWorkOrder"; // get //gas refill static get getGasTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=606"; // get diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index ee264d1d..8f947e45 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -294,7 +294,7 @@ class ServiceRequestsProvider extends ChangeNotifier { "id": request.id, }, "assetType": report.assetType?.toMap(), - // "assignedEmployee": {"id": report.engineer?.id, "name": report.engineer?.name ?? ""}, + "assignedEmployee": {"id": report.engineer?.id, "name": report.engineer?.name ?? ""}, "visitDate": report.visitDate?.toIso8601String() ?? "", // "assistantEmployees": [ // {"id": report.engineer.id, "name": report.engineer.name}, @@ -322,12 +322,7 @@ class ServiceRequestsProvider extends ChangeNotifier { "workingHours": report.timer?.durationInSecond, "travelingHours": report.travelingHours, "travelingExpenses": report.travelingExpense ?? 0, - "faultDescription": { - "id": report.faultDescriptionId, - "defectName": report.type?.name, - "workPerformed": report.workPreformed, - "estimatedTime": report.operatingHours, - }, + if (report.faultDescription != null) "faultDescription": report.faultDescription.toJson(), "sparePartsWorkOrders": report.parts ?.map( (p) => { diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_fault_description_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_fault_description_provider.dart new file mode 100644 index 00000000..f50a5b1e --- /dev/null +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_fault_description_provider.dart @@ -0,0 +1,70 @@ +import 'dart:convert'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.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/models/user.dart'; + +import '../../../../../models/fault_description.dart'; + +class ServiceRequestFaultDescriptionProvider extends ChangeNotifier { + //reset provider data + void reset() { + _items = null; + _stateCode = null; + } + + // state code of current request to defied error message + // like 400 customer request failed + // 500 service not available + int _stateCode; + int get stateCode => _stateCode; + + // contain user data + // when user not login or register _user = null + List _items; + List get items => _items; + + // when categories in-process _loading = true + // done _loading = true + // failed _loading = false + bool _loading; + bool get isLoading => _loading; + set isLoading(bool isLoading) { + _loading = isLoading; + notifyListeners(); + } + + /// return -2 if request in progress + /// return -1 if error happen when sending request + /// return state code if request complete may be 200, 404 or 403 + /// for more details check http state manager + /// lib\controllers\http_status_manger\http_status_manger.dart + Future getData({String host, User user, String requestId}) async { + if (_loading == true) return -2; + _loading = true; + notifyListeners(); + Response response; + try { + response = await ApiManager.instance.get( + URLs.getServiceReportFaultDescription + "?callId=$requestId", + ); + _stateCode = response.statusCode; + if (response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List listJson = json.decode(response.body)["data"]['asset']['modelDefinition']['modelDefRelatedDefects']; + _items = listJson.map((type) => FaultDescription.fromJson(type)).toList(); + } + _loading = false; + notifyListeners(); + return response.statusCode; + } catch (error) { + _loading = false; + _stateCode = -1; + notifyListeners(); + return -1; + } + } +} diff --git a/lib/main.dart b/lib/main.dart index eef23138..56bcee8c 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -49,6 +49,7 @@ import 'package:test_sa/views/widgets/equipment/single_device_picker.dart'; import 'controllers/providers/api/parts_provider.dart'; import 'controllers/providers/api/preventive_maintenance_visits_provider.dart'; import 'controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart'; +import 'controllers/providers/api/status_drop_down/report/service_report_fault_description_provider.dart'; import 'controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart'; import 'controllers/providers/api/status_drop_down/report/service_report_reasons_provider.dart'; import 'controllers/providers/api/status_drop_down/report/service_report_repair_location_provider.dart'; @@ -117,6 +118,7 @@ class MyApp extends StatelessWidget { ChangeNotifierProvider(create: (_) => ServiceLoanAvailabilityProvider()), ChangeNotifierProvider(create: (_) => ServiceFirstActionProvider()), ChangeNotifierProvider(create: (_) => ServiceReportRepairLocationProvider()), + ChangeNotifierProvider(create: (_) => ServiceRequestFaultDescriptionProvider()), ], child: GestureDetector( onTap: () { diff --git a/lib/models/fault_description.dart b/lib/models/fault_description.dart new file mode 100644 index 00000000..02e67e92 --- /dev/null +++ b/lib/models/fault_description.dart @@ -0,0 +1,36 @@ +class FaultDescription { + FaultDescription({ + this.id, + this.defectName, + this.workPerformed, + this.estimatedTime,}); + + FaultDescription.fromJson(dynamic json) { + id = json['id']; + defectName = json['defectName']; + workPerformed = json['workPerformed']; + estimatedTime = json['estimatedTime']; + } + num id; + dynamic defectName; + String workPerformed; + String estimatedTime; +FaultDescription copyWith({ num id, + dynamic defectName, + String workPerformed, + String estimatedTime, +}) => FaultDescription( id: id ?? this.id, + defectName: defectName ?? this.defectName, + workPerformed: workPerformed ?? this.workPerformed, + estimatedTime: estimatedTime ?? this.estimatedTime, +); + Map toJson() { + final map = {}; + map['id'] = id; + map['defectName'] = defectName; + map['workPerformed'] = workPerformed; + map['estimatedTime'] = estimatedTime; + return map; + } + +} \ No newline at end of file diff --git a/lib/models/service_report.dart b/lib/models/service_report.dart index 637de4e3..f8f65e75 100644 --- a/lib/models/service_report.dart +++ b/lib/models/service_report.dart @@ -3,6 +3,7 @@ import 'dart:typed_data'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/device/device.dart'; import 'package:test_sa/models/engineer.dart'; +import 'package:test_sa/models/fault_description.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/part.dart'; import 'package:test_sa/models/service_request/service_request.dart'; @@ -41,40 +42,41 @@ class ServiceReport { Uint8List localEngineerSignature; int travelingExpense; String reviewComment; + FaultDescription faultDescription; - ServiceReport({ - this.id, - this.visitDate, - this.endDate, - this.assetType, - this.status, - this.type, - this.faultDescriptionId, - //this.workHours, - this.travelingHours, - this.parts, - this.engineer, - this.workPreformed, - this.reason, - this.operatingHours, - this.callLastSituation, - this.jobSheetNumber, - this.image, - this.device, - this.invoiceCode, - this.invoiceNumber, - this.quantity = "1", - this.timer, - this.signatureNurse, - this.signatureEngineer, - this.localNurseSignature, - this.localEngineerSignature, - this.comment, - this.repairLocation, - this.travelingExpense, - this.startDate, - this.reviewComment, - }); + ServiceReport( + {this.id, + this.visitDate, + this.endDate, + this.assetType, + this.status, + this.type, + this.faultDescriptionId, + //this.workHours, + this.travelingHours, + this.parts, + this.engineer, + this.workPreformed, + this.reason, + this.operatingHours, + this.callLastSituation, + this.jobSheetNumber, + this.image, + this.device, + this.invoiceCode, + this.invoiceNumber, + this.quantity = "1", + this.timer, + this.signatureNurse, + this.signatureEngineer, + this.localNurseSignature, + this.localEngineerSignature, + this.comment, + this.repairLocation, + this.travelingExpense, + this.startDate, + this.reviewComment, + this.faultDescription}); Map toMap(ServiceRequest request) { Map _map = {}; @@ -92,12 +94,9 @@ class ServiceReport { _map["workingHours"] = (timer.durationInSecond / 60 / 60).toStringAsFixed(5); } if (travelingHours != null && travelingHours.isNotEmpty) _map["traveling_hours"] = travelingHours; - // if(workPreformed != null && workPreformed.isNotEmpty){ - // _map["faultDescription"] = { - // //"id":faultDescriptionId ?? 0, - // "workPerformed":workPreformed - // }; - // } + if (workPreformed != null && workPreformed.isNotEmpty) { + _map["faultDescription"] = faultDescription.toJson(); + } if (jobSheetNumber != null && jobSheetNumber.isNotEmpty) _map["job_sheet_no"] = jobSheetNumber; if (parts != null && parts.isNotEmpty) { _map["sparePartsWorkOrders"] = parts.map((e) => e.toJson()).toList(); diff --git a/lib/views/pages/user/requests/report/create_service_report.dart b/lib/views/pages/user/requests/report/create_service_report.dart index ffb92ece..e705d495 100644 --- a/lib/views/pages/user/requests/report/create_service_report.dart +++ b/lib/views/pages/user/requests/report/create_service_report.dart @@ -35,6 +35,7 @@ import 'package:test_sa/views/widgets/titles/app_sub_title.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_repair_location.dart'; class CreateServiceReport extends StatefulWidget { @@ -513,34 +514,32 @@ class _CreateServiceReportState extends State with TickerPr ], ), const SizedBox(height: 8), - Row( - children: [ - ASubTitle(_subtitle.faultDescription), - Expanded( - child: SizedBox( - height: 32 * AppStyle.getScaleFactor(context), - child: SpeechToTextButton( - controller: _faultController, - mini: true, - ), - ), - ), - ], - ), + ASubTitle(_subtitle.faultDescription), const SizedBox( height: 4, ), - ATextFormField( - initialValue: _serviceReport?.faultDescriptionId?.toString(), - textAlign: TextAlign.center, - controller: _faultController, - style: Theme.of(context).textTheme.titleMedium, - validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, - textInputType: TextInputType.multiline, - onSaved: (value) { - _serviceReport.faultDescriptionId = int.tryParse(value) ?? 0; + ServiceReportFaultDescription( + requestId: widget.request.id, + initialValue: _serviceReport.faultDescription, + onSelect: (status) { + _serviceReport.faultDescription = status; + setState(() {}); }, ), + const SizedBox( + height: 4, + ), + // ATextFormField( + // initialValue: _serviceReport?.faultDescriptionId?.toString(), + // textAlign: TextAlign.center, + // controller: _faultController, + // style: Theme.of(context).textTheme.titleMedium, + // validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, + // textInputType: TextInputType.multiline, + // onSaved: (value) { + // _serviceReport.faultDescriptionId = int.tryParse(value) ?? 0; + // }, + // ), const SizedBox( height: 8, ), diff --git a/lib/views/widgets/status/report/fault_desc_menu.dart b/lib/views/widgets/status/report/fault_desc_menu.dart new file mode 100644 index 00000000..4d9e2aed --- /dev/null +++ b/lib/views/widgets/status/report/fault_desc_menu.dart @@ -0,0 +1,110 @@ +import 'package:flutter/material.dart'; +import 'package:test_sa/models/fault_description.dart'; +import 'package:test_sa/views/app_style/colors.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; + +class FaultDescriptionMenu extends StatefulWidget { + final List statuses; + final FaultDescription initialStatus; + final Function(FaultDescription) onSelect; + + const FaultDescriptionMenu({Key key, this.statuses, this.onSelect, this.initialStatus}) : super(key: key); + + @override + _SingleStatusMenuState createState() => _SingleStatusMenuState(); +} + +class _SingleStatusMenuState extends State { + FaultDescription _selectedStatus; + + @override + void setState(VoidCallback fn) { + if (mounted) super.setState(fn); + } + + @override + void didUpdateWidget(covariant FaultDescriptionMenu oldWidget) { + if (widget.initialStatus != null) { + final result = widget.statuses?.where((element) { + return element == widget.initialStatus; + }); + if (result.isNotEmpty) { + _selectedStatus = result.first; + } else { + _selectedStatus = null; + } + if ((widget.initialStatus?.id ?? "") != (_selectedStatus?.id ?? "")) { + widget.onSelect(_selectedStatus); + } + } else { + _selectedStatus = null; + } + super.didUpdateWidget(oldWidget); + } + + @override + void initState() { + if (widget.initialStatus != null) { + final result = widget.statuses?.where((element) { + return element == widget.initialStatus; + }); + if (result.isNotEmpty) _selectedStatus = result.first; + if (widget.initialStatus.id != _selectedStatus?.id) { + widget.onSelect(_selectedStatus); + } + } + + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 16), + decoration: BoxDecoration( + color: AColors.inputFieldBackgroundColor, + border: Border.all( + color: Color(0xffefefef), + ), + borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), + // boxShadow: const [ + // AppStyle.boxShadow + // ] + ), + child: DropdownButton( + value: _selectedStatus, + iconSize: 24, + icon: const Icon(Icons.keyboard_arrow_down_rounded), + elevation: 0, + isExpanded: true, + hint: Text( + "Select", + style: Theme.of(context).textTheme.subtitle1, + ), + style: TextStyle(color: Theme.of(context).primaryColor), + underline: SizedBox.shrink(), + onChanged: (FaultDescription newValue) { + setState(() { + _selectedStatus = newValue; + }); + widget.onSelect(newValue); + }, + items: widget.statuses.map>( + (FaultDescription value) { + return DropdownMenuItem( + value: value, + child: Text( + value.defectName, + style: Theme.of(context).textTheme.subtitle1.copyWith( + color: Theme.of(context).primaryColor, + fontSize: 11, + //fontWeight: FontWeight.bold + ), + ), + ); + }, + ).toList(), + ), + ); + } +} diff --git a/lib/views/widgets/status/report/service_report_fault_description.dart b/lib/views/widgets/status/report/service_report_fault_description.dart new file mode 100644 index 00000000..3e92f5f4 --- /dev/null +++ b/lib/views/widgets/status/report/service_report_fault_description.dart @@ -0,0 +1,43 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_fault_description_provider.dart'; +import 'package:test_sa/controllers/providers/api/user_provider.dart'; +import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; +import 'package:test_sa/models/fault_description.dart'; +import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import 'package:test_sa/views/widgets/status/report/fault_desc_menu.dart'; + +import '../../app_text_form_field.dart'; + +class ServiceReportFaultDescription extends StatelessWidget { + final String requestId; + final Function(FaultDescription) onSelect; + final FaultDescription initialValue; + + const ServiceReportFaultDescription({Key key, this.requestId, this.onSelect, this.initialValue}) : super(key: key); + @override + Widget build(BuildContext context) { + SettingProvider settingProvider = Provider.of(context); + UserProvider userProvider = Provider.of(context); + ServiceRequestFaultDescriptionProvider menuProvider = Provider.of(context); + return LoadingManager( + isLoading: menuProvider.isLoading, + isFailedLoading: menuProvider.items == null, + stateCode: menuProvider.stateCode, + onRefresh: () async { + menuProvider.reset(); + await menuProvider.getData(user: userProvider.user, host: settingProvider.host, requestId: requestId); + }, + child: menuProvider.items.isEmpty + ? const ATextFormField( + initialValue: "NULL", + enable: false, + ) + : FaultDescriptionMenu( + initialStatus: initialValue, + statuses: menuProvider.items, + onSelect: onSelect, + ), + ); + } +} From c8f498db6ab5f8d03ab6507a06f9c584e28b4122 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Tue, 6 Jun 2023 13:18:25 +0300 Subject: [PATCH 07/13] Merged with main_latest --- .../report/create_service_report.dart | 611 ++++++------------ .../service_report_fault_description.dart | 2 +- 2 files changed, 183 insertions(+), 430 deletions(-) diff --git a/lib/views/pages/user/requests/report/create_service_report.dart b/lib/views/pages/user/requests/report/create_service_report.dart index 310a9d18..c5f51b08 100644 --- a/lib/views/pages/user/requests/report/create_service_report.dart +++ b/lib/views/pages/user/requests/report/create_service_report.dart @@ -28,16 +28,14 @@ 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/parts/auto_complete_parts_field.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_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_status.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/titles/app_sub_title.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_repair_location.dart'; class CreateServiceReport extends StatefulWidget { @@ -75,7 +73,6 @@ class _CreateServiceReportState extends State with TickerPr device: widget.request.device, parts: [], ); - super.initState(); } @@ -275,12 +272,31 @@ class _CreateServiceReportState extends State with TickerPr const SizedBox( height: 4, ), - ServiceAssetTypeMenu( - initialValue: _serviceReport.assetType, - onSelect: (status) { - _serviceReport.assetType = status; + LoadingManager( + isLoading: _assetTypeProvider.isLoading, + isFailedLoading: _assetTypeProvider.statuses == null, + stateCode: _assetTypeProvider.stateCode, + onRefresh: () async { + _assetTypeProvider.reset(); + await _assetTypeProvider.getTypes(user: _userProvider.user, host: _settingProvider.host); + _serviceReport?.assetType = _assetTypeProvider.statuses?.firstWhere( + (element) => element.value == widget.request?.device?.hospital?.id, + orElse: () => null, + ); }, + child: ATextFormField( + initialValue: _serviceReport?.assetType?.name ?? "NULL", + textAlign: TextAlign.center, + enable: false, + style: Theme.of(context).textTheme.titleMedium, + ), ), + // ServiceAssetTypeMenu( + // initialValue: _serviceReport.assetType, + // onSelect: (status) { + // _serviceReport.assetType = status; + // }, + // ), const SizedBox( height: 8, ), @@ -353,6 +369,21 @@ class _CreateServiceReportState extends State with TickerPr ), ], ), + if (_showCommentField) + const SizedBox( + height: 8, + ), + if (_showCommentField) + ATextFormField( + initialValue: _serviceReport?.reviewComment, + hintText: "Review Comment", + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.titleMedium, + textInputType: TextInputType.multiline, + onSaved: (value) { + _serviceReport.reviewComment = value; + }, + ), SizedBox( height: 8 * AppStyle.getScaleFactor(context), ), @@ -417,176 +448,48 @@ class _CreateServiceReportState extends State with TickerPr // _serviceReport.workHours = value; }, ), - // Report type and Reasons - Row( - children: [ - // Report Status - // Expanded( - // child: Column( - // crossAxisAlignment: CrossAxisAlignment.start, - // children: [ - // ASubTitle(_subtitle.reportType), - // _validate && _serviceReport.type == null ? - // ASubTitle(_subtitle.requiredWord,color: Colors.red,): - // const SizedBox.shrink(), - // const SizedBox(height: 4,), - // ServiceReportTypeMenu( - // initialValue: _serviceReport.type, - // onSelect: (status){ - // _serviceReport.type = status; - // }, - // ), - // ], - // ), - // ), - // const SizedBox(width: 8,), - // visit date - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(_subtitle.visitDate), - _validate && _serviceReport.visitDate == null - ? ASubTitle( - _subtitle.requiredWord, - color: Colors.red, - ) - : const SizedBox.shrink(), - Row( - children: [ - Expanded( - child: ADatePicker( - date: _serviceReport.visitDate, - from: DateTime.now().subtract(const Duration(days: 365)), - to: DateTime.now().add(const Duration(days: 365)), - onDatePicker: (date) { - _serviceReport.visitDate = date; - setState(() {}); - }, - ), - ), - ], - ), - ], - ), + const SizedBox( + height: 8, ), - ], - ), - const SizedBox( - height: 8, - ), - // device sn - Visibility( - visible: widget.request.deviceSerialNumber == null, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(_subtitle.deviceSN), - _validate && _serviceReport.device?.id == null - ? ASubTitle( - _subtitle.requiredWord, - color: Colors.red, - ) - : const SizedBox.shrink(), - AutoCompleteDeviceField( - hospitalId: widget.request.hospitalId, - initialValue: _serviceReport.device, - onPick: (id) { - _serviceReport.device.id = id; - }, - ), - const SizedBox( - height: 8, - ), - ], - ), - ), - const SizedBox( - height: 8, - ), - ASubTitle(_subtitle.serviceType), - _validate && _serviceReport.assetType == null - ? ASubTitle( - _subtitle.requiredWord, - color: Colors.red, - ) - : const SizedBox.shrink(), - const SizedBox( - height: 4, - ), - LoadingManager( - isLoading: _assetTypeProvider.isLoading, - isFailedLoading: _assetTypeProvider.statuses == null, - stateCode: _assetTypeProvider.stateCode, - onRefresh: () async { - _assetTypeProvider.reset(); - await _assetTypeProvider.getTypes(user: _userProvider.user, host: _settingProvider.host); - _serviceReport?.assetType = _assetTypeProvider.statuses?.firstWhere( - (element) => element.value == widget.request?.device?.hospital?.id, - orElse: () => null, - ); - }, - child: ATextFormField( - initialValue: _serviceReport?.assetType?.name ?? "NULL", - textAlign: TextAlign.center, - enable: false, - style: Theme.of(context).textTheme.titleMedium, - ), - ), - // ServiceAssetTypeMenu( - // initialValue: _serviceReport.assetType, - // onSelect: (status) { - // _serviceReport.assetType = status; - // }, - // ), - const SizedBox( - height: 8, - ), - // Report status and Service Type - Row( - children: [ - // report status - Expanded( + // device sn + Visibility( + visible: widget.request.deviceSerialNumber == null, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - ASubTitle(_subtitle.reportStatus), - _validate && _serviceReport.status == null + ASubTitle(_subtitle.deviceSN), + _validate && _serviceReport.device?.id == null ? ASubTitle( _subtitle.requiredWord, color: Colors.red, ) : const SizedBox.shrink(), - const SizedBox( - height: 4, - ), - ServiceReportStatusMenu( - report: _serviceReport, - request: widget.request, - onSelect: (status) { - _serviceReport.status = status; - _showCommentField = _serviceReport.status?.name == "Resolved"; - setState(() {}); + AutoCompleteDeviceField( + hospitalId: widget.request.hospitalId, + initialValue: _serviceReport.device, + onPick: (id) { + _serviceReport.device.id = id; }, ), + const SizedBox( + height: 8, + ), ], ), ), const SizedBox( - width: 8, + height: 8, ), - // Provider.of(context).isLoading == null - // ? const SizedBox.shrink(): - // Call's last Situation - Consumer( - builder: (_, provider, __) { - if (provider.isLoading == null) return const SizedBox.shrink(); - return Expanded( + // Report status and Service Type + Row( + children: [ + // report status + Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - ASubTitle(_subtitle.callLastSituation), - _validate && _serviceReport.callLastSituation == null + ASubTitle(_subtitle.reportStatus), + _validate && _serviceReport.status == null ? ASubTitle( _subtitle.requiredWord, color: Colors.red, @@ -595,121 +498,99 @@ class _CreateServiceReportState extends State with TickerPr const SizedBox( height: 4, ), - ServiceReportLastCallsMenu( + ServiceReportStatusMenu( report: _serviceReport, + request: widget.request, onSelect: (status) { - if (status?.value == 12 || _serviceReport.callLastSituation?.value == 12) { - _serviceReport.callLastSituation = status; - setState(() {}); - } else { - _serviceReport.callLastSituation = status; - } + _serviceReport.status = status; + _showCommentField = _serviceReport.status?.name == "Resolved"; + setState(() {}); }, ), ], ), - ); - }, + ), + const SizedBox( + width: 8, + ), + // Provider.of(context).isLoading == null + // ? const SizedBox.shrink(): + // Call's last Situation + Consumer( + builder: (_, provider, __) { + if (provider.isLoading == null) return const SizedBox.shrink(); + return Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ASubTitle(_subtitle.callLastSituation), + _validate && _serviceReport.callLastSituation == null + ? ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ) + : const SizedBox.shrink(), + const SizedBox( + height: 4, + ), + ServiceReportLastCallsMenu( + report: _serviceReport, + onSelect: (status) { + if (status?.value == 12 || _serviceReport.callLastSituation?.value == 12) { + _serviceReport.callLastSituation = status; + setState(() {}); + } else { + _serviceReport.callLastSituation = status; + } + }, + ), + ], + ), + ); + }, + ), + ], ), - ], - ), - if (_showCommentField) - const SizedBox( - height: 8, - ), - if (_showCommentField) - ATextFormField( - initialValue: _serviceReport?.reviewComment, - hintText: "Review Comment", - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.titleMedium, - textInputType: TextInputType.multiline, - onSaved: (value) { - _serviceReport.reviewComment = value; - }, - ), - SizedBox( - height: 8 * AppStyle.getScaleFactor(context), - ), - Row( - children: [ - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - const ASubTitle("Start of Work"), - SizedBox( - height: 8 * AppStyle.getScaleFactor(context), - ), - 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(() {}); - }, - ), - ], + if (_showCommentField) + const SizedBox( + height: 8, ), - ), - 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(() {}); - }, - ), - ], + if (_showCommentField) + ATextFormField( + initialValue: _serviceReport?.reviewComment, + hintText: "Review Comment", + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.titleMedium, + textInputType: TextInputType.multiline, + onSaved: (value) { + _serviceReport.reviewComment = value; + }, ), - ), - ], - ), - ASubTitle(_subtitle.workingHours), - const SizedBox(height: 4), - ATextFormField( - initialValue: null, - textAlign: TextAlign.center, - hintText: _serviceReport.startDate == null ? "0" : _serviceReport?.endDate?.difference(_serviceReport?.startDate)?.inHours?.toString() ?? "0", - enable: false, - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => Validator.isNumeric(value.isEmpty ? "0" : value) ? null : _subtitle.requiredWord, - textInputType: TextInputType.number, - onSaved: (value) { - // _serviceReport.workHours = value; - }, - ), - SizedBox( height: 8 * AppStyle.getScaleFactor(context), ), - const ASubTitle("Assigned Employee"), - const SizedBox(height: 8), - _validate && _serviceReport.engineer == null - ? ASubTitle( - _subtitle.requiredWord, - color: Colors.red, - ) - : const SizedBox.shrink(), - const SizedBox(height: 4), - EngineersMenu( - initialValue: _serviceReport.engineer, - onSelect: (engineer) { - _serviceReport.engineer = engineer; - }, - ), - const SizedBox(height: 8), + // const ASubTitle("Assigned Employee"), + // const SizedBox( + // height: 8, + // ), + // _validate && _serviceReport.engineer == null + // ? ASubTitle( + // _subtitle.requiredWord, + // color: Colors.red, + // ) + // : const SizedBox.shrink(), + // const SizedBox( + // height: 4, + // ), + // EngineersMenu( + // initialValue: _serviceReport.engineer, + // onSelect: (engineer) { + // _serviceReport.engineer = engineer; + // }, + // ), + // const SizedBox( + // height: 8, + // ), // invoice number & code _serviceReport.callLastSituation?.id != 12 ? const SizedBox.shrink() @@ -736,13 +617,17 @@ class _CreateServiceReportState extends State with TickerPr ], ), ), - const SizedBox(width: 8), + const SizedBox( + width: 8, + ), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ ASubTitle(_subtitle.invoiceCode), - const SizedBox(height: 4), + const SizedBox( + height: 4, + ), ATextFormField( initialValue: _serviceReport?.invoiceCode, textAlign: TextAlign.center, @@ -759,33 +644,35 @@ class _CreateServiceReportState extends State with TickerPr ], ), const SizedBox(height: 8), - Row( - children: [ - ASubTitle(_subtitle.faultDescription), - Expanded( - child: SizedBox( - height: 32 * AppStyle.getScaleFactor(context), - child: SpeechToTextButton( - controller: _faultController, - mini: true, - ), - ), - ), - ], + ASubTitle(_subtitle.faultDescription), + const SizedBox( + height: 4, ), - const SizedBox(height: 4), - ATextFormField( - initialValue: _serviceReport?.faultDescriptionId?.toString(), - textAlign: TextAlign.center, - controller: _faultController, - style: Theme.of(context).textTheme.titleMedium, - validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, - textInputType: TextInputType.multiline, - onSaved: (value) { - _serviceReport.faultDescriptionId = int.tryParse(value) ?? 0; + ServiceReportFaultDescription( + requestId: widget.request?.id, + initialValue: _serviceReport.faultDescription, + onSelect: (status) { + _serviceReport.faultDescription = status; + setState(() {}); }, ), - const SizedBox(height: 8), + const SizedBox( + height: 4, + ), + // ATextFormField( + // initialValue: _serviceReport?.faultDescriptionId?.toString(), + // textAlign: TextAlign.center, + // controller: _faultController, + // style: Theme.of(context).textTheme.titleMedium, + // validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, + // textInputType: TextInputType.multiline, + // onSaved: (value) { + // _serviceReport.faultDescriptionId = int.tryParse(value) ?? 0; + // }, + // ), + const SizedBox( + height: 8, + ), Row( children: [ ASubTitle(_subtitle.workPreformed), @@ -800,7 +687,9 @@ class _CreateServiceReportState extends State with TickerPr ), ], ), - const SizedBox(height: 4), + const SizedBox( + height: 4, + ), ATextFormField( initialValue: _serviceReport?.workPreformed, textAlign: TextAlign.center, @@ -812,145 +701,9 @@ class _CreateServiceReportState extends State with TickerPr _serviceReport.workPreformed = value; }, ), - const SizedBox(height: 8), - SizedBox( - height: 8 * AppStyle.getScaleFactor(context), - ), - // const ASubTitle("Assigned Employee"), - // const SizedBox( - // height: 8, - // ), - // _validate && _serviceReport.engineer == null - // ? ASubTitle( - // _subtitle.requiredWord, - // color: Colors.red, - // ) - // : const SizedBox.shrink(), - // const SizedBox( - // height: 4, - // ), - // EngineersMenu( - // initialValue: _serviceReport.engineer, - // onSelect: (engineer) { - // _serviceReport.engineer = engineer; - // }, - // ), - // const SizedBox( - // height: 8, - // ), - // invoice number & code - _serviceReport.callLastSituation?.id != 12 - ? const SizedBox.shrink() - : Row( - children: [ - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(_subtitle.invoiceNumber), - const SizedBox( - height: 8, - ), - ATextFormField( - initialValue: _serviceReport?.invoiceNumber, - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, - textInputType: TextInputType.number, - onSaved: (value) { - _serviceReport.invoiceNumber = value; - }, - ), - ], - ), - ), - const SizedBox( - width: 8, - ), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(_subtitle.invoiceCode), - const SizedBox( - height: 4, - ), - ATextFormField( - initialValue: _serviceReport?.invoiceCode, - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, - textInputType: TextInputType.text, - onSaved: (value) { - _serviceReport.invoiceCode = value; - }, - ), - ], - ), - ), - ], - ), - const SizedBox(height: 8), - ASubTitle(_subtitle.faultDescription), - const SizedBox( - height: 4, - ), - ServiceReportFaultDescription( - requestId: widget.request.id, - initialValue: _serviceReport.faultDescription, - onSelect: (status) { - _serviceReport.faultDescription = status; - setState(() {}); - }, - ), - const SizedBox( - height: 4, - ), - // ATextFormField( - // initialValue: _serviceReport?.faultDescriptionId?.toString(), - // textAlign: TextAlign.center, - // controller: _faultController, - // style: Theme.of(context).textTheme.titleMedium, - // validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, - // textInputType: TextInputType.multiline, - // onSaved: (value) { - // _serviceReport.faultDescriptionId = int.tryParse(value) ?? 0; - // }, - // ), - const SizedBox( - height: 8, - ), - Row( - children: [ - ASubTitle(_subtitle.workPreformed), - Expanded( - child: SizedBox( - height: 32 * AppStyle.getScaleFactor(context), - child: SpeechToTextButton( - controller: _workPreformedController, - mini: true, - ), - ), + const SizedBox( + height: 8, ), - ], - ), - const SizedBox( - height: 4, - ), - ATextFormField( - initialValue: _serviceReport?.workPreformed, - textAlign: TextAlign.center, - controller: _workPreformedController, - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, - textInputType: TextInputType.multiline, - onSaved: (value) { - _serviceReport.workPreformed = value; - }, - ), - const SizedBox( - height: 8, - ), const SizedBox(height: 8), Row( @@ -1263,8 +1016,8 @@ class _CreateServiceReportState extends State with TickerPr if (!_serviceReport.validate()) return; _formKey.currentState.save(); - _isLoading = true; - setState(() {}); + _isLoading = true; + setState(() {}); int status = await _serviceRequestsProvider.createServiceReport( user: _userProvider.user, diff --git a/lib/views/widgets/status/report/service_report_fault_description.dart b/lib/views/widgets/status/report/service_report_fault_description.dart index 3e92f5f4..c347fe42 100644 --- a/lib/views/widgets/status/report/service_report_fault_description.dart +++ b/lib/views/widgets/status/report/service_report_fault_description.dart @@ -28,7 +28,7 @@ class ServiceReportFaultDescription extends StatelessWidget { menuProvider.reset(); await menuProvider.getData(user: userProvider.user, host: settingProvider.host, requestId: requestId); }, - child: menuProvider.items.isEmpty + child: menuProvider.items?.isEmpty ?? true ? const ATextFormField( initialValue: "NULL", enable: false, From dd7c866e397652ca5e9fb553c30baad4a5574137 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Tue, 6 Jun 2023 13:27:29 +0300 Subject: [PATCH 08/13] improvements. --- .../report/create_service_report.dart | 63 ++++++++++--------- .../service_report_fault_description.dart | 4 +- 2 files changed, 34 insertions(+), 33 deletions(-) diff --git a/lib/views/pages/user/requests/report/create_service_report.dart b/lib/views/pages/user/requests/report/create_service_report.dart index c5f51b08..2f4b2efe 100644 --- a/lib/views/pages/user/requests/report/create_service_report.dart +++ b/lib/views/pages/user/requests/report/create_service_report.dart @@ -107,6 +107,7 @@ class _CreateServiceReportState extends State with TickerPr child: Stack( children: [ ListView( + padding: const EdgeInsets.all(16), children: [ //AppNameBar(), const SizedBox( @@ -673,37 +674,37 @@ class _CreateServiceReportState extends State with TickerPr const SizedBox( height: 8, ), - Row( - children: [ - ASubTitle(_subtitle.workPreformed), - Expanded( - child: SizedBox( - height: 32 * AppStyle.getScaleFactor(context), - child: SpeechToTextButton( - controller: _workPreformedController, - mini: true, - ), - ), - ), - ], - ), - const SizedBox( - height: 4, - ), - ATextFormField( - initialValue: _serviceReport?.workPreformed, - textAlign: TextAlign.center, - controller: _workPreformedController, - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, - textInputType: TextInputType.multiline, - onSaved: (value) { - _serviceReport.workPreformed = value; - }, - ), - const SizedBox( - height: 8, - ), + // Row( + // children: [ + // ASubTitle(_subtitle.workPreformed), + // Expanded( + // child: SizedBox( + // height: 32 * AppStyle.getScaleFactor(context), + // child: SpeechToTextButton( + // controller: _workPreformedController, + // mini: true, + // ), + // ), + // ), + // ], + // ), + // const SizedBox( + // height: 4, + // ), + // ATextFormField( + // initialValue: _serviceReport?.workPreformed, + // textAlign: TextAlign.center, + // controller: _workPreformedController, + // style: Theme.of(context).textTheme.subtitle1, + // validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, + // textInputType: TextInputType.multiline, + // onSaved: (value) { + // _serviceReport.workPreformed = value; + // }, + // ), + // const SizedBox( + // height: 8, + // ), const SizedBox(height: 8), Row( diff --git a/lib/views/widgets/status/report/service_report_fault_description.dart b/lib/views/widgets/status/report/service_report_fault_description.dart index c347fe42..9b0d851f 100644 --- a/lib/views/widgets/status/report/service_report_fault_description.dart +++ b/lib/views/widgets/status/report/service_report_fault_description.dart @@ -28,9 +28,9 @@ class ServiceReportFaultDescription extends StatelessWidget { menuProvider.reset(); await menuProvider.getData(user: userProvider.user, host: settingProvider.host, requestId: requestId); }, - child: menuProvider.items?.isEmpty ?? true + child: (menuProvider.items?.isEmpty ?? true) ? const ATextFormField( - initialValue: "NULL", + initialValue: "", enable: false, ) : FaultDescriptionMenu( From f72d2cc41a50de9fe731541ddb5ecc456e24246b Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Tue, 6 Jun 2023 14:02:10 +0300 Subject: [PATCH 09/13] Minor Bug Fixed --- lib/views/pages/user/requests/create_request.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/views/pages/user/requests/create_request.dart b/lib/views/pages/user/requests/create_request.dart index 569eeff9..91b87bed 100644 --- a/lib/views/pages/user/requests/create_request.dart +++ b/lib/views/pages/user/requests/create_request.dart @@ -68,6 +68,7 @@ class CreateRequestPageState extends State { _serviceRequest = widget.serviceRequest; _device = _serviceRequest.device; _deviceImages.addAll(_serviceRequest.devicePhotos.map((e) => File(e)).toList()); + _showDatePicker = _serviceRequest.firstAction != null && _serviceRequest.firstAction.name == "Need a visit"; } else { _serviceRequest = ServiceRequest(); } From b4aac2a8b8a08e95832f4bca1d5672718c862f4b Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Tue, 6 Jun 2023 17:03:42 +0300 Subject: [PATCH 10/13] new work order, service type, fault description fixes --- lib/controllers/api_routes/urls.dart | 3 +- .../api/service_requests_provider.dart | 23 + ...ice_report_fault_description_provider.dart | 4 +- .../call_request_for_work_order_model.dart | 541 ++++++++++++++++++ lib/models/fault_description.dart | 4 +- lib/models/service_report.dart | 2 +- .../service_request/search_work_order.dart | 2 +- .../report/create_service_report.dart | 94 +-- .../status/report/fault_desc_menu.dart | 2 +- .../service_report_fault_description.dart | 2 +- 10 files changed, 632 insertions(+), 45 deletions(-) create mode 100644 lib/models/call_request_for_work_order_model.dart diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index df430e8e..e52251cd 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -30,6 +30,7 @@ class URLs { static get getServiceRequestTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=604"; // get static get getServiceRequestStatus => "$_baseUrl/Lookups/GetLookup?lookupEnum=503"; static get getRepairLocation => "$_baseUrl/Lookups/GetLookup?lookupEnum=504"; + static get equipmentStatus => "$_baseUrl/Lookups/GetLookup?lookupEnum=601"; static get getPreventiveMaintenanceVisits => "$_baseUrl/return/user/calibrations"; // get static get updatePreventiveMaintenanceVisits => "$_baseUrl/Visit/UpdateVisits"; // get @@ -59,7 +60,7 @@ class URLs { static get getPartNumber => "$_baseUrl/PartCatalog/GetPartAutoComplete"; // get static get getServiceReportPriority => "$_baseUrl/Lookups/GetLookup?lookupEnum=602"; // get static get getServiceReportDefectTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=601"; // get - static get getServiceReportFaultDescription => "$_baseUrl/CallRequest/GetCallRequestForWorkOrder"; // get + static get getCallRequestForWorkOrder => "$_baseUrl/CallRequest/GetCallRequestForWorkOrder"; // get //gas refill static get getGasTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=606"; // get diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index e2a59b23..628cb254 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -5,6 +5,7 @@ import 'package:http/http.dart'; import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/call_request_for_work_order_model.dart'; import 'package:test_sa/models/issue.dart'; import 'package:test_sa/models/service_report.dart'; import 'package:test_sa/models/service_request/service_request.dart'; @@ -363,6 +364,28 @@ class ServiceRequestsProvider extends ChangeNotifier { } } + CallRequestForWorkOrder callRequestForWorkOrder; + + Future getCallRequestForWorkOrder({String callId}) async { + Response response; + try { + response = await ApiManager.instance.get( + URLs.getCallRequestForWorkOrder + "?callId=$callId", + ); + stateCode = response.statusCode; + if (response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + Map listJson = json.decode(response.body)["data"]; + callRequestForWorkOrder = CallRequestForWorkOrder.fromJson(listJson); + } + + notifyListeners(); + return callRequestForWorkOrder; + } catch (error) { + return null; + } + } + Future> searchWorkOrders({@required String callId}) async { Response response; diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_fault_description_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_fault_description_provider.dart index f50a5b1e..8946bd0a 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_fault_description_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_fault_description_provider.dart @@ -42,14 +42,14 @@ class ServiceRequestFaultDescriptionProvider extends ChangeNotifier { /// return state code if request complete may be 200, 404 or 403 /// for more details check http state manager /// lib\controllers\http_status_manger\http_status_manger.dart - Future getData({String host, User user, String requestId}) async { + Future getCallRequestForWorkOrder({String host, User user, String requestId}) async { if (_loading == true) return -2; _loading = true; notifyListeners(); Response response; try { response = await ApiManager.instance.get( - URLs.getServiceReportFaultDescription + "?callId=$requestId", + URLs.getCallRequestForWorkOrder + "?callId=$requestId", ); _stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { diff --git a/lib/models/call_request_for_work_order_model.dart b/lib/models/call_request_for_work_order_model.dart new file mode 100644 index 00000000..dd0ac5a3 --- /dev/null +++ b/lib/models/call_request_for_work_order_model.dart @@ -0,0 +1,541 @@ +class CallRequestForWorkOrder { + int id; + String callNo; + Asset asset; + AssignedEmployee assignedEmployee; + List callSiteContactPerson; + Status status; + Status callLastSituation; + Status defectType; + Status firstAction; + int assetType; + + CallRequestForWorkOrder( + {this.id, this.callNo, this.asset, this.assignedEmployee, this.callSiteContactPerson, this.status, this.callLastSituation, this.defectType, this.firstAction, this.assetType}); + + CallRequestForWorkOrder.fromJson(Map json) { + id = json['id']; + callNo = json['callNo']; + asset = json['asset'] != null ? new Asset.fromJson(json['asset']) : null; + assignedEmployee = json['assignedEmployee'] != null ? new AssignedEmployee.fromJson(json['assignedEmployee']) : null; + if (json['callSiteContactPerson'] != null) { + callSiteContactPerson = []; + json['callSiteContactPerson'].forEach((v) { + callSiteContactPerson.add(new CallSiteContactPerson.fromJson(v)); + }); + } + status = json['status'] != null ? new Status.fromJson(json['status']) : null; + callLastSituation = json['callLastSituation'] != null ? new Status.fromJson(json['callLastSituation']) : null; + defectType = json['defectType'] != null ? new Status.fromJson(json['defectType']) : null; + firstAction = json['firstAction'] != null ? new Status.fromJson(json['firstAction']) : null; + assetType = json['assetType']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['callNo'] = this.callNo; + if (this.asset != null) { + data['asset'] = this.asset.toJson(); + } + if (this.assignedEmployee != null) { + data['assignedEmployee'] = this.assignedEmployee.toJson(); + } + if (this.callSiteContactPerson != null) { + data['callSiteContactPerson'] = this.callSiteContactPerson.map((v) => v.toJson()).toList(); + } + if (this.status != null) { + data['status'] = this.status.toJson(); + } + if (this.callLastSituation != null) { + data['callLastSituation'] = this.callLastSituation.toJson(); + } + if (this.defectType != null) { + data['defectType'] = this.defectType.toJson(); + } + if (this.firstAction != null) { + data['firstAction'] = this.firstAction.toJson(); + } + data['assetType'] = this.assetType; + return data; + } +} + +class Asset { + int id; + String assetSerialNo; + String systemID; + String assetNumber; + ModelDefinition modelDefinition; + String supplier; + String ipAddress; + String macAddress; + String portNumber; + String assetReplace; + String oldAsset; + bool isParent; + String parentAsset; + int assetType; + Site site; + Building building; + String floor; + Department department; + String room; + String testsDay; + String purchasingPrice; + String nbv; + String currency; + String poNo; + String invoiceNumber; + String invoiceDate; + String replacementDate; + Department originDepartment; + Site originSite; + String budgetYear; + String lastPOPrice; + String commissioningStatus; + String productionDate; + String edd; + String technicalInspectionDate; + String deliveryInspectionDate; + String endUserAcceptanceDate; + String receivingCommittee; + String siteWarrantyMonths; + String extendedWarrantyMonths; + String remainderWarrantyMonths; + String eomWarrantyMonthsNo; + String warrantyValue; + String warrantyEndDate; + String warrantyContractConditions; + List technicalGuidanceBooks; + String comment; + String tagCode; + + Asset( + {this.id, + this.assetSerialNo, + this.systemID, + this.assetNumber, + this.modelDefinition, + this.supplier, + this.ipAddress, + this.macAddress, + this.portNumber, + this.assetReplace, + this.oldAsset, + this.isParent, + this.parentAsset, + this.assetType, + this.site, + this.building, + this.floor, + this.department, + this.room, + this.testsDay, + this.purchasingPrice, + this.nbv, + this.currency, + this.poNo, + this.invoiceNumber, + this.invoiceDate, + this.replacementDate, + this.originDepartment, + this.originSite, + this.budgetYear, + this.lastPOPrice, + this.commissioningStatus, + this.productionDate, + this.edd, + this.technicalInspectionDate, + this.deliveryInspectionDate, + this.endUserAcceptanceDate, + this.receivingCommittee, + this.siteWarrantyMonths, + this.extendedWarrantyMonths, + this.remainderWarrantyMonths, + this.eomWarrantyMonthsNo, + this.warrantyValue, + this.warrantyEndDate, + this.warrantyContractConditions, + this.technicalGuidanceBooks, + this.comment, + this.tagCode}); + + Asset.fromJson(Map json) { + id = json['id']; + assetSerialNo = json['assetSerialNo']; + systemID = json['systemID']; + assetNumber = json['assetNumber']; + modelDefinition = json['modelDefinition'] != null ? new ModelDefinition.fromJson(json['modelDefinition']) : null; + supplier = json['supplier']; + ipAddress = json['ipAddress']; + macAddress = json['macAddress']; + portNumber = json['portNumber']; + assetReplace = json['assetReplace']; + oldAsset = json['oldAsset']; + isParent = json['isParent']; + parentAsset = json['parentAsset']; + assetType = json['assetType']; + site = json['site'] != null ? new Site.fromJson(json['site']) : null; + building = json['building']; + floor = json['floor']; + department = json['department'] != null ? new Department.fromJson(json['department']) : null; + room = json['room']; + testsDay = json['testsDay']; + purchasingPrice = json['purchasingPrice']; + nbv = json['nbv']; + currency = json['currency']; + poNo = json['poNo']; + invoiceNumber = json['invoiceNumber']; + invoiceDate = json['invoiceDate']; + replacementDate = json['replacementDate']; + originDepartment = json['originDepartment'] != null ? new Department.fromJson(json['originDepartment']) : null; + originSite = json['originSite'] != null ? new Site.fromJson(json['originSite']) : null; + budgetYear = json['budgetYear']; + lastPOPrice = json['lastPOPrice']; + commissioningStatus = json['commissioningStatus']; + productionDate = json['productionDate']; + edd = json['edd']; + technicalInspectionDate = json['technicalInspectionDate']; + deliveryInspectionDate = json['deliveryInspectionDate']; + endUserAcceptanceDate = json['endUserAcceptanceDate']; + receivingCommittee = json['receivingCommittee']; + siteWarrantyMonths = json['siteWarrantyMonths']; + extendedWarrantyMonths = json['extendedWarrantyMonths']; + remainderWarrantyMonths = json['remainderWarrantyMonths']; + eomWarrantyMonthsNo = json['eomWarrantyMonthsNo']; + warrantyValue = json['warrantyValue']; + warrantyEndDate = json['warrantyEndDate']; + warrantyContractConditions = json['warrantyContractConditions']; + if (json['technicalGuidanceBooks'] != null) { + technicalGuidanceBooks = []; + json['technicalGuidanceBooks'].forEach((v) { + //technicalGuidanceBooks.add(new Null.fromJson(v)); + }); + } + comment = json['comment']; + tagCode = json['tagCode']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['assetSerialNo'] = this.assetSerialNo; + data['systemID'] = this.systemID; + data['assetNumber'] = this.assetNumber; + if (this.modelDefinition != null) { + data['modelDefinition'] = this.modelDefinition.toJson(); + } + data['supplier'] = this.supplier; + data['ipAddress'] = this.ipAddress; + data['macAddress'] = this.macAddress; + data['portNumber'] = this.portNumber; + data['assetReplace'] = this.assetReplace; + data['oldAsset'] = this.oldAsset; + data['isParent'] = this.isParent; + data['parentAsset'] = this.parentAsset; + data['assetType'] = this.assetType; + if (this.site != null) { + data['site'] = this.site.toJson(); + } + data['building'] = this.building; + data['floor'] = this.floor; + if (this.department != null) { + data['department'] = this.department.toJson(); + } + data['room'] = this.room; + data['testsDay'] = this.testsDay; + data['purchasingPrice'] = this.purchasingPrice; + data['nbv'] = this.nbv; + data['currency'] = this.currency; + data['poNo'] = this.poNo; + data['invoiceNumber'] = this.invoiceNumber; + data['invoiceDate'] = this.invoiceDate; + data['replacementDate'] = this.replacementDate; + if (this.originDepartment != null) { + data['originDepartment'] = this.originDepartment.toJson(); + } + if (this.originSite != null) { + data['originSite'] = this.originSite.toJson(); + } + data['budgetYear'] = this.budgetYear; + data['lastPOPrice'] = this.lastPOPrice; + data['commissioningStatus'] = this.commissioningStatus; + data['productionDate'] = this.productionDate; + data['edd'] = this.edd; + data['technicalInspectionDate'] = this.technicalInspectionDate; + data['deliveryInspectionDate'] = this.deliveryInspectionDate; + data['endUserAcceptanceDate'] = this.endUserAcceptanceDate; + data['receivingCommittee'] = this.receivingCommittee; + data['siteWarrantyMonths'] = this.siteWarrantyMonths; + data['extendedWarrantyMonths'] = this.extendedWarrantyMonths; + data['remainderWarrantyMonths'] = this.remainderWarrantyMonths; + data['eomWarrantyMonthsNo'] = this.eomWarrantyMonthsNo; + data['warrantyValue'] = this.warrantyValue; + data['warrantyEndDate'] = this.warrantyEndDate; + data['warrantyContractConditions'] = this.warrantyContractConditions; + if (this.technicalGuidanceBooks != null) { + data['technicalGuidanceBooks'] = this.technicalGuidanceBooks.map((v) => v.toJson()).toList(); + } + data['comment'] = this.comment; + data['tagCode'] = this.tagCode; + return data; + } +} + +class ModelDefinition { + int id; + String assetName; + String modelDefCode; + String modelName; + int manufacturerId; + String manufacturerName; + String supplierName; + String replacementDate; + int lifeSpan; + List modelDefRelatedDefects; + List suppliers; + + ModelDefinition( + {this.id, + this.assetName, + this.modelDefCode, + this.modelName, + this.manufacturerId, + this.manufacturerName, + this.supplierName, + this.replacementDate, + this.lifeSpan, + this.modelDefRelatedDefects, + this.suppliers}); + + ModelDefinition.fromJson(Map json) { + id = json['id']; + assetName = json['assetName']; + modelDefCode = json['modelDefCode']; + modelName = json['modelName']; + manufacturerId = json['manufacturerId']; + manufacturerName = json['manufacturerName']; + supplierName = json['supplierName']; + replacementDate = json['replacementDate']; + lifeSpan = json['lifeSpan']; + if (json['modelDefRelatedDefects'] != null) { + modelDefRelatedDefects = []; + json['modelDefRelatedDefects'].forEach((v) { + modelDefRelatedDefects.add(new ModelDefRelatedDefects.fromJson(v)); + }); + } + if (json['suppliers'] != null) { + suppliers = []; + json['suppliers'].forEach((v) { + // suppliers!.add(new Null.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['assetName'] = this.assetName; + data['modelDefCode'] = this.modelDefCode; + data['modelName'] = this.modelName; + data['manufacturerId'] = this.manufacturerId; + data['manufacturerName'] = this.manufacturerName; + data['supplierName'] = this.supplierName; + data['replacementDate'] = this.replacementDate; + data['lifeSpan'] = this.lifeSpan; + if (this.modelDefRelatedDefects != null) { + data['modelDefRelatedDefects'] = this.modelDefRelatedDefects.map((v) => v.toJson()).toList(); + } + if (this.suppliers != null) { + data['suppliers'] = this.suppliers.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class ModelDefRelatedDefects { + int id; + String defectName; + String workPerformed; + String estimatedTime; + + ModelDefRelatedDefects({this.id, this.defectName, this.workPerformed, this.estimatedTime}); + + ModelDefRelatedDefects.fromJson(Map json) { + id = json['id']; + defectName = json['defectName']; + workPerformed = json['workPerformed']; + estimatedTime = json['estimatedTime']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['defectName'] = this.defectName; + data['workPerformed'] = this.workPerformed; + data['estimatedTime'] = this.estimatedTime; + return data; + } +} + +class Site { + int id; + int customerCode; + String custName; + List buildings; + + Site({this.id, this.customerCode, this.custName, this.buildings}); + + Site.fromJson(Map json) { + id = json['id']; + customerCode = json['customerCode']; + custName = json['custName']; + if (json['buildings'] != null) { + buildings = []; + json['buildings'].forEach((v) { + // buildings!.add(new Null.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['customerCode'] = this.customerCode; + data['custName'] = this.custName; + if (this.buildings != null) { + data['buildings'] = this.buildings.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class Department { + int id; + String departmentName; + String departmentCode; + String ntCode; + + Department({this.id, this.departmentName, this.departmentCode, this.ntCode}); + + Department.fromJson(Map json) { + id = json['id']; + departmentName = json['departmentName']; + departmentCode = json['departmentCode']; + ntCode = json['ntCode']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['departmentName'] = this.departmentName; + data['departmentCode'] = this.departmentCode; + data['ntCode'] = this.ntCode; + return data; + } +} + +class AssignedEmployee { + String id; + String name; + + AssignedEmployee({this.id, this.name}); + + AssignedEmployee.fromJson(Map json) { + id = json['id']; + name = json['name']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['name'] = this.name; + return data; + } +} + +class CallSiteContactPerson { + int id; + Null employeeCode; + String name; + String telephone; + String job; + String email; + Null land; + String contactUserId; + + CallSiteContactPerson({this.id, this.employeeCode, this.name, this.telephone, this.job, this.email, this.land, this.contactUserId}); + + CallSiteContactPerson.fromJson(Map json) { + id = json['id']; + employeeCode = json['employeeCode']; + name = json['name']; + telephone = json['telephone']; + job = json['job']; + email = json['email']; + land = json['land']; + contactUserId = json['contactUserId']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['employeeCode'] = this.employeeCode; + data['name'] = this.name; + data['telephone'] = this.telephone; + data['job'] = this.job; + data['email'] = this.email; + data['land'] = this.land; + data['contactUserId'] = this.contactUserId; + return data; + } +} + +class Status { + int id; + String name; + int value; + + Status({this.id, this.name, this.value}); + + Status.fromJson(Map json) { + id = json['id']; + name = json['name']; + value = json['value']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['name'] = this.name; + data['value'] = this.value; + return data; + } +} + +class Building { + int id; + String name; + int value; + var floor; + + Building({this.id, this.name, this.value,this.floor}); + + Building.fromJson(Map json) { + id = json['id']; + name = json['name']; + value = json['value']; + floor = json['floor']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['name'] = this.name; + data['value'] = this.value; + data['floor'] = this.floor; + return data; + } +} + diff --git a/lib/models/fault_description.dart b/lib/models/fault_description.dart index 02e67e92..ecc99f7f 100644 --- a/lib/models/fault_description.dart +++ b/lib/models/fault_description.dart @@ -12,11 +12,11 @@ class FaultDescription { estimatedTime = json['estimatedTime']; } num id; - dynamic defectName; + String defectName; String workPerformed; String estimatedTime; FaultDescription copyWith({ num id, - dynamic defectName, + String defectName, String workPerformed, String estimatedTime, }) => FaultDescription( id: id ?? this.id, diff --git a/lib/models/service_report.dart b/lib/models/service_report.dart index e5d5c09d..52dbfac8 100644 --- a/lib/models/service_report.dart +++ b/lib/models/service_report.dart @@ -145,7 +145,7 @@ class ServiceReport { if (visitDate == null) return false; //if(serviceType == null) return false; if (status == null) return false; - if (type == null && assetType == null) return false; + //if (type == null && assetType == null) return false; // if (engineer == null) return false; if (callLastSituation == null) return false; if (callLastSituation?.value == 12) { diff --git a/lib/models/service_request/search_work_order.dart b/lib/models/service_request/search_work_order.dart index a130fee0..713e9125 100644 --- a/lib/models/service_request/search_work_order.dart +++ b/lib/models/service_request/search_work_order.dart @@ -237,7 +237,7 @@ class Asset { String oldAsset; String isParent; String parentAsset; - String assetType; + int assetType; Site site; String building; String floor; diff --git a/lib/views/pages/user/requests/report/create_service_report.dart b/lib/views/pages/user/requests/report/create_service_report.dart index 2f4b2efe..1336ae07 100644 --- a/lib/views/pages/user/requests/report/create_service_report.dart +++ b/lib/views/pages/user/requests/report/create_service_report.dart @@ -11,6 +11,8 @@ import 'package:test_sa/controllers/providers/api/status_drop_down/report/servic import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/validator/validator.dart'; +import 'package:test_sa/models/call_request_for_work_order_model.dart'; +import 'package:test_sa/models/engineer.dart'; import 'package:test_sa/models/part.dart'; import 'package:test_sa/models/service_report.dart'; import 'package:test_sa/models/service_request/service_request.dart'; @@ -28,6 +30,7 @@ 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/parts/auto_complete_parts_field.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_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_status.dart'; @@ -74,6 +77,7 @@ class _CreateServiceReportState extends State with TickerPr parts: [], ); super.initState(); + // _isLoading = true; } @override @@ -83,14 +87,29 @@ class _CreateServiceReportState extends State with TickerPr super.dispose(); } + CallRequestForWorkOrder _callRequestForWorkOrder; + + void getRequestForWorkOrder() async { + _isLoading = true; + setState(() {}); + _callRequestForWorkOrder = await _serviceRequestsProvider.getCallRequestForWorkOrder(callId: widget.request.id); + _serviceReport.engineer = Engineer.fromJson(_callRequestForWorkOrder.assignedEmployee?.toJson()); + await _assetTypeProvider.getTypes(user: _userProvider.user, host: _settingProvider.host); + _isLoading = false; + setState(() {}); + } + @override Widget build(BuildContext context) { _userProvider = Provider.of(context); _settingProvider = Provider.of(context); _serviceRequestsProvider = Provider.of(context); _assetTypeProvider = Provider.of(context); + if (_callRequestForWorkOrder == null) { + getRequestForWorkOrder(); + } _serviceReport.assetType = _assetTypeProvider.statuses?.firstWhere( - (element) => element.value == widget.request?.device?.hospital?.id, + (element) => element.value == _callRequestForWorkOrder?.assetType, orElse: () => null, ); _subtitle = AppLocalization.of(context).subtitle; @@ -273,6 +292,7 @@ class _CreateServiceReportState extends State with TickerPr const SizedBox( height: 4, ), + LoadingManager( isLoading: _assetTypeProvider.isLoading, isFailedLoading: _assetTypeProvider.statuses == null, @@ -281,7 +301,7 @@ class _CreateServiceReportState extends State with TickerPr _assetTypeProvider.reset(); await _assetTypeProvider.getTypes(user: _userProvider.user, host: _settingProvider.host); _serviceReport?.assetType = _assetTypeProvider.statuses?.firstWhere( - (element) => element.value == widget.request?.device?.hospital?.id, + (element) => element.value == _callRequestForWorkOrder.assetType, orElse: () => null, ); }, @@ -589,9 +609,9 @@ class _CreateServiceReportState extends State with TickerPr // _serviceReport.engineer = engineer; // }, // ), - // const SizedBox( - // height: 8, - // ), + const SizedBox( + height: 8, + ), // invoice number & code _serviceReport.callLastSituation?.id != 12 ? const SizedBox.shrink() @@ -674,37 +694,39 @@ class _CreateServiceReportState extends State with TickerPr const SizedBox( height: 8, ), - // Row( - // children: [ - // ASubTitle(_subtitle.workPreformed), - // Expanded( - // child: SizedBox( - // height: 32 * AppStyle.getScaleFactor(context), - // child: SpeechToTextButton( - // controller: _workPreformedController, - // mini: true, - // ), - // ), - // ), - // ], - // ), - // const SizedBox( - // height: 4, - // ), - // ATextFormField( - // initialValue: _serviceReport?.workPreformed, - // textAlign: TextAlign.center, - // controller: _workPreformedController, - // style: Theme.of(context).textTheme.subtitle1, - // validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, - // textInputType: TextInputType.multiline, - // onSaved: (value) { - // _serviceReport.workPreformed = value; - // }, - // ), - // const SizedBox( - // height: 8, - // ), + Row( + children: [ + ASubTitle(_subtitle.workPreformed), + // Expanded( + // child: SizedBox( + // height: 32 * AppStyle.getScaleFactor(context), + // child: SpeechToTextButton( + // controller: _workPreformedController, + // mini: true, + // ), + // ), + // ), + ], + ), + const SizedBox( + height: 4, + ), + ATextFormField( + initialValue: _serviceReport?.workPreformed, + textAlign: TextAlign.center, + enable: false, + hintText: _serviceReport.faultDescription?.workPerformed ?? "", + controller: _workPreformedController, + style: Theme.of(context).textTheme.subtitle1, + validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, + textInputType: TextInputType.multiline, + onSaved: (value) { + _serviceReport.workPreformed = value; + }, + ), + const SizedBox( + height: 8, + ), const SizedBox(height: 8), Row( diff --git a/lib/views/widgets/status/report/fault_desc_menu.dart b/lib/views/widgets/status/report/fault_desc_menu.dart index 4d9e2aed..9250c7dd 100644 --- a/lib/views/widgets/status/report/fault_desc_menu.dart +++ b/lib/views/widgets/status/report/fault_desc_menu.dart @@ -94,7 +94,7 @@ class _SingleStatusMenuState extends State { return DropdownMenuItem( value: value, child: Text( - value.defectName, + value.defectName ?? "", style: Theme.of(context).textTheme.subtitle1.copyWith( color: Theme.of(context).primaryColor, fontSize: 11, diff --git a/lib/views/widgets/status/report/service_report_fault_description.dart b/lib/views/widgets/status/report/service_report_fault_description.dart index 9b0d851f..544fcbb3 100644 --- a/lib/views/widgets/status/report/service_report_fault_description.dart +++ b/lib/views/widgets/status/report/service_report_fault_description.dart @@ -26,7 +26,7 @@ class ServiceReportFaultDescription extends StatelessWidget { stateCode: menuProvider.stateCode, onRefresh: () async { menuProvider.reset(); - await menuProvider.getData(user: userProvider.user, host: settingProvider.host, requestId: requestId); + await menuProvider.getCallRequestForWorkOrder(user: userProvider.user, host: settingProvider.host, requestId: requestId); }, child: (menuProvider.items?.isEmpty ?? true) ? const ATextFormField( From 79d987d49e2ec0594db58402c9c4b0c302364e6d Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Tue, 6 Jun 2023 17:12:05 +0300 Subject: [PATCH 11/13] improvement --- .../report/create_service_report.dart | 100 +----------------- 1 file changed, 5 insertions(+), 95 deletions(-) diff --git a/lib/views/pages/user/requests/report/create_service_report.dart b/lib/views/pages/user/requests/report/create_service_report.dart index 1336ae07..76cbe43a 100644 --- a/lib/views/pages/user/requests/report/create_service_report.dart +++ b/lib/views/pages/user/requests/report/create_service_report.dart @@ -194,6 +194,7 @@ class _CreateServiceReportState extends State with TickerPr ]), child: Column( mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, children: [ // Report type and Reasons Row( @@ -453,6 +454,7 @@ class _CreateServiceReportState extends State with TickerPr ), ], ), + const SizedBox(height: 8), ASubTitle(_subtitle.workingHours), const SizedBox(height: 4), ATextFormField( @@ -498,80 +500,9 @@ class _CreateServiceReportState extends State with TickerPr ], ), ), - const SizedBox( - height: 8, - ), + // Report status and Service Type - Row( - children: [ - // report status - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(_subtitle.reportStatus), - _validate && _serviceReport.status == null - ? ASubTitle( - _subtitle.requiredWord, - color: Colors.red, - ) - : const SizedBox.shrink(), - const SizedBox( - height: 4, - ), - ServiceReportStatusMenu( - report: _serviceReport, - request: widget.request, - onSelect: (status) { - _serviceReport.status = status; - _showCommentField = _serviceReport.status?.name == "Resolved"; - setState(() {}); - }, - ), - ], - ), - ), - const SizedBox( - width: 8, - ), - // Provider.of(context).isLoading == null - // ? const SizedBox.shrink(): - // Call's last Situation - Consumer( - builder: (_, provider, __) { - if (provider.isLoading == null) return const SizedBox.shrink(); - return Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(_subtitle.callLastSituation), - _validate && _serviceReport.callLastSituation == null - ? ASubTitle( - _subtitle.requiredWord, - color: Colors.red, - ) - : const SizedBox.shrink(), - const SizedBox( - height: 4, - ), - ServiceReportLastCallsMenu( - report: _serviceReport, - onSelect: (status) { - if (status?.value == 12 || _serviceReport.callLastSituation?.value == 12) { - _serviceReport.callLastSituation = status; - setState(() {}); - } else { - _serviceReport.callLastSituation = status; - } - }, - ), - ], - ), - ); - }, - ), - ], - ), + if (_showCommentField) const SizedBox( height: 8, @@ -590,28 +521,7 @@ class _CreateServiceReportState extends State with TickerPr SizedBox( height: 8 * AppStyle.getScaleFactor(context), ), - // const ASubTitle("Assigned Employee"), - // const SizedBox( - // height: 8, - // ), - // _validate && _serviceReport.engineer == null - // ? ASubTitle( - // _subtitle.requiredWord, - // color: Colors.red, - // ) - // : const SizedBox.shrink(), - // const SizedBox( - // height: 4, - // ), - // EngineersMenu( - // initialValue: _serviceReport.engineer, - // onSelect: (engineer) { - // _serviceReport.engineer = engineer; - // }, - // ), - const SizedBox( - height: 8, - ), + // invoice number & code _serviceReport.callLastSituation?.id != 12 ? const SizedBox.shrink() From 13c5b3891aca4c561e05a5e477d384c04cd08d6f Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Wed, 7 Jun 2023 08:41:24 +0300 Subject: [PATCH 12/13] equipment status added. --- .../api/service_requests_provider.dart | 2 +- ...vice_report_equipment_status_provider.dart | 75 ++++++++++++++++++ lib/main.dart | 2 + lib/models/service_report.dart | 10 +-- .../report/create_service_report.dart | 19 +++-- .../requests/report/edit_service_report.dart | 4 +- .../service_report_equipment_status.dart | 76 +++++++++++++++++++ .../status/report/service_report_status.dart | 4 +- 8 files changed, 177 insertions(+), 15 deletions(-) create mode 100644 lib/controllers/providers/api/status_drop_down/report/service_report_equipment_status_provider.dart create mode 100644 lib/views/widgets/status/report/service_report_equipment_status.dart diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index 628cb254..a044543d 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -336,7 +336,7 @@ class ServiceRequestsProvider extends ChangeNotifier { "reviewComment": report.reviewComment ?? "", "comment": report.comment, "attachmentsWorkOrder": request.devicePhotos?.map((e) => {"name": e})?.toList(), - "equipmentStatus": report.status?.toMap(), + "equipmentStatus": report.equipmentStatus?.toMap(), "suppEngineerWorkOrders": null, "engSignature": report.signatureEngineer, "nurseSignature": report.signatureNurse, diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_equipment_status_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_equipment_status_provider.dart new file mode 100644 index 00000000..82ac1f49 --- /dev/null +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_equipment_status_provider.dart @@ -0,0 +1,75 @@ +import 'dart:convert'; + +import 'package:test_sa/controllers/api_routes/api_manager.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/user.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/user.dart'; + +class ServiceReportEquipmentStatusProvider extends ChangeNotifier { + //reset provider data + void reset() { + _status = null; + _stateCode = null; + } + + // state code of current request to defied error message + // like 400 customer request failed + // 500 service not available + int _stateCode; + + int get stateCode => _stateCode; + + // contain user data + // when user not login or register _user = null + List _status; + + List get statuses => _status; + + // when categories in-process _loading = true + // done _loading = true + // failed _loading = false + bool _loading; + + bool get isLoading => _loading; + + set isLoading(bool isLoading) { + _loading = isLoading; + notifyListeners(); + } + + /// return -2 if request in progress + /// return -1 if error happen when sending request + /// return state code if request complete may be 200, 404 or 403 + /// for more details check http state manager + /// lib\controllers\http_status_manger\http_status_manger.dart + Future getTypes({String host, User user}) async { + if (_loading == true) return -2; + _loading = true; + notifyListeners(); + Response response; + try { + response = await ApiManager.instance.get(URLs.equipmentStatus); + + _stateCode = response.statusCode; + if (response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List categoriesListJson = json.decode(response.body)["data"]; + _status = categoriesListJson.map((type) => Lookup.fromJson(type)).toList(); + } + _loading = false; + notifyListeners(); + return response.statusCode; + } catch (error) { + _loading = false; + _stateCode = -1; + notifyListeners(); + return -1; + } + } +} diff --git a/lib/main.dart b/lib/main.dart index 56bcee8c..3d85f355 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -22,6 +22,7 @@ import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/ga import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_equipment_status_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_first_action_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_loan_availability_provider.dart'; @@ -96,6 +97,7 @@ class MyApp extends StatelessWidget { ChangeNotifierProvider(create: (_) => PartsProvider()), ChangeNotifierProvider(create: (_) => ServiceReportReasonsProvider()), ChangeNotifierProvider(create: (_) => ServiceReportStatusProvider()), + ChangeNotifierProvider(create: (_) => ServiceReportEquipmentStatusProvider()), ChangeNotifierProvider(create: (_) => ServiceReportTypesProvider()), ChangeNotifierProvider(create: (_) => ServiceStatusProvider()), ChangeNotifierProvider(create: (_) => ServiceReportLastCallsProvider()), diff --git a/lib/models/service_report.dart b/lib/models/service_report.dart index 52dbfac8..3b681d2a 100644 --- a/lib/models/service_report.dart +++ b/lib/models/service_report.dart @@ -19,7 +19,7 @@ class ServiceReport { Lookup callLastSituation; Lookup repairLocation; Engineer engineer; - Lookup status; + Lookup equipmentStatus; Lookup type; Lookup reason; int faultDescriptionId; @@ -49,7 +49,7 @@ class ServiceReport { this.visitDate, this.endDate, this.assetType, - this.status, + this.equipmentStatus, this.type, this.faultDescriptionId, //this.workHours, @@ -83,7 +83,7 @@ class ServiceReport { if (id != null) _map["id"] = id; if (visitDate != null) _map["visitDate"] = visitDate.toIso8601String(); //if(serviceType != null) _map["service_type"] = serviceType.id.toString(); - if (status != null) _map["status"] = status?.toMap(); + if (equipmentStatus != null) _map["status"] = equipmentStatus?.toMap(); if (type != null) _map["typeOfWO"] = type?.toMap(); if (assetType != null) _map["TypeOfWO"] = assetType?.toMap(); //if(faultDescriptionId != null && faultDescriptionId.isNotEmpty) _map["fault_description"] = faultDescriptionId; @@ -144,7 +144,7 @@ class ServiceReport { bool validate() { if (visitDate == null) return false; //if(serviceType == null) return false; - if (status == null) return false; + if (equipmentStatus == null) return false; //if (type == null && assetType == null) return false; // if (engineer == null) return false; if (callLastSituation == null) return false; @@ -175,7 +175,7 @@ class ServiceReport { assetType: Lookup.fromJson(parsedJson["assetType"]), callLastSituation: Lookup.fromJson(parsedJson["calllastSituation"]), reason: Lookup.fromJson(parsedJson["reason"]), - status: Lookup.fromJson(parsedJson["status"]), + equipmentStatus: Lookup.fromJson(parsedJson["status"]), type: Lookup.fromJson(parsedJson["typeOfWO"]), faultDescriptionId: parsedJson["fault_description"], endDate: DateTime.tryParse(parsedJson["endofWorkTime"]), diff --git a/lib/views/pages/user/requests/report/create_service_report.dart b/lib/views/pages/user/requests/report/create_service_report.dart index 76cbe43a..ad6647e6 100644 --- a/lib/views/pages/user/requests/report/create_service_report.dart +++ b/lib/views/pages/user/requests/report/create_service_report.dart @@ -31,6 +31,7 @@ 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/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_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_status.dart'; @@ -330,8 +331,9 @@ class _CreateServiceReportState extends State with TickerPr child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - ASubTitle(_subtitle.reportStatus), - _validate && _serviceReport.status == null + // ASubTitle(_subtitle.reportStatus), + ASubTitle("Equipment Status"), + _validate && _serviceReport.equipmentStatus == null ? ASubTitle( _subtitle.requiredWord, color: Colors.red, @@ -340,13 +342,20 @@ class _CreateServiceReportState extends State with TickerPr const SizedBox( height: 4, ), - ServiceReportStatusMenu( + // ServiceReportStatusMenu( + // report: _serviceReport, + // request: widget.request, + // onSelect: (status) { + // _serviceReport.status = status; + // }, + // ), + ServiceReportEquipmentStatusMenu( report: _serviceReport, request: widget.request, onSelect: (status) { - _serviceReport.status = status; + _serviceReport.equipmentStatus = status; }, - ), + ) ], ), ), diff --git a/lib/views/pages/user/requests/report/edit_service_report.dart b/lib/views/pages/user/requests/report/edit_service_report.dart index e92f4c7c..848fc4f2 100644 --- a/lib/views/pages/user/requests/report/edit_service_report.dart +++ b/lib/views/pages/user/requests/report/edit_service_report.dart @@ -295,7 +295,7 @@ class _EditServiceReportState extends State with TickerProvid crossAxisAlignment: CrossAxisAlignment.start, children: [ ASubTitle(_subtitle.reportStatus), - _validate && _serviceReport.status == null + _validate && _serviceReport.equipmentStatus == null ? ASubTitle( _subtitle.requiredWord, color: Colors.red, @@ -308,7 +308,7 @@ class _EditServiceReportState extends State with TickerProvid report: _serviceReport, request: widget.request, onSelect: (status) { - _serviceReport.status = status; + _serviceReport.equipmentStatus = status; }, ), ], diff --git a/lib/views/widgets/status/report/service_report_equipment_status.dart b/lib/views/widgets/status/report/service_report_equipment_status.dart new file mode 100644 index 00000000..1a0382b1 --- /dev/null +++ b/lib/views/widgets/status/report/service_report_equipment_status.dart @@ -0,0 +1,76 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_equipment_status_provider.dart'; +import 'package:test_sa/controllers/providers/api/user_provider.dart'; +import 'package:test_sa/controllers/providers/settings/setting_provider.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/views/widgets/loaders/loading_manager.dart'; +import 'package:test_sa/views/widgets/status/single_status_menu.dart'; + +class ServiceReportEquipmentStatusMenu extends StatefulWidget { + final Function(Lookup) onSelect; + final ServiceReport report; + final ServiceRequest request; + + const ServiceReportEquipmentStatusMenu({Key key, this.onSelect, this.report, this.request}) : super(key: key); + + @override + State createState() => _ServiceReportEquipmentStatusMenuState(); +} + +class _ServiceReportEquipmentStatusMenuState extends State { + bool firstTime = true; + @override + Widget build(BuildContext context) { + SettingProvider settingProvider = Provider.of(context); + UserProvider userProvider = Provider.of(context); + ServiceReportEquipmentStatusProvider menuProvider = Provider.of(context); + ServiceReportLastCallsProvider callsLastSituationsProvider = Provider.of(context); + if (firstTime) { + callsLastSituationsProvider.reset(); + + firstTime = false; + } + return LoadingManager( + isLoading: menuProvider.isLoading == true || callsLastSituationsProvider.isLoading == true, + isFailedLoading: menuProvider.statuses == null || callsLastSituationsProvider.calls == null, + stateCode: menuProvider.stateCode == null || callsLastSituationsProvider.stateCode == null ? null : max(menuProvider.stateCode ?? 0, callsLastSituationsProvider.stateCode ?? 0), + onRefresh: () async { + await callsLastSituationsProvider.getCalls( + user: userProvider.user, + host: settingProvider.host, + serviceStatus: widget.report.equipmentStatus?.id, + typeName: widget.report.type?.name, + id: widget.report.id, + woId: widget.request.id, + ); + if (menuProvider.stateCode == null) { + menuProvider.reset(); + await menuProvider.getTypes(user: userProvider.user, host: settingProvider.host); + setState(() {}); + } + }, + child: SingleStatusMenu( + statuses: menuProvider.statuses, + initialStatus: widget.report.equipmentStatus, + onSelect: (status) { + widget.report.callLastSituation = null; + callsLastSituationsProvider.getCalls( + user: userProvider.user, + host: settingProvider.host, + serviceStatus: status.id, + id: widget.report.id, + woId: widget.request.id, + typeName: widget.report.type?.name, + ); + + widget.onSelect(status); + }, + )); + } +} diff --git a/lib/views/widgets/status/report/service_report_status.dart b/lib/views/widgets/status/report/service_report_status.dart index 5d3f797a..b21057cb 100644 --- a/lib/views/widgets/status/report/service_report_status.dart +++ b/lib/views/widgets/status/report/service_report_status.dart @@ -44,7 +44,7 @@ class _ServiceReportStatusMenuState extends State { await callsLastSituationsProvider.getCalls( user: userProvider.user, host: settingProvider.host, - serviceStatus: widget.report.status?.id, + serviceStatus: widget.report.equipmentStatus?.id, typeName: widget.report.type?.name, id: widget.report.id, woId: widget.request.id, @@ -57,7 +57,7 @@ class _ServiceReportStatusMenuState extends State { }, child: SingleStatusMenu( statuses: menuProvider.statuses, - initialStatus: widget.report.status, + initialStatus: widget.report.equipmentStatus, onSelect: (status) { widget.report.callLastSituation = null; callsLastSituationsProvider.getCalls( From 333c684670090c32903001615b0ad28dbfdaae35 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Wed, 7 Jun 2023 16:59:48 +0300 Subject: [PATCH 13/13] improvements --- .../providers/api/device_transfer_provider.dart | 2 +- lib/controllers/providers/api/gas_refill_provider.dart | 3 ++- lib/controllers/providers/api/hospitals_provider.dart | 2 +- lib/controllers/providers/api/notifications_provider.dart | 2 +- lib/controllers/providers/api/parts_provider.dart | 2 +- lib/views/pages/user/visits/pantry/edit_pentry.dart | 8 ++++---- 6 files changed, 10 insertions(+), 9 deletions(-) diff --git a/lib/controllers/providers/api/device_transfer_provider.dart b/lib/controllers/providers/api/device_transfer_provider.dart index f3cd3a46..b0140531 100644 --- a/lib/controllers/providers/api/device_transfer_provider.dart +++ b/lib/controllers/providers/api/device_transfer_provider.dart @@ -10,7 +10,7 @@ import 'package:test_sa/models/user.dart'; class DeviceTransferProvider extends ChangeNotifier { // number of items call in each request - final pageItemNumber = 50; + final pageItemNumber = 12; //reset provider data void reset() { diff --git a/lib/controllers/providers/api/gas_refill_provider.dart b/lib/controllers/providers/api/gas_refill_provider.dart index ef9beedf..c293bf75 100644 --- a/lib/controllers/providers/api/gas_refill_provider.dart +++ b/lib/controllers/providers/api/gas_refill_provider.dart @@ -9,7 +9,7 @@ import 'package:test_sa/models/user.dart'; class GasRefillProvider extends ChangeNotifier { // number of items call in each request - final pageItemNumber = 50; + final pageItemNumber = 12; //reset provider data void reset() { @@ -50,6 +50,7 @@ class GasRefillProvider extends ChangeNotifier { Map body = {}; body["pageNumber"] = (items?.length ?? 0) ~/ pageItemNumber + 1; body["pageSize"] = pageItemNumber; + print("url:${ URLs.getGasRefill}:body:$body"); response = await ApiManager.instance.post( URLs.getGasRefill, diff --git a/lib/controllers/providers/api/hospitals_provider.dart b/lib/controllers/providers/api/hospitals_provider.dart index 9a54490c..38c1f1aa 100644 --- a/lib/controllers/providers/api/hospitals_provider.dart +++ b/lib/controllers/providers/api/hospitals_provider.dart @@ -10,7 +10,7 @@ import 'package:test_sa/models/user.dart'; class HospitalsProvider extends ChangeNotifier { // number of items call in each request - final pageItemNumber = 50; + final pageItemNumber = 12; //reset provider data void reset() { diff --git a/lib/controllers/providers/api/notifications_provider.dart b/lib/controllers/providers/api/notifications_provider.dart index 05ec6738..b7683ab5 100644 --- a/lib/controllers/providers/api/notifications_provider.dart +++ b/lib/controllers/providers/api/notifications_provider.dart @@ -8,7 +8,7 @@ import 'package:test_sa/models/user.dart'; class NotificationsProvider extends ChangeNotifier { // number of items call in each request - final pageItemNumber = 20; + final pageItemNumber = 12; //reset provider data void reset() { diff --git a/lib/controllers/providers/api/parts_provider.dart b/lib/controllers/providers/api/parts_provider.dart index 7f8cca4f..c0ae098c 100644 --- a/lib/controllers/providers/api/parts_provider.dart +++ b/lib/controllers/providers/api/parts_provider.dart @@ -10,7 +10,7 @@ import 'package:test_sa/models/user.dart'; class PartsProvider extends ChangeNotifier { // number of items call in each request - final pageItemNumber = 50; + final pageItemNumber = 20; //reset provider data void reset() { diff --git a/lib/views/pages/user/visits/pantry/edit_pentry.dart b/lib/views/pages/user/visits/pantry/edit_pentry.dart index d0df5e34..55d356b9 100644 --- a/lib/views/pages/user/visits/pantry/edit_pentry.dart +++ b/lib/views/pages/user/visits/pantry/edit_pentry.dart @@ -73,7 +73,7 @@ class _EditPentryState extends State with SingleTickerProviderStateM if (_pentry.pmKits.isEmpty) _pentry.pmKits.add(PMKit()); if (_pentry.calibrationTools.isEmpty) _pentry.calibrationTools.add(CalibrationTool()); if (_pentry.ppmCheckLists.isEmpty) _pentry.ppmCheckLists.add(PPMCheckList()); - _tabController = TabController(length: 4, vsync: this); + _tabController = TabController(length: 3, vsync: this); super.initState(); } @@ -113,9 +113,9 @@ class _EditPentryState extends State with SingleTickerProviderStateM Tab( text: "PPM Check List", ), - Tab( - text: "Calibration Tools", - ), + // Tab( + // text: "Calibration Tools", + // ), Tab( text: "PK Kits", ),