|
|
|
|
@ -43,7 +43,6 @@ class _InternalMaintenanceRequestState extends State<InternalMaintenanceRequest>
|
|
|
|
|
ActivityStatusProvider? _activityStatusProvider;
|
|
|
|
|
ServiceReport? _serviceReport;
|
|
|
|
|
bool _isLoading = false;
|
|
|
|
|
bool isCurrentUserIsAssignedEmployee = false;
|
|
|
|
|
|
|
|
|
|
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
|
|
|
|
|
final TextEditingController _workingHoursController = TextEditingController();
|
|
|
|
|
@ -51,18 +50,15 @@ class _InternalMaintenanceRequestState extends State<InternalMaintenanceRequest>
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
void initState() {
|
|
|
|
|
_serviceReport = ServiceReport(
|
|
|
|
|
// returnToService: DateTime.now(),
|
|
|
|
|
// //type: const Lookup(value: 2),
|
|
|
|
|
// device: widget.request.device,
|
|
|
|
|
sparePartsWorkOrders: [],
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
_activityStatusProvider = Provider.of<ActivityStatusProvider>(context, listen: false);
|
|
|
|
|
_requestDetailProvider = Provider.of<RequestDetailProvider>(context, listen: false);
|
|
|
|
|
_requestDetailProvider?.activityMaintenanceHelperModel?.assignedEmployee = _requestDetailProvider?.currentWorkOrder?.data?.assignedEmployee;
|
|
|
|
|
_requestDetailProvider?.activityMaintenanceHelperModel?.workOrderId = _requestDetailProvider?.currentWorkOrder?.data?.requestId;
|
|
|
|
|
_requestDetailProvider?.activityMaintenanceHelperModel?.lastSituationId = _requestDetailProvider?.currentWorkOrder?.data?.status?.id;
|
|
|
|
|
|
|
|
|
|
super.initState();
|
|
|
|
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
|
|
|
|
getInitialData();
|
|
|
|
|
});
|
|
|
|
|
// _isLoading = true;
|
|
|
|
|
}
|
|
|
|
|
@ -74,15 +70,7 @@ class _InternalMaintenanceRequestState extends State<InternalMaintenanceRequest>
|
|
|
|
|
super.dispose();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Future<void> getInitialData() async {
|
|
|
|
|
_activityStatusProvider?.getDate();
|
|
|
|
|
Provider.of<ServiceReportRepairLocationProvider>(context, listen: false).getTypes();
|
|
|
|
|
final user = Provider.of<UserProvider>(context).user!;
|
|
|
|
|
isCurrentUserIsAssignedEmployee = (user.userID != _requestDetailProvider?.currentWorkOrder?.data?.assignedEmployee?.userId);
|
|
|
|
|
if (isCurrentUserIsAssignedEmployee) {
|
|
|
|
|
// _subWorkOrders.assistantEmployees = [widget.workOrder.assistantEmployees?.first?.copyWith(id: 0)];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void getRequestForWorkOrder() async {
|
|
|
|
|
_isLoading = true;
|
|
|
|
|
@ -99,168 +87,149 @@ class _InternalMaintenanceRequestState extends State<InternalMaintenanceRequest>
|
|
|
|
|
@override
|
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
|
return Consumer<RequestDetailProvider>(builder: (context, requestDetailProvider, child) {
|
|
|
|
|
return LoadingManager(
|
|
|
|
|
isLoading: _isLoading,
|
|
|
|
|
isFailedLoading: false,
|
|
|
|
|
stateCode: 200,
|
|
|
|
|
onRefresh: () async {},
|
|
|
|
|
child: Stack(
|
|
|
|
|
return SingleChildScrollView(
|
|
|
|
|
child: Column(
|
|
|
|
|
children: [
|
|
|
|
|
SingleChildScrollView(
|
|
|
|
|
Form(
|
|
|
|
|
key: _formKey,
|
|
|
|
|
child: Column(
|
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.stretch,
|
|
|
|
|
children: [
|
|
|
|
|
Form(
|
|
|
|
|
key: _formKey,
|
|
|
|
|
child: Column(
|
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.stretch,
|
|
|
|
|
children: [
|
|
|
|
|
SingleItemDropDownMenu<Lookup, ActivityStatusProvider>(
|
|
|
|
|
context: context,
|
|
|
|
|
height: 56.toScreenHeight,
|
|
|
|
|
title: context.translation.activityStatus,
|
|
|
|
|
showShadow: false,
|
|
|
|
|
backgroundColor: AppColor.neutral100,
|
|
|
|
|
initialValue: requestDetailProvider.activityMaintenanceHelperModel?.activityStatus,
|
|
|
|
|
onSelect: (status) {
|
|
|
|
|
requestDetailProvider.activityMaintenanceHelperModel?.activityStatus = status;
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
8.height,
|
|
|
|
|
Row(
|
|
|
|
|
mainAxisSize: MainAxisSize.min,
|
|
|
|
|
children: [
|
|
|
|
|
ADatePicker(
|
|
|
|
|
label: context.translation.startTime,
|
|
|
|
|
hideShadow: true,
|
|
|
|
|
backgroundColor: AppColor.neutral100,
|
|
|
|
|
date: requestDetailProvider.activityMaintenanceHelperModel?.startTime,
|
|
|
|
|
formatDateWithTime: true,
|
|
|
|
|
onDatePicker: (selectedDate) {
|
|
|
|
|
showTimePicker(
|
|
|
|
|
context: context,
|
|
|
|
|
initialTime: TimeOfDay.now(),
|
|
|
|
|
).then((selectedTime) {
|
|
|
|
|
// Handle the selected date and time here.
|
|
|
|
|
if (selectedTime != null) {
|
|
|
|
|
DateTime selectedDateTime = DateTime(
|
|
|
|
|
selectedDate.year,
|
|
|
|
|
selectedDate.month,
|
|
|
|
|
selectedDate.day,
|
|
|
|
|
selectedTime.hour,
|
|
|
|
|
selectedTime.minute,
|
|
|
|
|
);
|
|
|
|
|
requestDetailProvider.activityMaintenanceHelperModel?.startTime = selectedDateTime;
|
|
|
|
|
requestDetailProvider.updateActivityMaintenanceHelperModel(requestDetailProvider.activityMaintenanceHelperModel);
|
|
|
|
|
assignWorkingHours(requestDetailProvider: requestDetailProvider);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
).expanded,
|
|
|
|
|
8.width,
|
|
|
|
|
ADatePicker(
|
|
|
|
|
label: context.translation.endTime,
|
|
|
|
|
hideShadow: true,
|
|
|
|
|
backgroundColor: AppColor.neutral100,
|
|
|
|
|
date: requestDetailProvider.activityMaintenanceHelperModel?.endTime,
|
|
|
|
|
formatDateWithTime: true,
|
|
|
|
|
onDatePicker: (selectedDate) {
|
|
|
|
|
showTimePicker(
|
|
|
|
|
context: context,
|
|
|
|
|
initialTime: TimeOfDay.now(),
|
|
|
|
|
).then((selectedTime) {
|
|
|
|
|
// 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.activityMaintenanceHelperModel!.startTime != null &&
|
|
|
|
|
selectedDateTime.isBefore(requestDetailProvider.activityMaintenanceHelperModel!.startTime!)) {
|
|
|
|
|
"End Date time must be greater then start date".showToast;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
requestDetailProvider.activityMaintenanceHelperModel?.endTime = selectedDateTime;
|
|
|
|
|
requestDetailProvider.updateActivityMaintenanceHelperModel(requestDetailProvider.activityMaintenanceHelperModel);
|
|
|
|
|
assignWorkingHours(requestDetailProvider: requestDetailProvider);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
).expanded,
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
8.height,
|
|
|
|
|
AppTextFormField(
|
|
|
|
|
labelText: context.translation.workingHours,
|
|
|
|
|
backgroundColor: AppColor.neutral80,
|
|
|
|
|
controller: _workingHoursController,
|
|
|
|
|
suffixIcon: "clock".toSvgAsset(width: 20, color: context.isDark ? AppColor.neutral10 : null).paddingOnly(end: 16),
|
|
|
|
|
initialValue: requestDetailProvider.activityMaintenanceHelperModel?.workingHour.toString(),
|
|
|
|
|
textAlign: TextAlign.center,
|
|
|
|
|
labelStyle: AppTextStyles.textFieldLabelStyle,
|
|
|
|
|
enable: false,
|
|
|
|
|
showShadow: false,
|
|
|
|
|
style: Theme.of(context).textTheme.titleMedium,
|
|
|
|
|
),
|
|
|
|
|
8.height,
|
|
|
|
|
AppTextFormField(
|
|
|
|
|
labelText: context.translation.travelingHours,
|
|
|
|
|
backgroundColor: AppColor.neutral100,
|
|
|
|
|
showShadow: false,
|
|
|
|
|
labelStyle: AppTextStyles.textFieldLabelStyle,
|
|
|
|
|
suffixIcon: "clock".toSvgAsset(width: 20, color: context.isDark ? AppColor.neutral10 : null).paddingOnly(end: 16),
|
|
|
|
|
initialValue: requestDetailProvider.activityMaintenanceHelperModel?.travelHours?.toString(),
|
|
|
|
|
textInputType: TextInputType.number,
|
|
|
|
|
onChange: (value) {
|
|
|
|
|
requestDetailProvider.activityMaintenanceHelperModel?.travelHours = int.tryParse(value);
|
|
|
|
|
},
|
|
|
|
|
// contentPadding: EdgeInsets.symmetric(vertical: 18.toScreenHeight, horizontal: 16.toScreenWidth),
|
|
|
|
|
onSaved: (value) {
|
|
|
|
|
requestDetailProvider.activityMaintenanceHelperModel?.travelHours = value as int?;
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
16.height,
|
|
|
|
|
repairLocationWidget(context, requestDetailProvider),
|
|
|
|
|
16.height,
|
|
|
|
|
AppTextFormField(
|
|
|
|
|
labelText: context.translation.assignedEmployee,
|
|
|
|
|
backgroundColor: AppColor.neutral80,
|
|
|
|
|
initialValue: _serviceReport?.assignedEmployee?.name.toString(),
|
|
|
|
|
textAlign: TextAlign.center,
|
|
|
|
|
labelStyle: AppTextStyles.textFieldLabelStyle,
|
|
|
|
|
showShadow: false,
|
|
|
|
|
enable: false,
|
|
|
|
|
style: Theme.of(context).textTheme.titleMedium,
|
|
|
|
|
),
|
|
|
|
|
8.height,
|
|
|
|
|
AppTextFormField(
|
|
|
|
|
initialValue: requestDetailProvider.activityMaintenanceHelperModel?.technicalComment,
|
|
|
|
|
labelText: context.translation.technicalComment,
|
|
|
|
|
backgroundColor: AppColor.neutral100,
|
|
|
|
|
showShadow: false,
|
|
|
|
|
labelStyle: AppTextStyles.textFieldLabelStyle,
|
|
|
|
|
alignLabelWithHint: true,
|
|
|
|
|
textInputType: TextInputType.multiline,
|
|
|
|
|
onChange: (value) {
|
|
|
|
|
requestDetailProvider.activityMaintenanceHelperModel?.technicalComment = value;
|
|
|
|
|
},
|
|
|
|
|
onSaved: (value) {
|
|
|
|
|
requestDetailProvider.activityMaintenanceHelperModel?.technicalComment = value;
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
).toShadowContainer(context).paddingOnly(start: 13, end: 14, top: 12),
|
|
|
|
|
const AssistantEmployeeCard().paddingOnly(start: 13, end: 14, top: 12),
|
|
|
|
|
100.height,
|
|
|
|
|
SingleItemDropDownMenu<Lookup, ActivityStatusProvider>(
|
|
|
|
|
context: context,
|
|
|
|
|
height: 56.toScreenHeight,
|
|
|
|
|
title: context.translation.activityStatus,
|
|
|
|
|
showShadow: false,
|
|
|
|
|
backgroundColor: AppColor.neutral100,
|
|
|
|
|
initialValue: requestDetailProvider.activityMaintenanceHelperModel?.activityStatus,
|
|
|
|
|
onSelect: (status) {
|
|
|
|
|
requestDetailProvider.activityMaintenanceHelperModel?.activityStatus = status;
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
8.height,
|
|
|
|
|
Row(
|
|
|
|
|
mainAxisSize: MainAxisSize.min,
|
|
|
|
|
children: [
|
|
|
|
|
ADatePicker(
|
|
|
|
|
label: context.translation.startTime,
|
|
|
|
|
hideShadow: true,
|
|
|
|
|
backgroundColor: AppColor.neutral100,
|
|
|
|
|
date: requestDetailProvider.activityMaintenanceHelperModel?.startTime,
|
|
|
|
|
formatDateWithTime: true,
|
|
|
|
|
onDatePicker: (selectedDate) {
|
|
|
|
|
showTimePicker(
|
|
|
|
|
context: context,
|
|
|
|
|
initialTime: TimeOfDay.now(),
|
|
|
|
|
).then((selectedTime) {
|
|
|
|
|
// Handle the selected date and time here.
|
|
|
|
|
if (selectedTime != null) {
|
|
|
|
|
DateTime selectedDateTime = DateTime(
|
|
|
|
|
selectedDate.year,
|
|
|
|
|
selectedDate.month,
|
|
|
|
|
selectedDate.day,
|
|
|
|
|
selectedTime.hour,
|
|
|
|
|
selectedTime.minute,
|
|
|
|
|
);
|
|
|
|
|
requestDetailProvider.activityMaintenanceHelperModel?.startTime = selectedDateTime;
|
|
|
|
|
requestDetailProvider.updateActivityMaintenanceHelperModel(requestDetailProvider.activityMaintenanceHelperModel);
|
|
|
|
|
assignWorkingHours(requestDetailProvider: requestDetailProvider);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
).expanded,
|
|
|
|
|
8.width,
|
|
|
|
|
ADatePicker(
|
|
|
|
|
label: context.translation.endTime,
|
|
|
|
|
hideShadow: true,
|
|
|
|
|
backgroundColor: AppColor.neutral100,
|
|
|
|
|
date: requestDetailProvider.activityMaintenanceHelperModel?.endTime,
|
|
|
|
|
formatDateWithTime: true,
|
|
|
|
|
onDatePicker: (selectedDate) {
|
|
|
|
|
showTimePicker(
|
|
|
|
|
context: context,
|
|
|
|
|
initialTime: TimeOfDay.now(),
|
|
|
|
|
).then((selectedTime) {
|
|
|
|
|
// 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.activityMaintenanceHelperModel!.startTime != null &&
|
|
|
|
|
selectedDateTime.isBefore(requestDetailProvider.activityMaintenanceHelperModel!.startTime!)) {
|
|
|
|
|
"End Date time must be greater then start date".showToast;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
requestDetailProvider.activityMaintenanceHelperModel?.endTime = selectedDateTime;
|
|
|
|
|
requestDetailProvider.updateActivityMaintenanceHelperModel(requestDetailProvider.activityMaintenanceHelperModel);
|
|
|
|
|
assignWorkingHours(requestDetailProvider: requestDetailProvider);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
).expanded,
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
8.height,
|
|
|
|
|
AppTextFormField(
|
|
|
|
|
labelText: context.translation.workingHours,
|
|
|
|
|
backgroundColor: AppColor.neutral80,
|
|
|
|
|
controller: _workingHoursController,
|
|
|
|
|
suffixIcon: "clock".toSvgAsset(width: 20, color: context.isDark ? AppColor.neutral10 : null).paddingOnly(end: 16),
|
|
|
|
|
initialValue: requestDetailProvider.activityMaintenanceHelperModel?.workingHour != null ? requestDetailProvider.activityMaintenanceHelperModel?.workingHour.toString() : '',
|
|
|
|
|
textAlign: TextAlign.center,
|
|
|
|
|
labelStyle: AppTextStyles.textFieldLabelStyle,
|
|
|
|
|
enable: false,
|
|
|
|
|
showShadow: false,
|
|
|
|
|
style: Theme.of(context).textTheme.titleMedium,
|
|
|
|
|
),
|
|
|
|
|
8.height,
|
|
|
|
|
AppTextFormField(
|
|
|
|
|
labelText: context.translation.travelingHours,
|
|
|
|
|
backgroundColor: AppColor.neutral100,
|
|
|
|
|
showShadow: false,
|
|
|
|
|
labelStyle: AppTextStyles.textFieldLabelStyle,
|
|
|
|
|
suffixIcon: "clock".toSvgAsset(width: 20, color: context.isDark ? AppColor.neutral10 : null).paddingOnly(end: 16),
|
|
|
|
|
initialValue: requestDetailProvider.activityMaintenanceHelperModel?.travelHours?.toString(),
|
|
|
|
|
textInputType: TextInputType.number,
|
|
|
|
|
onChange: (value) {
|
|
|
|
|
requestDetailProvider.activityMaintenanceHelperModel?.travelHours = int.tryParse(value);
|
|
|
|
|
},
|
|
|
|
|
// contentPadding: EdgeInsets.symmetric(vertical: 18.toScreenHeight, horizontal: 16.toScreenWidth),
|
|
|
|
|
onSaved: (value) {
|
|
|
|
|
requestDetailProvider.activityMaintenanceHelperModel?.travelHours = value as int?;
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
16.height,
|
|
|
|
|
repairLocationWidget(context, requestDetailProvider),
|
|
|
|
|
16.height,
|
|
|
|
|
AppTextFormField(
|
|
|
|
|
labelText: context.translation.assignedEmployee,
|
|
|
|
|
backgroundColor: AppColor.neutral80,
|
|
|
|
|
initialValue: requestDetailProvider.activityMaintenanceHelperModel?.assignedEmployee?.userName,
|
|
|
|
|
textAlign: TextAlign.center,
|
|
|
|
|
labelStyle: AppTextStyles.textFieldLabelStyle,
|
|
|
|
|
showShadow: false,
|
|
|
|
|
enable: false,
|
|
|
|
|
style: Theme.of(context).textTheme.titleMedium,
|
|
|
|
|
),
|
|
|
|
|
8.height,
|
|
|
|
|
AppTextFormField(
|
|
|
|
|
initialValue: requestDetailProvider.activityMaintenanceHelperModel?.technicalComment,
|
|
|
|
|
labelText: context.translation.technicalComment,
|
|
|
|
|
backgroundColor: AppColor.neutral100,
|
|
|
|
|
showShadow: false,
|
|
|
|
|
labelStyle: AppTextStyles.textFieldLabelStyle,
|
|
|
|
|
alignLabelWithHint: true,
|
|
|
|
|
textInputType: TextInputType.multiline,
|
|
|
|
|
onChange: (value) {
|
|
|
|
|
requestDetailProvider.activityMaintenanceHelperModel?.technicalComment = value;
|
|
|
|
|
},
|
|
|
|
|
onSaved: (value) {
|
|
|
|
|
requestDetailProvider.activityMaintenanceHelperModel?.technicalComment = value;
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
FooterActionButton.footerContainer(
|
|
|
|
|
child: AppFilledButton(
|
|
|
|
|
label: context.translation.addInternalActivity, // Use the dynamic label
|
|
|
|
|
buttonColor: AppColor.primary10,
|
|
|
|
|
onPressed: () async {
|
|
|
|
|
// Handle button press
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
).toShadowContainer(context).paddingOnly(start: 13, end: 14, top: 12),
|
|
|
|
|
const AssistantEmployeeCard().toShadowContainer(context,paddingObject: const EdgeInsets.symmetric(horizontal: 16)).paddingOnly(start: 13, end: 14, top: 12),
|
|
|
|
|
100.height,
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
);
|
|
|
|
|
@ -336,25 +305,5 @@ class _InternalMaintenanceRequestState extends State<InternalMaintenanceRequest>
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Future<bool> validate({required ActivityMaintenanceHelperModel model}) async {
|
|
|
|
|
if (model.activityStatus == null) {
|
|
|
|
|
Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.activityStatus}");
|
|
|
|
|
return false;
|
|
|
|
|
} else if (model.startTime == null) {
|
|
|
|
|
Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.startTime}");
|
|
|
|
|
return false;
|
|
|
|
|
} else if (model.endTime == null) {
|
|
|
|
|
Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.endTime}");
|
|
|
|
|
return false;
|
|
|
|
|
} else if (model.travelHours == null) {
|
|
|
|
|
Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.travelingHours}");
|
|
|
|
|
return false;
|
|
|
|
|
} else if (model.repairLocation == null) {
|
|
|
|
|
Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.repairLocation}");
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
//write all other missing conditions..
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|