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]? didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool { ) -> Bool {
GeneratedPluginRegistrant.register(with: self) GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions) 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 loginTopBg = 'assets/images/login_top_bg.png';
static String askOtpIcon = 'ask_otp_icon'; static String askOtpIcon = 'ask_otp_icon';
static String askRequesterIcon = 'ask_requester_icon'; static String askRequesterIcon = 'ask_requester_icon';
@ -10,4 +10,4 @@ class AppAsset{
static String editIcon = 'assets/images/edit_icon.svg'; static String editIcon = 'assets/images/edit_icon.svg';
static String deleteIcon = 'assets/images/delete_icon.svg'; static String deleteIcon = 'assets/images/delete_icon.svg';
static String overDueIcon = 'assets/images/overdue.svg'; static String overDueIcon = 'assets/images/overdue.svg';
} }

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

@ -92,7 +92,6 @@ class PartsProvider extends ChangeNotifier {
} else { } else {
response = await ApiManager.instance.post(URLs.getPartNumber, body: {"partName": partName, "assetId": assetId}); 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 = []; List<SparePart> page = [];
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received // 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_count.dart';
import 'package:test_sa/models/new_models/dashboard_detail.dart' as DD; import 'package:test_sa/models/new_models/dashboard_detail.dart' as DD;
import '../controllers/providers/api/user_provider.dart';
class DashBoardProvider extends ChangeNotifier { class DashBoardProvider extends ChangeNotifier {
bool isAllCountLoading = false; bool isAllCountLoading = false;
bool isLoading = false; bool isLoading = false;
@ -160,7 +162,6 @@ class DashBoardProvider extends ChangeNotifier {
notifyListeners(); notifyListeners();
} }
print('i am called...${usersType}');
Response response; Response response;
String url = ''; String url = '';
@ -211,6 +212,13 @@ class DashBoardProvider extends ChangeNotifier {
_isDetailLoading = value; _isDetailLoading = value;
notifyListeners(); 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 { class CategoryTabs {
@ -227,9 +235,9 @@ class CategoryTabs {
tabs.add(CategoryTabs('Completed', 3)); tabs.add(CategoryTabs('Completed', 3));
return tabs; return tabs;
} }
tabs.add(CategoryTabs('UpComing Request', 3));
tabs.add(CategoryTabs('Open Request', 1)); tabs.add(CategoryTabs('Open Request', 1));
tabs.add(CategoryTabs('In Progress', 2)); tabs.add(CategoryTabs('In Progress', 2));
tabs.add(CategoryTabs('Acknowledged', 3));
tabs.add(CategoryTabs('Rejected', 6)); tabs.add(CategoryTabs('Rejected', 6));
return tabs; return tabs;
} }

@ -114,7 +114,6 @@ class _DashboardViewState extends State<DashboardView> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
bool isNurse = (Provider.of<UserProvider>(context, listen: false).user!.type) == UsersTypes.normal_user; 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( return Scaffold(
// backgroundColor: AppColor.background(context), // backgroundColor: AppColor.background(context),
appBar: PreferredSize( appBar: PreferredSize(

@ -1,3 +1,4 @@
import 'package:date_picker_timeline/date_picker_widget.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/user_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/extensions/widget_extensions.dart';
import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/enums/user_types.dart';
import 'package:test_sa/models/new_models/dashboard_detail.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/new_views/common_widgets/tab_button.dart';
import 'package:test_sa/views/widgets/loaders/no_data_found.dart'; import 'package:test_sa/views/widgets/loaders/no_data_found.dart';
@ -23,8 +25,30 @@ class RequestCategoryFragment extends StatelessWidget {
getTabs( getTabs(
requestsProvider: dashboardProvider, requestsProvider: dashboardProvider,
context: context, 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 dashboardProvider.isDetailLoading || dashboardProvider.requestDetailList == null
? Column( ? Column(
mainAxisSize: MainAxisSize.max, 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/common_widgets/custom_badge.dart';
import 'package:test_sa/new_views/pages/land_page/requests_list_page.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'; import 'package:test_sa/controllers/providers/api/all_requests_provider.dart';
class RequestsFragment extends StatelessWidget { class RequestsFragment extends StatelessWidget {
const RequestsFragment({Key? key}) : super(key: key); const RequestsFragment({Key? key}) : super(key: key);
@ -19,7 +20,7 @@ class RequestsFragment extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Consumer<DashBoardProvider>( return Consumer<DashBoardProvider>(
builder: (context, snapshot, _) => GridView( builder: (context, snapshot, _) => GridView(
padding: const EdgeInsets.only( left: 16, right: 16), padding: const EdgeInsets.only(left: 16, right: 16),
physics: const NeverScrollableScrollPhysics(), physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true, shrinkWrap: true,
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 4, childAspectRatio: 72 / 84, crossAxisSpacing: 2, mainAxisSpacing: 12), 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, 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?.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, listItem(ApiManager.instance.user?.type == UsersTypes.engineer ? snapshot.dashboardCount?.data?.countInprogress ?? 0 : snapshot.dashboardCount?.data?.countOpen ?? 0, "new_request",
context, snapshot.isAllCountLoading, 2, AppColor.primary10), 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)), 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'; import 'package:test_sa/models/enums/work_order_next_step.dart';
extension EnumExtensionsWorkOrder on WorkOrderNextStepEnum { extension EnumExtensionsWorkOrder on WorkOrderNextStepEnum {
@ -60,4 +61,18 @@ extension IntExtensionsWorkOrder on int {
return WorkOrderNextStepEnum.onlyView; 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 toScreenHeight => (this / 932) * SizeConfig.screenHeight!;
double get toScreenWidth => (this / 430) * SizeConfig.screenWidth!; double get toScreenWidth => (this / 430) * SizeConfig.screenWidth!;
} }

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

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

@ -1,5 +1,7 @@
import 'package:test_sa/extensions/enum_extensions.dart';
class ArrivalVerificationTypeModel { class ArrivalVerificationTypeModel {
List<Data>? data; List<ArrivalTypeData>? data;
String? message; String? message;
String? title; String? title;
String? innerMessage; String? innerMessage;
@ -16,9 +18,9 @@ class ArrivalVerificationTypeModel {
ArrivalVerificationTypeModel.fromJson(Map<String, dynamic> json) { ArrivalVerificationTypeModel.fromJson(Map<String, dynamic> json) {
if (json['data'] != null) { if (json['data'] != null) {
data = <Data>[]; data = <ArrivalTypeData>[];
json['data'].forEach((v) { json['data'].forEach((v) {
data!.add(Data.fromJson(v)); data!.add(ArrivalTypeData.fromJson(v));
}); });
} }
message = json['message']; message = json['message'];
@ -30,38 +32,57 @@ class ArrivalVerificationTypeModel {
} }
class Data { class ArrivalTypeData {
int? assetGroupId; int? assetGroupId;
int? verificationTypeId; int? verificationTypeId;
VerificationTypes? verificationTypes; VerificationTypes? verificationTypes;
int? id; int? id;
String? description;
String? createdBy; String? createdBy;
String? createdDate; String? createdDate;
dynamic modifiedBy; dynamic modifiedBy;
dynamic modifiedDate; dynamic modifiedDate;
Data( ArrivalTypeData(
{this.assetGroupId, {this.assetGroupId,
this.verificationTypeId, this.verificationTypeId,
this.verificationTypes, this.verificationTypes,
this.id, this.id,
this.description,
this.createdBy, this.createdBy,
this.createdDate, this.createdDate,
this.modifiedBy, this.modifiedBy,
this.modifiedDate}); this.modifiedDate});
Data.fromJson(Map<String, dynamic> json) { ArrivalTypeData.fromJson(Map<String, dynamic> json) {
assetGroupId = json['assetGroupId']; assetGroupId = json['assetGroupId'];
verificationTypeId = json['verificationTypeId']; verificationTypeId = json['verificationTypeId'];
verificationTypes = json['verificationTypes'] != null verificationTypes = json['verificationTypes'] != null
? VerificationTypes.fromJson(json['verificationTypes']) ? VerificationTypes.fromJson(json['verificationTypes'])
: null; : null;
id = json['id']; id = json['id'];
description = json['description'];
createdBy = json['createdBy']; createdBy = json['createdBy'];
createdDate = json['createdDate']; createdDate = json['createdDate'];
modifiedBy = json['modifiedBy']; modifiedBy = json['modifiedBy'];
modifiedDate = json['modifiedDate']; 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; int? id;
String? name; String? name;
int? value; 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) { VerificationTypes.fromJson(Map<String, dynamic> json) {
id = json['id']; id = json['id'];
name = json['name']; name = json['name'];
value = json['value']; 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? requestedThrough;
Lookup? typeofRequest; Lookup? typeofRequest;
Lookup? loanAvailablity; Lookup? loanAvailablity;
Lookup? assetLoan; AssetLoan? assetLoan;
Lookup? safety; Lookup? safety;
Lookup? problemDescription; Lookup? problemDescription;
String? comments; String? comments;
@ -157,7 +157,7 @@ class WorkOrderData {
requestedThrough: json["requestedThrough"] == null ? null : Lookup.fromJson(json["requestedThrough"]), requestedThrough: json["requestedThrough"] == null ? null : Lookup.fromJson(json["requestedThrough"]),
typeofRequest: json["typeofRequest"] == null ? null : Lookup.fromJson(json["typeofRequest"]), typeofRequest: json["typeofRequest"] == null ? null : Lookup.fromJson(json["typeofRequest"]),
loanAvailablity: json["loanAvailablity"] == null ? null : Lookup.fromJson(json["loanAvailablity"]), 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"]), safety: json["safety"] == null ? null : Lookup.fromJson(json["safety"]),
problemDescription: json["problemDescription"] == null ? null : Lookup.fromJson(json["problemDescription"]), problemDescription: json["problemDescription"] == null ? null : Lookup.fromJson(json["problemDescription"]),
comments: json["comments"], comments: json["comments"],
@ -332,6 +332,43 @@ class WorkOrderAssignedEmployee {
"languageId": languageId, "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 { class Activities {
int? id; int? id;
@ -621,7 +658,6 @@ class ActivityMaintenance {
this.assistantEmployees}); this.assistantEmployees});
ActivityMaintenance.fromJson(Map<String, dynamic> json) { ActivityMaintenance.fromJson(Map<String, dynamic> json) {
print('activity status i got is ${json['activityStatus']}');
id = json['id']; id = json['id'];
activityStatus = json['activityStatus'] != null ? ActivityStatus.fromJson(json['activityStatus']) : null; activityStatus = json['activityStatus'] != null ? ActivityStatus.fromJson(json['activityStatus']) : null;
startTime = json['startTime']; startTime = json['startTime'];

@ -53,16 +53,6 @@ class _SingleItemDropDownMenuState<T extends Base, X extends LoadingListNotifier
if (X != NullableLoadingProvider) { if (X != NullableLoadingProvider) {
provider = Provider.of<X>(widget.context); 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) { if (widget.initialValue != null) {
final result = (X == NullableLoadingProvider ? widget.staticData : provider?.items)?.where((element) => element.identifier == widget.initialValue?.identifier); 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 (result?.isNotEmpty ?? false) _selectedItem = result!.first as T?;

@ -1,5 +1,8 @@
//service request item page //service request item page
import 'package:flutter/material.dart'; 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/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/extensions/string_extensions.dart';
@ -69,8 +72,9 @@ class ServiceRequestItemView extends StatelessWidget {
], ],
), ),
], ],
).toShadowContainer(context, withShadow: showShadow).onPress(() { ).toShadowContainer(context, withShadow: showShadow).onPress(() async{
Navigator.of(context).push(MaterialPageRoute(builder: (_) => RequestDetailMain(requestId: requestData!.id!))); 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) { if (requestDetails != null) {

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

@ -29,6 +29,7 @@ class RequestDetailProvider extends ChangeNotifier {
void startTimer() { void startTimer() {
if (isTimerRunning) return; if (isTimerRunning) return;
resetTimer();
timer = Timer.periodic(const Duration(seconds: 1), (Timer t) { timer = Timer.periodic(const Duration(seconds: 1), (Timer t) {
timerStartTime = timerStartTime.add(const Duration(seconds: 1)); timerStartTime = timerStartTime.add(const Duration(seconds: 1));
notifyListeners(); // Notify UI when time is updated notifyListeners(); // Notify UI when time is updated
@ -38,10 +39,7 @@ class RequestDetailProvider extends ChangeNotifier {
} }
void stopTimer() { void stopTimer() {
Timer.periodic(const Duration(seconds: 1), (Timer t) { resetTimer();
timerStartTime = timerStartTime.add(const Duration(seconds: 1));
notifyListeners(); // Notify UI when time is updated
});
timer?.cancel(); timer?.cancel();
isTimerRunning = false; isTimerRunning = false;
engineerStopTimer(); engineerStopTimer();
@ -57,6 +55,15 @@ class RequestDetailProvider extends ChangeNotifier {
DateTime get currentTime => timerStartTime; DateTime get currentTime => timerStartTime;
bool _isLoading = false; bool _isLoading = false;
bool _isArrivalLoading = false;
bool get isArrivalLoading => _isArrivalLoading;
set isArrivalLoading(bool value) {
_isArrivalLoading = value;
notifyListeners();
}
bool get isLoading => _isLoading; bool get isLoading => _isLoading;
@ -76,7 +83,7 @@ class RequestDetailProvider extends ChangeNotifier {
EngineerRejectHelperModel? engineerRejectHelperModel = EngineerRejectHelperModel(); EngineerRejectHelperModel? engineerRejectHelperModel = EngineerRejectHelperModel();
EngineerUpdateWorkOrderHelperModel? engineerUpdateWorkOrderHelperModel = EngineerUpdateWorkOrderHelperModel(); EngineerUpdateWorkOrderHelperModel? engineerUpdateWorkOrderHelperModel = EngineerUpdateWorkOrderHelperModel();
WorkOrderHelperModel? workOrderHelperModel; WorkOrderHelperModel? workOrderHelperModel;
List<ArrivalTypeData> ?arrivalTypeList =[];
void updateAssetRetiredHelperModel(AssetRetiredHelperModel? value) { void updateAssetRetiredHelperModel(AssetRetiredHelperModel? value) {
assetRetiredHelperModel = value; assetRetiredHelperModel = value;
notifyListeners(); notifyListeners();
@ -159,7 +166,6 @@ class RequestDetailProvider extends ChangeNotifier {
body: workOrderHelperModel!.toJson(), body: workOrderHelperModel!.toJson(),
); );
stateCode = response.statusCode; stateCode = response.statusCode;
print('response of create request is ${response.body}');
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
// request.engineerName = employee.name; // request.engineerName = employee.name;
} }
@ -222,7 +228,6 @@ class RequestDetailProvider extends ChangeNotifier {
isLoading = true; isLoading = true;
notifyListeners(); notifyListeners();
response = await ApiManager.instance.post(URLs.engineerStopTimer, body: body); response = await ApiManager.instance.post(URLs.engineerStopTimer, body: body);
print('response of stop timer is ${response.body}');
stateCode = response.statusCode; stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
@ -312,8 +317,6 @@ class RequestDetailProvider extends ChangeNotifier {
notifyListeners(); notifyListeners();
response = await ApiManager.instance.post(URLs.engineerUpdateNeedVisitUrl, body: needVisitHelperModel!.toJson()); response = await ApiManager.instance.post(URLs.engineerUpdateNeedVisitUrl, body: needVisitHelperModel!.toJson());
stateCode = response.statusCode; stateCode = response.statusCode;
print('body i got is ${needVisitHelperModel?.toJson()}');
print('response i got is ${response.body}');
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body)); currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body));
} }
@ -338,7 +341,6 @@ class RequestDetailProvider extends ChangeNotifier {
response = await ApiManager.instance.post(URLs.engineerMarkAsFixUrl, body: body); response = await ApiManager.instance.post(URLs.engineerMarkAsFixUrl, body: body);
stateCode = response.statusCode; stateCode = response.statusCode;
print('engineer mark as fixed response is ${response.body}');
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body)); currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body));
} }
@ -385,7 +387,7 @@ class RequestDetailProvider extends ChangeNotifier {
response = await ApiManager.instance.post(URLs.engineerConfirmArriveUrl, body: body); response = await ApiManager.instance.post(URLs.engineerConfirmArriveUrl, body: body);
stateCode = response.statusCode; stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
// print('response of Engineer confirm arrival ${response.body}'); currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body));
} }
isLoading = false; isLoading = false;
notifyListeners(); notifyListeners();
@ -453,7 +455,7 @@ class RequestDetailProvider extends ChangeNotifier {
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
commonResponseModel = CommonResponseModel.fromJson(json.decode(response.body)); // commonResponseModel = CommonResponseModel.fromJson(json.decode(response.body));
} }
isLoading = false; isLoading = false;
notifyListeners(); notifyListeners();
@ -476,7 +478,7 @@ class RequestDetailProvider extends ChangeNotifier {
stateCode = response.statusCode; stateCode = response.statusCode;
CommonResponseModel commonResponseModel = CommonResponseModel(); CommonResponseModel commonResponseModel = CommonResponseModel();
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
commonResponseModel = CommonResponseModel.fromJson(json.decode(response.body)); // commonResponseModel = CommonResponseModel.fromJson(json.decode(response.body));
} }
isLoading = false; isLoading = false;
notifyListeners(); notifyListeners();
@ -495,7 +497,6 @@ class RequestDetailProvider extends ChangeNotifier {
try { try {
final response = await ApiManager.instance.post(URLs.updateActivitySparePartUrl, body: sparePartHelperModel!.toJson()); final response = await ApiManager.instance.post(URLs.updateActivitySparePartUrl, body: sparePartHelperModel!.toJson());
stateCode = response.statusCode; stateCode = response.statusCode;
print('update response i got is ${response.body}');
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
// request.engineerName = employee.name; // request.engineerName = employee.name;
} }
@ -533,7 +534,6 @@ class RequestDetailProvider extends ChangeNotifier {
try { try {
Response response = await ApiManager.instance.get("${URLs.getSuppliersAutoComplete}?searchText=$supplierName"); Response response = await ApiManager.instance.get("${URLs.getSuppliersAutoComplete}?searchText=$supplierName");
stateCode = response.statusCode; stateCode = response.statusCode;
print('response i got is ${json.decode(response.body)["data"]}');
List<SuppPersons> persons = []; List<SuppPersons> persons = [];
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
List categoriesListJson = json.decode(response.body)["data"][0]['suppPersons']; List categoriesListJson = json.decode(response.body)["data"][0]['suppPersons'];
@ -555,7 +555,6 @@ class RequestDetailProvider extends ChangeNotifier {
try { try {
final response = await ApiManager.instance.post(URLs.deleteActivitySparePartUrl, body: body); final response = await ApiManager.instance.post(URLs.deleteActivitySparePartUrl, body: body);
stateCode = response.statusCode; stateCode = response.statusCode;
print('response of delete activity spare part is ${response.statusCode}');
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
//map to the model... //map to the model...
@ -604,7 +603,6 @@ class RequestDetailProvider extends ChangeNotifier {
body: sparePartHelperModel!.toJson(), body: sparePartHelperModel!.toJson(),
); );
stateCode = response.statusCode; stateCode = response.statusCode;
print('add sparepart activity response i got is ${response.body}');
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
// currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body)); // currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body));
// // updateCurrentWorkOrder(currentWorkOrder); // // updateCurrentWorkOrder(currentWorkOrder);
@ -629,7 +627,6 @@ class RequestDetailProvider extends ChangeNotifier {
body: activityMaintenanceHelperModel!.toJson(), body: activityMaintenanceHelperModel!.toJson(),
); );
stateCode = response.statusCode; stateCode = response.statusCode;
print('add maintenance activity response i got is ${response.body}');
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
// currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body)); // currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body));
// updateCurrentWorkOrder(currentWorkOrder); // updateCurrentWorkOrder(currentWorkOrder);
@ -668,24 +665,25 @@ class RequestDetailProvider extends ChangeNotifier {
} }
//get Arrival type...... //get Arrival type......
Future<ArrivalVerificationTypeModel> getArrivalVerificationType() async { Future<int> getArrivalVerificationType() async {
ArrivalVerificationTypeModel arrivalVerificationTypeModel = ArrivalVerificationTypeModel();
try { try {
isLoading = true; isArrivalLoading = true;
notifyListeners(); notifyListeners();
final response = await ApiManager.instance.get(URLs.getArrivalVerificationTypeUrl); final response = await ApiManager.instance.get(URLs.getArrivalVerificationTypeUrl);
stateCode = response.statusCode; stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) { 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(); notifyListeners();
return arrivalVerificationTypeModel; return response.statusCode;
} catch (e) { } catch (e) {
log("getArrivalVerifaction [error] : $e"); log("getArrivalVerifaction [error] : $e");
isLoading = false; isArrivalLoading = false;
notifyListeners(); notifyListeners();
return arrivalVerificationTypeModel; return -1;
} }
} }
@ -697,10 +695,7 @@ class RequestDetailProvider extends ChangeNotifier {
final response = await ApiManager.instance.postWithOutBody( final response = await ApiManager.instance.postWithOutBody(
URLs.sendOtpUrl + "$workOrderId", URLs.sendOtpUrl + "$workOrderId",
); );
print('url for send otp is ${URLs.sendOtpUrl + "$workOrderId"}');
stateCode = response.statusCode; stateCode = response.statusCode;
print('response i got is ${response.body}');
if (response.statusCode >= 200 && response.statusCode < 300) {} if (response.statusCode >= 200 && response.statusCode < 300) {}
isLoading = false; isLoading = false;
notifyListeners(); 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:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/user_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/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
@ -45,7 +46,6 @@ class FooterActionButton {
break; break;
// TODO: Handle this case. // TODO: Handle this case.
case WorkOrderNextStepEnum.nTakeAction: case WorkOrderNextStepEnum.nTakeAction:
print('i am here take action ..');
// const SizedBox().flushBar(context: context, title: context.translation.youMarkedThisIssueAsFixedWaitingForTheRequesterToConfirm, message: ''); // const SizedBox().flushBar(context: context, title: context.translation.youMarkedThisIssueAsFixedWaitingForTheRequesterToConfirm, message: '');
return footerContainer( return footerContainer(
child: AppFilledButton( child: AppFilledButton(
@ -134,7 +134,7 @@ class FooterActionButton {
case WorkOrderNextStepEnum.verifyAssetDetail: case WorkOrderNextStepEnum.verifyAssetDetail:
return footerContainer( return footerContainer(
child: AppFilledButton( child: AppFilledButton(
label: context.translation.verify_asset_details, label: context.translation.updateAssetDetails,
// maxWidth: true, // maxWidth: true,
buttonColor: AppColor.primary10, buttonColor: AppColor.primary10,
onPressed: () async { onPressed: () async {
@ -162,6 +162,7 @@ class FooterActionButton {
buttonColor: AppColor.green70, buttonColor: AppColor.green70,
onPressed: () async { onPressed: () async {
ServiceRequestBottomSheet.feedBackBottomSheet(context: context); ServiceRequestBottomSheet.feedBackBottomSheet(context: context);
}, },
), ),
] ]
@ -181,10 +182,7 @@ class FooterActionButton {
} }
} }
else { else {
print('value is ${workOrderNextStepStatus}');
if (workOrderNextStepStatus == WorkOrderNextStepEnum.nTakeAction) { if (workOrderNextStepStatus == WorkOrderNextStepEnum.nTakeAction) {
print('i am here take action ..');
return footerContainer( return footerContainer(
child: AppFilledButton( child: AppFilledButton(
label: context.translation.takeAction, label: context.translation.takeAction,

@ -4,7 +4,8 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/app_strings/app_asset.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/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_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/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/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/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/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/service_request_latest/views/forms/spare_part/spare_part_request.dart';
import 'package:test_sa/views/widgets/date_and_time/date_picker.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}) { static Future fixRemotelyBottomSheet({required BuildContext context}) {
TextEditingController _workingHoursController = TextEditingController(); 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( return buildBottomSheetParent(
context: context, context: context,
@ -97,8 +82,17 @@ class ServiceRequestBottomSheet {
); );
requestDetailProvider.fixRemotelyHelperModel?.startDate = selectedDateTime; requestDetailProvider.fixRemotelyHelperModel?.startDate = selectedDateTime;
requestDetailProvider.fixRemotelyHelperModel?.endDate = null;
requestDetailProvider.updateFixRemotelyHelperModel(requestDetailProvider.fixRemotelyHelperModel); 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); // serviceRequestProvider.updateCurrentSelectedRequest(serviceRequestProvider.currentSelectedRequest);
} }
}); });
@ -131,12 +125,16 @@ class ServiceRequestBottomSheet {
"End Date time must be greater then start date".showToast; "End Date time must be greater then start date".showToast;
return; return;
} }
requestDetailProvider.fixRemotelyHelperModel?.endDate = selectedDateTime; requestDetailProvider.fixRemotelyHelperModel?.endDate = selectedDateTime;
requestDetailProvider.updateFixRemotelyHelperModel(requestDetailProvider.fixRemotelyHelperModel); requestDetailProvider.updateFixRemotelyHelperModel(requestDetailProvider.fixRemotelyHelperModel);
assignWorkingHours(requestDetailProvider: requestDetailProvider); ServiceRequestUtils.calculateAndAssignWorkingHours(
startTime: requestDetailProvider.fixRemotelyHelperModel?.startDate,
// serviceRequestProvider.updateCurrentSelectedRequest(serviceRequestProvider.currentSelectedRequest); endTime: requestDetailProvider.fixRemotelyHelperModel?.endDate,
workingHoursController: _workingHoursController,
updateModel: (hours) {
requestDetailProvider.fixRemotelyHelperModel?.workingHour = hours;
},
);
} }
}); });
}, },
@ -203,6 +201,7 @@ class ServiceRequestBottomSheet {
onPressed: () async { onPressed: () async {
requestDetailProvider.fixRemotelyHelperModel?.workOrderId = requestDetailProvider.currentWorkOrder?.data?.requestId; requestDetailProvider.fixRemotelyHelperModel?.workOrderId = requestDetailProvider.currentWorkOrder?.data?.requestId;
requestDetailProvider.engineerFixRemotely(); requestDetailProvider.engineerFixRemotely();
//TODO context issue to show message.. //TODO context issue to show message..
Navigator.pop(context); Navigator.pop(context);
// const SizedBox().flushBar(context: context, title: '', message: context.translation.youMarkedThisIssueAsFixedWaitingForTheRequesterToConfirm); // const SizedBox().flushBar(context: context, title: '', message: context.translation.youMarkedThisIssueAsFixedWaitingForTheRequesterToConfirm);
@ -606,6 +605,10 @@ class ServiceRequestBottomSheet {
onPressed: () { onPressed: () {
Navigator.pop(context); Navigator.pop(context);
requestDetailProvider.engineerMarkAsFixed(workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!, feedback: feedback); 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; if (signature == null || signature.isEmpty) return;
newSignature = signature; newSignature = signature;
nurseSignature = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; nurseSignature = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}";
print('signature i got is ${newSignature}');
}); });
}, },
onSaved: (signature) { onSaved: (signature) {
@ -737,7 +739,6 @@ class ServiceRequestBottomSheet {
if (signature == null || signature.isEmpty) return; if (signature == null || signature.isEmpty) return;
newSignature = signature; newSignature = signature;
nurseSignature = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; nurseSignature = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}";
print('signature i got is ${newSignature}');
}); });
}, },
), ),
@ -775,9 +776,7 @@ class ServiceRequestBottomSheet {
signatureNurse: nurseSignature, signatureNurse: nurseSignature,
); );
requestDetailProvider.nurseConfirm(); requestDetailProvider.nurseConfirm();
if(requestDetailProvider.currentWorkOrder!.data!.requestId!=null){
requestDetailProvider.getWorkOrderById(id: requestDetailProvider.currentWorkOrder!.data!.requestId!); requestDetailProvider.getWorkOrderById(id: requestDetailProvider.currentWorkOrder!.data!.requestId!);
}
Navigator.pop(context); Navigator.pop(context);
}else{ }else{
//show some toast... //show some toast...

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

@ -58,30 +58,23 @@ class _TimerWidgetState extends State<TimerWidget> {
} }
Widget buildTimerWidget(RequestDetailProvider provider) { Widget buildTimerWidget(RequestDetailProvider provider) {
return GestureDetector( return Container(
onTap: () { padding: EdgeInsets.all(8.toScreenHeight),
if (provider.isTimerRunning) { width: 80.toScreenWidth,
provider.stopTimer(); decoration: BoxDecoration(
} color: AppColor.black10,
}, borderRadius: BorderRadius.circular(10),
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),
],
),
), ),
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:convert';
import 'dart:io'; import 'dart:io';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:fluttertoast/fluttertoast.dart'; import 'package:fluttertoast/fluttertoast.dart';
import 'package:image_picker/image_picker.dart'; import 'package:image_picker/image_picker.dart';
import 'package:provider/provider.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/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_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/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/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/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/components/verify_otp_view.dart';
import 'package:test_sa/service_request_latest/views/forms/asset_retired/asset_retired.dart'; import 'package:test_sa/views/widgets/loaders/no_data_found.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 'package:test_sa/views/widgets/qr/scan_qr.dart';
import 'activities_list_view.dart';
class VerifyArrivalView extends StatefulWidget { class VerifyArrivalView extends StatefulWidget {
const VerifyArrivalView({Key? key}) : super(key: key); const VerifyArrivalView({Key? key}) : super(key: key);
@ -33,12 +24,8 @@ class VerifyArrivalView extends StatefulWidget {
} }
class _VerifyArrivalViewState extends State<VerifyArrivalView> { class _VerifyArrivalViewState extends State<VerifyArrivalView> {
ArrivalVerificationTypeModel? arrivalVerificationTypeModel;
@override @override
void initState() { void initState() {
//TODO call this when all data is confirmed
// getInitialData();
WidgetsBinding.instance.addPostFrameCallback((_) { WidgetsBinding.instance.addPostFrameCallback((_) {
getInitialData(); getInitialData();
}); });
@ -47,46 +34,40 @@ class _VerifyArrivalViewState extends State<VerifyArrivalView> {
Future<void> getInitialData() async { Future<void> getInitialData() async {
RequestDetailProvider requestDetailProvider = Provider.of<RequestDetailProvider>(context, listen: false); RequestDetailProvider requestDetailProvider = Provider.of<RequestDetailProvider>(context, listen: false);
arrivalVerificationTypeModel = await requestDetailProvider.getArrivalVerificationType(); await requestDetailProvider.getArrivalVerificationType();
print('data i got is${arrivalVerificationTypeModel?.data?.first?.verificationTypeId}');
} }
@override @override
Widget build(BuildContext context) { 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( return Scaffold(
appBar: DefaultAppBar(title: context.translation.verifyArrival), appBar: DefaultAppBar(title: context.translation.verifyArrival),
//backgroundColor: const Color(0xfff8f9fb), //backgroundColor: const Color(0xfff8f9fb),
body: Consumer<RequestDetailProvider>(builder: (context, RequestDetailProvider requestDetailProvider, child) { body: Consumer<RequestDetailProvider>(builder: (context, RequestDetailProvider requestDetailProvider, child) {
return SafeArea( return SafeArea(
child: ListView.builder( child: requestDetailProvider.isArrivalLoading
padding: EdgeInsets.zero, ? const CircularProgressIndicator(color: AppColor.primary10).center
itemCount: items.length, : requestDetailProvider.arrivalTypeList!.isEmpty
itemBuilder: (context, index) { ? const NoDataFound().center
final item = items[index]; : ListView.builder(
return customListItem( padding: EdgeInsets.zero,
icon: item['icon']!, itemCount: requestDetailProvider.arrivalTypeList!.length,
heading: item['heading']!, itemBuilder: (builderContext, index) {
subHeading: item['subHeading']!, final item = requestDetailProvider.arrivalTypeList?[index];
context: context, return customListItem(
onTap: () { icon: item?.verificationTypes!.icon ?? '',
onItemTap(requestDetailProvider: requestDetailProvider, index: index, context: context); heading: item?.verificationTypes!.name ?? '',
}); subHeading: item?.description ?? '',
}, onTap: () {
).paddingOnly(start: 16, end: 16, top: 12, bottom: 12), onItemTap(requestDetailProvider: requestDetailProvider, index: index, context: context);
});
},
).paddingOnly(start: 16, end: 16, top: 12, bottom: 12),
); );
}), }),
); );
} }
Widget customListItem({ Widget customListItem({
required BuildContext context,
required String icon, required String icon,
required String heading, required String heading,
required String subHeading, required String subHeading,
@ -143,21 +124,20 @@ class _VerifyArrivalViewState extends State<VerifyArrivalView> {
if (result != null) { if (result != null) {
try { try {
//TODO show loader. //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( status = await requestDetailProvider.engineerConfirmArrival(
workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!, verificationTypeId: 1, photoInfo: '', otp: '', assetNo: result); workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!, verificationTypeId: 1, photoInfo: '', otp: '', assetNo: result);
if (status == 200) { if (status == 200) {
requestDetailProvider.getWorkOrderById(id: requestDetailProvider.currentWorkOrder!.data!.requestId!); requestDetailProvider.getWorkOrderById(id: requestDetailProvider.currentWorkOrder!.data!.requestId!);
//Navigator.pop(context); Navigator.pop(context);
requestDetailProvider.startTimer(); requestDetailProvider.startTimer();
Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) => RequestDetailMain(requestId: requestDetailProvider.currentWorkOrder!.data!.requestId!))); Navigator.pop(context);
} else { } else {
// Navigator.pop(context); Navigator.pop(context);
//show some message. //show some message.
} }
} catch (e) { } catch (e) {
// Navigator.pop(context); Navigator.pop(context);
print('error i got is $e'); print('error i got is $e');
} }
} }
@ -166,15 +146,11 @@ class _VerifyArrivalViewState extends State<VerifyArrivalView> {
Fluttertoast.showToast(msg: 'Under process...' ?? "", toastLength: Toast.LENGTH_LONG); Fluttertoast.showToast(msg: 'Under process...' ?? "", toastLength: Toast.LENGTH_LONG);
break; break;
case 2: case 2:
//TODO add loader. requestDetailProvider.sendOtp(workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!);
// showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); Navigator.pushReplacement(
context,
requestDetailProvider.sendOtp(workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!); MaterialPageRoute(builder: (context) => const VerifyOtpView()),
//Navigator.pop(context); );
Navigator.pushReplacement(
context,
MaterialPageRoute(builder: (context) => const VerifyOtpView()),
);
break; break;
case 3: case 3:
File? pickedFile = await onFilePicker(); File? pickedFile = await onFilePicker();
@ -183,88 +159,26 @@ class _VerifyArrivalViewState extends State<VerifyArrivalView> {
int? status; int? status;
try { try {
//TODO add loader //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: ''); status = await requestDetailProvider.engineerConfirmArrival(workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!, verificationTypeId: 4, photoInfo: fileObj, otp: '');
if (status == 200) { if (status == 200) {
Navigator.pop(context);
requestDetailProvider.getWorkOrderById(id: requestDetailProvider.currentWorkOrder!.data!.requestId!); requestDetailProvider.getWorkOrderById(id: requestDetailProvider.currentWorkOrder!.data!.requestId!);
// Navigator.pop(context); Navigator.pop(context);
requestDetailProvider.startTimer(); requestDetailProvider.startTimer();
Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) => RequestDetailMain(requestId: requestDetailProvider.currentWorkOrder!.data!.requestId!)));
} else { } else {
//show some message. Navigator.pop(context);
// Navigator.pop(context);
} }
} catch (e) { } 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; break;
} }
// ScanQr // ScanQr
} }
Future<File?> onFilePicker() async { 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; File? fileImage;
final pickedFile = await ImagePicker().pickImage(source: ImageSource.camera, imageQuality: 70, maxWidth: 800, maxHeight: 800); 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/text_extensions.dart';
import 'package:test_sa/extensions/widget_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/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/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/request_detail_provider.dart';
import 'package:test_sa/service_request_latest/views/request_detail_main_view.dart';
class VerifyOtpView extends StatelessWidget { class VerifyOtpView extends StatelessWidget {
const VerifyOtpView({Key? key}) : super(key: key); const VerifyOtpView({Key? key}) : super(key: key);
@ -54,16 +54,18 @@ class VerifyOtpView extends StatelessWidget {
RequestDetailProvider requestDetailProvider = Provider.of<RequestDetailProvider>(context, listen: false); RequestDetailProvider requestDetailProvider = Provider.of<RequestDetailProvider>(context, listen: false);
int? status; int? status;
//TODO add loader.. //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); status = await requestDetailProvider.verifyOtp(workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!, otpCode: pin);
print('status i got is $status');
if (status == 200) { if (status == 200) {
await requestDetailProvider.getWorkOrderById(id: requestDetailProvider.currentWorkOrder!.data!.requestId!); await requestDetailProvider.getWorkOrderById(id: requestDetailProvider.currentWorkOrder!.data!.requestId!);
await requestDetailProvider.engineerConfirmArrival( await requestDetailProvider.engineerConfirmArrival(
workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!, verificationTypeId: 3, photoInfo: '', otp: pin, assetNo: ''); workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!, verificationTypeId: 3, photoInfo: '', otp: pin, assetNo: '');
// Navigator.pop(context); Navigator.pop(context);
requestDetailProvider.startTimer(); 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 requestDetailProvider.assetRetiredHelperModel?.activityAssetToBeRetiredAttachments
?.add(ActivityAssetToBeRetiredAttachments(id: 0, name: "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}")); ?.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(); int status= await requestDetailProvider.createActivityAssetToBeRetired();
if(status==200){ if(status==200){
Navigator.pop(context); Navigator.pop(context);

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

@ -1,33 +1,20 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.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/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_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_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/supp_engineer_work_orders.dart';
import 'package:test_sa/models/service_request/supplier_details.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/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/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/providers/work_order/vendor_provider.dart';
import 'package:test_sa/service_request_latest/request_detail_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/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/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/app_text_form_field.dart';
import '../../../../../new_views/common_widgets/single_item_drop_down_menu.dart'; import '../../../../../new_views/common_widgets/single_item_drop_down_menu.dart';
@ -97,18 +84,9 @@ class _ExternalMaintenanceRequestState extends State<ExternalMaintenanceRequest>
? null ? null
: SuppPersons.fromJson(requestDetailProvider.activityMaintenanceHelperModel?.supEngineer?.toJson()), : SuppPersons.fromJson(requestDetailProvider.activityMaintenanceHelperModel?.supEngineer?.toJson()),
onSelect: (suppPerson) { onSelect: (suppPerson) {
print(suppPerson?.toJson());
if (suppPerson != null) { if (suppPerson != null) {
requestDetailProvider.activityMaintenanceHelperModel?.supEngineer = SuppEngineerWorkOrders.fromJson(suppPerson.toJson()); requestDetailProvider.activityMaintenanceHelperModel?.supEngineer = SuppEngineerWorkOrders.fromJson(suppPerson.toJson());
requestDetailProvider.updateActivityMaintenanceHelperModel(requestDetailProvider.activityMaintenanceHelperModel); 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(() {}); setState(() {});
} }
}, },
@ -168,8 +146,18 @@ class _ExternalMaintenanceRequestState extends State<ExternalMaintenanceRequest>
selectedTime.minute, selectedTime.minute,
); );
requestDetailProvider.activityMaintenanceHelperModel?.supplierStartTime = selectedDateTime; requestDetailProvider.activityMaintenanceHelperModel?.supplierStartTime = selectedDateTime;
requestDetailProvider.activityMaintenanceHelperModel?.supplierEndTime = null;
requestDetailProvider.updateActivityMaintenanceHelperModel(requestDetailProvider.activityMaintenanceHelperModel); 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.activityMaintenanceHelperModel?.supplierEndTime = selectedDateTime;
requestDetailProvider.updateActivityMaintenanceHelperModel(requestDetailProvider.activityMaintenanceHelperModel); 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/service_request_providers/last_situation_provider.dart';
import 'package:test_sa/providers/work_order/activity_status_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/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/service_request_latest/views/forms/maintenance_request/components/assistant_employee_card.dart';
import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart';
@ -140,8 +141,17 @@ class _InternalMaintenanceRequestState extends State<InternalMaintenanceRequest>
selectedTime.minute, selectedTime.minute,
); );
requestDetailProvider.activityMaintenanceHelperModel?.startTime = selectedDateTime; requestDetailProvider.activityMaintenanceHelperModel?.startTime = selectedDateTime;
requestDetailProvider.activityMaintenanceHelperModel?.endTime = null;
requestDetailProvider.updateActivityMaintenanceHelperModel(requestDetailProvider.activityMaintenanceHelperModel); 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.activityMaintenanceHelperModel?.endTime = selectedDateTime;
requestDetailProvider.updateActivityMaintenanceHelperModel(requestDetailProvider.activityMaintenanceHelperModel); 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(); super.initState();
_partsProvider = Provider.of<PartsProvider>(context, listen: false); _partsProvider = Provider.of<PartsProvider>(context, listen: false);
_requestDetailProvider = Provider.of<RequestDetailProvider>(context, listen: false); _requestDetailProvider = Provider.of<RequestDetailProvider>(context, listen: false);
_requestDetailProvider?.sparePartHelperModel = SparePartHelperModel( _requestDetailProvider?.sparePartHelperModel = SparePartHelperModel(
id: _requestDetailProvider?.sparePartHelperModel?.id ?? 0, id: _requestDetailProvider?.sparePartHelperModel?.id ?? 0,
workOrderId: _requestDetailProvider?.sparePartHelperModel?.workOrderId ?? _requestDetailProvider?.currentWorkOrder?.data?.requestId, workOrderId: _requestDetailProvider?.sparePartHelperModel?.workOrderId ?? _requestDetailProvider?.currentWorkOrder?.data?.requestId,

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

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

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

@ -209,6 +209,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.0.8" 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: dbus:
dependency: transitive dependency: transitive
description: description:

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

Loading…
Cancel
Save