|
|
|
|
@ -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<CreateSubWorkOrderPage> {
|
|
|
|
|
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
|
|
|
|
|
SearchWorkOrder _subWorkOrders;
|
|
|
|
|
Lookup _serviceReportReason = Lookup();
|
|
|
|
|
ServiceReport _serviceReport;
|
|
|
|
|
final List<File> _files = [];
|
|
|
|
|
bool _isLoading = false;
|
|
|
|
|
bool _validate = false;
|
|
|
|
|
bool _showVendorFields = false;
|
|
|
|
|
SuppEngineerWorkOrders engineer;
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
void initState() {
|
|
|
|
|
@ -69,33 +75,36 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var assetTypesProvider;
|
|
|
|
|
ServiceStatusProvider assetTypesProvider;
|
|
|
|
|
CallRequest _callRequestForWorkOrder;
|
|
|
|
|
|
|
|
|
|
Future getAssetType() async {
|
|
|
|
|
//if (assetTypesProvider == null) {
|
|
|
|
|
final serviceRequestProvider = Provider.of<ServiceRequestsProvider>(context);
|
|
|
|
|
Provider.of<ServiceRequestFaultDescriptionProvider>(context, listen: false).reset();
|
|
|
|
|
assetTypesProvider = Provider.of<ServiceStatusProvider>(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<CreateSubWorkOrderPage> {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return Scaffold(
|
|
|
|
|
appBar: DefaultAppBar(title: context.translation.createSubWorkOrder),
|
|
|
|
|
body: SafeArea(
|
|
|
|
|
child: _isLoading
|
|
|
|
|
? const ALoading()
|
|
|
|
|
@ -114,283 +124,373 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
|
|
|
|
|
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<Lookup, ReasonProvider>(
|
|
|
|
|
context: context,
|
|
|
|
|
title: context.translation.reason,
|
|
|
|
|
initialValue: _subWorkOrders.reason,
|
|
|
|
|
onSelect: (value) {
|
|
|
|
|
_subWorkOrders.reason = value;
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
8.height,
|
|
|
|
|
SingleItemDropDownMenu<Lookup, EquipmentStatusProvider>(
|
|
|
|
|
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<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,
|
|
|
|
|
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<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),
|
|
|
|
|
));
|
|
|
|
|
).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<ServiceRequestsProvider>(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<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;
|
|
|
|
|
} else {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|