verification method issue fixed, if requester not confirms arrival.

design_3.0_dark_mode
Sikander Saleem 8 months ago
parent 3881b69963
commit bf44e5cbec

@ -75,6 +75,8 @@ class URLs {
static get engineerRejectUrl => '$_baseUrl/ServiceRequest/EngineerReject'; static get engineerRejectUrl => '$_baseUrl/ServiceRequest/EngineerReject';
static get returnToIHaveArrive => '$_baseUrl/ServiceRequest/ReturnToIHaveArrive';
static get engineerFixRemotlyUrl => '$_baseUrl/ServiceRequest/EngineerFixRemotly'; static get engineerFixRemotlyUrl => '$_baseUrl/ServiceRequest/EngineerFixRemotly';
static get engineerNeedVisitUrl => '$_baseUrl/ServiceRequest/EngineerNeedVisit'; static get engineerNeedVisitUrl => '$_baseUrl/ServiceRequest/EngineerNeedVisit';

@ -26,6 +26,7 @@ class PlanPreventiveVisit {
String? roomName; String? roomName;
String? fromDate; String? fromDate;
String? creationDate; String? creationDate;
String? createdDate;
String? closedDate; String? closedDate;
String? toDate; String? toDate;
AssignedEmployee? assignedEmployee; AssignedEmployee? assignedEmployee;
@ -69,8 +70,9 @@ class PlanPreventiveVisit {
this.departmentName, this.departmentName,
this.roomName, this.roomName,
this.fromDate, this.fromDate,
this.creationDate, this.creationDate,
this.closedDate, this.createdDate,
this.closedDate,
this.toDate, this.toDate,
this.assignedEmployee, this.assignedEmployee,
this.acutalDateOfVisit, this.acutalDateOfVisit,
@ -92,7 +94,7 @@ class PlanPreventiveVisit {
this.preventiveVisitKits, this.preventiveVisitKits,
this.preventiveVisitTimers, this.preventiveVisitTimers,
this.timerModelList, this.timerModelList,
this.ppMTimePicker, this.ppMTimePicker,
this.preventiveVisitSuppliers}); this.preventiveVisitSuppliers});
PlanPreventiveVisit.fromJson(Map<String, dynamic> json) { PlanPreventiveVisit.fromJson(Map<String, dynamic> json) {
@ -113,6 +115,7 @@ class PlanPreventiveVisit {
roomName = json['roomName']; roomName = json['roomName'];
fromDate = json['fromDate']; fromDate = json['fromDate'];
creationDate = json['creationDate']; creationDate = json['creationDate'];
createdDate = json['createdDate'];
closedDate = json['closedDate']; closedDate = json['closedDate'];
toDate = json['toDate']; toDate = json['toDate'];
assignedEmployee = json['assignedEmployee'] != null ? AssignedEmployee.fromJson(json['assignedEmployee']) : null; assignedEmployee = json['assignedEmployee'] != null ? AssignedEmployee.fromJson(json['assignedEmployee']) : null;

@ -243,8 +243,8 @@ class ServiceRequestDetailProvider extends ChangeNotifier {
} else { } else {
isReadOnlyRequest = false; isReadOnlyRequest = false;
} }
}else{ } else {
currentWorkOrder =null; currentWorkOrder = null;
} }
isLoading = false; isLoading = false;
notifyListeners(); notifyListeners();
@ -257,12 +257,12 @@ class ServiceRequestDetailProvider extends ChangeNotifier {
} }
//upload workorder attachment by engineer.. //upload workorder attachment by engineer..
Future addWorkOrderAttachment({required int woId, required List<File> attachments,required List<WorkOrderAttachments> otherAttachment}) async { Future addWorkOrderAttachment({required int woId, required List<File> attachments, required List<WorkOrderAttachments> otherAttachment}) async {
try { try {
List<WorkOrderAttachments> woAttachments = []; List<WorkOrderAttachments> woAttachments = [];
if(otherAttachment.isNotEmpty){ if (otherAttachment.isNotEmpty) {
woAttachments.addAll(otherAttachment); woAttachments.addAll(otherAttachment);
} }
for (var file in attachments) { for (var file in attachments) {
String fileName = ServiceRequestUtils.isLocalUrl(file.path) ? ("${file.path.split("/").last}|${base64Encode(File(file.path).readAsBytesSync())}") : file.path; String fileName = ServiceRequestUtils.isLocalUrl(file.path) ? ("${file.path.split("/").last}|${base64Encode(File(file.path).readAsBytesSync())}") : file.path;
woAttachments.add(WorkOrderAttachments(id: 0, name: fileName)); woAttachments.add(WorkOrderAttachments(id: 0, name: fileName));
@ -373,6 +373,22 @@ class ServiceRequestDetailProvider extends ChangeNotifier {
} }
} }
Future<bool> switchToIHaveArrived() async {
Response response;
try {
final body = {"workOrderId": currentWorkOrder?.data?.requestId};
response = await ApiManager.instance.post(URLs.returnToIHaveArrive, body: body);
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
currentWorkOrder = await WorkOrderDetail.fromJson(json.decode(response.body));
return true;
}
return false;
} catch (e) {
return false;
}
}
//engineerRejectWorkOrder...... //engineerRejectWorkOrder......
Future<int> engineerRejectWorkOrder() async { Future<int> engineerRejectWorkOrder() async {
Response response; Response response;
@ -948,7 +964,7 @@ class ServiceRequestDetailProvider extends ChangeNotifier {
isLoading = true; isLoading = true;
notifyListeners(); notifyListeners();
try { try {
final response = await ApiManager.instance.post(URLs.sendOtpUrl + "$workOrderId", body: {},showToast: false); final response = await ApiManager.instance.post(URLs.sendOtpUrl + "$workOrderId", body: {}, showToast: false);
stateCode = response.statusCode; stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {} if (response.statusCode >= 200 && response.statusCode < 300) {}
isLoading = false; isLoading = false;

@ -3,6 +3,7 @@ import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/enums/user_types.dart';
@ -17,6 +18,7 @@ import 'package:test_sa/modules/cm_module/views/components/verify_arrival_view.d
import 'package:test_sa/modules/cm_module/views/forms/asset_retired/verify_asset_detail.dart'; import 'package:test_sa/modules/cm_module/views/forms/asset_retired/verify_asset_detail.dart';
import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
import 'package:test_sa/new_views/common_widgets/app_lazy_loading.dart';
import 'package:test_sa/new_views/swipe_module/dialoge/acknowledge_work_dialog.dart'; import 'package:test_sa/new_views/swipe_module/dialoge/acknowledge_work_dialog.dart';
import 'package:test_sa/providers/service_request_providers/reject_reason_provider.dart'; import 'package:test_sa/providers/service_request_providers/reject_reason_provider.dart';
@ -242,11 +244,46 @@ class FooterActionButton {
)); ));
case WorkOrderNextStepEnum.waitingForRequesterToConfirm: case WorkOrderNextStepEnum.waitingForRequesterToConfirm:
return footerContainer( return footerContainer(
child: AppFilledButton( child: Column(
label: 'Waiting for requester to verify', mainAxisSize: MainAxisSize.min,
buttonColor: AppColor.neutral140, crossAxisAlignment: CrossAxisAlignment.start,
textColor: AppColor.neutral150, children: [
fontSize: 12.toScreenWidth, AppFilledButton(
label: 'Waiting for requester to verify',
buttonColor: AppColor.neutral140,
textColor: AppColor.neutral150,
fontSize: 12.toScreenWidth,
),
12.height,
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Icon(Icons.info_outline_rounded, size: 16, color: context.isDark ? AppColor.neutral10 : AppColor.neutral120),
6.width,
Text(
"If you're experiencing issues with verification, please select another method to continue",
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120),
).expanded,
],
),
12.height,
AppFilledButton(
label: "Switch Arrival Method",
showIcon: true,
buttonColor: AppColor.green70,
onPressed: () {
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
Provider.of<ServiceRequestDetailProvider>(context, listen: false).switchToIHaveArrived().then((value) {
Navigator.pop(context);
if (value) {
Navigator.push(context, MaterialPageRoute(builder: (context) => const VerifyArrivalView()));
} else {
"Failed to switch, please try again".showToast;
}
});
},
)
],
)); ));
case WorkOrderNextStepEnum.eFixRemotely: case WorkOrderNextStepEnum.eFixRemotely:
return footerContainer( return footerContainer(

@ -86,13 +86,18 @@ class _ServiceRequestDetailViewState extends State<ServiceRequestDetailView> {
], ],
), ),
).expanded, ).expanded,
FooterActionButton.requestDetailsFooterWidget( SafeArea(
workOrderNextStepStatus: requestProvider.currentWorkOrder!.data!.nextStep!.workOrderNextStepEnum!, top: false,
status: requestProvider.currentWorkOrder?.data?.status, right: false,
isEmpIsAssigned: requestProvider.currentWorkOrder!.data!.assignedEmployee != null, left: false,
activities: requestProvider.currentWorkOrder!.data?.activities ?? [], child: FooterActionButton.requestDetailsFooterWidget(
userProvider: _userProvider, workOrderNextStepStatus: requestProvider.currentWorkOrder!.data!.nextStep!.workOrderNextStepEnum!,
context: context), status: requestProvider.currentWorkOrder?.data?.status,
isEmpIsAssigned: requestProvider.currentWorkOrder!.data!.assignedEmployee != null,
activities: requestProvider.currentWorkOrder!.data?.activities ?? [],
userProvider: _userProvider,
context: context),
).toShadowContainer(context, padding: 0, showShadow: false, borderRadius: 0),
], ],
), ),
//no need to show timer as discussed with backend //no need to show timer as discussed with backend

