From 8db40947168036fa4bd86272fc14423538b16ef4 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Tue, 3 Feb 2026 12:30:30 +0300 Subject: [PATCH] assign to me & cancel added for asset transfer. --- lib/controllers/api_routes/urls.dart | 2 + .../api/device_transfer_provider.dart | 47 ++++++++++ .../device_transfer_details.dart | 91 ++++++++++++++++++- 3 files changed, 138 insertions(+), 2 deletions(-) diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index e09e42a1..c07b1f03 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -313,6 +313,8 @@ class URLs { static get getAssetTransferById => "$_baseUrl/AssetTransfer/GetAssetTransferNewById"; // get static get createAssetTransferRequest => "$_baseUrl/AssetTransfer/AddAssetTransferMobileNew"; // post static get updateDeviceTransfer => "$_baseUrl/AssetTransfer/UpdateEngineerAssetTransferNew"; // get + static get assetTransferAssignEngineerToHimself => "$_baseUrl/AssetTransfer/AssignEngineerToHimself"; // get + static get assetTransferEngineerReject => "$_baseUrl/AssetTransfer/EngineerReject"; // get // employee static get getEmployees => "$_baseUrl/Lookups/GetLookup?lookupEnum=33"; // get diff --git a/lib/controllers/providers/api/device_transfer_provider.dart b/lib/controllers/providers/api/device_transfer_provider.dart index b3191c18..63468cc5 100644 --- a/lib/controllers/providers/api/device_transfer_provider.dart +++ b/lib/controllers/providers/api/device_transfer_provider.dart @@ -222,4 +222,51 @@ class DeviceTransferProvider extends ChangeNotifier { return -1; } } + + Future assignEngineerToHimselfInternal(num id, String empId) async { + try { + Map body = {"assetTransferId": id, "senderAssignEmployeeId": empId, "receiverAssignEmployeeId": empId}; + Response response = await ApiManager.instance.post(URLs.assetTransferAssignEngineerToHimself, body: body); + if (response.statusCode >= 200 && response.statusCode < 300) { + return DeviceTransfer.fromJson(json.decode(response.body)["data"]); + } else { + return null; + } + } catch (error) { + return null; + } + } + + Future assignEngineerToHimselfExternal(num id, bool isSender, String empId) async { + try { + Map body = {"assetTransferId": id}; + if (isSender) { + body["senderAssignEmployeeId"] = empId; + } else { + body["receiverAssignEmployeeId"] = empId; + } + Response response = await ApiManager.instance.post(URLs.assetTransferAssignEngineerToHimself, body: body); + if (response.statusCode >= 200 && response.statusCode < 300) { + return DeviceTransfer.fromJson(json.decode(response.body)["data"]); + } else { + return null; + } + } catch (error) { + return null; + } + } + + Future engineerReject(Map body) async { + try { + Response response = await ApiManager.instance.post(URLs.assetTransferEngineerReject, body: body); + if (response.statusCode >= 200 && response.statusCode < 300) { + // gasRefillModel = DeviceTransfer.fromJson(json.decode(response.body)["data"]); + return DeviceTransfer.fromJson(json.decode(response.body)["data"]); + } else { + return null; + } + } catch (error) { + return null; + } + } } diff --git a/lib/modules/tm_module/device_transfer/device_transfer_details.dart b/lib/modules/tm_module/device_transfer/device_transfer_details.dart index 6e843398..a19456c0 100644 --- a/lib/modules/tm_module/device_transfer/device_transfer_details.dart +++ b/lib/modules/tm_module/device_transfer/device_transfer_details.dart @@ -8,8 +8,11 @@ import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; +import 'package:test_sa/helper/utils.dart'; import 'package:test_sa/models/device/device_transfer.dart'; import 'package:test_sa/modules/cx_module/chat/chat_widget.dart'; +import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; +import 'package:test_sa/views/widgets/bottom_sheets/rejection_reason_bottom_sheet.dart'; import 'package:test_sa/views/widgets/images/files_list.dart'; import 'package:test_sa/views/widgets/loaders/app_loading.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; @@ -191,7 +194,15 @@ class _DeviceTransferDetailsState extends State { _internalRequestDetailsCard() { bool isCurrentEngineerEligibleForEdit = _model?.senderAssignedEmployeeId == _userProvider!.user?.userID; - bool isCurrentRequestEditAble = (!(_model?.senderMachineStatusValue == 3)); + bool isCurrentRequestEditAble = (!(_model?.senderMachineStatusValue == 5)); + bool isCurrentRequestInProgress = (_model?.senderMachineStatusValue == 1); + + // bool isCurrentRequestClosed = isSender ? ((_model?.senderMachineStatusValue == 3)) : ((_model?.receiverMachineStatusValue == 3)); + bool isCurrentRequestOpen = _model?.senderMachineStatusValue == 4; + + bool engineerCanAssignToHimself = (_userProvider!.user?.type == UsersTypes.engineer) && isCurrentRequestOpen && context.settingProvider.isUserFlowMedical; + bool engineerCanCancel = (_userProvider!.user?.type == UsersTypes.engineer) && isCurrentRequestInProgress && isCurrentEngineerEligibleForEdit && context.settingProvider.isUserFlowMedical; + return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -257,6 +268,42 @@ class _DeviceTransferDetailsState extends State { style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50), ), _buildTextWidget(_model?.senderComment ?? ''), + ], + + if (engineerCanAssignToHimself) ...[ + 16.height, + AppFilledButton( + onPressed: () async { + Utils.showLoading(context); + await Provider.of(context, listen: false).assignEngineerToHimselfInternal(_model!.id!.toInt(), context.userProvider.user!.userID!); + Utils.hideLoading(context); + setState(() {}); + }, + label: 'Assign To Me', + ), + ] else if (engineerCanCancel) ...[ + 16.height, + AppFilledButton( + label: context.translation.cancel, + buttonColor: AppColor.white60, + textColor: AppColor.black10, + loading: false, + onPressed: () async { + context.showBottomSheet( + RejectionReasonBottomSheet( + onRejectPressed: (int reasonId, String comment) async { + await Future.delayed(const Duration(milliseconds: 500)); + var data = await Provider.of(context, listen: false) + .engineerReject({"assetTransferId": _model!.id!.toInt(), "rejectReasonId": reasonId, "rejectComment": comment}); + return data != null; + }, + onRefreshed: () { + setState(() {}); + }, + ), + title: "Rejection Reason".addTranslation); + }, + ) ] ], ).toShadowContainer(context); @@ -267,6 +314,11 @@ class _DeviceTransferDetailsState extends State { bool isCurrentEngineerEligibleForEdit = isSender ? _model?.senderAssignedEmployeeId == _userProvider!.user?.userID : _model?.receiverAssignedEmployeeId == _userProvider!.user?.userID; bool isCurrentRequestClosed = isSender ? ((_model?.senderMachineStatusValue == 3)) : ((_model?.receiverMachineStatusValue == 3)); + bool isCurrentRequestOpen = isSender ? ((_model?.senderMachineStatusValue == 4)) : ((_model?.receiverMachineStatusValue == 4)); + + bool engineerCanAssignToHimself = (_userProvider!.user?.type == UsersTypes.engineer) && isCurrentRequestOpen && context.settingProvider.isUserFlowMedical; + bool engineerCanCancel = (_userProvider!.user?.type == UsersTypes.engineer) && isCurrentEngineerEligibleForEdit && context.settingProvider.isUserFlowMedical; + return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -287,7 +339,7 @@ class _DeviceTransferDetailsState extends State { isShow: context.settingProvider.isUserFlowMedical && (isSender ? _deviceTransfer.senderMachineStatusValue! : _deviceTransfer.receiverMachineStatusValue!) != 0, isReadOnly: (isSender ? _deviceTransfer.senderMachineStatusValue! : _deviceTransfer.receiverMachineStatusValue) != 1, requestId: widget.model.id!.toInt(), - assigneeEmployeeNumber: isSender ? _deviceTransfer.senderAssignedEmployeeNumber! : _deviceTransfer.receiverAssignedEmployeeNumber!, + assigneeEmployeeNumber: isSender ? _deviceTransfer.senderAssignedEmployeeNumber : _deviceTransfer.receiverAssignedEmployeeNumber, myLoginUserID: context.userProvider.user!.employeeId ?? context.userProvider.user!.username!, contactEmployeeINumber: _deviceTransfer.assetTransferContactPersons!.first.employeeNumber, ), @@ -319,6 +371,41 @@ class _DeviceTransferDetailsState extends State { style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50), ), _buildTextWidget(comment), + ], + if (engineerCanAssignToHimself) ...[ + 16.height, + AppFilledButton( + onPressed: () async { + Utils.showLoading(context); + await Provider.of(context, listen: false).assignEngineerToHimselfExternal(_model!.id!.toInt(), isSender, context.userProvider.user!.userID!); + Utils.hideLoading(context); + setState(() {}); + }, + label: 'Assign To Me', + ), + ] else if (engineerCanCancel) ...[ + 16.height, + AppFilledButton( + label: context.translation.cancel, + buttonColor: AppColor.white60, + textColor: AppColor.black10, + loading: false, + onPressed: () async { + context.showBottomSheet( + RejectionReasonBottomSheet( + onRejectPressed: (int reasonId, String comment) async { + await Future.delayed(const Duration(milliseconds: 500)); + var data = await Provider.of(context, listen: false) + .engineerReject({"assetTransferId": _model!.id!.toInt(), "rejectReasonId": reasonId, "rejectComment": comment}); + return data != null; + }, + onRefreshed: () { + setState(() {}); + }, + ), + title: "Rejection Reason".addTranslation); + }, + ) ] ], ).toShadowContainer(context);