Working on create sub work order screen

main_design2.0
zaid_daoud 2 years ago
parent f07a70462a
commit cd3d9e1455

@ -363,5 +363,6 @@
"trackAssetTransfer" : "تتبع نقل اجهزة", "trackAssetTransfer" : "تتبع نقل اجهزة",
"total" : "مجموع", "total" : "مجموع",
"allRequests" : "كل الطلبات", "allRequests" : "كل الطلبات",
"requestStatus" : "حالة الطلب" "requestStatus" : "حالة الطلب",
"createSubWorkOrder" : "إنشاء أمر عمل فرعي"
} }

@ -365,5 +365,6 @@
"total" : "Total", "total" : "Total",
"noDataFound" : "No Data Found", "noDataFound" : "No Data Found",
"allRequests" : "All Requests", "allRequests" : "All Requests",
"requestStatus" : "Request Status" "requestStatus" : "Request Status",
"createSubWorkOrder" : "Create Sub Work Order"
} }

@ -1,5 +1,4 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:developer';
import 'dart:io'; import 'dart:io';
import 'package:flutter/material.dart'; 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_report_assistants_employee_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_types_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/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/extensions/widget_extensions.dart';
import 'package:test_sa/models/lookup.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/search_work_order.dart';
import 'package:test_sa/models/service_request/service_report.dart'; import 'package:test_sa/models/service_request/service_report.dart';
import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
import 'package:test_sa/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart'; import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
import 'package:test_sa/views/pages/sub_workorder/work_order_details_bottom_sheet.dart'; import 'package:test_sa/providers/service_request_providers/equipment_status_provider.dart';
import 'package:test_sa/views/pages/sub_workorder/workorder_details.dart';
import 'package:test_sa/views/widgets/images/multi_image_picker.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/loaders/app_loading.dart';
import 'package:test_sa/views/widgets/status/service_request/service_request_defect_types_mune.dart';
import '../../../attachment.dart'; import '../../../attachment.dart';
import '../../../controllers/api_routes/http_status_manger.dart'; import '../../../controllers/api_routes/http_status_manger.dart';
import '../../../controllers/providers/api/status_drop_down/report/service_report_fault_description_provider.dart'; import '../../../controllers/providers/api/status_drop_down/report/service_report_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 '../../../models/service_request/wo_call_request.dart';
import '../../widgets/app_text_form_field.dart'; import '../../../new_views/common_widgets/app_lazy_loading.dart';
import '../../widgets/buttons/app_back_button.dart'; import '../../../new_views/common_widgets/app_text_form_field.dart';
import '../../widgets/buttons/app_button.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/date_and_time/date_picker.dart';
import '../../widgets/status/report/service_report_fault_description.dart'; import '../../widgets/status/report/service_report_assistant_employee_menu.dart';
import '../../widgets/status/report/service_report_reasons.dart'; import '../../widgets/status/report/service_report_last_call.dart';
import '../../widgets/titles/app_sub_title.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 { class CreateSubWorkOrderPage extends StatefulWidget {
static const id = "/CreateSubWorkOrder"; static const id = "/CreateSubWorkOrder";
@ -46,11 +52,11 @@ class CreateSubWorkOrderPage extends StatefulWidget {
class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> { class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
SearchWorkOrder _subWorkOrders; SearchWorkOrder _subWorkOrders;
Lookup _serviceReportReason = Lookup();
ServiceReport _serviceReport; ServiceReport _serviceReport;
final List<File> _files = []; final List<File> _files = [];
bool _isLoading = false; bool _isLoading = false;
bool _validate = false; bool _showVendorFields = false;
SuppEngineerWorkOrders engineer;
@override @override
void initState() { void initState() {
@ -69,33 +75,36 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
} }
} }
var assetTypesProvider; ServiceStatusProvider assetTypesProvider;
CallRequest _callRequestForWorkOrder; CallRequest _callRequestForWorkOrder;
Future getAssetType() async { Future getAssetType() async {
//if (assetTypesProvider == null) {
final serviceRequestProvider = Provider.of<ServiceRequestsProvider>(context); final serviceRequestProvider = Provider.of<ServiceRequestsProvider>(context);
Provider.of<ServiceRequestFaultDescriptionProvider>(context, listen: false).reset(); Provider.of<ServiceRequestFaultDescriptionProvider>(context, listen: false).reset();
assetTypesProvider = Provider.of<ServiceStatusProvider>(context, listen: false); assetTypesProvider = Provider.of<ServiceStatusProvider>(context, listen: false);
_callRequestForWorkOrder = await serviceRequestProvider.getCallRequestForWorkOrder(callId: widget.workOrder.callRequest.id.toString()); _callRequestForWorkOrder = await serviceRequestProvider.getCallRequestForWorkOrder(callId: widget.workOrder.callRequest.id.toString());
if (_subWorkOrders?.parentWOId != null) { if (_subWorkOrders?.parentWOId != null) {
print(_subWorkOrders?.parentWOId.toString());
final subWoDetails = await serviceRequestProvider.getSubWorkOrderDetails(parentId: _subWorkOrders?.parentWOId.toString()); final subWoDetails = await serviceRequestProvider.getSubWorkOrderDetails(parentId: _subWorkOrders?.parentWOId.toString());
_subWorkOrders.copyDetails(subWoDetails); _subWorkOrders.copyDetails(subWoDetails);
_serviceReport.equipmentStatus = subWoDetails.equipmentStatus; _serviceReport.equipmentStatus = subWoDetails.equipmentStatus;
_serviceReport.reason = subWoDetails.reason; _serviceReport.reason = subWoDetails.reason;
_serviceReport.faultDescription = subWoDetails.faultDescription; // _serviceReport.faultDescription = subWoDetails.faultDescription;
_serviceReportReason = _subWorkOrders.reason;
} }
await assetTypesProvider.getTypes(); await assetTypesProvider.getTypes();
_subWorkOrders?.assetType = assetTypesProvider.statuses?.firstWhere( _subWorkOrders?.assetType = assetTypesProvider.statuses?.firstWhere(
(element) => element.value == _callRequestForWorkOrder?.assetType, (element) => element.value == _callRequestForWorkOrder?.assetType,
orElse: () => null, 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(() { setState(() {
_isLoading = false; _isLoading = false;
}); });
//}
} }
@override @override
@ -105,6 +114,7 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
} }
return Scaffold( return Scaffold(
appBar: DefaultAppBar(title: context.translation.createSubWorkOrder),
body: SafeArea( body: SafeArea(
child: _isLoading child: _isLoading
? const ALoading() ? const ALoading()
@ -114,283 +124,373 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
child: Form( child: Form(
key: _formKey, key: _formKey,
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [ children: [
Container( Card(
color: AColors.primaryColor,
padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [ children: [
Row( (widget.workOrder?.callRequest?.asset?.site?.name ?? "").heading5(context),
children: [ 8.height,
const ABackButton(), "${context.translation.assetNo}: ${widget.workOrder?.callRequest?.asset?.assetNumber ?? ""}".bodyText(context),
Expanded( "${context.translation.callId}: ${widget.workOrder?.callRequest?.id}".bodyText(context),
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,
)
],
),
], ],
), ).paddingAll(16),
), ),
Padding( // WorkOrderDetails(item: widget.workOrder, assetType: _subWorkOrders?.assetType),
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 16), 8.height,
child: Column( ADatePicker(
children: [ label: context.translation.visitDate,
WorkOrderDetails(item: widget.workOrder, assetType: _subWorkOrders?.assetType), date: DateTime.tryParse(_subWorkOrders.visitDate ?? ""),
const SizedBox(height: 8), onDatePicker: (date) {
Column( _subWorkOrders.visitDate = date?.toIso8601String();
crossAxisAlignment: CrossAxisAlignment.start, setState(() {});
children: [ },
const ASubTitle("Equipment status"), ),
if (_validate && _subWorkOrders?.equipmentStatus == null) 8.height,
ASubTitle( AppTimer(
context.translation.requiredWord, label: context.translation.workingHours,
color: Colors.red, timer: _subWorkOrders.timer,
), enabled: _subWorkOrders?.timer?.endAt == null,
const SizedBox( onChange: (timer) async {
height: 4, _subWorkOrders.timer = timer;
), return true;
ServiceRequestDefectTypesMenu( },
initialValue: _serviceReport.equipmentStatus, ),
onSelect: (status) { 8.height,
_subWorkOrders.equipmentStatus = status; SingleItemDropDownMenu<Lookup, ReasonProvider>(
_serviceReport.equipmentStatus = status; context: context,
setState(() {}); title: context.translation.reason,
}, initialValue: _subWorkOrders.reason,
), onSelect: (value) {
], _subWorkOrders.reason = value;
), },
const SizedBox(height: 8), ),
Column( 8.height,
crossAxisAlignment: CrossAxisAlignment.start, SingleItemDropDownMenu<Lookup, EquipmentStatusProvider>(
children: [ context: context,
const ASubTitle("Return to Service"), title: context.translation.equipmentStatus,
// if (_validate && _subWorkOrders.visitDate == null) initialValue: _subWorkOrders.equipmentStatus,
// ASubTitle( onSelect: (value) {
// context.translation.requiredWord, _subWorkOrders.equipmentStatus = value;
// color: Colors.red, },
// ), ),
const SizedBox( 8.height,
height: 4, ServiceReportLastCallsMenu(
), report: _serviceReport,
Row( title: context.translation.callLastSituation,
children: [ parentId: widget.workOrder?.callRequest?.id?.toString(),
Expanded( onSelect: (status) {
child: ADatePicker( _serviceReport.calllastSituation = status;
date: DateTime.tryParse(_subWorkOrders.visitDate ?? ""), if (checkVendorFieldsVisibility(status)) {
from: DateTime(1950), _subWorkOrders.supplier ??= SupplierDetails(id: _subWorkOrders?.supplier?.id);
onDatePicker: (date) { engineer = null;
_subWorkOrders.visitDate = date?.toIso8601String(); }
setState(() {}); if (status?.value == 12 || _subWorkOrders.calllastSituation?.value == 12) {
}, _subWorkOrders.calllastSituation = status;
), _subWorkOrders.mrNumber = null;
), } else {
], _subWorkOrders.calllastSituation = status;
), }
], setState(() {});
), },
const SizedBox(height: 8), ),
Column( if (_subWorkOrders.calllastSituation?.value == 12)
crossAxisAlignment: CrossAxisAlignment.start, AppTextFormField(
children: [ labelText: "MR number",
ASubTitle("Failure ${context.translation.reasons}"), initialValue: _subWorkOrders.mrNumber,
if (_validate && _subWorkOrders.reason == null) onSaved: (value) {
ASubTitle( _subWorkOrders.mrNumber = value;
context.translation.requiredWord, },
color: Colors.red, ),
), if (_showVendorFields) const SizedBox(height: 8),
const SizedBox( if (_showVendorFields)
height: 4, AutoGeneratedVendorName(
), initialValue: _subWorkOrders.supplier?.suppliername,
ServiceReportReasonsMenu( onSearch: (supplier) {
initialValue: _serviceReportReason, _subWorkOrders.supplier.id = supplier.id;
onSelect: (status) { _subWorkOrders.supplier.suppliername = supplier.suppliername;
_serviceReportReason = status; _subWorkOrders.supplier.suppPersons = supplier.suppPersons;
_subWorkOrders.reason = status; setState(() {});
// setState(() {}); },
}, ),
), if (_showVendorFields) const SizedBox(height: 8),
], if (_showVendorFields)
), SupplierEngineersMenu(
const SizedBox(height: 8), initialValue: engineer,
Column( engineers: _subWorkOrders?.supplier?.suppPersons,
crossAxisAlignment: CrossAxisAlignment.start, onSelect: (engineer) {
children: [ if (engineer != null) {
ASubTitle(context.translation.faultDescription), this.engineer = engineer;
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),
],
), ),
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<SparePart, NullableLoadingProvider>(
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, ).paddingAll(16).expanded,
Padding( AppFilledButton(
padding: const EdgeInsets.all(16.0), label: context.translation.submitRequest,
child: AButton( onPressed: () async {
text: context.translation.create, setState(() {});
onPressed: () async { if (await validate()) {
_validate = true; _subWorkOrders.suppEngineerWorkOrders ?? [];
setState(() {}); if (engineer != null) _subWorkOrders.suppEngineerWorkOrders.add(engineer..id = 0);
if (validate()) { _subWorkOrders.attachmentsWorkOrder ??= [];
if (_subWorkOrders.calllastSituation.value == 12 && (_subWorkOrders.sparePartsWorkOrders == null || _subWorkOrders.sparePartsWorkOrders.isEmpty)) { for (var file in _files) {
await Fluttertoast.showToast(msg: "You have to add parts"); _subWorkOrders.attachmentsWorkOrder.add(Attachment(id: 0, name: "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}"));
return; }
} if (_formKey.currentState?.validate() ?? false) {}
_subWorkOrders.attachmentsWorkOrder ??= []; _formKey.currentState?.save();
for (var file in _files) { final serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context, listen: false);
_subWorkOrders.attachmentsWorkOrder.add(Attachment(name: "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}")); for (var element in (_subWorkOrders?.suppEngineerWorkOrders ?? [])) {
} if (element != null) {
if (_subWorkOrders.timer?.startAt == null || _subWorkOrders.timer?.endAt == null) { element.id = 0;
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<ServiceRequestsProvider>(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),
));
} }
} }
}, 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() { bool checkVendorFieldsVisibility(Lookup callsLastSituation) {
if (_subWorkOrders.faultDescription == null || _subWorkOrders.reason == null || _subWorkOrders.equipmentStatus == null) { 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<bool> 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; return false;
} else {
return true;
} }
return true;
} }
} }

@ -1,80 +1,40 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:test_sa/extensions/context_extension.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 'package:test_sa/models/lookup.dart';
import '../../../controllers/localization/localization.dart';
import '../../../models/service_request/search_work_order.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 { class WorkOrderDetails extends StatelessWidget {
final SearchWorkOrder item; 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 @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Column( return Column(
children: [ children: [
Container( _buildRow(context.translation.callId, item.callRequest?.id?.toString() ?? "", context),
padding: EdgeInsets.all(10), _buildRow(context.translation.assetNumber, item.callRequest?.asset?.assetNumber ?? "", context),
decoration: BoxDecoration( _buildRow("WO No", item.workOrderNo, context),
color: AColors.inputFieldBackgroundColor, _buildRow(context.translation.assetName, item.callRequest?.asset?.assetNumber ?? '', context),
border: Border.all( _buildRow(context.translation.department, item.callRequest?.asset?.department ?? '', context),
color: Color(0xffefefef), _buildRow(context.translation.assetSN, item.callRequest?.asset?.assetSerialNo ?? '', context),
), _buildRow(context.translation.assetType, assetType?.name ?? (item.assetType?.name ?? ""), context),
borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), _buildRow(context.translation.model, item.callRequest?.asset?.modelDefinition?.modelName ?? "", context),
// boxShadow: const [ _buildRow(context.translation.manufacture, item.callRequest?.asset?.modelDefinition?.manufacturerName ?? "", context),
// AppStyle.boxShadow _buildRow(context.translation.site, item.callRequest?.asset?.site?.custName ?? "", context),
// ]
),
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),
)
], ],
); ).toShadowContainer(context);
} }
Widget _buildRow(String title, String value, BuildContext context) { Widget _buildRow(String title, String value, BuildContext context) {
return Row( return Row(
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
children: [ children: [
Text( "$title: $value".bodyText(context),
title + " : ",
style: Theme.of(context).textTheme.subtitle2.copyWith(fontWeight: FontWeight.bold),
),
//if (item.clientName != null)
Text(
value,
style: Theme.of(context).textTheme.subtitle2.copyWith(),
),
], ],
); );
} }

@ -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/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/app_filled_button.dart';
import 'package:test_sa/new_views/common_widgets/default_app_bar.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 'package:test_sa/views/pages/user/requests/work_order/update_service_report.dart';
import '../../../../../controllers/providers/api/user_provider.dart'; import '../../../../../controllers/providers/api/user_provider.dart';
@ -30,55 +31,64 @@ class WorkOrderDetailsPage extends StatelessWidget {
body: Column( body: Column(
children: [ children: [
SingleChildScrollView( SingleChildScrollView(
child: Container( child: Column(
margin: const EdgeInsets.all(16), mainAxisSize: MainAxisSize.min,
width: double.infinity, crossAxisAlignment: CrossAxisAlignment.start,
decoration: ShapeDecoration( children: [
color: context.isDark?Theme.of(context).cardColor:Colors.white, Row(
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)), mainAxisAlignment: MainAxisAlignment.spaceBetween,
shadows: const [BoxShadow(color: Color(0x07000000), blurRadius: 14, offset: Offset(0, 0), spreadRadius: 0)], children: [
), StatusLabel(label: workOrder.currentSituation.name, textColor: AppColor.orange60, backgroundColor: AppColor.orange40),
child: Column( if (userProvider.user.type == UsersTypes.engineer && serviceRequest.statusValue != 5 && serviceRequest.statusValue != 3)
mainAxisSize: MainAxisSize.min, Align(alignment: AlignmentDirectional.centerEnd, child: "edit".toSvgAsset(height: 48, width: 48)).onPress(() {
crossAxisAlignment: CrossAxisAlignment.start, Navigator.of(context).push(MaterialPageRoute(builder: (_) => UpdateServiceReport(workOrder: workOrder, request: serviceRequest)));
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,
8.height, Text(serviceRequest.requestCode, style: AppTextStyles.heading5.copyWith(color: context.isDark ? AppColor.neutral30 : const Color(0xFF3B3D4A))),
Text( 8.height,
'${context.translation.assetName}: ${workOrder.callRequest.asset.modelDefinition.assetName}', Text(
style: AppTextStyles.bodyText.copyWith(color: context.isDark?AppColor.neutral10:const Color(0xFF757575)), '${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}', Text(
style: AppTextStyles.bodyText.copyWith(color: context.isDark?AppColor.neutral10:const Color(0xFF757575)), '${context.translation.status}: ${workOrder.currentSituation.name}',
), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : const Color(0xFF757575)),
Text( ),
'${context.translation.orderWorkNumber}: ${workOrder.workOrderNo}', Text(
style: AppTextStyles.bodyText.copyWith(color: context.isDark?AppColor.neutral10:const Color(0xFF757575)), '${context.translation.orderWorkNumber}: ${workOrder.workOrderNo}',
), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : const Color(0xFF757575)),
Text( ),
'${context.translation.assignedEmployee}: ${workOrder.assignedEmployee?.name ?? ""}', Text(
style: AppTextStyles.bodyText.copyWith(color: context.isDark?AppColor.neutral10:const Color(0xFF757575)), '${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.visitDate}: ${workOrder.visitDate?.toServiceRequestDetailsFormat ?? ""}',
Text('${context.translation.assetName}: ${workOrder.callRequest.asset.modelDefinition.assetName ?? ""}', style: AppTextStyles.bodyText.copyWith(color: context.isDark?AppColor.neutral10:const Color(0xFF757575))), 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.assetSN}: ${workOrder.callRequest.asset.assetSerialNo ?? ""}',
Text('${context.translation.model}: ${workOrder.callRequest.asset.modelDefinition.modelName ?? ""}', style: AppTextStyles.bodyText.copyWith(color: context.isDark?AppColor.neutral10:const Color(0xFF757575))), 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.assetName}: ${workOrder.callRequest.asset.modelDefinition.assetName ?? ""}',
Text('${context.translation.callLastSituation}: ${workOrder.calllastSituation.name ?? '' ?? ""}', style: AppTextStyles.bodyText.copyWith(color: context.isDark?AppColor.neutral10:const Color(0xFF757575))), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : const Color(0xFF757575))),
], Text('${context.translation.assetNumber}: ${workOrder.callRequest.asset.assetNumber ?? ""}',
).paddingAll(16), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : const Color(0xFF757575))),
), Text('${context.translation.model}: ${workOrder.callRequest.asset.modelDefinition.modelName ?? ""}',
).expanded, 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) if (userProvider.user.type == UsersTypes.engineer && serviceRequest.statusValue != 5 && serviceRequest.statusValue != 3)
AppFilledButton( AppFilledButton(
onPressed: () { 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), ).paddingAll(16),
], ],
), ),

Loading…
Cancel
Save