From 9e7489d5e3e83a92cc15656ac5925c933360e4ac Mon Sep 17 00:00:00 2001 From: blackbelts <74664702+eslamtalaat74@users.noreply.github.com> Date: Sun, 20 Jul 2025 11:35:14 +0300 Subject: [PATCH] activity --- .../odex25_program_activity/__init__.py | 1 + .../odex25_program_activity/__manifest__.py | 19 + .../data/ir_sequence_data.xml | 52 ++ .../odex25_program_activity/i18n/ar_001.po | 569 ++++++++++++++++ .../models/__init__.py | 1 + .../odex25_program_activity/models/program.py | 449 +++++++++++++ .../security/ir.model.access.csv | 9 + .../security/security.xml | 22 + .../views/account_asset_view.xml | 3 + .../odex25_program_activity/views/program.xml | 629 ++++++++++++++++++ .../models/__pycache__/benefit.cpython-38.pyc | Bin 72839 -> 76197 bytes .../__pycache__/benefit_config.cpython-38.pyc | Bin 25881 -> 25843 bytes .../__pycache__/family_members.cpython-38.pyc | Bin 22576 -> 23474 bytes .../models/__pycache__/visit.cpython-38.pyc | Bin 5949 -> 6391 bytes .../entity_refused_wizard.cpython-38.pyc | Bin 3257 -> 4507 bytes .../researcher_wizard.cpython-38.pyc | Bin 2516 -> 6057 bytes 16 files changed, 1754 insertions(+) create mode 100644 odex25_ensan/odex25_program_activity/__init__.py create mode 100644 odex25_ensan/odex25_program_activity/__manifest__.py create mode 100644 odex25_ensan/odex25_program_activity/data/ir_sequence_data.xml create mode 100644 odex25_ensan/odex25_program_activity/i18n/ar_001.po create mode 100644 odex25_ensan/odex25_program_activity/models/__init__.py create mode 100644 odex25_ensan/odex25_program_activity/models/program.py create mode 100644 odex25_ensan/odex25_program_activity/security/ir.model.access.csv create mode 100644 odex25_ensan/odex25_program_activity/security/security.xml create mode 100644 odex25_ensan/odex25_program_activity/views/account_asset_view.xml create mode 100644 odex25_ensan/odex25_program_activity/views/program.xml diff --git a/odex25_ensan/odex25_program_activity/__init__.py b/odex25_ensan/odex25_program_activity/__init__.py new file mode 100644 index 000000000..0650744f6 --- /dev/null +++ b/odex25_ensan/odex25_program_activity/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/odex25_ensan/odex25_program_activity/__manifest__.py b/odex25_ensan/odex25_program_activity/__manifest__.py new file mode 100644 index 000000000..60bb5b49d --- /dev/null +++ b/odex25_ensan/odex25_program_activity/__manifest__.py @@ -0,0 +1,19 @@ +{ + 'name': 'Odex25 Activity Custom', + 'description': 'This module extends Real Estate module by adding new fields and menu for waqf owners', + 'author': 'Expert Co. Ltd.', + 'website': 'http://exp-sa.com', + 'category': 'Odex25-Ensan activity', + 'depends': ['base','mail','odex_takaful'], + 'data': [ + 'security/security.xml', + 'security/ir.model.access.csv', + 'data/ir_sequence_data.xml', + + 'views/program.xml', + + + ], + 'installable': True, + 'auto_install': False +} diff --git a/odex25_ensan/odex25_program_activity/data/ir_sequence_data.xml b/odex25_ensan/odex25_program_activity/data/ir_sequence_data.xml new file mode 100644 index 000000000..bc987d573 --- /dev/null +++ b/odex25_ensan/odex25_program_activity/data/ir_sequence_data.xml @@ -0,0 +1,52 @@ + + + Level Code + pa.program.level + LVL/ + 1 + 1 + 4 + + + + + Track Code + pa.program.track + TRK/ + 1 + 1 + 4 + + + Program Code + pa.program + PRG/ + 1 + 1 + 4 + + + Activity Code + pa.program.activity + ACT/ + 1 + 1 + 4 + + + Medad Code + pa.program.medad + MD/ + 1 + 1 + 4 + + + Registration Code + pa.program.registration + PA/ + 1 + 1 + 4 + + diff --git a/odex25_ensan/odex25_program_activity/i18n/ar_001.po b/odex25_ensan/odex25_program_activity/i18n/ar_001.po new file mode 100644 index 000000000..0ddc30423 --- /dev/null +++ b/odex25_ensan/odex25_program_activity/i18n/ar_001.po @@ -0,0 +1,569 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * ensan_real_estate +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-10-22 12:14+0000\n" +"PO-Revision-Date: 2024-10-22 15:14+0300\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: ar\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5);\n" +"X-Generator: Poedit 3.5\n" + +#. module: ensan_real_estate +#: model_terms:ir.ui.view,arch_db:ensan_real_estate.internal_property_kanban_inherit +msgid "" +"\n" +" Evaluation:\n" +" " +msgstr "" +"\n" +" التقييم:\n" +" " + +#. module: ensan_real_estate +#: model_terms:ir.ui.view,arch_db:ensan_real_estate.internal_property_form_inherit +msgid "( On" +msgstr " ( التاريخ " + +#. module: ensan_real_estate +#: model_terms:ir.ui.view,arch_db:ensan_real_estate.internal_property_form_inherit +msgid ": Lat :" +msgstr " : خط العرض : " + +#. module: ensan_real_estate +#: model_terms:ir.ui.view,arch_db:ensan_real_estate.internal_property_form_inherit +msgid "; Long:" +msgstr " ; خط الطول : " + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_property_evaluation__message_needaction +msgid "Action Needed" +msgstr "إجراء مطلوب" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_property_evaluation__activity_ids +msgid "Activities" +msgstr "الأنشطة" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_property_evaluation__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "زخرفة استثناء النشاط" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_property_evaluation__activity_state +msgid "Activity State" +msgstr "حالة النشاط" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_property_evaluation__activity_type_icon +msgid "Activity Type Icon" +msgstr "أيقونة نوع النشاط" + +#. module: ensan_real_estate +#: model:res.groups,name:ensan_real_estate.group_real_estate_evaluation_admin +msgid "Admin" +msgstr "مدير" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_internal_property__account_asset_id +#: model_terms:ir.ui.view,arch_db:ensan_real_estate.internal_property_form_inherit +msgid "Asset" +msgstr " الأصل الثابت" + +#. module: ensan_real_estate +#: model:ir.model,name:ensan_real_estate.model_account_asset +msgid "Asset/Revenue Recognition" +msgstr "إثبات الأصل/الربح" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_internal_property__attach_nbr +msgid "Attach Nbr" +msgstr "عدد المرفقات" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_property_evaluation__message_attachment_count +msgid "Attachment Count" +msgstr "عدد المرفقات" + +#. module: ensan_real_estate +#: model_terms:ir.ui.view,arch_db:ensan_real_estate.property_evaluation_form_view +msgid "Close" +msgstr "إغلاق" + +#. module: ensan_real_estate +#: model:ir.model.fields.selection,name:ensan_real_estate.selection__internal_property__last_evaluation_state__closed +#: model:ir.model.fields.selection,name:ensan_real_estate.selection__property_evaluation__state__closed +msgid "Closed" +msgstr "مغلق" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_internal_property__conditional_percentage_owner +msgid "Conditional Percentage Owner" +msgstr "النسبة المشروطة من الواقف" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_internal_property__country_id +msgid "Country" +msgstr "البلد" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_property_evaluation__create_uid +msgid "Created by" +msgstr "أنشأ من قبل" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_property_evaluation__create_date +msgid "Created on" +msgstr "تاريخ الإنشاء" + +#. module: ensan_real_estate +#: model_terms:ir.ui.view,arch_db:ensan_real_estate.internal_property_kanban_inherit +msgid "Date:" +msgstr "تاريخ التقييم" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_property_evaluation__display_name +msgid "Display Name" +msgstr "الاسم المعروض" + +#. module: ensan_real_estate +#: model_terms:ir.ui.view,arch_db:ensan_real_estate.internal_property_form_inherit +msgid "Documents" +msgstr "الوثائق" + +#. module: ensan_real_estate +#: model:ir.model.fields.selection,name:ensan_real_estate.selection__internal_property__last_evaluation_state__draft +#: model:ir.model.fields.selection,name:ensan_real_estate.selection__property_evaluation__state__draft +msgid "Draft" +msgstr "مسودة" + +#. module: ensan_real_estate +#: model_terms:ir.ui.view,arch_db:ensan_real_estate.property_evaluation_form_view +msgid "Evaluate" +msgstr "تقييم" + +#. module: ensan_real_estate +#: model:ir.model.fields.selection,name:ensan_real_estate.selection__internal_property__last_evaluation_state__evaluated +#: model:ir.model.fields.selection,name:ensan_real_estate.selection__property_evaluation__state__evaluated +msgid "Evaluated" +msgstr "تم التقييم" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_property_evaluation__evaluated_value +msgid "Evaluated Value" +msgstr "القيمة بعد التقييم" + +#. module: ensan_real_estate +#: model_terms:ir.ui.view,arch_db:ensan_real_estate.internal_property_form_inherit +#: model_terms:ir.ui.view,arch_db:ensan_real_estate.view_account_asset_form_inherits +msgid "Evaluation" +msgstr "نتائج التقييم العقاري" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_property_evaluation__date +msgid "Evaluation Date" +msgstr "تاريخ التقييم" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_account_asset__evaluation_nbr +#: model:ir.model.fields,field_description:ensan_real_estate.field_internal_property__evaluation_nbr +msgid "Evaluation Nbr" +msgstr "رقم التقييم" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_property_evaluation__message_follower_ids +msgid "Followers" +msgstr "المتابعون" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_property_evaluation__message_channel_ids +msgid "Followers (Channels)" +msgstr "المتابعون (القنوات)" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_property_evaluation__message_partner_ids +msgid "Followers (Partners)" +msgstr "المتابعون (الشركاء)" + +#. module: ensan_real_estate +#: model:ir.model.fields,help:ensan_real_estate.field_property_evaluation__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "رمز الخط الرائع ، على سبيل المثال FA- المهام" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_internal_property__building_latitude +msgid "Geo Latitude" +msgstr "خط العرض الجغرافي" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_internal_property__building_longitude +msgid "Geo Longitude" +msgstr "خط الطول الجغرافي" + +#. module: ensan_real_estate +#: model_terms:ir.ui.view,arch_db:ensan_real_estate.internal_property_form_inherit +msgid "Geolocate" +msgstr "الموقع الجغرافي" + +#. module: ensan_real_estate +#: model_terms:ir.ui.view,arch_db:ensan_real_estate.internal_property_form_inherit +msgid "Geolocation" +msgstr "إحداثيات العقار" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_internal_property__date_localization +msgid "Geolocation Date" +msgstr "تاريخ الحصول على الإحداثيات" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_property_evaluation__id +msgid "ID" +msgstr "المُعرف" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_property_evaluation__activity_exception_icon +msgid "Icon" +msgstr "الأيقونة" + +#. module: ensan_real_estate +#: model:ir.model.fields,help:ensan_real_estate.field_property_evaluation__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "الأيقونة للإشارة إلى استثناء النشاط" + +#. module: ensan_real_estate +#: model:ir.model.fields,help:ensan_real_estate.field_property_evaluation__message_needaction +#: model:ir.model.fields,help:ensan_real_estate.field_property_evaluation__message_unread +msgid "If checked, new messages require your attention." +msgstr "إذا كان محددًا، فهناك رسائل جديدة تحتاج لرؤيتها." + +#. module: ensan_real_estate +#: model:ir.model.fields,help:ensan_real_estate.field_property_evaluation__message_has_error +#: model:ir.model.fields,help:ensan_real_estate.field_property_evaluation__message_has_sms_error +msgid "If checked, some messages have a delivery error." +msgstr "إذا كان محددًا، فقد حدث خطأ في تسليم بعض الرسائل." + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_property_evaluation__message_is_follower +msgid "Is Follower" +msgstr "متابع" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_account_asset__is_property +msgid "Is Property" +msgstr "هل هو عقار؟" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_benefits_representative__is_property_evaluator +#: model:ir.model.fields,field_description:ensan_real_estate.field_external_benefits__is_property_evaluator +#: model:ir.model.fields,field_description:ensan_real_estate.field_grant_benefit__is_property_evaluator +#: model:ir.model.fields,field_description:ensan_real_estate.field_res_partner__is_property_evaluator +#: model:ir.model.fields,field_description:ensan_real_estate.field_res_users__is_property_evaluator +#: model:ir.model.fields,field_description:ensan_real_estate.field_takaful_sponsor__is_property_evaluator +msgid "Is Property Evaluator" +msgstr "مقيّم العقار" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_internal_property__is_waqf +msgid "Is Waqf" +msgstr "هل وقف" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_benefits_representative__is_waqf_owner +#: model:ir.model.fields,field_description:ensan_real_estate.field_external_benefits__is_waqf_owner +#: model:ir.model.fields,field_description:ensan_real_estate.field_grant_benefit__is_waqf_owner +#: model:ir.model.fields,field_description:ensan_real_estate.field_res_partner__is_waqf_owner +#: model:ir.model.fields,field_description:ensan_real_estate.field_res_users__is_waqf_owner +#: model:ir.model.fields,field_description:ensan_real_estate.field_takaful_sponsor__is_waqf_owner +msgid "Is Waqf Owner" +msgstr "مالك وقف؟" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_internal_property__last_evaluation_date +msgid "Last Evaluation Date" +msgstr "تاريخ آخر تقييم" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_internal_property__last_evaluation_state +msgid "Last Evaluation State" +msgstr "حالة آخر تقييم" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_internal_property__last_evaluation_pric +msgid "Last Evaluation Price" +msgstr "سعر آخر تقييم" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_property_evaluation____last_update +msgid "Last Modified on" +msgstr "آخر تعديل في" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_property_evaluation__write_uid +msgid "Last Updated by" +msgstr "آخر تحديث من قبل" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_property_evaluation__write_date +msgid "Last Updated on" +msgstr "آخر تحديث في" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_property_evaluation__message_main_attachment_id +msgid "Main Attachment" +msgstr "المرفق الرئيسي" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_property_evaluation__message_has_error +msgid "Message Delivery error" +msgstr "خطأ في تسليم الرسائل" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_property_evaluation__message_ids +msgid "Messages" +msgstr "الرسائل" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_property_evaluation__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "نهاية الوقت المعين للنشاط" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_property_evaluation__name +#: model_terms:ir.ui.view,arch_db:ensan_real_estate.property_evaluation_form_view +msgid "Name" +msgstr "الاسم" + +#. module: ensan_real_estate +#: code:addons/ensan_real_estate/models/property_evaluation.py:0 +#, python-format +msgid "New" +msgstr "" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_property_evaluation__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "الموعد النهائي للنشاط التالي" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_property_evaluation__activity_summary +msgid "Next Activity Summary" +msgstr "ملخص النشاط التالي" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_property_evaluation__activity_type_id +msgid "Next Activity Type" +msgstr "نوع النشاط التالي" + +#. module: ensan_real_estate +#: model:ir.model.fields.selection,name:ensan_real_estate.selection__internal_property__stamping_state__not_updated +msgid "Not Updated" +msgstr "لم يتم التحديث" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_property_evaluation__message_needaction_counter +msgid "Number of Actions" +msgstr "عدد الإجراءات" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_property_evaluation__message_has_error_counter +msgid "Number of errors" +msgstr "عدد الاخطاء" + +#. module: ensan_real_estate +#: model:ir.model.fields,help:ensan_real_estate.field_property_evaluation__message_needaction_counter +msgid "Number of messages which requires an action" +msgstr "عدد الرسائل التي تتطلب إجراء" + +#. module: ensan_real_estate +#: model:ir.model.fields,help:ensan_real_estate.field_property_evaluation__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "عدد الرسائل الحادث بها خطأ في التسليم" + +#. module: ensan_real_estate +#: model:ir.model.fields,help:ensan_real_estate.field_property_evaluation__message_unread_counter +msgid "Number of unread messages" +msgstr "عدد الرسائل الجديدة" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_property_evaluation__price_per_meter +msgid "Price Per Meter" +msgstr "سعر المتر" + +#. module: ensan_real_estate +#: model:ir.model,name:ensan_real_estate.model_internal_property +#: model:ir.model.fields,field_description:ensan_real_estate.field_account_asset__property_id +#: model:ir.model.fields,field_description:ensan_real_estate.field_property_evaluation__property_id +msgid "Property" +msgstr "العقار" + +#. module: ensan_real_estate +#: model:ir.actions.act_window,name:ensan_real_estate.property_evaluation_act_window +#: model:ir.model,name:ensan_real_estate.model_property_evaluation +#: model:ir.model.fields,field_description:ensan_real_estate.field_account_asset__property_evaluation_id +#: model:ir.model.fields,field_description:ensan_real_estate.field_internal_property__property_evaluation_ids +#: model:ir.ui.menu,name:ensan_real_estate.property_evaluation_main_menu +#: model:ir.ui.menu,name:ensan_real_estate.property_evaluation_menu +#: model_terms:ir.ui.view,arch_db:ensan_real_estate.property_evaluation_form_view +#: model_terms:ir.ui.view,arch_db:ensan_real_estate.property_evaluation_tree_view +msgid "Property Evaluation" +msgstr "تقييم العقار" + +#. module: ensan_real_estate +#: model_terms:ir.ui.view,arch_db:ensan_real_estate.internal_property_form_inherit +#: model_terms:ir.ui.view,arch_db:ensan_real_estate.view_account_asset_form_inherits +msgid "Property Evaluation(s)" +msgstr "تقييمات العقار" + +#. module: ensan_real_estate +#: model:ir.actions.act_window,name:ensan_real_estate.property_evaluator_act_window +#: model:ir.model.fields,field_description:ensan_real_estate.field_property_evaluation__property_evaluator +msgid "Property Evaluator" +msgstr "مقيّم العقار" + +#. module: ensan_real_estate +#: model:ir.ui.menu,name:ensan_real_estate.property_evaluator_menu +msgid "Property Evaluators" +msgstr "مقيّمي العقار" + +#. module: ensan_real_estate +#: code:addons/ensan_real_estate/models/property_evaluation.py:0 +#, python-format +msgid "Property Evalutation for %s already exist in %s" +msgstr "تقييم العقار %s موجودة بالفعل في سنة %s" + +#. module: ensan_real_estate +#: model:ir.module.category,name:ensan_real_estate.real_estate_evaluation_category +msgid "Real State/Evaluation" +msgstr "العقارات/التقييم" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_property_evaluation__reason +msgid "Reason/Justification" +msgstr "السببظ المبرر" + +#. module: ensan_real_estate +#: model:ir.model,name:ensan_real_estate.model_res_partner +msgid "Renter" +msgstr "" + +#. module: ensan_real_estate +#: model_terms:ir.ui.view,arch_db:ensan_real_estate.property_evaluation_form_view +msgid "Reset To Draft" +msgstr "إعادة التقييم إلى مبدئ" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_property_evaluation__activity_user_id +msgid "Responsible User" +msgstr "المستخدم المسؤول" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_property_evaluation__message_has_sms_error +msgid "SMS Delivery error" +msgstr "خطأ في تسليم الرسائل القصيرة" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_internal_property__stamping_state +msgid "Stamping State" +msgstr "حالة الصك" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_internal_property__state_id +#: model:ir.model.fields,field_description:ensan_real_estate.field_property_evaluation__state +msgid "State" +msgstr "المحافظة" + +#. module: ensan_real_estate +#: model_terms:ir.ui.view,arch_db:ensan_real_estate.internal_property_kanban_inherit +msgid "State:" +msgstr "حالة التقييم:" + +#. module: ensan_real_estate +#: model:ir.actions.act_window,name:ensan_real_estate.action_country_state_real_estate +#: model:ir.ui.menu,name:ensan_real_estate.menu_country_state_real_estate +msgid "States" +msgstr "المحافظات" + +#. module: ensan_real_estate +#: model:ir.model.fields,help:ensan_real_estate.field_property_evaluation__activity_state +msgid "" +"Status based on activities\n" +"Overdue: Due date is already passed\n" +"Today: Activity date is today\n" +"Planned: Future activities." +msgstr "" +"الحالة على أساس الأنشطة\n" +"المتأخرة: تاريخ الاستحقاق مر\n" +"اليوم: تاريخ النشاط هو اليوم\n" +"المخطط: الأنشطة المستقبلية." + +#. module: ensan_real_estate +#: model:ir.model.fields,help:ensan_real_estate.field_property_evaluation__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "نوع النشاط الاستثنائي المسجل." + +#. module: ensan_real_estate +#: model_terms:ir.ui.view,arch_db:ensan_real_estate.property_evaluation_form_view +msgid "Under Evaluation" +msgstr "تحت التقييم" + +#. module: ensan_real_estate +#: model:ir.model.fields.selection,name:ensan_real_estate.selection__internal_property__last_evaluation_state__under_evaluation +#: model:ir.model.fields.selection,name:ensan_real_estate.selection__property_evaluation__state__under_evaluation +msgid "Under evaluation" +msgstr "تحت التقييم" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_property_evaluation__message_unread +msgid "Unread Messages" +msgstr "الرسائل الجديدة" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_property_evaluation__message_unread_counter +msgid "Unread Messages Counter" +msgstr "عدد الرسائل الجديدة" + +#. module: ensan_real_estate +#: model:ir.model.fields.selection,name:ensan_real_estate.selection__internal_property__stamping_state__updated +msgid "Updated" +msgstr "تم التحديث" + +#. module: ensan_real_estate +#: model:res.groups,name:ensan_real_estate.group_real_estate_evaluation_user +msgid "User" +msgstr "مستخدم" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_internal_property__waqf_owner +msgid "Waqf Owner" +msgstr "مالك الوقف" + +#. module: ensan_real_estate +#: model:ir.actions.act_window,name:ensan_real_estate.waqf_owners_act_window +#: model:ir.ui.menu,name:ensan_real_estate.waqf_owners_menu +msgid "Waqf Owners" +msgstr "أصحاب الوقف" + +#. module: ensan_real_estate +#: model:ir.model.fields,field_description:ensan_real_estate.field_property_evaluation__website_message_ids +msgid "Website Messages" +msgstr "رسائل الموقع" + +#. module: ensan_real_estate +#: model:ir.model.fields,help:ensan_real_estate.field_property_evaluation__website_message_ids +msgid "Website communication history" +msgstr "سجل تواصل الموقع" + + +#. module: ensan_real_estate +#: model:ir.ui.view,arch_db:ensan_real_estate.property_evaluation_form_view +msgid "Are you sure you want to reset the request to draft?" +msgstr "هل أنت متأكد من إعادة الطلب إلى مبدئي؟" diff --git a/odex25_ensan/odex25_program_activity/models/__init__.py b/odex25_ensan/odex25_program_activity/models/__init__.py new file mode 100644 index 000000000..eda8aca9b --- /dev/null +++ b/odex25_ensan/odex25_program_activity/models/__init__.py @@ -0,0 +1 @@ +from . import program diff --git a/odex25_ensan/odex25_program_activity/models/program.py b/odex25_ensan/odex25_program_activity/models/program.py new file mode 100644 index 000000000..af021971a --- /dev/null +++ b/odex25_ensan/odex25_program_activity/models/program.py @@ -0,0 +1,449 @@ +from odoo import models, fields, api, _ +from odoo.exceptions import ValidationError + + +class PaProgramLevel(models.Model): + _name = 'pa.program.level' + _description = 'شاشة المستويات (Levels)' + _rec_name = 'name' + _order = 'code' + + code = fields.Char( + string='كود المستوى', + required=True, + copy=False, + readonly=True, + index=True, + default=lambda self: self.env['ir.sequence'].next_by_code('pa.program.level') or _('New'), + ) + + name = fields.Char( + string='اسم المستوى', + required=True, + default=lambda self: _('مسارات تقنية'), + help='اكتب اسم المستوى مثل: ثقافية، معرفية، دينية، تنموية، وقائية، علاجية', + ) + + type = fields.Selection([ + ('route', 'مسارات'), + ('activity', 'أنشطة'), + ('medad', 'مداد'), + ], string='نوع المستوى', required=True, help='حدد نوع المستوى') + + description = fields.Text(string='وصف المستوى') + + active = fields.Boolean(string='حالة المستوى', default=True) + + track_ids = fields.One2many( + 'pa.program.track', # Related model + 'level_id', # Many2one field on pa.program.track + string='المسارات المرتبطة', + help='المسارات التي تنتمي إلى هذا المستوى', + ) + + # Optional: enforce unique code at Python level + @api.model + def create(self, vals): + if 'code' in vals: + existing = self.search([('code', '=', vals['code'])]) + if existing: + raise ValidationError(_('كود المستوى يجب أن يكون فريدًا')) + return super(PaProgramLevel, self).create(vals) + +class PaProgramTrack(models.Model): + _name = 'pa.program.track' + _description = 'شاشة المسارات (Tracks)' + _rec_name = 'name' + _order = 'code' + + code = fields.Char( + string='كود المسار', + required=True, + copy=False, + readonly=True, + index=True, + default=lambda self: self.env['ir.sequence'].next_by_code('pa.program.track') or _('New'), + ) + name = fields.Char(string='اسم المسار', required=True) + description = fields.Text(string='وصف المسار') + + branch = fields.Char(string='الفرع') # link to branch model if available + + gender = fields.Selection( + [('male', 'ذكر'), ('female', 'انثى')], + string='الجنس', + ) + + age_category = fields.Many2one( + 'age.category', # replace with your actual age category model + string='الفئة العمرية', + help='تصفية المسار على حسب الفئة العمرية', + ) + + study_category = fields.Char(string='الفئة الدراسية') + hobby = fields.Char(string='الهواية') + study_status = fields.Char(string='الحالة الدراسية') + health_status = fields.Char(string='الحالة الصحية') + education_status = fields.Char(string='الحالة التعليمية') + + partner_id = fields.Many2one( + 'res.partner', + string='الشريك المرتبط', + help='الشريك المرتبط بالمسار' + ) + + active = fields.Boolean(string='حالة المسار', default=True) + + level_id = fields.Many2one( + 'pa.program.level', + string='المستوى المرتبط', + required=True, + ondelete='cascade' + ) + +class PaProgram(models.Model): + _name = 'pa.program' + _description = 'شاشة البرامج (Programs)' + _rec_name = 'name' + _order = 'code' + + code = fields.Char( + string='كود البرنامج', + required=True, + copy=False, + readonly=True, + index=True, + default=lambda self: self.env['ir.sequence'].next_by_code('pa.program') or _('New'), + ) + + name = fields.Char(string='اسم البرنامج', required=True) + + program_type_id = fields.Many2one( + 'pa.program.type', + string='نوع البرنامج', + required=True, + help='نوع البرنامج المسجل في إعدادات أنواع البرامج' + ) + + payment_type = fields.Selection([ + ('paid', 'مدفوع'), + ('unpaid', 'غير مدفوع') + ], string='نوع الدفع', required=True) + + sponsor_id = fields.Many2one('takaful.sponsorship', string='الكافل المرتبط', + + help='الكافل المسجل ويتم اظهاره فقط في حالة الدفع مدفوع') + + + sponsor_support_amount = fields.Float( + string='المبلغ المخصص للدعم', + related='sponsor_id.total_sponsorship_amount', + readonly=True, + help='المبلغ المخصص للدعم حسب بيانات الكافل' + ) + + budget = fields.Float( + string='الموازنة المخصصة للبرنامج', + help='تستخدم في حالة نوع الدفع = غير مدفوع' + ) + + location = fields.Selection([ + ('inside', 'داخلي'), + ('outside', 'خارجي') + ], string='موقع البرنامج', required=True) + + description = fields.Text(string='وصف البرنامج') + + track_id = fields.Many2one( + 'pa.program.track', + string='المسار المرتبط بالبرنامج', + help='كل برنامج مرتبط بمسار واحد يحتوي على عدة أنشطة' + ) + + analytic_account_id = fields.Many2one( + 'account.analytic.account', + string='الحساب التحليلي المرتبط', + readonly=True, + help='ينشأ تلقائياً بحساب تحليلي بنفس اسم البرنامج ولا يمكن حذفه' + ) + + estimated_budget = fields.Float( + string='الموازنة التقديرية المرتبطة', + help='الموازنة المرتبطة بالحساب التحليلي' + ) + + active = fields.Boolean(string='حالة البرنامج', default=True) + + @api.constrains('payment_type', 'sponsor_id') + def _check_sponsor_if_paid(self): + for record in self: + if record.payment_type == 'paid' and not record.sponsor_id: + raise ValidationError(_('يجب اختيار الكافل في حالة نوع الدفع مدفوع')) + if record.payment_type == 'unpaid' and record.sponsor_id: + raise ValidationError(_('لا يجب اختيار كافل في حالة نوع الدفع غير مدفوع')) + + @api.model + def create(self, vals): + # You can add logic here to create analytic account automatically if needed + res = super(PaProgram, self).create(vals) + if not res.analytic_account_id: + account = self.env['account.analytic.account'].create({ + 'name': res.name, + 'active': True, + }) + res.analytic_account_id = account.id + return res + + def write(self, vals): + res = super(PaProgram, self).write(vals) + for record in self: + # Ensure analytic account exists + if not record.analytic_account_id: + account = self.env['account.analytic.account'].create({ + 'name': record.name, + 'active': True, + }) + record.analytic_account_id = account.id + return res + +class PaProgramActivity(models.Model): + _name = 'pa.program.activity' + _description = 'Program Activity' + _rec_name = 'name' + + code = fields.Char("كود النشاط", required=True, copy=False, default=lambda self: self.env['ir.sequence'].next_by_code('pa.program.activity')) + name = fields.Char("اسم النشاط", required=True) + description = fields.Text("وصف النشاط") + program_id = fields.Many2one('pa.program', string="البرنامج المرتبط") + location = fields.Selection([('inside','داخلي'), ('outside','خارجي')], required=True, string="موقع النشاط") + date_start = fields.Datetime("تاريخ بداية النشاط") + date_end = fields.Datetime("تاريخ انتهاء النشاط") + analytic_account_id = fields.Many2one('account.analytic.account', string="الحساب التحليلي المرتبط") + estimated_budget = fields.Float("الموازنة التقديرية المرتبطة") + active = fields.Boolean("نشط", default=True) + +class PaProgramMedad(models.Model): + _name = 'pa.program.medad' + _description = 'Medad' + _rec_name = 'name' + + code = fields.Char("كود مداد", required=True, copy=False, default=lambda self: self.env['ir.sequence'].next_by_code('pa.program.medad')) + name = fields.Char("اسم المداد", required=True) + description = fields.Text("وصف المداد") + medad_type = fields.Selection([('skills','مهارات'),('training','تدريب'),('innovation','دعم ابتكار')], string="نوع مداد", required=True) + activity_id = fields.Many2one('pa.program.activity', string="النشاط المرتبط") + analytic_account_id = fields.Many2one('account.analytic.account', string="الحساب التحليلي المرتبط") + estimated_budget = fields.Float("الموازنة التقديرية المرتبطة") + active = fields.Boolean("نشط", default=True) + +# Example family/beneficiary for demo: you should replace with your actual model +class Family(models.Model): + _name = 'pa.family' + _description = 'Family' + code = fields.Char("كود الأسرة", required=True) + mobile = fields.Char("رقم الجوال") + category = fields.Char("فئة الأسرة") + branch = fields.Char("الفرع") + gender = fields.Selection([('male', 'ذكر'), ('female', 'انثى')], string="جنس الأسرة") + age_category = fields.Char("الفئة العمرية") + study_category = fields.Char("الفئة الدراسية") + hobby = fields.Char("الهواية") + study_status = fields.Char("الحالة الدراسية") + health_status = fields.Char("الحالة الصحية") + education_status = fields.Char("الحالة التعليمية") + widow = fields.Boolean("الأم أرملة؟") + sons = fields.Integer("عدد الأولاد") + daughters = fields.Integer("عدد البنات") + mother_name = fields.Char("اسم الأم") + mother_alive = fields.Boolean("هل الأم على قيد الحياة") + mother_residence = fields.Char("سكن الأم") + mother_education = fields.Char("الحالة التعليمية للأم") + mother_employed = fields.Boolean("هل الأم تعمل") + residence_type = fields.Char("نوع السكن") + child_education = fields.Char("الحالة التعليمية للابن/الابنة") + child_health = fields.Char("الحالة الصحية للابن/الابنة") + need_transport = fields.Boolean("هل يحتاج إلى مواصلات؟") + has_disability = fields.Boolean("هل لديه اعاقة؟") + takes_medicine = fields.Boolean("هل يتناول ادوية؟") + has_psych_issues = fields.Boolean("هل يوجد اضطرابات نفسية؟") + + +class PaProgramActivityRegistration(models.Model): + _name = 'pa.program.activity.registration' + _description = 'تسجيل الأنشطة' + _inherit = ['mail.thread'] + + name = fields.Char(string='رقم الطلب', readonly=True, index=True, + default=lambda self: self.env['ir.sequence'].next_by_code('pa.program.activity.registration') or 'New') + request_date = fields.Datetime(string='تاريخ الطلب', default=fields.Datetime.now, readonly=True) + creator_id = fields.Many2one('res.users', string='المنشئ', default=lambda self: self.env.user, readonly=True) + + date_from = fields.Datetime(string='التاريخ من') + date_to = fields.Datetime(string='التاريخ الى') + + family_id = fields.Many2one('pa.family', string='الأسرة') + familye_id = fields.Many2one('grant.benefit', string='الأسرة') + + member_ids = fields.One2many( + 'family.member', + 'benefit_id', + string='عضو الأسرة', + ) + + + branch_custom_id = fields.Many2one(string='الفرع', related='familye_id.branch_custom_id', readonly=True) + gender = fields.Selection(related='familye_id.gender', readonly=True) + # age_category = fields.Char(string='الفئة العمرية', related='familye_id.age_category', readonly=True) + # study_category = fields.Char(string='الفئة الدراسية', related='familye_id.study_category', readonly=True) + nationality_id = fields.Many2one(string='الهواية', related='familye_id.nationality_id', readonly=True) + graduation_status = fields.Selection(string='الحالة الدراسية', related='familye_id.graduation_status', readonly=True) + health_status = fields.Selection(string='الحالة الصحية', related='familye_id.health_status', readonly=True) + education_status = fields.Selection(string='الحالة التعليمية', related='familye_id.education_status', readonly=True) + + + + # sons_count = fields.Integer(string='عدد الأولاد في الأسرة', related='familye_id.sons_count', readonly=True) + # daughters_count = fields.Integer(string='عدد البنات في الأسرة', related='familye_id.daughters_count', readonly=True) + + + + mother_is_life = fields.Boolean(string='هل الأم على قيد الحياة', related='familye_id.mother_is_life', readonly=True) + mother_location_conf = fields.Many2one(string='سكن الأم', related='familye_id.mother_location_conf', readonly=True) + # mother_education_status_ids = fields.Many2many(string='الحالة التعليمية للأم', + # related='familye_id.mother_education_status_ids', readonly=True) + is_mother_work = fields.Boolean(string='هل الأم تعمل', related='familye_id.is_mother_work', readonly=True) + + housing_type = fields.Selection(string='نوع السكن', related='familye_id.housing_type', readonly=True) + + + beneficiary_relation = fields.Selection([('mother', 'أم'), ('son', 'ابن'), ('daughter', 'ابنه')], string='الجهة المستفيدة') + beneficiary_ids = fields.Many2many('res.partner', string='اسم المستفيد') + mobile = fields.Char(string='رقم الجوال', related='family_id.mobile', readonly=True) + + # familye_member = fields.Many2one( + # 'family.member', + # string='عضو الأسرة', + # domain="[('member_status', '=', 'benefit'), ('benfit_id', '=', familye_id)]" + # ) + # + + widow = fields.Boolean(string="الأم أرملة؟", related='family_id.widow', readonly=True) + + sons = fields.Integer( + string="عدد الأولاد", + compute='_compute_sons_daughters', + store=False + ) + daughters = fields.Integer( + string="عدد البنات", + compute='_compute_sons_daughters', + store=False + ) + + @api.depends('familye_id', 'familye_id.member_ids', 'familye_id.member_ids.relationn', + 'familye_id.member_ids.relationn.relation_type') + def _compute_sons_daughters(self): + for rec in self: + sons = 0 + daughters = 0 + members = rec.familye_id.member_ids.filtered(lambda m: m.relationn) + for member in members: + if member.relationn.relation_type == 'son': + sons += 1 + elif member.relationn.relation_type == 'daughter': + daughters += 1 + rec.sons = sons + rec.daughters = daughters + + level_id = fields.Many2one('pa.program.level', string='مستويات البرامج', required=True) + track_id = fields.Many2one('pa.program.track', string='مسارات البرامج') + program_id = fields.Many2one('pa.program', string='البرامج') + activity_id = fields.Many2one('pa.program.activity', string='الانشطة') + medad_id = fields.Many2one('pa.program.medad', string='مداد') + want_transport = fields.Selection([('yes', 'نعم'), ('no', 'لا')], string='هل يرغب المستفيد في مواصلات') + + state = fields.Selection([ + ('draft', 'مسودة'), + ('social_specialist', 'اخصائي اجتماعي'), + ('operation_manager', 'رئيس العمليات'), + ('branch_manager', 'مدير الفرع'), + ('activity_head', 'رئيس الأنشطة'), + ('finance_manager', 'إدارة المالية'), + ('approved', 'معتمد'), + ('refused', 'مرفوض') + ], default='draft', tracking=True) + + rejection_reason = fields.Text('سبب الارجاع') # To hold the last rejection note + + @api.onchange('familye_id') + def _onchange_familye_id(self): + if self.familye_id: + # Set member_ids to the current members of the selected familye_id + # This links existing family.member records (no create) + self.member_ids = [(6, 0, self.familye_id.member_ids.ids)] + else: + self.member_ids = [(5, 0, 0)] # Clear if no familye_id + + # Validation of required fields based on level type + @api.constrains('level_id', 'track_id', 'program_id', 'activity_id', 'medad_id') + def _check_required_fields_based_on_level(self): + for rec in self: + if not rec.level_id: + continue + lvl_type = rec.level_id.type + if lvl_type == 'route': # مسارات + if not rec.track_id or not rec.program_id: + raise ValidationError(_('لحالة المستوى "مسارات"، الحقول "المسار" و "البرنامج" مطلوبان')) + elif lvl_type == 'activity': # أنشطة + if not rec.track_id or not rec.program_id or not rec.activity_id: + raise ValidationError(_('لحالة المستوى "أنشطة"، الحقول "المسار" و "البرنامج" و "النشاط" مطلوبة')) + elif lvl_type == 'medad': # مداد + if not rec.track_id or not rec.program_id or not rec.activity_id or not rec.medad_id: + raise ValidationError(_('لحالة المستوى "مداد"، جميع الحقول "المسار"، "البرنامج"، "النشاط"، "المداد" مطلوبة')) + + def action_to_social_specialist(self): + self.ensure_one() + self.state = 'social_specialist' + + def action_approve(self): + self.ensure_one() + transition_map = { + 'social_specialist': 'operation_manager', + 'operation_manager': 'branch_manager', + 'branch_manager': 'activity_head', + 'activity_head': 'finance_manager', + 'finance_manager': 'approved', + } + next_state = transition_map.get(self.state) + if next_state: + self.state = next_state + + def action_refuse(self): + self.ensure_one() + self.state = 'refused' + + def action_reset_to_draft(self): + self.ensure_one() + self.state = 'draft' + + def action_return_to_specialist(self): + self.ensure_one() + self.state = 'social_specialist' + + +class PaReturnReasonWizard(models.TransientModel): + _name = 'pa.return.reason.wizard' + _description = 'معالج سبب الارجاع' + + reason = fields.Text(string='سبب الارجاع', required=True) + registration_id = fields.Many2one('pa.program.activity.registration', string='طلب التسجيل') + + def action_confirm_return(self): + if self.registration_id: + self.registration_id.rejection_reason = self.reason + # move back to draft or social_specialist depending on the context/state + if self.registration_id.state == 'operation_manager': + self.registration_id.state = 'social_specialist' + else: + self.registration_id.state = 'draft' + return {'type': 'ir.actions.act_window_close'} diff --git a/odex25_ensan/odex25_program_activity/security/ir.model.access.csv b/odex25_ensan/odex25_program_activity/security/ir.model.access.csv new file mode 100644 index 000000000..60d2d181d --- /dev/null +++ b/odex25_ensan/odex25_program_activity/security/ir.model.access.csv @@ -0,0 +1,9 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +pa_program_level_all,pa.program.level,model_pa_program_level,,1,1,1,1 +pa_program_track_all,pa.program.track,model_pa_program_track,,1,1,1,1 +pa_program_all,pa.program,model_pa_program,,1,1,1,1 +pa_program_activity_all,pa.program.activity,model_pa_program_activity,,1,1,1,1 +pa_program_medad_all,pa.program.medad,model_pa_program_medad,,1,1,1,1 +pa_program_registration_all,pa.program.registration,model_pa_program_activity_registration,,1,1,1,1 +pa_family_all,pa.family,model_pa_family,,1,1,1,1 +pa_return_reason_wizard,pa.return.reason.wizard,model_pa_return_reason_wizard,,1,1,1,1 diff --git a/odex25_ensan/odex25_program_activity/security/security.xml b/odex25_ensan/odex25_program_activity/security/security.xml new file mode 100644 index 000000000..3ea15de8a --- /dev/null +++ b/odex25_ensan/odex25_program_activity/security/security.xml @@ -0,0 +1,22 @@ + + + اخصائى اجتماعى + + + + رئيس العمليات + + + + مدير الفرع + + + + رئيس الأنشطة + + + + ادارة المالية + + + diff --git a/odex25_ensan/odex25_program_activity/views/account_asset_view.xml b/odex25_ensan/odex25_program_activity/views/account_asset_view.xml new file mode 100644 index 000000000..056847fd2 --- /dev/null +++ b/odex25_ensan/odex25_program_activity/views/account_asset_view.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/odex25_ensan/odex25_program_activity/views/program.xml b/odex25_ensan/odex25_program_activity/views/program.xml new file mode 100644 index 000000000..47a124f93 --- /dev/null +++ b/odex25_ensan/odex25_program_activity/views/program.xml @@ -0,0 +1,629 @@ + + + + سبب الإرجاع + pa.return.reason.wizard + form + new + + + + + pa.program.level.tree + pa.program.level + + + + + + + + + + + + + pa.program.level.form + pa.program.level + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + pa.program.level.search + pa.program.level + + + + + + + + + + + مستويات البرامج + pa.program.level + tree,form + + + + + + pa.program.track.tree + pa.program.track + + + + + + + + + + + + + + + + + + + + + pa.program.track.form + pa.program.track + +
+ + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + pa.program.track.search + pa.program.track + + + + + + + + + + + مسارات البرامج + pa.program.track + tree,form + + + + + + pa.program.tree + pa.program + + + + + + + + + + + + + + + + + + pa.program.form + pa.program + +
+ + + + + + + + + + + + + + + + + + + +
+
+
+ + + البرامج + pa.program + tree,form + + + + + pa.program.activity.tree + pa.program.activity + + + + + + + + + + + + + + + pa.program.activity.form + pa.program.activity + +
+ + + + + + + + + + + + + + + + +
+
+
+ + + الأنشطة + pa.program.activity + tree,form + + + + + pa.program.medad.tree + pa.program.medad + + + + + + + + + + + + + pa.program.medad.form + pa.program.medad + +
+ + + + + + + + + + + + + + +
+
+
+ + + مداد + pa.program.medad + tree,form + + + + + + pa.program.activity.registration.form + pa.program.activity.registration + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +