maintenance request flow in progress
parent
b04cd1e042
commit
0095facdf5
@ -0,0 +1,93 @@
|
|||||||
|
import 'package:test_sa/models/lookup.dart';
|
||||||
|
import 'package:test_sa/models/new_models/assigned_employee.dart';
|
||||||
|
|
||||||
|
class ActivityMaintenanceHelperModel {
|
||||||
|
int? workOrderId;
|
||||||
|
int? lastSituationId;
|
||||||
|
Lookup? activityStatus;
|
||||||
|
DateTime? startTime;
|
||||||
|
DateTime? endTime;
|
||||||
|
int? workingHour;
|
||||||
|
int? travelHours;
|
||||||
|
Lookup? repairLocation;
|
||||||
|
String? assignedEmployeeId;
|
||||||
|
String? technicalComment;
|
||||||
|
int? supplierId;
|
||||||
|
int? supplierEngineerId;
|
||||||
|
DateTime? supplierStartTime;
|
||||||
|
DateTime? supplierEndTime;
|
||||||
|
int? supplierWorkingHour;
|
||||||
|
AssignedEmployee? assignedEmployee;
|
||||||
|
List<AssistantEmployees>? assistantEmployees;
|
||||||
|
|
||||||
|
ActivityMaintenanceHelperModel(
|
||||||
|
{this.workOrderId,
|
||||||
|
this.lastSituationId,
|
||||||
|
this.startTime,
|
||||||
|
this.endTime,
|
||||||
|
this.workingHour,
|
||||||
|
this.travelHours,
|
||||||
|
this.repairLocation,
|
||||||
|
this.assignedEmployeeId,
|
||||||
|
this.technicalComment,
|
||||||
|
this.supplierId,
|
||||||
|
this.supplierEngineerId,
|
||||||
|
this.supplierStartTime,
|
||||||
|
this.supplierEndTime,
|
||||||
|
this.supplierWorkingHour,
|
||||||
|
this.assignedEmployee,
|
||||||
|
this.assistantEmployees});
|
||||||
|
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final Map<String, dynamic> data = <String, dynamic>{};
|
||||||
|
data['workOrderId'] = workOrderId;
|
||||||
|
data['lastSituationId'] = lastSituationId;
|
||||||
|
data['activityStatusId'] = activityStatus?.id;
|
||||||
|
data['startTime'] = startTime?.toIso8601String();
|
||||||
|
data['endTime'] = endTime?.toIso8601String();
|
||||||
|
data['workingHour'] = workingHour;
|
||||||
|
data['travelHours'] = travelHours;
|
||||||
|
data['repairLocationId'] = repairLocation?.id;
|
||||||
|
data['assignedEmployeeId'] = assignedEmployeeId;
|
||||||
|
data['technicalComment'] = technicalComment;
|
||||||
|
data['supplierId'] = supplierId;
|
||||||
|
data['supplierEngineerId'] = supplierEngineerId;
|
||||||
|
data['supplierStartTime'] = supplierStartTime?.toIso8601String();
|
||||||
|
data['supplierEndTime'] = supplierEndTime?.toIso8601String();
|
||||||
|
data['supplierWorkingHour'] = supplierWorkingHour;
|
||||||
|
if (assistantEmployees != null) {
|
||||||
|
data['assistantEmployees'] =
|
||||||
|
assistantEmployees!.map((v) => v.toJson()).toList();
|
||||||
|
}
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class AssistantEmployees {
|
||||||
|
int? id;
|
||||||
|
String? userId;
|
||||||
|
DateTime? startDate;
|
||||||
|
DateTime? endDate;
|
||||||
|
int? workingHours;
|
||||||
|
String? technicalComment;
|
||||||
|
|
||||||
|
AssistantEmployees(
|
||||||
|
{this.id,
|
||||||
|
this.userId,
|
||||||
|
this.startDate,
|
||||||
|
this.endDate,
|
||||||
|
this.workingHours,
|
||||||
|
this.technicalComment});
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final Map<String, dynamic> data = <String, dynamic>{};
|
||||||
|
data['id'] = id;
|
||||||
|
data['userId'] = userId;
|
||||||
|
data['startDate'] = startDate?.toIso8601String();
|
||||||
|
data['endDate'] = endDate?.toIso8601String();
|
||||||
|
data['workingHours'] = workingHours;
|
||||||
|
data['technicalComment'] = technicalComment;
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,212 @@
|
|||||||
|
|
||||||
|
import 'package:expansion_tile_card/expansion_tile_card.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
import 'package:test_sa/controllers/providers/api/asset_transfer_provider.dart';
|
||||||
|
import 'package:test_sa/dashboard_latest/widgets/app_bar_widget.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/new_views/app_style/app_color.dart';
|
||||||
|
import 'package:test_sa/new_views/common_widgets/app_text_form_field.dart';
|
||||||
|
import 'package:test_sa/service_request_latest/request_detail_provider.dart';
|
||||||
|
import 'package:test_sa/views/widgets/date_and_time/date_picker.dart';
|
||||||
|
import 'package:test_sa/views/widgets/status/report/service_report_assistant_employee_menu.dart';
|
||||||
|
|
||||||
|
class AssistantEmployeeCard extends StatefulWidget {
|
||||||
|
|
||||||
|
const AssistantEmployeeCard({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<AssistantEmployeeCard> createState() => _AssistantEmployeeCardState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _AssistantEmployeeCardState extends State<AssistantEmployeeCard> {
|
||||||
|
final GlobalKey<ExpansionTileCardState> cardA = GlobalKey();
|
||||||
|
bool status = false;
|
||||||
|
final TextEditingController _workingHoursController = TextEditingController();
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
// TODO: implement initState
|
||||||
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||||
|
getInitialData();
|
||||||
|
});
|
||||||
|
super.initState();
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> getInitialData() async {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
// TODO: implement dispose
|
||||||
|
_workingHoursController.dispose();
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Consumer<RequestDetailProvider>(builder: (context, requestDetailProvider, child) {
|
||||||
|
return ExpansionTileCard(
|
||||||
|
key: cardA,
|
||||||
|
initialElevation: 0,
|
||||||
|
borderRadius: BorderRadius.zero,
|
||||||
|
expandedTextColor: AppColor.black20,
|
||||||
|
shadowColor: AppColor.white10,
|
||||||
|
baseColor: AppColor.white10,
|
||||||
|
contentPadding: EdgeInsets.zero,
|
||||||
|
expandedColor: AppColor.white10,
|
||||||
|
duration: Duration.zero,
|
||||||
|
elevation: 0,
|
||||||
|
title:context.translation.assistantEmployee.bodyText(context).custom(color: AppColor.black20),
|
||||||
|
children: <Widget>[
|
||||||
|
Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||||
|
children: [
|
||||||
|
// ServiceReportAssistantEmployeeMenu(
|
||||||
|
// title: context.translation.assignAssistant,
|
||||||
|
// assetId: widget.workOrder!.callRequest!.asset!.id!.toInt(),
|
||||||
|
//
|
||||||
|
// initialValue: (_subWorkOrders.assistantEmployees?.isNotEmpty ?? false) ? _subWorkOrders.assistantEmployees?.first : null,
|
||||||
|
// // initialValue: !isCurrentAssigned
|
||||||
|
// // ? (widget.workOrder.assistantEmployees?.first)
|
||||||
|
// // : (_subWorkOrders.assistantEmployees?.isNotEmpty ?? false)
|
||||||
|
// // ? _subWorkOrders.assistantEmployees?.first
|
||||||
|
// // : null,
|
||||||
|
// enable: !isCurrentUserIsAssistantEmp,
|
||||||
|
// onSelect: (employee) {
|
||||||
|
// if (employee == null) {
|
||||||
|
// _subWorkOrders.assistantEmployees = [];
|
||||||
|
// } else {
|
||||||
|
// _subWorkOrders.assistantEmployees = [employee.copyWith(id: 0)];
|
||||||
|
// }
|
||||||
|
// },
|
||||||
|
// ),
|
||||||
|
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(
|
||||||
|
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;
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
int calculateWorkingHours(DateTime? startTime, DateTime? endTime) {
|
||||||
|
if(startTime!=null&&endTime!=null){
|
||||||
|
Duration difference = endTime.difference(startTime);
|
||||||
|
int hours = difference.inHours;
|
||||||
|
int minutes = difference.inMinutes % 60;
|
||||||
|
return hours;
|
||||||
|
}else{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
assignWorkingHours({required RequestDetailProvider requestDetailProvider}){
|
||||||
|
int hours = calculateWorkingHours(requestDetailProvider.activityMaintenanceHelperModel!.startTime,requestDetailProvider.activityMaintenanceHelperModel!.endTime);
|
||||||
|
if(hours!=-1){
|
||||||
|
_workingHoursController.text = hours.toString();
|
||||||
|
requestDetailProvider.activityMaintenanceHelperModel!.workingHour=hours;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
final ButtonStyle flatButtonStyle = TextButton.styleFrom(
|
||||||
|
shape: const RoundedRectangleBorder(
|
||||||
|
borderRadius: BorderRadius.all(Radius.circular(4.0)),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue