diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..af7c712
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,5 @@
+{
+ "cSpell.words": [
+ "MPLOYEEIMAGE"
+ ]
+}
\ No newline at end of file
diff --git a/assets/images/basic-details.svg b/assets/images/basic-details.svg
new file mode 100644
index 0000000..215f00b
--- /dev/null
+++ b/assets/images/basic-details.svg
@@ -0,0 +1,9 @@
+
diff --git a/assets/images/contact-details.svg b/assets/images/contact-details.svg
new file mode 100644
index 0000000..c9ac5a5
--- /dev/null
+++ b/assets/images/contact-details.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/images/family-members.svg b/assets/images/family-members.svg
new file mode 100644
index 0000000..eca7dd5
--- /dev/null
+++ b/assets/images/family-members.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/personal-info.svg b/assets/images/personal-info.svg
new file mode 100644
index 0000000..9daf5ad
--- /dev/null
+++ b/assets/images/personal-info.svg
@@ -0,0 +1,14 @@
+
diff --git a/assets/images/user-avatar.png b/assets/images/user-avatar.png
new file mode 100644
index 0000000..a16f4d5
Binary files /dev/null and b/assets/images/user-avatar.png differ
diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json
index fe71e90..9efc35d 100644
--- a/assets/langs/ar-SA.json
+++ b/assets/langs/ar-SA.json
@@ -52,6 +52,30 @@
"confirm": "تؤكد",
"passwordChangedSuccessfully": "تم تغيير الرقم السري بنجاح",
"itemsForSale": "سلع للبيع",
+ "attendanceDetails": "تفاصيل الحضور",
+ "order": "الطلبات",
+ "earlyOut": "الخروج مبكرا",
+ "shortage": "ساعات التقصير",
+ "excess": "Excess",
+ "lateIn": "القدوم المتاخر",
+ "approvedCheckOut": "وقت الخروج",
+ "approvedCheckIn": "وقت الدخول",
+ "actualCheckOut": "وقت الخروج",
+ "actualCheckIn": "وقت الدخول",
+ "present": "حضور",
+ "pres": "حضور",
+ "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": "لا تستخدم كلمة مرور حديثة",
"atLeastOneLowercase": "حرف صغير واحد على الأقل",
"atLeastOneUppercase": "حرف كبير واحد على الأقل",
@@ -171,9 +195,6 @@
"rfqUOM": "RFQ UOM",
"rfqQty": "RFQ الكمية",
"rfqNumber": "رقم RFQ",
- "msg": "Hello {} in the {} world ",
- "msg_named": "{} are written in the {lang} language",
- "clickMe": "Click me",
"human": "بشري",
"resources": "موارد",
"details": "تفاصيل",
@@ -210,12 +231,31 @@
"myAttendance": "حضوري",
"workOnBreak": "العمل على استراحة",
"next": "التالي",
+ "completingYear": "نحن نقدر لك لاستكمال خدمة",
+ "year": "سنة",
+ "month": "شهر",
+ "day": "يوم",
+ "address" : "العنوان",
+ "phoneNumber": "رقم الجوال",
+ "businessGroup": "مجموعة العمل",
+ "Payroll": "الراتب",
+ "civilIdentityNumber": "رقم الهويه",
+ "dateOfBirth" : "تاريخ الميلاد",
+ "maritalStatus ": "الحالة الاجتماعية",
+ "fullName": "الأسم الكامل",
+ "remove": "حذف",
"profile": {
"reset_password": {
"label": "Reset Password",
"username": "Username",
"password": "password"
- }
+ },
+ "profileCompletionPer": "استكمال الملف الشخصي",
+ "completeProfile": "الملف الشخصي الكامل",
+ "personalInformation": "معلومات شخصية",
+ "basicDetails": "تفاصيل أساسية",
+ "contactDetails": "بيانات التواصل",
+ "familyDetails": "تفاصيل عائلية"
},
"clicked": {
"zero": "You clicked {} times!",
diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json
index a1bfdfa..9097f9e 100644
--- a/assets/langs/en-US.json
+++ b/assets/langs/en-US.json
@@ -52,6 +52,27 @@
"confirm": "Confirm",
"passwordChangedSuccessfully": "Password changed successfully",
"itemsForSale": "Items for Sale",
+ "attendanceDetails": "Attendance Details",
+ "order": "order",
+ "earlyOut": "Early Out",
+ "shortage": "Shortage",
+ "excess": "Excess",
+ "lateIn": "Late In",
+ "approvedCheckOut": "Approved Check Out",
+ "approvedCheckIn": "Approved Check In",
+ "actualCheckOut": "Actual Check Out",
+ "actualCheckIn": "Actual Check In",
+ "present": "PRESENT 11",
+ "pres": "present",
+ "shiftTime": "Shift Time",
+ "absent": "ABSENT 10",
+ "attendance": "Attendance",
+ "scheduleDays": "Schedule\nDays",
+ "offDays": "Off\nDays",
+ "nonAnalyzed": "Non\nAnalyzed",
+ "shortageHour": "Shortage\nHour",
+ "stats": "Stats",
+ "completed": "Completed",
"doNotUseRecentPassword": "Do not use recent password",
"atLeastOneLowercase": "At least one lowercase",
"atLeastOneUppercase": "At least one uppercase",
@@ -203,6 +224,7 @@
"relatedTo": "Related To",
"requestDate": "Request Date",
"analyzedDate": "Analyzed Date",
+ "approvedCheckIn": "Approved Check In",
"urgent": "Urgent",
"requestDetails": "Request Details",
"approvalLevel": "Approval Level",
@@ -210,12 +232,31 @@
"myAttendance": "My Attendance",
"workOnBreak": "Work On Break",
"next": "Next",
+ "year": "Year",
+ "month": "Month",
+ "day": "Day",
+ "completingYear": "We appreciate you for completing the service of",
+ "address": "Address",
+ "phoneNumber": "Phone Number",
+ "businessGroup": "Business",
+ "Payroll": "Payroll",
+ "civilIdentityNumber": "Civil Identity Number",
+ "dateOfBirth": "Date of Birth",
+ "maritalStatus ": "Marital Status ",
+ "fullName": "Full Name",
+ "remove": "Remove",
"profile": {
"reset_password": {
"label": "Reset Password",
"username": "Username",
"password": "password"
- }
+ },
+ "profileCompletionPer": "Profile Completion",
+ "completeProfile": "Complete Profile",
+ "personalInformation": "Personal Information",
+ "basicDetails": "Basic Details",
+ "contactDetails": "Contact Details",
+ "familyDetails": "Family Members"
},
"clicked": {
"zero": "You clicked {} times!",
diff --git a/lib/api/eit_api_client.dart b/lib/api/eit_api_client.dart
new file mode 100644
index 0000000..e3f78bf
--- /dev/null
+++ b/lib/api/eit_api_client.dart
@@ -0,0 +1,31 @@
+import 'dart:async';
+
+import 'package:mohem_flutter_app/app_state/app_state.dart';
+import 'package:mohem_flutter_app/classes/consts.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/dashboard/get_attendance_tracking_list_model.dart';
+import 'package:mohem_flutter_app/models/dashboard/itg_forms_model.dart';
+import 'package:mohem_flutter_app/models/eit/get_eit_transaction_model.dart';
+import 'package:mohem_flutter_app/models/generic_response_model.dart';
+import 'package:mohem_flutter_app/models/member_login_list_model.dart';
+
+import 'api_client.dart';
+
+class EITApiClient {
+ static final EITApiClient _instance = EITApiClient._internal();
+
+ EITApiClient._internal();
+
+ factory EITApiClient() => _instance;
+
+ Future?> getEITTransactions(String functionName) async {
+ String url = "${ApiConsts.erpRest}GET_EIT_TRANSACTIONS";
+ Map postParams = {'P_FUNCTION_NAME': functionName, "P_MENU_TYPE": "E", "P_PAGE_LIMIT": 50, "P_PAGE_NUM": 1};
+ postParams.addAll(AppState().postParamsJson);
+ return await ApiClient().postJsonForObject((json) {
+ List? responseData = GET_EIT_Transactions_Model.fromJson(json['GetEITTransactionList'][0]).collectionTransaction;
+ return responseData;
+ }, url, postParams);
+ }
+}
diff --git a/lib/api/monthlyAttendance_api_client.dart b/lib/api/monthlyAttendance_api_client.dart
new file mode 100644
index 0000000..4f6aca7
--- /dev/null
+++ b/lib/api/monthlyAttendance_api_client.dart
@@ -0,0 +1,72 @@
+
+import 'dart:async';
+
+import 'package:mohem_flutter_app/app_state/app_state.dart';
+import 'package:mohem_flutter_app/classes/consts.dart';
+import 'package:mohem_flutter_app/models/generic_response_model.dart';
+import 'package:mohem_flutter_app/models/get_day_hours_type_details_list_model.dart';
+import 'package:mohem_flutter_app/models/get_mobile_login_info_list_model.dart';
+import 'package:mohem_flutter_app/models/get_schedule_shifts_details_list_model.dart';
+import 'package:mohem_flutter_app/models/get_time_card_summary_list_model.dart';
+import 'api_client.dart';
+
+class MonthlyAttendanceApiClient {
+ static final MonthlyAttendanceApiClient _instance = MonthlyAttendanceApiClient._internal();
+
+ MonthlyAttendanceApiClient._internal();
+
+ factory MonthlyAttendanceApiClient() => _instance;
+
+
+ Future getTimeCardSummary(String month, int year) async {
+ String url = "${ApiConsts.erpRest}GET_TIME_CARD_SUMMARY";
+ Map postParams = {
+ "P_MENU_TYPE": "E",
+ "P_SELECTED_RESP_ID": -999,
+ "SearchMonth": month,
+ "SearchYear": year,
+ };
+ postParams.addAll(AppState().postParamsJson);
+ return await ApiClient().postJsonForObject((json) {
+ GenericResponseModel? responseData = GenericResponseModel.fromJson(json);
+ return (responseData.getTimeCardSummaryList?.length ?? 0) > 0 ? responseData.getTimeCardSummaryList!.first : null;
+ }, url, postParams);
+ }
+
+ Future> getDayHoursTypeDetails(String month, int year) async {
+ String url = "${ApiConsts.erpRest}GET_DAY_HOURS_TYPE_DETAILS";
+ Map postParams = {
+ "P_MENU_TYPE": "E",
+ "P_PAGE_LIMIT": 100,
+ "P_PAGE_NUM": 1,
+ "P_SELECTED_RESP_ID": -999,
+ "SearchMonth": month,
+ "SearchYear": year,
+ };
+ postParams.addAll(AppState().postParamsJson);
+ // postParams["DeviceToken"] = deviceToken;
+ // postParams["DeviceType"] = deviceType;
+ return await ApiClient().postJsonForObject((json) {
+ GenericResponseModel? responseData = GenericResponseModel.fromJson(json);
+ print("Response Data______");
+ print(responseData.getDayHoursTypeDetailsList!.length);
+ return responseData.getDayHoursTypeDetailsList ?? [];
+ }, url, postParams);
+ }
+
+
+ Future getScheduleShiftsDetails(int pRTPID) async {
+ String url = "${ApiConsts.erpRest}GET_SCHEDULE_SHIFTS_DETAILS";
+ Map postParams = {
+ "P_PAGE_LIMIT": 10,
+ "P_PAGE_NUM": 1,
+ "P_RTP_ID": pRTPID,
+ };
+ postParams.addAll(AppState().postParamsJson);
+ return await ApiClient().postJsonForObject((json) {
+ GenericResponseModel? responseData = GenericResponseModel.fromJson(json);
+ return (responseData.getScheduleShiftsDetailsList?.length ?? 0) > 0 ? responseData.getScheduleShiftsDetailsList!.first : null;
+ }, url, postParams);
+ }
+
+}
\ No newline at end of file
diff --git a/lib/api/profile_api_client.dart b/lib/api/profile_api_client.dart
new file mode 100644
index 0000000..3e254b4
--- /dev/null
+++ b/lib/api/profile_api_client.dart
@@ -0,0 +1,135 @@
+import 'dart:async';
+
+import 'package:mohem_flutter_app/app_state/app_state.dart';
+import 'package:mohem_flutter_app/classes/consts.dart';
+import 'package:mohem_flutter_app/models/generic_response_model.dart';
+import 'package:mohem_flutter_app/models/get_eit_dff_structure_list_model.dart';
+import 'package:mohem_flutter_app/models/get_employee_address_model.dart';
+import 'package:mohem_flutter_app/models/get_employee_basic_details.model.dart';
+import 'package:mohem_flutter_app/models/get_employee_contacts.model.dart';
+import 'package:mohem_flutter_app/models/get_employee_phones_model.dart';
+import 'package:mohem_flutter_app/models/profile/phone_number_types_modek.dart';
+import 'api_client.dart';
+
+class ProfileApiClient {
+ static final ProfileApiClient _instance = ProfileApiClient._internal();
+
+ ProfileApiClient._internal();
+
+ factory ProfileApiClient() => _instance;
+
+ Future> getEmployeeContacts() async {
+ String url = "${ApiConsts.erpRest}GET_EMPLOYEE_CONTACTS";
+ Map postParams = {
+ "P_MENU_TYPE": "E",
+ "P_SELECTED_RESP_ID": -999,
+ };
+ postParams.addAll(AppState().postParamsJson);
+ return await ApiClient().postJsonForObject((json) {
+ GenericResponseModel? responseData = GenericResponseModel.fromJson(json);
+ return responseData.getEmployeeContactsList ?? [];
+ }, url, postParams);
+ }
+
+ Future> getEmployeeBasicDetails() async {
+ String url = "${ApiConsts.erpRest}GET_EMPLOYEE_BASIC_DETAILS";
+ Map postParams = {
+ "P_MENU_TYPE": "E",
+ "P_SELECTED_RESP_ID": -999,
+ };
+ postParams.addAll(AppState().postParamsJson);
+ return await ApiClient().postJsonForObject((json) {
+ GenericResponseModel? responseData = GenericResponseModel.fromJson(json);
+ return responseData.getEmployeeBasicDetailsList ?? [];
+ }, url, postParams);
+ }
+
+ Future> getEmployeePhones() async {
+ String url = "${ApiConsts.erpRest}GET_EMPLOYEE_PHONES";
+ Map postParams = {
+ "P_MENU_TYPE": "E",
+ "P_SELECTED_RESP_ID": -999,
+ };
+ postParams.addAll(AppState().postParamsJson);
+ return await ApiClient().postJsonForObject((json) {
+ GenericResponseModel? responseData = GenericResponseModel.fromJson(json);
+ return responseData.getEmployeePhonesList ?? [];
+ }, url, postParams);
+ }
+
+ Future> getEmployeeAddress() async {
+ String url = "${ApiConsts.erpRest}GET_EMPLOYEE_ADDRESS";
+ Map postParams = {
+ "P_MENU_TYPE": "E",
+ "P_SELECTED_RESP_ID": -999,
+ };
+ postParams.addAll(AppState().postParamsJson);
+ return await ApiClient().postJsonForObject((json) {
+ GenericResponseModel? responseData = GenericResponseModel.fromJson(json);
+ return responseData.getEmployeeAddressList ?? [];
+ }, url, postParams);
+ }
+
+ Future updateEmpImage(img) async {
+ String url = "${ApiConsts.erpRest}UPDATE_EMPLOYEE_IMAGE";
+ Map postParams = {"P_MENU_TYPE": "E", "P_SELECTED_RESP_ID": -999, "P_IMAGE": img};
+ postParams.addAll(AppState().postParamsJson);
+ return await ApiClient().postJsonForObject((json) {
+ // GenericResponseModel? responseData = GenericResponseModel.fromJson(json);
+ return json['UpdateEmployeeImageList'];
+ }, url, postParams);
+ }
+
+ Future getDffStructure(String pFunctionName, String uRL, String requestType) async {
+ String url = ApiConsts.erpRest + uRL;
+ Map postParams = {"P_SELECTED_RESP_ID": -999, "P_MENU_TYPE": "E", "P_FUNCTION_NAME": pFunctionName, "P_REQUEST_TYPE": requestType};
+ postParams.addAll(AppState().postParamsJson);
+ return await ApiClient().postJsonForObject((json) {
+ GenericResponseModel? responseData = GenericResponseModel.fromJson(json);
+ return responseData;
+ }, url, postParams);
+ }
+
+ Future getColStructure(String pFunctionName, String uRL, String requestType) async {
+ String url = ApiConsts.erpRest + uRL;
+ Map postParams = {"P_SELECTED_RESP_ID": -999, "P_MENU_TYPE": "E", "P_FUNCTION_NAME": pFunctionName, "P_REQUEST_TYPE": requestType};
+ postParams.addAll(AppState().postParamsJson);
+ return await ApiClient().postJsonForObject((json) {
+ GenericResponseModel? responseData = GenericResponseModel.fromJson(json);
+ return responseData;
+ }, url, postParams);
+ }
+
+ Future getValueSetValues(String pSegmentName, String pDescFlexContextCode, String pDescFlexName, List