From cd3d9e145524b42292b5daee31508824f8c38e06 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Tue, 14 Nov 2023 16:54:14 +0300 Subject: [PATCH 1/3] Working on create sub work order screen --- lib/l10n/app_ar.arb | 3 +- lib/l10n/app_en.arb | 3 +- .../create_sub_workorder_page.dart | 656 ++++++++++-------- .../sub_workorder/workorder_details.dart | 74 +- .../work_order/work_order_details_page.dart | 100 +-- 5 files changed, 454 insertions(+), 382 deletions(-) diff --git a/lib/l10n/app_ar.arb b/lib/l10n/app_ar.arb index 71101799..abaf7b6f 100644 --- a/lib/l10n/app_ar.arb +++ b/lib/l10n/app_ar.arb @@ -363,5 +363,6 @@ "trackAssetTransfer" : "تتبع نقل اجهزة", "total" : "مجموع", "allRequests" : "كل الطلبات", - "requestStatus" : "حالة الطلب" + "requestStatus" : "حالة الطلب", + "createSubWorkOrder" : "إنشاء أمر عمل فرعي" } \ No newline at end of file diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 7bade814..7eb486a1 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -365,5 +365,6 @@ "total" : "Total", "noDataFound" : "No Data Found", "allRequests" : "All Requests", - "requestStatus" : "Request Status" + "requestStatus" : "Request Status", + "createSubWorkOrder" : "Create Sub Work Order" } \ No newline at end of file diff --git a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart index ee6c3905..15e5bc3e 100644 --- a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart +++ b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart @@ -1,5 +1,4 @@ import 'dart:convert'; -import 'dart:developer'; import 'dart:io'; import 'package:flutter/material.dart'; @@ -9,29 +8,36 @@ import 'package:test_sa/controllers/providers/api/service_requests_provider.dart import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_assistants_employee_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_types_provider.dart'; import 'package:test_sa/extensions/context_extension.dart'; +import 'package:test_sa/extensions/int_extensions.dart'; +import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/service_request/search_work_order.dart'; import 'package:test_sa/models/service_request/service_report.dart'; -import 'package:test_sa/views/app_style/colors.dart'; -import 'package:test_sa/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart'; -import 'package:test_sa/views/pages/sub_workorder/work_order_details_bottom_sheet.dart'; -import 'package:test_sa/views/pages/sub_workorder/workorder_details.dart'; +import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; +import 'package:test_sa/new_views/common_widgets/default_app_bar.dart'; +import 'package:test_sa/providers/service_request_providers/equipment_status_provider.dart'; import 'package:test_sa/views/widgets/images/multi_image_picker.dart'; import 'package:test_sa/views/widgets/loaders/app_loading.dart'; -import 'package:test_sa/views/widgets/status/service_request/service_request_defect_types_mune.dart'; import '../../../attachment.dart'; import '../../../controllers/api_routes/http_status_manger.dart'; import '../../../controllers/providers/api/status_drop_down/report/service_report_fault_description_provider.dart'; +import '../../../models/service_request/spare_parts.dart'; +import '../../../models/service_request/supp_engineer_work_orders.dart'; +import '../../../models/service_request/supplier_details.dart'; import '../../../models/service_request/wo_call_request.dart'; -import '../../widgets/app_text_form_field.dart'; -import '../../widgets/buttons/app_back_button.dart'; -import '../../widgets/buttons/app_button.dart'; +import '../../../new_views/common_widgets/app_lazy_loading.dart'; +import '../../../new_views/common_widgets/app_text_form_field.dart'; +import '../../../new_views/common_widgets/single_item_drop_down_menu.dart'; +import '../../../providers/loading_list_notifier.dart'; +import '../../../providers/work_order/reason_provider.dart'; import '../../widgets/date_and_time/date_picker.dart'; -import '../../widgets/status/report/service_report_fault_description.dart'; -import '../../widgets/status/report/service_report_reasons.dart'; -import '../../widgets/titles/app_sub_title.dart'; +import '../../widgets/status/report/service_report_assistant_employee_menu.dart'; +import '../../widgets/status/report/service_report_last_call.dart'; +import '../../widgets/status/service_request/supplier_engineers_menu.dart'; +import '../../widgets/timer/app_timer.dart'; +import 'auto_generated_vendor_name.dart'; class CreateSubWorkOrderPage extends StatefulWidget { static const id = "/CreateSubWorkOrder"; @@ -46,11 +52,11 @@ class CreateSubWorkOrderPage extends StatefulWidget { class _CreateSubWorkOrderPageState extends State { final GlobalKey _formKey = GlobalKey(); SearchWorkOrder _subWorkOrders; - Lookup _serviceReportReason = Lookup(); ServiceReport _serviceReport; final List _files = []; bool _isLoading = false; - bool _validate = false; + bool _showVendorFields = false; + SuppEngineerWorkOrders engineer; @override void initState() { @@ -69,33 +75,36 @@ class _CreateSubWorkOrderPageState extends State { } } - var assetTypesProvider; + ServiceStatusProvider assetTypesProvider; CallRequest _callRequestForWorkOrder; Future getAssetType() async { - //if (assetTypesProvider == null) { final serviceRequestProvider = Provider.of(context); Provider.of(context, listen: false).reset(); assetTypesProvider = Provider.of(context, listen: false); _callRequestForWorkOrder = await serviceRequestProvider.getCallRequestForWorkOrder(callId: widget.workOrder.callRequest.id.toString()); if (_subWorkOrders?.parentWOId != null) { - print(_subWorkOrders?.parentWOId.toString()); final subWoDetails = await serviceRequestProvider.getSubWorkOrderDetails(parentId: _subWorkOrders?.parentWOId.toString()); _subWorkOrders.copyDetails(subWoDetails); _serviceReport.equipmentStatus = subWoDetails.equipmentStatus; _serviceReport.reason = subWoDetails.reason; - _serviceReport.faultDescription = subWoDetails.faultDescription; - _serviceReportReason = _subWorkOrders.reason; + // _serviceReport.faultDescription = subWoDetails.faultDescription; } await assetTypesProvider.getTypes(); _subWorkOrders?.assetType = assetTypesProvider.statuses?.firstWhere( (element) => element.value == _callRequestForWorkOrder?.assetType, orElse: () => null, ); + if (checkVendorFieldsVisibility(_subWorkOrders.calllastSituation)) { + if (_subWorkOrders.suppEngineerWorkOrders?.isNotEmpty ?? false) { + engineer = _subWorkOrders.suppEngineerWorkOrders?.last; + engineer?.id = engineer?.supplierContactId; + } + _subWorkOrders.supplier ??= SupplierDetails(id: _subWorkOrders?.supplier?.id); + } setState(() { _isLoading = false; }); - //} } @override @@ -105,6 +114,7 @@ class _CreateSubWorkOrderPageState extends State { } return Scaffold( + appBar: DefaultAppBar(title: context.translation.createSubWorkOrder), body: SafeArea( child: _isLoading ? const ALoading() @@ -114,283 +124,373 @@ class _CreateSubWorkOrderPageState extends State { child: Form( key: _formKey, child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - Container( - color: AColors.primaryColor, - padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4), + Card( child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - Row( - children: [ - const ABackButton(), - Expanded( - child: Center( - child: Text( - "New Sub Work Order", - style: Theme.of(context).textTheme.titleLarge.copyWith(color: AColors.white, fontStyle: FontStyle.italic), - ), - ), - ), - const SizedBox( - width: 48, - ) - ], - ), + (widget.workOrder?.callRequest?.asset?.site?.name ?? "").heading5(context), + 8.height, + "${context.translation.assetNo}: ${widget.workOrder?.callRequest?.asset?.assetNumber ?? ""}".bodyText(context), + "${context.translation.callId}: ${widget.workOrder?.callRequest?.id}".bodyText(context), ], - ), + ).paddingAll(16), ), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 16), - child: Column( - children: [ - WorkOrderDetails(item: widget.workOrder, assetType: _subWorkOrders?.assetType), - const SizedBox(height: 8), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const ASubTitle("Equipment status"), - if (_validate && _subWorkOrders?.equipmentStatus == null) - ASubTitle( - context.translation.requiredWord, - color: Colors.red, - ), - const SizedBox( - height: 4, - ), - ServiceRequestDefectTypesMenu( - initialValue: _serviceReport.equipmentStatus, - onSelect: (status) { - _subWorkOrders.equipmentStatus = status; - _serviceReport.equipmentStatus = status; - setState(() {}); - }, - ), - ], - ), - const SizedBox(height: 8), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const ASubTitle("Return to Service"), - // if (_validate && _subWorkOrders.visitDate == null) - // ASubTitle( - // context.translation.requiredWord, - // color: Colors.red, - // ), - const SizedBox( - height: 4, - ), - Row( - children: [ - Expanded( - child: ADatePicker( - date: DateTime.tryParse(_subWorkOrders.visitDate ?? ""), - from: DateTime(1950), - onDatePicker: (date) { - _subWorkOrders.visitDate = date?.toIso8601String(); - setState(() {}); - }, - ), - ), - ], - ), - ], - ), - const SizedBox(height: 8), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle("Failure ${context.translation.reasons}"), - if (_validate && _subWorkOrders.reason == null) - ASubTitle( - context.translation.requiredWord, - color: Colors.red, - ), - const SizedBox( - height: 4, - ), - ServiceReportReasonsMenu( - initialValue: _serviceReportReason, - onSelect: (status) { - _serviceReportReason = status; - _subWorkOrders.reason = status; - // setState(() {}); - }, - ), - ], - ), - const SizedBox(height: 8), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(context.translation.faultDescription), - if (_validate && _subWorkOrders.faultDescription == null) - ASubTitle( - context.translation.requiredWord, - color: Colors.red, - ), - const SizedBox( - height: 4, - ), - ServiceReportFaultDescription( - requestId: widget.workOrder?.callRequest?.id?.toString(), - initialValue: _subWorkOrders?.faultDescription, - onSelect: (status) { - _subWorkOrders.faultDescription = status; - if (mounted) setState(() {}); - }, - ), - ], - ), - const SizedBox(height: 8), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const ASubTitle("Solution"), - const SizedBox(height: 4), - ATextFormField(labelText: _subWorkOrders?.faultDescription?.workPerformed ?? "", textInputType: TextInputType.multiline, enable: false), - ], - ), - const SizedBox(height: 8), - MultiFilesPicker(label: "Attachments", files: _files), - const SizedBox(height: 8), - InkWell( - onTap: () async { - await showModalBottomSheet( - context: context, - useSafeArea: true, - isScrollControlled: true, - backgroundColor: Colors.transparent, - builder: (context) => WorkOrderDetailsBottomSheet( - subWorkOrder: _subWorkOrders, - assetId: widget.workOrder?.callRequest?.asset?.id, - ), - ); - //log(_subWorkOrders?.toJson()?.toString()); - }, - child: Card( - child: ListTile( - title: Row( - children: [ - Text( - "WO Details", - style: Theme.of(context).textTheme.bodyMedium, - ), - const Text("*", style: TextStyle(color: Colors.red)), - ], - ), - trailing: const Icon(Icons.arrow_forward_ios, size: 14, color: AColors.primaryColor), - ), - ), - ), - const SizedBox(height: 8), - InkWell( - onTap: () async { - await showModalBottomSheet( - context: context, - useSafeArea: true, - isScrollControlled: true, - backgroundColor: Colors.transparent, - builder: (context) => SparePartsBottomSheet( - subWorkOrder: _subWorkOrders, - assetId: widget.workOrder?.callRequest?.asset?.id, - ), - ); - log(_subWorkOrders?.toJson()?.toString()); - }, - child: Card( - child: ListTile( - title: Row( - children: [ - Text( - "Spare Parts", - style: Theme.of(context).textTheme.bodyMedium, - ), - const Text("*", style: TextStyle(color: Colors.red)), - ], - ), - trailing: const Icon(Icons.arrow_forward_ios, size: 14, color: AColors.primaryColor), - ), - ), - ), - // AMiniOneFilePicker( - // file: _file, - // onPick: (file) { - // _file = file; - // _subWorkOrders.attachmentsWorkOrder ??= []; - // _subWorkOrders.attachmentsWorkOrder.add(AttachmentsWorkOrder(name: "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}")); - // }, - // ), - const SizedBox(height: 50), - ], + // WorkOrderDetails(item: widget.workOrder, assetType: _subWorkOrders?.assetType), + 8.height, + ADatePicker( + label: context.translation.visitDate, + date: DateTime.tryParse(_subWorkOrders.visitDate ?? ""), + onDatePicker: (date) { + _subWorkOrders.visitDate = date?.toIso8601String(); + setState(() {}); + }, + ), + 8.height, + AppTimer( + label: context.translation.workingHours, + timer: _subWorkOrders.timer, + enabled: _subWorkOrders?.timer?.endAt == null, + onChange: (timer) async { + _subWorkOrders.timer = timer; + return true; + }, + ), + 8.height, + SingleItemDropDownMenu( + context: context, + title: context.translation.reason, + initialValue: _subWorkOrders.reason, + onSelect: (value) { + _subWorkOrders.reason = value; + }, + ), + 8.height, + SingleItemDropDownMenu( + context: context, + title: context.translation.equipmentStatus, + initialValue: _subWorkOrders.equipmentStatus, + onSelect: (value) { + _subWorkOrders.equipmentStatus = value; + }, + ), + 8.height, + ServiceReportLastCallsMenu( + report: _serviceReport, + title: context.translation.callLastSituation, + parentId: widget.workOrder?.callRequest?.id?.toString(), + onSelect: (status) { + _serviceReport.calllastSituation = status; + if (checkVendorFieldsVisibility(status)) { + _subWorkOrders.supplier ??= SupplierDetails(id: _subWorkOrders?.supplier?.id); + engineer = null; + } + if (status?.value == 12 || _subWorkOrders.calllastSituation?.value == 12) { + _subWorkOrders.calllastSituation = status; + _subWorkOrders.mrNumber = null; + } else { + _subWorkOrders.calllastSituation = status; + } + setState(() {}); + }, + ), + if (_subWorkOrders.calllastSituation?.value == 12) + AppTextFormField( + labelText: "MR number", + initialValue: _subWorkOrders.mrNumber, + onSaved: (value) { + _subWorkOrders.mrNumber = value; + }, + ), + if (_showVendorFields) const SizedBox(height: 8), + if (_showVendorFields) + AutoGeneratedVendorName( + initialValue: _subWorkOrders.supplier?.suppliername, + onSearch: (supplier) { + _subWorkOrders.supplier.id = supplier.id; + _subWorkOrders.supplier.suppliername = supplier.suppliername; + _subWorkOrders.supplier.suppPersons = supplier.suppPersons; + setState(() {}); + }, + ), + if (_showVendorFields) const SizedBox(height: 8), + if (_showVendorFields) + SupplierEngineersMenu( + initialValue: engineer, + engineers: _subWorkOrders?.supplier?.suppPersons, + onSelect: (engineer) { + if (engineer != null) { + this.engineer = engineer; + } + }, ), + 8.height, + ServiceReportAssistantEmployeeMenu( + title: context.translation.assignAssistant, + assetId: widget.workOrder?.callRequest?.asset?.id, + initialValue: (_subWorkOrders.assistantEmployees?.isNotEmpty ?? false) ? _subWorkOrders.assistantEmployees?.first : null, + onSelect: (employee) { + _subWorkOrders.assistantEmployees = [employee.copyWith(id: 0)]; + }, ), + 8.height, + SingleItemDropDownMenu( + context: context, + title: context.translation.partNo, + staticData: _subWorkOrders.sparePartsWorkOrders.map((e) => e.sparePart).toList(), + initialValue: (_subWorkOrders.sparePartsWorkOrders?.isNotEmpty ?? false) ? _subWorkOrders.sparePartsWorkOrders.first.sparePart : null, + onSelect: (part) { + _subWorkOrders.sparePartsWorkOrders.clear(); + _subWorkOrders.sparePartsWorkOrders.add(SparePartsWorkOrders(id: 0, sparePart: part, qty: 0)); + setState(() {}); + }, + ), + 8.height, + AppTextFormField( + labelText: context.translation.quantity, + textInputType: TextInputType.number, + enable: _subWorkOrders?.sparePartsWorkOrders?.isNotEmpty, + initialValue: (_subWorkOrders.sparePartsWorkOrders?.isNotEmpty ?? false) ? _subWorkOrders.sparePartsWorkOrders.first.qty?.toString() : null, + onSaved: (text) { + if (_subWorkOrders.sparePartsWorkOrders?.isNotEmpty ?? false) { + _subWorkOrders.sparePartsWorkOrders.first.qty = num.tryParse(text ?? ""); + } + }, + ), + 8.height, + MultiFilesPicker(label: context.translation.attachImage, files: _files), + // 24.height, + // const SizedBox(height: 8), + // Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // const ASubTitle("Equipment status"), + // if (_validate && _subWorkOrders?.equipmentStatus == null) + // ASubTitle( + // context.translation.requiredWord, + // color: Colors.red, + // ), + // const SizedBox( + // height: 4, + // ), + // ServiceRequestDefectTypesMenu( + // initialValue: _serviceReport.equipmentStatus, + // onSelect: (status) { + // _subWorkOrders.equipmentStatus = status; + // _serviceReport.equipmentStatus = status; + // setState(() {}); + // }, + // ), + // ], + // ), + // const SizedBox(height: 8), + // // Column( + // // crossAxisAlignment: CrossAxisAlignment.start, + // // children: [ + // // const ASubTitle("Return to Service"), + // // // if (_validate && _subWorkOrders.visitDate == null) + // // // ASubTitle( + // // // context.translation.requiredWord, + // // // color: Colors.red, + // // // ), + // // const SizedBox( + // // height: 4, + // // ), + // // // Row( + // // // children: [ + // // // Expanded( + // // // child: ADatePicker( + // // // date: DateTime.tryParse(_subWorkOrders.visitDate ?? ""), + // // // from: DateTime(1950), + // // // onDatePicker: (date) { + // // // _subWorkOrders.visitDate = date?.toIso8601String(); + // // // setState(() {}); + // // // }, + // // // ), + // // // ), + // // // ], + // // // ), + // // ], + // // ), + // const SizedBox(height: 8), + // Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // ASubTitle(context.translation.faultDescription), + // if (_validate && _subWorkOrders.faultDescription == null) + // ASubTitle( + // context.translation.requiredWord, + // color: Colors.red, + // ), + // const SizedBox( + // height: 4, + // ), + // ServiceReportFaultDescription( + // requestId: widget.workOrder?.callRequest?.id?.toString(), + // initialValue: _subWorkOrders?.faultDescription, + // onSelect: (status) { + // _subWorkOrders.faultDescription = status; + // if (mounted) setState(() {}); + // }, + // ), + // ], + // ), + // const SizedBox(height: 8), + // Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // const ASubTitle("Solution"), + // const SizedBox(height: 4), + // ATextFormField(labelText: _subWorkOrders?.faultDescription?.workPerformed ?? "", textInputType: TextInputType.multiline, enable: false), + // ], + // ), + // InkWell( + // onTap: () async { + // await showModalBottomSheet( + // context: context, + // useSafeArea: true, + // isScrollControlled: true, + // backgroundColor: Colors.transparent, + // builder: (context) => WorkOrderDetailsBottomSheet( + // subWorkOrder: _subWorkOrders, + // assetId: widget.workOrder?.callRequest?.asset?.id, + // ), + // ); + // //log(_subWorkOrders?.toJson()?.toString()); + // }, + // child: Card( + // child: ListTile( + // title: Row( + // children: [ + // Text( + // "WO Details", + // style: Theme.of(context).textTheme.bodyMedium, + // ), + // const Text("*", style: TextStyle(color: Colors.red)), + // ], + // ), + // // trailing: const Icon(Icons.arrow_forward_ios, size: 14, color: AColors.primaryColor), + // ), + // ), + // ), + // const SizedBox(height: 8), + // InkWell( + // onTap: () async { + // await showModalBottomSheet( + // context: context, + // useSafeArea: true, + // isScrollControlled: true, + // backgroundColor: Colors.transparent, + // builder: (context) => SparePartsBottomSheet( + // subWorkOrder: _subWorkOrders, + // assetId: widget.workOrder?.callRequest?.asset?.id, + // ), + // ); + // log(_subWorkOrders?.toJson()?.toString()); + // }, + // child: Card( + // child: ListTile( + // title: Row( + // children: [ + // Text( + // "Spare Parts", + // style: Theme.of(context).textTheme.bodyMedium, + // ), + // const Text("*", style: TextStyle(color: Colors.red)), + // ], + // ), + // trailing: const Icon(Icons.arrow_forward_ios, size: 14, color: AColors.primaryColor), + // ), + // ), + // ), + // AMiniOneFilePicker( + // file: _file, + // onPick: (file) { + // _file = file; + // _subWorkOrders.attachmentsWorkOrder ??= []; + // _subWorkOrders.attachmentsWorkOrder.add(AttachmentsWorkOrder(name: "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}")); + // }, + // ), + // const SizedBox(height: 50), ], ), ), - ).expanded, - Padding( - padding: const EdgeInsets.all(16.0), - child: AButton( - text: context.translation.create, - onPressed: () async { - _validate = true; - setState(() {}); - if (validate()) { - if (_subWorkOrders.calllastSituation.value == 12 && (_subWorkOrders.sparePartsWorkOrders == null || _subWorkOrders.sparePartsWorkOrders.isEmpty)) { - await Fluttertoast.showToast(msg: "You have to add parts"); - return; - } - _subWorkOrders.attachmentsWorkOrder ??= []; - for (var file in _files) { - _subWorkOrders.attachmentsWorkOrder.add(Attachment(name: "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}")); - } - if (_subWorkOrders.timer?.startAt == null || _subWorkOrders.timer?.endAt == null) { - Fluttertoast.showToast(msg: "Working hours required"); - return; - } else if (_subWorkOrders.calllastSituation == null) { - Fluttertoast.showToast(msg: "${context.translation.callLastSituation} required"); - return; - } - _validate = false; - _isLoading = true; - setState(() {}); - if (_formKey.currentState?.validate() ?? false) {} - _formKey.currentState?.save(); - final serviceRequestsProvider = Provider.of(context, listen: false); - for (var element in (_subWorkOrders?.suppEngineerWorkOrders ?? [])) { - if (element != null) { - element.id = 0; - } - } - final status = await serviceRequestsProvider.createSubWorkOrder(workOrder: _subWorkOrders); - _isLoading = false; - setState(() {}); - if (status >= 200 && status < 300) { - Fluttertoast.showToast(msg: context.translation.successfulRequestMessage); - Navigator.of(context).pop(); - Navigator.of(context).pop(); - } else { - String errorMessage = HttpStatusManger.getStatusMessage(status: serviceRequestsProvider.stateCode, subtitle: context.translation); - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text(errorMessage), - )); + ).paddingAll(16).expanded, + AppFilledButton( + label: context.translation.submitRequest, + onPressed: () async { + setState(() {}); + if (await validate()) { + _subWorkOrders.suppEngineerWorkOrders ?? []; + if (engineer != null) _subWorkOrders.suppEngineerWorkOrders.add(engineer..id = 0); + _subWorkOrders.attachmentsWorkOrder ??= []; + for (var file in _files) { + _subWorkOrders.attachmentsWorkOrder.add(Attachment(id: 0, name: "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}")); + } + if (_formKey.currentState?.validate() ?? false) {} + _formKey.currentState?.save(); + final serviceRequestsProvider = Provider.of(context, listen: false); + for (var element in (_subWorkOrders?.suppEngineerWorkOrders ?? [])) { + if (element != null) { + element.id = 0; } } - }, - ), - ), + showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); + final status = await serviceRequestsProvider.createSubWorkOrder(workOrder: _subWorkOrders); + Navigator.of(context).pop(); + if (status >= 200 && status < 300) { + Fluttertoast.showToast(msg: context.translation.successfulRequestMessage); + Navigator.of(context).pop(); + } else { + String errorMessage = HttpStatusManger.getStatusMessage(status: serviceRequestsProvider.stateCode, subtitle: context.translation); + ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(errorMessage))); + } + } + }, + ).paddingAll(16), ], ), ), ); } - bool validate() { - if (_subWorkOrders.faultDescription == null || _subWorkOrders.reason == null || _subWorkOrders.equipmentStatus == null) { + bool checkVendorFieldsVisibility(Lookup callsLastSituation) { + bool result = (_subWorkOrders.supplier?.suppliername?.isNotEmpty ?? false) || + (callsLastSituation?.name?.toLowerCase()?.contains("under repair-vendor") ?? false) || + (callsLastSituation?.name?.toLowerCase()?.contains("waiting for vendor") ?? false); + setState(() { + _showVendorFields = result; + }); + return result; + } + + Future validate() async { + if (_subWorkOrders.reason == null) { + Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.reason}"); + return false; + } else if (_subWorkOrders.equipmentStatus == null) { + Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.equipmentStatus}"); + return false; + } else if (_subWorkOrders.calllastSituation == null) { + Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.callLastSituation}"); + return false; + } else if (_showVendorFields && (_subWorkOrders.supplier.suppliername == null || _subWorkOrders.supplier.suppliername.isEmpty)) { + await Fluttertoast.showToast(msg: "Vendor Name Field is Required"); + return false; + } else if (_showVendorFields && _subWorkOrders.suppEngineerWorkOrders == null) { + await Fluttertoast.showToast(msg: "Vendor Engineer Field is Required"); + return false; + } else if (_subWorkOrders.calllastSituation.value == 12 && (_subWorkOrders.sparePartsWorkOrders == null || _subWorkOrders.sparePartsWorkOrders.isEmpty)) { + Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.partNo}"); + return false; + } else if (_subWorkOrders?.timer?.startAt == null) { + await Fluttertoast.showToast(msg: "Working Hours Required"); + return false; + } else if (_subWorkOrders?.timer?.endAt == null) { + await Fluttertoast.showToast(msg: "Please Stop The Timer"); return false; - } else { - return true; } + return true; } } diff --git a/lib/views/pages/sub_workorder/workorder_details.dart b/lib/views/pages/sub_workorder/workorder_details.dart index 1f9a5b71..4c8eb6b6 100644 --- a/lib/views/pages/sub_workorder/workorder_details.dart +++ b/lib/views/pages/sub_workorder/workorder_details.dart @@ -1,80 +1,40 @@ import 'package:flutter/material.dart'; import 'package:test_sa/extensions/context_extension.dart'; +import 'package:test_sa/extensions/text_extensions.dart'; +import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/lookup.dart'; -import '../../../controllers/localization/localization.dart'; import '../../../models/service_request/search_work_order.dart'; -import '../../../models/subtitle.dart'; -import '../../app_style/colors.dart'; -import '../../app_style/sizing.dart'; class WorkOrderDetails extends StatelessWidget { final SearchWorkOrder item; - Lookup assetType; + final Lookup assetType; + + const WorkOrderDetails({@required this.item, this.assetType, Key key}) : super(key: key); - WorkOrderDetails({@required this.item, this.assetType, Key key}) : super(key: key); - @override Widget build(BuildContext context) { - return Column( children: [ - Container( - padding: EdgeInsets.all(10), - decoration: BoxDecoration( - color: AColors.inputFieldBackgroundColor, - border: Border.all( - color: Color(0xffefefef), - ), - borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), - // boxShadow: const [ - // AppStyle.boxShadow - // ] - ), - child: Column( - children: [ - _buildRow(context.translation.callId, item.callRequest?.id?.toString() ?? "", context), - _buildRow(context.translation.assetNumber, item.callRequest?.asset?.assetNumber ?? "", context), - _buildRow("WO No", item.workOrderNo, context), - _buildRow(context.translation.assetName, item.callRequest?.asset?.assetNumber ?? '', context), - _buildRow(context.translation.department, item.callRequest?.asset?.department ?? '', context), - _buildRow(context.translation.assetSN, item.callRequest?.asset?.assetSerialNo ?? '', context), - _buildRow(context.translation.model, item.callRequest?.asset?.modelDefinition?.modelName ?? "", context), - _buildRow("Manufacturer", item.callRequest?.asset?.modelDefinition?.manufacturerName ?? "", context), - _buildRow(context.translation.site, item.callRequest?.asset?.site?.custName ?? "", context), - ], - ), - ), - const SizedBox(height: 8), - Container( - padding: EdgeInsets.all(10), - height: 55, - decoration: BoxDecoration( - color: AColors.inputFieldBackgroundColor, - border: Border.all( - color: Color(0xffefefef), - ), - borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), - ), - child: _buildRow("Asset Type", assetType?.name ?? (item.assetType?.name ?? ""), context), - ) + _buildRow(context.translation.callId, item.callRequest?.id?.toString() ?? "", context), + _buildRow(context.translation.assetNumber, item.callRequest?.asset?.assetNumber ?? "", context), + _buildRow("WO No", item.workOrderNo, context), + _buildRow(context.translation.assetName, item.callRequest?.asset?.assetNumber ?? '', context), + _buildRow(context.translation.department, item.callRequest?.asset?.department ?? '', context), + _buildRow(context.translation.assetSN, item.callRequest?.asset?.assetSerialNo ?? '', context), + _buildRow(context.translation.assetType, assetType?.name ?? (item.assetType?.name ?? ""), context), + _buildRow(context.translation.model, item.callRequest?.asset?.modelDefinition?.modelName ?? "", context), + _buildRow(context.translation.manufacture, item.callRequest?.asset?.modelDefinition?.manufacturerName ?? "", context), + _buildRow(context.translation.site, item.callRequest?.asset?.site?.custName ?? "", context), ], - ); + ).toShadowContainer(context); } Widget _buildRow(String title, String value, BuildContext context) { return Row( mainAxisAlignment: MainAxisAlignment.start, children: [ - Text( - title + " : ", - style: Theme.of(context).textTheme.subtitle2.copyWith(fontWeight: FontWeight.bold), - ), - //if (item.clientName != null) - Text( - value, - style: Theme.of(context).textTheme.subtitle2.copyWith(), - ), + "$title: $value".bodyText(context), ], ); } diff --git a/lib/views/pages/user/requests/work_order/work_order_details_page.dart b/lib/views/pages/user/requests/work_order/work_order_details_page.dart index c432fa9a..c1dfbca1 100644 --- a/lib/views/pages/user/requests/work_order/work_order_details_page.dart +++ b/lib/views/pages/user/requests/work_order/work_order_details_page.dart @@ -9,6 +9,7 @@ import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; import 'package:test_sa/new_views/common_widgets/default_app_bar.dart'; +import 'package:test_sa/views/pages/sub_workorder/create_sub_workorder_page.dart'; import 'package:test_sa/views/pages/user/requests/work_order/update_service_report.dart'; import '../../../../../controllers/providers/api/user_provider.dart'; @@ -30,55 +31,64 @@ class WorkOrderDetailsPage extends StatelessWidget { body: Column( children: [ SingleChildScrollView( - child: Container( - margin: const EdgeInsets.all(16), - width: double.infinity, - decoration: ShapeDecoration( - color: context.isDark?Theme.of(context).cardColor:Colors.white, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)), - shadows: const [BoxShadow(color: Color(0x07000000), blurRadius: 14, offset: Offset(0, 0), spreadRadius: 0)], - ), - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - StatusLabel(label: workOrder.currentSituation.name, textColor: AppColor.orange60, backgroundColor: AppColor.orange40), - 8.height, - Text(serviceRequest.requestCode, style: AppTextStyles.heading5.copyWith(color: context.isDark?AppColor.neutral30:const Color(0xFF3B3D4A))), - 8.height, - Text( - '${context.translation.assetName}: ${workOrder.callRequest.asset.modelDefinition.assetName}', - style: AppTextStyles.bodyText.copyWith(color: context.isDark?AppColor.neutral10:const Color(0xFF757575)), - ), - Text( - '${context.translation.status}: ${workOrder.currentSituation.name}', - style: AppTextStyles.bodyText.copyWith(color: context.isDark?AppColor.neutral10:const Color(0xFF757575)), - ), - Text( - '${context.translation.orderWorkNumber}: ${workOrder.workOrderNo}', - style: AppTextStyles.bodyText.copyWith(color: context.isDark?AppColor.neutral10:const Color(0xFF757575)), - ), - Text( - '${context.translation.assignedEmployee}: ${workOrder.assignedEmployee?.name ?? ""}', - style: AppTextStyles.bodyText.copyWith(color: context.isDark?AppColor.neutral10:const Color(0xFF757575)), - ), - Text('${context.translation.visitDate}: ${workOrder.visitDate?.toServiceRequestDetailsFormat ?? ""}', style: AppTextStyles.bodyText.copyWith(color: context.isDark?AppColor.neutral10:const Color(0xFF757575))), - Text('${context.translation.assetSN}: ${workOrder.callRequest.asset.assetSerialNo ?? ""}', style: AppTextStyles.bodyText.copyWith(color: context.isDark?AppColor.neutral10:const Color(0xFF757575))), - Text('${context.translation.assetName}: ${workOrder.callRequest.asset.modelDefinition.assetName ?? ""}', style: AppTextStyles.bodyText.copyWith(color: context.isDark?AppColor.neutral10:const Color(0xFF757575))), - Text('${context.translation.assetNumber}: ${workOrder.callRequest.asset.assetNumber ?? ""}', style: AppTextStyles.bodyText.copyWith(color: context.isDark?AppColor.neutral10:const Color(0xFF757575))), - Text('${context.translation.model}: ${workOrder.callRequest.asset.modelDefinition.modelName ?? ""}', style: AppTextStyles.bodyText.copyWith(color: context.isDark?AppColor.neutral10:const Color(0xFF757575))), - Text('${context.translation.site}: ${workOrder.callRequest.asset.site.custName ?? ""}', style: AppTextStyles.bodyText.copyWith(color: context.isDark?AppColor.neutral10:const Color(0xFF757575))), - Text('${context.translation.callLastSituation}: ${workOrder.calllastSituation.name ?? '' ?? ""}', style: AppTextStyles.bodyText.copyWith(color: context.isDark?AppColor.neutral10:const Color(0xFF757575))), - ], - ).paddingAll(16), - ), - ).expanded, + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + StatusLabel(label: workOrder.currentSituation.name, textColor: AppColor.orange60, backgroundColor: AppColor.orange40), + if (userProvider.user.type == UsersTypes.engineer && serviceRequest.statusValue != 5 && serviceRequest.statusValue != 3) + Align(alignment: AlignmentDirectional.centerEnd, child: "edit".toSvgAsset(height: 48, width: 48)).onPress(() { + Navigator.of(context).push(MaterialPageRoute(builder: (_) => UpdateServiceReport(workOrder: workOrder, request: serviceRequest))); + }), + ], + ), + 8.height, + Text(serviceRequest.requestCode, style: AppTextStyles.heading5.copyWith(color: context.isDark ? AppColor.neutral30 : const Color(0xFF3B3D4A))), + 8.height, + Text( + '${context.translation.assetName}: ${workOrder.callRequest.asset.modelDefinition.assetName}', + style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : const Color(0xFF757575)), + ), + Text( + '${context.translation.status}: ${workOrder.currentSituation.name}', + style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : const Color(0xFF757575)), + ), + Text( + '${context.translation.orderWorkNumber}: ${workOrder.workOrderNo}', + style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : const Color(0xFF757575)), + ), + Text( + '${context.translation.assignedEmployee}: ${workOrder.assignedEmployee?.name ?? ""}', + style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : const Color(0xFF757575)), + ), + Text('${context.translation.visitDate}: ${workOrder.visitDate?.toServiceRequestDetailsFormat ?? ""}', + style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : const Color(0xFF757575))), + Text('${context.translation.assetSN}: ${workOrder.callRequest.asset.assetSerialNo ?? ""}', + style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : const Color(0xFF757575))), + Text('${context.translation.assetName}: ${workOrder.callRequest.asset.modelDefinition.assetName ?? ""}', + style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : const Color(0xFF757575))), + Text('${context.translation.assetNumber}: ${workOrder.callRequest.asset.assetNumber ?? ""}', + style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : const Color(0xFF757575))), + Text('${context.translation.model}: ${workOrder.callRequest.asset.modelDefinition.modelName ?? ""}', + style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : const Color(0xFF757575))), + Text('${context.translation.site}: ${workOrder.callRequest.asset.site.custName ?? ""}', + style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : const Color(0xFF757575))), + Text('${context.translation.callLastSituation}: ${workOrder.calllastSituation.name ?? '' ?? ""}', + style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : const Color(0xFF757575))), + ], + ).toShadowContainer(context), + ).paddingAll(16).expanded, if (userProvider.user.type == UsersTypes.engineer && serviceRequest.statusValue != 5 && serviceRequest.statusValue != 3) AppFilledButton( onPressed: () { - Navigator.of(context).push(MaterialPageRoute(builder: (_) => UpdateServiceReport(workOrder: workOrder, request: serviceRequest))); + Navigator.of(context).push( + MaterialPageRoute(builder: (context) => CreateSubWorkOrderPage(workOrder: workOrder)), + ); }, - label: context.translation.updateRequest, + label: context.translation.createSubWorkOrder, ).paddingAll(16), ], ), From 884471009af7bbf03d6698cf326a560d30e08391 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Wed, 15 Nov 2023 09:35:50 +0300 Subject: [PATCH 2/3] Sub work order screen under testing --- .../report/vendor_provider.dart | 53 ----- lib/main.dart | 2 + lib/models/new_models/building.dart | 2 +- lib/models/new_models/floor.dart | 9 +- .../supp_engineer_work_orders.dart | 8 +- .../service_request/supplier_details.dart | 26 ++- .../single_item_drop_down_menu.dart | 4 +- lib/providers/work_order/vendor_provider.dart | 35 ++++ .../update_device_transfer.dart | 5 +- .../auto_generated_vendor_name.dart | 64 +++--- .../create_sub_workorder_page.dart | 195 +++--------------- .../pages/sub_workorder/workorder_item.dart | 2 - .../user/gas_refill/gas_refill_details.dart | 1 - .../user/gas_refill/request_gas_refill.dart | 9 +- .../widgets/gas_refill/gas_refill_item.dart | 5 +- .../gas_refill_update_details_item.dart | 3 +- .../auto_complete_devices_field.dart | 8 +- .../requests/service_request_item.dart | 8 - 18 files changed, 131 insertions(+), 308 deletions(-) delete mode 100644 lib/controllers/providers/api/status_drop_down/report/vendor_provider.dart create mode 100644 lib/providers/work_order/vendor_provider.dart diff --git a/lib/controllers/providers/api/status_drop_down/report/vendor_provider.dart b/lib/controllers/providers/api/status_drop_down/report/vendor_provider.dart deleted file mode 100644 index 8e3549dd..00000000 --- a/lib/controllers/providers/api/status_drop_down/report/vendor_provider.dart +++ /dev/null @@ -1,53 +0,0 @@ -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/service_request/supplier_details.dart'; - -class VendorProvider extends ChangeNotifier { - void reset() { - _vendors = null; - _loading = null; - _stateCode = null; - } - - int _stateCode; - int get stateCode => _stateCode; - - List _vendors; - List get vendors => _vendors; - - bool _loading; - bool get isLoading => _loading; - set isLoading(bool isLoading) { - _loading = isLoading; - notifyListeners(); - } - - Future getVendors(String text) async { - if (_loading == true) return -2; - _loading = true; - notifyListeners(); - Response response; - try { - response = await ApiManager.instance.get("${URLs.getSuppliersAutoComplete}?searchText=$text"); - _stateCode = response.statusCode; - if (response.statusCode >= 200 && response.statusCode < 300) { - // client's request was successfully received - List suppliersJson = json.decode(response.body)["data"]; - _vendors = suppliersJson.map((type) => SupplierDetails.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 afc346a1..d0f7cd08 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -69,6 +69,7 @@ import 'package:test_sa/providers/service_request_providers/requested_through_pr import 'package:test_sa/providers/service_request_providers/type_of_request_provider.dart'; import 'package:test_sa/providers/work_order/reason_provider.dart'; import 'package:test_sa/providers/work_order/service_type_provider.dart'; +import 'package:test_sa/providers/work_order/vendor_provider.dart'; import 'package:test_sa/views/pages/device_transfer/asset_filter_screen.dart'; import 'package:test_sa/views/pages/device_transfer/asset_search_screen.dart'; import 'package:test_sa/views/pages/device_transfer/request_device_transfer.dart'; @@ -191,6 +192,7 @@ class MyApp extends StatelessWidget { ChangeNotifierProvider(create: (_) => PPMDeviceStatusProvider()), ChangeNotifierProvider(create: (_) => CommentsProvider()), ChangeNotifierProvider(create: (_) => RequestStatusProvider()), + ChangeNotifierProvider(create: (_) => VendorProvider()), ], child: GestureDetector( onTap: () { diff --git a/lib/models/new_models/building.dart b/lib/models/new_models/building.dart index facb0463..130147a7 100644 --- a/lib/models/new_models/building.dart +++ b/lib/models/new_models/building.dart @@ -44,7 +44,7 @@ class Building extends Base { map['id'] = id; map['name'] = name; map['value'] = value; - if(addFloor) { + if (addFloor) { if (floors != null) { map['floors'] = floors.map((v) => v.toJson()).toList(); } diff --git a/lib/models/new_models/floor.dart b/lib/models/new_models/floor.dart index 03b4c79c..ad6e1310 100644 --- a/lib/models/new_models/floor.dart +++ b/lib/models/new_models/floor.dart @@ -44,10 +44,9 @@ class Floor extends Base { map['id'] = id; map['name'] = name; map['value'] = value; - if (addDepartments) - if (departments != null) { - map['departments'] = departments.map((v) => v.toJson()).toList(); - } - return map; + if (addDepartments) if (departments != null) { + map['departments'] = departments.map((v) => v.toJson()).toList(); + } + return map; } } diff --git a/lib/models/service_request/supp_engineer_work_orders.dart b/lib/models/service_request/supp_engineer_work_orders.dart index e70034b8..f5ab29b3 100644 --- a/lib/models/service_request/supp_engineer_work_orders.dart +++ b/lib/models/service_request/supp_engineer_work_orders.dart @@ -1,4 +1,6 @@ -class SuppEngineerWorkOrders { +import 'package:test_sa/models/base.dart'; + +class SuppEngineerWorkOrders extends Base { SuppEngineerWorkOrders({ this.id, this.supplierContactId, @@ -7,12 +9,14 @@ class SuppEngineerWorkOrders { this.contact, this.externalEngCode, this.email, - }); + }) : super(identifier: id?.toString(), name: personName); SuppEngineerWorkOrders.fromJson(dynamic json) { id = json['id']; + identifier = id?.toString(); supplierContactId = json['supplierContactId']; personName = json['personName']; + name = personName; personRoleName = json['personRoleName']; contact = json['contact']; externalEngCode = json['externalEngCode']; diff --git a/lib/models/service_request/supplier_details.dart b/lib/models/service_request/supplier_details.dart index a4f9b29a..1c5fde9c 100644 --- a/lib/models/service_request/supplier_details.dart +++ b/lib/models/service_request/supplier_details.dart @@ -1,8 +1,10 @@ -class SupplierDetails { +import 'package:test_sa/models/base.dart'; + +class SupplierDetails extends Base { SupplierDetails({ this.id, this.suppliername, - this.name, + this.nameX, this.website, this.email, this.code, @@ -19,12 +21,14 @@ class SupplierDetails { this.attachments, this.suppPersons, this.suppTCodes, - }); + }) : super(name: suppliername, identifier: id?.toString()); SupplierDetails.fromJson(dynamic json) { id = json['id']; + identifier = id?.toString(); suppliername = json['suppliername']; - name = json['name']; + name = suppliername; + nameX = json['name']; website = json['website']; email = json['email']; code = json['code']; @@ -74,7 +78,7 @@ class SupplierDetails { } num id; String suppliername; - String name; + String nameX; String website; String email; String code; @@ -94,7 +98,7 @@ class SupplierDetails { SupplierDetails copyWith({ num id, String suppliername, - String name, + String nameX, String website, String email, String code, @@ -115,7 +119,7 @@ class SupplierDetails { SupplierDetails( id: id ?? this.id, suppliername: suppliername ?? this.suppliername, - name: name ?? this.name, + nameX: nameX ?? this.nameX, website: website ?? this.website, email: email ?? this.email, code: code ?? this.code, @@ -137,7 +141,7 @@ class SupplierDetails { final map = {}; map['id'] = id; map['suppliername'] = suppliername; - map['name'] = name; + map['name'] = nameX; map['website'] = website; map['email'] = email; map['code'] = code; @@ -210,7 +214,7 @@ class SuppTCodes { } } -class SuppPersons { +class SuppPersons extends Base { SuppPersons({ this.id, this.supplierId, @@ -219,12 +223,14 @@ class SuppPersons { this.contact, this.externalEngCode, this.email, - }); + }) : super(name: personName, identifier: id?.toString()); SuppPersons.fromJson(dynamic json) { id = json['id']; + identifier = id?.toString(); supplierId = json['supplierId']; personName = json['personName']; + name = personName; personRoleId = json['personRoleId']; contact = json['contact']; externalEngCode = json['externalEngCode']; diff --git a/lib/new_views/common_widgets/single_item_drop_down_menu.dart b/lib/new_views/common_widgets/single_item_drop_down_menu.dart index b126ec7f..bcba6124 100644 --- a/lib/new_views/common_widgets/single_item_drop_down_menu.dart +++ b/lib/new_views/common_widgets/single_item_drop_down_menu.dart @@ -45,7 +45,7 @@ class _SingleItemDropDownMenuState { + @override + Future getDate() async { + if (loading == true) return -2; + loading = true; + notifyListeners(); + loading = true; + notifyListeners(); + try { + Response response = await ApiManager.instance.get("${URLs.getSuppliersAutoComplete}?searchText=${""}"); + stateCode = response.statusCode; + if (response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List categoriesListJson = json.decode(response.body)["data"]; + items = categoriesListJson.map((item) => SupplierDetails.fromJson(item)).toList(); + } + loading = false; + notifyListeners(); + return response.statusCode; + } catch (error) { + loading = false; + stateCode = -1; + notifyListeners(); + return -1; + } + } +} diff --git a/lib/views/pages/device_transfer/update_device_transfer.dart b/lib/views/pages/device_transfer/update_device_transfer.dart index bf01a34a..e60bec2c 100644 --- a/lib/views/pages/device_transfer/update_device_transfer.dart +++ b/lib/views/pages/device_transfer/update_device_transfer.dart @@ -211,9 +211,10 @@ class _UpdateDeviceTransferState extends State { children: [ context.translation.transferDetails.heading5(context), 8.height, - '${context.translation.assetName}: ${_formModel.assetName}'.bodyText(context), + '${context.translation.assetName}: ${_formModel.assetName}'.bodyText(context), + ///TBDZ - '${context.translation.requesterName}: '.bodyText(context), + '${context.translation.requesterName}: '.bodyText(context), ], ).toShadowContainer(context); } diff --git a/lib/views/pages/sub_workorder/auto_generated_vendor_name.dart b/lib/views/pages/sub_workorder/auto_generated_vendor_name.dart index 7275a7b4..79465390 100644 --- a/lib/views/pages/sub_workorder/auto_generated_vendor_name.dart +++ b/lib/views/pages/sub_workorder/auto_generated_vendor_name.dart @@ -1,11 +1,10 @@ import 'package:flutter/material.dart'; import 'package:flutter_typeahead/flutter_typeahead.dart'; import 'package:provider/provider.dart'; +import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/service_request/supplier_details.dart'; -import '../../../controllers/providers/api/status_drop_down/report/vendor_provider.dart'; -import '../../app_style/colors.dart'; -import '../../app_style/sizing.dart'; +import '../../../providers/work_order/vendor_provider.dart'; class AutoGeneratedVendorName extends StatefulWidget { final String initialValue; @@ -43,43 +42,30 @@ class _AutoGeneratedVendorNameState extends State { @override Widget build(BuildContext context) { final vendorProvider = Provider.of(context, listen: false); - return Container( - padding: const EdgeInsets.symmetric(horizontal: 16), - decoration: BoxDecoration( - color: AColors.inputFieldBackgroundColor, - border: Border.all( - color: const Color(0xffefefef), + return TypeAheadField( + textFieldConfiguration: TextFieldConfiguration( + style: Theme.of(context).textTheme.titleLarge, + controller: _controller, + textAlign: TextAlign.center, + decoration: const InputDecoration( + hintText: "Vendor Name", + border: InputBorder.none, + disabledBorder: InputBorder.none, + focusedBorder: InputBorder.none, + enabledBorder: InputBorder.none, ), - borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), - // boxShadow: [ - // AppStyle.boxShadow - // ] + textInputAction: TextInputAction.search, ), - child: TypeAheadField( - textFieldConfiguration: TextFieldConfiguration( - style: Theme.of(context).textTheme.titleLarge, - controller: _controller, - textAlign: TextAlign.center, - decoration: const InputDecoration( - hintText: "Vendor Name", - border: InputBorder.none, - disabledBorder: InputBorder.none, - focusedBorder: InputBorder.none, - enabledBorder: InputBorder.none, - ), - textInputAction: TextInputAction.search, - ), - suggestionsCallback: (vale) async { - await vendorProvider.getVendors(_controller.text.trim()); - return vendorProvider.vendors; - }, - itemBuilder: (context, vendor) { - return ListTile(title: Text(vendor.suppliername)); - }, - onSuggestionSelected: (hospital) { - widget.onSearch(hospital); - }, - ), - ); + suggestionsCallback: (vale) async { + // await vendorProvider.getVendors(_controller.text.trim()); + // return vendorProvider.vendors; + }, + itemBuilder: (context, vendor) { + return ListTile(title: Text(vendor.suppliername)); + }, + onSuggestionSelected: (hospital) { + widget.onSearch(hospital); + }, + ).toShadowContainer(context); } } diff --git a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart index 15e5bc3e..0d18d5d1 100644 --- a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart +++ b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart @@ -1,4 +1,5 @@ import 'dart:convert'; +import 'dart:developer'; import 'dart:io'; import 'package:flutter/material.dart'; @@ -17,6 +18,7 @@ import 'package:test_sa/models/service_request/service_report.dart'; import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; import 'package:test_sa/new_views/common_widgets/default_app_bar.dart'; import 'package:test_sa/providers/service_request_providers/equipment_status_provider.dart'; +import 'package:test_sa/providers/work_order/vendor_provider.dart'; import 'package:test_sa/views/widgets/images/multi_image_picker.dart'; import 'package:test_sa/views/widgets/loaders/app_loading.dart'; @@ -35,9 +37,7 @@ import '../../../providers/work_order/reason_provider.dart'; import '../../widgets/date_and_time/date_picker.dart'; import '../../widgets/status/report/service_report_assistant_employee_menu.dart'; import '../../widgets/status/report/service_report_last_call.dart'; -import '../../widgets/status/service_request/supplier_engineers_menu.dart'; import '../../widgets/timer/app_timer.dart'; -import 'auto_generated_vendor_name.dart'; class CreateSubWorkOrderPage extends StatefulWidget { static const id = "/CreateSubWorkOrder"; @@ -205,23 +205,35 @@ class _CreateSubWorkOrderPageState extends State { ), if (_showVendorFields) const SizedBox(height: 8), if (_showVendorFields) - AutoGeneratedVendorName( - initialValue: _subWorkOrders.supplier?.suppliername, - onSearch: (supplier) { - _subWorkOrders.supplier.id = supplier.id; - _subWorkOrders.supplier.suppliername = supplier.suppliername; - _subWorkOrders.supplier.suppPersons = supplier.suppPersons; - setState(() {}); + SingleItemDropDownMenu( + context: context, + title: "Vendor Engineer", + initialValue: _subWorkOrders.supplier, + onSelect: (supplier) { + if (supplier != null) { + _subWorkOrders.supplier = supplier; + log(_subWorkOrders.supplier?.suppPersons?.map((e) => e.personName)?.toString()); + setState(() {}); + } }, ), if (_showVendorFields) const SizedBox(height: 8), if (_showVendorFields) - SupplierEngineersMenu( - initialValue: engineer, - engineers: _subWorkOrders?.supplier?.suppPersons, - onSelect: (engineer) { - if (engineer != null) { - this.engineer = engineer; + SingleItemDropDownMenu( + context: context, + title: "Vendor Name", + enabled: _subWorkOrders.supplier?.suppPersons?.isNotEmpty ?? false, + staticData: _subWorkOrders.supplier.suppPersons, + onSelect: (suppPerson) { + if (suppPerson != null) { + engineer = SuppEngineerWorkOrders( + id: suppPerson?.supplierId, + supplierContactId: suppPerson?.id, + personName: suppPerson?.personName, + contact: suppPerson?.contact, + externalEngCode: suppPerson?.externalEngCode, + email: suppPerson?.email, + ); } }, ), @@ -260,159 +272,6 @@ class _CreateSubWorkOrderPageState extends State { ), 8.height, MultiFilesPicker(label: context.translation.attachImage, files: _files), - // 24.height, - // const SizedBox(height: 8), - // Column( - // crossAxisAlignment: CrossAxisAlignment.start, - // children: [ - // const ASubTitle("Equipment status"), - // if (_validate && _subWorkOrders?.equipmentStatus == null) - // ASubTitle( - // context.translation.requiredWord, - // color: Colors.red, - // ), - // const SizedBox( - // height: 4, - // ), - // ServiceRequestDefectTypesMenu( - // initialValue: _serviceReport.equipmentStatus, - // onSelect: (status) { - // _subWorkOrders.equipmentStatus = status; - // _serviceReport.equipmentStatus = status; - // setState(() {}); - // }, - // ), - // ], - // ), - // const SizedBox(height: 8), - // // Column( - // // crossAxisAlignment: CrossAxisAlignment.start, - // // children: [ - // // const ASubTitle("Return to Service"), - // // // if (_validate && _subWorkOrders.visitDate == null) - // // // ASubTitle( - // // // context.translation.requiredWord, - // // // color: Colors.red, - // // // ), - // // const SizedBox( - // // height: 4, - // // ), - // // // Row( - // // // children: [ - // // // Expanded( - // // // child: ADatePicker( - // // // date: DateTime.tryParse(_subWorkOrders.visitDate ?? ""), - // // // from: DateTime(1950), - // // // onDatePicker: (date) { - // // // _subWorkOrders.visitDate = date?.toIso8601String(); - // // // setState(() {}); - // // // }, - // // // ), - // // // ), - // // // ], - // // // ), - // // ], - // // ), - // const SizedBox(height: 8), - // Column( - // crossAxisAlignment: CrossAxisAlignment.start, - // children: [ - // ASubTitle(context.translation.faultDescription), - // if (_validate && _subWorkOrders.faultDescription == null) - // ASubTitle( - // context.translation.requiredWord, - // color: Colors.red, - // ), - // const SizedBox( - // height: 4, - // ), - // ServiceReportFaultDescription( - // requestId: widget.workOrder?.callRequest?.id?.toString(), - // initialValue: _subWorkOrders?.faultDescription, - // onSelect: (status) { - // _subWorkOrders.faultDescription = status; - // if (mounted) setState(() {}); - // }, - // ), - // ], - // ), - // const SizedBox(height: 8), - // Column( - // crossAxisAlignment: CrossAxisAlignment.start, - // children: [ - // const ASubTitle("Solution"), - // const SizedBox(height: 4), - // ATextFormField(labelText: _subWorkOrders?.faultDescription?.workPerformed ?? "", textInputType: TextInputType.multiline, enable: false), - // ], - // ), - // InkWell( - // onTap: () async { - // await showModalBottomSheet( - // context: context, - // useSafeArea: true, - // isScrollControlled: true, - // backgroundColor: Colors.transparent, - // builder: (context) => WorkOrderDetailsBottomSheet( - // subWorkOrder: _subWorkOrders, - // assetId: widget.workOrder?.callRequest?.asset?.id, - // ), - // ); - // //log(_subWorkOrders?.toJson()?.toString()); - // }, - // child: Card( - // child: ListTile( - // title: Row( - // children: [ - // Text( - // "WO Details", - // style: Theme.of(context).textTheme.bodyMedium, - // ), - // const Text("*", style: TextStyle(color: Colors.red)), - // ], - // ), - // // trailing: const Icon(Icons.arrow_forward_ios, size: 14, color: AColors.primaryColor), - // ), - // ), - // ), - // const SizedBox(height: 8), - // InkWell( - // onTap: () async { - // await showModalBottomSheet( - // context: context, - // useSafeArea: true, - // isScrollControlled: true, - // backgroundColor: Colors.transparent, - // builder: (context) => SparePartsBottomSheet( - // subWorkOrder: _subWorkOrders, - // assetId: widget.workOrder?.callRequest?.asset?.id, - // ), - // ); - // log(_subWorkOrders?.toJson()?.toString()); - // }, - // child: Card( - // child: ListTile( - // title: Row( - // children: [ - // Text( - // "Spare Parts", - // style: Theme.of(context).textTheme.bodyMedium, - // ), - // const Text("*", style: TextStyle(color: Colors.red)), - // ], - // ), - // trailing: const Icon(Icons.arrow_forward_ios, size: 14, color: AColors.primaryColor), - // ), - // ), - // ), - // AMiniOneFilePicker( - // file: _file, - // onPick: (file) { - // _file = file; - // _subWorkOrders.attachmentsWorkOrder ??= []; - // _subWorkOrders.attachmentsWorkOrder.add(AttachmentsWorkOrder(name: "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}")); - // }, - // ), - // const SizedBox(height: 50), ], ), ), diff --git a/lib/views/pages/sub_workorder/workorder_item.dart b/lib/views/pages/sub_workorder/workorder_item.dart index a73accdc..efca3091 100644 --- a/lib/views/pages/sub_workorder/workorder_item.dart +++ b/lib/views/pages/sub_workorder/workorder_item.dart @@ -1,9 +1,7 @@ import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; -import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/int_extensions.dart'; -import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/requests/request_status.dart'; diff --git a/lib/views/pages/user/gas_refill/gas_refill_details.dart b/lib/views/pages/user/gas_refill/gas_refill_details.dart index 7f549493..c70c8b98 100644 --- a/lib/views/pages/user/gas_refill/gas_refill_details.dart +++ b/lib/views/pages/user/gas_refill/gas_refill_details.dart @@ -10,7 +10,6 @@ import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/pages/user/gas_refill/request_gas_refill.dart'; import 'package:test_sa/views/widgets/loaders/app_loading.dart'; -import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; import 'package:test_sa/views/widgets/requests/request_status.dart'; diff --git a/lib/views/pages/user/gas_refill/request_gas_refill.dart b/lib/views/pages/user/gas_refill/request_gas_refill.dart index 473e629d..587aab03 100644 --- a/lib/views/pages/user/gas_refill/request_gas_refill.dart +++ b/lib/views/pages/user/gas_refill/request_gas_refill.dart @@ -189,11 +189,12 @@ class _RequestGasRefillState extends State { children: [ context.translation.gasRefill.heading5(context), 8.height, + /// TBD - '${context.translation.gasRequest}:'.bodyText(context), - '${context.translation.cylinderSize}: ${widget.gasRefillModel.gazRefillDetails[0].cylinderSize.value}'.bodyText(context), - '${context.translation.quantity}: ${widget.gasRefillModel.gazRefillDetails[0].requestedQty}'.bodyText(context), - '${context.translation.site}: ${widget.gasRefillModel.site.name}'.bodyText(context), + '${context.translation.gasRequest}:'.bodyText(context), + '${context.translation.cylinderSize}: ${widget.gasRefillModel.gazRefillDetails[0].cylinderSize.value}'.bodyText(context), + '${context.translation.quantity}: ${widget.gasRefillModel.gazRefillDetails[0].requestedQty}'.bodyText(context), + '${context.translation.site}: ${widget.gasRefillModel.site.name}'.bodyText(context), ], ).paddingAll(16), 12.height, diff --git a/lib/views/widgets/gas_refill/gas_refill_item.dart b/lib/views/widgets/gas_refill/gas_refill_item.dart index 47b0261a..e3a2eb51 100644 --- a/lib/views/widgets/gas_refill/gas_refill_item.dart +++ b/lib/views/widgets/gas_refill/gas_refill_item.dart @@ -34,13 +34,14 @@ class GasRefillItem extends StatelessWidget { // 8.width, StatusLabel(label: item.status.name, textColor: AColors.getRequestStatusTextColor(item.status.value), backgroundColor: AColors.getRequestStatusColor(item.status.value)), 1.width.expanded, - Text(item.startDate != null ? item.startDate.toServiceRequestCardFormat : "", textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: context.isDark?AppColor.neutral10 :const Color(0xFF3B3D4A))), + Text(item.startDate != null ? item.startDate.toServiceRequestCardFormat : "", + textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral10 : const Color(0xFF3B3D4A))), ], ), 8.height, context.translation.gasRefillRequest.heading5(context), '${context.translation.gasType}: ${item.gazRefillDetails[0].gasType.name}'.bodyText(context), - '${context.translation.site}: ${item.site.name}'.bodyText(context), + '${context.translation.site}: ${item.site.name}'.bodyText(context), 8.height, Row( mainAxisSize: MainAxisSize.min, diff --git a/lib/views/widgets/gas_refill/gas_refill_update_details_item.dart b/lib/views/widgets/gas_refill/gas_refill_update_details_item.dart index b13cdd5a..6417a086 100644 --- a/lib/views/widgets/gas_refill/gas_refill_update_details_item.dart +++ b/lib/views/widgets/gas_refill/gas_refill_update_details_item.dart @@ -17,7 +17,6 @@ class GasRefillUpdateDetailsItem extends StatelessWidget { @override Widget build(BuildContext context) { - return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -28,7 +27,7 @@ class GasRefillUpdateDetailsItem extends StatelessWidget { ), RequestInfoRow( title: "Requested Quantity", - info: details.deliverdQty?.toStringAsFixed(0)??"", + info: details.deliverdQty?.toStringAsFixed(0) ?? "", ), enableEdit ? Column( diff --git a/lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart b/lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart index af35ffc3..3e463b49 100644 --- a/lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart +++ b/lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart @@ -77,13 +77,7 @@ class _AutoCompleteDeviceNumberFieldState extends State Date: Wed, 15 Nov 2023 09:43:40 +0300 Subject: [PATCH 3/3] Sub work order screen under testing --- lib/l10n/app_ar.arb | 5 ++++- lib/l10n/app_en.arb | 5 ++++- .../create_sub_workorder_page.dart | 18 +++++++++--------- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/lib/l10n/app_ar.arb b/lib/l10n/app_ar.arb index abaf7b6f..e7c6540e 100644 --- a/lib/l10n/app_ar.arb +++ b/lib/l10n/app_ar.arb @@ -364,5 +364,8 @@ "total" : "مجموع", "allRequests" : "كل الطلبات", "requestStatus" : "حالة الطلب", - "createSubWorkOrder" : "إنشاء أمر عمل فرعي" + "createSubWorkOrder" : "إنشاء أمر عمل فرعي", + "mrNumber" : "MR Number", + "vendorEng" : "المهندس المزود", + "vendorName" : "اسم المزود" } \ No newline at end of file diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 7eb486a1..1713c757 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -366,5 +366,8 @@ "noDataFound" : "No Data Found", "allRequests" : "All Requests", "requestStatus" : "Request Status", - "createSubWorkOrder" : "Create Sub Work Order" + "createSubWorkOrder" : "Create Sub Work Order", + "mrNumber" : "MR Number", + "vendorEng" : "Vendor Engineer", + "vendorName" : "Vendor Name" } \ No newline at end of file diff --git a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart index 0d18d5d1..796e1b9b 100644 --- a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart +++ b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart @@ -197,7 +197,7 @@ class _CreateSubWorkOrderPageState extends State { ), if (_subWorkOrders.calllastSituation?.value == 12) AppTextFormField( - labelText: "MR number", + labelText: context.translation.mrNumber, initialValue: _subWorkOrders.mrNumber, onSaved: (value) { _subWorkOrders.mrNumber = value; @@ -207,7 +207,7 @@ class _CreateSubWorkOrderPageState extends State { if (_showVendorFields) SingleItemDropDownMenu( context: context, - title: "Vendor Engineer", + title: context.translation.vendorEng, initialValue: _subWorkOrders.supplier, onSelect: (supplier) { if (supplier != null) { @@ -221,7 +221,7 @@ class _CreateSubWorkOrderPageState extends State { if (_showVendorFields) SingleItemDropDownMenu( context: context, - title: "Vendor Name", + title: context.translation.vendorName, enabled: _subWorkOrders.supplier?.suppPersons?.isNotEmpty ?? false, staticData: _subWorkOrders.supplier.suppPersons, onSelect: (suppPerson) { @@ -280,9 +280,9 @@ class _CreateSubWorkOrderPageState extends State { label: context.translation.submitRequest, onPressed: () async { setState(() {}); + _subWorkOrders.suppEngineerWorkOrders ?? []; + if (engineer != null) _subWorkOrders.suppEngineerWorkOrders.add(engineer..id = 0); if (await validate()) { - _subWorkOrders.suppEngineerWorkOrders ?? []; - if (engineer != null) _subWorkOrders.suppEngineerWorkOrders.add(engineer..id = 0); _subWorkOrders.attachmentsWorkOrder ??= []; for (var file in _files) { _subWorkOrders.attachmentsWorkOrder.add(Attachment(id: 0, name: "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}")); @@ -334,11 +334,11 @@ class _CreateSubWorkOrderPageState extends State { } else if (_subWorkOrders.calllastSituation == null) { Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.callLastSituation}"); return false; - } else if (_showVendorFields && (_subWorkOrders.supplier.suppliername == null || _subWorkOrders.supplier.suppliername.isEmpty)) { - await Fluttertoast.showToast(msg: "Vendor Name Field is Required"); - return false; } else if (_showVendorFields && _subWorkOrders.suppEngineerWorkOrders == null) { - await Fluttertoast.showToast(msg: "Vendor Engineer Field is Required"); + Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.vendorEng}"); + return false; + } else if (_showVendorFields && (_subWorkOrders.supplier.suppliername == null || _subWorkOrders.supplier.suppliername.isEmpty)) { + Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.vendorName}"); return false; } else if (_subWorkOrders.calllastSituation.value == 12 && (_subWorkOrders.sparePartsWorkOrders == null || _subWorkOrders.sparePartsWorkOrders.isEmpty)) { Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.partNo}");