improvements

design_3.0_latest
muhammad.abbasi 1 year ago
parent c9ce003b29
commit fbdbdf67a0

@ -8,6 +8,7 @@ import Flutter
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}

@ -1,4 +1,4 @@
class AppAsset{
class AppAsset {
static String loginTopBg = 'assets/images/login_top_bg.png';
static String askOtpIcon = 'ask_otp_icon';
static String askRequesterIcon = 'ask_requester_icon';
@ -10,4 +10,4 @@ class AppAsset{
static String editIcon = 'assets/images/edit_icon.svg';
static String deleteIcon = 'assets/images/delete_icon.svg';
static String overDueIcon = 'assets/images/overdue.svg';
}
}

@ -93,7 +93,6 @@ class AllRequestsProvider extends ChangeNotifier {
}
void resetRequestsApiData() {
print('reset api data called..');
_highPriorityRequests = null;
_overdueRequests = null;
openRequests = null;
@ -411,7 +410,6 @@ class AllRequestsProvider extends ChangeNotifier {
_allRequestsAndCount = null;
}
isInProgressLoading = false;
print('value of inProgress loading in provider is $isInProgressLoading');
notifyListeners();
return response.statusCode;
} catch (error) {
@ -534,7 +532,6 @@ class AllRequestsProvider extends ChangeNotifier {
} else {
completedRequests!.requestsDetails!.addAll(AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0]).requestsDetails!);
}
print('completed request length is ${completedRequests!.requestsDetails!.length}');
if (completedRequests!.requestsDetails!.length >= pageItemNumber) {
nextPage = true;
} else {

@ -92,7 +92,6 @@ class PartsProvider extends ChangeNotifier {
} else {
response = await ApiManager.instance.post(URLs.getPartNumber, body: {"partName": partName, "assetId": assetId});
}
print('response of get PartNo i got is ${response.body}');
List<SparePart> page = [];
if (response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received

@ -8,6 +8,8 @@ import 'package:test_sa/models/enums/user_types.dart';
import 'package:test_sa/models/new_models/dashboard_count.dart';
import 'package:test_sa/models/new_models/dashboard_detail.dart' as DD;
import '../controllers/providers/api/user_provider.dart';
class DashBoardProvider extends ChangeNotifier {
bool isAllCountLoading = false;
bool isLoading = false;
@ -160,7 +162,6 @@ class DashBoardProvider extends ChangeNotifier {
notifyListeners();
}
print('i am called...${usersType}');
Response response;
String url = '';
@ -211,6 +212,13 @@ class DashBoardProvider extends ChangeNotifier {
_isDetailLoading = value;
notifyListeners();
}
void refreshDashboard({required UsersTypes userType,required BuildContext context}) {
setTabs(userType:userType,context: context);
getDashBoardCount(usersType: userType);
resetRequestDataList();
getRequestDetail(usersType: userType, status: tabs[currentListIndex].tag);
// notifyListeners();
}
}
class CategoryTabs {
@ -227,9 +235,9 @@ class CategoryTabs {
tabs.add(CategoryTabs('Completed', 3));
return tabs;
}
tabs.add(CategoryTabs('UpComing Request', 3));
tabs.add(CategoryTabs('Open Request', 1));
tabs.add(CategoryTabs('In Progress', 2));
tabs.add(CategoryTabs('Acknowledged', 3));
tabs.add(CategoryTabs('Rejected', 6));
return tabs;
}

@ -114,7 +114,6 @@ class _DashboardViewState extends State<DashboardView> {
@override
Widget build(BuildContext context) {
bool isNurse = (Provider.of<UserProvider>(context, listen: false).user!.type) == UsersTypes.normal_user;
print('user data is ${Provider.of<UserProvider>(context, listen: false).user?.toJson()}');
return Scaffold(
// backgroundColor: AppColor.background(context),
appBar: PreferredSize(

@ -1,3 +1,4 @@
import 'package:date_picker_timeline/date_picker_widget.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart';
@ -9,6 +10,7 @@ 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/new_models/dashboard_detail.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/tab_button.dart';
import 'package:test_sa/views/widgets/loaders/no_data_found.dart';
@ -23,8 +25,30 @@ class RequestCategoryFragment extends StatelessWidget {
getTabs(
requestsProvider: dashboardProvider,
context: context,
userType: Provider.of<UserProvider>(context, listen: false).user!.type!,
userType: Provider.of<UserProvider>(context, listen: false).user != null ? Provider.of<UserProvider>(context, listen: false).user!.type! : UsersTypes.nurse,
),
// if (Provider.of<UserProvider>(context, listen: false).user!.type == UsersTypes.engineer && dashboardProvider.currentListIndex == 0) ...[
// Padding(
// padding: const EdgeInsets.all(8.0),
// child: Column(
// children: [
// 8.height,
// DatePicker(
// DateTime.now().subtract(const Duration(days: 3)),
// width: 50.toScreenWidth,
// initialSelectedDate: DateTime.now(),
// selectionColor: AppColor.green70,
// selectedTextColor: Colors.white,
// daysCount: 7,
// dateTextStyle: const TextStyle(fontWeight: FontWeight.w600),
// onDateChange: (date) {
// print('date time i got is $date');
// },
// ).toShadowContainer(context, padding: 2),
// ],
// ),
// ),
// ],
dashboardProvider.isDetailLoading || dashboardProvider.requestDetailList == null
? Column(
mainAxisSize: MainAxisSize.max,

@ -12,6 +12,7 @@ import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/custom_badge.dart';
import 'package:test_sa/new_views/pages/land_page/requests_list_page.dart';
import 'package:test_sa/controllers/providers/api/all_requests_provider.dart';
class RequestsFragment extends StatelessWidget {
const RequestsFragment({Key? key}) : super(key: key);
@ -19,7 +20,7 @@ class RequestsFragment extends StatelessWidget {
Widget build(BuildContext context) {
return Consumer<DashBoardProvider>(
builder: (context, snapshot, _) => GridView(
padding: const EdgeInsets.only( left: 16, right: 16),
padding: const EdgeInsets.only(left: 16, right: 16),
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 4, childAspectRatio: 72 / 84, crossAxisSpacing: 2, mainAxisSpacing: 12),
@ -34,8 +35,8 @@ class RequestsFragment extends StatelessWidget {
context.isDark ? AppColor.redStatus(context) : AppColor.red30,
),
listItem(snapshot.dashboardCount?.data?.countOverdue ?? 0, "overdue", context.translation.overdue, context, snapshot.isAllCountLoading, 1, AppColor.yellowIcon(context)),
listItem(snapshot.dashboardCount?.data?.countOpen ?? 0, "new_request", ApiManager.instance.user!.type == UsersTypes.engineer ? context.translation.inProgress : context.translation.newR,
context, snapshot.isAllCountLoading, 2, AppColor.primary10),
listItem(ApiManager.instance.user?.type == UsersTypes.engineer ? snapshot.dashboardCount?.data?.countInprogress ?? 0 : snapshot.dashboardCount?.data?.countOpen ?? 0, "new_request",
ApiManager.instance.user?.type == UsersTypes.engineer ? context.translation.inProgress : context.translation.newR, context, snapshot.isAllCountLoading, 2, AppColor.primary10),
listItem(snapshot.dashboardCount?.data?.countComplete ?? 0, "complete_request", context.translation.completed, context, snapshot.isAllCountLoading, 3, AppColor.greenStatus(context)),
],
),

@ -1,3 +1,4 @@
import 'package:test_sa/app_strings/app_asset.dart';
import 'package:test_sa/models/enums/work_order_next_step.dart';
extension EnumExtensionsWorkOrder on WorkOrderNextStepEnum {
@ -60,4 +61,18 @@ extension IntExtensionsWorkOrder on int {
return WorkOrderNextStepEnum.onlyView;
}
}
String getVerificationIconByValue() {
switch (this) {
case 1:
return AppAsset.scanQrIcon;
case 2:
return AppAsset.askRequesterIcon;
case 3:
return AppAsset.askOtpIcon;
case 4:
return AppAsset.takeDevicePhotoIcon;
default:
return AppAsset.askRequesterIcon;
}
}
}

@ -12,4 +12,5 @@ extension IntExtensions on int {
double get toScreenHeight => (this / 932) * SizeConfig.screenHeight!;
double get toScreenWidth => (this / 430) * SizeConfig.screenWidth!;
}

@ -307,7 +307,7 @@
"up_and_running": "قيد التشغيل",
"partially_down": "معطل جزئيًا",
"fully_down": "معطل تمامًا",
"verify_asset_details": "تحقق من تفاصيل الأصل",
"updateAssetDetails": "تحديث تفاصيل الأصل",
"equipment_status": "حالة المعدات",
"failureReason": "سبب الفشل",
"visitDateAndTime": "تاريخ ووقت الزيارة",

@ -280,7 +280,7 @@
"needAVisit": "Need a Visit",
"fixedRemotely": "Fixed Remotely",
"iHaveArrived": "I have arrived",
"verify_asset_details": "Verify Asset Details",
"updateAssetDetails": "Update Asset Details",
"equipment_status": "Equipment Status",
"failureReason": "Failure Reason",
"visitDateAndTime": "Visit Date & Time",

@ -1,5 +1,7 @@
import 'package:test_sa/extensions/enum_extensions.dart';
class ArrivalVerificationTypeModel {
List<Data>? data;
List<ArrivalTypeData>? data;
String? message;
String? title;
String? innerMessage;
@ -16,9 +18,9 @@ class ArrivalVerificationTypeModel {
ArrivalVerificationTypeModel.fromJson(Map<String, dynamic> json) {
if (json['data'] != null) {
data = <Data>[];
data = <ArrivalTypeData>[];
json['data'].forEach((v) {
data!.add(Data.fromJson(v));
data!.add(ArrivalTypeData.fromJson(v));
});
}
message = json['message'];
@ -30,38 +32,57 @@ class ArrivalVerificationTypeModel {
}
class Data {
class ArrivalTypeData {
int? assetGroupId;
int? verificationTypeId;
VerificationTypes? verificationTypes;
int? id;
String? description;
String? createdBy;
String? createdDate;
dynamic modifiedBy;
dynamic modifiedDate;
Data(
ArrivalTypeData(
{this.assetGroupId,
this.verificationTypeId,
this.verificationTypes,
this.id,
this.description,
this.createdBy,
this.createdDate,
this.modifiedBy,
this.modifiedDate});
Data.fromJson(Map<String, dynamic> json) {
ArrivalTypeData.fromJson(Map<String, dynamic> json) {
assetGroupId = json['assetGroupId'];
verificationTypeId = json['verificationTypeId'];
verificationTypes = json['verificationTypes'] != null
? VerificationTypes.fromJson(json['verificationTypes'])
: null;
id = json['id'];
description = json['description'];
createdBy = json['createdBy'];
createdDate = json['createdDate'];
modifiedBy = json['modifiedBy'];
modifiedDate = json['modifiedDate'];
}
Map<String, dynamic> toJson() {
return {
'assetGroupId': assetGroupId,
'verificationTypeId': verificationTypeId,
'verificationTypes': verificationTypes?.toJson(),
'id': id,
'createdBy': createdBy,
'createdDate': createdDate,
'description': description,
'modifiedBy': modifiedBy,
'modifiedDate': modifiedDate,
};
}
}
@ -69,13 +90,23 @@ class VerificationTypes {
int? id;
String? name;
int? value;
String?icon;
VerificationTypes({this.id, this.name, this.value});
VerificationTypes({this.id, this.name, this.value,this.icon});
VerificationTypes.fromJson(Map<String, dynamic> json) {
id = json['id'];
name = json['name'];
value = json['value'];
icon = (json['value'] as int).getVerificationIconByValue();
}
Map<String, dynamic> toJson() {
return {
'id': id,
'name': name,
'value': value,
};
}
}

@ -112,7 +112,7 @@ class WorkOrderData {
Lookup? requestedThrough;
Lookup? typeofRequest;
Lookup? loanAvailablity;
Lookup? assetLoan;
AssetLoan? assetLoan;
Lookup? safety;
Lookup? problemDescription;
String? comments;
@ -157,7 +157,7 @@ class WorkOrderData {
requestedThrough: json["requestedThrough"] == null ? null : Lookup.fromJson(json["requestedThrough"]),
typeofRequest: json["typeofRequest"] == null ? null : Lookup.fromJson(json["typeofRequest"]),
loanAvailablity: json["loanAvailablity"] == null ? null : Lookup.fromJson(json["loanAvailablity"]),
assetLoan: json["assetLoan"] == null ? null : Lookup.fromJson(json["assetLoan"]),
assetLoan: json["assetLoan"] == null ? null : AssetLoan.fromJson(json["assetLoan"]),
safety: json["safety"] == null ? null : Lookup.fromJson(json["safety"]),
problemDescription: json["problemDescription"] == null ? null : Lookup.fromJson(json["problemDescription"]),
comments: json["comments"],
@ -332,6 +332,43 @@ class WorkOrderAssignedEmployee {
"languageId": languageId,
};
}
class AssetLoan {
AssetLoan({
required this.id,
required this.assetSerialNo,
required this.tagCode,
required this.systemId,
required this.assetNumber,
required this.assetName,
});
dynamic id;
dynamic tagCode;
dynamic systemId;
String? assetSerialNo;
String? assetNumber;
String? assetName;
factory AssetLoan.fromJson(Map<String, dynamic> json) {
return AssetLoan(
id: json["id"],
tagCode: json["tagCode"],
systemId: json["systemId"],
assetSerialNo: json["assetSerialNo"],
assetNumber: json["assetNumber"],
assetName: json["assetName"],
);
}
Map<String, dynamic> toJson() => {
"id": id,
"assetName": assetName,
"assetNumber": assetNumber,
"assetSerialNo": assetSerialNo,
"tagCode": tagCode,
"systemId": systemId,
};
}
class Activities {
int? id;
@ -621,7 +658,6 @@ class ActivityMaintenance {
this.assistantEmployees});
ActivityMaintenance.fromJson(Map<String, dynamic> json) {
print('activity status i got is ${json['activityStatus']}');
id = json['id'];
activityStatus = json['activityStatus'] != null ? ActivityStatus.fromJson(json['activityStatus']) : null;
startTime = json['startTime'];

@ -53,16 +53,6 @@ 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?;

@ -1,5 +1,8 @@
//service request item page
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/dashboard_latest/dashboard_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart';
@ -69,8 +72,9 @@ class ServiceRequestItemView extends StatelessWidget {
],
),
],
).toShadowContainer(context, withShadow: showShadow).onPress(() {
Navigator.of(context).push(MaterialPageRoute(builder: (_) => RequestDetailMain(requestId: requestData!.id!)));
).toShadowContainer(context, withShadow: showShadow).onPress(() async{
await Navigator.of(context).push(MaterialPageRoute(builder: (_) => RequestDetailMain(requestId: requestData!.id!)));
Provider.of<DashBoardProvider>(context, listen: false).refreshDashboard(userType: Provider.of<SettingProvider>(context, listen: false).user!.type!, context: context);
});
}
if (requestDetails != null) {

@ -16,7 +16,6 @@ class EquipmentStatusProvider extends LoadingListNotifier<Lookup> {
try {
Response response = await ApiManager.instance.get(URLs.equipmentStatus);
stateCode = response.statusCode;
print('response of get status value is ${response.body}');
if (response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received
List categoriesListJson = json.decode(response.body)["data"];

@ -29,6 +29,7 @@ class RequestDetailProvider extends ChangeNotifier {
void startTimer() {
if (isTimerRunning) return;
resetTimer();
timer = Timer.periodic(const Duration(seconds: 1), (Timer t) {
timerStartTime = timerStartTime.add(const Duration(seconds: 1));
notifyListeners(); // Notify UI when time is updated
@ -38,10 +39,7 @@ class RequestDetailProvider extends ChangeNotifier {
}
void stopTimer() {
Timer.periodic(const Duration(seconds: 1), (Timer t) {
timerStartTime = timerStartTime.add(const Duration(seconds: 1));
notifyListeners(); // Notify UI when time is updated
});
resetTimer();
timer?.cancel();
isTimerRunning = false;
engineerStopTimer();
@ -57,6 +55,15 @@ class RequestDetailProvider extends ChangeNotifier {
DateTime get currentTime => timerStartTime;
bool _isLoading = false;
bool _isArrivalLoading = false;
bool get isArrivalLoading => _isArrivalLoading;
set isArrivalLoading(bool value) {
_isArrivalLoading = value;
notifyListeners();
}
bool get isLoading => _isLoading;
@ -76,7 +83,7 @@ class RequestDetailProvider extends ChangeNotifier {
EngineerRejectHelperModel? engineerRejectHelperModel = EngineerRejectHelperModel();
EngineerUpdateWorkOrderHelperModel? engineerUpdateWorkOrderHelperModel = EngineerUpdateWorkOrderHelperModel();
WorkOrderHelperModel? workOrderHelperModel;
List<ArrivalTypeData> ?arrivalTypeList =[];
void updateAssetRetiredHelperModel(AssetRetiredHelperModel? value) {
assetRetiredHelperModel = value;
notifyListeners();
@ -159,7 +166,6 @@ class RequestDetailProvider extends ChangeNotifier {
body: workOrderHelperModel!.toJson(),
);
stateCode = response.statusCode;
print('response of create request is ${response.body}');
if (response.statusCode >= 200 && response.statusCode < 300) {
// request.engineerName = employee.name;
}
@ -222,7 +228,6 @@ class RequestDetailProvider extends ChangeNotifier {
isLoading = true;
notifyListeners();
response = await ApiManager.instance.post(URLs.engineerStopTimer, body: body);
print('response of stop timer is ${response.body}');
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
@ -312,8 +317,6 @@ class RequestDetailProvider extends ChangeNotifier {
notifyListeners();
response = await ApiManager.instance.post(URLs.engineerUpdateNeedVisitUrl, body: needVisitHelperModel!.toJson());
stateCode = response.statusCode;
print('body i got is ${needVisitHelperModel?.toJson()}');
print('response i got is ${response.body}');
if (response.statusCode >= 200 && response.statusCode < 300) {
currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body));
}
@ -338,7 +341,6 @@ class RequestDetailProvider extends ChangeNotifier {
response = await ApiManager.instance.post(URLs.engineerMarkAsFixUrl, body: body);
stateCode = response.statusCode;
print('engineer mark as fixed response is ${response.body}');
if (response.statusCode >= 200 && response.statusCode < 300) {
currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body));
}
@ -385,7 +387,7 @@ class RequestDetailProvider extends ChangeNotifier {
response = await ApiManager.instance.post(URLs.engineerConfirmArriveUrl, body: body);
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
// print('response of Engineer confirm arrival ${response.body}');
currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body));
}
isLoading = false;
notifyListeners();
@ -453,7 +455,7 @@ class RequestDetailProvider extends ChangeNotifier {
if (response.statusCode >= 200 && response.statusCode < 300) {
commonResponseModel = CommonResponseModel.fromJson(json.decode(response.body));
// commonResponseModel = CommonResponseModel.fromJson(json.decode(response.body));
}
isLoading = false;
notifyListeners();
@ -476,7 +478,7 @@ class RequestDetailProvider extends ChangeNotifier {
stateCode = response.statusCode;
CommonResponseModel commonResponseModel = CommonResponseModel();
if (response.statusCode >= 200 && response.statusCode < 300) {
commonResponseModel = CommonResponseModel.fromJson(json.decode(response.body));
// commonResponseModel = CommonResponseModel.fromJson(json.decode(response.body));
}
isLoading = false;
notifyListeners();
@ -495,7 +497,6 @@ class RequestDetailProvider extends ChangeNotifier {
try {
final response = await ApiManager.instance.post(URLs.updateActivitySparePartUrl, body: sparePartHelperModel!.toJson());
stateCode = response.statusCode;
print('update response i got is ${response.body}');
if (response.statusCode >= 200 && response.statusCode < 300) {
// request.engineerName = employee.name;
}
@ -533,7 +534,6 @@ class RequestDetailProvider extends ChangeNotifier {
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'];
@ -555,7 +555,6 @@ class RequestDetailProvider extends ChangeNotifier {
try {
final response = await ApiManager.instance.post(URLs.deleteActivitySparePartUrl, body: body);
stateCode = response.statusCode;
print('response of delete activity spare part is ${response.statusCode}');
if (response.statusCode >= 200 && response.statusCode < 300) {
//map to the model...
@ -604,7 +603,6 @@ class RequestDetailProvider extends ChangeNotifier {
body: sparePartHelperModel!.toJson(),
);
stateCode = response.statusCode;
print('add sparepart activity response i got is ${response.body}');
if (response.statusCode >= 200 && response.statusCode < 300) {
// currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body));
// // updateCurrentWorkOrder(currentWorkOrder);
@ -629,7 +627,6 @@ class RequestDetailProvider extends ChangeNotifier {
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);
@ -668,24 +665,25 @@ class RequestDetailProvider extends ChangeNotifier {
}
//get Arrival type......
Future<ArrivalVerificationTypeModel> getArrivalVerificationType() async {
ArrivalVerificationTypeModel arrivalVerificationTypeModel = ArrivalVerificationTypeModel();
Future<int> getArrivalVerificationType() async {
try {
isLoading = true;
isArrivalLoading = 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 = ArrivalVerificationTypeModel.fromJson(json.decode(response.body));
arrivalTypeList = arrivalVerificationTypeModel.data;
}
isLoading = false;
isArrivalLoading = false;
notifyListeners();
return arrivalVerificationTypeModel;
return response.statusCode;
} catch (e) {
log("getArrivalVerifaction [error] : $e");
isLoading = false;
isArrivalLoading = false;
notifyListeners();
return arrivalVerificationTypeModel;
return -1;
}
}
@ -697,10 +695,7 @@ class RequestDetailProvider extends ChangeNotifier {
final response = await ApiManager.instance.postWithOutBody(
URLs.sendOtpUrl + "$workOrderId",
);
print('url for send otp is ${URLs.sendOtpUrl + "$workOrderId"}');
stateCode = response.statusCode;
print('response i got is ${response.body}');
if (response.statusCode >= 200 && response.statusCode < 300) {}
isLoading = false;
notifyListeners();

@ -0,0 +1,25 @@
import 'package:flutter/material.dart';
class ServiceRequestUtils{
static int calculateAndAssignWorkingHours({
required DateTime? startTime,
required DateTime? endTime,
required TextEditingController workingHoursController,
required Function(int) updateModel, // A callback to update the model
}) {
print('end date i got is ${endTime}');
if (startTime != null && endTime != null) {
Duration difference = endTime.difference(startTime);
int hours = difference.inHours;
// Update the controller and model
workingHoursController.text = hours.toString();
updateModel(hours); // Call the function to update the model
return hours;
} else {
return -1; // Indicating invalid input
}
}
}

@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/dashboard_latest/dashboard_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart';
@ -45,7 +46,6 @@ class FooterActionButton {
break;
// TODO: Handle this case.
case WorkOrderNextStepEnum.nTakeAction:
print('i am here take action ..');
// const SizedBox().flushBar(context: context, title: context.translation.youMarkedThisIssueAsFixedWaitingForTheRequesterToConfirm, message: '');
return footerContainer(
child: AppFilledButton(
@ -134,7 +134,7 @@ class FooterActionButton {
case WorkOrderNextStepEnum.verifyAssetDetail:
return footerContainer(
child: AppFilledButton(
label: context.translation.verify_asset_details,
label: context.translation.updateAssetDetails,
// maxWidth: true,
buttonColor: AppColor.primary10,
onPressed: () async {
@ -162,6 +162,7 @@ class FooterActionButton {
buttonColor: AppColor.green70,
onPressed: () async {
ServiceRequestBottomSheet.feedBackBottomSheet(context: context);
},
),
]
@ -181,10 +182,7 @@ class FooterActionButton {
}
}
else {
print('value is ${workOrderNextStepStatus}');
if (workOrderNextStepStatus == WorkOrderNextStepEnum.nTakeAction) {
print('i am here take action ..');
return footerContainer(
child: AppFilledButton(
label: context.translation.takeAction,

@ -4,7 +4,8 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/app_strings/app_asset.dart';
import 'package:test_sa/dashboard_latest/widgets/request_category_list.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/dashboard_latest/dashboard_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart';
@ -18,6 +19,7 @@ import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/new_views/common_widgets/single_item_drop_down_menu.dart';
import 'package:test_sa/providers/service_request_providers/reject_reason_provider.dart';
import 'package:test_sa/service_request_latest/request_detail_provider.dart';
import 'package:test_sa/service_request_latest/utilities/service_request_utils.dart';
import 'package:test_sa/service_request_latest/views/forms/maintenance_request/maintenance_request_main.dart';
import 'package:test_sa/service_request_latest/views/forms/spare_part/spare_part_request.dart';
import 'package:test_sa/views/widgets/date_and_time/date_picker.dart';
@ -43,23 +45,6 @@ class ServiceRequestBottomSheet {
static Future fixRemotelyBottomSheet({required BuildContext context}) {
TextEditingController _workingHoursController = TextEditingController();
int calculateWorkingHours(DateTime? startTime, DateTime? endTime) {
if (startTime != null && endTime != null) {
Duration difference = endTime.difference(startTime);
int hours = difference.inHours;
return hours;
} else {
return -1;
}
}
assignWorkingHours({required RequestDetailProvider requestDetailProvider}) {
int hours = calculateWorkingHours(requestDetailProvider.fixRemotelyHelperModel?.startDate, requestDetailProvider.fixRemotelyHelperModel?.endDate);
if (hours != -1) {
_workingHoursController.text = hours.toString();
requestDetailProvider.fixRemotelyHelperModel?.workingHour = hours;
}
}
return buildBottomSheetParent(
context: context,
@ -97,8 +82,17 @@ class ServiceRequestBottomSheet {
);
requestDetailProvider.fixRemotelyHelperModel?.startDate = selectedDateTime;
requestDetailProvider.fixRemotelyHelperModel?.endDate = null;
requestDetailProvider.updateFixRemotelyHelperModel(requestDetailProvider.fixRemotelyHelperModel);
assignWorkingHours(requestDetailProvider: requestDetailProvider);
_workingHoursController.clear();
ServiceRequestUtils.calculateAndAssignWorkingHours(
startTime: requestDetailProvider.fixRemotelyHelperModel?.startDate,
endTime: requestDetailProvider.fixRemotelyHelperModel?.endDate,
workingHoursController: _workingHoursController,
updateModel: (hours) {
requestDetailProvider.fixRemotelyHelperModel?.workingHour = hours;
},
);
// serviceRequestProvider.updateCurrentSelectedRequest(serviceRequestProvider.currentSelectedRequest);
}
});
@ -131,12 +125,16 @@ class ServiceRequestBottomSheet {
"End Date time must be greater then start date".showToast;
return;
}
requestDetailProvider.fixRemotelyHelperModel?.endDate = selectedDateTime;
requestDetailProvider.updateFixRemotelyHelperModel(requestDetailProvider.fixRemotelyHelperModel);
assignWorkingHours(requestDetailProvider: requestDetailProvider);
// serviceRequestProvider.updateCurrentSelectedRequest(serviceRequestProvider.currentSelectedRequest);
ServiceRequestUtils.calculateAndAssignWorkingHours(
startTime: requestDetailProvider.fixRemotelyHelperModel?.startDate,
endTime: requestDetailProvider.fixRemotelyHelperModel?.endDate,
workingHoursController: _workingHoursController,
updateModel: (hours) {
requestDetailProvider.fixRemotelyHelperModel?.workingHour = hours;
},
);
}
});
},
@ -203,6 +201,7 @@ class ServiceRequestBottomSheet {
onPressed: () async {
requestDetailProvider.fixRemotelyHelperModel?.workOrderId = requestDetailProvider.currentWorkOrder?.data?.requestId;
requestDetailProvider.engineerFixRemotely();
//TODO context issue to show message..
Navigator.pop(context);
// const SizedBox().flushBar(context: context, title: '', message: context.translation.youMarkedThisIssueAsFixedWaitingForTheRequesterToConfirm);
@ -606,6 +605,10 @@ class ServiceRequestBottomSheet {
onPressed: () {
Navigator.pop(context);
requestDetailProvider.engineerMarkAsFixed(workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!, feedback: feedback);
//TODO dashobard refresh..
// DashBoardProvider dashboardProvider = Provider.of<DashBoardProvider>(context,listen: false);
// UserProvider userProvider = Provider.of<UserProvider>(context,listen: false);
// dashboardProvider.refreshDashboard(userType:userProvider.user!.type!,context: context);
},
),
],
@ -728,7 +731,6 @@ class ServiceRequestBottomSheet {
if (signature == null || signature.isEmpty) return;
newSignature = signature;
nurseSignature = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}";
print('signature i got is ${newSignature}');
});
},
onSaved: (signature) {
@ -737,7 +739,6 @@ class ServiceRequestBottomSheet {
if (signature == null || signature.isEmpty) return;
newSignature = signature;
nurseSignature = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}";
print('signature i got is ${newSignature}');
});
},
),
@ -775,9 +776,7 @@ class ServiceRequestBottomSheet {
signatureNurse: nurseSignature,
);
requestDetailProvider.nurseConfirm();
if(requestDetailProvider.currentWorkOrder!.data!.requestId!=null){
requestDetailProvider.getWorkOrderById(id: requestDetailProvider.currentWorkOrder!.data!.requestId!);
}
Navigator.pop(context);
}else{
//show some toast...

@ -1,3 +1,5 @@
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/api_routes/urls.dart';
@ -30,7 +32,6 @@ class WorkOrderDetailView extends StatelessWidget {
Widget build(BuildContext context) {
UserProvider _userProvider = Provider.of<UserProvider>(context, listen: false);
return Consumer<RequestDetailProvider>(builder: (pContext, requestProvider, _) {
return requestProvider.isLoading
? const CircularProgressIndicator(color: AppColor.primary10).center
: requestProvider.currentWorkOrder == null
@ -67,7 +68,6 @@ class WorkOrderDetailView extends StatelessWidget {
}
Widget workOrderDetailCard(BuildContext context, WorkOrderData workOrder, UserProvider userProvider) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
@ -102,10 +102,11 @@ class WorkOrderDetailView extends StatelessWidget {
Column(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
if (userProvider.user!.type == UsersTypes.normal_user)
context.translation.code.toSvgAsset(width: 48).onPress(() {
// Navigator.push(context, MaterialPageRoute(builder: (context) => UpdateServiceRequestPage(serviceRequest: serviceRequest)));
}),
//TODO need to check
// if (userProvider.user!.type == UsersTypes.normal_user)
// context.translation.code.toSvgAsset(width: 48).onPress(() {
// // Navigator.push(context, MaterialPageRoute(builder: (context) => UpdateServiceRequestPage(serviceRequest: serviceRequest)));
// }),
if (userProvider.user!.type == UsersTypes.engineer) 16.height,
Text(
workOrder.requestedDate!.toString().toServiceRequestCardFormat,

@ -58,30 +58,23 @@ class _TimerWidgetState extends State<TimerWidget> {
}
Widget buildTimerWidget(RequestDetailProvider provider) {
return GestureDetector(
onTap: () {
if (provider.isTimerRunning) {
provider.stopTimer();
}
},
child: Container(
padding: EdgeInsets.all(8.toScreenHeight),
width: 80.toScreenWidth,
decoration: BoxDecoration(
color: AppColor.black10,
borderRadius: BorderRadius.circular(10),
),
child:
Column(
children: [
'drag_icon'.toSvgAsset(),
12.height,
provider.currentTime.toString().toDragAbleTimerFormat.tinyFont(context).custom(color: AppColor.white10, fontWeight: FontWeight.w600),
2.height,
context.translation.hours.tinyFont(context).custom(color: AppColor.white10, fontWeight: FontWeight.w600),
],
),
return Container(
padding: EdgeInsets.all(8.toScreenHeight),
width: 80.toScreenWidth,
decoration: BoxDecoration(
color: AppColor.black10,
borderRadius: BorderRadius.circular(10),
),
child:
Column(
children: [
'drag_icon'.toSvgAsset(),
12.height,
provider.currentTime.toString().toDragAbleTimerFormat.tinyFont(context).custom(color: AppColor.white10, fontWeight: FontWeight.w600),
2.height,
context.translation.hours.tinyFont(context).custom(color: AppColor.white10, fontWeight: FontWeight.w600),
],
),
);
}
}

@ -1,30 +1,21 @@
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';
import 'package:test_sa/extensions/context_extension.dart';
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/new_models/arrival_verification_type_model.dart';
import 'package:test_sa/models/service_request/service_request.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/app_lazy_loading.dart';
import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
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/loaders/no_data_found.dart';
import 'package:test_sa/views/widgets/qr/scan_qr.dart';
import 'activities_list_view.dart';
class VerifyArrivalView extends StatefulWidget {
const VerifyArrivalView({Key? key}) : super(key: key);
@ -33,12 +24,8 @@ class VerifyArrivalView extends StatefulWidget {
}
class _VerifyArrivalViewState extends State<VerifyArrivalView> {
ArrivalVerificationTypeModel? arrivalVerificationTypeModel;
@override
void initState() {
//TODO call this when all data is confirmed
// getInitialData();
WidgetsBinding.instance.addPostFrameCallback((_) {
getInitialData();
});
@ -47,46 +34,40 @@ class _VerifyArrivalViewState extends State<VerifyArrivalView> {
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}');
await requestDetailProvider.getArrivalVerificationType();
}
@override
Widget build(BuildContext context) {
//TODO replace the list with Api...
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),
//backgroundColor: const Color(0xfff8f9fb),
body: Consumer<RequestDetailProvider>(builder: (context, RequestDetailProvider requestDetailProvider, child) {
return SafeArea(
child: ListView.builder(
padding: EdgeInsets.zero,
itemCount: items.length,
itemBuilder: (context, index) {
final item = items[index];
return customListItem(
icon: item['icon']!,
heading: item['heading']!,
subHeading: item['subHeading']!,
context: context,
onTap: () {
onItemTap(requestDetailProvider: requestDetailProvider, index: index, context: context);
});
},
).paddingOnly(start: 16, end: 16, top: 12, bottom: 12),
child: requestDetailProvider.isArrivalLoading
? const CircularProgressIndicator(color: AppColor.primary10).center
: requestDetailProvider.arrivalTypeList!.isEmpty
? const NoDataFound().center
: ListView.builder(
padding: EdgeInsets.zero,
itemCount: requestDetailProvider.arrivalTypeList!.length,
itemBuilder: (builderContext, index) {
final item = requestDetailProvider.arrivalTypeList?[index];
return customListItem(
icon: item?.verificationTypes!.icon ?? '',
heading: item?.verificationTypes!.name ?? '',
subHeading: item?.description ?? '',
onTap: () {
onItemTap(requestDetailProvider: requestDetailProvider, index: index, context: context);
});
},
).paddingOnly(start: 16, end: 16, top: 12, bottom: 12),
);
}),
);
}
Widget customListItem({
required BuildContext context,
required String icon,
required String heading,
required String subHeading,
@ -143,21 +124,20 @@ class _VerifyArrivalViewState extends State<VerifyArrivalView> {
if (result != null) {
try {
//TODO show loader.
// showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
status = await requestDetailProvider.engineerConfirmArrival(
workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!, verificationTypeId: 1, photoInfo: '', otp: '', assetNo: result);
if (status == 200) {
requestDetailProvider.getWorkOrderById(id: requestDetailProvider.currentWorkOrder!.data!.requestId!);
//Navigator.pop(context);
Navigator.pop(context);
requestDetailProvider.startTimer();
Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) => RequestDetailMain(requestId: requestDetailProvider.currentWorkOrder!.data!.requestId!)));
Navigator.pop(context);
} else {
// Navigator.pop(context);
Navigator.pop(context);
//show some message.
}
} catch (e) {
// Navigator.pop(context);
Navigator.pop(context);
print('error i got is $e');
}
}
@ -166,15 +146,11 @@ class _VerifyArrivalViewState extends State<VerifyArrivalView> {
Fluttertoast.showToast(msg: 'Under process...' ?? "", toastLength: Toast.LENGTH_LONG);
break;
case 2:
//TODO add loader.
// showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
requestDetailProvider.sendOtp(workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!);
//Navigator.pop(context);
Navigator.pushReplacement(
context,
MaterialPageRoute(builder: (context) => const VerifyOtpView()),
);
requestDetailProvider.sendOtp(workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!);
Navigator.pushReplacement(
context,
MaterialPageRoute(builder: (context) => const VerifyOtpView()),
);
break;
case 3:
File? pickedFile = await onFilePicker();
@ -183,88 +159,26 @@ class _VerifyArrivalViewState extends State<VerifyArrivalView> {
int? status;
try {
//TODO add loader
// showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
status = await requestDetailProvider.engineerConfirmArrival(workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!, verificationTypeId: 4, photoInfo: fileObj, otp: '');
if (status == 200) {
Navigator.pop(context);
requestDetailProvider.getWorkOrderById(id: requestDetailProvider.currentWorkOrder!.data!.requestId!);
// Navigator.pop(context);
Navigator.pop(context);
requestDetailProvider.startTimer();
Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) => RequestDetailMain(requestId: requestDetailProvider.currentWorkOrder!.data!.requestId!)));
} else {
//show some message.
// Navigator.pop(context);
Navigator.pop(context);
}
} catch (e) {
print('error i got is $e');
// Navigator.pop(context);
Navigator.pop(context);
}
}
// Navigator.push(
// context,
// MaterialPageRoute(builder: (context) => const VerifyAssetDetails()),
// );
//push to specific screen...
// Navigator.push(
// context,
// MaterialPageRoute(builder: (context) => const ScanQrView()),
// );
break;
}
// 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: ImageSource.camera, imageQuality: 70, maxWidth: 800, maxHeight: 800);

@ -6,9 +6,9 @@ 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/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/app_lazy_loading.dart';
import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
import 'package:test_sa/service_request_latest/request_detail_provider.dart';
import 'package:test_sa/service_request_latest/views/request_detail_main_view.dart';
class VerifyOtpView extends StatelessWidget {
const VerifyOtpView({Key? key}) : super(key: key);
@ -54,16 +54,18 @@ class VerifyOtpView extends StatelessWidget {
RequestDetailProvider requestDetailProvider = Provider.of<RequestDetailProvider>(context, listen: false);
int? status;
//TODO add loader..
// showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
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, assetNo: '');
// Navigator.pop(context);
Navigator.pop(context);
requestDetailProvider.startTimer();
Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) => RequestDetailMain(requestId: requestDetailProvider.currentWorkOrder!.data!.requestId!)));
Navigator.pop(context);
}
else{
Navigator.pop(context);
}
},
),

@ -129,7 +129,6 @@ class _AssetRetiredState extends State<AssetRetired> with TickerProviderStateMix
requestDetailProvider.assetRetiredHelperModel?.activityAssetToBeRetiredAttachments
?.add(ActivityAssetToBeRetiredAttachments(id: 0, name: "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}"));
}
print('data i got is ${requestDetailProvider.assetRetiredHelperModel?.toJson()}');
int status= await requestDetailProvider.createActivityAssetToBeRetired();
if(status==200){
Navigator.pop(context);

@ -27,6 +27,7 @@ import 'package:test_sa/views/widgets/equipment/pick_asset.dart';
import '../../../../../../models/lookup.dart';
import '../../../../../../new_views/common_widgets/default_app_bar.dart';
import '../../../../controllers/providers/api/devices_provider.dart';
//TODO Have some details need to confirm from backend failure reason, fault description, solutions...
class VerifyAssetDetails extends StatefulWidget {
@ -55,6 +56,7 @@ class _VerifyAssetDetailsState extends State<VerifyAssetDetails> with TickerProv
super.initState();
}
Future<void> getFaultDescription() async {
Provider.of<FaultDescriptionProvider>(context, listen: false).getFaultDescriptionList(assetId: _requestDetailProvider?.currentWorkOrder?.data?.asset?.id).then((List<FaultDescription>? data) {
if (data?.isNotEmpty ?? false) {
@ -63,6 +65,17 @@ class _VerifyAssetDetailsState extends State<VerifyAssetDetails> with TickerProv
}
});
}
Future<void> getLoanAsset() async {
WorkOrderData currentWorkOrderData = _requestDetailProvider!.currentWorkOrder!.data!;
if (currentWorkOrderData.assetLoan != null) {
loanAvailabilityAsset = Asset(
id: currentWorkOrderData.assetLoan?.id,
assetNumber: currentWorkOrderData.assetLoan?.assetNumber,
);
Provider.of<AssetProvider>(context,listen: false).getAssets();
print('devices i got is ${Provider.of<AssetProvider>(context,listen: false).devices.length }');
}
}
@override
Widget build(BuildContext context) {
@ -75,26 +88,32 @@ class _VerifyAssetDetailsState extends State<VerifyAssetDetails> with TickerProv
_faultDescriptionProvider = Provider.of<ServiceRequestFaultDescriptionProvider>(context, listen: false);
_equipmentStatusProvider = Provider.of<EquipmentStatusProvider>(context, listen: false);
_equipmentStatusProvider!.reset();
_equipmentStatusProvider!.getDate();
WidgetsBinding.instance.addPostFrameCallback((_) {
_equipmentStatusProvider!.getDate();
});
_reasonProvider?.serviceRequestId = _requestDetailProvider?.currentWorkOrder!.data!.requestId.toString();
WorkOrderData currentWorkOrderData = _requestDetailProvider!.currentWorkOrder!.data!;
print('asset detail i got is ${currentWorkOrderData.asset?.toJson()}');
_requestDetailProvider?.engineerUpdateWorkOrderHelperModel = EngineerUpdateWorkOrderHelperModel(
workOrderId: currentWorkOrderData.requestId,
equipmentStatus: currentWorkOrderData.equipmentStatus,
loanAvailability: currentWorkOrderData.loanAvailablity,
failureReason: currentWorkOrderData.failureReasone,
// faultDescription: currentWorkOrderData.fa,
loanAssetId:currentWorkOrderData.assetLoan?.id,
// faultDescription: currentWorkOrderData.fa,
solution: currentWorkOrderData.solution?.name,
returnToService: currentWorkOrderData.returnToService,
serviceType: currentWorkOrderData.serviceType,
);
// _requestDetailProvider?.updateEngineerUpdateWorkOrderHelperModel(_requestDetailProvider?.engineerUpdateWorkOrderHelperModel);
getFaultDescription();
}
return Scaffold(
key: _scaffoldKey,
appBar: DefaultAppBar(title: context.translation.verify_asset_details),
appBar: DefaultAppBar(title: context.translation.updateAssetDetails),
body: Consumer<RequestDetailProvider>(builder: (context, RequestDetailProvider requestDetailProvider, child) {
return Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
@ -163,6 +182,7 @@ class _VerifyAssetDetailsState extends State<VerifyAssetDetails> with TickerProv
cardColor: AppColor.neutral100,
onPickAsset: (asset) {
requestDetailProvider.engineerUpdateWorkOrderHelperModel?.loanAssetId = asset.id;
print('asset id i got is ${requestDetailProvider.engineerUpdateWorkOrderHelperModel?.loanAssetId}');
//setState(() {
loanAvailabilityAsset = asset;
// });
@ -210,11 +230,11 @@ class _VerifyAssetDetailsState extends State<VerifyAssetDetails> with TickerProv
padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 16.toScreenHeight),
color: AppColor.white10,
child: AppFilledButton(
label: context.translation.verify_asset_details,
label: context.translation.updateAssetDetails,
buttonColor: AppColor.primary10,
onPressed: () async {
//TODO add loader..
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
await requestDetailProvider.engineerUpdateWorkOrder();
Navigator.pop(context);
Navigator.pop(context);

@ -1,33 +1,20 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/parts_provider.dart';
import 'package:test_sa/controllers/providers/api/service_requests_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/device/asset.dart';
import 'package:test_sa/models/service_request/service_report.dart';
import 'package:test_sa/models/service_request/service_request.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/providers/loading_list_notifier.dart';
import 'package:test_sa/providers/work_order/reason_provider.dart';
import 'package:test_sa/providers/work_order/vendor_provider.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/utilities/service_request_utils.dart';
import 'package:test_sa/views/pages/user/requests/add_supplier_engineer_bottom_sheet.dart';
import 'package:test_sa/views/widgets/date_and_time/date_picker.dart';
import 'package:test_sa/views/widgets/date_and_time/time_picker.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
import '../../../../../controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart';
import '../../../../../controllers/providers/api/status_drop_down/report/service_types_provider.dart';
import '../../../../../models/lookup.dart';
import '../../../../../new_views/common_widgets/app_text_form_field.dart';
import '../../../../../new_views/common_widgets/single_item_drop_down_menu.dart';
@ -97,18 +84,9 @@ class _ExternalMaintenanceRequestState extends State<ExternalMaintenanceRequest>
? 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(() {});
}
},
@ -168,8 +146,18 @@ class _ExternalMaintenanceRequestState extends State<ExternalMaintenanceRequest>
selectedTime.minute,
);
requestDetailProvider.activityMaintenanceHelperModel?.supplierStartTime = selectedDateTime;
requestDetailProvider.activityMaintenanceHelperModel?.supplierEndTime = null;
requestDetailProvider.updateActivityMaintenanceHelperModel(requestDetailProvider.activityMaintenanceHelperModel);
assignWorkingHours(requestDetailProvider: requestDetailProvider);
_workingHoursController.clear();
ServiceRequestUtils.calculateAndAssignWorkingHours(
startTime: requestDetailProvider.activityMaintenanceHelperModel!.supplierStartTime,
endTime: requestDetailProvider.activityMaintenanceHelperModel!.supplierStartTime,
workingHoursController: _workingHoursController,
updateModel: (hours) {
requestDetailProvider.activityMaintenanceHelperModel?.supplierWorkingHour = hours;
},
);
// assignWorkingHours(requestDetailProvider: requestDetailProvider);
}
});
},
@ -202,7 +190,14 @@ class _ExternalMaintenanceRequestState extends State<ExternalMaintenanceRequest>
}
requestDetailProvider.activityMaintenanceHelperModel?.supplierEndTime = selectedDateTime;
requestDetailProvider.updateActivityMaintenanceHelperModel(requestDetailProvider.activityMaintenanceHelperModel);
assignWorkingHours(requestDetailProvider: requestDetailProvider);
ServiceRequestUtils.calculateAndAssignWorkingHours(
startTime: requestDetailProvider.activityMaintenanceHelperModel!.supplierStartTime,
endTime: requestDetailProvider.activityMaintenanceHelperModel!.supplierStartTime,
workingHoursController: _workingHoursController,
updateModel: (hours) {
requestDetailProvider.activityMaintenanceHelperModel?.supplierWorkingHour = hours;
},
);
}
});
},

@ -13,6 +13,7 @@ import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/providers/service_request_providers/last_situation_provider.dart';
import 'package:test_sa/providers/work_order/activity_status_provider.dart';
import 'package:test_sa/service_request_latest/request_detail_provider.dart';
import 'package:test_sa/service_request_latest/utilities/service_request_utils.dart';
import 'package:test_sa/service_request_latest/views/forms/maintenance_request/components/assistant_employee_card.dart';
import 'package:test_sa/views/widgets/date_and_time/date_picker.dart';
@ -140,8 +141,17 @@ class _InternalMaintenanceRequestState extends State<InternalMaintenanceRequest>
selectedTime.minute,
);
requestDetailProvider.activityMaintenanceHelperModel?.startTime = selectedDateTime;
requestDetailProvider.activityMaintenanceHelperModel?.endTime = null;
requestDetailProvider.updateActivityMaintenanceHelperModel(requestDetailProvider.activityMaintenanceHelperModel);
assignWorkingHours(requestDetailProvider: requestDetailProvider);
_workingHoursController.clear();
ServiceRequestUtils.calculateAndAssignWorkingHours(
startTime: requestDetailProvider.activityMaintenanceHelperModel!.startTime,
endTime: requestDetailProvider.activityMaintenanceHelperModel!.endTime,
workingHoursController: _workingHoursController,
updateModel: (hours) {
requestDetailProvider.activityMaintenanceHelperModel?.workingHour = hours;
},
);
}
});
},
@ -168,7 +178,14 @@ class _InternalMaintenanceRequestState extends State<InternalMaintenanceRequest>
}
requestDetailProvider.activityMaintenanceHelperModel?.endTime = selectedDateTime;
requestDetailProvider.updateActivityMaintenanceHelperModel(requestDetailProvider.activityMaintenanceHelperModel);
assignWorkingHours(requestDetailProvider: requestDetailProvider);
ServiceRequestUtils.calculateAndAssignWorkingHours(
startTime: requestDetailProvider.activityMaintenanceHelperModel!.startTime,
endTime: requestDetailProvider.activityMaintenanceHelperModel!.endTime,
workingHoursController: _workingHoursController,
updateModel: (hours) {
requestDetailProvider.activityMaintenanceHelperModel?.workingHour = hours;
},
);
}
});
},
@ -296,22 +313,4 @@ class _InternalMaintenanceRequestState extends State<InternalMaintenanceRequest>
});
}
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;
}
}
}

@ -56,7 +56,6 @@ class _SparePartRequestState extends State<SparePartRequest> with TickerProvider
super.initState();
_partsProvider = Provider.of<PartsProvider>(context, listen: false);
_requestDetailProvider = Provider.of<RequestDetailProvider>(context, listen: false);
_requestDetailProvider?.sparePartHelperModel = SparePartHelperModel(
id: _requestDetailProvider?.sparePartHelperModel?.id ?? 0,
workOrderId: _requestDetailProvider?.sparePartHelperModel?.workOrderId ?? _requestDetailProvider?.currentWorkOrder?.data?.requestId,

@ -28,6 +28,7 @@ class _RequestDetailMainState extends State<RequestDetailMain> {
@override
void initState() {
super.initState();
print("final id:${widget.requestId}");
WidgetsBinding.instance.addPostFrameCallback((_) {
_requestProvider = Provider.of<RequestDetailProvider>(context, listen: false);
_requestProvider.getWorkOrderById(id: widget.requestId);
@ -63,7 +64,6 @@ class _RequestDetailMainState extends State<RequestDetailMain> {
requestDetailProvider.stopTimer();
}
Navigator.pop(context);
}),
10.width,
Text(

@ -335,7 +335,6 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
showAsBottomSheet: true,
initialValue: engineer == null ? null : SuppPersons.fromJson(engineer!.toJson()),
onSelect: (suppPerson) {
print(suppPerson?.toJson());
if (suppPerson != null) {
engineer = SuppEngineerWorkOrders.fromJson(suppPerson.toJson());
// engineer = SuppEngineerWorkOrders(

@ -49,7 +49,6 @@ class _ServiceRequestDetailsPageState extends State<ServiceRequestDetailsPage> {
WidgetsFlutterBinding.ensureInitialized().addPostFrameCallback((timeStamp) async {
Provider.of<CommentsProvider>(context, listen: false).reset();
serviceRequest = await Provider.of<ServiceRequestsProvider>(context, listen: false).getServiceRequestObjectById(requestId: widget.serviceRequest.id!);
print('service request i got is ${serviceRequest?.id}');
loading = false;
setState(() {});
});

@ -209,6 +209,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.0.8"
date_picker_timeline:
dependency: "direct main"
description:
name: date_picker_timeline
sha256: c05e6540fa3055c9036e6f99e758972e14be0e1010d5a6e7a1261d4a6f3292df
url: "https://pub.dev"
source: hosted
version: "1.2.6"
dbus:
dependency: transitive
description:

@ -73,6 +73,7 @@ dependencies:
dotted_border: ^2.1.0
lottie: ^3.1.2
shimmer: ^3.0.0
date_picker_timeline: ^1.2.6
flutter_advanced_switch: ^3.0.1
table_calendar: ^3.0.8
image_cropper: ^8.0.2

Loading…
Cancel
Save