verification method issue fixed, if requester not confirms arrival.

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

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

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

@ -243,8 +243,8 @@ class ServiceRequestDetailProvider extends ChangeNotifier {
} else {
isReadOnlyRequest = false;
}
}else{
currentWorkOrder =null;
} else {
currentWorkOrder = null;
}
isLoading = false;
notifyListeners();
@ -257,12 +257,12 @@ class ServiceRequestDetailProvider extends ChangeNotifier {
}
//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 {
List<WorkOrderAttachments> woAttachments = [];
if(otherAttachment.isNotEmpty){
woAttachments.addAll(otherAttachment);
}
if (otherAttachment.isNotEmpty) {
woAttachments.addAll(otherAttachment);
}
for (var file in attachments) {
String fileName = ServiceRequestUtils.isLocalUrl(file.path) ? ("${file.path.split("/").last}|${base64Encode(File(file.path).readAsBytesSync())}") : file.path;
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......
Future<int> engineerRejectWorkOrder() async {
Response response;
@ -948,7 +964,7 @@ class ServiceRequestDetailProvider extends ChangeNotifier {
isLoading = true;
notifyListeners();
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;
if (response.statusCode >= 200 && response.statusCode < 300) {}
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/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/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.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/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_lazy_loading.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';
@ -242,11 +244,46 @@ class FooterActionButton {
));
case WorkOrderNextStepEnum.waitingForRequesterToConfirm:
return footerContainer(
child: AppFilledButton(
label: 'Waiting for requester to verify',
buttonColor: AppColor.neutral140,
textColor: AppColor.neutral150,
fontSize: 12.toScreenWidth,
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
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:
return footerContainer(

@ -86,13 +86,18 @@ class _ServiceRequestDetailViewState extends State<ServiceRequestDetailView> {
],
),
).expanded,
FooterActionButton.requestDetailsFooterWidget(
workOrderNextStepStatus: requestProvider.currentWorkOrder!.data!.nextStep!.workOrderNextStepEnum!,
status: requestProvider.currentWorkOrder?.data?.status,
isEmpIsAssigned: requestProvider.currentWorkOrder!.data!.assignedEmployee != null,
activities: requestProvider.currentWorkOrder!.data?.activities ?? [],
userProvider: _userProvider,
context: context),
SafeArea(
top: false,
right: false,
left: false,
child: FooterActionButton.requestDetailsFooterWidget(
workOrderNextStepStatus: requestProvider.currentWorkOrder!.data!.nextStep!.workOrderNextStepEnum!,
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

@ -118,6 +118,11 @@ class _AssistantEmployeeCardState extends State<AssistantEmployeeCard> {
// Handle the selected date and time here.
if (selectedTime != null) {
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())) {
"Start time is after than current time".showToast;
selectedTime = null;

@ -147,6 +147,11 @@ class _ExternalMaintenanceRequestState extends State<ExternalMaintenanceRequest>
// Handle the selected date and time here.
if (selectedTime != null) {
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())) {
"Start time is after than current time".showToast;
selectedTime = null;

@ -185,7 +185,7 @@ class _ExternalDetailItemState extends State<ExternalDetailItem> {
backgroundColor: AppColor.neutral100,
date: widget.model.startDateTime,
formatDateWithTime: true,
from: DateTime.tryParse(_ppmProvider?.planPreventiveVisit?.creationDate ?? ''),
from: DateTime.tryParse(_ppmProvider?.planPreventiveVisit?.createdDate ?? ''),
onDatePicker: (selectedDate) {
showTimePicker(
context: context,
@ -193,6 +193,11 @@ class _ExternalDetailItemState extends State<ExternalDetailItem> {
).then((selectedTime) {
if (selectedTime != null) {
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())) {
"Start time is after than current time".showToast;
selectedTime = null;
@ -223,7 +228,7 @@ class _ExternalDetailItemState extends State<ExternalDetailItem> {
date: widget.model.endDateTime,
enable: widget.model.startDateTime != null,
formatDateWithTime: true,
from: DateTime.tryParse(_ppmProvider?.planPreventiveVisit?.creationDate ?? ''),
from: DateTime.tryParse(_ppmProvider?.planPreventiveVisit?.createdDate ?? ''),
onDatePicker: (selectedDate) {
showTimePicker(
context: context,

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

@ -648,6 +648,7 @@ class _AssistantEmployeeCardState extends State<AssistantEmployeeCard> {
hideShadow: true,
backgroundColor: AppColor.neutral100,
date: taskModel?.modelAssistantEmployees?.startDate,
// from: taskModel?.d,
formatDateWithTime: true,
onDatePicker: (selectedDate) {
showTimePicker(
@ -657,6 +658,12 @@ class _AssistantEmployeeCardState extends State<AssistantEmployeeCard> {
// Handle the selected date and time here.
if (selectedTime != null) {
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())) {
"Start time is after than current time".showToast;
selectedTime = null;

@ -449,6 +449,7 @@ class _AssistantEmployeeCardState extends State<AssistantEmployeeCard> {
hideShadow: true,
backgroundColor: AppColor.neutral100,
date: widget.formModel?.modelAssistantEmployees?.startDate,
from: DateTime.tryParse(widget.formModel?.createdDate ?? ''),
formatDateWithTime: true,
onDatePicker: (selectedDate) {
showTimePicker(
@ -458,6 +459,11 @@ class _AssistantEmployeeCardState extends State<AssistantEmployeeCard> {
// Handle the selected date and time here.
if (selectedTime != null) {
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())) {
"Start time is after than current time".showToast;
selectedTime = null;

@ -174,6 +174,12 @@ class _AppTimerState extends State<AppTimer> {
).then((selectedTime) {
if (selectedTime != null) {
_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())) {
"Start time is after than current time".showToast;
_pickerStartAt = null;

Loading…
Cancel
Save