diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 6477dfd..fa67bbc 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -4,6 +4,7 @@
+
diff --git a/android/app/src/main/res/xml/filepaths.xml b/android/app/src/main/res/xml/filepaths.xml
index 087acc2..4da92b3 100644
--- a/android/app/src/main/res/xml/filepaths.xml
+++ b/android/app/src/main/res/xml/filepaths.xml
@@ -4,5 +4,5 @@
-
+
\ No newline at end of file
diff --git a/android/app/src/main/res/xml/network_security_config.xml b/android/app/src/main/res/xml/network_security_config.xml
index f18e1f0..a3e396e 100644
--- a/android/app/src/main/res/xml/network_security_config.xml
+++ b/android/app/src/main/res/xml/network_security_config.xml
@@ -1,6 +1,6 @@
-
+
diff --git a/android/build.gradle b/android/build.gradle
index 284d720..f6a880c 100644
--- a/android/build.gradle
+++ b/android/build.gradle
@@ -66,6 +66,20 @@ allprojects {
jvmTarget = "21"
}
}
+
+ if (project.name == 'nfc_manager') {
+ project.tasks.matching { it.name.startsWith("compile") && it.name.endsWith("Kotlin") }.configureEach {
+ doFirst {
+ def translatorFile = project.file("src/main/kotlin/io/flutter/plugins/nfcmanager/Translator.kt")
+ if (translatorFile.exists()) {
+ def content = translatorFile.text
+ if (content.contains("toLowerCase(Locale.ROOT)")) {
+ translatorFile.text = content.replace("toLowerCase(Locale.ROOT)", "lowercase(Locale.ROOT)")
+ }
+ }
+ }
+ }
+ }
}
}
}
diff --git a/assets/icons/duration.svg b/assets/icons/duration.svg
new file mode 100644
index 0000000..ba3daa0
--- /dev/null
+++ b/assets/icons/duration.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/icons/filter_icon.svg b/assets/icons/filter_icon.svg
new file mode 100644
index 0000000..72042c3
--- /dev/null
+++ b/assets/icons/filter_icon.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/icons/ic_add_dependents.png b/assets/icons/ic_add_dependents.png
new file mode 100644
index 0000000..81fd3dd
Binary files /dev/null and b/assets/icons/ic_add_dependents.png differ
diff --git a/assets/icons/ic_category_check.png b/assets/icons/ic_category_check.png
new file mode 100644
index 0000000..94de67b
Binary files /dev/null and b/assets/icons/ic_category_check.png differ
diff --git a/assets/icons/ic_dependents_top.svg b/assets/icons/ic_dependents_top.svg
new file mode 100644
index 0000000..54d92d1
--- /dev/null
+++ b/assets/icons/ic_dependents_top.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/icons/location.svg b/assets/icons/location.svg
new file mode 100644
index 0000000..355aca8
--- /dev/null
+++ b/assets/icons/location.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/icons/mazaya_arrow_right.svg b/assets/icons/mazaya_arrow_right.svg
new file mode 100644
index 0000000..626286f
--- /dev/null
+++ b/assets/icons/mazaya_arrow_right.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/icons/mazaya_arrow_up_right.svg b/assets/icons/mazaya_arrow_up_right.svg
new file mode 100644
index 0000000..d19638c
--- /dev/null
+++ b/assets/icons/mazaya_arrow_up_right.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/icons/mazaya_chevron_down.svg b/assets/icons/mazaya_chevron_down.svg
new file mode 100644
index 0000000..229787c
--- /dev/null
+++ b/assets/icons/mazaya_chevron_down.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/icons/mazaya_chevron_left.svg b/assets/icons/mazaya_chevron_left.svg
new file mode 100644
index 0000000..43a844e
--- /dev/null
+++ b/assets/icons/mazaya_chevron_left.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/icons/mazaya_compass.svg b/assets/icons/mazaya_compass.svg
new file mode 100644
index 0000000..804a26b
--- /dev/null
+++ b/assets/icons/mazaya_compass.svg
@@ -0,0 +1,10 @@
+
diff --git a/assets/icons/mazaya_heart.svg b/assets/icons/mazaya_heart.svg
new file mode 100644
index 0000000..d8d9d21
--- /dev/null
+++ b/assets/icons/mazaya_heart.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/icons/mazaya_heart_outline.svg b/assets/icons/mazaya_heart_outline.svg
new file mode 100644
index 0000000..3d2bd2d
--- /dev/null
+++ b/assets/icons/mazaya_heart_outline.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/icons/mazaya_logo_horizontal.svg b/assets/icons/mazaya_logo_horizontal.svg
new file mode 100644
index 0000000..081ebfa
--- /dev/null
+++ b/assets/icons/mazaya_logo_horizontal.svg
@@ -0,0 +1,37 @@
+
+
\ No newline at end of file
diff --git a/assets/icons/mazaya_logo_vertical.svg b/assets/icons/mazaya_logo_vertical.svg
new file mode 100644
index 0000000..6d89751
--- /dev/null
+++ b/assets/icons/mazaya_logo_vertical.svg
@@ -0,0 +1,45 @@
+
+
\ No newline at end of file
diff --git a/assets/icons/mazaya_map_pin.svg b/assets/icons/mazaya_map_pin.svg
new file mode 100644
index 0000000..87e573f
--- /dev/null
+++ b/assets/icons/mazaya_map_pin.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/icons/mazaya_search.svg b/assets/icons/mazaya_search.svg
new file mode 100644
index 0000000..65b5a58
--- /dev/null
+++ b/assets/icons/mazaya_search.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/icons/mazaya_user_round.svg b/assets/icons/mazaya_user_round.svg
new file mode 100644
index 0000000..a8619b4
--- /dev/null
+++ b/assets/icons/mazaya_user_round.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/icons/store.svg b/assets/icons/store.svg
new file mode 100644
index 0000000..5cd8fdb
--- /dev/null
+++ b/assets/icons/store.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/images/banner_arabic.svg b/assets/images/banner_arabic.svg
new file mode 100644
index 0000000..d7e8264
--- /dev/null
+++ b/assets/images/banner_arabic.svg
@@ -0,0 +1,58 @@
+
+
\ No newline at end of file
diff --git a/assets/images/banner_english.svg b/assets/images/banner_english.svg
new file mode 100644
index 0000000..8a8f058
--- /dev/null
+++ b/assets/images/banner_english.svg
@@ -0,0 +1,56 @@
+
+
\ No newline at end of file
diff --git a/assets/images/cat_all.png b/assets/images/cat_all.png
new file mode 100644
index 0000000..3bc5554
Binary files /dev/null and b/assets/images/cat_all.png differ
diff --git a/assets/images/cat_fitness.png b/assets/images/cat_fitness.png
new file mode 100644
index 0000000..e080708
Binary files /dev/null and b/assets/images/cat_fitness.png differ
diff --git a/assets/images/cat_food.png b/assets/images/cat_food.png
new file mode 100644
index 0000000..a70fc4d
Binary files /dev/null and b/assets/images/cat_food.png differ
diff --git a/assets/images/cat_retail.png b/assets/images/cat_retail.png
new file mode 100644
index 0000000..59a2f0d
Binary files /dev/null and b/assets/images/cat_retail.png differ
diff --git a/assets/images/logos/hmg_mohem_logo.png b/assets/images/logos/hmg_mohem_logo.png
new file mode 100644
index 0000000..4b8870e
Binary files /dev/null and b/assets/images/logos/hmg_mohem_logo.png differ
diff --git a/assets/images/logos/mohem_logo.png b/assets/images/logos/mohem_logo.png
new file mode 100644
index 0000000..4745144
Binary files /dev/null and b/assets/images/logos/mohem_logo.png differ
diff --git a/assets/images/mazaya.png b/assets/images/mazaya.png
new file mode 100644
index 0000000..b750724
Binary files /dev/null and b/assets/images/mazaya.png differ
diff --git a/assets/images/mazaya_banner.svg b/assets/images/mazaya_banner.svg
new file mode 100644
index 0000000..8a8f058
--- /dev/null
+++ b/assets/images/mazaya_banner.svg
@@ -0,0 +1,56 @@
+
+
\ No newline at end of file
diff --git a/assets/images/mazaya_banner_ar.svg b/assets/images/mazaya_banner_ar.svg
new file mode 100644
index 0000000..d7e8264
--- /dev/null
+++ b/assets/images/mazaya_banner_ar.svg
@@ -0,0 +1,58 @@
+
+
\ No newline at end of file
diff --git a/assets/images/mazaya_banner_en.svg b/assets/images/mazaya_banner_en.svg
new file mode 100644
index 0000000..8a8f058
--- /dev/null
+++ b/assets/images/mazaya_banner_en.svg
@@ -0,0 +1,56 @@
+
+
\ No newline at end of file
diff --git a/assets/images/mohem.png b/assets/images/mohem.png
new file mode 100644
index 0000000..8997e7c
Binary files /dev/null and b/assets/images/mohem.png differ
diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json
index eebe449..b567229 100644
--- a/assets/langs/ar-SA.json
+++ b/assets/langs/ar-SA.json
@@ -1,47 +1,47 @@
{
- "mohemm": "Mohemm",
+ "mohemm": "MoheM",
"english": "English",
"arabic": "عربي",
"login": "تسجيل الدخول",
"pleaseEnterLoginDetails": "الرجاء إدخال التفاصيل أدناه لتسجيل الدخول",
- "userId": "UserID",
+ "userId": "معرّف المستخدم",
"username": "اسم المستخدم",
"userName": "اسم المستخدم",
- "userSearch": "User Search",
+ "userSearch": "البحث عن مستخدم",
"password": "كلمة المرور",
"welcomeBack": "مرحبا بعودتك",
"wouldYouLikeToLoginWithCurrentUsername": "هل ترغب في تسجيل الدخول باسم المستخدم الحالي؟",
"lastLoginDetails": "تفاصيل تسجيل الدخول الأخير:",
"verificationType": "نوع التحقق:",
- "pleaseVerify": "ارجوك تحقق",
+ "pleaseVerify": "يرجى التحقق",
"pleaseVerifyForBio": "الرجاء التحقق من تسجيل الدخول باستخدام أحد هذه الخيارات",
- "verifyThroughFace": "تحقق من خلال الوجه",
- "verifyThroughFingerprint": "تحقق من خلال بصمة الإصبع",
- "verifyThroughSMS": "تحقق من خلال الرسائل القصيرة",
- "verifyThroughWhatsapp": "تحقق من خلال Whatsapp",
+ "verifyThroughFace": "التحقق بالتعرف على الوجه",
+ "verifyThroughFingerprint": "التحقق ببصمة الإصبع",
+ "verifyThroughSMS": "التحقق عبر رسالة نصية",
+ "verifyThroughWhatsapp": "التحقق عبر واتساب",
"useAnotherAccount": "استخدم حسابا آخر",
"pleaseEnterTheVerificationCodeSentTo": "الرجاء إدخال رمز التحقق المرسل إلى ",
"theVerificationCodeWillExpireIn": "ستنتهي صلاحية رمز التحقق في ",
"goodMorning": "صباح الخير",
- "markAttendance": "علامة الحضور",
+ "markAttendance": "تسجيل الحضور",
"timeLeftToday": "الوقت المتبقي اليوم",
- "checkIn": "تحقق في",
+ "checkIn": "تسجيل الحضور",
"workList": "قائمة العمل",
- "leaveBalance": "رصيد الاجازات",
- "missingSwipes": "تسجيل بصمة حضور",
- "ticketBalance": "رصيد التذكرة",
+ "leaveBalance": "رصيد الإجازات",
+ "missingSwipes": "البصمات المفقودة",
+ "ticketBalance": "رصيد التذاكر",
"other": "آخر",
"services": "خدمات",
"viewAllServices": "عرض جميع الخدمات",
"monthlyAttendance": "الحضور الشهري",
- "vacationRule": "قاعدة الاجازات",
- "vacationType": "نوع الاجازة",
+ "vacationRule": "قواعد الإجازات",
+ "vacationType": "نوع الإجازة",
"startDateT": "تاريخ البدء",
"endDateT": "تاريخ الانتهاء",
"workFromHome": "العمل من المنزل",
"ticketRequest": "طلب تذكرة",
"viewAllOffers": "مشاهدة جميع العروض",
- "offers": "عروض & ",
+ "offers": "العروض و",
"discounts": "الخصومات",
"newString": "جديد",
"setTheNewPassword": "قم بتعيين كلمة المرور الجديدة",
@@ -53,115 +53,115 @@
"home": "الرئيسية",
"mySalary": "راتبي",
"createRequest": "إنشاء طلب",
- "forgotPassword": "هل نسيت كلمة السر",
- "employeeId": "هوية الموظف",
- "loginCodeWillSentToMobileNumber": "الرجاء إدخال معرف الموظف الخاص بك ، وسيتم إرسال رمز تسجيل الدخول إلى رقم هاتفك المحمول",
+ "forgotPassword": "هل نسيت كلمة المرور؟",
+ "employeeId": "الرقم الوظيفي",
+ "loginCodeWillSentToMobileNumber": "الرجاء إدخال رقم الموظف الخاص بك ، وسيتم إرسال رمز تسجيل الدخول إلى رقم هاتفك المسجل",
"changePassword": "تغيير كلمة المرور",
"ok": "موافق",
- "confirm": "تؤكد",
- "passwordChangedSuccessfully": "تم تغيير الرقم السري بنجاح",
+ "confirm": "تأكيد",
+ "passwordChangedSuccessfully": "تم تغيير كلمة المرور بنجاح",
"itemsForSale": "سلع للبيع",
"attendanceDetails": "تفاصيل الحضور",
"order": "الطلبات",
- "earlyOut": "الخروج مبكرا",
- "shortage": "ساعات التقصير",
- "excess": "فائض",
- "lateIn": "القدوم المتاخر",
- "approvedCheckOut": "اعتماد وقت الخروج",
- "approvedCheckIn": "اعتماد وقت الدخول",
- "actualCheckOut": "وقت الخروج",
- "actualCheckIn": "وقت الدخول",
+ "earlyOut": "الانصراف المبكر",
+ "shortage": "ساعات غير مغطاة",
+ "excess": "ساعات العمل الإضافية",
+ "lateIn": "التأخر عن الحضور",
+ "approvedCheckOut": "وقت الانصراف المعتمد",
+ "approvedCheckIn": "وقت الحضور المعتمد",
+ "actualCheckOut": "وقت الانصراف الفعلي",
+ "actualCheckIn": "وقت الحضور الفعلي",
"present": "حضور",
"pres": "حضور",
- "shiftTime": "وقت التناوب",
+ "shiftTime": "وقت المناوبة",
"absent": "غياب",
"attendance": "الحضور",
- "scheduleDays": "ايام العمل",
- "offDays": "ايام الراحه",
- "nonAnalyzed": "لايوجد تحليل",
- "shortageHour": "ساعات التقصير",
- "stats": "الحاله",
- "completed": "تم اكمال",
- "msg": "Hello {} in the {} world ",
- "msg_named": "{} are written in the {lang} language",
- "clickMe": "Click me",
- "doNotUseRecentPassword": "لا تستخدم كلمة مرور حديثة",
+ "scheduleDays": "أيام العمل",
+ "offDays": "أيام الراحة",
+ "nonAnalyzed": "لم يتم التحليل",
+ "shortageHour": "ساعات غير مغطاة",
+ "stats": "الإحصاءات",
+ "completed": "مكتمل",
+ "msg": "مرحبًا {} في عالم {}",
+ "msg_named": "{} مكتوبة بلغة {lang}",
+ "clickMe": "اضغط هنا",
+ "doNotUseRecentPassword": "لا تستخدم كلمة مرور سبق استخدامها مؤخرًا",
"atLeastOneLowercase": "حرف صغير واحد على الأقل",
"atLeastOneUppercase": "حرف كبير واحد على الأقل",
"atLeastOneNumeric": "رقم واحد على الأقل",
"minimum8Characters": "8 أحرف على الأقل",
"doNotAddRepeatingLetters": "لا تقم بإضافة أحرف متكررة",
- "itShouldContainSpecialCharacter": "يجب لا يحتوي على أحرف خاصة",
- "confirmPasswordMustMatch": "يجب أن يتطابق تأكيد كلمة المرور",
+ "itShouldContainSpecialCharacter": "يجب أن تحتوي كلمة المرور على رمز خاص",
+ "confirmPasswordMustMatch": "يجب أن تتطابق كلمتا المرور",
"sms": "رسالة قصيرة",
"fingerPrint": "بصمة",
"face": "التعرف على الوجه",
"whatsapp": "واتس اب",
- "reject": "يرفض",
- "approve": "يوافق",
+ "reject": "رفض",
+ "approve": "موافقة",
"cancel": "إلغاء",
- "generate": "يولد",
+ "generate": "إنشاء",
"requestedItems": "العناصر المطلوبة",
"request": "طلب",
- "myRequest": "طلبي",
- "actions": "أجراءات",
- "delegate": "مندوب",
- "request_info": "اطلب معلومات",
+ "myRequest": "طلباتي",
+ "actions": "الإجراءات",
+ "delegate": "تفويض",
+ "request_info": "طلب معلومات إضافية",
"attachments": "المرفقات",
"info": "معلومات",
"employeeNumber": "رقم الموظف",
- "assignmentNumber": "رقم الواجب",
+ "assignmentNumber": "رقم التكليف",
"employeeName": "اسم الموظف",
- "scheduleDate": "تاريخ الجدول الزمني",
- "shiftType": "نوع التحول",
- "shift": "يحول",
+ "scheduleDate": "تاريخ الجدول",
+ "shiftType": "نوع المناوبة",
+ "shift": " المناوبة",
"breakText": "استراحة",
- "actualSwipeStart": "بدء التمرير الفعلي",
- "actualSwipeEnd": "التمرير الفعلي للنهاية",
- "approvedSwipeStart": "وافق انتقاد البدء",
- "approvedSwipeStartReason": "تمت الموافقة على سبب بدء التمرير السريع",
- "approvedSwipeEnd": "تمت الموافقة على تمرير النهاية",
- "approvedSwipeEndReason": "الموافقة على سبب إنهاء التمرير",
+ "actualSwipeStart": "وقت تسجيل الحضور",
+ "actualSwipeEnd": "وقت تسجيل المغادرة",
+ "approvedSwipeStart": "وقت الحضور المعتمد",
+ "approvedSwipeStartReason": "سبب تعديل وقت الحضور المعتمد",
+ "approvedSwipeEnd": "وقت الانصراف المعتمد",
+ "approvedSwipeEndReason": "سبب تعديل وقت الانصراف المعتمد",
"from": "من",
- "to": "ل",
- "sent": "أرسلت",
+ "to": "إلى",
+ "sent": "تم الإرسال",
"closed": "مغلق",
- "id": "هوية شخصية",
+ "id": "المعرّف",
"responder": "المستجيب",
- "jobTitle": "عنوان وظيفي",
- "grade": "درجة",
+ "jobTitle": "المسمى الوظيفي",
+ "grade": "الدرجة الوظيفية",
"jobCategory": "تصنيف الوظيفة",
"category": "فئة",
"employeeEmailAddress": "عنوان البريد الإلكتروني للموظف",
"payrollBranch": "فرع الرواتب",
"yourChangeHasBeenSavedSuccessfully": "تم حفظ التغيير الخاص بك بنجاح",
- "code": "شفرة",
+ "code": "الرمز",
"unit": "وحدة",
"quantity": "كمية",
- "dateRequired": "التاريخ مطلوب",
- "lineStatus": "حالة الخط",
+ "dateRequired": "التاريخ المطلوب",
+ "lineStatus": "حالة البند",
"statusDate": "تاريخ الحالة",
"transactionType": "نوع المعاملة",
- "operatingUnit": "وحدة التشغيل",
- "organizationCode": "كود المنظمة",
- "organization": "منظمة",
- "fromSubInventory": "من الجرد الفرعي",
- "fromLocator": "من محدد المواقع",
- "toSubInventory": "إلى الجرد الفرعي",
- "toLocator": "إلى محدد المواقع",
- "shipToLocator": "شحن إلى محدد المواقع",
- "itemHistory": "تاريخ العنصر",
- "mfg": "مبدع",
- "lineType": "نوع الخط",
+ "operatingUnit": "الوحدة التشغيلية",
+ "organizationCode": "رمز المنشأة",
+ "organization": "المنشأة",
+ "fromSubInventory": "من المخزون الفرعي",
+ "fromLocator": "من موقع التخزين",
+ "toSubInventory": "إلى المخزون الفرعي",
+ "toLocator": "إلى موقع التخزين",
+ "shipToLocator": "موقع التخزين المستلم",
+ "itemHistory": "سجل الصنف",
+ "mfg": "الشركة المصنّعة",
+ "lineType": "نوع البند",
"price": "السعر",
- "lineAmount": "مبلغ الخط",
- "lineDiscount": "خصم الخط٪",
- "needByDate": "القادمة إلى الأمام",
- "promisedDate": "التسجيل وعد",
+ "lineAmount": "قيمة البند",
+ "lineDiscount": "خصم البند (%)",
+ "needByDate": "تاريخ الحاجة",
+ "promisedDate": "تاريخ التسليم المتعهد به",
"deliverToLocation": "تسليم إلى الموقع",
"requisitionNumber": "رقم الطلب",
"requester": "مقدم الطلب",
- "quotationAnalysis": "تحليل الاقتباس",
+ "quotationAnalysis": "تحليل عروض الأسعار",
"subject": "موضوعات",
"description": "وصف",
"pleaseEnterDescription": "الرجاء إدخال الوصف",
@@ -171,65 +171,65 @@
"preparer": "معد",
"creationDate": "تاريخ الإنشاء",
"shipToLocation": "الشحن الى الموقع",
- "quotationNumber": "رقم الإقتباس",
- "quotationDate": "تاريخ الاقتباس",
+ "quotationNumber": "رقم عرض السعر",
+ "quotationDate": "تاريخ عرض السعر",
"paymentTerms": "شروط الدفع",
"currency": "عملة",
- "grossAmount": "المبلغ الإجمالي",
- "discountAmount": "مقدار الخصم",
+ "grossAmount": "إجمالي المبلغ",
+ "discountAmount": "مبلغ الخصم",
"customDuty": "الرسوم الجمركية",
- "shipHandle": "مقبض السفينة",
+ "shipHandle": "رسوم الشحن والمناولة",
"otherCharges": "رسوم أخرى",
"totalPOAmountWithVAT": "إجمالي مبلغ الشراء مع ضريبة القيمة المضافة",
- "totalPOAmountInWords": "إجمالي مبلغ أمر الشراء بالكلمات",
+ "totalPOAmountInWords": "إجمالي قيمة أمر الشراء كتابةً",
"requestNumber": "رقم الطلب",
- "uom": "UOM",
+ "uom": "وحدة القياس",
"operatingCode": "كود التشغيل",
- "poNumber": "PO عدد",
+ "poNumber": "رقم أمر الشراء",
"revision": "مراجعة",
"quantityOrdered": "الكمية المطلوبة",
"quantityReceived": "الكمية المستلمة",
- "bonusQuantity": "كمية المكافأة",
+ "bonusQuantity": "الكمية المجانية",
"purchasePrice": "سعر الشراء",
"discountPer": "خصم ٪",
- "balanceQuantity": "كمية التوازن",
+ "balanceQuantity": "الكمية المتبقية",
"netPrice": "السعر الصافي",
"closureStatus": "حالة الإغلاق",
- "quotationNetPrice": "صافي سعر الاقتباس",
- "quotationUOM": "اقتباس UOM",
- "quotationQty": "اقتباس الكمية",
+ "quotationNetPrice": "صافي سعر عرض السعر",
+ "quotationUOM": "وحدة القياس في عرض السعر",
+ "quotationQty": "الكمية في عرض السعر",
"itemCode": "رمز الصنف",
"vendorName": "اسم البائع",
- "quotationMFGPartNumber": "رقم الجزء MFG الاقتباس",
+ "quotationMFGPartNumber": "رقم قطعة الشركة المصنّعة في عرض السعر",
"quotationDeliveryDate": "تاريخ تسليم عرض الأسعار",
- "quotationBonusQuantity": "كمية مكافأة الاقتباس",
- "quotationLineTotal": "مجموع خط الاقتباس",
- "rfqUOM": "RFQ UOM",
- "rfqQty": "RFQ الكمية",
- "rfqNumber": "رقم RFQ",
- "human": "بشري",
- "resources": "موارد",
+ "quotationBonusQuantity": "الكمية المجانية في عرض السعر",
+ "quotationLineTotal": "إجمالي بند عرض السعر",
+ "rfqUOM": "وحدة القياس لطلب عرض السعر",
+ "rfqQty": "الكمية المطلوبة لعرض السعر",
+ "rfqNumber": "رقم طلب عرض السعر",
+ "human": "الموارد",
+ "resources": "البشرية",
"details": "تفاصيل",
"noDataAvailable": "لا تتوافر بيانات",
"productName": "اسم المنتج",
"productDescription": "وصف المنتج",
- "unitPrice": "سعر الوحده",
+ "unitPrice": "سعر الوحدة",
"manufacturerName": "اسم المصنع",
- "manufacturerPartName": "اسم جزء الشركة المصنعة",
+ "manufacturerPartName": "اسم قطعة الشركة المصنّعة",
"supplierName": "اسم المورد",
- "supplierContact": "الاتصال بالمورد",
- "chargeToPatient": "المسؤول عن المريض",
+ "supplierContact": "بيانات التواصل مع المورد",
+ "chargeToPatient": "يُحمّل على حساب المريض",
"justification": "التبرير",
"itemDescription": "وصف السلعة",
"groupCode": "كود المجموعة",
- "primaryUOM": "UOM الابتدائية",
+ "primaryUOM": "وحدة القياس الأساسية",
"subgroupDescription": "وصف المجموعة الفرعية",
"subgroupCode": "رمز المجموعة الفرعية",
"groupDescription": "وصف المجموعة",
"templateName": "اسم القالب",
- "itemCreationStatus": "حالة إنشاء العنصر",
- "standardizationApprovalStatus": "حالة الموافقة على التقييس",
- "standardizationApprovalRejectionReason": "سبب رفض الموافقة على التقييس",
+ "itemCreationStatus": "حالة إنشاء الصنف",
+ "standardizationApprovalStatus": "حالة اعتماد التوحيد القياسي",
+ "standardizationApprovalRejectionReason": "سبب رفض اعتماد التوحيد القياسي",
"analyzedBy": "تحليل بواسطة",
"approvedDate": "تاريخ الموافقة",
"itemType": "نوع العنصر",
@@ -237,38 +237,38 @@
"requestDate": "تاريخ الطلب",
"analyzedDate": "تاريخ التحليل",
"urgent": "العاجلة",
- "requestDetails": "طلب تفاصيل",
+ "requestDetails": "تفاصيل الطلب",
"approvalLevel": "مستوى الموافقة",
"requesterDetails": "تفاصيل مقدم الطلب",
"myAttendance": "حضوري",
- "workOnBreak": "التعويض عن العمل اثناءالاستراحه",
+ "workOnBreak": "التعويض عن العمل أثناء الاستراحة",
"next": "التالي",
- "apply": "يتقدم",
- "mobile": "التليفون المحمول",
- "completingYear": "نحن نقدر لك لاستكمال خدمة",
+ "apply": "تقديم الطلب",
+ "mobile": "الجوال",
+ "completingYear": "نقدّر لك إتمام مدة خدمة",
"year": "سنة",
"month": "شهر",
"day": "يوم",
"address": "العنوان",
"phoneNumber": "رقم الجوال",
"businessGroup": "مجموعة العمل",
- "Payroll": "الراتب",
+ "Payroll": "الرواتب",
"civilIdentityNumber": "رقم الهويه",
"dateOfBirth": "تاريخ الميلاد",
"maritalStatus ": "الحالة الاجتماعية",
- "fullName": "الأسم الكامل",
+ "fullName": "الاسم الكامل",
"remove": "حذف",
- "submit": "ارسال",
- "submitAsAnonymous": "إرسال كمجهول",
- "areYouSureYouWantToSubmit": "هل أنت متأكد أنك تريد أن تقدم؟",
+ "submit": "إرسال",
+ "submitAsAnonymous": "إرسال دون الإفصاح عن الهوية",
+ "areYouSureYouWantToSubmit": "هل أنت متأكد من إرسال الطلب؟",
"comments": "تعليقات",
"writeComment": "أكتب تعليقا",
- "approversList": "قائمة الموافقين",
- "yourRequestHasBeenSubmittedForApprovals": "تم تقديم طلبك للموافقات",
+ "approversList": "قائمة المعتمدين",
+ "yourRequestHasBeenSubmittedForApprovals": "تم إرسال طلبك للاعتماد",
"monthlyPaySlip": "قسيمة الراتب الشهرية",
- "particular": "خاص",
- "earnings": "أرباح",
- "deductions": "الخصومات",
+ "particular": "البيان",
+ "earnings": "المستحقات",
+ "deductions": "الاستقطاعات",
"paymentMethodName": "اسم طريقة الدفع",
"bankName": "اسم البنك",
"branchCode": "رمز الفرع",
@@ -276,28 +276,28 @@
"summaryOfInformation": "ملخص المعلومات",
"totalPayAmount": "المبلغ الإجمالي للدفع",
"paymentInformation": "معلومات الدفع",
- "performance": "تقييم الاداء",
+ "performance": "تقييم الأداء",
"performanceEvaluation": "تقييم الأداء في",
"performanceEvaluationIn": "تقييم أدائك في",
"valuationIn": "تقييم الأداء في",
- "amount": "مقدار",
- "correctCurrentDatails": "تعديل او اكمال التفاصيل الحالية",
+ "amount": "المبلغ",
+ "correctCurrentDatails": "تصحيح البيانات الحالية أو استكمالها",
"selectType": " حدد نوع التغيير الذي تريد القيام به",
"enterNewInfo": " أدخل معلومات جديدة بسبب تغيير حقيقي في التفاصيل الحالية (على سبيل المثال بسبب تغيير في الحالة الاجتماعية",
"endDate": "تاريخ الانتهاء",
- "removeThisMember": "هل انت متأكد تريد ازالة هذا العضو؟",
- "wantUpdateThisMember ": "هل انت متأكد تريد تحديث بيانات هذا العضو؟",
+ "removeThisMember": "هل أنت متأكد من إزالة هذا الفرد؟",
+ "wantUpdateThisMember ": "هل أنت متأكد من تحديث بيانات هذا الفرد؟",
"addNewFamilyMember": "اضافة عضو جديد",
"addRow": "اضافة صف جديد",
"pleaseSelect": "الرجاء اختيار",
"delete": "حذف",
"edit": "تعديل",
"add": "اضافه",
- "myProfile": "معلوماتي",
+ "myProfile": "ملفي الشخصي",
"mowadhafhi": "موظفي",
- "searchAnnouncements": "بحث الاعلانات",
+ "searchAnnouncements": "البحث في الإعلانات",
"announcements": "اعلانات",
- "swipeRequest": "طلب تسجيل حضور",
+ "swipeRequest": "طلب تصحيح البصمة",
"serviceType": "نوع الخدمه",
"departmentName": "اسم القسم",
"selectDepartment": "اختر القسم",
@@ -307,47 +307,47 @@
"selectTopic": "اختر العنوان",
"supportingDocument": "ارفاق مستند",
"mowadhafhiRequest": "طلب موظفي",
- "ticketReference": "مرجع التذكره",
+ "ticketReference": "الرقم المرجعي للتذكرة",
"section": "القسم",
"topic": "العنوان",
- "actionBy": "الرد بواسطة",
- "pending": "معلق",
- "pendingTransactions": "المعاملات المعلقه",
+ "actionBy": "الإجراء بواسطة",
+ "pending": "قيد الانتظار",
+ "pendingTransactions": "المعاملات قيد الانتظار",
"selectRequestType": "الرجاء اختيار نوع الطلب",
"dateFrom": "من تاريخ",
"dateTo": "الى تاريخ",
"requestName": "اسم الطلب",
- "createdFor": "انشاء لأجل",
+ "createdFor": "تم الإنشاء لصالح",
"requestCreatedSuccessfully": "تم انشاء الطلب بنجاح",
"search": "بحث",
"filterEnterPrDetailsHere": "ادخل تفاصيل طلب الشراء هنا",
"filterEnterPoDetailsHere": "ادخل تفاصيل أمر الشراء هنا",
- "wantToReject": "هل انت متأكد تريد الرفض",
+ "wantToReject": "هل أنت متأكد من رفض الطلب؟",
"requestType": "نوع الطلب",
- "employeeDigitalID": "هويةالموظف الرقمية",
+ "employeeDigitalID": "الهوية الرقمية للموظف",
"businessCard": "بطاقة العمل",
"viewBusinessCard": "عرض بطاقة العمل",
"logout": "تسجيل خروج",
- "checkOut": "وقت الخروج",
- "regular": "منتظم",
- "mark": "علامة",
+ "checkOut": "تسجيل الانصراف",
+ "regular": "اعتيادي",
+ "mark": "تسجيل",
"selectMethodOfAttendance": "اختر طريقة تسجيل الحضور",
- "comeNearHMGWifi": "HMG wifi من فضلك اقترب من",
+ "comeNearHMGWifi": "يرجى الاقتراب من شبكة Wi-Fi الخاصة بالمجموعة",
"deliverNotificationToMeRegardless": "تسليم الإخطارات إلي بغض النظر عن أي قواعد عامة",
"close": "أغلق",
- "respond": "يرد",
+ "respond": "رد",
"vacationRuleAdded": "تمت إضافة قاعدة الإجازة",
"selectTypeT": "اختر صنف",
"notification": "تنبيه",
"selectNotification": "حدد إعلام",
"ifAllSelectedYouWillSkip": "* إذا تم تحديد الكل ، فستنتقل إلى الخطوة 3",
- "applyForVacationRule": "التقدم بطلب للحصول على قانون الإجازة",
+ "applyForVacationRule": "طلب تطبيق قواعد الإجازات",
"step1": "الخطوة 1",
"step2": "الخطوة 2",
"step3": "الخطوه 3",
"message": "رسالة",
"writeAMessage": "اكتب رسالة",
- "notificationReassign": "إعادة تعيين الإخطار",
+ "notificationReassign": "إعادة توجيه الإشعار",
"selectEmployee": "حدد الموظف",
"searchEmployeeForReplacement": "ابحث عن موظف بديل",
"searchForEmployee": "ابحث عن موظف",
@@ -358,47 +358,47 @@
"pleaseSelectDate": "الرجاء تحديد التاريخ",
"todayAttendance": "حضور اليوم",
"viewAttendance": "عرض الحضور",
- "teamMembers": "اعضاءالفريق",
+ "teamMembers": "أعضاء الفريق",
"profileDetails": "الملف الشخصي",
- "noResultsFound": "لايوجد نتائج",
+ "noResultsFound": "لم يتم العثور على نتائج",
"searchBy": "بحث بواسطة",
- "myTeamMembers": "اعضاء فريقي",
+ "myTeamMembers": "أعضاء فريقي",
"save": "حفظ",
"TurnNotificationsFor": "تفعيل الاشعارات",
"worklistSettings": "اعدادات الاشعارات",
"absenceType": "نوع الغياب",
- "absenceCategory": "فئة الغياب",
+ "absenceCategory": "تصنيف الغياب",
"days": "أيام",
"hours": "ساعات",
- "approvalStatus": "حالة القبول",
+ "approvalStatus": "حالة الموافقة",
"absenceStatus": "حالة الغياب",
- "subordinateLeave": "إجازة التابعيين",
+ "subordinateLeave": "إجازات الموظفين التابعين",
"numberDays": "عدد الأيام",
- "poweredBy": "مشغل بواسطة",
- "cloudSolutions": "حلول السحابة",
+ "poweredBy": "بدعم من",
+ "cloudSolutions": "الحلول السحابية",
"selectTemplate": "حدد قالب",
"myPostedAds": "إعلاناتي المنشورة",
"browseCategories": "تصفح الفئات",
"searchItems": "عناصر البحث",
"offerAndDiscounts": "العروض والخصومات",
- "offerValid": "العرض صالح",
+ "offerValid": "العرض ساري",
"offerExpired": "انتهى العرض",
"whatAreYouOffering": "ما الذي تعرضه؟",
"selectCategory": "اختر الفئة",
- "inProgress": "في تَقَدم",
+ "inProgress": "قيد التنفيذ",
"locked": "مقفل",
"addDetails": "أضف التفاصيل",
- "reviewAndSell": "مراجعة وبيع",
+ "reviewAndSell": "المراجعة والنشر للبيع",
"itemTitle": "عنوان البند",
"itemCondition": "حالة السلعة",
- "used": "تستخدم",
+ "used": "مستعمل",
"region": "منطقة",
"selectRegion": "اختر المنطقة",
"itemPrice": "سعر السلعة",
- "itemPhotos": "صور البند",
+ "itemPhotos": "صور السلعة",
"itemInfo": "معلومات العنصر",
"uploadAttachment": "تحميل المرفق",
- "selectFromGalleryOrOpenCamera": "اختر من المعرض أو فتح الكاميرا",
+ "selectFromGalleryOrOpenCamera": "اختر صورة من المعرض أو التقط صورة بالكاميرا",
"openCamera": "فتح\nالكاميرا",
"uploadFromGallery": "تحميل من\nملفات الجهاز",
"name": "الأسم",
@@ -406,22 +406,22 @@
"noHistoryAvailable": "لايوجد سجل بيانات سابقة ",
"purchaseRequisition": "طلب شراء",
"moveOrder": "طلب تغيير",
- "humanResource": "الموارد البشريه",
- "purchaseOrder": "امر شراء",
+ "humanResource": "الموارد البشرية",
+ "purchaseOrder": "أمر شراء",
"ITGForms": "ITG نماذج",
- "itemCreation": "أنشاء عنصر",
+ "itemCreation": "إنشاء صنف",
"stamp": "ختم",
"addFavoriteList": "هل تريد اضافة {name} لقائمة المفضله",
"feedbackUserExperience": "هذا للحصول على تعليقات حول تجربة المستخدم",
- "rateUI": "كيف تريد أن تقيم",
- "rateUI2": "ما مدى رضائك عن هذا التطبيق",
+ "rateUI": "كيف تقيّم واجهة التطبيق؟",
+ "rateUI2": "ما مدى رضاك عن هذا التطبيق؟",
"submitSurvey": "ارسال الاستبيان",
"typeHere": "اكتب هنا",
"infoDetail": "تفاصيل المعلومات",
"amount_detail": "تفاصيل المبلغ",
"currentBalance": "الرصيد الحالي",
- "currentLeaveBalance": "رصيد الاجازات الحالي",
- "calculatedDays": "الايام المحسوبه",
+ "currentLeaveBalance": "رصيد الإجازات الحالي",
+ "calculatedDays": "الأيام المحتسبة",
"totalDays": "مجموع الأيام",
"usedBalance": "المستخدم",
"infants": "رضيع",
@@ -439,18 +439,18 @@
"SelectChangeWantToMake": " حدد نوع التغيير الذي تريد القيام به.",
"profile": {
"reset_password": {
- "label": "Reset Password",
- "username": "Username",
- "password": "password"
+ "label": "إعادة تعيين كلمة المرور",
+ "username": "اسم المستخدم",
+ "password": "كلمة المرور"
},
"profileCompletionPer": "استكمال الملف الشخصي",
- "completeProfile": "الملف الشخصي الكامل",
+ "completeProfile": "استكمال الملف الشخصي",
"personalInformation": "معلومات شخصية",
"basicDetails": "تفاصيل أساسية",
"address": "العنوان",
"contactDetails": "بيانات التواصل",
"familyDetails": "تفاصيل عائلية",
- "effectiveDate": "تاريخ النفاذ",
+ "effectiveDate": "تاريخ سريان التغيير",
"country": "دولة"
},
"clicked": {
@@ -473,11 +473,11 @@
"chat": "دردشة",
"mychats": "دردشاتي",
"advancedSearch": "بحث متقدم",
- "openNot": "التبليغات المفتوحة",
- "fyi": "تبليغات للعلم",
- "toDo": "تبليغات الأعمال",
- "all": "كل التبليغات",
- "meNot": "تبليغات صادرة مني",
+ "openNot": "الإشعارات المفتوحة",
+ "fyi": "إشعارات للاطلاع",
+ "toDo": "إشعارات تتطلب إجراء",
+ "all": "جميع الإشعارات",
+ "meNot": "الإشعارات الصادرة مني",
"view": "عرض",
"fromUserName": "من",
"sentDate": "تاريخ الإرسال",
@@ -499,15 +499,15 @@
"demoMarathonNoteP3": "قبل الوقت الفعلي.",
"sponsoredBy": "برعاية:",
"question": "سؤال",
- "marathoners": "الماراثون",
- "marathoner": "ماراثونر",
+ "marathoners": "المشاركون في الماراثون",
+ "marathoner": "مشارك في الماراثون",
"prize": "جائزة:",
"winnerSelection": "اختيار الفائز",
"qualifiers": "تصفيات",
"qualifier": "المؤهل",
"getReadyForContest": "استعد للمسابقة القادمة:",
- "winnerSelectedRandomly": "سيتم اختيار الفائز عشوائياً من بين التصفيات.",
- "fingersCrossed": "تشابك الاصابع!!!",
+ "winnerSelectedRandomly": "سيتم اختيار الفائز عشوائيًا من بين المتأهلين.",
+ "fingersCrossed": "نتمنى لك التوفيق!",
"congrats": "مبروك !!!",
"allQuestionsCorrect": "لقد أجبت على جميع الأسئلة بشكل صحيح.",
"otp": "OTP",
@@ -526,19 +526,19 @@
"ourSponsor": "راعينا:",
"startingIn": "يبدأ في",
"youAreOutOfContest": "أنت خارج المسابقة.",
- "winners": "الفائزين!!!",
+ "winners": "الفائزون",
"expireAfter": "تنتهي بعد",
- "oneWeek": "أسبوع 1",
- "twoWeek": "2 أسبوع",
- "noUpcoming": "لا يوجد قادم",
- "fakeLocation": ".لقد تتبعنا أنك تحاول استخدام موقع مزيف! يعتبر هذا مخالفة وقد تم إخطار الموارد البشرية",
- "noWinner": "حزين! لم يفز أحد اليوم.",
+ "oneWeek": "أسبوع واحد",
+ "twoWeek": "أسبوعان",
+ "noUpcoming": "لا توجد مسابقات قادمة",
+ "fakeLocation": "تم رصد محاولة استخدام موقع جغرافي غير حقيقي. يُعد ذلك مخالفة، وقد تم إشعار إدارة الموارد البشرية.",
+ "noWinner": "لم يفز أحد اليوم.",
"myTeam": "فريقي",
"youCanPlayDemo": "لكن يمكنك لعب العرض",
"group": "مجموعة",
- "searchGroup": "مجموعة البحث",
+ "searchGroup": "البحث عن مجموعة",
"connectHmgWifi": "قم بتوصيل HMG WIFI",
- "connectedHmgWifi": "اتصال HMG WIFI",
+ "connectedHmgWifi": "متصل بشبكة HMG Wi-Fi",
"itgForms": "نماذج (ITG)",
"resetAdPassword": "إعادة تعيين كلمة مرور AD",
"myDocuments": "مستنداتي",
@@ -551,60 +551,66 @@
"addAtLeastOneAttachment": "الرجاء إضافة مرفق واحد على الأقل.",
"pleaseClickButtonToJoinMarathon": "الرجاء الضغط على الزر أدناه للانضمام إلى الماراثون",
"youCannotJoinTheMarathon": "لا يمكنك الانضمام إلى الماراثون لأنك تجاوزت الحد الزمني",
- "open": "يفتح",
- "youCannotJoinTheMarathon": "لا يمكنك الانضمام إلى الماراثون لأنك تجاوزت الحد الزمني",
- "pleaseClickButtonToJoinMarathon": "الرجاء الضغط على الزر أدناه للانضمام إلى الماراثون",
- "generate": "يولد",
+ "open": "فتح",
"paymentRequest": "طلب الدفع",
"paymentDetails": "تفاصيل الدفع",
"requestNo": "رقم الطلب",
"requesterEmpNum": "رقم الموظف الذي قدم الطلب",
"requesterEmpName": "اسم الموظف مقدم الطلب",
- "prepareEmpName": "إعداد اسم الموظف",
+ "prepareEmpName": "اسم الموظف المُعدّ للطلب",
"requesterPositionName": "اسم الوظيفة لمقدم الطلب",
- "preparePositionName": "إعداد اسم الوظيفة",
+ "preparePositionName": "المسمى الوظيفي لمُعدّ الطلب",
"requesterPayrollName": "اسم مقدم الطلب",
- "payingORGName": "اسم المنظمة الدافعة",
+ "payingORGName": "اسم الجهة الدافعة",
"requestAmount": "مبلغ الطلب",
"typeofPayment": "نوع الدفع",
"beneficiaryDetails": "تفاصيل المستفيد",
"beneficiaryName": "اسم المستفيد",
- "idIqama": "الهوية السعودية / الإقامة",
- "beneficiaryBankName": "اسم البنك المستفيد",
+ "idIqama": "رقم الهوية الوطنية أو الإقامة",
+ "beneficiaryBankName": "بنك المستفيد",
"sadadNumber": "رقم سداد",
"beneficiaryIBAN": "رقم IBAN للمستفيد",
- "purchaseOrders": "طلبات الشراء",
+ "purchaseOrders": "أوامر الشراء",
"approvalDate": "تاريخ الموافقة",
"pOAmount": "مبلغ الطلب",
"versionStatus": "حالة الإصدار",
"supplierNo": "رقم المورد",
"general": "عام",
"requesterOperatingUnit": "وحدة تشغيل مقدم الطلب",
- "prepareEmpNum": "إعداد رقم الموظف",
+ "prepareEmpNum": "الرقم الوظيفي لمُعدّ الطلب",
"supplierInfo": "معلومات المورد",
"supplierAcNo": "رقم حساب المورد",
"supplierAcName": "اسم حساب المورد",
"supplierIBAN": "رقم IBAN للمورد",
"supplierCRNo": "رقم السجل التجاري",
"suppliedAcNo": "رقم الحساب المقدم",
- "patientRefundInvoice": "فاتورة استرداد الأموال للمريض",
+ "patientRefundInvoice": "فاتورة استرداد مبلغ للمريض",
"patientNumber": "رقم المريض",
"patientName": "اسم المريض",
"invoiceDate": "تاريخ الفاتورة",
- "refundInvoice": "فاتورة الاسترجاع",
- "hospitalClinic": "عيادة المستشفى",
- "graphicalAnalysis": "التحليل الرسومي",
- "itemHistoryAnalysis": "تحليل تاريخ العنصر",
- "pOno": "امر شراء #",
+ "refundInvoice": "فاتورة الاسترداد",
+ "hospitalClinic": "المستشفى / العيادة",
+ "graphicalAnalysis": "التحليل البياني",
+ "itemHistoryAnalysis": "تحليل سجل الصنف",
+ "pOno": "رقم أمر الشراء",
"oprUnit": "وحدة التشغيل",
"qtyOrdered": "الكمية المطلوبة",
"qtyReceived": "الكمية المستلمة",
- "bonusQty": "كمية المكافأة",
- "balQty": "كمية التوازن",
+ "bonusQty": "الكمية المجانية",
+ "balQty": "الكمية المتبقية",
"videoCall": "مكالمة فيديو",
"addUsers": "إضافة مستخدمين إلى المجموعة",
"admin": "مشرف",
"areYouSureWantTodelete": "هل أنت متأكد أنك تريد الحذف؟",
+ "confirmGrantMazayaAccess": "هل أنت متأكد أنك تريد منح صلاحية مزايا لـ \"{}\"؟",
+ "confirmRevokeMazayaAccess": "هل أنت متأكد أنك تريد إلغاء صلاحية مزايا لـ \"{}\"؟",
+ "yes": "نعم",
+ "no": "لا",
+ "mazayaInviteInstructions": "يرجى تحميل تطبيق مهمم من الرابط أعلاه واستخدام بيانات الاعتماد التالية لتسجيل الدخول",
+ "cameraPermissionRequiredToScan": "يرجى منح صلاحية الكاميرا لمسح رمز الاستجابة السريعة",
+ "cameraPermissionPermanentlyDenied": "يرجى تفعيل صلاحية الكاميرا من إعدادات التطبيق > الصلاحيات",
+ "openSettings": "فتح الإعدادات",
+ "nationalIdOrIqamaFallback": "رقم الهوية الوطنية أو رقم الإقامة الخاص بك",
"Attendance": "الحضور",
"audioCall": "مكالمة صوتية",
"editGroups": "تعديل المجموعة",
@@ -618,38 +624,38 @@
"members": "الأعضاء",
"searchByUserName": "البحث بواسطة اسم المستخدم",
"shareScreen": "مشاركة الشاشة",
- "start": "يبدأ",
+ "start": "بدء",
"about": "عن",
- "explore": "يستكشف",
- "mazaya": "مازيا",
- "benefits": "فوائد",
+ "explore": "استكشاف",
+ "mazaya": "مزايا",
+ "benefits": "المزايا",
"mazayaDesc": "اكتشف الخصومات والعروض الخاصة المتاحة للموظفين",
- "viewallofferMazaya": "أعرض كل المزايا",
+ "viewallofferMazaya": "عرض جميع عروض مزايا",
"buyerName": "اسم المشتري",
"buyerNumber": "رقم المشتري",
"highestBidder": "أعلى مزايد",
"remarks": "ملاحظات",
- "faHeader": "تفاصيل رأس الصفحة FA",
- "bookTypeCode": "رمز نوع الكتاب",
+ "faHeader": "بيانات رأس طلب الأصول الثابتة",
+ "bookTypeCode": "رمز نوع الدفتر",
"categoryCode": "رمز الفئة",
"categoryGroup": "مجموعة الفئات",
"faLINES": "تفاصيل الأصول",
- "assetNumber": "رقم الأصول",
- "assetDescription": "وصف الأصول",
+ "assetNumber": "رقم الأصل",
+ "assetDescription": "وصف الأصل",
"barCodeNumber": "رقم الباركود",
"datePlaceInService": "تاريخ وضعه في الخدمة",
- "serialNumber": "رقم سري",
- "disposedDate": "تاريخ التخلص",
+ "serialNumber": "الرقم التسلسلي",
+ "disposedDate": "تاريخ الاستبعاد",
"netBookValue": "القيمة الدفترية الصافية",
"purchasedPrice": "سعر الشراء",
"usefulLife": "العمر الإنتاجي",
"yearsUsed": "سنوات الاستخدام",
- "faRequest": "طلب التخلص من FA",
+ "faRequest": "طلب استبعاد أصل ثابت",
"showMore": "عرض المزيد",
"ticketDetails": "تفاصيل التذكرة",
"currentTicketBalance": "رصيد التذكرة الحالي",
- "ticketHistory": "تاريخ التذكرة",
- "proceedBooking": "المتابعة للحجز",
+ "ticketHistory": "سجل التذاكر",
+ "proceedBooking": "المتابعة إلى الحجز",
"courses": "الدورات التدريبية",
"course": "دورة",
"status": "الحالة",
@@ -659,27 +665,217 @@
"pullToRefresh": "اسحب للتحديث",
"courseUrlNotAvailable": "رابط الدورة غير متوفر",
"buyerDetails": "تفاصيل المشتري",
- "etqanOVR": "الإبلاغ عن حادثة",
- "etqanRequest": "طلبات الحوادث",
+ "etqanOVR": "الإبلاغ عن واقعة",
+ "etqanRequest": "طلبات الإبلاغ عن الوقائع",
"selectProject": "حدد المشروع",
"project": "مشروع",
- "keen": "حريص",
+ "keen": "KEEN",
"reportIncident": "الإبلاغ عن الحادث",
"myIncidents": "حوادثي",
"incidentDetails": "تفاصيل الحادث",
"ticketNumber": "رقم التذكرة",
"ticketId": "معرف التذكرة",
- "pleaseSelectProject": "الرجاء اختيار مشروع",
- "viewAttachment" : "عرض المرفق",
- "parkingQr": "وقوف السيارات QR",
- "startNow": "ابدأ الآن",
- "destination_type": "نوع الوجهة",
- "source_organization_name": "اسم منظمة المصدر",
- "destination_organization_name": "اسم منظمة الوجهة",
+ "pleaseSelectProject": "الرجاء اختيار مشروع",
+ "viewAttachment": "عرض المرفق",
+ "parkingQr": "رمز QR لمواقف السيارات",
+ "startNow": "ابدأ الآن",
+ "destination_type": "نوع الوجهة",
+ "source_organization_name": "اسم الجهة المرسلة",
+ "destination_organization_name": "اسم الجهة المستقبلة",
"costCenter": "مركز التكلفة",
"priceSAR": "السعر (ريال سعودي)",
"amountSAR": "المبلغ (ريال سعودي)",
"amuLastThreeMonths": "AMU (آخر 3 أشهر)",
+ "mazayaTitle": "مزايا",
+ "mazayaAccessGranted": "تم منح صلاحية الوصول إلى مزايا",
+ "mazayaAccessGrantedDesc": "أصبح لدى {} حق وصول نشط الآن. شارك رابط التنزيل أدناه ليتمكن من تثبيت تطبيق مهم وإكمال الإعداد.",
+ "accessIsNowActive": "تم تفعيل صلاحية الوصول",
+ "accessIsNowActiveDesc": "يمكن لـ {} استخدام الرابط المرفق لتنزيل تطبيق مزايا ومتابعة الإعداد على جهازه.",
+ "dependentAccessActive": "صلاحية التابع مفعّلة",
+ "shareableAppDownloadLink": "رابط تنزيل التطبيق للمشاركة",
+ "shareableAppDownloadLinkDesc": "أرسل هذا الرابط إلى {} ليتمكن من تنزيل تطبيق مزايا ومتابعة الإعداد.",
+ "downloadLink": "رابط التنزيل",
+ "shareDownloadLink": "مشاركة رابط التنزيل",
+ "copyLink": "نسخ الرابط",
+ "done": "تم",
+ "linkCopied": "تم نسخ الرابط بنجاح",
+ "mazayaAccessRevoked": "تم إلغاء صلاحية الوصول إلى مزايا",
+ "mazayaAccessRevokedDesc": "تم إلغاء صلاحية وصول التابع إلى مزايا. لم يعد بإمكانه استخدام العروض أو تسجيل الدخول بالبصمة.",
+ "contactYourSponsor": "تواصل مع الموظف المسؤول عن التابع",
+ "contactYourSponsorDesc": "اطلب من الموظف المسؤول عن التابع إعادة تفعيل صلاحية الوصول إلى مزايا من صفحة بيانات التابعين.",
+ "dependentAccessBlocked": "تم تعطيل صلاحية التابع",
+ "returnToSignIn": "العودة إلى تسجيل الدخول",
+ "allowMazayaAccess": "السماح باستخدام مزايا",
+ "revokeMazayaAccess": "إلغاء صلاحية استخدام مزايا",
+ "active": "نشط",
+ "noAccess": "لا توجد صلاحية وصول",
+ "offerDetails": "تفاصيل العرض",
+ "offerIdNotAvailable": "رقم العرض غير متوفر",
+ "unableToRedeemOffer": "تعذر الحصول على رابط العرض، يرجى المحاولة لاحقاً",
+ "errorRedeemingOffer": "حدث خطأ أثناء استخدام العرض",
+ "useOffer": "استخدام العرض",
+ "online": "عبر الإنترنت",
+ "inStore": "في المتجر",
+ "ksa": "المملكة",
+ "riyadh": "الرياض",
+ "noInstructionsAvailable": "لا توجد طريقة استخدام محددة.",
+ "contactInfo": "معلومات التواصل",
+ "allCategories": "الكل",
+ "noOffersAvailable": "لا توجد عروض متاحة",
+ "addDependents": "إضافة تابعين",
+ "myDependents": "التابعون",
+ "offDiscount": "خصم بقيمة {}",
+ "usageLabel": "الاستخدام: ",
+ "areYouSureWantToLogOut": "هل أنت متأكد من تسجيل الخروج؟",
+ "searchDependents": "البحث في التابعين",
+ "searchFamilyMembers": "البحث في أفراد العائلة",
+ "addAnotherUser": "إضافة مستخدم آخر",
+ "joinMazaya": "انضم إلى مزايا - قريباً",
+ "joinMazayaSubtitle": "استفد من العروض والخصومات الحصرية للموظفين في المطاعم والتسوق وغيرها.",
+ "continueAsEmployee": "المتابعة كموظف",
+ "continueAsEmployeeSubtitle": "سجّل الدخول باستخدام بيانات حسابك الوظيفي.",
+ "pleaseEnterNationalId": "الرجاء إدخال رقم الهوية الوطنية",
+ "pleaseSelectDob": "الرجاء تحديد تاريخ الميلاد",
+ "unableToRetrieveDependentInfo": "تعذر الحصول على معلومات التابع",
+ "failedToSendOtp": "فشل إرسال رمز التحقق",
+ "verificationCodeResent": "تم إعادة إرسال رمز التحقق",
+ "nationalId": "رقم الهوية الوطنية",
+ "addDependent": "إضافة تابع",
+ "stepVerify": "التحقق",
+ "stepBasic": "البيانات الأساسية",
+ "stepAdditional": "بيانات إضافية",
+ "findYourDependent": "البحث عن أحد التابعين",
+ "findYourDependentDesc": "أدخل التفاصيل تماماً كما تظهر في الهوية الوطنية. سنقوم باسترداد السجل بأمان من مركز المعلومات الوطني (NHIC).",
+ "enter10DigitNationalId": "أدخل رقم الهوية المكون من 10 أرقام",
+ "nationalIdMustBe10Digits": "يجب أن يتكون رقم الهوية من 10 أرقام",
+ "dateFormatPlaceholder": "يوم / شهر / سنة",
+ "searchUser": "بحث عن المستخدم",
+ "dependentNotFoundNhic": "لم يتم العثور على سجل لهذا التابع في مركز المعلومات الوطني",
+ "basicInfo": "المعلومات الأساسية",
+ "basicInfoDesc": "بيانات الهوية المطلوبة المستردة من مركز المعلومات الوطني.",
+ "additionalInfo": "معلومات إضافية",
+ "additionalInfoDesc": "إضافة أو مراجعة بيانات الكفالة والأهلية.",
+ "select": "اختر",
+ "enterFieldPlaceholder": "أدخل {}",
+ "requiredField": "الحقل المطلوب",
+ "pleaseFillField": "الرجاء إدخال {}",
+ "reviewAndSubmit": "المراجعة والإرسال",
+ "reviewAndSubmitDesc": "يرجى مراجعة تفاصيل التابع بعناية قبل تأكيد الإرسال.",
+ "arabicName": "الاسم بالعربية",
+ "relationship": "صلة القرابة",
+ "sponsor": "الموظف المسؤول عن التابع",
+ "dependentSponsorDetail": "بيانات الموظف المسؤول عن التابع",
+ "insuranceEligibility": "أهلية التأمين",
+ "relationshipStartDate": "تاريخ بدء العلاقة",
+ "dependentAddedSuccessfully": "تم إرسال الطلب بنجاح",
+ "genderMale": "ذكر",
+ "genderFemale": "أنثى",
+ "religionIslam": "الإسلام",
+ "back": "السابق",
+ "submitRequest": "إرسال الطلب",
+ "enterDependentDetailsToContinue": "أدخل تفاصيل التابع للمتابعة.",
+ "enterBasicDetailsDesc": "يرجى إدخال البيانات الأساسية للتابع.",
+ "locations": "الفروع والمواقع",
+ "availableOffers": "العروض المتاحة",
+ "selectOfferToRedeem": "اختر العرض الذي ترغب في استخدامه",
+ "viewOnMap": "عرض على الخريطة",
+ "showAllLocations": "عرض جميع الفروع ({})",
+ "searchBranches": "البحث عن الفروع أو المدن...",
+ "allCities": "الكل",
+ "allCitiesOption": "جميع المدن",
+ "noBranchesFound": "لم يتم العثور على فروع مطابقة",
+ "browseAllBranches": "تصفح جميع الفروع ({}) في مختلف المدن",
+ "branchesCount": "{} فرع",
+ "kmAway": "على بعد {} كم",
+ "dependentDetails": "تفاصيل التابع",
+ "keyDetails": "البيانات الأساسية",
+ "verified": "تم التحقق",
+ "idEnding": "رقم الهوية المنتهي بـ {}",
+ "servicesAndActions": "الخدمات والإجراءات",
+ "startDependentFlowsDesc": "بدء إجراءات التابع وإدارة الوصول من مكان واحد.",
+ "mazayaAccess": "الوصول إلى مزايا",
+ "accessOff": "معطل",
+ "allowDependentMazayaOffersDesc": "السماح لـ {} باستخدام عروض مزايا بعد التحقق من هويته.",
+ "loginMethod": "طريقة تسجيل الدخول",
+ "nationalIdAndDob": "الهوية الوطنية وتاريخ الميلاد",
+ "sponsorOtp": "رمز التحقق المرسل إلى الموظف المسؤول عن التابع",
+ "revokingPreventsAccessDesc": "إلغاء الوصول يمنع التابع من استخدام المزايا حتى تعيد السماح به مرة أخرى.",
+ "locationPermissionRequiredForAttendance": "يجب منح إذن الموقع لتسجيل الحضور",
+ "locationServicesRequiredForAttendance": "يجب تفعيل خدمة الموقع لتسجيل الحضور",
+ "pleaseProvideLocationPermission": "الرجاء منح إذن الموقع",
+ "microphoneAccessRequired": "يحتاج التطبيق إلى إذن الوصول إلى الميكروفون لتسجيل الصوت.",
+ "shareAccessGuide": "مشاركة دليل الوصول",
+ "nationalIdOrIqamaNumber": "رقم الهوية الوطنية أو الإقامة",
+ "multipleCities": "مدن متعددة",
+ "filters": "الفلاتر",
+ "availability": "التوفر",
+ "chooseOneOrBoth": "اختر أحد الخيارين أو كليهما",
+ "sortBy": "الترتيب حسب",
+ "recommended": "الموصى بها",
+ "nearest": "الأقرب",
+ "highestDiscount": "الأعلى خصمًا",
+ "newest": "الأحدث",
+ "distance": "المسافة",
+ "fromYourCurrentLocation": "من موقعك الحالي",
+ "any": "الكل",
+ "minimumDiscount": "أقل نسبة خصم",
+ "reset": "إعادة تعيين",
+ "applyFilters": "تطبيق الفلاتر",
+ "distanceKm": "{} كم",
+ "discountPercentPlus": "{}%+",
+ "visitMerchantWebsite": "زيارة موقع التاجر",
+ "favoriteAddedSuccess": "تمت إضافة التاجر إلى المفضلة بنجاح",
+ "favoriteRemovedSuccess": "تمت إزالة التاجر من المفضلة بنجاح",
+ "favoriteError": "تعذّر تحديث المفضلة. يُرجى المحاولة مرة أخرى.",
+ "merchantWebsiteNotAvailable": "الموقع الإلكتروني للتاجر غير متاح",
+ "locationServicesRequiredForNearestOffers": "فعّل خدمات الموقع لعرض العروض القريبة منك",
+ "locationPermissionRequiredForNearestOffers": "اسمح للتطبيق بالوصول إلى موقعك لعرض العروض القريبة منك",
+ "mazayaDeals": "عروض مزايا",
+ "helloName": "مرحباً، {}",
+ "findABrandOrSomething": "ابحث عن علامة تجارية أو شيء بسيط",
+ "exploreYourBenefits": "استكشف مزاياك",
+ "theMazayaEdit": "اختيارات مزايا",
+ "exclusivelyYours":"HMG حصرياً",
+ "aLittleExtraJustForMazayaMembers": "مزايا إضافية، خاصة بأعضاء مزايا.",
+ "seeAll": "عرض الكل",
+ "latestOnMazaya": "أحدث ما في مزايا",
+ "goodFoodGreatCompanyEvenBetterPerks": "طعام رائع. رفقة ممتعة. مزايا أفضل.",
+ "travelEssentials": "أساسيات السفر",
+ "fromEverydayCareToYourNextAdventure": "من العناية اليومية إلى مغامرتك القادمة.",
+ "homeAndKitchen": "المنزل والمطبخ",
+ "curatedPicksForYourHomeAndKitchen": "اختيارات مميزة لمنزلك ومطبخك.",
+ "discover": "اكتشف",
+ "saved": "المحفوظات",
+ "myFamily": "عائلتي",
+ "educationAndTraining": "التعليم والتدريب",
+ "foodsAndDrinks": "الأطعمة والمشروبات",
+ "travelAndEntertainment": "السفر والترفيه",
+ "beautyAndFitness": "الجمال واللياقة",
+ "healthcare": "الرعاية الصحية",
+ "favoriteMerchant": "العروض المفضلة",
+ "favoriteOffers": "العروض المفضلة",
+ "goodToKnow": "معلومات مهمة",
+ "goodToKnowDesc": "احتفظ بعضوية مزايا في متناول يدك. تحقق من توفر التاجر والأنشطة المؤهلة والشروط الكاملة قبل الحجز.",
+ "termsAndConditions": "الشروط والأحكام",
+ "haveAQuestionAboutOffer": "هل لديك سؤال حول هذا العرض؟",
+ "getHelp": "الحصول على المساعدة",
+ "redeemOffer": "استرداد العرض",
+ "merchantContact": "بيانات التواصل مع التاجر",
+ "website": "الموقع الإلكتروني",
+ "phone": "الهاتف",
+ "viewAll": "عرض الكل",
+ "moreCitiesCount": "+ {} مدن أخرى",
+ "mazayaDeals": "عروض مزايا",
+ "exploreYourBenefits": "استكشف مزاياك",
+ "findAnEscapeOrAnExperience": "ابحث عن تجربة أو عطلة",
+ "allOffers": "جميع العروض",
+ "sampleAvailability": "حسب التوفر",
+ "offersCount": "{} عروض",
+ "mazayaExclusive": "حصري لمزايا",
+ "youAreAllCaughtUp": "لقد شاهدت كل العروض. المزيد قريباً.",
+ "selectCity": "اختر المدينة",
+ "searchCities": "البحث عن المدن",
+ "amuLastThreeMonths": "AMU (آخر 3 أشهر)",
"buyerDetails": "تفاصيل المشتري",
"chatBot": "المساعد الذكي",
"helloAskMe": "مرحباً، اسألني",
@@ -691,4 +887,3 @@
"am": "ص",
"pm": "م"
}
-
diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json
index 6701e29..7292dcb 100644
--- a/assets/langs/en-US.json
+++ b/assets/langs/en-US.json
@@ -549,6 +549,15 @@
"manage": "Manage",
"members": "Members",
"areYouSureWantTodelete": "Are you sure want to delete?",
+ "confirmGrantMazayaAccess": "Are you sure you want to grant Mazaya access to \"{}\"?",
+ "confirmRevokeMazayaAccess": "Are you sure you want to revoke Mazaya access to \"{}\"?",
+ "yes": "Yes",
+ "no": "No",
+ "mazayaInviteInstructions": "Please download the MoheM app from the above link and use the following credentials to login",
+ "cameraPermissionRequiredToScan": "Please grant camera permission to scan the QR code",
+ "cameraPermissionPermanentlyDenied": "Please allow camera permission from the app settings > Permissions",
+ "openSettings": "Open Settings",
+ "nationalIdOrIqamaFallback": "Your National ID or Iqama Number",
"groupMembers": "Group Members",
"manageGroup": "Manage Group",
"admin": "Admin",
@@ -570,7 +579,6 @@
"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",
- "generate": "Generate",
"paymentRequest": "Pay Request",
"paymentDetails": "Payment Details",
"requestNo": "Request No",
@@ -667,17 +675,211 @@
"incidentDetails": "Incident Details",
"ticketNumber": "Ticket Number",
"ticketId": "Ticket ID",
- "pleaseSelectProject": "Please select a project",
- "viewAttachment" : "View Attachment",
- "parkingQr": "Parking QR",
- "startNow": "Start Now",
- "destination_type": "Destination Type",
- "source_organization_name": "Source Organization Name",
+ "pleaseSelectProject": "Please select a project",
+ "viewAttachment": "View Attachment",
+ "parkingQr": "Parking QR",
+ "startNow": "Start Now",
+ "destination_type": "Destination Type",
+ "source_organization_name": "Source Organization Name",
"destination_organization_name": "Destination Organization Name",
"costCenter": "Cost Center",
"priceSAR": "Price (SAR)",
"amountSAR": "Amount (SAR)",
"amuLastThreeMonths": "AMU (Last 3 months)",
+
+
+
+
+ "mazayaTitle": "Mazaya",
+ "mazayaAccessGranted": "Mazaya access granted",
+ "mazayaAccessGrantedDesc": "{} now has active access. Share the download link below so they can install the Mohem app and complete setup.",
+ "accessIsNowActive": "Access is now active",
+ "accessIsNowActiveDesc": "{} can use the provided link to download the Mazaya app and continue setup on their device.",
+ "dependentAccessActive": "Dependent access active",
+ "shareableAppDownloadLink": "Shareable app-download link",
+ "shareableAppDownloadLinkDesc": "Send this link to {} so they can download the Mazaya app and continue setup.",
+ "downloadLink": "Download link",
+ "shareDownloadLink": "Share Download Link",
+ "copyLink": "Copy Link",
+ "done": "Done",
+ "linkCopied": "Link copied to clipboard",
+ "mazayaAccessRevoked": "Mazaya Access",
+ "mazayaAccessRevokedDesc": "You are not authorized to access the Mazaya Program.",
+ "contactYourSponsor": "Contact your sponsor",
+ "contactYourSponsorDesc": "Ask your sponsor to allow Mazaya access again from Dependent Details. Only the sponsor can restore access.",
+ "dependentAccessBlocked": "Dependent access blocked",
+ "returnToSignIn": "Return to Sign In",
+ "allowMazayaAccess": "Allow Mazaya Access",
+ "revokeMazayaAccess": "Revoke Mazaya Access",
+ "active": "Active",
+ "noAccess": "No access",
+ "offerDetails": "Offer Details",
+ "offerIdNotAvailable": "Offer ID not available",
+ "unableToRedeemOffer": "Unable to redeem offer, please try again later",
+ "errorRedeemingOffer": "An error occurred while redeeming offer",
+ "useOffer": "Use Offer",
+ "online": "Online",
+ "inStore": "In Store",
+ "ksa": "KSA",
+ "riyadh": "Riyadh",
+ "noInstructionsAvailable": "No instructions available.",
+ "contactInfo": "Contact Information",
+ "allCategories": "All",
+ "noOffersAvailable": "No offers available",
+ "addDependents": "Add Dependents",
+ "myDependents": "My Dependents",
+ "offDiscount": "{} Off",
+ "usageLabel": "Usage: ",
+ "areYouSureWantToLogOut": "Are you sure you want to log out?",
+ "searchDependents": "Search dependents",
+ "searchFamilyMembers": "Search family members",
+ "addAnotherUser": "Add another user",
+ "joinMazaya": "Join Mazaya - Coming Soon",
+ "joinMazayaSubtitle": "Get the best offers and exclusive deals across dining, shopping, and lifestyle rewards.",
+ "continueAsEmployee": "Continue as an employee",
+ "continueAsEmployeeSubtitle": "Sign in with your employee username and password.",
+ "pleaseEnterNationalId": "Please enter National ID",
+ "pleaseSelectDob": "Please select Date of Birth",
+ "unableToRetrieveDependentInfo": "Unable to retrieve dependent information",
+ "failedToSendOtp": "Failed to send verification code",
+ "verificationCodeResent": "Verification code resent",
+ "nationalId": "National ID",
+ "addDependent": "Add Dependent",
+ "stepVerify": "Verify",
+ "stepBasic": "Basic",
+ "stepAdditional": "Additional",
+ "findYourDependent": "Find your dependent",
+ "findYourDependentDesc": "Enter the details exactly as they appear on the National ID. We'll securely retrieve the record from NHIC.",
+ "enter10DigitNationalId": "Enter 10-digit National ID",
+ "nationalIdMustBe10Digits": "National ID must be 10 digits",
+ "dateFormatPlaceholder": "DD / MM / YYYY",
+ "searchUser": "Search User",
+ "dependentNotFoundNhic": "Sorry, error while getting dependent info from NHIC",
+ "basicInfo": "Basic Info",
+ "basicInfoDesc": "Required identity details fetched from NHIC.",
+ "additionalInfo": "Additional Info",
+ "additionalInfoDesc": "Add or review sponsorship and eligibility details.",
+ "select": "Select",
+ "enterFieldPlaceholder": "Enter {}",
+ "requiredField": "Required field",
+ "pleaseFillField": "Please fill {}",
+ "reviewAndSubmit": "Review & Submit",
+ "reviewAndSubmitDesc": "Please review the dependent details carefully before submitting.",
+ "arabicName": "Arabic Name",
+ "relationship": "Relationship",
+ "sponsor": "Sponsor",
+ "dependentSponsorDetail": "Dependent Sponsor Detail",
+ "insuranceEligibility": "Insurance Eligibility",
+ "relationshipStartDate": "Start Date",
+ "dependentAddedSuccessfully": "Dependent added successfully",
+ "genderMale": "Male",
+ "genderFemale": "Female",
+ "religionIslam": "Islam",
+ "back": "Back",
+ "submitRequest": "Submit",
+ "enterDependentDetailsToContinue": "Enter the dependent details to continue.",
+ "enterBasicDetailsDesc": "Please enter the dependent's basic identity details.",
+ "locations": "Locations",
+ "availableOffers": "Available Offers",
+ "selectOfferToRedeem": "Select an offer to use",
+ "viewOnMap": "View on map",
+ "showAllLocations": "Show all {} locations",
+ "searchBranches": "Search branches or cities...",
+ "allCities": "All",
+ "allCitiesOption": "All Cities",
+ "noBranchesFound": "No branches found",
+ "browseAllBranches": "Browse all {} branches across cities",
+ "branchesCount": "{} Branches",
+ "kmAway": "{} KM Away",
+ "dependentDetails": "Dependent Details",
+ "keyDetails": "Key details",
+ "verified": "Verified",
+ "idEnding": "ID ending {}",
+ "servicesAndActions": "Services & actions",
+ "startDependentFlowsDesc": "Start dependent flows and manage access from one place.",
+ "mazayaAccess": "Mazaya access",
+ "accessOff": "Off",
+ "allowDependentMazayaOffersDesc": "Allow {} to use Mazaya offers with her verified identity.",
+ "loginMethod": "Login method",
+ "nationalIdAndDob": "National ID & Date of Birth",
+ "sponsorOtp": "Sponsor OTP",
+ "revokingPreventsAccessDesc": "Revoking prevents all future dependent access until you allow it again.",
+ "locationPermissionRequiredForAttendance": "You need to give location permission to mark attendance",
+ "locationServicesRequiredForAttendance": "You need to enable location services to mark attendance",
+ "pleaseProvideLocationPermission": "Please provide location permission",
+ "microphoneAccessRequired": "The app needs microphone access to be able to record audio.",
+ "shareAccessGuide": "Share Access Guide",
+ "nationalIdOrIqamaNumber": "National ID or Iqama Number",
+ "multipleCities": "Multi-city",
+ "filters": "Filters",
+ "availability": "Availability",
+ "chooseOneOrBoth": "Choose one or both",
+ "sortBy": "Sort by",
+ "recommended": "Recommended",
+ "nearest": "Nearest",
+ "highestDiscount": "Highest discount",
+ "newest": "Newest",
+ "distance": "Distance",
+ "fromYourCurrentLocation": "From your current location",
+ "any": "Any",
+ "minimumDiscount": "Minimum discount",
+ "reset": "Reset",
+ "applyFilters": "Apply filters",
+ "distanceKm": "{} km",
+ "discountPercentPlus": "{}%+",
+ "visitMerchantWebsite": "Visit Merchant Website",
+ "merchantWebsiteNotAvailable": "Merchant website not available",
+ "locationServicesRequiredForNearestOffers": "You need to enable location services to show nearest offers",
+ "locationPermissionRequiredForNearestOffers": "You need to give location permission to show nearest offers",
+ "mazayaDeals": "Mazaya Deals",
+ "helloName": "Hello, {}",
+ "findABrandOrSomething": "Find a brand or a little something",
+ "exploreYourBenefits": "Explore your benefits",
+ "theMazayaEdit": "The Mazaya Edit",
+ "exclusivelyYours": "Exclusively HMG",
+ "aLittleExtraJustForMazayaMembers": "A little extra, just for Mazaya members.",
+ "seeAll": "See all",
+ "latestOnMazaya": "Latest on Mazaya",
+ "goodFoodGreatCompanyEvenBetterPerks": "Good food. Great company. Even better perks.",
+ "travelEssentials": "Travel Essentials",
+ "fromEverydayCareToYourNextAdventure": "From everyday care to your next adventure.",
+ "homeAndKitchen": "Home & Kitchen",
+ "curatedPicksForYourHomeAndKitchen": "Curated picks for your home and kitchen.",
+ "discover": "Discover",
+ "saved": "Saved",
+ "myFamily": "My Family",
+ "educationAndTraining": "Education & Training",
+ "foodsAndDrinks": "Foods & Drinks",
+ "travelAndEntertainment": "Travel & Entertainment",
+ "beautyAndFitness": "Beauty & Fitness",
+ "healthcare": "Healthcare",
+ "favoriteAddedSuccess": "Added to favorites successfully",
+ "favoriteRemovedSuccess": "Removed from favorites successfully",
+ "favoriteError": "An error occurred while updating favorites",
+ "favoriteMerchant": "Favorite Offers",
+ "favoriteOffers": "Favorite Offers",
+ "goodToKnow": "Good to know",
+ "goodToKnowDesc": "Keep your Mazaya membership handy. Check the merchant's availability, eligible activities and full terms before you book.",
+ "termsAndConditions": "Terms & conditions",
+ "haveAQuestionAboutOffer": "Have a question about this offer?",
+ "getHelp": "Get help",
+ "redeemOffer": "Redeem offer",
+ "merchantContact": "Merchant contact",
+ "website": "Website",
+ "phone": "Phone",
+ "viewAll": "View all",
+ "moreCitiesCount": "+ {} more cities",
+ "mazayaDeals": "Mazaya Deals",
+ "exploreYourBenefits": "Explore your benefits",
+ "findAnEscapeOrAnExperience": "Find an escape or an experience",
+ "allOffers": "All offers",
+ "sampleAvailability": "sample availability",
+ "offersCount": "{} offers",
+ "mazayaExclusive": "MAZAYA EXCLUSIVE",
+ "youAreAllCaughtUp": "You're all caught up. More little extras soon.",
+ "selectCity": "Select City",
+ "searchCities": "Search cities",
+ "amuLastThreeMonths": "AMU (Last 3 months)",
"buyerDetails": "Buyer Details",
"chatBot": "ChatBot",
"helloAskMe": "Hello, ask me",
@@ -688,4 +890,5 @@
"initializingChatPleaseWait": "Please wait, initializing chat...",
"am": "AM",
"pm": "PM"
-}
\ No newline at end of file
+}
+
diff --git a/assets/pdf/Mazaya Access Guide CS ar.pdf b/assets/pdf/Mazaya Access Guide CS ar.pdf
new file mode 100644
index 0000000..6556f4c
Binary files /dev/null and b/assets/pdf/Mazaya Access Guide CS ar.pdf differ
diff --git a/assets/pdf/Mazaya Access Guide CS en.pdf b/assets/pdf/Mazaya Access Guide CS en.pdf
new file mode 100644
index 0000000..b7d767b
Binary files /dev/null and b/assets/pdf/Mazaya Access Guide CS en.pdf differ
diff --git a/assets/pdf/Mazaya Access Guide HMG ar.pdf b/assets/pdf/Mazaya Access Guide HMG ar.pdf
new file mode 100644
index 0000000..d773527
Binary files /dev/null and b/assets/pdf/Mazaya Access Guide HMG ar.pdf differ
diff --git a/assets/pdf/Mazaya Access Guide HMG en.pdf b/assets/pdf/Mazaya Access Guide HMG en.pdf
new file mode 100644
index 0000000..c7b2911
Binary files /dev/null and b/assets/pdf/Mazaya Access Guide HMG en.pdf differ
diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist
index 391a902..1dc6cf7 100644
--- a/ios/Flutter/AppFrameworkInfo.plist
+++ b/ios/Flutter/AppFrameworkInfo.plist
@@ -20,5 +20,7 @@
????
CFBundleVersion
1.0
+ MinimumOSVersion
+ 13.0
diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj
index fe5b6ee..85b7dec 100644
--- a/ios/Runner.xcodeproj/project.pbxproj
+++ b/ios/Runner.xcodeproj/project.pbxproj
@@ -7,8 +7,8 @@
objects = {
/* Begin PBXBuildFile section */
+ 0AD79F8B1905C17FADC8B42C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D8F0CC8EAC13AF3E07BEE567 /* Pods_Runner.framework */; };
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
- 1CCF895CFB3C95DEBB84A05F /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D8F0CC8EAC13AF3E07BEE567 /* Pods_Runner.framework */; };
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
76AE113C28E078EA00513112 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 76AE113B28E078EA00513112 /* GoogleService-Info.plist */; };
@@ -59,8 +59,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
- 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */,
- 1CCF895CFB3C95DEBB84A05F /* Pods_Runner.framework in Frameworks */,
+ 0AD79F8B1905C17FADC8B42C /* Pods_Runner.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -148,7 +147,7 @@
9705A1C41CF9048500538489 /* Embed Frameworks */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
C4CFBC4C5CAC00182015ACD5 /* [CP] Embed Pods Frameworks */,
- D9FFC0F21D4146458615A992 /* [CP] Copy Pods Resources */,
+ EF29CE25BB57F5AA48CE1136 /* [CP] Copy Pods Resources */,
);
buildRules = (
);
diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
index 5db441f..27924ba 100644
--- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
+++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
@@ -3,7 +3,7 @@
LastUpgradeVersion = "1510"
version = "1.3">
+
+
+
+
sms
tel
mailto
+ https
+ http
+ comgooglemaps
+ googlechromes
+ waze
LSRequiresIPhoneOS
@@ -67,15 +72,17 @@
NSCameraUsageDescription
- This app requires camera access to capture & upload picture as profile image.
+ This app requires camera access to capture & upload picture as profile image, and scan QR codes.
NSFaceIDUsageDescription
This app requires Face ID to allow biometric authentication for app login.
+ NSLocalNetworkUsageDescription
+ This app requires access to local network to connect to company Wi-Fi networks for attendance.
NSLocationAlwaysAndWhenInUseUsageDescription
- This App requires access to your location to mark your attendance.
+ This app requires access to your location to mark your attendance and discover nearby offers and merchants.
NSLocationAlwaysUsageDescription
- This App requires access to your location to mark your attendance.
+ This app requires access to your location to mark your attendance and discover nearby offers and merchants.
NSLocationWhenInUseUsageDescription
- This App requires access to your location to mark your attendance.
+ This app requires access to your location to mark your attendance and discover nearby offers and merchants.
NSMicrophoneUsageDescription
This app requires microphone access for calls and speech-to-text input.
NSPhotoLibraryUsageDescription
diff --git a/ios/Runner/Runner.entitlements b/ios/Runner/Runner.entitlements
index 304aa00..98a55e2 100644
--- a/ios/Runner/Runner.entitlements
+++ b/ios/Runner/Runner.entitlements
@@ -20,6 +20,7 @@
com.apple.developer.nfc.readersession.formats
+ NDEF
TAG
com.apple.developer.ubiquity-container-identifiers
diff --git a/lib/api/api_client.dart b/lib/api/api_client.dart
index 7e346c8..7ac6c8d 100644
--- a/lib/api/api_client.dart
+++ b/lib/api/api_client.dart
@@ -1,5 +1,6 @@
import 'dart:async';
import 'dart:convert';
+import 'dart:developer';
import 'dart:io';
import 'package:flutter/cupertino.dart';
@@ -36,16 +37,24 @@ APIException _throwAPIException(Response response) {
case 200:
APIError? apiError;
if (response.body != null && response.body.isNotEmpty) {
- var jsonError = jsonDecode(response.body);
- print(jsonError);
- apiError = APIError(jsonError['ErrorCode'], jsonError['ErrorMessage'], jsonError['ErrorType'], jsonError['ErrorStatusCode']);
+ try {
+ var jsonError = jsonDecode(response.body);
+ print(jsonError);
+ apiError = APIError(jsonError['ErrorCode'], jsonError['ErrorMessage'], jsonError['ErrorType'], jsonError['ErrorStatusCode']);
+ } catch (_) {
+ log("Non-JSON 200 error body: ${response.body}");
+ }
}
return APIException(APIException.BAD_REQUEST, error: apiError);
case 400:
APIError? apiError;
if (response.body != null && response.body.isNotEmpty) {
- var jsonError = jsonDecode(response.body);
- apiError = APIError(jsonError['ErrorCode'], jsonError['ErrorMessage'], jsonError['ErrorType'], jsonError['ErrorStatusCode']);
+ try {
+ var jsonError = jsonDecode(response.body);
+ apiError = APIError(jsonError['ErrorCode'], jsonError['ErrorMessage'], jsonError['ErrorType'], jsonError['ErrorStatusCode']);
+ } catch (_) {
+ log("Non-JSON 400 error body: ${response.body}");
+ }
}
return APIException(APIException.BAD_REQUEST, error: apiError);
case 401:
@@ -86,15 +95,14 @@ class ApiClient {
_headers.addAll(headers);
}
if (!kReleaseMode) {
- print("Url:$url");
+ log("Url: $url");
var bodyJson = json.encode(jsonObject);
- print("body:$bodyJson");
+ log("body:$bodyJson");
}
var response = await postJsonForResponse(url, jsonObject, token: token, queryParameters: queryParameters, headers: _headers, retryTimes: retryTimes, isFormData: isFormData);
try {
if (!kReleaseMode) {
- logger.i("Url: " + url);
- logger.i("res: " + response.body);
+ log("res: " + response.body);
}
var jsonData = jsonDecode(response.body);
@@ -112,7 +120,7 @@ class ApiClient {
} else if (jsonData["MessageStatus"] == 2 && jsonData["IsOTPMaxLimitExceed"] == true) {
await Utils.performLogout(AppRoutes.navigatorKey.currentContext, null);
throw const APIException(APIException.UNAUTHORIZED, error: null);
- } else {
+ } else {
APIError? apiError;
apiError = APIError(jsonData['ErrorCode'], jsonData['ErrorEndUserMessage'], jsonData['ErrorType'] ?? 0, jsonData['ErrorStatusCode']);
throw APIException(APIException.BAD_REQUEST, error: apiError);
@@ -121,6 +129,7 @@ class ApiClient {
if (ex is APIException) {
rethrow;
} else {
+ log("BAD_RESPONSE_FORMAT for $url -> body: ${response.body}");
throw APIException(APIException.BAD_RESPONSE_FORMAT, arguments: ex);
}
}
diff --git a/lib/api/login_api_client.dart b/lib/api/login_api_client.dart
index 24d248a..65e5fc6 100644
--- a/lib/api/login_api_client.dart
+++ b/lib/api/login_api_client.dart
@@ -1,13 +1,20 @@
import 'dart:async';
+import 'dart:io';
+import 'package:firebase_messaging/firebase_messaging.dart';
+import 'package:flutter/foundation.dart';
+import 'package:flutter/material.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/classes/utils.dart';
import 'package:mohem_flutter_app/models/basic_member_information_model.dart';
import 'package:mohem_flutter_app/models/check_mobile_app_version_model.dart';
import 'package:mohem_flutter_app/models/generic_response_model.dart';
+import 'package:mohem_flutter_app/models/dependent/get_mobile_login_info_dependent_model.dart';
import 'package:mohem_flutter_app/models/get_mobile_login_info_list_model.dart';
import 'package:mohem_flutter_app/models/member_login_list_model.dart';
+import 'package:sms_otp_auto_verify/sms_otp_auto_verify.dart';
class LoginApiClient {
static final LoginApiClient _instance = LoginApiClient._internal();
@@ -16,33 +23,142 @@ class LoginApiClient {
factory LoginApiClient() => _instance;
- Future getMobileLoginInfoNEW(String deviceToken, String deviceType) async {
+ static String? _cachedSignature;
+
+ static Future getSignature() async {
+ if (!Platform.isAndroid) return null;
+ if (_cachedSignature != null && _cachedSignature!.isNotEmpty) {
+ return _cachedSignature;
+ }
+ try {
+ String? sig = await SmsVerification.getAppSignature();
+ if (sig != null && sig.isNotEmpty) {
+ _cachedSignature = sig;
+ }
+ return sig;
+ } catch (e) {
+ debugPrint("Error getting app signature: $e");
+ return null;
+ }
+ }
+
+ Future getMobileLoginInfoNEW(String deviceToken, String deviceType, {int? memberType}) async {
String url = "${ApiConsts.erpRest}Mohemm_GetMobileLoginInfo_NEW";
Map postParams = {};
postParams["DeviceToken"] = deviceToken;
postParams["DeviceType"] = deviceType;
+ postParams["MemberType"] = memberType ?? ApiConsts.selectedMemberType.value;
return await ApiClient().postJsonForObject((json) {
GenericResponseModel? responseData = GenericResponseModel.fromJson(json);
+
+ if (responseData != null) {
+ bool? isEmp = responseData.isEmpLastLoginToDevice;
+ if (isEmp == null && json is Map) {
+ dynamic raw = json["IsEmpLastLoginToDevice"] ?? json["isEmpLastLoginToDevice"];
+ if (raw is bool) {
+ isEmp = raw;
+ } else if (raw is num) {
+ isEmp = raw == 1;
+ } else if (raw is String) {
+ isEmp = raw.toLowerCase() == "true" || raw == "1";
+ }
+ }
+ AppState().setIsEmpLastLoginToDevice = isEmp;
+ }
+
return (responseData.mohemmGetMobileLoginInfoList?.length ?? 0) > 0 ? (responseData.mohemmGetMobileLoginInfoList!.first) : null;
}, url, postParams);
}
+ Future getMobileLoginInfoNEWDependent(String deviceToken, String deviceType, {int? memberType}) async {
+ String url = "${ApiConsts.erpRest}Mohemm_GetMobileLoginInfo_NEW_Dependent";
+ String effectiveDeviceToken = deviceToken;
+ if (effectiveDeviceToken.isEmpty) {
+ effectiveDeviceToken = AppState().getDeviceToken ?? "";
+ }
+ // if (effectiveDeviceToken.isEmpty && !AppState().getIsHuawei) {
+ // try {
+ // await Firebase.initializeApp();
+ // String? tok = await FirebaseMessaging.instance.getToken();
+ // if (tok != null && tok.isNotEmpty) {
+ // effectiveDeviceToken = tok;
+ // AppState().setDeviceToken = tok;
+ // }
+ // } catch (_) {}
+ // }
+
+ Map postParams = {};
+ postParams["DeviceToken"] = effectiveDeviceToken;
+ postParams["DeviceType"] = deviceType;
+ postParams["MemberType"] = memberType ?? MemberType.dependent.value;
+ return await ApiClient().postJsonForObject((json) {
+ if (kDebugMode) {
+ print("Mohemm_GetMobileLoginInfo_NEW_Dependent Response: $json");
+ }
+ List? list = json['Mohemm_GetMobileLoginInfo_NEW_DependentList'] ??
+ json['Mohemm_GetMobileLoginInfo_NEW_Dependent'] ??
+ json['Mohemm_GetMobileLoginInfo_DependentList'] ??
+ json['Mohemm_GetMobileLoginInfoDependentList'] ??
+ json['Mohemm_GetMobileLoginInfoList'] ??
+ json['GetMobileLoginInfoList'] ??
+ json['Response'] ??
+ json['Data'];
+ if (list != null && list.isNotEmpty && list.first is Map) {
+ return GetMobileLoginInfoDependentModel.fromJson(list.first as Map);
+ }
+ if (json is Map &&
+ (json['DependentID'] != null || json['DepedentName'] != null || json['DOB'] != null || json['NationalID'] != null || json['LoginType'] != null)) {
+ return GetMobileLoginInfoDependentModel.fromJson(json);
+ }
+ return null;
+ }, url, postParams);
+ }
+
Future insertMobileLoginInfoNEW(
- String email, int sessionId, String employeeName, int loginType, String mobileNumber, String userName, String deviceToken, String deviceType) async {
+ String email, int sessionId, String employeeName, int loginType, String mobileNumber, String userName, String? deviceToken, String deviceType,
+ {int? memberType}) async {
String url = "${ApiConsts.erpRest}Mohemm_InsertMobileLoginInfo";
+ String devType = deviceType.isNotEmpty ? deviceType : (Platform.isAndroid ? "android" : "ios");
+ String devToken = (deviceToken != null && deviceToken.isNotEmpty && deviceToken != "null")
+ ? deviceToken
+ : (AppState().getIsHuawei ? AppState().getHuaweiPushToken : (AppState().getDeviceToken ?? ""));
+
+ if (devToken.isEmpty || devToken == "null") {
+ try {
+ String savedToken = await Utils.getStringFromPrefs("P_DEP_DEVICE_TOKEN");
+ if (savedToken.isNotEmpty && savedToken != "null") {
+ devToken = savedToken;
+ }
+ } catch (_) {}
+ }
+
+ if (devToken.isEmpty || devToken == "null") {
+ try {
+ if (!AppState().getIsHuawei) {
+ String? tok = await FirebaseMessaging.instance.getToken();
+ if (tok != null && tok.isNotEmpty) {
+ devToken = tok;
+ AppState().setDeviceToken = tok;
+ Utils.saveStringFromPrefs("P_DEP_DEVICE_TOKEN", tok);
+ }
+ }
+ } catch (_) {}
+ }
+
Map postParams = {
"MobileNumber": mobileNumber,
"P_USER_NAME": userName,
"UserName": userName,
"CompanyID": 1, // todo 'sikander' @discuss umer for companyID
- "DeviceToken": deviceToken,
+ "DeviceToken": devToken,
"LoginType": loginType,
"EmployeeName": employeeName,
"P_SESSION_ID": sessionId,
- "P_EMAIL_ADDRESS": email
+ "P_EMAIL_ADDRESS": email,
+ "MemberType": memberType ?? ApiConsts.selectedMemberType.value,
};
- postParams["DeviceToken"] = deviceToken;
- postParams["DeviceType"] = deviceType;
+ postParams["DeviceToken"] = devToken;
+ postParams["DeviceType"] = devType;
postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject((json) {
GenericResponseModel? responseData = GenericResponseModel.fromJson(json);
@@ -51,6 +167,93 @@ class LoginApiClient {
}, url, postParams);
}
+ Future insertMobileLoginInfoDependent({
+ required int loginType,
+ String? nationalId,
+ String? dob,
+ String? dependentName,
+ String? mobileNumber,
+ String? logInTokenID,
+ String? tokenID,
+ int? sessionId,
+ String? email,
+ String? deviceToken,
+ String? deviceType,
+ int? companyId,
+ int? versionId,
+ int? channel,
+ int? memberType,
+ BuildContext? context,
+ }) async {
+ String url = "${ApiConsts.erpRest}Mohemm_InsertMobileLoginInfo_Dependent";
+ String devType = deviceType ?? (Platform.isAndroid ? "android" : "ios");
+ String devToken = (deviceToken != null && deviceToken.isNotEmpty && deviceToken != "null")
+ ? deviceToken
+ : (AppState().getIsHuawei ? AppState().getHuaweiPushToken : (AppState().getDeviceToken ?? ""));
+
+ if (devToken.isEmpty || devToken == "null") {
+ try {
+ String savedToken = await Utils.getStringFromPrefs("P_DEP_DEVICE_TOKEN");
+ if (savedToken.isNotEmpty && savedToken != "null") {
+ devToken = savedToken;
+ }
+ } catch (_) {}
+ }
+
+ if (devToken.isEmpty || devToken == "null") {
+ try {
+ if (!AppState().getIsHuawei) {
+ String? tok = await FirebaseMessaging.instance.getToken();
+ if (tok != null && tok.isNotEmpty) {
+ devToken = tok;
+ AppState().setDeviceToken = tok;
+ Utils.saveStringFromPrefs("P_DEP_DEVICE_TOKEN", tok);
+ }
+ }
+ } catch (_) {}
+ }
+
+ String effectiveToken = (tokenID != null && tokenID.isNotEmpty)
+ ? tokenID
+ : (AppState().postParamsObject?.tokenID ?? AppState().authenticationTokenID ?? "");
+
+ Map postParams = {
+ "VersionID": versionId ?? 5,
+ "Channel": channel,
+ "LanguageID": context != null ? AppState().getLanguageID(context) : 2,
+ "MemberType": memberType ?? 1,
+ "MobileType": devType,
+ "MobileNumber": mobileNumber ?? "",
+ "UserName": nationalId ?? "",
+ "P_USER_NAME": nationalId ?? "",
+ "P_DEP_NATIONAL_ID": nationalId ?? "",
+ "P_DEP_BIRTH_DATE": dob ?? "",
+ "P_DEPENDENT_NAME": dependentName ?? "",
+ "EmployeeName": dependentName ?? "",
+ "LogInTokenID": logInTokenID ?? (AppState().postParamsObject?.logInTokenID ?? ""),
+ "CompanyID": companyId ?? 1,
+ "DeviceType": devType,
+ "DeviceToken": devToken,
+ "LoginType": loginType,
+ "P_SESSION_ID": sessionId ?? (AppState().postParamsObject?.pSessionId ?? 0),
+ "TokenID": effectiveToken,
+ "P_EMAIL_ADDRESS": email ?? "",
+ };
+
+ if (kDebugMode) {
+ print("Mohemm_InsertMobileLoginInfo (Dependent) Request: $postParams");
+ }
+
+ return await ApiClient().postJsonForObject((json) {
+ if (kDebugMode) {
+ print("Mohemm_InsertMobileLoginInfo (Dependent) Response: $json");
+ }
+ GenericResponseModel? responseData = GenericResponseModel.fromJson(json);
+ AppState().setLogged = true;
+ return responseData;
+ }, url, postParams);
+ }
+
Future checkMobileAppVersion() async {
String url = "${ApiConsts.utilitiesRest}CheckMobileAppVersion";
Map postParams = {};
@@ -69,8 +272,15 @@ class LoginApiClient {
}, url, postParams);
}
- Future mohemmSendActivationCodeByOTPNotificationType(int isMobileFingerPrint, String? mobileNumber, int optSendType, String? pUserName) async {
+ Future mohemmSendActivationCodeByOTPNotificationType(
+ int isMobileFingerPrint,
+ String? mobileNumber,
+ int optSendType,
+ String? pUserName, {
+ String? smsSignature,
+ }) async {
String url = "${ApiConsts.erpRest}Mohemm_SendActivationCodebyOTPNotificationType";
+ String? sig = smsSignature ?? await getSignature();
Map postParams = {
"IsMobileFingerPrint": isMobileFingerPrint,
"MobileNumber": mobileNumber,
@@ -80,12 +290,13 @@ class LoginApiClient {
"NotificationCenterAppSeviceGUID": ApiConsts.notificationCenterLoginServiceGUID,
};
postParams.addAll(AppState().postParamsJson);
+ postParams["smsSignature"] = sig ?? "";
return await ApiClient().postJsonForObject((json) => GenericResponseModel.fromJson(json).basicMemberInformation, url, postParams);
}
- Future checkActivationCode(bool isDeviceNFC, String? mobileNumber, String activationCode, String? pUserName) async {
+ Future checkActivationCode(bool isDeviceNFC, String? mobileNumber, String activationCode, String? pUserName, String loginType) async {
String url = "${ApiConsts.erpRest}CheckActivationCode";
- Map postParams = {"IsDeviceNFC": isDeviceNFC, "MobileNumber": mobileNumber, "activationCode": activationCode, "P_USER_NAME": pUserName};
+ Map postParams = {"IsDeviceNFC": isDeviceNFC, "MobileNumber": mobileNumber, "activationCode": activationCode, "P_USER_NAME": pUserName, "LoginType":loginType};
postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject((json) {
GenericResponseModel responseData = GenericResponseModel.fromJson(json);
@@ -97,8 +308,10 @@ class LoginApiClient {
AppState().postParamsObject?.pUserName = AppState().getUserName;
AppState().postParamsObject?.pSelectedEmployeeNumber = AppState().getUserName;
AppState().postParamsObject?.setPLegislationCode = responseData.basicMemberInformation!.pLEGISLATIONCODE;
+ AppState().postParamsInitConfig.setPLegislationCode = responseData.basicMemberInformation!.pLEGISLATIONCODE;
AppState().postParamsObject?.setPayrollCodeStr = responseData.memberInformationList!.first.pAYROLLCODE;
AppState().setBusinessCardPrivilege = responseData.businessCardPrivilege ?? false;
+ AppState().setPrivilegeListModel = responseData.privilegeList ?? [];
return responseData;
}, url, postParams);
}
@@ -110,8 +323,9 @@ class LoginApiClient {
return await ApiClient().postJsonForObject((json) => GenericResponseModel.fromJson(json).basicMemberInformation, url, postParams);
}
- Future sendPublicActivationCode(String? mobileNumber, String? pUsername) async {
+ Future sendPublicActivationCode(String? mobileNumber, String? pUsername, {String? smsSignature}) async {
String url = "${ApiConsts.erpRest}SendPublicActivationCode";
+ String? sig = smsSignature ?? await getSignature();
Map postParams = {
"MobileNumber": mobileNumber,
"P_MOBILE_NUMBER": mobileNumber,
@@ -120,6 +334,8 @@ class LoginApiClient {
"NotificationCenterAppSeviceGUID": ApiConsts.notificationCenterForgotPasswordServiceGUID,
};
postParams.addAll(AppState().postParamsJson);
+ postParams["smsSignature"] = sig ?? "";
+ postParams["SMSSignature"] = sig ?? "";
return await ApiClient().postJsonForObject((json) {
GenericResponseModel responseData = GenericResponseModel.fromJson(json);
AppState().postParamsObject?.setLogInTokenID = responseData.logInTokenID;
@@ -169,4 +385,144 @@ class LoginApiClient {
return responseData;
}, url, postParams);
}
+
+ Future memberLoginDependent({
+ required String nationalId,
+ required String birthDate,
+ String? deviceToken,
+ String? deviceType,
+ BuildContext? context,
+ }) async {
+ String url = "${ApiConsts.erpRest}MemberLogin_Dependent";
+ String devType = deviceType ?? (Platform.isAndroid ? "android" : "ios");
+ String devToken = deviceToken ?? "";
+ if (devToken.isEmpty) {
+ devToken = AppState().getIsHuawei
+ ? AppState().getHuaweiPushToken
+ : (AppState().getDeviceToken ?? "");
+ }
+ if (devToken.isEmpty && !AppState().getIsHuawei) {
+ try {
+ String savedToken = await Utils.getStringFromPrefs("P_DEP_DEVICE_TOKEN");
+ if (savedToken.isNotEmpty) {
+ devToken = savedToken;
+ }
+ } catch (_) {}
+ }
+
+ Map postParams = {
+ "LanguageID": context != null ? AppState().getLanguageID(context) : 2,
+ "DeviceToken": devToken,
+ "DeviceType": devType,
+ "MobileType": devType,
+ "P_DEP_NATIONAL_ID": nationalId,
+ "P_DEP_BIRTH_DATE": birthDate,
+ };
+ if (kDebugMode) {
+ print("MemberLogin_Dependent Request: $postParams");
+ }
+ return await ApiClient().postJsonForObject((json) {
+ if (kDebugMode) {
+ print("MemberLogin_Dependent Response: $json");
+ }
+ GenericResponseModel responseData = GenericResponseModel.fromJson(json);
+ if (responseData.logInTokenID != null && responseData.logInTokenID!.isNotEmpty) {
+ AppState().postParamsObject?.setLogInTokenID = responseData.logInTokenID;
+ }
+ String? authToken = (responseData.authenticationTokenID != null && responseData.authenticationTokenID!.trim().isNotEmpty)
+ ? responseData.authenticationTokenID!.trim()
+ : null;
+ if (authToken != null && authToken.isNotEmpty) {
+ AppState().postParamsObject?.setTokenID = authToken;
+ AppState().setAuthenticationTokenID = authToken;
+ }
+ if (responseData.getWalaplusDepInfoModel != null) {
+ AppState().setWalaplusDepInfoModel = responseData.getWalaplusDepInfoModel;
+ if (responseData.getWalaplusDepInfoModel?.pDependentName != null &&
+ responseData.getWalaplusDepInfoModel!.pDependentName!.trim().isNotEmpty) {
+ AppState().setDependentName = responseData.getWalaplusDepInfoModel!.pDependentName!.trim();
+ }
+ }
+ AppState().setUserName = nationalId;
+ AppState().postParamsObject?.setUserName = nationalId;
+ AppState().postParamsObject?.setPUserName = nationalId;
+ return responseData;
+ }, url, postParams);
+ }
+
+ Future mohemmSendOTPDependent({
+ required String nationalId,
+ required String mobileNumber,
+ required String logInTokenID,
+ BuildContext? context,
+ String? smsSignature,
+ }) async {
+ String url = "${ApiConsts.erpRest}Mohemm_SendOTP_Dependent";
+ String? sig = smsSignature ?? await getSignature();
+ Map postParams = {
+ "VersionID": 20,
+ "LanguageID": context != null ? AppState().getLanguageID(context) : 2,
+ "MobileType": Platform.isAndroid ? "android" : "ios",
+ "OTP_SendType": 1,
+ "MobileNumber": mobileNumber,
+ "IsMobileFingerPrint": 0,
+ "P_DEP_NATIONAL_ID": nationalId,
+ "P_USER_NAME": nationalId,
+ "LogInTokenID": logInTokenID,
+ "NotificationCenterAppGUID": ApiConsts.notificationCenterAppGUID,
+ "NotificationCenterAppSeviceGUID": ApiConsts.notificationCenterLoginServiceGUID,
+ "smsSignature": (sig != null && sig.isNotEmpty) ? sig : "",
+ };
+ return await ApiClient().postJsonForObject((json) {
+ GenericResponseModel responseData = GenericResponseModel.fromJson(json);
+ return responseData;
+ }, url, postParams);
+ }
+
+ Future mohemmCheckOTPDependent({
+ required String logInTokenID,
+ required String activationCode,
+ required String nationalId,
+ required String mobileNumber,
+ BuildContext? context,
+ }) async {
+ String url = "${ApiConsts.erpRest}Mohemm_CheckOTP_Dependent";
+ Map postParams = {
+ "LogInTokenID": logInTokenID,
+ "activationCode": activationCode,
+ "P_USER_NAME": nationalId,
+ "P_DEP_NATIONAL_ID": nationalId,
+ "MobileNumber": mobileNumber,
+ "LanguageID": context != null ? AppState().getLanguageID(context) : 2,
+ "MobileType": Platform.isAndroid ? "android" : "ios",
+ };
+ return await ApiClient().postJsonForObject((json) {
+ GenericResponseModel responseData = GenericResponseModel.fromJson(json);
+ String effectiveToken = (responseData.authenticationTokenID != null && responseData.authenticationTokenID!.trim().isNotEmpty)
+ ? responseData.authenticationTokenID!.trim()
+ : (AppState().postParamsObject?.tokenID ?? AppState().authenticationTokenID ?? "");
+
+ AppState().postParamsObject?.setTokenID = effectiveToken;
+ AppState().setAuthenticationTokenID = effectiveToken;
+ AppState().postParamsObject?.setLogInTokenID = (responseData.logInTokenID != null && responseData.logInTokenID!.isNotEmpty)
+ ? responseData.logInTokenID!
+ : logInTokenID;
+ AppState().postParamsObject?.setUserName = nationalId;
+ AppState().postParamsObject?.setPUserName = nationalId;
+ AppState().postParamsObject?.setMobileNumer = mobileNumber;
+ AppState().setUserName = nationalId;
+ AppState().isAuthenticated = true;
+ AppState().setLogged = true;
+
+ if (responseData.getWalaplusDepInfoModel != null) {
+ AppState().setWalaplusDepInfoModel = responseData.getWalaplusDepInfoModel;
+ if (responseData.getWalaplusDepInfoModel?.pDependentName != null &&
+ responseData.getWalaplusDepInfoModel!.pDependentName!.trim().isNotEmpty) {
+ AppState().setDependentName = responseData.getWalaplusDepInfoModel!.pDependentName!.trim();
+ }
+ }
+
+ return responseData;
+ }, url, postParams);
+ }
}
diff --git a/lib/api/marathon/marathon_api_client.dart b/lib/api/marathon/marathon_api_client.dart
index d9021c6..2d81c42 100644
--- a/lib/api/marathon/marathon_api_client.dart
+++ b/lib/api/marathon/marathon_api_client.dart
@@ -104,24 +104,18 @@ class MarathonApiClient {
}
Future getNextQuestion({required String? questionId, required String marathonId}) async {
- Map jsonObject = {
- "previousQuestionId": questionId,
- "marathonId": marathonId,
- };
+ Map jsonObject = {"previousQuestionId": questionId, "marathonId": marathonId};
return await ApiClient().postJsonForObject(
(json) {
MarathonGenericModel marathonModel = MarathonGenericModel.fromJson(json);
if (marathonModel.statusCode == 404 || marathonModel.statusCode == 208 || marathonModel.statusCode == 204 || marathonModel.statusCode == 500) {
- Utils.confirmDialog(
- AppRoutes.navigatorKey.currentContext,
+ Utils.showToast(
marathonModel.message!,
- onTap: () {
+ onComplete: () {
AppRoutes.navigatorKey.currentContext!.read().resetValues();
- Navigator.of(
- AppRoutes.navigatorKey.currentContext!,
- ).popUntil(ModalRoute.withName(AppRoutes.dashboard));
+ Navigator.of(AppRoutes.navigatorKey.currentContext!).popUntil(ModalRoute.withName(AppRoutes.dashboard));
},
);
}
@@ -214,99 +208,99 @@ class MarathonApiClient {
return null;
}
-// late HubConnection hubConnection;
-// Future buildHubConnection(BuildContext context, String prizeId) async {
-// HttpConnectionOptions httpOptions = HttpConnectionOptions(skipNegotiation: false, logMessageContent: true);
-// hubConnection = HubConnectionBuilder()
-// .withUrl(
-// ApiConsts.marathonHubConnectionUrl + "?employeeNumber=${AppState().memberInformationList!.eMPLOYEENUMBER ?? ""}&employeeName=${AppState().memberInformationList!.eMPLOYEENAME ?? ""}",
-// options: httpOptions,
-// )
-// .withAutomaticReconnect(
-// retryDelays: [2000, 5000, 10000, 20000],
-// )
-// .configureLogging(
-// Logger("Logging"),
-// )
-// .build();
-// hubConnection.onclose(
-// ({Exception? error}) {
-// logger.i("onclose");
-// },
-// );
-// hubConnection.onreconnecting(
-// ({Exception? error}) {
-// logger.i("onreconnecting");
-// },
-// );
-// hubConnection.onreconnected(
-// ({String? connectionId}) {
-// logger.i("onreconnected");
-// },
-// );
-// if (hubConnection.state != HubConnectionState.Connected) {
-// await hubConnection.start();
-// logger.i("Started HubConnection");
-//
-// await hubConnection.invoke(
-// "AddParticipant",
-// args: