edit maintenance request completed

design_3.0_latest
muhammad.abbasi 1 year ago
parent 71d4ba43de
commit f1fe0b3339

@ -83,6 +83,39 @@ class ApiManager {
return response;
}
Future<http.Response> delete(String url, {Map<String, String>? headers, required Map<String, dynamic> body}) async {
headers ??= {};
headers.addAll(_headers);
Uri url0 = Uri.parse(url);
if (!kReleaseMode) {
print("URL:$url0");
print("Headers:$headers");
print("Body:$body");
}
var request = http.Request('DELETE', url0);
request.body = json.encode(body);
request.headers.addAll(headers);
http.StreamedResponse streamedResponse = await request.send();
http.Response response = await http.Response.fromStream(streamedResponse);
try {
if (response.statusCode == 401) {
showLoginDialog();
} else {
if (jsonDecode(response.body) is Map<String, dynamic>) {
final message = jsonDecode(response.body)["message"];
if (message != null && message.toString().isNotEmpty) {
Fluttertoast.showToast(msg: message ?? "", toastLength: Toast.LENGTH_LONG);
}
}
}
} catch (ex) {}
return response;
}
Future<http.Response> postWithOutBody(String url, {Map<String, String>? headers}) async {
headers ??= {};

@ -6,6 +6,8 @@
"requestLockMessage": "انتظر حتى إكمال الطلب",
"cancel": "إلغاء",
"addActivity": "إضافة نشاط",
"doYouWantToCreateAnotherSparePartRequest": "هل تريد إنشاء طلب قطعة غيار آخر؟",
"sparePartActivitySuccess": "تم إنشاء نشاط طلب قطعة الغيار بنجاح",
"confirm": "تاكيد",
"done": "تم",
"exit": "إغلاق",

@ -106,6 +106,8 @@
"deviceName": "Asset Name",
"deviceImages": "Asset Images",
"deviceModel": "Asset Model",
"doYouWantToCreateAnotherSparePartRequest": "Do you want to create another spare part request?",
"sparePartActivitySuccess": "Spare Part Request activity has been created successfully",
"deviceRequired": "Asset Required",
"deviceSN": "Asset Serial Number",
"engineerName": "Engineer Name",

@ -12,8 +12,8 @@ class ActivityMaintenanceHelperModel {
Lookup? activityStatus;
DateTime? startTime;
DateTime? endTime;
int? workingHour;
int? travelHours;
num? workingHour;
num? travelHours;
Lookup? repairLocation;
SupplierDetails? supplier;
String? assignedEmployeeId;
@ -22,17 +22,18 @@ class ActivityMaintenanceHelperModel {
int? supplierEngineerId;
DateTime? supplierStartTime;
DateTime? supplierEndTime;
int? supplierWorkingHour;
num? supplierWorkingHour;
// AssignedEmployee? assignedEmployee;
WorkOrderAssignedEmployee? assignedEmployee;
SuppEngineerWorkOrders? supEngineer;
MaintenanceActivityAssistantEmployees? modelAssistantEmployees;
ActivityMaintenanceAssistantEmployees? modelAssistantEmployees;
List<AssistantEmployees>? assistantEmployees;
ActivityMaintenanceHelperModel(
{this.id,
this.workOrderId,
this.lastSituationId,
this.activityStatus,
this.startTime,
this.supplier,
this.endTime,
@ -70,38 +71,13 @@ class ActivityMaintenanceHelperModel {
data['supplierStartTime'] = supplierStartTime?.toIso8601String();
data['supplierEndTime'] = supplierEndTime?.toIso8601String();
data['supplierWorkingHour'] = supplierWorkingHour;
if (modelAssistantEmployees != null) {
data['assistantEmployees'] =[modelAssistantEmployees?.toJson()];
// modelAssistantEmployees!.map((v) => v.toJson()).toList();
if (assignedEmployee != null&&assignedEmployee?.userId!=null) {
data['assistantEmployees'] = [modelAssistantEmployees?.toJson()];
}
else{
data['assistantEmployees']=[];
}
return data;
}
}
class MaintenanceActivityAssistantEmployees {
int? id;
String? userId;
DateTime? startDate;
DateTime? endDate;
int? workingHours;
String? technicalComment;
MaintenanceActivityAssistantEmployees(
{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??0;
data['userId'] = userId;
data['startDate'] = startDate?.toIso8601String();
data['endDate'] = endDate?.toIso8601String();
data['workingHours'] = workingHours;
data['technicalComment'] = technicalComment;
return data;
}
}

@ -10,17 +10,9 @@ import 'package:test_sa/models/new_models/assigned_employee.dart';
class AssistantEmployees extends Base {
String? userId;
DateTime? startDate;
DateTime? endDate;
int? workingHours;
String? technicalComment;
AssistantEmployees({
this.id,
this.user,
this.startDate,
this.technicalComment,
this.workingHours,
this.endDate,
this.userId,
}) : super(name: user?.name, identifier: user?.id);
@ -29,7 +21,6 @@ class AssistantEmployees extends Base {
user = json['user'] != null ? AssignedEmployee.fromJson(json['user']) : null;
name = user?.name;
userId = user?.id;
identifier = user?.id;
}

@ -328,7 +328,7 @@ class WorkOrderAssignedEmployee {
class Activities {
int? id;
int? orderNo;
ActivityStatus? activityStatus;
Lookup? activityStatus;
ActivityMaintenance? activityMaintenance;
ActivitySparePart? activitySparePart;
String ?activityType;
@ -345,7 +345,7 @@ class Activities {
id = json['id'];
orderNo = json['orderNo'];
activityStatus = json['activityStatus'] != null
? ActivityStatus.fromJson(json['activityStatus'])
? Lookup.fromJson(json['activityStatus'])
: null;
activityMaintenance = json['activityMaintenance'] != null
? ActivityMaintenance.fromJson(json['activityMaintenance'])
@ -393,10 +393,10 @@ class ActivityStatus {
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = Map<String, dynamic>();
data['id'] = this.id;
data['name'] = this.name;
data['value'] = this.value;
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['name'] = name;
data['value'] = value;
return data;
}
}
@ -599,16 +599,16 @@ class WorkOrderHistory {
}
class ActivityMaintenance {
int? id;
int? activityStatus;
ActivityStatus? activityStatus;
String? startTime;
String? endTime;
double? workingHours;
double? travelHours;
RepairLocation? repairLocation;
Lookup? repairLocation;
AssignedEmployee? assignedEmployee;
String? technicalComment;
int? supplier;
int? supplierEngineer;
Lookup? supplier;
Lookup? supplierEngineer;
String? supplierStartTime;
String? supplierEndTime;
double? supplierWorkingHours;
@ -632,21 +632,26 @@ class ActivityMaintenance {
this.assistantEmployees});
ActivityMaintenance.fromJson(Map<String, dynamic> json) {
print('activity status i got is ${json['activityStatus']}');
id = json['id'];
activityStatus = json['activityStatus'];
activityStatus = json['activityStatus'] != null
? ActivityStatus.fromJson(json['activityStatus'])
: null;
startTime = json['startTime'];
endTime = json['endTime'];
workingHours = json['workingHours'];
travelHours = json['travelHours'];
repairLocation = json['repairLocation'] != null
? RepairLocation.fromJson(json['repairLocation'])
? Lookup.fromJson(json['repairLocation'])
: null;
assignedEmployee = json['assignedEmployee'] != null
? AssignedEmployee.fromJson(json['assignedEmployee'])
: null;
technicalComment = json['technicalComment'];
supplier = json['supplier'];
supplierEngineer = json['supplierEngineer'];
//json["supplier"] == null ? null : Lookup.fromJson(json["supplier"]),
supplier = json["supplier"] == null ? null : Lookup.fromJson(json["supplier"]);
supplierEngineer = json["supplierEngineer"] == null ? null : Lookup.fromJson(json["supplierEngineer"]);
// supplierEngineer = json['supplierEngineer'];
supplierStartTime = json['supplierStartTime'];
supplierEndTime = json['supplierEndTime'];
supplierWorkingHours = json['supplierWorkingHours'];
@ -686,6 +691,7 @@ class ActivityMaintenance {
}
}
class RepairLocation {
int? id;
String? name;
@ -734,12 +740,13 @@ class AssignedEmployee {
}
class ActivityMaintenanceAssistantEmployees {
String? startDate;
String? endDate;
DateTime? startDate;
DateTime? endDate;
double? workingHours;
String? technicalComment;
AssignedEmployee? user;
ActivityMaintenanceAssistantEmployees(
{this.startDate,
this.endDate,
@ -748,23 +755,23 @@ class ActivityMaintenanceAssistantEmployees {
this.user});
ActivityMaintenanceAssistantEmployees.fromJson(Map<String, dynamic> json) {
startDate = json['startDate'];
endDate = json['endDate'];
startDate = json['startDate']!=null?DateTime.parse(json['startDate']):null;
endDate = json['endDate']!=null?DateTime.parse(json['endDate']):null;
workingHours = json['workingHours'];
technicalComment = json['technicalComment'];
user = json['user'] != null
? new AssignedEmployee.fromJson(json['user'])
? AssignedEmployee.fromJson(json['user'])
: null;
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['startDate'] = startDate;
data['endDate'] = endDate;
data['startDate'] = startDate?.toIso8601String();
data['endDate'] = endDate?.toIso8601String();
data['workingHours'] = workingHours;
data['technicalComment'] = technicalComment;
if (user != null) {
data['user'] = user!.toJson();
data['userId'] = user?.userId;
}
return data;
}

@ -232,7 +232,7 @@ class SuppPersons extends Base {
}) : super(name: personName, identifier: id?.toString());
SuppPersons.fromJson(dynamic json) {
id = json['id'];
id = json['id']??0;
identifier = id?.toString();
supplierId = json['supplierId'] ?? json["supplierContactId"];
personName = json['personName'];

@ -53,9 +53,18 @@ class _SingleItemDropDownMenuState<T extends Base, X extends LoadingListNotifier
if (X != NullableLoadingProvider) {
provider = Provider.of<X>(widget.context);
}
print('initial value i got is ${widget.initialValue?.identifier}');
print('condition value ${X == NullableLoadingProvider}');
if(widget.staticData!=null){
for(int i = 0;i<widget.staticData!.length;i++){
print('id i got is ${widget.staticData?[i].identifier}');
}
}
if (widget.initialValue != null) {
final result = (X == NullableLoadingProvider ? widget.staticData : provider?.items)?.where((element) => element.identifier == widget.initialValue?.identifier);
if (result?.isNotEmpty ?? false) _selectedItem = result!.first as T?;
if (widget.onSelect != null && (widget.initialValue?.identifier ?? "") != (_selectedItem?.identifier ?? "")) {
widget.onSelect!(_selectedItem); // Non-null assertion after null check

@ -13,12 +13,11 @@ import 'package:test_sa/models/helper_data_models/workorder/work_order_helper_mo
import 'package:test_sa/models/new_models/arrival_verification_type_model.dart';
import 'package:test_sa/models/new_models/dashboard_detail.dart';
import 'package:test_sa/models/new_models/work_order_detail_model.dart';
import 'package:test_sa/models/service_request/supplier_details.dart';
class RequestDetailProvider extends ChangeNotifier {
final pageItemNumber = 10;
void reset() {
nextPage = true;
stateCode = null;
@ -61,23 +60,23 @@ class RequestDetailProvider extends ChangeNotifier {
notifyListeners();
}
//UI models
WorkOrderDetail? currentWorkOrder;
AssetRetiredHelperModel? assetRetiredHelperModel=AssetRetiredHelperModel();
ActivityMaintenanceHelperModel? activityMaintenanceHelperModel=ActivityMaintenanceHelperModel();
AssetRetiredHelperModel? assetRetiredHelperModel = AssetRetiredHelperModel();
ActivityMaintenanceHelperModel? activityMaintenanceHelperModel = ActivityMaintenanceHelperModel();
SparePartHelperModel? sparePartHelperModel;
FixRemotelyHelperModel? fixRemotelyHelperModel=FixRemotelyHelperModel();
NeedVisitHelperModel? needVisitHelperModel=NeedVisitHelperModel();
FixRemotelyHelperModel? fixRemotelyHelperModel = FixRemotelyHelperModel();
NeedVisitHelperModel? needVisitHelperModel = NeedVisitHelperModel();
NurseActionHelperModel? nurseActionHelperModel;
EngineerRejectHelperModel? engineerRejectHelperModel=EngineerRejectHelperModel();
EngineerUpdateWorkOrderHelperModel? engineerUpdateWorkOrderHelperModel=EngineerUpdateWorkOrderHelperModel();
EngineerRejectHelperModel? engineerRejectHelperModel = EngineerRejectHelperModel();
EngineerUpdateWorkOrderHelperModel? engineerUpdateWorkOrderHelperModel = EngineerUpdateWorkOrderHelperModel();
WorkOrderHelperModel? workOrderHelperModel;
void updateAssetRetiredHelperModel(AssetRetiredHelperModel? value) {
assetRetiredHelperModel = value;
notifyListeners();
}
void updateActivityMaintenanceHelperModel(ActivityMaintenanceHelperModel? value) {
activityMaintenanceHelperModel = value;
notifyListeners();
@ -112,6 +111,7 @@ class RequestDetailProvider extends ChangeNotifier {
engineerUpdateWorkOrderHelperModel = value;
notifyListeners();
}
void updateWorkOrderHelperModel(WorkOrderHelperModel? value) {
workOrderHelperModel = value;
notifyListeners();
@ -122,7 +122,6 @@ class RequestDetailProvider extends ChangeNotifier {
notifyListeners();
}
int? stateCode;
// true if there is next page in product list and false if not
@ -219,7 +218,7 @@ class RequestDetailProvider extends ChangeNotifier {
//engineerRejectWorkOrder......
Future<int> engineerRejectWorkOrder() async {
Response response ;
Response response;
try {
isLoading = true;
response = await ApiManager.instance.post(URLs.engineerRejectUrl, body: engineerRejectHelperModel!.toJson());
@ -248,7 +247,7 @@ class RequestDetailProvider extends ChangeNotifier {
Response response;
try {
isLoading = true;
response = await ApiManager.instance.post(URLs.engineerFixRemotlyUrl, body: fixRemotelyHelperModel!.toJson());
response = await ApiManager.instance.post(URLs.engineerFixRemotlyUrl, body: fixRemotelyHelperModel!.toJson());
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
updateCurrentWorkOrder(WorkOrderDetail.fromJson(json.decode(response.body)));
@ -291,6 +290,7 @@ class RequestDetailProvider extends ChangeNotifier {
return -1;
}
}
//engineerUpdateNeedAVisitWorkOrder......
Future<int> engineerUpdateNeedVisit() async {
Response response;
@ -319,10 +319,10 @@ class RequestDetailProvider extends ChangeNotifier {
}
//engineerMarkAsFixed......
Future<int> engineerMarkAsFixed({required int workOrderId,required String feedback}) async {
Response response ;
Future<int> engineerMarkAsFixed({required int workOrderId, required String feedback}) async {
Response response;
try {
Map<String,dynamic> body = {'workOrderId': workOrderId, 'feedback': feedback};
Map<String, dynamic> body = {'workOrderId': workOrderId, 'feedback': feedback};
isLoading = true;
response = await ApiManager.instance.post(URLs.engineerMarkAsFixUrl, body: body);
stateCode = response.statusCode;
@ -345,27 +345,27 @@ class RequestDetailProvider extends ChangeNotifier {
}
//engineer Confirm Arrive......
Future<CommonResponseModel> engineerConfirmArrival({required int workOrderId, required int verificationTypeId, required String photoInfo, required String otp}) async {
Future<int> engineerConfirmArrival({required int workOrderId, required int verificationTypeId, required String photoInfo, required String otp, required String assetNo}) async {
Response response;
try {
Map<String, dynamic> body = {"workOrderId": workOrderId, "verificationTypeId": verificationTypeId, "photoInfo": photoInfo, "otp": otp};
Map<String, dynamic> body = {"workOrderId": workOrderId, "verificationTypeId": verificationTypeId, "photoInfo": photoInfo, "otp": otp, "assetNumber": assetNo};
isLoading = true;
final response = await ApiManager.instance.post(URLs.engineerConfirmArriveUrl, body: body);
response = await ApiManager.instance.post(URLs.engineerConfirmArriveUrl, body: body);
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
CommonResponseModel commonResponseModel = CommonResponseModel.fromJson(json.decode(response.body));
print('response of Engineer mark as fixed ${commonResponseModel.toJson()}');
print('response of Engineer confirm arrival ${response.body}');
notifyListeners();
isLoading = false;
return commonResponseModel;
return response.statusCode;
}
isLoading = false;
notifyListeners();
return CommonResponseModel();
return response.statusCode;
} catch (e) {
log("engineer accept [error] : $e");
isLoading = false;
notifyListeners();
return CommonResponseModel();
return -1;
}
}
@ -399,17 +399,17 @@ class RequestDetailProvider extends ChangeNotifier {
//engineerUpdateWorkOrder......
Future<void> engineerUpdateWorkOrder() async {
// try {
isLoading = true;
final response = await ApiManager.instance.post(URLs.engineerUpdateWorkOrderUrl, body: engineerUpdateWorkOrderHelperModel!.toJson());
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body));
updateCurrentWorkOrder(currentWorkOrder);
notifyListeners();
isLoading = false;
}
isLoading = false;
isLoading = true;
final response = await ApiManager.instance.post(URLs.engineerUpdateWorkOrderUrl, body: engineerUpdateWorkOrderHelperModel!.toJson());
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body));
updateCurrentWorkOrder(currentWorkOrder);
notifyListeners();
isLoading = false;
}
isLoading = false;
notifyListeners();
// }
// catch (e) {
// log("engineer update workorder [error] : $e");
@ -488,15 +488,16 @@ class RequestDetailProvider extends ChangeNotifier {
return -1;
}
}
Future<int> updateActivityMaintenance() async {
isLoading = true;
try {
final response = await ApiManager.instance.post(
final response = await ApiManager.instance.put(
URLs.updateActivityMaintenanceUrl,
body: activityMaintenanceHelperModel!.toJson(),
);
stateCode = response.statusCode;
print('update response i got is ${response.body}');
print('update response i got is ${response.statusCode}');
if (response.statusCode >= 200 && response.statusCode < 300) {
// request.engineerName = employee.name;
notifyListeners();
@ -511,6 +512,25 @@ class RequestDetailProvider extends ChangeNotifier {
}
}
Future<List<SuppPersons>> getSupplierEngineerData({required String supplierName}) async {
try {
Response response = await ApiManager.instance.get("${URLs.getSuppliersAutoComplete}?searchText=$supplierName");
stateCode = response.statusCode;
print('response i got is ${json.decode(response.body)["data"]}');
List<SuppPersons> persons = [];
if (response.statusCode >= 200 && response.statusCode < 300) {
List categoriesListJson = json.decode(response.body)["data"][0]['suppPersons'];
persons = categoriesListJson.map((item) => SuppPersons.fromJson(item)).toList();
}
notifyListeners();
return persons;
} catch (error) {
stateCode = -1;
notifyListeners();
return [];
}
}
Future<int> deleteActivitySparePart({required int id, required int workOrderId}) async {
isLoading = true;
var body = {
@ -538,6 +558,7 @@ class RequestDetailProvider extends ChangeNotifier {
return -1;
}
}
Future<int> deleteActivityMaintenance({required int id, required int workOrderId}) async {
isLoading = true;
var body = {
@ -546,12 +567,12 @@ class RequestDetailProvider extends ChangeNotifier {
};
try {
//TODO replace with delete model...
final response = await ApiManager.instance.post(
final response = await ApiManager.instance.delete(
URLs.deleteActivityMaintenanceUrl,
body: body,
);
stateCode = response.statusCode;
print('response of delete activity spare part is ${response.statusCode}');
print('response of delete activity spare part is ${response.body}');
if (response.statusCode >= 200 && response.statusCode < 300) {
//map to the model...
@ -590,32 +611,32 @@ class RequestDetailProvider extends ChangeNotifier {
return -1;
}
}
Future<int> createActivityMaintenanceRequest() async {
isLoading = true;
// try {
final response = await ApiManager.instance.post(
URLs.createActivityMaintenanceUrl,
body: activityMaintenanceHelperModel!.toJson(),
);
stateCode = response.statusCode;
print('add maintenance activity response i got is ${response.body}');
print('status code i got is ${response.statusCode}');
if (response.statusCode >= 200 && response.statusCode < 300) {
// currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body));
// updateCurrentWorkOrder(currentWorkOrder);
notifyListeners();
print('status code in provider is ${response.statusCode}');
return response.statusCode;
}
isLoading = false;
final response = await ApiManager.instance.post(
URLs.createActivityMaintenanceUrl,
body: activityMaintenanceHelperModel!.toJson(),
);
stateCode = response.statusCode;
print('add maintenance activity response i got is ${response.body}');
if (response.statusCode >= 200 && response.statusCode < 300) {
// currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body));
// updateCurrentWorkOrder(currentWorkOrder);
notifyListeners();
return response.statusCode;
}
isLoading = false;
notifyListeners();
return response.statusCode;
// } catch (error) {
// isLoading = false;
// notifyListeners();
// return -1;
// }
}
//create asset retired request..
Future<int> createActivityAssetToBeRetired() async {
isLoading = true;
@ -643,14 +664,14 @@ class RequestDetailProvider extends ChangeNotifier {
//get Arrival type......
Future<ArrivalVerificationTypeModel> getArrivalVerificationType() async {
ArrivalVerificationTypeModel arrivalVerificationTypeModel= ArrivalVerificationTypeModel();
ArrivalVerificationTypeModel arrivalVerificationTypeModel = ArrivalVerificationTypeModel();
try {
isLoading = true;
notifyListeners();
final response = await ApiManager.instance.get(URLs.getArrivalVerificationTypeUrl);
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
arrivalVerificationTypeModel = ArrivalVerificationTypeModel.fromJson(json.decode(response.body));
arrivalVerificationTypeModel = ArrivalVerificationTypeModel.fromJson(json.decode(response.body));
}
isLoading = false;
notifyListeners();
@ -668,9 +689,9 @@ class RequestDetailProvider extends ChangeNotifier {
isLoading = true;
try {
final response = await ApiManager.instance.postWithOutBody(
URLs.sendOtpUrl+ "$workOrderId",
URLs.sendOtpUrl + "$workOrderId",
);
print('url for send otp is ${URLs.sendOtpUrl+ "$workOrderId"}');
print('url for send otp is ${URLs.sendOtpUrl + "$workOrderId"}');
stateCode = response.statusCode;
print('response i got is ${response.body}');
@ -686,12 +707,13 @@ class RequestDetailProvider extends ChangeNotifier {
return -1;
}
}
//verify otp..
Future<int> verifyOtp({required int workOrderId,required String otpCode}) async {
Future<int> verifyOtp({required int workOrderId, required String otpCode}) async {
isLoading = true;
try {
final response = await ApiManager.instance.postWithOutBody(
URLs.verifyOtpUrl+'$workOrderId&$otpCode',
URLs.verifyOtpUrl + '$workOrderId&$otpCode',
);
print('response i got is ${response.body}');
stateCode = response.statusCode;

@ -7,9 +7,13 @@ import 'package:test_sa/extensions/int_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';
import 'package:test_sa/models/helper_data_models/maintenance_request/activity_maintenance_model.dart';
import 'package:test_sa/models/helper_data_models/spare_part/activity_spare_part_model.dart';
import 'package:test_sa/models/new_models/assistant_employee.dart';
import 'package:test_sa/models/new_models/work_order_detail_model.dart';
import 'package:test_sa/models/service_request/spare_parts.dart';
import 'package:test_sa/models/service_request/supp_engineer_work_orders.dart';
import 'package:test_sa/models/service_request/supplier_details.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';
@ -191,31 +195,12 @@ class ActivitiesListView extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
"edit_icon".toSvgAsset(height: 21, width: 21).onPress(() {
requestDetailProvider.sparePartHelperModel = SparePartHelperModel(
id: activity.id,
workOrderId: requestDetailProvider.currentWorkOrder?.data?.requestId,
comment: activity.activitySparePart?.comment,
sparePartAttachments: activity.activitySparePart?.acitiySparePartAttachments ?? [],
sparePart: SparePart(
id: activity.activitySparePart?.partCatalogItem?.id,
partName: activity.activitySparePart?.partCatalogItem?.partName,
partNo: activity.activitySparePart?.partCatalogItem?.partNumber),
quantity: activity.activitySparePart?.quantity,
activityStatusId: activity.activityStatus?.id,
//TODO commets are missing in api response..
// comment: activity.activitySparePart?.description,
);
requestDetailProvider.updateSparePartHelperModel(requestDetailProvider.sparePartHelperModel);
Navigator.of(context).push(MaterialPageRoute(
builder: (_) => const MaintenanceRequestForm(),
));
onEditPress(context: context, requestDetailProvider: requestDetailProvider, activity: activity);
}),
24.width,
"delete_icon".toSvgAsset(height: 21, width: 21).onPress(() async {
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
int status = await requestDetailProvider.deleteActivitySparePart(id: activity.id!, workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!);
int status = await requestDetailProvider.deleteActivityMaintenance(id: activity.id!, workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!);
if (status == 200) {
await requestDetailProvider.getWorkOrderById(id: requestDetailProvider.currentWorkOrder!.data!.requestId!);
Navigator.pop(context);
@ -271,4 +256,64 @@ class ActivitiesListView extends StatelessWidget {
// );
});
}
void onEditPress({required BuildContext context, required RequestDetailProvider requestDetailProvider, required Activities activity}) async {
Map<String, dynamic> assistEmpData = {};
try {
if (activity.activityMaintenance?.assistantEmployees != null && activity.activityMaintenance!.assistantEmployees!.isNotEmpty) {
assistEmpData = {
// 'id': activity.activityMaintenance?.assistantEmployees?[0].user?.userId != null ? num.tryParse(activity.activityMaintenance!.assistantEmployees![0].user!.userId!) : null,
'id': null,
'user': {
'id': activity.activityMaintenance?.assistantEmployees?[0].user?.userId,
// 'id': activity.activityMaintenance?.assistantEmployees?[0].user?.userId != null ? num.tryParse(activity.activityMaintenance!.assistantEmployees![0].user!.userId!) : null,
'name': activity.activityMaintenance?.assistantEmployees?[0].user?.userName,
},
};
}
requestDetailProvider.activityMaintenanceHelperModel = ActivityMaintenanceHelperModel(
id: activity.id,
workOrderId: requestDetailProvider.currentWorkOrder?.data?.requestId,
startTime: activity.activityMaintenance?.startTime != null ? DateTime.parse(activity.activityMaintenance!.startTime!) : null,
endTime: activity.activityMaintenance?.endTime != null ? DateTime.parse(activity.activityMaintenance!.endTime!) : null,
activityStatus: activity.activityStatus,
workingHour: activity.activityMaintenance?.workingHours ?? 0,
travelHours: activity.activityMaintenance?.travelHours ?? 0,
repairLocation: activity.activityMaintenance?.repairLocation,
assignedEmployee: activity.activityMaintenance?.assignedEmployee != null ? WorkOrderAssignedEmployee.fromJson(activity.activityMaintenance!.assignedEmployee!.toJson()) : null,
technicalComment: activity.activityMaintenance?.technicalComment,
assistantEmployees:
activity.activityMaintenance?.assistantEmployees != null && activity.activityMaintenance!.assistantEmployees!.isNotEmpty ? [AssistantEmployees.fromJson(assistEmpData)] : [],
modelAssistantEmployees:
activity.activityMaintenance?.assistantEmployees != null && activity.activityMaintenance!.assistantEmployees!.isNotEmpty ? activity.activityMaintenance!.assistantEmployees![0] : null,
supplierStartTime: activity.activityMaintenance?.supplierStartTime != null ? DateTime.parse(activity.activityMaintenance!.supplierStartTime!) : null,
supplierEndTime: activity.activityMaintenance?.supplierEndTime != null ? DateTime.parse(activity.activityMaintenance!.supplierEndTime!) : null,
supplierWorkingHour: activity.activityMaintenance?.supplierWorkingHours,
supplier: activity.activityMaintenance?.supplier != null
? SupplierDetails(
id: activity.activityMaintenance?.supplier?.id,
suppliername: activity.activityMaintenance?.supplier?.name,
)
: null,
supEngineer: activity.activityMaintenance?.supplier != null
? SuppEngineerWorkOrders(
id: activity.activityMaintenance?.supplierEngineer?.id,
personName: activity.activityMaintenance?.supplierEngineer?.name,
)
: null,
);
if (activity.activityMaintenance?.supplier != null) {
requestDetailProvider.activityMaintenanceHelperModel?.supplier?.suppPersons = await requestDetailProvider.getSupplierEngineerData(supplierName: activity.activityMaintenance!.supplier!.name!);
}
requestDetailProvider.updateActivityMaintenanceHelperModel(requestDetailProvider.activityMaintenanceHelperModel);
// return;
} catch (e) {
print("Edit error $e");
}
Navigator.of(context).push(MaterialPageRoute(
builder: (_) => const MaintenanceRequestForm(),
));
}
}

@ -11,6 +11,7 @@ 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/work_order_next_step.dart';
import 'package:test_sa/models/helper_data_models/maintenance_request/activity_maintenance_model.dart';
import 'package:test_sa/models/helper_data_models/spare_part/activity_spare_part_model.dart';
import 'package:test_sa/models/helper_data_models/workorder/work_order_helper_models.dart';
import 'package:test_sa/models/lookup.dart';
@ -550,6 +551,12 @@ class ServiceRequestBottomSheet {
);
break;
case 1:
RequestDetailProvider requestDetailProvider= Provider.of<RequestDetailProvider>(context,listen: false);
requestDetailProvider.activityMaintenanceHelperModel = ActivityMaintenanceHelperModel(
workOrderId: requestDetailProvider.currentWorkOrder?.data?.requestId,
id: 0,
assignedEmployee: requestDetailProvider.currentWorkOrder?.data?.assignedEmployee,
);
Navigator.pushReplacement(
context,
MaterialPageRoute(builder: (context) => const MaintenanceRequestForm()),
@ -677,6 +684,52 @@ class ServiceRequestBottomSheet {
).bottomSheetContainer(context);
}));
}
static Future addAnotherSpareRequestBottomSheet({required BuildContext context}) {
return buildBottomSheetParent(
context: context,
childWidget: Consumer<ServiceRequestsProvider>(builder: (context, serviceRequestProvider, child) {
return Column(
mainAxisSize: MainAxisSize.min,
children: [
const SizedBox().indicatorWidget(),
8.height,
Align(
alignment: AlignmentDirectional.centerStart,
child: context.translation.doYouWantToCreateAnotherSparePartRequest.heading6(context),
),
41.height,
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
AppFilledButton(
label: context.translation.no,
loading: false,
buttonColor: AppColor.white60,
textColor: AppColor.black10,
onPressed: () async {
Navigator.pop(context);
},
).expanded,
12.width,
AppFilledButton(
label: context.translation.yes,
buttonColor: AppColor.primary10,
loading: false,
onPressed: (){
Provider.of<RequestDetailProvider>(context,listen: false).sparePartHelperModel = SparePartHelperModel();
Navigator.pushReplacement(
context,
MaterialPageRoute(builder: (context) => const SparePartRequest()),
);
},
).expanded,
],
)
],
);
}));
}
static Future feedBackBottomSheet({required BuildContext context}) {
String feedback = '';

@ -1,5 +1,10 @@
import 'dart:convert';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:image_picker/image_picker.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/app_strings/app_asset.dart';
import 'package:test_sa/controllers/providers/api/service_requests_provider.dart';
@ -15,6 +20,7 @@ import 'package:test_sa/service_request_latest/request_detail_provider.dart';
import 'package:test_sa/service_request_latest/views/components/verify_otp_view.dart';
import 'package:test_sa/service_request_latest/views/forms/asset_retired/asset_retired.dart';
import 'package:test_sa/service_request_latest/views/forms/asset_retired/verify_asset_detail.dart';
import 'package:test_sa/service_request_latest/views/request_detail_main_view.dart';
import 'package:test_sa/views/widgets/qr/scan_qr.dart';
import 'activities_list_view.dart';
@ -27,26 +33,32 @@ class VerifyArrivalView extends StatefulWidget {
}
class _VerifyArrivalViewState extends State<VerifyArrivalView> {
ArrivalVerificationTypeModel ? arrivalVerificationTypeModel;
ArrivalVerificationTypeModel? arrivalVerificationTypeModel;
@override
void initState() {
//TODO call this when all data is confirmed
// getInitialData();
WidgetsBinding.instance.addPostFrameCallback((_) {
getInitialData();
});
super.initState();
}
Future<void> getInitialData() async{
RequestDetailProvider requestDetailProvider = Provider.of<RequestDetailProvider>(context,listen: false);
arrivalVerificationTypeModel = await requestDetailProvider.getArrivalVerificationType();
Future<void> getInitialData() async {
RequestDetailProvider requestDetailProvider = Provider.of<RequestDetailProvider>(context, listen: false);
arrivalVerificationTypeModel = await requestDetailProvider.getArrivalVerificationType();
print('data i got is${arrivalVerificationTypeModel?.data?.first?.verificationTypeId}');
}
@override
Widget build(BuildContext context) {
//TODO replace the list with Api...
final List<Map<String, String>> items = [
{'heading': context.translation.scanQr, 'subHeading': context.translation.scanQrDetail, 'icon': AppAsset.scanQrIcon},
{'heading': context.translation.askRequester, 'subHeading': context.translation.askRequesterDetail, 'icon': AppAsset.askRequesterIcon},
{'heading': context.translation.askOtp, 'subHeading': context.translation.askOtpDetail, 'icon': AppAsset.askOtpIcon},
{'heading': context.translation.takeDevicePhoto, 'subHeading': context.translation.takeDevicePhotoDetail, 'icon': AppAsset.takeDevicePhotoIcon},
final List<Map<String, dynamic>> items = [
{'heading': context.translation.scanQr, 'subHeading': context.translation.scanQrDetail, 'icon': AppAsset.scanQrIcon, 'id': 1},
{'heading': context.translation.askRequester, 'subHeading': context.translation.askRequesterDetail, 'icon': AppAsset.askRequesterIcon, 'id': 2},
{'heading': context.translation.askOtp, 'subHeading': context.translation.askOtpDetail, 'icon': AppAsset.askOtpIcon, 'id': 3},
{'heading': context.translation.takeDevicePhoto, 'subHeading': context.translation.takeDevicePhotoDetail, 'icon': AppAsset.takeDevicePhotoIcon, 'id': 4},
];
return Scaffold(
appBar: DefaultAppBar(title: context.translation.verifyArrival),
@ -121,29 +133,69 @@ class _VerifyArrivalViewState extends State<VerifyArrivalView> {
);
}
void onItemTap({required int index, required RequestDetailProvider requestDetailProvider, required BuildContext context}) {
void onItemTap({required int index, required RequestDetailProvider requestDetailProvider, required BuildContext context}) async {
switch (index) {
case 0:
// Navigator.push(
// context,
// MaterialPageRoute(builder: (context) => const ActivitiesListView()),
// );
int? status;
String? result = await Navigator.of(context).push(
MaterialPageRoute(builder: (_) => const ScanQr()),
) as String?;
if (result != null) {
try {
status = await requestDetailProvider.engineerConfirmArrival(
workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!,
verificationTypeId: 1,
photoInfo: '',
otp: '',
assetNo: requestDetailProvider.currentWorkOrder!.data!.asset!.assetNumber!);
print('status i got is $status');
if (status == 200) {
requestDetailProvider.getWorkOrderById(id: requestDetailProvider.currentWorkOrder!.data!.requestId!);
Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) => RequestDetailMain(requestId: requestDetailProvider.currentWorkOrder!.data!.requestId!)));
}
else {
//show some message.
}
} catch (e) {
print('error i got is $e');
}
}
break;
case 1:
// Navigator.push(
// context,
// MaterialPageRoute(builder: (context) => const AssetRetired()),
// );
Fluttertoast.showToast(msg: 'Under process...' ?? "", toastLength: Toast.LENGTH_LONG);
break;
case 2:
//TODO api has error need to fixed by ahmed...
requestDetailProvider.sendOtp(workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!);
requestDetailProvider.sendOtp(workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!);
Navigator.pushReplacement(
context,
MaterialPageRoute(builder: (context) => const VerifyOtpView()),
);
break;
case 3:
File ?pickedFile = await onFilePicker();
if(pickedFile!=null){
var fileObj = ("${pickedFile.path.split("/").last}|${base64Encode(File(pickedFile.path).readAsBytesSync())}");
int? status;
try{
status = await requestDetailProvider.engineerConfirmArrival(
workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!,
verificationTypeId: 1,
photoInfo: fileObj,
otp: '',
assetNo: '');
print('status i got is $status');
if (status == 200) {
requestDetailProvider.getWorkOrderById(id: requestDetailProvider.currentWorkOrder!.data!.requestId!);
Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) => RequestDetailMain(requestId: requestDetailProvider.currentWorkOrder!.data!.requestId!)));
}
else{
//show some message.
}
}catch(e){
print('error i got is $e');
}
}
// Navigator.push(
// context,
// MaterialPageRoute(builder: (context) => const VerifyAssetDetails()),
@ -157,4 +209,63 @@ class _VerifyArrivalViewState extends State<VerifyArrivalView> {
}
// ScanQr
}
Future<File?> onFilePicker() async {
ImageSource? source = await showModalBottomSheet<ImageSource>(
context: context,
builder: (BuildContext context) {
Widget listCard({required String icon, required String label, required VoidCallback onTap}) {
return GestureDetector(
onTap: onTap,
child: Container(
constraints: BoxConstraints(minWidth: 111.toScreenWidth, minHeight: 111.toScreenHeight),
padding: EdgeInsets.symmetric(horizontal: 12.toScreenWidth, vertical: 12.toScreenHeight),
decoration: BoxDecoration(borderRadius: BorderRadius.circular(12), border: Border.all(width: 1, color: AppColor.white70)),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
icon.toSvgAsset(),
24.height,
label.bodyText2(context).custom(color: AppColor.black20),
],
),
),
);
}
return Container(
padding: const EdgeInsets.all(16.0),
child: Row(
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
listCard(
icon: 'camera_icon',
label: '${context.translation.open}\n${context.translation.camera}',
onTap: () {
Navigator.of(context).pop(ImageSource.camera);
},
),
20.width,
listCard(
icon: 'gallery_icon',
label: '${context.translation.open}\n${context.translation.gallery}',
onTap: () {
Navigator.of(context).pop(ImageSource.gallery);
},
),
],
),
);
},
);
if (source == null) return null;
File ?fileImage;
final pickedFile = await ImagePicker().pickImage(source: source, imageQuality: 70, maxWidth: 800, maxHeight: 800);
if (pickedFile != null) {
fileImage = File(pickedFile.path);
}
return fileImage;
}
}

@ -54,12 +54,13 @@ class VerifyOtpView extends StatelessWidget {
RequestDetailProvider requestDetailProvider = Provider.of<RequestDetailProvider>(context, listen: false);
int? status;
status = await requestDetailProvider.verifyOtp(workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!, otpCode: pin);
print('status i got is $status');
if (status == 200) {
await requestDetailProvider.getWorkOrderById(id: requestDetailProvider.currentWorkOrder!.data!.requestId!);
await requestDetailProvider.engineerConfirmArrival(workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!,verificationTypeId: 3,photoInfo: '',otp: pin);
Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) => RequestDetailMain(requestId: requestDetailProvider.currentWorkOrder!.data!.requestId!)));
}
print('status i got is $status');
if (status == 200) {
await requestDetailProvider.getWorkOrderById(id: requestDetailProvider.currentWorkOrder!.data!.requestId!);
await requestDetailProvider.engineerConfirmArrival(
workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!, verificationTypeId: 3, photoInfo: '', otp: pin, assetNo: '');
Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) => RequestDetailMain(requestId: requestDetailProvider.currentWorkOrder!.data!.requestId!)));
}
},
),
).paddingOnly(top: 24, bottom: 24),

@ -7,6 +7,7 @@ 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/helper_data_models/maintenance_request/activity_maintenance_model.dart';
import 'package:test_sa/models/new_models/work_order_detail_model.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';
@ -84,11 +85,12 @@ class _AssistantEmployeeCardState extends State<AssistantEmployeeCard> {
//TODO add check...
// enable: !isCurrentUserIsAssistantEmp,
onSelect: (employee) {
print('on select called...${employee?.toJson()}');
if (employee == null) {
requestDetailProvider.activityMaintenanceHelperModel?.assistantEmployees = [];
} else {
requestDetailProvider.activityMaintenanceHelperModel?.assistantEmployees = [employee.copyWith(id: 0)];
requestDetailProvider.activityMaintenanceHelperModel?.modelAssistantEmployees?.userId = employee.user?.id;
requestDetailProvider.activityMaintenanceHelperModel?.modelAssistantEmployees?.user?.userId=employee.user?.id;
}
},
@ -200,19 +202,19 @@ class _AssistantEmployeeCardState extends State<AssistantEmployeeCard> {
}
//TODO move this to some common place....@waseem
int calculateWorkingHours(DateTime? startTime, DateTime? endTime) {
double calculateWorkingHours(DateTime? startTime, DateTime? endTime) {
if (startTime != null && endTime != null) {
Duration difference = endTime.difference(startTime);
int hours = difference.inHours;
int hours = difference.inHours ;
int minutes = difference.inMinutes % 60;
return hours;
return hours.toDouble();
} else {
return -1;
}
}
assignWorkingHours({required RequestDetailProvider requestDetailProvider}) {
int hours = calculateWorkingHours(
double hours = calculateWorkingHours(
requestDetailProvider.activityMaintenanceHelperModel?.modelAssistantEmployees?.startDate, requestDetailProvider.activityMaintenanceHelperModel?.modelAssistantEmployees?.endDate);
if (hours != -1) {
_workingHoursController.text = hours.toString();

@ -1,4 +1,3 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/parts_provider.dart';
@ -42,208 +41,213 @@ class ExternalMaintenanceRequest extends StatefulWidget {
}
class _ExternalMaintenanceRequestState extends State<ExternalMaintenanceRequest> with TickerProviderStateMixin {
ServiceReport ?_serviceReport;
ServiceReport? _serviceReport;
final TextEditingController _workingHoursController = TextEditingController();
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
@override
void initState() {
getInitialData();
super.initState();
}
void getInitialData() {
RequestDetailProvider requestDetailProvider = Provider.of<RequestDetailProvider>(context, listen: false);
_workingHoursController.text =
requestDetailProvider.activityMaintenanceHelperModel?.supplierWorkingHour != null ? requestDetailProvider.activityMaintenanceHelperModel!.supplierWorkingHour.toString() : '';
}
@override
Widget build(BuildContext context) {
return Consumer<RequestDetailProvider>(
builder: (context, RequestDetailProvider requestDetailProvider,child) {
return Column(
children: [
Form(
key: _formKey,
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
SingleItemDropDownMenu<SupplierDetails, VendorProvider>(
context: context,
title: context.translation.supplier,
backgroundColor: AppColor.neutral100,
initialValue: requestDetailProvider.activityMaintenanceHelperModel?.supplier,
showAsBottomSheet: true,
onSelect: (supplier) {
if (supplier != null) {
requestDetailProvider.activityMaintenanceHelperModel?.supplier=supplier;
print('engineer is ${supplier.suppPersons?.length}');
// _subWorkOrders.supplier = supplier;
// log(_subWorkOrders.supplier?.suppPersons?.map((e) => e.personName)?.toString());
setState(() {});
}
},
),
8.height,
Row(
children: [
SingleItemDropDownMenu<SuppPersons, NullableLoadingProvider>(
context: context,
backgroundColor: requestDetailProvider.activityMaintenanceHelperModel?.supplier?.suppliername == null ? AppColor.neutral40 : AppColor.neutral100,
title: context.translation.supplierEngineer,
enabled: requestDetailProvider.activityMaintenanceHelperModel?.supplier?.suppPersons?.isNotEmpty ?? false,
staticData:requestDetailProvider.activityMaintenanceHelperModel?.supplier?.suppPersons,
showAsBottomSheet: true,
initialValue: requestDetailProvider.activityMaintenanceHelperModel?.supEngineer == null ? null : SuppPersons.fromJson(requestDetailProvider.activityMaintenanceHelperModel?.supEngineer?.toJson()),
onSelect: (suppPerson) {
print(suppPerson?.toJson());
if (suppPerson != null) {
requestDetailProvider.activityMaintenanceHelperModel?.supEngineer = SuppEngineerWorkOrders.fromJson(suppPerson.toJson());
requestDetailProvider.updateActivityMaintenanceHelperModel(requestDetailProvider.activityMaintenanceHelperModel);
// engineer = SuppEngineerWorkOrders(
// id: suppPerson?.supplierId,
// supplierContactId: suppPerson?.id,
// personName: suppPerson?.personName,
// contact: suppPerson?.contact,
// externalEngCode: suppPerson?.externalEngCode,
// email: suppPerson?.email,
// );
return Consumer<RequestDetailProvider>(builder: (context, RequestDetailProvider requestDetailProvider, child) {
return Column(
children: [
Form(
key: _formKey,
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
SingleItemDropDownMenu<SupplierDetails, VendorProvider>(
context: context,
title: context.translation.supplier,
backgroundColor: AppColor.neutral100,
initialValue: requestDetailProvider.activityMaintenanceHelperModel?.supplier,
showAsBottomSheet: true,
onSelect: (supplier) {
if (supplier != null) {
requestDetailProvider.activityMaintenanceHelperModel?.supplier = supplier;
// _subWorkOrders.supplier = supplier;
// log(_subWorkOrders.supplier?.suppPersons?.map((e) => e.personName)?.toString());
setState(() {});
}
},
),
8.height,
Row(
children: [
SingleItemDropDownMenu<SuppPersons, NullableLoadingProvider>(
context: context,
backgroundColor: requestDetailProvider.activityMaintenanceHelperModel?.supplier?.suppliername == null ? AppColor.neutral40 : AppColor.neutral100,
title: context.translation.supplierEngineer,
enabled: requestDetailProvider.activityMaintenanceHelperModel?.supplier?.suppPersons?.isNotEmpty ?? false,
staticData: requestDetailProvider.activityMaintenanceHelperModel?.supplier?.suppPersons,
showAsBottomSheet: true,
initialValue: requestDetailProvider.activityMaintenanceHelperModel?.supEngineer == null
? null
: SuppPersons.fromJson(requestDetailProvider.activityMaintenanceHelperModel?.supEngineer?.toJson()),
onSelect: (suppPerson) {
print(suppPerson?.toJson());
if (suppPerson != null) {
requestDetailProvider.activityMaintenanceHelperModel?.supEngineer = SuppEngineerWorkOrders.fromJson(suppPerson.toJson());
requestDetailProvider.updateActivityMaintenanceHelperModel(requestDetailProvider.activityMaintenanceHelperModel);
// engineer = SuppEngineerWorkOrders(
// id: suppPerson?.supplierId,
// supplierContactId: suppPerson?.id,
// personName: suppPerson?.personName,
// contact: suppPerson?.contact,
// externalEngCode: suppPerson?.externalEngCode,
// email: suppPerson?.email,
// );
setState(() {});
}
},
).expanded,
8.width,
Container(
height: 56.toScreenHeight,
width: 60.toScreenWidth,
decoration: BoxDecoration(
color: requestDetailProvider.activityMaintenanceHelperModel?.supplier?.suppliername == null ? AppColor.neutral40 : AppColor.neutral100,
borderRadius: BorderRadius.circular(10),
boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)],
),
child: Icon(
Icons.add,
color: context.isDark ? null : AppColor.neutral60,
),
).onPress(requestDetailProvider.activityMaintenanceHelperModel?.supplier?.suppliername == null
? null
: () async {
SuppEngineerWorkOrders suppEngineer = (await showModalBottomSheet(
context: context,
useSafeArea: true,
isScrollControlled: true,
backgroundColor: Colors.transparent,
builder: (context) => AddSupplierEngineerBottomSheet(requestDetailProvider.activityMaintenanceHelperModel!.supplier!.id!.toInt()),
)) as SuppEngineerWorkOrders;
requestDetailProvider.activityMaintenanceHelperModel?.supplier?.suppPersons ??= [];
requestDetailProvider.activityMaintenanceHelperModel?.supplier?.suppPersons?.add(SuppPersons.fromJson(suppEngineer.toJson()));
requestDetailProvider.activityMaintenanceHelperModel?.supEngineer = suppEngineer;
setState(() {});
}),
],
),
8.height,
Row(
mainAxisSize: MainAxisSize.min,
children: [
ADatePicker(
label: context.translation.startTime,
hideShadow: true,
backgroundColor: AppColor.neutral100,
date: requestDetailProvider.activityMaintenanceHelperModel?.supplierStartTime,
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?.supplierStartTime = selectedDateTime;
requestDetailProvider.updateActivityMaintenanceHelperModel(requestDetailProvider.activityMaintenanceHelperModel);
assignWorkingHours(requestDetailProvider: requestDetailProvider);
}
},
).expanded,
8.width,
Container(
height: 56.toScreenHeight,
width: 60.toScreenWidth,
decoration: BoxDecoration(
color: requestDetailProvider.activityMaintenanceHelperModel?.supplier?.suppliername == null ? AppColor.neutral40 : AppColor.neutral100,
borderRadius: BorderRadius.circular(10),
boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)],
),
child: Icon(
Icons.add,
color: context.isDark ? null : AppColor.neutral60,
),
).onPress(requestDetailProvider.activityMaintenanceHelperModel?.supplier?.suppliername == null
? null
: () async {
SuppEngineerWorkOrders suppEngineer = (await showModalBottomSheet(
});
},
).expanded,
8.width,
ADatePicker(
label: context.translation.endTime,
hideShadow: true,
backgroundColor: AppColor.neutral100,
date: requestDetailProvider.activityMaintenanceHelperModel?.supplierEndTime,
formatDateWithTime: true,
onDatePicker: (selectedDate) {
showTimePicker(
context: context,
useSafeArea: true,
isScrollControlled: true,
backgroundColor: Colors.transparent,
builder: (context) => AddSupplierEngineerBottomSheet(requestDetailProvider.activityMaintenanceHelperModel!.supplier!.id!.toInt()),
)) as SuppEngineerWorkOrders;
requestDetailProvider.activityMaintenanceHelperModel?.supplier?.suppPersons ??= [];
requestDetailProvider.activityMaintenanceHelperModel?.supplier?.suppPersons?.add(SuppPersons.fromJson(suppEngineer.toJson()));
requestDetailProvider.activityMaintenanceHelperModel?.supEngineer = suppEngineer;
setState(() {});
}),
],
),
8.height,
Row(
mainAxisSize: MainAxisSize.min,
children: [
ADatePicker(
label: context.translation.startTime,
hideShadow: true,
backgroundColor: AppColor.neutral100,
date: requestDetailProvider.activityMaintenanceHelperModel?.supplierStartTime,
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?.supplierStartTime = selectedDateTime;
requestDetailProvider.updateActivityMaintenanceHelperModel(requestDetailProvider.activityMaintenanceHelperModel);
assignWorkingHours(requestDetailProvider: requestDetailProvider);
}
});
},
).expanded,
8.width,
ADatePicker(
label: context.translation.endTime,
hideShadow: true,
backgroundColor: AppColor.neutral100,
date: requestDetailProvider.activityMaintenanceHelperModel?.supplierEndTime,
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!.supplierStartTime!=null&&selectedDateTime.isBefore(requestDetailProvider.activityMaintenanceHelperModel!.supplierStartTime!)) {
"End Date time must be greater then start date".showToast;
return;
}
requestDetailProvider.activityMaintenanceHelperModel?.supplierEndTime = selectedDateTime;
requestDetailProvider.updateActivityMaintenanceHelperModel(requestDetailProvider.activityMaintenanceHelperModel);
assignWorkingHours(requestDetailProvider: requestDetailProvider);
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!.supplierStartTime != null &&
selectedDateTime.isBefore(requestDetailProvider.activityMaintenanceHelperModel!.supplierStartTime!)) {
"End Date time must be greater then start date".showToast;
return;
}
});
},
).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?.supplierWorkingHour!=null? requestDetailProvider.activityMaintenanceHelperModel?.supplierWorkingHour.toString():'',
textAlign: TextAlign.center,
labelStyle: AppTextStyles.textFieldLabelStyle,
enable: false,
showShadow: false,
style: Theme.of(context).textTheme.titleMedium,
),
8.height,
],
),
).toShadowContainer(context).paddingOnly(start: 16, end: 16, top: 12),
],
);
}
);
requestDetailProvider.activityMaintenanceHelperModel?.supplierEndTime = 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?.supplierWorkingHour != null ? requestDetailProvider.activityMaintenanceHelperModel?.supplierWorkingHour.toString() : '',
textAlign: TextAlign.center,
labelStyle: AppTextStyles.textFieldLabelStyle,
enable: false,
showShadow: false,
style: Theme.of(context).textTheme.titleMedium,
),
8.height,
],
),
).toShadowContainer(context).paddingOnly(start: 16, end: 16, top: 12),
],
);
});
}
int calculateWorkingHours(DateTime? startTime, DateTime? endTime) {
if(startTime!=null&&endTime!=null){
if (startTime != null && endTime != null) {
Duration difference = endTime.difference(startTime);
int hours = difference.inHours;
int minutes = difference.inMinutes % 60;
return hours;
}else{
} else {
return -1;
}
}
assignWorkingHours({required RequestDetailProvider requestDetailProvider}){
int hours = calculateWorkingHours(requestDetailProvider.activityMaintenanceHelperModel!.supplierStartTime,requestDetailProvider.activityMaintenanceHelperModel!.supplierEndTime);
if(hours!=-1){
assignWorkingHours({required RequestDetailProvider requestDetailProvider}) {
int hours = calculateWorkingHours(requestDetailProvider.activityMaintenanceHelperModel!.supplierStartTime, requestDetailProvider.activityMaintenanceHelperModel!.supplierEndTime);
if (hours != -1) {
_workingHoursController.text = hours.toString();
requestDetailProvider.activityMaintenanceHelperModel!.workingHour=hours;
requestDetailProvider.activityMaintenanceHelperModel!.workingHour = hours;
}
}
}

@ -46,19 +46,19 @@ class _InternalMaintenanceRequestState extends State<InternalMaintenanceRequest>
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final TextEditingController _workingHoursController = TextEditingController();
final TextEditingController _partQtyController = TextEditingController();
final TextEditingController _travellingHoursController = TextEditingController();
@override
void initState() {
_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((_) {
_travellingHoursController.text =
_requestDetailProvider?.activityMaintenanceHelperModel?.travelHours != null ? _requestDetailProvider!.activityMaintenanceHelperModel!.travelHours.toString() : '';
});
// _isLoading = true;
}
@ -66,12 +66,10 @@ class _InternalMaintenanceRequestState extends State<InternalMaintenanceRequest>
@override
void dispose() {
_workingHoursController.dispose();
_partQtyController.dispose();
_travellingHoursController.dispose();
super.dispose();
}
void getRequestForWorkOrder() async {
_isLoading = true;
setState(() {});
@ -87,6 +85,7 @@ class _InternalMaintenanceRequestState extends State<InternalMaintenanceRequest>
@override
Widget build(BuildContext context) {
return Consumer<RequestDetailProvider>(builder: (context, requestDetailProvider, child) {
print('data in consumer is ${requestDetailProvider.activityMaintenanceHelperModel?.activityStatus?.toJson()}');
return SingleChildScrollView(
child: Column(
children: [
@ -182,6 +181,7 @@ class _InternalMaintenanceRequestState extends State<InternalMaintenanceRequest>
8.height,
AppTextFormField(
labelText: context.translation.travelingHours,
controller: _travellingHoursController,
backgroundColor: AppColor.neutral100,
showShadow: false,
labelStyle: AppTextStyles.textFieldLabelStyle,
@ -228,7 +228,7 @@ class _InternalMaintenanceRequestState extends State<InternalMaintenanceRequest>
],
),
).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),
const AssistantEmployeeCard().toShadowContainer(context, paddingObject: const EdgeInsets.symmetric(horizontal: 16)).paddingOnly(start: 13, end: 14, top: 12),
100.height,
],
),
@ -304,6 +304,4 @@ class _InternalMaintenanceRequestState extends State<InternalMaintenanceRequest>
requestDetailProvider.activityMaintenanceHelperModel!.workingHour = hours;
}
}
}

@ -8,6 +8,7 @@ import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/helper_data_models/maintenance_request/activity_maintenance_model.dart';
import 'package:test_sa/models/new_models/work_order_detail_model.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';
@ -34,110 +35,104 @@ class _MaintenanceRequestFormState extends State<MaintenanceRequestForm> with Si
});
super.initState();
}
Future<void> getInitialData() async {
Provider.of<ServiceReportRepairLocationProvider>(context, listen: false).getTypes();
RequestDetailProvider requestDetailProvider = Provider.of<RequestDetailProvider>(context,listen: false);
// requestDetailProvider.activityMaintenanceHelperModel = ActivityMaintenanceHelperModel(
//
// );
requestDetailProvider.activityMaintenanceHelperModel?.modelAssistantEmployees = MaintenanceActivityAssistantEmployees();
RequestDetailProvider requestDetailProvider = Provider.of<RequestDetailProvider>(context, listen: false);
requestDetailProvider.activityMaintenanceHelperModel?.modelAssistantEmployees =
requestDetailProvider.activityMaintenanceHelperModel?.modelAssistantEmployees ?? ActivityMaintenanceAssistantEmployees();
}
@override
Widget build(BuildContext context) {
return Consumer<RequestDetailProvider>(
builder: (context,RequestDetailProvider requestDetailProvider, child) {
return Scaffold(
backgroundColor: AppColor.neutral110,
appBar: DefaultAppBar(title: context.translation.maintenanceRequest),
body: Stack(
children: [
DefaultTabController(
length: 2,
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Container(
margin: EdgeInsets.only(left: 16.toScreenWidth, right: 16.toScreenWidth, top: 12.toScreenHeight),
decoration: BoxDecoration(
color: context.isDark ? AppColor.neutral50 : AppColor.white10,
borderRadius: BorderRadius.circular(10),
),
child: TabBar(
padding: EdgeInsets.symmetric(vertical: 4.toScreenHeight, horizontal: 4.toScreenWidth),
labelColor: context.isDark ? AppColor.neutral30 : AppColor.black20,
unselectedLabelColor: context.isDark ? AppColor.neutral30 : AppColor.black20,
unselectedLabelStyle: AppTextStyles.bodyText,
labelStyle: AppTextStyles.bodyText,
indicatorPadding: EdgeInsets.zero,
indicatorSize: TabBarIndicatorSize.tab,
dividerColor: Colors.transparent,
indicator: BoxDecoration(
color: context.isDark ? AppColor.neutral60 : AppColor.neutral110,
borderRadius: BorderRadius.circular(7),
),
tabs: [
Tab(text: context.translation.internal, height: 57.toScreenHeight),
Tab(text: context.translation.external, height: 57.toScreenHeight),
],
),
return Consumer<RequestDetailProvider>(builder: (context, RequestDetailProvider requestDetailProvider, child) {
return Scaffold(
backgroundColor: AppColor.neutral110,
appBar: DefaultAppBar(title: context.translation.maintenanceRequest),
body: Stack(
children: [
DefaultTabController(
length: 2,
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Container(
margin: EdgeInsets.only(left: 16.toScreenWidth, right: 16.toScreenWidth, top: 12.toScreenHeight),
decoration: BoxDecoration(
color: context.isDark ? AppColor.neutral50 : AppColor.white10,
borderRadius: BorderRadius.circular(10),
),
// 12.height,
const TabBarView(
children: [
InternalMaintenanceRequest(),
ExternalMaintenanceRequest(),
child: TabBar(
padding: EdgeInsets.symmetric(vertical: 4.toScreenHeight, horizontal: 4.toScreenWidth),
labelColor: context.isDark ? AppColor.neutral30 : AppColor.black20,
unselectedLabelColor: context.isDark ? AppColor.neutral30 : AppColor.black20,
unselectedLabelStyle: AppTextStyles.bodyText,
labelStyle: AppTextStyles.bodyText,
indicatorPadding: EdgeInsets.zero,
indicatorSize: TabBarIndicatorSize.tab,
dividerColor: Colors.transparent,
indicator: BoxDecoration(
color: context.isDark ? AppColor.neutral60 : AppColor.neutral110,
borderRadius: BorderRadius.circular(7),
),
tabs: [
Tab(text: context.translation.internal, height: 57.toScreenHeight),
Tab(text: context.translation.external, height: 57.toScreenHeight),
],
).expanded,
],
),
),
),
// 12.height,
const TabBarView(
children: [
InternalMaintenanceRequest(),
ExternalMaintenanceRequest(),
],
).expanded,
],
),
FooterActionButton.footerContainer(
child: AppFilledButton(
label: context.translation.addActivity, // Use the dynamic label
buttonColor: AppColor.primary10,
onPressed: () async {
//TODO add this as dropdown not added in design yet Bhaa need to confirm with hussain then.
requestDetailProvider.activityMaintenanceHelperModel?.lastSituationId=282;
),
FooterActionButton.footerContainer(
child: AppFilledButton(
label: requestDetailProvider.activityMaintenanceHelperModel?.id != 0 ? context.translation.update : context.translation.addActivity, // Use the dynamic label
buttonColor: AppColor.primary10,
onPressed: () async {
//TODO add this as dropdown not added in design yet Bhaa need to confirm with hussain then.
requestDetailProvider.activityMaintenanceHelperModel?.lastSituationId = 282;
print('model is ${requestDetailProvider.activityMaintenanceHelperModel?.toJson()}');
print('model to add is ${requestDetailProvider.activityMaintenanceHelperModel?.toJson()}');
if(validate(model: requestDetailProvider.activityMaintenanceHelperModel!)){
// showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
int status = -1;
// if (requestDetailProvider.activityMaintenanceHelperModel?.id == 0) {
if (validate(model: requestDetailProvider.activityMaintenanceHelperModel!)) {
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
int status = -1;
if (requestDetailProvider.activityMaintenanceHelperModel?.id == 0) {
status = await requestDetailProvider.createActivityMaintenanceRequest();
print('status i got is $status');
// } else {
// //TODO update logic...
// status = await requestDetailProvider.updateActivityMaintenance();
// }
if (status == 200) {
//this is for hide the dialoge...
requestDetailProvider.getWorkOrderById(id: requestDetailProvider.currentWorkOrder!.data!.requestId!);
Navigator.pop(context);
Navigator.pop(context);
} else {
Navigator.pop(context);
}
} else {
print('going to update..');
status = await requestDetailProvider.updateActivityMaintenance();
}
if (status == 200) {
requestDetailProvider.getWorkOrderById(id: requestDetailProvider.currentWorkOrder!.data!.requestId!);
print('workorder activities list i got is ${requestDetailProvider.currentWorkOrder?.data?.activities.length}');
Navigator.pop(context);
Navigator.pop(context);
} else {
Navigator.pop(context);
}
}
// Handle button press
},
),
// Handle button press
},
),
],
),
);
}
);
),
],
),
);
});
}
bool validate({required ActivityMaintenanceHelperModel model}) {
bool validate({required ActivityMaintenanceHelperModel model}) {
print('employee id is ${model.assignedEmployeeId}');
if (model.activityStatus == null) {

@ -16,6 +16,7 @@ import 'package:test_sa/new_views/common_widgets/single_item_drop_down_menu.dart
import 'package:test_sa/providers/loading_list_notifier.dart';
import 'package:test_sa/service_request_latest/request_detail_provider.dart';
import 'package:test_sa/service_request_latest/views/components/action_button/footer_action_button.dart';
import 'package:test_sa/service_request_latest/views/components/bottom_sheets/service_request_bottomsheet.dart';
import 'package:test_sa/views/widgets/images/new_multi_image_picker.dart';
import '../../../../../../models/service_request/spare_parts.dart';
@ -224,6 +225,8 @@ class _SparePartRequestState extends State<SparePartRequest> with TickerProvider
//this is for hide the dialoge...
Navigator.pop(context);
Navigator.pop(context);
ServiceRequestBottomSheet.addAnotherSpareRequestBottomSheet(context: context);
SizedBox().flushBar(context: context, title: context.translation.sparePartActivitySuccess, message: '');
} else {
Navigator.pop(context);
}

Loading…
Cancel
Save