add timer list in asset transfer for sender and receiver

main_design2.0
nextwo 1 year ago
parent 45372d7cdd
commit 67854d2e8c

@ -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<int> updateRequest(BuildContext context, {@required AssetTransfer assetTransfer}) async {
Future<int> 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;
}
}

@ -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 = <VisitTimers>[];
if (json['assetTransferSenderTimers'] != null) {
json['assetTransferSenderTimers'].forEach((v) {
senderVisitTimers.add(VisitTimers.fromJson(v));
});
}
receiverVisitTimers = <VisitTimers>[];
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<VisitTimers> senderVisitTimers;
List<VisitTimers> 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<VisitTimers> senderVisitTimers,
List<VisitTimers> 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<String, dynamic> 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<bool> 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;
}

@ -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<UpdateDeviceTransfer> {
_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<UpdateDeviceTransfer> {
} 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<UpdateDeviceTransfer> {
_settingProvider = Provider.of<SettingProvider>(context);
_deviceTransferProvider = Provider.of<AssetTransferProvider>(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<UpdateDeviceTransfer> {
//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<UpdateDeviceTransfer> {
],
).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();
}
}

Loading…
Cancel
Save