diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json
index 5eb2c59..f09dfb4 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": "أكتب تعليقا",
@@ -655,6 +657,18 @@
"pullToRefresh": "اسحب للتحديث",
"courseUrlNotAvailable": "رابط الدورة غير متوفر",
"buyerDetails": "تفاصيل المشتري",
+ "etqanOVR": "الإبلاغ عن حادثة",
+ "etqanRequest": "طلبات الحوادث",
+ "selectProject": "حدد المشروع",
+ "project": "مشروع",
+ "keen": "حريص",
+ "reportIncident": "الإبلاغ عن الحادث",
+ "myIncidents": "حوادثي",
+ "incidentDetails": "تفاصيل الحادث",
+ "ticketNumber": "رقم التذكرة",
+ "ticketId": "معرف التذكرة",
+ "pleaseSelectProject": "الرجاء اختيار مشروع",
+ "viewAttachment" : "عرض المرفق",
"parkingQr": "وقوف السيارات QR"
}
diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json
index faa29f1..216fe85 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",
@@ -653,5 +655,17 @@
"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"
}
\ No newline at end of file
diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist
index 01197de..51a5801 100644
--- a/ios/Runner/Info.plist
+++ b/ios/Runner/Info.plist
@@ -61,6 +61,8 @@
This app requires photo library access to select image as document & upload it.
UIApplicationSupportsIndirectInputEvents
+ 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 cd8abee..27fe289 100644
--- a/lib/api/dashboard_api_client.dart
+++ b/lib/api/dashboard_api_client.dart
@@ -231,7 +231,8 @@ class DashboardApiClient {
// 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'));
+ 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);
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