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), ], ),