From 67854d2e8c61b48b964317c729ab7021229a4dd4 Mon Sep 17 00:00:00 2001 From: nextwo <1234> Date: Mon, 8 Jul 2024 09:29:18 +0300 Subject: [PATCH] add timer list in asset transfer for sender and receiver --- .../api/asset_transfer_provider.dart | 12 +-- lib/models/device/asset_transfer.dart | 84 +++++++++++----- .../update_device_transfer.dart | 95 ++++++++++++++++--- 3 files changed, 146 insertions(+), 45 deletions(-) diff --git a/lib/controllers/providers/api/asset_transfer_provider.dart b/lib/controllers/providers/api/asset_transfer_provider.dart index 06da088c..5328f845 100644 --- a/lib/controllers/providers/api/asset_transfer_provider.dart +++ b/lib/controllers/providers/api/asset_transfer_provider.dart @@ -11,6 +11,7 @@ import 'package:test_sa/models/device/asset_transfer.dart'; import 'package:test_sa/models/user.dart'; import '../../../models/hospital.dart'; +import '../../../models/ppm/ppm.dart'; import '../../../new_views/common_widgets/app_lazy_loading.dart'; class AssetTransferProvider extends ChangeNotifier { @@ -148,19 +149,13 @@ class AssetTransferProvider extends ChangeNotifier { } } - Future updateRequest(BuildContext context, {@required AssetTransfer assetTransfer}) async { + Future updateRequest(BuildContext context, {@required AssetTransfer assetTransfer, @required bool isSender}) async { Response response; try { showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); - assetTransfer.receiverStartDate = assetTransfer.receiverTimer?.startAt?.toIso8601String(); - assetTransfer.receiverEndDate = assetTransfer.receiverTimer?.endAt?.toIso8601String(); - assetTransfer.receiverWorkingHours = (((assetTransfer.receiverTimer?.durationInSecond ?? 0) / 60) / 60).toStringAsFixed(2); - assetTransfer.senderStartDate = assetTransfer.senderTimer?.startAt?.toIso8601String(); - assetTransfer.senderEndDate = assetTransfer.senderTimer?.endAt?.toIso8601String(); - assetTransfer.senderWorkingHours = (((assetTransfer.senderTimer?.durationInSecond ?? 0) / 60) / 60).toStringAsFixed(2); response = await ApiManager.instance.put(URLs.updateDeviceTransfer, body: assetTransfer.toJson()); - print(response.body); + //print(response.body); // print("${newModel.engSignature}.png"); // response = await post( // Uri.parse("$host${URLs.updateDeviceTransfer}/$requestId"), @@ -185,6 +180,7 @@ class AssetTransferProvider extends ChangeNotifier { return response.statusCode; } catch (error) { Navigator.pop(context); + print(error); return -1; } } diff --git a/lib/models/device/asset_transfer.dart b/lib/models/device/asset_transfer.dart index 6e31cac8..c87deb08 100644 --- a/lib/models/device/asset_transfer.dart +++ b/lib/models/device/asset_transfer.dart @@ -2,6 +2,7 @@ import 'package:flutter/src/widgets/framework.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/models/device/asset.dart'; +import 'package:test_sa/models/ppm/ppm.dart'; import 'package:test_sa/models/timer_model.dart'; import 'asset_transfer_attachment.dart'; @@ -69,8 +70,9 @@ class AssetTransfer { this.senderSiteName, this.supplierId, this.supplierName, - this.senderTimer, - this.receiverTimer, + this.senderVisitTimers, + this.receiverVisitTimers, + this.tbsTimer }); AssetTransfer.fromJson(dynamic json) { @@ -113,20 +115,33 @@ class AssetTransfer { receiverWorkingHours = json['receiverWorkingHours']; receiverTravelingHours = json['receiverTravelingHours']; receiverEngSignature = json['receiverEngSignature']; - try { - receiverTimer = TimerModel(startAt: DateTime.tryParse(receiverStartDate ?? ""), endAt: DateTime.tryParse(receiverEndDate ?? "")); - senderTimer = TimerModel(startAt: DateTime.tryParse(senderStartDate ?? ""), endAt: DateTime.tryParse(senderEndDate ?? "")); - if (receiverTimer.endAt != null && receiverTimer.startAt != null) { - receiverTimer.durationInSecond = (receiverTimer.endAt.difference(receiverTimer.startAt))?.inSeconds; - receiverWorkingHours = (((receiverTimer.durationInSecond ?? 0) / 60) / 60)?.toStringAsFixed(2); - } - if (senderTimer.endAt != null && senderTimer.startAt != null) { - senderTimer.durationInSecond = (senderTimer.endAt.difference(senderTimer.startAt))?.inSeconds; - senderWorkingHours = (((senderTimer.durationInSecond ?? 0) / 60) / 60)?.toStringAsFixed(2); - } - } catch (e) { - print(e); + senderVisitTimers = []; + if (json['assetTransferSenderTimers'] != null) { + json['assetTransferSenderTimers'].forEach((v) { + senderVisitTimers.add(VisitTimers.fromJson(v)); + }); + } + receiverVisitTimers = []; + if (json['assetTransferReceiverTimers'] != null) { + json['assetTransferReceiverTimers'].forEach((v) { + receiverVisitTimers.add(VisitTimers.fromJson(v)); + }); } + tbsTimer = TimerModel(); + // try { + // receiverTimer = TimerModel(startAt: DateTime.tryParse(receiverStartDate ?? ""), endAt: DateTime.tryParse(receiverEndDate ?? "")); + // senderTimer = TimerModel(startAt: DateTime.tryParse(senderStartDate ?? ""), endAt: DateTime.tryParse(senderEndDate ?? "")); + // if (receiverTimer.endAt != null && receiverTimer.startAt != null) { + // receiverTimer.durationInSecond = (receiverTimer.endAt.difference(receiverTimer.startAt))?.inSeconds; + // receiverWorkingHours = (((receiverTimer.durationInSecond ?? 0) / 60) / 60)?.toStringAsFixed(2); + // } + // if (senderTimer.endAt != null && senderTimer.startAt != null) { + // senderTimer.durationInSecond = (senderTimer.endAt.difference(senderTimer.startAt))?.inSeconds; + // senderWorkingHours = (((senderTimer.durationInSecond ?? 0) / 60) / 60)?.toStringAsFixed(2); + // } + // } catch (e) { + // print(e); + // } if (json['receiverAttachments'] != null) { receiverAttachments = []; json['receiverAttachments'].forEach((v) { @@ -222,8 +237,10 @@ class AssetTransfer { bool applied; String createdOn; String modifiedOn; - TimerModel senderTimer = TimerModel(); - TimerModel receiverTimer = TimerModel(); + List senderVisitTimers; + List receiverVisitTimers; + TimerModel tbsTimer = TimerModel(); + AssetTransfer copyWith({ num id, @@ -288,8 +305,9 @@ class AssetTransfer { int manufacturerId, String manufacturerName, String destDepartmentName, - TimerModel senderTimer, - TimerModel receiverTimer, + List senderVisitTimers, + List receiverVisitTimers, + TimerModel tbsTimer }) => AssetTransfer( id: id ?? this.id, @@ -352,8 +370,9 @@ class AssetTransfer { modelId: modelId ?? this.modelId, modelName: modelName ?? this.modelName, manufacturerId: manufacturerId ?? this.manufacturerId, - senderTimer: senderTimer ?? this.senderTimer, - receiverTimer: receiverTimer ?? this.receiverTimer, + senderVisitTimers: senderVisitTimers??this.senderVisitTimers, + receiverVisitTimers: receiverVisitTimers??this.receiverVisitTimers, + tbsTimer: tbsTimer??this.tbsTimer, manufacturerName: manufacturerName ?? this.manufacturerName); Map toJson() { @@ -383,6 +402,12 @@ class AssetTransfer { map['senderWorkingHours'] = senderWorkingHours; map['senderTravelingHours'] = senderTravelingHours; map['senderEngSignature'] = senderEngSignature; + if (this.senderVisitTimers != null) { + map['assetTransferSenderTimers'] = this.senderVisitTimers.map((v) => v.toJson()).toList(); + } + if (this.receiverVisitTimers != null) { + map['assetTransferReceiverTimers'] = this.receiverVisitTimers.map((v) => v.toJson()).toList(); + } if (senderAttachments != null) { map['senderAttachments'] = senderAttachments.map((v) => v.toJson()).toList(); } @@ -456,6 +481,12 @@ class AssetTransfer { if (senderAttachments != null) { map['senderAttachments'] = senderAttachments.map((v) => v.toJson()).toList(); } + if (senderVisitTimers != null) { + map['assetTransferSenderTimers'] = senderVisitTimers.map((v) => v.toJson()).toList(); + } + if (receiverVisitTimers != null) { + map['assetTransferReceiverTimers'] = receiverVisitTimers.map((v) => v.toJson()).toList(); + } map['receiverAssignedEmployeeId'] = receiverAssignedEmployeeId; map['receiverMachineStatusId'] = receiverMachineStatusId; map['receiverComment'] = receiverComment; @@ -533,8 +564,8 @@ class AssetTransfer { modelName = assetTransfer.modelName; manufacturerId = assetTransfer.manufacturerId; manufacturerName = assetTransfer.manufacturerName; - senderTimer = assetTransfer.senderTimer; - receiverTimer = assetTransfer.receiverTimer; + senderVisitTimers=assetTransfer.senderVisitTimers; + receiverVisitTimers=assetTransfer.receiverVisitTimers; } Future validate(BuildContext context) async { @@ -553,6 +584,13 @@ class AssetTransfer { } else if (destDepartmentId == null) { await Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.department}"); return false; + } if (tbsTimer?.startAt == null) { + await Fluttertoast.showToast(msg: "Working Hours Required"); + return false; + } + if (tbsTimer?.endAt == null) { + await Fluttertoast.showToast(msg: "Please Stop The Timer"); + return false; } return true; } diff --git a/lib/views/pages/device_transfer/update_device_transfer.dart b/lib/views/pages/device_transfer/update_device_transfer.dart index 18802d37..fd708225 100644 --- a/lib/views/pages/device_transfer/update_device_transfer.dart +++ b/lib/views/pages/device_transfer/update_device_transfer.dart @@ -25,6 +25,8 @@ import 'package:test_sa/views/widgets/status/asset_status.dart'; import '../../../controllers/validator/validator.dart'; import '../../../extensions/text_extensions.dart'; import '../../../models/lookup.dart'; +import '../../../models/ppm/ppm.dart'; +import '../../../new_views/app_style/app_color.dart'; import '../../../new_views/common_widgets/app_text_form_field.dart'; import '../../../new_views/common_widgets/default_app_bar.dart'; import '../../../new_views/common_widgets/single_item_drop_down_menu.dart'; @@ -58,11 +60,31 @@ class _UpdateDeviceTransferState extends State { _update() async { - if ((widget.isSender && _formModel?.senderTimer?.startAt == null) || (!widget.isSender && _formModel?.receiverTimer?.startAt == null)) { + if(widget.isSender) { + _formModel.senderVisitTimers.add( + VisitTimers( + id: 0, + startDateTime: _formModel.tbsTimer?.startAt?.toIso8601String(), + endDateTime: _formModel.tbsTimer?.endAt?.toIso8601String(), + workingHours: ((_formModel.tbsTimer?.durationInSecond ?? 0) / 60 / 60), + ), + ); + } else { + _formModel.receiverVisitTimers.add( + VisitTimers( + id: 0, + startDateTime: _formModel.tbsTimer?.startAt?.toIso8601String(), + endDateTime: _formModel.tbsTimer?.endAt?.toIso8601String(), + workingHours: ((_formModel.tbsTimer?.durationInSecond ?? 0) / 60 / 60), + ), + ); + } + + if (_formModel?.tbsTimer?.startAt == null) { await Fluttertoast.showToast(msg: "Working Hours Required"); return false; } - if ((widget.isSender && _formModel?.senderTimer?.endAt == null) || (!widget.isSender && _formModel?.receiverTimer?.endAt == null || isTimerRunning)) { + if (_formModel?.tbsTimer?.endAt == null || isTimerRunning) { await Fluttertoast.showToast(msg: "Please Stop The Timer"); return false; } @@ -96,14 +118,9 @@ class _UpdateDeviceTransferState extends State { } catch (error) { print(error); } - await _deviceTransferProvider.updateRequest(context, assetTransfer: _formModel); + await _deviceTransferProvider.updateRequest(context, assetTransfer: _formModel, isSender:widget.isSender); } - // @override - // void setState(VoidCallback fn) { - // if (!mounted) super.setState(() {}); - // } - @override void initState() { _formModel.fromDetails(widget.model); @@ -131,6 +148,10 @@ class _UpdateDeviceTransferState extends State { _settingProvider = Provider.of(context); _deviceTransferProvider = Provider.of(context, listen: false); + double totalWorkingHours = widget.isSender? + widget.model.senderVisitTimers.fold(0.0, (sum, item) => sum + DateTime.parse(item.endDateTime).difference(DateTime.parse(item.startDateTime)).inSeconds) + : widget.model.receiverVisitTimers.fold(0.0, (sum, item) => sum + DateTime.parse(item.endDateTime).difference(DateTime.parse(item.startDateTime)).inSeconds); + bool isTimerEnable = widget.isSender ? (!(_formModel?.senderMachineStatusName?.toLowerCase()?.contains("close") ?? false) || !(_formModel?.senderMachineStatusName?.toLowerCase()?.contains("complete") ?? false)) : (!(_formModel?.receiverMachineStatusName?.toLowerCase()?.contains("close") ?? false) || !(_formModel?.receiverMachineStatusName?.toLowerCase()?.contains("complete") ?? false)); @@ -170,20 +191,43 @@ class _UpdateDeviceTransferState extends State { //validator: (value) => Validator.isNumeric(value) ? null : "allow numbers only", ), 8.height, + if (totalWorkingHours > 0.0) ...[ + Container( + height: 50.toScreenHeight, + padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth), + alignment: Alignment.centerLeft, + decoration: BoxDecoration( + color: context.isDark ? AppColor.neutral40 : AppColor.background(context), + borderRadius: BorderRadius.circular(10), + boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + "Total Working Time", + style: Theme.of(context).textTheme.bodySmall?.copyWith(color: context.isDark ? null : AppColor.neutral20, fontWeight: FontWeight.w500), + ), + Text( + " ${formatDuration(totalWorkingHours.round())}", + style: Theme.of(context).textTheme.bodyLarge, + ), + ], + ), + ), + 8.height, + ], AppTimer( label: context.translation.workingHours, - timer: widget.isSender ? _formModel.senderTimer : _formModel.receiverTimer, + timer: _formModel.tbsTimer, enabled: isTimerEnable, // enabled: widget.isSender ? _formModel.senderEndDate == null : (_formModel?.receiverMachineStatusName?.toLowerCase()?.contains("close") ?? false), timerProgress: (isRunning) { isTimerRunning = isRunning; }, onChange: (timer) async { - if (widget.isSender) { - _formModel.senderTimer = timer; - } else { - _formModel.receiverTimer = timer; - } + _formModel.tbsTimer = timer; return true; }, ), @@ -265,4 +309,27 @@ class _UpdateDeviceTransferState extends State { ], ).toShadowContainer(context); } + + String formatDuration(int seconds) { + int hours = seconds ~/ 3600; + int minutes = (seconds % 3600) ~/ 60; + int remainingSeconds = seconds % 60; + + String formattedDuration = ''; + if (hours > 0) { + formattedDuration += '$hours hour${hours > 1 ? 's' : ''} '; + } + if (minutes > 0) { + formattedDuration += '$minutes minute${minutes > 1 ? 's' : ''} '; + } + if (remainingSeconds > 0) { + formattedDuration += '$remainingSeconds second${remainingSeconds > 1 ? 's' : ''} '; + } + if (formattedDuration.isEmpty) { + formattedDuration = 'Less than a second'; + } + + return formattedDuration.trim(); + } + }