From 19cd20c64576360831c263304cd9521446e5368e Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Thu, 31 Aug 2023 11:02:23 +0300 Subject: [PATCH] 1- Fix Vendor Engineer Issue 2- Add Install Qty & Return Qty --- .../api/service_requests_provider.dart | 2 +- lib/models/part.dart | 23 ++++--- .../service_request/search_work_order.dart | 9 ++- .../sub_work_order_details.dart | 9 +-- .../create_sub_workorder_page.dart | 10 ++- .../spare_parts_details_bottom_sheet.dart | 61 +++++++++++++++---- .../work_order_details_bottom_sheet.dart | 22 ++++--- .../parts/auto_complete_parts_field.dart | 6 +- lib/views/widgets/parts/part_item.dart | 11 ++-- .../widgets/pentry/pentry_pm_kit_form.dart | 2 +- 10 files changed, 103 insertions(+), 52 deletions(-) diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index 41e749c0..e62754f7 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -339,7 +339,7 @@ class ServiceRequestsProvider extends ChangeNotifier { ?.map( (p) => { "id": p.reportPartID ?? 0, - "sparePart": {"id": p.id, "partNo": p.code, "partName": p.name}, + "sparePart": {"id": p.id, "partNo": p.partNo, "partName": p.partName}, "qty": p.quantity }, ) diff --git a/lib/models/part.dart b/lib/models/part.dart index 176811cc..9f8b0cad 100644 --- a/lib/models/part.dart +++ b/lib/models/part.dart @@ -1,23 +1,28 @@ class Part { int id; int reportPartID; - String code; - String name; + String partNo; + String partName; int quantity; + double returnQty, installQty; Part({ this.id, this.reportPartID, - this.code, - this.name, + this.partNo, + this.partName, this.quantity = 1, + this.installQty, + this.returnQty, }); Map toJson() { return { "id": reportPartID ?? 0, - "sparePart": {"id": id, "partNo": code, "partName": name}, - "qty": quantity + "sparePart": {"id": id, "partNo": partNo, "partName": partName}, + "qty": quantity, + if (returnQty != null) "returnQty": returnQty, + if (installQty != null) "installQty": installQty, }; } @@ -25,9 +30,11 @@ class Part { return Part( id: parsedJson["id"], reportPartID: reportJson != null ? reportJson["id"] : null, - code: parsedJson["partNo"], - name: parsedJson["partName"], + partNo: parsedJson["partNo"], + partName: parsedJson["partName"], quantity: reportJson != null ? (reportJson["qty"] ?? 1).toInt() : 1, + returnQty: parsedJson["returnQty"], + installQty: parsedJson["installQty"], ); } } diff --git a/lib/models/service_request/search_work_order.dart b/lib/models/service_request/search_work_order.dart index 564b7dd6..e4f9fa08 100644 --- a/lib/models/service_request/search_work_order.dart +++ b/lib/models/service_request/search_work_order.dart @@ -1,4 +1,5 @@ import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/service_request/sub_work_order_details.dart'; import 'package:test_sa/models/timer_model.dart'; import '../fault_description.dart'; @@ -163,7 +164,6 @@ class SearchWorkOrder { Lookup currentSituation; Lookup repairLocation; Lookup reason; - // String startofWorkTime; // String endofWorkTime; num workingHours; @@ -321,6 +321,13 @@ class SearchWorkOrder { } return map; } + + void copyDetails(SubWorkOrderDetails subWoDetails) { + equipmentStatus = subWoDetails.equipmentStatus; + reason = subWoDetails.reason; + faultDescription = subWoDetails.faultDescription; + sparePartsWorkOrders = subWoDetails.sparePartsWorkOrders; + } } class WoParentDto { diff --git a/lib/models/service_request/sub_work_order_details.dart b/lib/models/service_request/sub_work_order_details.dart index e47d93f8..4d0e553d 100644 --- a/lib/models/service_request/sub_work_order_details.dart +++ b/lib/models/service_request/sub_work_order_details.dart @@ -1,3 +1,5 @@ +import 'dart:developer'; + import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/service_request/search_work_order.dart'; @@ -7,14 +9,12 @@ class SubWorkOrderDetails { Lookup equipmentStatus; Lookup reason; FaultDescription faultDescription; - // Lookup loanAvailablity; List sparePartsWorkOrders; SubWorkOrderDetails({ this.equipmentStatus, this.reason, this.faultDescription, - // this.loanAvailablity, this.sparePartsWorkOrders, }); @@ -22,7 +22,7 @@ class SubWorkOrderDetails { if (json['equipmentStatus'] != null) equipmentStatus = Lookup.fromJson(json['equipmentStatus']); if (json['reason'] != null) reason = Lookup.fromJson(json['reason']); if (json['faultDescription'] != null) faultDescription = FaultDescription.fromJson(json['faultDescription']); - // loanAvailablity = Lookup.fromJson(json['loanAvailablity']); + log("supplier : ${json['supplier']}"); if (json['sparePartsWorkOrders'] != null) { sparePartsWorkOrders = []; json['sparePartsWorkOrders'].forEach((v) { @@ -35,14 +35,12 @@ class SubWorkOrderDetails { Lookup equipmentStatus, Lookup reason, FaultDescription faultDescription, - // Lookup loanAvailablity, List sparePartsWorkOrders, }) => SubWorkOrderDetails( equipmentStatus: equipmentStatus ?? this.equipmentStatus, reason: reason ?? this.reason, faultDescription: faultDescription ?? this.faultDescription, - // loanAvailablity: loanAvailablity ?? this.loanAvailablity, sparePartsWorkOrders: sparePartsWorkOrders ?? this.sparePartsWorkOrders, ); @@ -51,7 +49,6 @@ class SubWorkOrderDetails { map['equipmentStatus'] = equipmentStatus?.toMap(); map['reason'] = reason?.toMap(); map['faultDescription'] = faultDescription?.toJson(); - // map['loanAvailablity'] = loanAvailablity?.toMap(); if (sparePartsWorkOrders?.isNotEmpty ?? false) { map['sparePartsWorkOrders'] = sparePartsWorkOrders?.map((e) => e.toJson())?.toList(); } 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 7511fa91..129790b7 100644 --- a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart +++ b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart @@ -75,15 +75,13 @@ class _CreateSubWorkOrderPageState extends State { 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.equipmentStatus = subWoDetails.equipmentStatus; - _subWorkOrders.reason = subWoDetails.reason; - _serviceReportReason = _subWorkOrders.reason; - _subWorkOrders.faultDescription = subWoDetails.faultDescription; - _subWorkOrders.sparePartsWorkOrders = subWoDetails.sparePartsWorkOrders; + _subWorkOrders.copyDetails(subWoDetails); _serviceReport.equipmentStatus = subWoDetails.equipmentStatus; _serviceReport.reason = subWoDetails.reason; _serviceReport.faultDescription = subWoDetails.faultDescription; + _serviceReportReason = _subWorkOrders.reason; } await assetTypesProvider.getTypes(); _subWorkOrders?.assetType = assetTypesProvider.statuses?.firstWhere( @@ -213,7 +211,7 @@ class _CreateSubWorkOrderPageState extends State { onSelect: (status) { _serviceReportReason = status; _subWorkOrders.reason = status; - setState(() {}); + // setState(() {}); }, ), ], diff --git a/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart b/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart index 661d0cbe..f9bee3ec 100644 --- a/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart +++ b/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart @@ -6,6 +6,7 @@ import 'package:test_sa/views/app_style/colors.dart'; import '../../../controllers/localization/localization.dart'; import '../../../models/subtitle.dart'; import '../../app_style/sizing.dart'; +import '../../widgets/app_text_form_field.dart'; import '../../widgets/buttons/app_button.dart'; import '../../widgets/parts/auto_complete_parts_field.dart'; import '../../widgets/parts/part_item.dart'; @@ -101,7 +102,7 @@ class _SparePartsBottomSheetState extends State { _workOrder.sparePartsWorkOrders.add(SparePartsWorkOrders( id: part.reportPartID, qty: part.quantity, - sparePart: SparePart(id: part.id, partName: part.name, partNo: part.code), + sparePart: SparePart(id: part.id, partName: part.partName, partNo: part.partNo), )); }, ), @@ -129,19 +130,55 @@ class _SparePartsBottomSheetState extends State { Part part = Part( id: spare.sparePart?.id, reportPartID: spare.id, - code: spare.sparePart?.partNo, - name: spare.sparePart?.partName, + partNo: spare.sparePart?.partNo, + partName: spare.sparePart?.partName, quantity: spare.qty?.toInt(), + installQty: spare.installQty, + returnQty: spare.returnQty, ); - return PartItem( - part: part, - onEdit: (qty) { - spare.qty = qty; - }, - onDelete: (part) { - _workOrder.sparePartsWorkOrders.remove(spare); - setState(() {}); - }, + return Column( + children: [ + PartItem( + part: part, + onEdit: (qty) { + spare.qty = qty; + }, + onDelete: (part) { + _workOrder.sparePartsWorkOrders.remove(spare); + setState(() {}); + }, + ), + if (_workOrder.calllastSituation?.name?.toLowerCase()?.contains("part installation") ?? false) + Row( + children: [ + Expanded( + child: ATextFormField( + initialValue: part?.returnQty?.toString(), + hintText: "Return Quantity", + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.titleMedium, + textInputType: TextInputType.number, + onSaved: (value) { + part.returnQty = num.tryParse(value); + }, + ), + ), + const SizedBox(width: 8), + Expanded( + child: ATextFormField( + initialValue: part?.installQty?.toString(), + hintText: "Install Quantity", + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.titleMedium, + textInputType: TextInputType.number, + onSaved: (value) { + part.installQty = num.tryParse(value); + }, + ), + ), + ], + ), + ], ); }, ), diff --git a/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart b/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart index fb595275..b8f1ebd4 100644 --- a/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart +++ b/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/service_request/search_work_order.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/widgets/app_text_form_field.dart'; @@ -33,10 +34,10 @@ class _WorkOrderDetailsBottomSheetState extends State { }, itemBuilder: (context, part) { return ListTile( - title: Text(part.code), + title: Text(part.partNo), subtitle: Text( - part.name, + part.partName, style: Theme.of(context).textTheme.caption, ), ); @@ -79,7 +79,7 @@ class _AutoCompletePartsFieldState extends State { if (widget.clearAfterPick) { _controller.clear(); } else { - _controller.text = part.code; + _controller.text = part.partNo; } widget.onPick(part); }, diff --git a/lib/views/widgets/parts/part_item.dart b/lib/views/widgets/parts/part_item.dart index 87fcec03..0d98b0e0 100644 --- a/lib/views/widgets/parts/part_item.dart +++ b/lib/views/widgets/parts/part_item.dart @@ -21,7 +21,8 @@ class _PartItemState extends State { return Column( children: [ const Divider(), - Row(crossAxisAlignment: CrossAxisAlignment.start, + Row( + crossAxisAlignment: CrossAxisAlignment.start, children: [ Expanded( child: Column( @@ -31,7 +32,7 @@ class _PartItemState extends State { children: [ Expanded( child: Text( - widget?.part?.code ?? "", + widget?.part?.partNo ?? "", style: Theme.of(context).textTheme.bodyText1.copyWith(fontSize: 12, fontWeight: FontWeight.bold), ), ), @@ -76,16 +77,16 @@ class _PartItemState extends State { ), ], ), - widget.part.name == null + widget.part.partName == null ? const SizedBox.shrink() : Text( - widget.part.name, + widget.part.partName, style: Theme.of(context).textTheme.caption.copyWith(fontSize: 11, fontWeight: FontWeight.bold), maxLines: 1, overflow: TextOverflow.ellipsis, ), - // Row(crossAxisAlignment: ,) + // Row(crossAxisAlignment: ,) ], ), ), diff --git a/lib/views/widgets/pentry/pentry_pm_kit_form.dart b/lib/views/widgets/pentry/pentry_pm_kit_form.dart index 3fb154d7..f072bc84 100644 --- a/lib/views/widgets/pentry/pentry_pm_kit_form.dart +++ b/lib/views/widgets/pentry/pentry_pm_kit_form.dart @@ -74,7 +74,7 @@ class _PentryPMKitFormState extends State { clearAfterPick: false, initialValue: (model.itemCode?.name ?? "").toString(), onPick: (part) { - model.itemCode = Lookup(id: part.id, name: part.code); + model.itemCode = Lookup(id: part.id, name: part.partNo); }, ), const SizedBox(