@ -118,6 +118,11 @@ class _AssistantEmployeeCardState extends State<AssistantEmployeeCard> {
// Handle the selected date and time here. // Handle the selected date and time here.
if (selectedTime != null) { if (selectedTime != null) {
DateTime selectedDateTime = DateTime(selectedDate.year, selectedDate.month, selectedDate.day, selectedTime.hour, selectedTime.minute); DateTime selectedDateTime = DateTime(selectedDate.year, selectedDate.month, selectedDate.day, selectedTime.hour, selectedTime.minute);
if (requestDetailProvider.currentWorkOrder?.data?.requestedDate != null && selectedDateTime.isBefore(requestDetailProvider.currentWorkOrder!.data!.requestedDate!)) {
"Start time is before the request time.".showToast;
selectedTime = null;
return;
}
if (selectedDateTime.isAfter(DateTime.now())) { if (selectedDateTime.isAfter(DateTime.now())) {
"Start time is after than current time".showToast; "Start time is after than current time".showToast;
selectedTime = null; selectedTime = null;

@ -147,6 +147,11 @@ class _ExternalMaintenanceRequestState extends State<ExternalMaintenanceRequest>
// Handle the selected date and time here. // Handle the selected date and time here.
if (selectedTime != null) { if (selectedTime != null) {
DateTime selectedDateTime = DateTime(selectedDate.year, selectedDate.month, selectedDate.day, selectedTime.hour, selectedTime.minute); DateTime selectedDateTime = DateTime(selectedDate.year, selectedDate.month, selectedDate.day, selectedTime.hour, selectedTime.minute);
if (requestDetailProvider.currentWorkOrder?.data?.requestedDate != null && selectedDateTime.isBefore(requestDetailProvider.currentWorkOrder!.data!.requestedDate!)) {
"Start time is before the request time.".showToast;
selectedTime = null;
return;
}
if (selectedDateTime.isAfter(DateTime.now())) { if (selectedDateTime.isAfter(DateTime.now())) {
"Start time is after than current time".showToast; "Start time is after than current time".showToast;
selectedTime = null; selectedTime = null;

@ -185,7 +185,7 @@ class _ExternalDetailItemState extends State<ExternalDetailItem> {
backgroundColor: AppColor.neutral100, backgroundColor: AppColor.neutral100,
date: widget.model.startDateTime, date: widget.model.startDateTime,
formatDateWithTime: true, formatDateWithTime: true,
from: DateTime.tryParse(_ppmProvider?.planPreventiveVisit?.creationDate ?? ''), from: DateTime.tryParse(_ppmProvider?.planPreventiveVisit?.createdDate ?? ''),
onDatePicker: (selectedDate) { onDatePicker: (selectedDate) {
showTimePicker( showTimePicker(
context: context, context: context,
@ -193,6 +193,11 @@ class _ExternalDetailItemState extends State<ExternalDetailItem> {
).then((selectedTime) { ).then((selectedTime) {
if (selectedTime != null) { if (selectedTime != null) {
DateTime selectedDateTime = DateTime(selectedDate.year, selectedDate.month, selectedDate.day, selectedTime.hour, selectedTime.minute); DateTime selectedDateTime = DateTime(selectedDate.year, selectedDate.month, selectedDate.day, selectedTime.hour, selectedTime.minute);
if (DateTime.tryParse(_ppmProvider?.planPreventiveVisit?.createdDate ?? '') != null && selectedDateTime.isBefore(DateTime.tryParse(_ppmProvider?.planPreventiveVisit?.createdDate ?? '')!)) {
"Start time is before the request time.".showToast;
selectedTime = null;
return;
}
if (selectedDateTime.isAfter(DateTime.now())) { if (selectedDateTime.isAfter(DateTime.now())) {
"Start time is after than current time".showToast; "Start time is after than current time".showToast;
selectedTime = null; selectedTime = null;
@ -223,7 +228,7 @@ class _ExternalDetailItemState extends State<ExternalDetailItem> {
date: widget.model.endDateTime, date: widget.model.endDateTime,
enable: widget.model.startDateTime != null, enable: widget.model.startDateTime != null,
formatDateWithTime: true, formatDateWithTime: true,
from: DateTime.tryParse(_ppmProvider?.planPreventiveVisit?.creationDate ?? ''), from: DateTime.tryParse(_ppmProvider?.planPreventiveVisit?.createdDate ?? ''),
onDatePicker: (selectedDate) { onDatePicker: (selectedDate) {
showTimePicker( showTimePicker(
context: context, context: context,

@ -363,7 +363,7 @@ class _WoInfoFormState extends State<WoInfoForm> {
width: double.infinity, width: double.infinity,
timer: widget.planPreventiveVisit.tbsTimer, timer: widget.planPreventiveVisit.tbsTimer,
pickerTimer: widget.planPreventiveVisit.ppMTimePicker, pickerTimer: widget.planPreventiveVisit.ppMTimePicker,
pickerFromDate: DateTime.tryParse(widget.planPreventiveVisit.creationDate ?? ''), pickerFromDate: DateTime.tryParse(widget.planPreventiveVisit.createdDate ?? ''),
onPick: (time) { onPick: (time) {
widget.planPreventiveVisit.ppMTimePicker = time; widget.planPreventiveVisit.ppMTimePicker = time;
}, },

@ -648,6 +648,7 @@ class _AssistantEmployeeCardState extends State<AssistantEmployeeCard> {
hideShadow: true, hideShadow: true,
backgroundColor: AppColor.neutral100, backgroundColor: AppColor.neutral100,
date: taskModel?.modelAssistantEmployees?.startDate, date: taskModel?.modelAssistantEmployees?.startDate,
// from: taskModel?.d,
formatDateWithTime: true, formatDateWithTime: true,
onDatePicker: (selectedDate) { onDatePicker: (selectedDate) {
showTimePicker( showTimePicker(
@ -657,6 +658,12 @@ class _AssistantEmployeeCardState extends State<AssistantEmployeeCard> {
// Handle the selected date and time here. // Handle the selected date and time here.
if (selectedTime != null) { if (selectedTime != null) {
DateTime selectedDateTime = DateTime(selectedDate.year, selectedDate.month, selectedDate.day, selectedTime.hour, selectedTime.minute); DateTime selectedDateTime = DateTime(selectedDate.year, selectedDate.month, selectedDate.day, selectedTime.hour, selectedTime.minute);
// if (widget.pickerFromDate != null && selectedDateTime.isBefore(widget.pickerFromDate!)) {
// "Start time is before the request time.".showToast;
// _pickerStartAt = null;
// selectedTime = null;
// return;
// }
if (selectedDateTime.isAfter(DateTime.now())) { if (selectedDateTime.isAfter(DateTime.now())) {
"Start time is after than current time".showToast; "Start time is after than current time".showToast;
selectedTime = null; selectedTime = null;

@ -449,6 +449,7 @@ class _AssistantEmployeeCardState extends State<AssistantEmployeeCard> {
hideShadow: true, hideShadow: true,
backgroundColor: AppColor.neutral100, backgroundColor: AppColor.neutral100,
date: widget.formModel?.modelAssistantEmployees?.startDate, date: widget.formModel?.modelAssistantEmployees?.startDate,
from: DateTime.tryParse(widget.formModel?.createdDate ?? ''),
formatDateWithTime: true, formatDateWithTime: true,
onDatePicker: (selectedDate) { onDatePicker: (selectedDate) {
showTimePicker( showTimePicker(
@ -458,6 +459,11 @@ class _AssistantEmployeeCardState extends State<AssistantEmployeeCard> {
// Handle the selected date and time here. // Handle the selected date and time here.
if (selectedTime != null) { if (selectedTime != null) {
DateTime selectedDateTime = DateTime(selectedDate.year, selectedDate.month, selectedDate.day, selectedTime.hour, selectedTime.minute); DateTime selectedDateTime = DateTime(selectedDate.year, selectedDate.month, selectedDate.day, selectedTime.hour, selectedTime.minute);
if (DateTime.tryParse(widget.formModel?.createdDate ?? '') != null && selectedDateTime.isBefore(DateTime.tryParse(widget.formModel?.createdDate ?? '')!)) {
"Start time is before the request time.".showToast;
selectedTime = null;
return;
}
if (selectedDateTime.isAfter(DateTime.now())) { if (selectedDateTime.isAfter(DateTime.now())) {
"Start time is after than current time".showToast; "Start time is after than current time".showToast;
selectedTime = null; selectedTime = null;

@ -174,6 +174,12 @@ class _AppTimerState extends State<AppTimer> {
).then((selectedTime) { ).then((selectedTime) {
if (selectedTime != null) { if (selectedTime != null) {
_pickerStartAt = DateTime(selectedDate.year, selectedDate.month, selectedDate.day, selectedTime.hour, selectedTime.minute); _pickerStartAt = DateTime(selectedDate.year, selectedDate.month, selectedDate.day, selectedTime.hour, selectedTime.minute);
if (widget.pickerFromDate != null && _pickerStartAt!.isBefore(widget.pickerFromDate!)) {
"Start time is before the request time.".showToast;
_pickerStartAt = null;
selectedTime = null;
return;
}
if (_pickerStartAt!.isAfter(DateTime.now())) { if (_pickerStartAt!.isAfter(DateTime.now())) {
"Start time is after than current time".showToast; "Start time is after than current time".showToast;
_pickerStartAt = null; _pickerStartAt = null;

Loading…
Cancel
Save