diff --git a/assets/images/drawer/car_parking_icon.svg b/assets/images/drawer/car_parking_icon.svg
new file mode 100644
index 0000000..f77afa0
--- /dev/null
+++ b/assets/images/drawer/car_parking_icon.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json
index 916e8fb..a78c83f 100644
--- a/assets/langs/ar-SA.json
+++ b/assets/langs/ar-SA.json
@@ -642,5 +642,6 @@
"yearsUsed": "سنوات الاستخدام",
"faRequest": "طلب التخلص من FA",
"showMore": "عرض المزيد",
- "buyerDetails": "تفاصيل المشتري"
+ "buyerDetails": "تفاصيل المشتري",
+ "parkingQr": "وقوف السيارات QR"
}
\ No newline at end of file
diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json
index 5fcb35c..5b49d24 100644
--- a/assets/langs/en-US.json
+++ b/assets/langs/en-US.json
@@ -640,5 +640,6 @@
"yearsUsed": "Years Used",
"faRequest":"FA Disposal Request",
"showMore": "Show More",
- "buyerDetails": "Buyer Details"
+ "buyerDetails": "Buyer Details",
+ "parkingQr": "Parking QR"
}
\ No newline at end of file
diff --git a/lib/api/dashboard_api_client.dart b/lib/api/dashboard_api_client.dart
index 2bddb42..6f7288c 100644
--- a/lib/api/dashboard_api_client.dart
+++ b/lib/api/dashboard_api_client.dart
@@ -16,6 +16,7 @@ import 'package:mohem_flutter_app/models/dashboard/get_attendance_tracking_list_
import 'package:mohem_flutter_app/models/dashboard/itg_forms_model.dart';
import 'package:mohem_flutter_app/models/dashboard/list_menu.dart';
import 'package:mohem_flutter_app/models/generic_response_model.dart';
+import 'package:mohem_flutter_app/models/get_employee_parking_details_model.dart';
import 'package:mohem_flutter_app/models/itg/itg_main_response.dart';
import 'package:mohem_flutter_app/models/itg/itg_response_model.dart';
import 'package:mohem_flutter_app/models/sso_auth_model.dart';
@@ -226,9 +227,9 @@ class DashboardApiClient {
}
Future getBookingSSOFinalRedirection({required String token}) async {
- token =
- "eyJhbGciOiJSUzI1NiIsImtpZCI6IjhjZTE2OWM0YjIwYjQ2ZWM5YTQyOTU3Y2ZhODUzNzQ1IiwidHlwIjoiSldUIn0.eyJ0ZW5hbnRfaWQiOiJhOWY0ZDFhMDU5NmQ0YWVhOGY4MzA5OTJlYzRiZGFjMSIsImVpZCI6IjExNzkzMCIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL3NpZCI6Ijk2MDI0OGM1NzA3YzQ3MmFhYTEzM2I1N2ZhODE1ZmVhIiwibGFuZ3VhZ2UiOiJVUyIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL2VtYWlsYWRkcmVzcyI6IjExNzkzMEBobWcuY29tIiwiZXhwIjoxNzgyNDc1NzY5LCJpc3MiOiJodHRwczovL3Nzby11YXQuaG1nLmNvbSIsImF1ZCI6ImE5ZjRkMWEwNTk2ZDRhZWE4ZjgzMDk5MmVjNGJkYWMxIn0.rJcLVsG8D0XECyLERCTD2uqGeWyvp-OBVGE9uL2qKrX4etFUHgdFt_5kYF6edFTtGy-0PIZadHDmv7e-IOhVWHm5HVMClaukiXoRXR8cDN8XA1wfme3Kd-U5PXN-IRh49AyRTzLO0rYNPvH81ScosWGlsFSkOvA-0hJNa2adHdtvgNvB8wJshSU5p7sAmF8mjdDY6aInG19etu2iEuUDwHHA4ZY_ts4hboHo8fE392hFaYGonExoD7bpW5RMx5xKWeRCmWpG_PK8Aw_z1jGzdB9PANus4pteRGuln1J-kmo2lQC9pVrSyZATAKp1HfgfyZ_vUhaHEfM69cMWaCslJQ";
- // var request = http.MultipartRequest('POST', Uri.parse('https://ek.techmaster.in/SSO/HMG'));
+ // token =
+ // "eyJhbGciOiJSUzI1NiIsImtpZCI6IjhjZTE2OWM0YjIwYjQ2ZWM5YTQyOTU3Y2ZhODUzNzQ1IiwidHlwIjoiSldUIn0.eyJ0ZW5hbnRfaWQiOiJhOWY0ZDFhMDU5NmQ0YWVhOGY4MzA5OTJlYzRiZGFjMSIsImVpZCI6IjExNzkzMCIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL3NpZCI6Ijk2MDI0OGM1NzA3YzQ3MmFhYTEzM2I1N2ZhODE1ZmVhIiwibGFuZ3VhZ2UiOiJVUyIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL2VtYWlsYWRkcmVzcyI6IjExNzkzMEBobWcuY29tIiwiZXhwIjoxNzgyNDc1NzY5LCJpc3MiOiJodHRwczovL3Nzby11YXQuaG1nLmNvbSIsImF1ZCI6ImE5ZjRkMWEwNTk2ZDRhZWE4ZjgzMDk5MmVjNGJkYWMxIn0.rJcLVsG8D0XECyLERCTD2uqGeWyvp-OBVGE9uL2qKrX4etFUHgdFt_5kYF6edFTtGy-0PIZadHDmv7e-IOhVWHm5HVMClaukiXoRXR8cDN8XA1wfme3Kd-U5PXN-IRh49AyRTzLO0rYNPvH81ScosWGlsFSkOvA-0hJNa2adHdtvgNvB8wJshSU5p7sAmF8mjdDY6aInG19etu2iEuUDwHHA4ZY_ts4hboHo8fE392hFaYGonExoD7bpW5RMx5xKWeRCmWpG_PK8Aw_z1jGzdB9PANus4pteRGuln1J-kmo2lQC9pVrSyZATAKp1HfgfyZ_vUhaHEfM69cMWaCslJQ";
+ // // var request = http.MultipartRequest('POST', Uri.parse('https://ek.techmaster.in/SSO/HMG'));
var request = http.MultipartRequest('POST', Uri.parse('https://Paxes-release.techmaster.in/SSO/HMG'));
request.fields.addAll({'JWTToken': token});
@@ -414,4 +415,18 @@ class DashboardApiClient {
// postParams,
// );
// }
+
+ Future getEmployeeParkingQrCode() async {
+ String url = "${ApiConsts.erpRest}GET_Employee_Parking";
+ Map postParams = {};
+ postParams.addAll(AppState().postParamsJson);
+ return await ApiClient().postJsonForObject(
+ (json) {
+ GetEmployeeParking responseData = GetEmployeeParking.fromJson(json);
+ return responseData;
+ },
+ url,
+ postParams,
+ );
+ }
}
diff --git a/lib/classes/consts.dart b/lib/classes/consts.dart
index dbec87d..a6b7173 100644
--- a/lib/classes/consts.dart
+++ b/lib/classes/consts.dart
@@ -4,12 +4,12 @@ class ApiConsts {
// static String baseUrl = "http://10.200.204.11"; // Local server
// static String baseUrl = "https://erptstapp.srca.org.sa"; // SRCA server
- // static String baseUrl = "https://uat.hmgwebservices.com"; // UAT ser343622ver
+ static String baseUrl = "https://uat.hmgwebservices.com"; // UAT ser343622ver
// static String baseUrl = "http://10.201.204.101:2024";
// static String baseUrl = "https://webservices.hmg.com"; // PreProd
// static String baseUrl = "https://hmgwebservices.com"; // Live server
- static String baseUrl = "https://mohemm.hmg.com"; // New Live server
+ // static String baseUrl = "https://mohemm.hmg.com"; // New Live server
//
// static String baseUrl = "https://uat.hmgwebservices.com"; // UAT ser343622ver
// static String baseUrl = "http://10.20.200.111:1010/";
diff --git a/lib/config/routes.dart b/lib/config/routes.dart
index 4653880..0afc22c 100644
--- a/lib/config/routes.dart
+++ b/lib/config/routes.dart
@@ -40,6 +40,7 @@ import 'package:mohem_flutter_app/ui/my_team/profile_details.dart';
import 'package:mohem_flutter_app/ui/my_team/subordinate_leave.dart';
import 'package:mohem_flutter_app/ui/my_team/team_members.dart';
import 'package:mohem_flutter_app/ui/my_team/view_attendance.dart';
+import 'package:mohem_flutter_app/ui/parking_qr/parking_qr.dart';
import 'package:mohem_flutter_app/ui/payslip/monthly_pay_slip_screen.dart';
import 'package:mohem_flutter_app/ui/performance/performance_appraisal_screen.dart';
import 'package:mohem_flutter_app/ui/profile/add_update_family_member.dart';
@@ -211,6 +212,9 @@ class AppRoutes {
static const String activityScreen = "/activityScreen";
+ //Parking QR
+ static const String parkingQr = "/parkingQrScreen";
+
static final Map routes = {
login: (BuildContext context) => LoginScreen(),
verifyLogin: (BuildContext context) => VerifyLoginScreen(),
@@ -328,6 +332,10 @@ class AppRoutes {
unsafeDeviceScreen: (BuildContext context) => const UnsafeDeviceScreen(),
appUpdateScreen: (BuildContext context) => const AppUpdateScreen(),
childEducation: (BuildContext context) => ChildEducationAssistance(),
- activityScreen:(BuildContext context) => const EventActivityScreen()
+ activityScreen:(BuildContext context) => const EventActivityScreen(),
+
+ //Parking QR
+ parkingQr: (BuildContext context) => const ParkingQrScreen(),
+
};
}
diff --git a/lib/generated/codegen_loader.g.dart b/lib/generated/codegen_loader.g.dart
index 6feb438..62bbce6 100644
--- a/lib/generated/codegen_loader.g.dart
+++ b/lib/generated/codegen_loader.g.dart
@@ -655,7 +655,8 @@ class CodegenLoader extends AssetLoader{
"yearsUsed": "سنوات الاستخدام",
"faRequest": "طلب التخلص من FA",
"showMore": "عرض المزيد",
- "buyerDetails": "تفاصيل المشتري"
+ "buyerDetails": "تفاصيل المشتري",
+ "parkingQr": "وقوف السيارات QR"
};
static const Map _en_US = {
"mohemm": "Mohemm",
@@ -1298,7 +1299,8 @@ static const Map _en_US = {
"yearsUsed": "Years Used",
"faRequest": "FA Disposal Request",
"showMore": "Show More",
- "buyerDetails": "Buyer Details"
+ "buyerDetails": "Buyer Details",
+ "parkingQr": "Parking QR"
};
static const Map> mapLocales = {"ar_SA": _ar_SA, "en_US": _en_US};
}
diff --git a/lib/generated/locale_keys.g.dart b/lib/generated/locale_keys.g.dart
index 1a1cf95..683c8c4 100644
--- a/lib/generated/locale_keys.g.dart
+++ b/lib/generated/locale_keys.g.dart
@@ -628,5 +628,6 @@ abstract class LocaleKeys {
static const faRequest = 'faRequest';
static const showMore = 'showMore';
static const buyerDetails = 'buyerDetails';
+ static const parkingQr = 'parkingQr';
}
diff --git a/lib/models/get_employee_parking_details_model.dart b/lib/models/get_employee_parking_details_model.dart
new file mode 100644
index 0000000..4a385c8
--- /dev/null
+++ b/lib/models/get_employee_parking_details_model.dart
@@ -0,0 +1,61 @@
+import 'dart:convert';
+
+class GetEmployeeParking {
+ GetEmployeeParkingClass? getEmployeeParking;
+
+ GetEmployeeParking({
+ this.getEmployeeParking,
+ });
+
+ factory GetEmployeeParking.fromRawJson(String str) => GetEmployeeParking.fromJson(json.decode(str));
+
+ String toRawJson() => json.encode(toJson());
+
+ factory GetEmployeeParking.fromJson(Map json) => GetEmployeeParking(
+ getEmployeeParking: json["GET_Employee_Parking"] == null ? null : GetEmployeeParkingClass.fromJson(json["GET_Employee_Parking"]),
+ );
+
+ Map toJson() => {
+ "GET_Employee_Parking": getEmployeeParking?.toJson(),
+ };
+}
+
+class GetEmployeeParkingClass {
+ DateTime? createdAt;
+ String? employeeCode;
+ String? isNewQrCode;
+ String? qrCode;
+ String? qrCodeImageBase64;
+ bool? success;
+
+ GetEmployeeParkingClass({
+ this.createdAt,
+ this.employeeCode,
+ this.isNewQrCode,
+ this.qrCode,
+ this.qrCodeImageBase64,
+ this.success,
+ });
+
+ factory GetEmployeeParkingClass.fromRawJson(String str) => GetEmployeeParkingClass.fromJson(json.decode(str));
+
+ String toRawJson() => json.encode(toJson());
+
+ factory GetEmployeeParkingClass.fromJson(Map json) => GetEmployeeParkingClass(
+ createdAt: json["createdAt"] == null ? null : DateTime.parse(json["createdAt"]),
+ employeeCode: json["employeeCode"],
+ isNewQrCode: json["isNewQRCode"],
+ qrCode: json["qrCode"],
+ qrCodeImageBase64: json["qrCodeImageBase64"],
+ success: json["success"],
+ );
+
+ Map toJson() => {
+ "createdAt": createdAt?.toIso8601String(),
+ "employeeCode": employeeCode,
+ "isNewQRCode": isNewQrCode,
+ "qrCode": qrCode,
+ "qrCodeImageBase64": qrCodeImageBase64,
+ "success": success,
+ };
+}
diff --git a/lib/provider/dashboard_provider_model.dart b/lib/provider/dashboard_provider_model.dart
index 05c9ebb..dd1472b 100644
--- a/lib/provider/dashboard_provider_model.dart
+++ b/lib/provider/dashboard_provider_model.dart
@@ -120,6 +120,7 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
DrawerMenuItem("assets/images/drawer/my_profile.svg", LocaleKeys.myProfile.tr(), AppRoutes.profile),
DrawerMenuItem("assets/images/drawer/performance_evaluation.svg", LocaleKeys.performanceEvaluation.tr(), AppRoutes.performanceEvaluation),
DrawerMenuItem("assets/images/drawer/mowadhafi.svg", LocaleKeys.mowadhafhi.tr(), AppRoutes.mowadhafhi),
+ DrawerMenuItem("assets/images/drawer/car_parking_icon.svg", LocaleKeys.parkingQr.tr(), AppRoutes.parkingQr),
DrawerMenuItem("assets/images/drawer/pending_trasactions.svg", LocaleKeys.pendingTransactions.tr(), AppRoutes.pendingTransactions),
// DrawerMenuItem("assets/images/drawer/drawer_marathon.svg", LocaleKeys.brainMarathon.tr(), AppRoutes.marathonIntroScreen),
DrawerMenuItem("assets/images/drawer/change_password.svg", LocaleKeys.changePassword.tr(), AppRoutes.changePassword),
@@ -326,8 +327,6 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
void fetchTicketBalance() async {
try {
GenericResponseModel? ticketResponse = await DashboardApiClient().getTicketBalance();
- logger.d("Ticket Balance Response: ${ticketResponse?.toJson()}");
- print(" ========= Ticket Balance Response ======= ");
} catch (ex) {
logger.wtf(ex);
isEventLoadingLoading = false;
@@ -340,8 +339,7 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
Future fetchSSOAuthRedirection({String? clientID}) async {
try {
SSOAuthModel? ssoResponse = await DashboardApiClient().getBookingSSOAuthRedirection(clientID: clientID!);
- logger.d("SSO Response: ${ssoResponse!.toJson()}");
- if (ssoResponse.status == "Success") {
+ if (ssoResponse!.status == "Success") {
return ssoResponse;
} else {
Utils.showToast(ssoResponse.message!.first ?? "Failed to fetch SSO Auth Token");
@@ -361,18 +359,12 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
dynamic res = await DashboardApiClient().getBookingSSOFinalRedirection(token: token);
logger.d("SSO URL: $res");
return res;
- // if (ssoResponse.status == "Success") {
- // return ssoResponse;
- // } else {
- // Utils.showToast(ssoResponse.message!.first ?? "Failed to fetch SSO Auth Token");
- // return null;
- // }
} catch (ex) {
logger.wtf(ex);
isEventLoadingLoading = false;
notifyListeners();
Utils.handleException(ex, null, null);
- return null; // Ensure a return value in case of an exception
+ return null;
}
}
diff --git a/lib/ui/parking_qr/parking_qr.dart b/lib/ui/parking_qr/parking_qr.dart
new file mode 100644
index 0000000..641f84a
--- /dev/null
+++ b/lib/ui/parking_qr/parking_qr.dart
@@ -0,0 +1,106 @@
+import 'package:easy_localization/easy_localization.dart';
+import 'package:flutter/material.dart';
+import 'package:mohem_flutter_app/api/dashboard_api_client.dart';
+import 'package:mohem_flutter_app/classes/colors.dart';
+import 'package:mohem_flutter_app/classes/utils.dart';
+import 'package:mohem_flutter_app/extensions/int_extensions.dart';
+import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
+import 'package:mohem_flutter_app/models/get_employee_parking_details_model.dart';
+import 'package:mohem_flutter_app/widgets/app_bar_widget.dart';
+
+class ParkingQrScreen extends StatefulWidget {
+ const ParkingQrScreen({Key? key}) : super(key: key);
+
+ @override
+ _RequestDetailsState createState() => _RequestDetailsState();
+}
+
+class _RequestDetailsState extends State {
+ GetEmployeeParking? qrData;
+
+ @override
+ void initState() {
+ super.initState();
+ getTicketDetails();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ backgroundColor: Colors.white,
+ appBar: AppBarWidget(context, title: LocaleKeys.parkingQr.tr()),
+ body:
+ qrData?.getEmployeeParking == null
+ ? Center(child: Text(LocaleKeys.noDataAvailable.tr()))
+ : SingleChildScrollView(
+ child: Padding(
+ padding: const EdgeInsets.all(20.0),
+ child: Center(
+ child: Container(
+ padding: const EdgeInsets.all(20.0),
+ decoration: BoxDecoration(
+ color: Colors.white,
+ borderRadius: BorderRadius.circular(16),
+ boxShadow: [BoxShadow(color: Colors.grey.withValues(alpha: 0.2), spreadRadius: 5, blurRadius: 10, offset: const Offset(0, 3))],
+ ),
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ // QR Code Image
+ if (qrData!.getEmployeeParking!.qrCodeImageBase64 != null && qrData!.getEmployeeParking!.qrCodeImageBase64!.isNotEmpty)
+ Image.memory(Utils.dataFromBase64String(qrData!.getEmployeeParking!.qrCodeImageBase64!), width: 300, height: 300, fit: BoxFit.contain)
+ else
+ Container(
+ width: 300,
+ height: 300,
+ color: MyColors.lightGreyEFColor,
+ child: Center(child: Text(LocaleKeys.noDataAvailable.tr(), style: const TextStyle(color: MyColors.grey67Color))),
+ ),
+ 10.height,
+ Container(height: 1, color: MyColors.lightGreyE3Color, margin: const EdgeInsets.symmetric(vertical: 10)),
+ 20.height,
+ SizedBox(
+ width: double.infinity,
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ // Employee Code
+ if (qrData!.getEmployeeParking!.employeeCode != null && qrData!.getEmployeeParking!.employeeCode!.isNotEmpty) ...[
+ Text(LocaleKeys.employeeNumber.tr(), style: const TextStyle(fontSize: 14, color: MyColors.grey67Color, fontWeight: FontWeight.w400)),
+ 8.height,
+ Text(qrData!.getEmployeeParking!.employeeCode!, style: const TextStyle(fontSize: 18, color: MyColors.darkTextColor, fontWeight: FontWeight.w600)),
+ 8.height,
+ ],
+ if (qrData!.getEmployeeParking!.createdAt != null) ...[
+ Text(LocaleKeys.creationDate.tr(), style: const TextStyle(fontSize: 14, color: MyColors.grey67Color, fontWeight: FontWeight.w400)),
+ 8.height,
+ Text(
+ DateFormat('dd MMM yyyy, hh:mm a').format(qrData!.getEmployeeParking!.createdAt!),
+ style: const TextStyle(fontSize: 16, color: MyColors.darkTextColor, fontWeight: FontWeight.w500),
+ ),
+ ],
+ ],
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ ),
+ );
+ }
+
+ void getTicketDetails() async {
+ try {
+ Utils.showLoading(context);
+ qrData = await DashboardApiClient().getEmployeeParkingQrCode();
+ Utils.hideLoading(context);
+ setState(() {});
+ } catch (ex) {
+ Utils.hideLoading(context);
+ Utils.handleException(ex, context, null);
+ }
+ }
+}