diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index 94e03ff2..12459d16 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -159,6 +159,7 @@ class URLs { static get assignEngineerToWorkOrderUrl => '$_baseUrl/ServiceRequest/AssignEngineerToWorkOrder'; static get uploadWorkOrderAttachmentsUrl => '$_baseUrl/ServiceRequest/UploadAttachmentsWorkOrder'; + static get workOrderByAssetIdAutoComplete => '$_baseUrl/ServiceRequest/WorkOrderByAssetIdAutoComplete'; static get getArrivalVerificationTypeUrl => '$_baseUrl/ArrivalVerificationType/GetArrivalVerificationType'; diff --git a/lib/models/wo_by_asset_id_model.dart b/lib/models/wo_by_asset_id_model.dart new file mode 100644 index 00000000..8a6497d1 --- /dev/null +++ b/lib/models/wo_by_asset_id_model.dart @@ -0,0 +1,11 @@ +class WoByAssetIdModel { + int? id; + String? workOrderNo; + + WoByAssetIdModel({this.id, this.workOrderNo}); + + WoByAssetIdModel.fromJson(dynamic json) { + id = json['id']; + workOrderNo = json['workOrderNo']; + } +} diff --git a/lib/modules/cm_module/cm_detail_provider.dart b/lib/modules/cm_module/cm_detail_provider.dart index a63dcf9e..9aa4aa4d 100644 --- a/lib/modules/cm_module/cm_detail_provider.dart +++ b/lib/modules/cm_module/cm_detail_provider.dart @@ -17,6 +17,7 @@ import 'package:test_sa/models/new_models/dashboard_detail.dart'; import 'package:test_sa/models/new_models/work_order_detail_model.dart'; import 'package:test_sa/models/service_request/spare_parts.dart'; import 'package:test_sa/models/service_request/supplier_details.dart'; +import 'package:test_sa/models/wo_by_asset_id_model.dart'; import 'cm_request_utils.dart'; @@ -1003,4 +1004,19 @@ class CMDetailProvider extends ChangeNotifier { return -1; } } + + Future> getWorkOrderByAssetId(String searchText, int assetId) async { + late Response response; + try { + response = await ApiManager.instance.post(URLs.workOrderByAssetIdAutoComplete, body: {"pageSize": 1, "pageNumber": 20, "search": searchText, "assetId": assetId}); + List woList = []; + if (response.statusCode >= 200 && response.statusCode < 300) { + List categoriesListJson = json.decode(response.body)["data"]; + woList = categoriesListJson.map((wo) => WoByAssetIdModel.fromJson(wo)).toList(); + } + return woList; + } catch (error) { + return []; + } + } } diff --git a/lib/modules/incident_module/create_incident_request_page.dart b/lib/modules/incident_module/create_incident_request_page.dart index deac471e..ee8f76aa 100644 --- a/lib/modules/incident_module/create_incident_request_page.dart +++ b/lib/modules/incident_module/create_incident_request_page.dart @@ -16,6 +16,7 @@ import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/new_models/building.dart'; import 'package:test_sa/models/new_models/floor.dart'; import 'package:test_sa/models/new_models/site.dart'; +import 'package:test_sa/models/wo_by_asset_id_model.dart'; import 'package:test_sa/modules/cm_module/cm_request_utils.dart'; import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart'; import 'package:test_sa/modules/incident_module/incident_lookup_provider.dart'; @@ -65,6 +66,7 @@ class _CreateIncidentRequestPageState extends State { Department? _selectedDepartment; Asset? device; + WoByAssetIdModel? woByAssetId; Lookup? incidentType; Lookup? ovrSystem; @@ -127,10 +129,10 @@ class _CreateIncidentRequestPageState extends State { borderColor: AppColor.black20, onPick: (asset) async { device = asset; - payload["assetId"] = asset.modelDefinition?.id; + payload["assetId"] = asset?.id; payload["oracleCode"] = asset.modelDefinition?.oracleCodes?.first.codeValue; payload["model"] = asset.modelDefinition?.modelName; - payload["manufacturer"] = asset.modelDefinition?.manufacturerId; + payload["manufacturer"] = asset.modelDefinition?.manufacturerName; payload["assetOrigin"] = asset.modelDefinition?.assetName; payload["siteId"] = asset.site?.id; payload["buildingId"] = asset.building?.id; @@ -144,11 +146,11 @@ class _CreateIncidentRequestPageState extends State { clearAfterPick: false, byName: true, enabled: device != null, + assetId: device?.id?.toInt(), initialValue: "", onPick: (asset) { - // trafRequest?.assetNDId = asset.id; - // model.partCatalogItem = PartCatalogItem(id: part.sparePart?.id, partNumber: part.sparePart?.partNo, partName: part.sparePart?.partName, oracleCode: part.sparePart?.oracleCode); - // setState(() {}); + woByAssetId = asset; + setState(() {}); }, ), ], @@ -369,6 +371,7 @@ class _CreateIncidentRequestPageState extends State { onSelect: (value) { incidentType = value; payload["incidentClassificationId"] = value?.id; + payload["workOrderId"] = null; setState(() {}); }, ), @@ -690,17 +693,19 @@ class _CreateIncidentRequestPageState extends State { "Please scan or pick asset".showToast; return; } - + if (incidentType?.value == 1 && device != null && woByAssetId?.id == null) { + "Please choose CM Work Order".showToast; + return; + } if (ovrSystem?.value == 1 && isOvrVerified == false) { "Please verify OVR Ticket Number".showToast; return; } - if (occurrenceDate == null) { "Please select occurrence Data".showToast; return; } - + payload["workOrderId"] = woByAssetId?.id; payload["occurrenceDate"] = occurrenceDate!.toIso8601String(); _formKey.currentState!.save(); diff --git a/lib/modules/incident_module/incident_data_model.dart b/lib/modules/incident_module/incident_data_model.dart index 6e5e46f1..7c9f3ba7 100644 --- a/lib/modules/incident_module/incident_data_model.dart +++ b/lib/modules/incident_module/incident_data_model.dart @@ -74,6 +74,8 @@ class IncidentDataModel { String? occurrenceDate; String? createdDate; List? incidentAttachments; + int? workOrderId; + String? workOrderNo; IncidentDataModel( {this.id, @@ -148,6 +150,8 @@ class IncidentDataModel { this.approvalSignature, this.occurrenceDate, this.createdDate, + this.workOrderId, + this.workOrderNo, this.incidentAttachments}); IncidentDataModel.fromJson(Map json) { @@ -223,6 +227,8 @@ class IncidentDataModel { approvalSignature = json['approvalSignature']; occurrenceDate = json['occurrenceDate']; createdDate = json['createdDate']; + workOrderId = json['workOrderId']; + workOrderNo = json['workOrderNo']; if (json['incidentAttachments'] != null) { incidentAttachments = []; json['incidentAttachments'].forEach((v) { @@ -305,6 +311,8 @@ class IncidentDataModel { data['approvalSignature'] = this.approvalSignature; data['occurrenceDate'] = this.occurrenceDate; data['createdDate'] = this.createdDate; + data['workOrderId'] = this.workOrderId; + data['workOrderNo'] = this.workOrderNo; if (this.incidentAttachments != null) { data['incidentAttachments'] = this.incidentAttachments!.map((v) => v.toJson()).toList(); } diff --git a/lib/modules/incident_module/incident_detail_page.dart b/lib/modules/incident_module/incident_detail_page.dart index 6eb8c521..f96dcd4f 100644 --- a/lib/modules/incident_module/incident_detail_page.dart +++ b/lib/modules/incident_module/incident_detail_page.dart @@ -103,22 +103,23 @@ class IncidentDetailPage extends StatelessWidget { 'Incident Title: ${incidentData.incidentTitle ?? "-"}'.bodyText(context), 'Incident Description: ${incidentData.incidentDescription ?? "-"}'.bodyText(context), 'Exist OVR: ${incidentData.existingOvrTicketName ?? "-"}'.bodyText(context), - RichText( - text: TextSpan(text: "CM WorkOrder: ", style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), children: [ - TextSpan( - text: "Privacy Policy", - style: AppTextStyles.bodyText.copyWith(color: AppColor.blueStatus(context), decoration: TextDecoration.underline), - recognizer: TapGestureRecognizer() - ..onTap = () async { - await Navigator.of(context).push(MaterialPageRoute(builder: (_) => CMDetailPage(requestId: incidentData.id!, moduleId: 3))); - }), - ]), - ), 'Site: ${incidentData.siteName ?? "-"}'.bodyText(context), 'Building: ${incidentData.buildingName ?? "-"}'.bodyText(context), 'Floor: ${incidentData.floorName ?? "-"}'.bodyText(context), 'Department: ${incidentData.departmentName ?? "-"}'.bodyText(context), 'Occurrence Date: ${incidentData.occurrenceDate?.toServiceRequestDetailsFormat ?? "-"}'.bodyText(context), + if (incidentData.workOrderId != null) + RichText( + text: TextSpan(text: "Work Order: ", style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), children: [ + TextSpan( + text: "${incidentData.workOrderNo}", + style: AppTextStyles.bodyText.copyWith(color: AppColor.blueStatus(context), decoration: TextDecoration.underline), + recognizer: TapGestureRecognizer() + ..onTap = () async { + await Navigator.of(context).push(MaterialPageRoute(builder: (_) => CMDetailPage(requestId: incidentData.workOrderId!, moduleId: 3))); + }), + ]), + ), 'Root Cause: ${incidentData.rootCauseName ?? "-"}'.bodyText(context), if (incidentData.rootCauseValue == 5) 'Root reason: ${incidentData.otherRootCause ?? "-"}'.bodyText(context), 'Comments: ${incidentData.comments ?? "-"}'.bodyText(context), diff --git a/lib/modules/traf_module/traf_request_detail_page.dart b/lib/modules/traf_module/traf_request_detail_page.dart index 548cb41b..ea1ea197 100644 --- a/lib/modules/traf_module/traf_request_detail_page.dart +++ b/lib/modules/traf_module/traf_request_detail_page.dart @@ -136,9 +136,9 @@ class _TrafRequestDetailPageState extends State { 'Requested Quantity: ${data.qty ?? '-'}'.bodyText(context), ], 4.height, - 'How would the requested technology solve the current situation and/or serve the purpose?: ${data.purposeAnswer ?? '-'}'.bodyText(context), + 'How would the requested technology solve the current situation and/or serve the purpose?:\n${data.purposeAnswer ?? '-'}'.bodyText(context), 4.height, - 'What is the current practice?: ${data.currentPractise ?? '-'}'.bodyText(context), + 'What is the current practice?:\n${data.currentPractise ?? '-'}'.bodyText(context), 4.height, 'Census Q1: ${data.censusQ1 ?? '-'}'.bodyText(context), 'Census Q2: ${data.censusQ2 ?? '-'}'.bodyText(context), diff --git a/lib/views/widgets/auto_complete/wo_auto_complete_field.dart b/lib/views/widgets/auto_complete/wo_auto_complete_field.dart index 56ebae4c..b157df2e 100644 --- a/lib/views/widgets/auto_complete/wo_auto_complete_field.dart +++ b/lib/views/widgets/auto_complete/wo_auto_complete_field.dart @@ -8,6 +8,8 @@ import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/new_models/asset_nd_auto_complete_by_dynamic_codes_model.dart'; +import 'package:test_sa/models/wo_by_asset_id_model.dart'; +import 'package:test_sa/modules/cm_module/cm_detail_provider.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/views/app_style/sizing.dart'; @@ -17,9 +19,9 @@ import '../../../new_views/app_style/app_text_style.dart'; class WoAutoCompleteField extends StatefulWidget { final String initialValue; - final num? assetId; + final int? assetId; final bool clearAfterPick, byName, enabled; - final Function(AssetNDAutoCompleteByDynamicCodesModel) onPick; + final Function(WoByAssetIdModel) onPick; const WoAutoCompleteField({Key? key, required this.byName, required this.initialValue, this.assetId, required this.onPick, this.clearAfterPick = true, this.enabled = true}) : super(key: key); @@ -28,7 +30,7 @@ class WoAutoCompleteField extends StatefulWidget { } class _WoAutoCompleteFieldState extends State { - late OracleCodeProvider _oracleCodeProvider; + late CMDetailProvider _cmDetailProvider; late TextEditingController _controller; @@ -38,7 +40,7 @@ class _WoAutoCompleteFieldState extends State { void initState() { _controller = TextEditingController(text: widget.initialValue); super.initState(); - _oracleCodeProvider = Provider.of(context, listen: false); + _cmDetailProvider = Provider.of(context, listen: false); } @override @@ -64,7 +66,7 @@ class _WoAutoCompleteFieldState extends State { borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), // boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)], ), - child: Autocomplete( + child: Autocomplete( optionsBuilder: (TextEditingValue textEditingValue) async { if (textEditingValue.text.isEmpty) { if (loading) { @@ -72,20 +74,21 @@ class _WoAutoCompleteFieldState extends State { loading = false; }); } - return const Iterable.empty(); + return const Iterable.empty(); } if (!loading) { setState(() { loading = true; }); } - List workOrders = (await _oracleCodeProvider.getAssetByOracleCode(textEditingValue.text)); + List workOrders = (await _cmDetailProvider.getWorkOrderByAssetId(textEditingValue.text, widget.assetId!)); + setState(() { loading = false; }); return workOrders; }, - displayStringForOption: (AssetNDAutoCompleteByDynamicCodesModel option) => widget.byName ? option.displayName ?? "" : option.codeValue ?? "", + displayStringForOption: (WoByAssetIdModel option) => widget.byName ? option.workOrderNo ?? "" : option.workOrderNo ?? "", fieldViewBuilder: (BuildContext context, TextEditingController fieldTextEditingController, FocusNode fieldFocusNode, VoidCallback onFieldSubmitted) { return TextField( controller: _controller, @@ -106,7 +109,7 @@ class _WoAutoCompleteFieldState extends State { fillColor: AppColor.fieldBgColor(context), errorStyle: AppTextStyle.tiny.copyWith(color: context.isDark ? AppColor.red50 : AppColor.red60), floatingLabelStyle: AppTextStyle.body1.copyWith(fontWeight: FontWeight.w500, color: context.isDark ? null : AppColor.neutral20), - labelText: "Name/Oracle Code", + labelText: "CM Work Order Number", labelStyle: AppTextStyles.tinyFont.copyWith(color: AppColor.textColor(context)), suffixIcon: loading ? const CircularProgressIndicator(color: AppColor.primary10, strokeWidth: 3.0).paddingOnly(end: 8) : null, ), @@ -119,11 +122,11 @@ class _WoAutoCompleteFieldState extends State { }, ); }, - onSelected: (AssetNDAutoCompleteByDynamicCodesModel selection) { + onSelected: (WoByAssetIdModel selection) { if (widget.clearAfterPick) { _controller.clear(); } else { - _controller.text = widget.byName ? (selection.displayName ?? "") : (selection.codeValue ?? ""); + _controller.text = widget.byName ? (selection.workOrderNo ?? "") : (selection.workOrderNo ?? ""); } widget.onPick(selection); },