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/images/drawer/courses.svg b/assets/images/drawer/courses.svg
new file mode 100644
index 0000000..d15e742
--- /dev/null
+++ b/assets/images/drawer/courses.svg
@@ -0,0 +1,8 @@
+
+
diff --git a/assets/images/eid_banner.svg b/assets/images/eid_banner.svg
new file mode 100644
index 0000000..f8e4adb
--- /dev/null
+++ b/assets/images/eid_banner.svg
@@ -0,0 +1,606 @@
+
diff --git a/assets/images/greeting.svg b/assets/images/greeting.svg
new file mode 100644
index 0000000..0682c60
--- /dev/null
+++ b/assets/images/greeting.svg
@@ -0,0 +1,605 @@
+
diff --git a/assets/images/ticket_bal.svg b/assets/images/ticket_bal.svg
new file mode 100644
index 0000000..8fadde8
--- /dev/null
+++ b/assets/images/ticket_bal.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/images/vacation_rule.svg b/assets/images/vacation_rule.svg
new file mode 100644
index 0000000..0a536f7
--- /dev/null
+++ b/assets/images/vacation_rule.svg
@@ -0,0 +1,16 @@
+
diff --git a/assets/images/worklist/approve.svg b/assets/images/worklist/approve.svg
new file mode 100644
index 0000000..8d62ae9
--- /dev/null
+++ b/assets/images/worklist/approve.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/images/worklist/reject.svg b/assets/images/worklist/reject.svg
new file mode 100644
index 0000000..cb5da34
--- /dev/null
+++ b/assets/images/worklist/reject.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json
index 27a5434..9558c2f 100644
--- a/assets/langs/ar-SA.json
+++ b/assets/langs/ar-SA.json
@@ -164,6 +164,7 @@
"quotationAnalysis": "تحليل الاقتباس",
"subject": "موضوعات",
"description": "وصف",
+ "pleaseEnterDescription": "الرجاء إدخال الوصف",
"supplier": "المورد",
"site": "موقع",
"buyer": "مشتر",
@@ -258,6 +259,7 @@
"fullName": "الأسم الكامل",
"remove": "حذف",
"submit": "ارسال",
+ "submitAsAnonymous": "إرسال كمجهول",
"areYouSureYouWantToSubmit": "هل أنت متأكد أنك تريد أن تقدم؟",
"comments": "تعليقات",
"writeComment": "أكتب تعليقا",
@@ -531,7 +533,7 @@
"noWinner": "حزين! لم يفز أحد اليوم.",
"myTeam": "فريقي",
"youCanPlayDemo": "لكن يمكنك لعب العرض",
- "group" : "مجموعة",
+ "group": "مجموعة",
"searchGroup": "مجموعة البحث",
"connectHmgWifi": "قم بتوصيل HMG WIFI",
"connectedHmgWifi": "اتصال HMG WIFI",
@@ -572,20 +574,20 @@
"versionStatus": "حالة الإصدار",
"supplierNo": "رقم المورد",
"general": "عام",
- "requesterOperatingUnit":"وحدة تشغيل مقدم الطلب",
- "prepareEmpNum":"إعداد رقم الموظف",
- "supplierInfo" : "معلومات المورد",
+ "requesterOperatingUnit": "وحدة تشغيل مقدم الطلب",
+ "prepareEmpNum": "إعداد رقم الموظف",
+ "supplierInfo": "معلومات المورد",
"supplierAcNo": "رقم حساب المورد",
"supplierAcName": "اسم حساب المورد",
- "supplierIBAN" : "رقم IBAN للمورد",
- "supplierCRNo" :"رقم السجل التجاري",
- "suppliedAcNo" : "رقم الحساب المقدم",
- "patientRefundInvoice" : "فاتورة استرداد الأموال للمريض",
- "patientNumber" : "رقم المريض",
- "patientName" : "اسم المريض",
- "invoiceDate" : "تاريخ الفاتورة",
- "refundInvoice" :"فاتورة الاسترجاع",
- "hospitalClinic" : "عيادة المستشفى",
+ "supplierIBAN": "رقم IBAN للمورد",
+ "supplierCRNo": "رقم السجل التجاري",
+ "suppliedAcNo": "رقم الحساب المقدم",
+ "patientRefundInvoice": "فاتورة استرداد الأموال للمريض",
+ "patientNumber": "رقم المريض",
+ "patientName": "اسم المريض",
+ "invoiceDate": "تاريخ الفاتورة",
+ "refundInvoice": "فاتورة الاسترجاع",
+ "hospitalClinic": "عيادة المستشفى",
"graphicalAnalysis": "التحليل الرسومي",
"itemHistoryAnalysis": "تحليل تاريخ العنصر",
"pOno": "امر شراء #",
@@ -611,23 +613,23 @@
"members": "الأعضاء",
"searchByUserName": "البحث بواسطة اسم المستخدم",
"shareScreen": "مشاركة الشاشة",
- "start":"يبدأ",
- "about":"عن",
+ "start": "يبدأ",
+ "about": "عن",
"explore": "يستكشف",
"mazaya": "مازيا",
"benefits": "فوائد",
"mazayaDesc": "اكتشف الخصومات والعروض الخاصة المتاحة للموظفين",
- "viewallofferMazaya" : "أعرض كل المزايا",
+ "viewallofferMazaya": "أعرض كل المزايا",
"buyerName": "اسم المشتري",
"buyerNumber": "رقم المشتري",
"highestBidder": "أعلى مزايد",
"remarks": "ملاحظات",
"faHeader": "تفاصيل رأس الصفحة FA",
- "bookTypeCode": "رمز نوع الكتاب",
+ "bookTypeCode": "رمز نوع الكتاب",
"categoryCode": "رمز الفئة",
"categoryGroup": "مجموعة الفئات",
- "faLINES": "تفاصيل الأصول",
- "assetNumber": "رقم الأصول",
+ "faLINES": "تفاصيل الأصول",
+ "assetNumber": "رقم الأصول",
"assetDescription": "وصف الأصول",
"barCodeNumber": "رقم الباركود",
"datePlaceInService": "تاريخ وضعه في الخدمة",
@@ -635,9 +637,36 @@
"disposedDate": "تاريخ التخلص",
"netBookValue": "القيمة الدفترية الصافية",
"purchasedPrice": "سعر الشراء",
- "usefulLife": "العمر الإنتاجي",
+ "usefulLife": "العمر الإنتاجي",
"yearsUsed": "سنوات الاستخدام",
"faRequest": "طلب التخلص من FA",
"showMore": "عرض المزيد",
- "buyerDetails": "تفاصيل المشتري"
-}
\ No newline at end of file
+ "ticketDetails": "تفاصيل التذكرة",
+ "currentTicketBalance": "رصيد التذكرة الحالي",
+ "ticketHistory": "تاريخ التذكرة",
+ "proceedBooking": "المتابعة للحجز",
+ "courses": "الدورات التدريبية",
+ "course": "دورة",
+ "status": "الحالة",
+ "deadline": "الموعد النهائي",
+ "overdue": "متأخر",
+ "noCoursesAvailable": "لا توجد دورات متاحة",
+ "pullToRefresh": "اسحب للتحديث",
+ "courseUrlNotAvailable": "رابط الدورة غير متوفر",
+ "buyerDetails": "تفاصيل المشتري",
+ "etqanOVR": "الإبلاغ عن حادثة",
+ "etqanRequest": "طلبات الحوادث",
+ "selectProject": "حدد المشروع",
+ "project": "مشروع",
+ "keen": "حريص",
+ "reportIncident": "الإبلاغ عن الحادث",
+ "myIncidents": "حوادثي",
+ "incidentDetails": "تفاصيل الحادث",
+ "ticketNumber": "رقم التذكرة",
+ "ticketId": "معرف التذكرة",
+ "pleaseSelectProject": "الرجاء اختيار مشروع",
+ "viewAttachment" : "عرض المرفق",
+ "parkingQr": "وقوف السيارات QR",
+ "startNow": "ابدأ الآن"
+}
+
diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json
index ce0fcac..ba8bd20 100644
--- a/assets/langs/en-US.json
+++ b/assets/langs/en-US.json
@@ -158,6 +158,7 @@
"subject": "Subject",
"quotationAnalysis": "Quotation Analysis",
"description": "Description",
+ "pleaseEnterDescription": "Please enter description",
"supplier": "Supplier",
"site": "Site",
"buyer": "Buyer",
@@ -256,6 +257,7 @@
"remove": "Remove",
"Attendance": "Attendance",
"submit": "Submit",
+ "submitAsAnonymous": "Submit as Anonymous",
"areYouSureYouWantToSubmit": "Are you sure you want to submit?",
"comments": "Comments",
"writeComment": "Write a comment",
@@ -565,7 +567,7 @@
"addAtLeastOneAttachment": "Please add at least one attachment.",
"pleaseClickButtonToJoinMarathon": "Press the button below to join the Marathon.",
"youCannotJoinTheMarathon": "You cannot join the Marathon because you have exceeded the time limit.",
- "requesterOperatingUnit":"Requester Operating Unit",
+ "requesterOperatingUnit": "Requester Operating Unit",
"paymentRequest": "Pay Request",
"paymentDetails": "Payment Details",
"requestNo": "Request No",
@@ -590,19 +592,19 @@
"versionStatus": "Version Status",
"supplierNo": "Supplier No",
"general": "General",
- "prepareEmpNum":"Prepare Employee Num",
- "supplierInfo" : "Supplier Information",
+ "prepareEmpNum": "Prepare Employee Num",
+ "supplierInfo": "Supplier Information",
"supplierAcNo": "Supplier Account No",
- "supplierAcName":"Supplier Account Name",
- "supplierIBAN" : "Supplier IBAN",
- "supplierCRNo" : "CR Number",
- "suppliedAcNo" : "Supplied Account No.",
- "patientRefundInvoice" : "Patient Refund Invoice",
- "patientNumber" : "Patient Number",
- "patientName" : "Patient Name",
- "invoiceDate" : "Invoice Date",
- "refundInvoice" :"Refund Invoice",
- "hospitalClinic" : "Hospital Clinic",
+ "supplierAcName": "Supplier Account Name",
+ "supplierIBAN": "Supplier IBAN",
+ "supplierCRNo": "CR Number",
+ "suppliedAcNo": "Supplied Account No.",
+ "patientRefundInvoice": "Patient Refund Invoice",
+ "patientNumber": "Patient Number",
+ "patientName": "Patient Name",
+ "invoiceDate": "Invoice Date",
+ "refundInvoice": "Refund Invoice",
+ "hospitalClinic": "Hospital Clinic",
"graphicalAnalysis": "Graphical Analysis",
"itemHistoryAnalysis": "Item History Analysis",
"pOno": "P.O #",
@@ -611,23 +613,23 @@
"qtyReceived": "Qty. Received",
"bonusQty": "Bonus Qty.",
"balQty": "Bal. Qty.",
- "start":"Start",
- "about":"About",
+ "start": "Start",
+ "about": "About",
"explore": "Explore",
"mazaya": "MAZAYA",
"benefits": "Benefits",
"mazayaDesc": "Discover special Discounts and offers available to Employees",
- "viewallofferMazaya" : "View All Offers",
+ "viewallofferMazaya": "View All Offers",
"buyerName": "Buyer Name",
"buyerNumber": "Buyer Number",
"highestBidder": "Highest Bidder",
"remarks": "Remarks",
"faHeader": "FA Header Details",
- "bookTypeCode": "Book Type Code",
+ "bookTypeCode": "Book Type Code",
"categoryCode": "Category Code",
"categoryGroup": "Category Group",
- "faLINES": "Asset Details",
- "assetNumber": "Asset Number",
+ "faLINES": "Asset Details",
+ "assetNumber": "Asset Number",
"assetDescription": "Asset Description",
"barCodeNumber": "BarCode Number",
"datePlaceInService": "Date place In Service",
@@ -635,9 +637,35 @@
"disposedDate": "Disposed Date",
"netBookValue": "Net Book Value",
"purchasedPrice": "Purchased Price",
- "usefulLife": "Useful Life",
+ "usefulLife": "Useful Life",
"yearsUsed": "Years Used",
- "faRequest":"FA Disposal Request",
+ "faRequest": "FA Disposal Request",
"showMore": "Show More",
- "buyerDetails": "Buyer Details"
+ "ticketDetails": "Ticket Details",
+ "currentTicketBalance": "Current Ticket Balance",
+ "ticketHistory": "Ticket History",
+ "proceedBooking": "Proceed For Booking",
+ "courses": "Courses",
+ "course": "Course",
+ "status": "Status",
+ "deadline": "Deadline",
+ "overdue": "Overdue",
+ "noCoursesAvailable": "No Courses Available",
+ "pullToRefresh": "Pull to refresh",
+ "courseUrlNotAvailable": "Course URL not available",
+ "buyerDetails": "Buyer Details",
+ "etqanOVR": "Report An Incident",
+ "etqanRequest": "Incident Requests",
+ "selectProject": "Select Project",
+ "project": "Project",
+ "keen": "Keen",
+ "reportIncident": "Report Incident",
+ "myIncidents": "My Incidents",
+ "incidentDetails": "Incident Details",
+ "ticketNumber": "Ticket Number",
+ "ticketId": "Ticket ID",
+ "pleaseSelectProject": "Please select a project",
+ "viewAttachment" : "View Attachment",
+ "parkingQr": "Parking QR",
+ "startNow": "Start Now"
}
\ No newline at end of file
diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist
index 99cda04..bedf267 100644
--- a/ios/Runner/Info.plist
+++ b/ios/Runner/Info.plist
@@ -55,6 +55,8 @@
This app requires photo library access to select image as document & upload it.
NSMicrophoneUsageDescription
This app requires microphone access to for call.
+ NSSpeechRecognitionUsageDescription
+ This app requires speech recognition access to access voice command features.
UIBackgroundModes
fetch
diff --git a/lib/api/dashboard_api_client.dart b/lib/api/dashboard_api_client.dart
index 2bddb42..87025f2 100644
--- a/lib/api/dashboard_api_client.dart
+++ b/lib/api/dashboard_api_client.dart
@@ -15,7 +15,10 @@ import 'package:mohem_flutter_app/models/dashboard/get_accural_ticket_balance_mo
import 'package:mohem_flutter_app/models/dashboard/get_attendance_tracking_list_model.dart';
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/dashboard/courses_response_model.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/greetings/greeting_card_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,10 +229,11 @@ 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'));
- var request = http.MultipartRequest('POST', Uri.parse('https://Paxes-release.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')); // UAT
+ // var request = http.MultipartRequest('POST', Uri.parse('https://paxes.com/sso/hmg')); // Prod
request.fields.addAll({'JWTToken': token});
// request.headers.addAll(headers);
@@ -414,4 +418,57 @@ 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,
+ );
+ }
+
+ //Fetch All Courses Status
+ Future fetchAllCoursesStatus() async {
+ String url = "https://elearning.hmg.com/moodle_dev/api/Fetch_All_Courses_Status.php";
+
+ Map headers = {
+ 'x-api-key': 'bLi@mbXJeXTHd/)h&LFh%25+%25(Nbnaq6hBg%7d%5dyQbthY%7bv6ew6-5UT\$NASwucn%7d,_PSJpuwNCCen2%7djj%7b00HR2T-%5b,k7W%7d-0yepK?%258',
+ 'Content-Type': 'application/x-www-form-urlencoded',
+ };
+
+ Map postParams = {
+ "username": AppState().memberInformationList?.eMPLOYEENUMBER ?? "",
+ };
+
+ return await ApiClient().postJsonForObject(
+ (json) {
+ CoursesResponseModel responseData = CoursesResponseModel.fromJson(json);
+ return responseData;
+ },
+ url,
+ postParams,
+ headers: headers,
+ isFormData: false,
+ );
+ }
+
+ Future getGreetingCards() async {
+ String url = "${ApiConsts.erpRest}Get_GreetingCards";
+ Map postParams = {};
+ postParams.addAll(AppState().postParamsJson);
+ return await ApiClient().postJsonForObject(
+ (json) {
+ GetGreetingCardsModelResponse responseData = GetGreetingCardsModelResponse.fromJson(json);
+ return responseData;
+ },
+ url,
+ postParams,
+ );
+ }
}
diff --git a/lib/api/etqan_ovr_api_client.dart b/lib/api/etqan_ovr_api_client.dart
new file mode 100644
index 0000000..f7512cc
--- /dev/null
+++ b/lib/api/etqan_ovr_api_client.dart
@@ -0,0 +1,140 @@
+import 'dart:convert';
+
+import 'package:flutter/foundation.dart';
+import 'package:intl/intl.dart';
+import 'package:mohem_flutter_app/api/api_client.dart';
+import 'package:mohem_flutter_app/app_state/app_state.dart';
+import 'package:mohem_flutter_app/classes/consts.dart';
+import 'package:mohem_flutter_app/models/etqan_ovr/etqan_get_employee_incident_report.dart';
+import 'package:mohem_flutter_app/models/etqan_ovr/etqan_get_requests_model.dart';
+import 'package:mohem_flutter_app/models/etqan_ovr/etqan_getprojects_model.dart';
+import 'package:mohem_flutter_app/models/generic_response_model.dart';
+import 'package:mohem_flutter_app/models/mowadhafhi/get_department_sections.dart';
+import 'package:mohem_flutter_app/models/mowadhafhi/get_project_departments.dart';
+import 'package:mohem_flutter_app/models/mowadhafhi/get_projects.dart';
+import 'package:mohem_flutter_app/models/mowadhafhi/get_section_topics.dart';
+import 'package:mohem_flutter_app/models/mowadhafhi/get_ticket_details.dart';
+import 'package:mohem_flutter_app/models/mowadhafhi/get_ticket_transactions.dart';
+import 'package:mohem_flutter_app/models/mowadhafhi/get_ticket_types.dart';
+import 'package:mohem_flutter_app/models/mowadhafhi/get_tickets_list.dart';
+import 'package:mohem_flutter_app/models/mowadhafhi/get_transaction_attachment_model.dart';
+
+class EtqanApiClient {
+ static final EtqanApiClient _instance = EtqanApiClient._internal();
+
+ EtqanApiClient._internal();
+
+ factory EtqanApiClient() => _instance;
+
+ Future> getEtqanProjects() async {
+ String url = "${ApiConsts.cocRest}ETQAN_GetProjects";
+ Map postParams = {"P_SELECTED_EMPLOYEE_NUMBER": AppState().memberInformationList?.eMPLOYEENUMBER};
+ postParams.addAll(AppState().postParamsJson);
+ return await ApiClient().postJsonForObject(
+ (json) {
+ List? responseData = [];
+ if (json["ETQAN_GetProjects_Response"] != null && json["ETQAN_GetProjects_Response"].isNotEmpty) {
+ json["ETQAN_GetProjects_Response"].forEach((element) {
+ responseData.add(EtqanGetProjectsResponse.fromJson(element));
+ });
+ }
+ return responseData;
+ },
+ url,
+ postParams,
+ );
+ }
+
+ Future> getEmployeeEtqanRequests() async {
+ String url = "${ApiConsts.cocRest}ETQAN_GetEmployeeOVRRequests";
+ Map postParams = {
+ "ETQAN_EmployeeID": AppState().memberInformationList?.eMPLOYEENUMBER,
+ "P_SELECTED_EMPLOYEE_NUMBER": AppState().memberInformationList?.eMPLOYEENUMBER,
+ };
+ postParams.addAll(AppState().postParamsJson);
+ return await ApiClient().postJsonForObject(
+ (json) {
+ List responseData = [];
+ if (json["ETQAN_GetEmployeeOVRRequests_Response"] != null && json["ETQAN_GetEmployeeOVRRequests_Response"].isNotEmpty) {
+ json["ETQAN_GetEmployeeOVRRequests_Response"].forEach((element) {
+ responseData.add(EtqanGetEmployeeOvrRequestsResponse.fromJson(element));
+ });
+ }
+
+ if (responseData.isNotEmpty) {
+ responseData.sort((EtqanGetEmployeeOvrRequestsResponse a, EtqanGetEmployeeOvrRequestsResponse b) {
+ if (a.createdDate == null && b.createdDate == null) return 0;
+ if (a.createdDate == null) return 1;
+ if (b.createdDate == null) return -1;
+
+ try {
+ // Parse dates in format "26-Feb-2026 12:54 PM" or "01-Mar-2026 02:45 PM"
+ DateFormat dateFormat = DateFormat("dd-MMM-yyyy hh:mm a", "en_US");
+ DateTime dateA = dateFormat.parse(a.createdDate!);
+ DateTime dateB = dateFormat.parse(b.createdDate!);
+ return dateB.compareTo(dateA); // Descending order (newest first)
+ } catch (e) {
+ return (b.createdDate ?? '').compareTo(a.createdDate ?? '');
+ }
+ });
+ }
+ return responseData;
+ },
+ url,
+ postParams,
+ );
+ }
+
+ Future> getEtqanIncidentRequests(String ticketNo) async {
+ String url = "${ApiConsts.cocRest}ETQAN_GetIncidentRequest";
+ Map postParams = {"ETQAN_TicketNumber": ticketNo, "P_SELECTED_EMPLOYEE_NUMBER": AppState().memberInformationList?.eMPLOYEENUMBER};
+ postParams.addAll(AppState().postParamsJson);
+ return await ApiClient().postJsonForObject(
+ (json) {
+ List responseData = [];
+ if (json["ETQAN_GetIncidentRequest_Response"] != null && json["ETQAN_GetIncidentRequest_Response"].isNotEmpty) {
+ json["ETQAN_GetIncidentRequest_Response"].forEach((element) {
+ responseData.add(EtqanGetIncidentRequestResponse.fromJson(element));
+ });
+ }
+ return responseData;
+ },
+ url,
+ postParams,
+ );
+ }
+
+ Future