diff --git a/odex25_ensan/ensan_sale_management_takaful/__init__.py b/odex25_ensan/ensan_sale_management_takaful/__init__.py
deleted file mode 100644
index 9a7e03ede..000000000
--- a/odex25_ensan/ensan_sale_management_takaful/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-from . import models
\ No newline at end of file
diff --git a/odex25_ensan/ensan_sale_management_takaful/__manifest__.py b/odex25_ensan/ensan_sale_management_takaful/__manifest__.py
deleted file mode 100644
index 18bdcee24..000000000
--- a/odex25_ensan/ensan_sale_management_takaful/__manifest__.py
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- 'name': 'Ensan Sale Management Takaful',
- 'version': '1.0',
- 'description': 'Bridging Takaful and Sale Management',
- 'summary': 'Bridging Takaful and Sale Management',
- 'author': 'Expert Co. Ltd.',
- 'website': 'http://www.exp-sa.com',
- 'license': 'LGPL-3',
- 'category': 'Odex25-Ens',
- 'depends': [
- 'ensan_sale_management',
- 'odex_takaful',
- ],
- 'data': [
- 'views/product_template_views.xml',
- ],
- 'auto_install': True,
-}
\ No newline at end of file
diff --git a/odex25_ensan/ensan_sale_management_takaful/models/__init__.py b/odex25_ensan/ensan_sale_management_takaful/models/__init__.py
deleted file mode 100644
index 232754377..000000000
--- a/odex25_ensan/ensan_sale_management_takaful/models/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-from . import product
\ No newline at end of file
diff --git a/odex25_ensan/ensan_sale_management_takaful/models/product.py b/odex25_ensan/ensan_sale_management_takaful/models/product.py
deleted file mode 100644
index 265a09a18..000000000
--- a/odex25_ensan/ensan_sale_management_takaful/models/product.py
+++ /dev/null
@@ -1,8 +0,0 @@
-from odoo import models
-
-class ProductTemplate(models.Model):
- _inherit = 'product.template'
-
- def _compute_fixed_value(self):
- for rec in self:
- rec.fixed_value = rec.donation_type == 'Fixed Amount'
\ No newline at end of file
diff --git a/odex25_ensan/ensan_sale_management_takaful/views/product_template_views.xml b/odex25_ensan/ensan_sale_management_takaful/views/product_template_views.xml
deleted file mode 100644
index 539dabbb8..000000000
--- a/odex25_ensan/ensan_sale_management_takaful/views/product_template_views.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
- Hello, A new visit has been assigned to you. Details are below: Please check your dashboard for more details. This is an automated message. Do not
- reply.
- Hello, Your OTP for confirming visit ${object.name} is:
- This code is valid for
- ${object.visit_types.otp_validity_minutes or 5}
- minutes.
- Regards,
-
- This is an automated message. Please do not reply.
- Hello, Please complete the evaluation form for your visit:
- ${object.name}.
-
-
- Open Survey
-
- Thank you for your cooperation.
-
- This is an automated message. Please do not reply.
- \n"
-" السلام عليكم ورحمة الله.\n"
-"\n"
-" \n"
-" مرحبا بكم شركائنا ${object.name} المحترمين\n"
-" \n"
-" نأسف لعدم تفعيل طلب التسجيل الخاص بكم حيث تبين بعد تدقيق طلب التسجيل من قبل الموظف المختص وجود الأخطاء والنواقص التالية:\n"
-" \n"
-" ويمكنكم رفع الطلب مجددا بعد اكمال النواقص المذكورة آنفا .\n"
-"\n"
-" \n"
-" شكرا لتفهمكم .\n"
-" \n"
-"\n"
-" \n"
-" السلام عليكم ورحمة الله.\n"
-"\n"
-" \n"
-" مرحبا بكم شركائنا ${object.name} المحترمين\n"
-" \n"
-" نأسف لعدم تفعيل طلب التسجيل الخاص بكم حيث تبين بعد تدقيق طلب التسجيل من قبل الموظف المختص وجود الأخطاء والنواقص التالية:\n"
-" \n"
-" ويمكنكم رفع الطلب مجددا بعد اكمال النواقص المذكورة آنفا .\n"
-"\n"
-" \n"
-" شكرا لتفهمكم .\n"
-" \n"
-" ${user.company_id.name}.\n"
-" \n"
-" السلام عليكم ورحمة الله.\n"
-"\n"
-" \n"
-" مرحبا بكم شركائنا في العمل الخيري ${object.name} المحترمين\n"
-"\n"
-"\n"
-" \n"
-" بناءا على طلبكم لقد تم فتح تعديل البيانات لكم لتعديل على حسابكم.\n"
-"\n"
-" \n"
-"\n"
-"\n"
-"\n"
-" \n"
-" السلام عليكم ورحمة الله.\n"
-"\n"
-" \n"
-" مرحبا بكم شركائنا في العمل الخيري ${object.name} المحترمين\n"
-"\n"
-"\n"
-" \n"
-" بناءا على طلبكم لقد تم فتح تعديل البيانات لكم لتعديل على حسابكم.\n"
-"\n"
-" \n"
-" ${user.company_id.name}.\n"
-"\n"
-"\n"
-" \n"
-" السلام عليكم ورحمة الله.\n"
-"\n"
-" \n"
-" مرحبا بكم شركائنا في العمل الخيري ${object.partner_id.name} المحترمين\n"
-"\n"
-"\n"
-" \n"
-" اسم المستخدم الخاص بكم هو : ${object.login|safe}\n"
-"\n"
-" \n"
-" وتفضلوا بقبول فائق التحية والتقدير .\n"
-"\n"
-" \n"
-"\n"
-"\n"
-"\n"
-" \n"
-" السلام عليكم ورحمة الله.\n"
-"\n"
-" \n"
-" مرحبا بكم شركائنا في العمل الخيري ${object.partner_id.name} المحترمين\n"
-"\n"
-"\n"
-" \n"
-" اسم المستخدم الخاص بكم هو : ${object.login|safe}\n"
-"\n"
-" \n"
-" وتفضلوا بقبول فائق التحية والتقدير .\n"
-"\n"
-" \n"
-" ${user.company_id.name}.\n"
-"\n"
-"\n"
-" \n"
-" السلام عليكم ورحمة الله.\n"
-"\n"
-" \n"
-" مرحبا بكم شركائنا ${object.name} المحترمين\n"
-" \n"
-" تم تفعيل تسجيلكم بنجاح ويمكنكم الآن تسجيل الدخول عبر البوابة .\n"
-"\n"
-" \n"
-"\n"
-"\n"
-"\n"
-" \n"
-" السلام عليكم ورحمة الله.\n"
-"\n"
-" \n"
-" مرحبا بكم شركائنا ${object.name} المحترمين\n"
-" \n"
-" تم تفعيل تسجيلكم بنجاح ويمكنكم الآن تسجيل الدخول عبر البوابة .\n"
-"\n"
-" \n"
-" ${user.company_id.name}.\n"
-"\n"
-"\n"
-" \n"
-" السلام عليكم ورحمة الله.\n"
-"\n"
-" \n"
-" مرحبا بكم شركائنا ${object.name} المحترمين\n"
-"\n"
-"\n"
-" \n"
-" يسعدنا أن نحيطكم علما بأنه قد تم إزالتكم من القائمة السوداء.\n"
-"\n"
-" \n"
-" يمكنكم تسجيل الدخول على حسابكم وشكرا .\n"
-"\n"
-" \n"
-"\n"
-"\n"
-"\n"
-" \n"
-" السلام عليكم ورحمة الله.\n"
-"\n"
-" \n"
-" مرحبا بكم شركائنا ${object.name} المحترمين\n"
-"\n"
-"\n"
-" \n"
-" يسعدنا أن نحيطكم علما بأنه قد تم إزالتكم من القائمة السوداء.\n"
-"\n"
-" \n"
-" يمكنكم تسجيل الدخول على حسابكم وشكرا .\n"
-"\n"
-" \n"
-" ${user.company_id.name}.\n"
-"\n"
-"\n"
-" \n"
-" السلام عليكم ورحمة الله.\n"
-"\n"
-" \n"
-" مرحبا بكم شركائنا ${object.name} المحترمين\n"
-"\n"
-" \n"
-" نحيطكم علما بحذف طلب تسجيلكم لدينا\n"
-" \n"
-" ويمكنكم طلب التسجيل مرة أخرى.\n"
-"\n"
-" \n"
-"\n"
-"\n"
-"\n"
-" \n"
-" السلام عليكم ورحمة الله.\n"
-"\n"
-" \n"
-" مرحبا بكم شركائنا ${object.name} المحترمين\n"
-"\n"
-" \n"
-" نحيطكم علما بحذف طلب تسجيلكم لدينا\n"
-" \n"
-" ويمكنكم طلب التسجيل مرة أخرى.\n"
-"\n"
-" \n"
-" ${user.company_id.name}.\n"
-"\n"
-"\n"
-" \n"
-" السلام عليكم ورحمة الله.\n"
-"\n"
-" \n"
-" مرحبا بكم شركائنا ${object.name} المحترمين\n"
-" \n"
-" نحيطكم علما بحذف طلب تسجيلكم لدينا وذلك للأسباب التالية:\n"
-" \n"
-" ويمكنكم طلب التسجيل مرة أخرى عند انتهاء هذه الاسباب .\n"
-" \n"
-"\n"
-" \n"
-" السلام عليكم ورحمة الله.\n"
-"\n"
-" \n"
-" مرحبا بكم شركائنا ${object.name} المحترمين\n"
-" \n"
-" نحيطكم علما بحذف طلب تسجيلكم لدينا وذلك للأسباب التالية:\n"
-" \n"
-" ويمكنكم طلب التسجيل مرة أخرى عند انتهاء هذه الاسباب .\n"
-" \n"
-" ${user.company_id.name}.\n"
-" \n"
-" السلام عليكم ورحمة الله.\n"
-"\n"
-" \n"
-" مرحبا بكم شركائنا ${object.name} المحترمين\n"
-"\n"
-"\n"
-" \n"
-" يؤسفنا ان نحيطكم علما بإدراجكم بالقائمة السوداء وذلك للأسباب التالية:\n"
-" \n"
-" في حال وجود أي ملاحظات أو استفسارات ، الرجاء التواصل معنا وشكرا .\n"
-"\n"
-" \n"
-"\n"
-"\n"
-"\n"
-" \n"
-" السلام عليكم ورحمة الله.\n"
-"\n"
-" \n"
-" مرحبا بكم شركائنا ${object.name} المحترمين\n"
-"\n"
-"\n"
-" \n"
-" يؤسفنا ان نحيطكم علما بإدراجكم بالقائمة السوداء وذلك للأسباب التالية:\n"
-" \n"
-" في حال وجود أي ملاحظات أو استفسارات ، الرجاء التواصل معنا وشكرا .\n"
-"\n"
-" \n"
-" ${user.company_id.name}.\n"
-"\n"
-"\n"
-" \n"
-" السلام عليكم ورحمة الله.\n"
-"\n"
-" \n"
-" مرحبا بكم شركائنا في العمل الخيري ${object.name} المحترمين\n"
-"\n"
-"\n"
-" \n"
-" نأسف لعدم تفعيل طلب التسجيل الخاص بكم حيث تبين بعد تدقيق طلب التسجيل من قبل الموظف المختص وجود الأخطاء والنواقص التالية :\n"
-" \n"
-" ${object.first_refusal_reason}\n"
-" \n"
-" ويمكنكم رفع الطلب مجددا بعد اكمال النواقص المذكورة آنفا .\n"
-" \n"
-"شكرا لتفهمكم .\n"
-" \n"
-"\n"
-"\n"
-"\n"
-" \n"
-" السلام عليكم ورحمة الله.\n"
-"\n"
-" \n"
-" مرحبا بكم شركائنا في العمل الخيري ${object.name} المحترمين\n"
-"\n"
-"\n"
-" \n"
-" نأسف لعدم تفعيل طلب التسجيل الخاص بكم حيث تبين بعد تدقيق طلب التسجيل من قبل الموظف المختص وجود الأخطاء والنواقص التالية :\n"
-" \n"
-" ${object.first_refusal_reason}\n"
-" \n"
-" ويمكنكم رفع الطلب مجددا بعد اكمال النواقص المذكورة آنفا .\n"
-" \n"
-"شكرا لتفهمكم .\n"
-" \n"
-" ${user.company_id.name}.\n"
-"\n"
-"\n"
-" \n"
-" السلام عليكم ورحمة الله.\n"
-"\n"
-" \n"
-" مرحبا بكم شركائنا ${object.name} المحترمين\n"
-"\n"
-" \n"
-" تم تسجيلكم بنجاح بإنتظار تدقيق الطلب من قبل الموظف المختص وسيتم إشعاركم بعد تفعيل التسجيل .\n"
-" \n"
-"\n"
-" \n"
-" السلام عليكم ورحمة الله.\n"
-"\n"
-" \n"
-" مرحبا بكم شركائنا ${object.name} المحترمين\n"
-"\n"
-" \n"
-" تم تسجيلكم بنجاح بإنتظار تدقيق الطلب من قبل الموظف المختص وسيتم إشعاركم بعد تفعيل التسجيل .\n"
-" \n"
-" ${user.company_id.name}.\n"
-" \n"
-" مرحبا بكم شركائنا في العمل الخيري ${object.name} المحترمين\n"
-" \n"
-" السلام عليكم ورحمة الله.\n"
-" \n"
-" تم استلام طلب تحديث بياناتكم , سيتم تدقيقها في أقرب وقت ممكن ومن ثم إفادتكم.\n"
-"\n"
-" \n"
-" وتفضلوا بقبول فائق التحية والتقدير .\n"
-"\n"
-" \n"
-"\n"
-"\n"
-"\n"
-" \n"
-" مرحبا بكم شركائنا في العمل الخيري ${object.name} المحترمين\n"
-" \n"
-" السلام عليكم ورحمة الله.\n"
-" \n"
-" تم استلام طلب تحديث بياناتكم , سيتم تدقيقها في أقرب وقت ممكن ومن ثم إفادتكم.\n"
-"\n"
-" \n"
-" وتفضلوا بقبول فائق التحية والتقدير .\n"
-"\n"
-" \n"
-" ${user.company_id.name}.\n"
-"\n"
-"\n"
-" Hello, A new visit has been assigned to you. Details are below: Please check your dashboard for more details. This is an automated message. Do not\n"
-" reply.\n"
-" مرحبًا، تم تعيين زيارة جديدة لك. التفاصيل كالتالي: يرجى التحقق من لوحة التحكم الخاصة بك لمزيد من التفاصيل. هذه رسالة آلية. لا تقم بالرد عليها. Hello, Your OTP for confirming visit ${object.benefit_id.name} is:\n"
-" This code is valid for \n"
-" ${object.visit_types.otp_validity_minutes or 5}\n"
-" minutes.\n"
-" Regards,\n"
-" \n"
-" This is an automated message. Please do not reply.\n"
-" مرحباً، رمز التحقق الخاص بتأكيد الزيارة ${object.name} هو: هذا الرمز صالح لمدة \n"
-" ${object.visit_types.otp_validity_minutes or 5}\n"
-" دقائق. مع التحية، \n"
-" هذه رسالة آلية، الرجاء عدم الرد.\n"
-" Hello, Please complete the evaluation form for your visit:\n"
-" ${object.name}.\n"
-" \n"
-" \n"
-" Open Survey\n"
-" \n"
-" Thank you for your cooperation.\n"
-" \n"
-" This is an automated message. Please do not reply.\n"
-" مرحباً، يرجى تعبئة نموذج الاستطلاع الخاص بزيارتكم:\n"
-" ${object.name}.\n"
-" \n"
-" \n"
-" فتح الاستطلاع\n"
-" \n"
-" نشكر لكم تعاونكم.\n"
-" \n"
-" هذه رسالة آلية، يرجى عدم الرد عليها.\n"
-" Provides support for various world calendars in a consistent manner. Use the global instance, Sets an Expects HTML like: Provide inline configuration like: Abstract base class for collection plugins v1.0.3. Written by Keith Wood (wood.keith{at}optusnet.com.au) December 2013. Licensed under the MIT license (http://keith-wood.name/licence.html). Use {@link $.JQPlugin.createPlugin} to create new plugins using this framework. This base class provides common functionality such as:
- السلام عليكم ورحمة الله.
-
-
- مرحبا بكم شركائنا ${object.name} المحترمين
-
-
- تم تسجيلكم بنجاح بإنتظار تدقيق الطلب من قبل الموظف المختص وسيتم إشعاركم بعد تفعيل التسجيل .
-
-
- السلام عليكم ورحمة الله، تم انتهاء صلاحية مرفق الدخل ${object.get_salary_attachment_name()} التابع للأسرة ${object.benefit_id.name} (كودها: ${object.benefit_id.code}). يرجى اتخاذ اللازم.
- السلام عليكم ورحمة الله.
-
-
- مرحبا بكم شركائنا ${object.name} المحترمين
-
- تم تفعيل تسجيلكم بنجاح ويمكنكم الآن تسجيل الدخول عبر البوابة .
-
-
-
-
-
-
- السلام عليكم ورحمة الله.
-
-
- مرحبا بكم شركائنا ${object.name} المحترمين
-
- نأسف لعدم تفعيل طلب التسجيل الخاص بكم حيث تبين بعد تدقيق طلب التسجيل من قبل الموظف المختص وجود الأخطاء والنواقص التالية:
-
- ويمكنكم رفع الطلب مجددا بعد اكمال النواقص المذكورة آنفا .
-
-
- شكرا لتفهمكم .
-
-
-
- السلام عليكم ورحمة الله.
-
-
- مرحبا بكم شركائنا ${object.name} المحترمين
-
- نحيطكم علما بحذف طلب تسجيلكم لدينا وذلك للأسباب التالية:
-
- ويمكنكم طلب التسجيل مرة أخرى عند انتهاء هذه الاسباب .
-
-
-
- السلام عليكم ورحمة الله.
-
-
- مرحبا بكم شركائنا ${object.name} المحترمين
-
-
- نحيطكم علما بحذف طلب تسجيلكم لدينا
-
- ويمكنكم طلب التسجيل مرة أخرى.
-
-
-
-
-
-
- السلام عليكم ورحمة الله.
-
-
- مرحبا بكم شركائنا ${object.name} المحترمين
-
-
-
- يؤسفنا ان نحيطكم علما بإدراجكم بالقائمة السوداء وذلك للأسباب التالية:
-
- في حال وجود أي ملاحظات أو استفسارات ، الرجاء التواصل معنا وشكرا .
-
-
-
-
-
-
- السلام عليكم ورحمة الله.
-
-
- مرحبا بكم شركائنا ${object.name} المحترمين
-
-
-
- يسعدنا أن نحيطكم علما بأنه قد تم إزالتكم من القائمة السوداء.
-
-
- يمكنكم تسجيل الدخول على حسابكم وشكرا .
-
-
-
-
-
-
- السلام عليكم ورحمة الله.
-
-
- مرحبا بكم شركائنا في العمل الخيري ${object.name} المحترمين
-
-
-
- بناءا على طلبكم لقد تم فتح تعديل البيانات لكم لتعديل على حسابكم.
-
-
-
-
-
-
- السلام عليكم ورحمة الله.
-
-
- مرحبا بكم شركائنا في العمل الخيري ${object.name} المحترمين
-
-
-
- نأسف لعدم تفعيل طلب التسجيل الخاص بكم حيث تبين بعد تدقيق طلب التسجيل من قبل الموظف المختص وجود الأخطاء والنواقص التالية :
-
- ${object.first_refusal_reason}
-
- ويمكنكم رفع الطلب مجددا بعد اكمال النواقص المذكورة آنفا .
-
-شكرا لتفهمكم .
-
-
-
-
-
- السلام عليكم ورحمة الله.
-
-
- مرحبا بكم شركائنا في العمل الخيري ${object.partner_id.name} المحترمين
-
-
-
- اسم المستخدم الخاص بكم هو : ${object.login|safe}
-
-
- وتفضلوا بقبول فائق التحية والتقدير .
-
-
-
-
-
-
- مرحبا بكم شركائنا في العمل الخيري ${object.name} المحترمين
-
- السلام عليكم ورحمة الله.
-
- تم استلام طلب تحديث بياناتكم , سيتم تدقيقها في أقرب وقت ممكن ومن ثم إفادتكم.
-
-
- وتفضلوا بقبول فائق التحية والتقدير .
-
-
-
-
-
-
- السلام عليكم ورحمة الله.
-
-
- مرحبا بكم شركائنا في العمل الخيري ${object.name} المحترمين
-
-
-
- ${object.name} سوف يتم توزيع الزكاة في يوم
-
-
-
-
-
-
- السلام عليكم ورحمة الله.
-
-
- مرحبا بكم شركائنا في العمل الخيري ${object.name} المحترمين
-
-
-
- ${object.name} سوف يتم توزيع الزكاة في يوم
-
-
-
-
-
-
- السلام عليكم ورحمة الله.
-
-
- مرحبا بكم شركائنا في العمل الخيري ${object.name} المحترمين
-
-
-
- ${object.name} سوف يتم توزيع الزكاة في يوم
-
-
-
-
-
-
- السلام عليكم ورحمة الله.
-
-
- مرحبا بكم شركائنا في العمل الخيري ${object.name} المحترمين
-
-
-
- ${object.name} سوف يتم توزيع الزكاة في يوم
-
-
-
-
-
- Create the Benefit
- Create the Benefit
- Create the Benefit
- Create the Housing Rooms items
- Create the Insurance Company
- Create the family
- Create the first City
- Create the First Branch
- Create the First District
- Create the First Visit
- Create the Exception Reason
- Create the first Bank
- Create the Category
- Create the Relation
- Create the Location
- Create the Marital Status
- Create the Age Category
- Create the Complaints Category
- Create the Visit Type
- Survey url
- Reasons of Suspension and Refusal
- Create New Return Reason
- Create the first Domestic labor
- Create the Member Location
- Create the Housing
- Create the Housing
- Create the First Vehicle Model Create the Attachment Setting
- Create the Hobbies Setting
- Create the Disabilities Setting
- Create the Diseases Setting
- Create the Food Surplus Type
- Create the benefitbehaviors.type
- Create the Food Surplus Type
- Create the Specialization
- Create the Other Associations
- Create the Sport Type
- Create the Income Type
- Create the Expenses Type
- Create the Loan Giver
- Create the Loan Reason
- Create the Housing Rooms items
- Create the Hospital file
- Create the Housing Rooms Type
- Create the Housing Rooms categories
- Create the Service Setting
- Create the Service Request
- Create the Service Request
- Create the Benefit Need
- receive the Benefit Zkat
- Create the Benefit Zkat
- Create the Food Surplus
- Create the receive food basket
- Create the food basket
- Create the appliances and furniture
- Create the appliances and furniture
- Create the Receive benefit Loans
- Create the benefit Loans
- Create the club
- Create the Log
- Create the needs
- Create the Needs Categories
- Sms Configuration
- Create the Family Complaints
- Create New Death Reason
-
- Create your first education period!
- Create the Member
- Create New Job
- %s %s, %s %s %sEducation Status
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Please Update your attachments because some of them has
- been expired!
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ${object.create_uid.company_id.name}
-
-
-
-
- ${object.create_uid.company_id.phone}
- % if object.create_uid.company_id.email
- |
-
- ${object.create_uid.company_id.email}
-
- % endif
- % if object.create_uid.company_id.website
- |
-
- ${object.create_uid.company_id.website}
-
- % endif
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- to family ${(object.benefit_id.name)}
- in this location
-
- ${object.get_url_local()}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ${object.create_uid.company_id.name}
-
-
-
-
- ${object.create_uid.company_id.phone}
- % if object.create_uid.company_id.email
- |
-
- ${object.create_uid.company_id.email}
-
- % endif
- % if object.create_uid.company_id.website
- |
-
- ${object.create_uid.company_id.website}
-
- % endif
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ${user.company_id.name}
-
-
- ${user.company_id.name}
-
-
-
\n"
-" ${object.first_refusal_reason}\n"
-"
\n"
-"\n"
-"
\n"
-"
\n"
-"
\n"
-" ${object.first_refusal_reason}\n"
-"
\n"
-"\n"
-"
\n"
-"
\n"
-"
\n"
-"
\n"
-"
\n"
-"
\n"
-"
\n"
-"
\n"
-"
\n"
-"\n"
-"
\n"
-"\n"
-"
\n"
-"
\n"
-"
\n"
-"
\n"
-"
\n"
-"
\n"
-"
\n"
-"
\n"
-"
\n"
-" ${object.final_refusal_reason}.\n"
-"
\n"
-"
\n"
-"
\n"
-" ${object.final_refusal_reason}.\n"
-"
\n"
-"
\n"
-"
\n"
-" ${object.black_list_reason}.\n"
-"
\n"
-"
\n"
-"
\n"
-" ${object.black_list_reason}.\n"
-"
\n"
-"
\n"
-"
\n"
-"
\n"
-"\n"
-"\n"
-"
\n"
-"
\n"
-"\n"
-"\n"
-"\n"
-"\n"
-"
\n"
-"
\n"
-"\n"
-"\n"
-"
\n"
-"
\n"
-"\n"
-"\n"
-"\n"
-"\n"
-"
\n"
-"
\n"
-"
\n"
-"
\n"
-"
\n"
-"
\n"
-"
\n"
-" "
-msgstr ""
-
-#. module: odex_benefit
-#: model:mail.template,body_html:odex_benefit.schedule_a_visit_email_template
-msgid ""
-" \n"
-" \n"
-" \n"
-" \n"
-" \n"
-"
\n"
-" \n"
-" \n"
-" \n"
-" \n"
-" \n"
-" \n"
-"
\n"
-" \n"
-" \n"
-" \n"
-"
\n"
-" \n"
-" \n"
-"
\n"
-" \n"
-" \n"
-" \n"
-" \n"
-" \n"
-" \n"
-"
\n"
-" \n"
-" \n"
-"
\n"
-" Please Update your attachments because some of them has been expired!
\n"
-"
\n"
-" \n"
-" \n"
-"
\n"
-" \n"
-" \n"
-" \n"
-" \n"
-" \n"
-" \n"
-"
\n"
-" \n"
-" \n"
-" ${object.create_uid.company_id.name}\n"
-" \n"
-" \n"
-" ${object.create_uid.company_id.phone}\n"
-" % if object.create_uid.company_id.email\n"
-" | ${object.create_uid.company_id.email}\n"
-" % endif\n"
-" % if object.create_uid.company_id.website\n"
-" | \n"
-" ${object.create_uid.company_id.website}\n"
-" \n"
-" % endif\n"
-"
\n"
-" "
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model.fields,help:odex_benefit.field_benefits_representative__associate_member
-#: model:ir.model.fields,help:odex_benefit.field_external_benefits__associate_member
-#: model:ir.model.fields,help:odex_benefit.field_grant_benefit__associate_member
-msgid ""
-"A member with whom you want to associate your membership.It will consider "
-"the membership state of the associated member."
-msgstr ""
-"الفردالذي ترغب في الارتباط بعضويتك به. وسيأخذ في الاعتبار حالة عضوية الفرد"
-"المرتبط."
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__acadimec_regsteration_attached
-msgid "Acadimec Regsteration Attached"
-msgstr "مرفق التسجيل الأكاديمي"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.appliances_furniture_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.expenses_line_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.external_request_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.receive_appliances_furniture_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_benefits_needs_form
-msgid "Accept"
-msgstr "قبول"
-
-#. module: odex_benefit
-#: model:res.groups,name:odex_benefit.group_accept_income_and_expenses
-msgid "Accept income and expenses"
-msgstr "الموافقة على الدخل والمصاريف"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__expenses_line__state__accepted
-#: model:ir.model.fields.selection,name:odex_benefit.selection__family_debits__state__accepted
-#: model:ir.model.fields.selection,name:odex_benefit.selection__salary_line__state__accepted
-msgid "Accepted"
-msgstr "مقبول"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__expenses_line__state__waiting
-#: model:ir.model.fields.selection,name:odex_benefit.selection__salary_line__state__waiting
-msgid "Waiting"
-msgstr "في انتظار الموافقة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_zkat__account_id
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_benefit_zkat__account_id
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_food_basket__account_id
-msgid "Account"
-msgstr "حساب"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__acc_holder_name
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__family_member_id
-msgid "Account Holder Name"
-msgstr "اسم مالك الحساب"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__acc_number
-msgid "Account Number"
-msgstr "رقم آيبان"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__account_relation
-msgid "Account Owner Relation"
-msgstr "صلة قرابة مالك الحساب"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__property_account_payable_id
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__property_account_payable_id
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__property_account_payable_id
-msgid "Account Payable"
-msgstr "حساب الدائن"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_loans__account_payment_id
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_benefit_loans__account_payment_id
-msgid "Account Payment"
-msgstr "حساب الدفع"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__property_account_receivable_id
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__property_account_receivable_id
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__property_account_receivable_id
-msgid "Account Receivable"
-msgstr "حساب المدين"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__account_type
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__account_type
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__account_type
-msgid "Account Type"
-msgstr "نوع الحساب"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__benefit_expenses__state__accreditation
-msgid "Accreditation"
-msgstr "اعتماد"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_craft_skills__achievements
-#: model:ir.model.fields,field_description:odex_benefit.field_training_inclinations__achievements
-msgid "Achievements"
-msgstr "إنجازات"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_appliances_furniture__message_needaction
-#: model:ir.model.fields,field_description:odex_benefit.field_appliances_furniture_need__message_needaction
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_club__message_needaction
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_followers__message_needaction
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_food_basket__message_needaction
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_food_surplus__message_needaction
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_housing__message_needaction
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_loans__message_needaction
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_need__message_needaction
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_sms_configuration__message_needaction
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_zkat__message_needaction
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_needs__message_needaction
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__message_needaction
-#: model:ir.model.fields,field_description:odex_benefit.field_changes_requests__message_needaction
-#: model:ir.model.fields,field_description:odex_benefit.field_confirm_benefit_expense__message_needaction
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__message_needaction
-#: model:ir.model.fields,field_description:odex_benefit.field_family_member__message_needaction
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__message_needaction
-#: model:ir.model.fields,field_description:odex_benefit.field_needs_categories__message_needaction
-#: model:ir.model.fields,field_description:odex_benefit.field_needs_payment_line__message_needaction
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_appliances_furniture__message_needaction
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_benefit_loans__message_needaction
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_benefit_zkat__message_needaction
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_food_basket__message_needaction
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_food_surplus__message_needaction
-#: model:ir.model.fields,field_description:odex_benefit.field_service_request__message_needaction
-#: model:ir.model.fields,field_description:odex_benefit.field_visit_location__message_needaction
-msgid "Action Needed"
-msgstr "يحتاج لإجراء"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__activation_mode
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__activation_mode
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__activation_mode
-msgid "Activation Mode"
-msgstr "نموذج الأنشطة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__active
-#: model:ir.model.fields,field_description:odex_benefit.field_committees_line__active
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__active
-#: model:ir.model.fields,field_description:odex_benefit.field_services_settings__active
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__active
-#: model:ir.model.fields,field_description:odex_benefit.field_visits_types__active
-#: model:ir.model.fields,field_description:odex_benefit.field_return_reason__active
-msgid "Active"
-msgstr "نشط"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__active_lang_count
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__active_lang_count
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__active_lang_count
-msgid "Active Lang Count"
-msgstr "عدد لانج النشط"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_appliances_furniture__activity_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_appliances_furniture_need__activity_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_club__activity_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_followers__activity_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_food_basket__activity_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_food_surplus__activity_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_housing__activity_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_loans__activity_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_need__activity_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_sms_configuration__activity_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_zkat__activity_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_needs__activity_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__activity_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_changes_requests__activity_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_confirm_benefit_expense__activity_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__activity_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_family_member__activity_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__activity_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_needs_categories__activity_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_needs_payment_line__activity_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_appliances_furniture__activity_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_benefit_loans__activity_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_benefit_zkat__activity_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_food_basket__activity_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_food_surplus__activity_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_service_request__activity_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_visit_location__activity_ids
-msgid "Activities"
-msgstr "الأنشطة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_appliances_furniture__activity_exception_decoration
-#: model:ir.model.fields,field_description:odex_benefit.field_appliances_furniture_need__activity_exception_decoration
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_club__activity_exception_decoration
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_followers__activity_exception_decoration
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_food_basket__activity_exception_decoration
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_food_surplus__activity_exception_decoration
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_housing__activity_exception_decoration
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_loans__activity_exception_decoration
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_need__activity_exception_decoration
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_sms_configuration__activity_exception_decoration
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_zkat__activity_exception_decoration
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_needs__activity_exception_decoration
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__activity_exception_decoration
-#: model:ir.model.fields,field_description:odex_benefit.field_changes_requests__activity_exception_decoration
-#: model:ir.model.fields,field_description:odex_benefit.field_confirm_benefit_expense__activity_exception_decoration
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__activity_exception_decoration
-#: model:ir.model.fields,field_description:odex_benefit.field_family_member__activity_exception_decoration
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__activity_exception_decoration
-#: model:ir.model.fields,field_description:odex_benefit.field_needs_categories__activity_exception_decoration
-#: model:ir.model.fields,field_description:odex_benefit.field_needs_payment_line__activity_exception_decoration
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_appliances_furniture__activity_exception_decoration
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_benefit_loans__activity_exception_decoration
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_benefit_zkat__activity_exception_decoration
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_food_basket__activity_exception_decoration
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_food_surplus__activity_exception_decoration
-#: model:ir.model.fields,field_description:odex_benefit.field_service_request__activity_exception_decoration
-#: model:ir.model.fields,field_description:odex_benefit.field_visit_location__activity_exception_decoration
-msgid "Activity Exception Decoration"
-msgstr "زخرفة استثناء النشاط"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_appliances_furniture__activity_state
-#: model:ir.model.fields,field_description:odex_benefit.field_appliances_furniture_need__activity_state
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_club__activity_state
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_followers__activity_state
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_food_basket__activity_state
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_food_surplus__activity_state
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_housing__activity_state
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_loans__activity_state
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_need__activity_state
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_sms_configuration__activity_state
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_zkat__activity_state
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_needs__activity_state
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__activity_state
-#: model:ir.model.fields,field_description:odex_benefit.field_changes_requests__activity_state
-#: model:ir.model.fields,field_description:odex_benefit.field_confirm_benefit_expense__activity_state
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__activity_state
-#: model:ir.model.fields,field_description:odex_benefit.field_family_member__activity_state
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__activity_state
-#: model:ir.model.fields,field_description:odex_benefit.field_needs_categories__activity_state
-#: model:ir.model.fields,field_description:odex_benefit.field_needs_payment_line__activity_state
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_appliances_furniture__activity_state
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_benefit_loans__activity_state
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_benefit_zkat__activity_state
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_food_basket__activity_state
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_food_surplus__activity_state
-#: model:ir.model.fields,field_description:odex_benefit.field_service_request__activity_state
-#: model:ir.model.fields,field_description:odex_benefit.field_visit_location__activity_state
-msgid "Activity State"
-msgstr "حالة النشاط"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_program_plane_line__activity_type
-msgid "Activity Type"
-msgstr "نوع النشاط"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_appliances_furniture__activity_type_icon
-#: model:ir.model.fields,field_description:odex_benefit.field_appliances_furniture_need__activity_type_icon
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_club__activity_type_icon
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_followers__activity_type_icon
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_food_basket__activity_type_icon
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_food_surplus__activity_type_icon
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_housing__activity_type_icon
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_loans__activity_type_icon
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_need__activity_type_icon
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_sms_configuration__activity_type_icon
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_zkat__activity_type_icon
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_needs__activity_type_icon
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__activity_type_icon
-#: model:ir.model.fields,field_description:odex_benefit.field_changes_requests__activity_type_icon
-#: model:ir.model.fields,field_description:odex_benefit.field_confirm_benefit_expense__activity_type_icon
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__activity_type_icon
-#: model:ir.model.fields,field_description:odex_benefit.field_family_member__activity_type_icon
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__activity_type_icon
-#: model:ir.model.fields,field_description:odex_benefit.field_needs_categories__activity_type_icon
-#: model:ir.model.fields,field_description:odex_benefit.field_needs_payment_line__activity_type_icon
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_appliances_furniture__activity_type_icon
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_benefit_loans__activity_type_icon
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_benefit_zkat__activity_type_icon
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_food_basket__activity_type_icon
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_food_surplus__activity_type_icon
-#: model:ir.model.fields,field_description:odex_benefit.field_service_request__activity_type_icon
-#: model:ir.model.fields,field_description:odex_benefit.field_visit_location__activity_type_icon
-msgid "Activity Type Icon"
-msgstr "أيقونة نوع النشاط"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_family_member__add_replacement_mother
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__add_replacement_mother
-msgid "Add Replacement Mother?"
-msgstr "يوجد أم بديلة؟"
-
-#. module: odex_benefit
-#: model:ir.model,name:odex_benefit.model_res_bank
-msgid "Add iban details in bank screen"
-msgstr "إضافة تفاصيل رقم Iban في شاشة البنك"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_service_request__added_amount_if_mother_dead
-msgid "Added Amount (If mother dead)"
-msgstr "مبلغ إضافي على الإيجار للأيتام"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__additional_info
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__additional_info
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__additional_info
-msgid "Additional info"
-msgstr "معلومات إضافية"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_food_surplus__address
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_appliances_furniture__address
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_food_surplus__address
-msgid "Address"
-msgstr "العنوان"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__type
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__type
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__type
-msgid "Address Type"
-msgstr "نوع العنوان"
-
-#. module: odex_benefit
-#: model:ir.ui.menu,name:odex_benefit.menu_benefits_config_addresses
-msgid "Addresses"
-msgstr "المناطق والمحافظات"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_followers__age
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__age
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__age
-#: model:ir.model.fields,field_description:odex_benefit.field_family_member__age
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__age
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__father_age
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__mother_age
-msgid "Age"
-msgstr "العمر"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_relation_settings__age_difference
-msgid "Age Difference"
-msgstr "فرق العمر"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_generate_reports__age_from
-#: model:ir.model.fields,field_description:odex_benefit.field_rooms_categories__age_from
-msgid "Age From"
-msgstr "العمر من"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_generate_reports__age_to
-#: model:ir.model.fields,field_description:odex_benefit.field_rooms_categories__age_to
-msgid "Age To"
-msgstr "العمر إلى"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__is_al_al_bayt
-msgid "Al al-Bayt"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__generate_reports__housing_financial_type__expenses
-msgid "All expenses"
-msgstr "جميع المصاريف"
-
-#. module: odex_benefit
-#: model:ir.model.fields,help:odex_benefit.field_benefits_representative__lang
-#: model:ir.model.fields,help:odex_benefit.field_external_benefits__lang
-#: model:ir.model.fields,help:odex_benefit.field_grant_benefit__lang
-msgid ""
-"All the emails and documents sent to this contact will be translated in this"
-" language."
-msgstr ""
-"ستتم ترجمة جميع رسائل البريد الإلكتروني والمستندات المرسلة إلى جهة الاتصال "
-"هذه إلى هذه اللغة."
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_ir_attachment__allow_days
-msgid "Allow Days"
-msgstr "مدة الانتهاء بالايام"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_service_request__benefit_category_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_services_settings__benefit_category_ids
-msgid "Allowed Categories"
-msgstr "الفئات المستفيدة"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__services_settings__service_type__alternative_housing
-msgid "Alternative Housing"
-msgstr ""
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.services_settings_form
-msgid "Alternative Housing Settings"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_changes_requests__new_gender_researcher_id
-msgid "Alternative Researcher Team for family"
-msgstr "الفريق البديل للأسرة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_changes_requests__new_gender_researcher_one
-msgid "Alternative Researcher Team for researcher"
-msgstr "الفريق البديل للباحث"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_expenses__amount
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_zkat_line__amount
-#: model:ir.model.fields,field_description:odex_benefit.field_expenses_line__amount
-#: model:ir.model.fields,field_description:odex_benefit.field_food_basket_line__amount
-#: model:ir.model.fields,field_description:odex_benefit.field_housing_need__amount
-#: model:ir.model.fields,field_description:odex_benefit.field_payment_collection_line__amount
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_benefit_zkat__amount
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_food_basket__amount
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_food_basket__amount_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_service_limit_person_line__amount
-msgid "Amount"
-msgstr "المبلغ"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__amra_date
-msgid "Amra Date"
-msgstr "تاريخ العمرة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_appliances_furniture_need__ap_id
-#: model:ir.model.fields,field_description:odex_benefit.field_housing_need__ap_id
-msgid "Ap"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_attachments_settings__family_appearance_seq
-#: model:ir.model.fields,field_description:odex_benefit.field_attachments_settings__income_appearance_seq
-#: model:ir.model.fields,field_description:odex_benefit.field_attachments_settings__member_appearance_seq
-msgid "Appearance Sequence"
-msgstr "التسلسل"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__benefit_housing__housing_type__appendix
-#: model:ir.model.fields.selection,name:odex_benefit.selection__grant_benefit__housing_type__appendix
-msgid "Appendix"
-msgstr "ملحق"
-
-#. module: odex_benefit
-#: model:ir.actions.act_window,name:odex_benefit.benefit_appliances_furniture_action
-#: model_terms:ir.ui.view,arch_db:odex_benefit.appliances_furniture_form
-msgid "Appliances Furniture"
-msgstr "الاثاث والأجهزة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_appliances_furniture__appliances_furniture_need
-#: model:ir.model.fields,field_description:odex_benefit.field_generate_reports__appliances_furniture_need
-msgid "Appliances Furniture Need"
-msgstr "احتياج الأجهزة الكهربائية والأثاث"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__changes_requests__state__approval_of_branch_manager
-msgid "Approval of branch manager"
-msgstr "موافقة مدير الفرع"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__changes_requests__state__approval_of_department_head
-msgid "Approval of department head"
-msgstr "موافقة رئيس العمليات"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.benefit_food_basket_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.benefit_food_surplus_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.changes_requests_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.payment_orders_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.payment_orders_tree
-#: model_terms:ir.ui.view,arch_db:odex_benefit.seasonal_service_form_view
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_benefit_category_form
-msgid "Approve"
-msgstr "موافقة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__approve_date
-msgid "Approve Date"
-msgstr "تاريخ اعتماد الملف"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__benefit_sms_configuration__state__approve_family
-msgid "Approve Family"
-msgstr "الموافقة على العائلة"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__appliances_furniture__state__approve
-#: model:ir.model.fields.selection,name:odex_benefit.selection__benefit_category__state__approve
-#: model:ir.model.fields.selection,name:odex_benefit.selection__benefit_club__state__approve
-#: model:ir.model.fields.selection,name:odex_benefit.selection__benefit_food_basket__state__approve
-#: model:ir.model.fields.selection,name:odex_benefit.selection__benefit_food_surplus__state__approve
-#: model:ir.model.fields.selection,name:odex_benefit.selection__benefit_loans__state__approve
-#: model:ir.model.fields.selection,name:odex_benefit.selection__benefit_need__state__approve
-#: model:ir.model.fields.selection,name:odex_benefit.selection__benefit_sms_configuration__state__approve
-#: model:ir.model.fields.selection,name:odex_benefit.selection__benefit_zkat__state__approve
-#: model:ir.model.fields.selection,name:odex_benefit.selection__benefits_needs__state__approve
-#: model:ir.model.fields.selection,name:odex_benefit.selection__entity_black_list_wizard__state__approve
-#: model:ir.model.fields.selection,name:odex_benefit.selection__entity_refused_reason_wizard__state__approve
-#: model:ir.model.fields.selection,name:odex_benefit.selection__external_request__state__approve
-#: model:ir.model.fields.selection,name:odex_benefit.selection__receive_appliances_furniture__state__approve
-#: model:ir.model.fields.selection,name:odex_benefit.selection__receive_benefit_loans__state__approve
-#: model:ir.model.fields.selection,name:odex_benefit.selection__receive_benefit_zkat__state__approve
-#: model:ir.model.fields.selection,name:odex_benefit.selection__receive_food_basket__state__approve
-#: model:ir.model.fields.selection,name:odex_benefit.selection__receive_food_surplus__state__approve
-msgid "Approved"
-msgstr "موافقة"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__grant_benefit__action_type__approved
-#: model:ir.model.fields.selection,name:odex_benefit.selection__family_member__action_type__approved
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Approved"
-msgstr "معتمد"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__grant_benefit__action_type__suspended
-#: model:ir.model.fields.selection,name:odex_benefit.selection__family_member__action_type__suspended
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Suspended"
-msgstr "ايقاف"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.changes_requests_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_benefit_category_form
-msgid "Are you sure you want to Approve?"
-msgstr "هل أنت متأكد أنك تريد الموافقة؟"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Are you sure you want to Finish Complete data ?"
-msgstr "هل أنت متأكد أنك تريد إنهاء البيانات الكاملة؟"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.external_request_form
-msgid "Are you sure you want to Refuse ?"
-msgstr "هل أنت متأكد أنك تريد الرفض؟"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_benefit_category_form
-msgid "Are you sure you want to Reject?"
-msgstr "هل أنت متأكد أنك تريد الرفض؟"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.appliances_furniture_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.expenses_line_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.external_request_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_benefits_needs_form
-msgid "Are you sure you want to accept ?"
-msgstr "هل أنت متأكد أنك تريد القبول؟"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.appliances_furniture_form
-msgid "Are you sure you want to delivery?"
-msgstr "هل أنت متأكد أنك تريد التسليم؟"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Are you sure you want to final refuse ?"
-msgstr "هل أنت متأكد أنك تريد الرفض النهائي؟"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.service_request_form
-msgid "Are you sure you want to first approve ?"
-msgstr "هل أنت متأكد انك تريد الموافقة المبدئية؟"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.family_member_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Are you sure you want to move to Temporarily Exception ?"
-msgstr "هل أنت متأكد أنك تريد الانتقال إلى \"استثناء مبدئي\"؟"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.family_member_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Are you sure you want to move to Temporarily Suspended ?"
-msgstr "هل أنت متأكد أنك تريد الانتقال إلى \"إيقاف مبدئي\"؟"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Are you sure you want to move to black list ?"
-msgstr "هل أنت متأكد أنك تريد الانتقال إلى القائمة السوداء؟"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Are you sure you want to open info edition !"
-msgstr "هل أنت متأكد أنك تريد فتح طبعة المعلومات!"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_benefits_needs_form
-msgid "Are you sure you want to published?"
-msgstr "هل أنت متأكد أنك تريد النشر؟"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.receive_appliances_furniture_form
-msgid "Are you sure you want to receipt ?"
-msgstr "هل أنت متأكد أنك تريد الاستلام؟"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Are you sure you want to refuse ?"
-msgstr "هل أنت متأكد أنك تريد الرفض؟"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.service_request_form
-msgid "Are you sure you want to refuse request ?"
-msgstr "هل أنت متأكد أنك تريد رفض الطلب؟"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.receive_appliances_furniture_form
-msgid "Are you sure you want to refused ?"
-msgstr "هل أنت متأكد أنك تريد الرفض؟"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_benefits_needs_form
-msgid "Are you sure you want to refused?"
-msgstr "هل أنت متأكد أنك تريد الرفض؟"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_benefits_needs_form
-msgid "Are you sure you want to review?"
-msgstr "هل أنت متأكد أنك تريد المراجعة؟"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.service_request_form
-msgid "Are you sure you want to second approve ?"
-msgstr "هل أنت متأكد أنك تريد الموافقة النهائية؟"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Are you sure you want to send link to reset password !"
-msgstr "هل أنت متأكد أنك تريد إرسال رابط لإعادة تعيين كلمة المرور!"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.receive_appliances_furniture_form
-msgid "Are you sure you want to storage?"
-msgstr "هل أنت متأكد أنك تريد التخزين؟"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.committees_view_form
-msgid "Assign files"
-msgstr "تعيين الملفات"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_entity_refuse_reason__user_id
-msgid "Assigned to"
-msgstr "توجيه إلى"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__associate_member
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__associate_member
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__associate_member
-msgid "Associate Member"
-msgstr "فردمشارك"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__associations_ids
-msgid "Associations"
-msgstr "المنظمات"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_associations_line__associations_description
-msgid "Associations Description"
-msgstr ""
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/family_expense.py:0
-#, python-format
-msgid "At least one expense type should be selected."
-msgstr "برجاء اختيار نوع مصروف واحد علي الاقل"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_expenses__attach
-#: model:ir.model.fields,field_description:odex_benefit.field_generate_reports_log__attach
-#: model:ir.model.fields,field_description:odex_benefit.field_ir_attachment__attach_id
-msgid "Attach"
-msgstr "مرفق"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_salary_line__attach_end_date
-msgid "Attach End Date"
-msgstr "تاريخ النهاية"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_salary_line__attach_start_date
-msgid "Attach Start Date"
-msgstr "تاريخ البداية"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_ir_attachment__attach_status
-#: model:ir.model.fields,field_description:odex_benefit.field_member_disabilities__attach_status
-#: model:ir.model.fields,field_description:odex_benefit.field_member_diseases__attach_status
-#: model:ir.model.fields,field_description:odex_benefit.field_member_hobbies__attach_status
-msgid "Attach Status"
-msgstr "حالة المرفق"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_attachments_settings__attach_type
-msgid "Attach Type"
-msgstr "نوع المرفق"
-
-#. module: odex_benefit
-#: model:ir.model,name:odex_benefit.model_ir_attachment
-#: model:ir.model.fields,field_description:odex_benefit.field_expenses_line__expense_attachments
-#: model:ir.model.fields,field_description:odex_benefit.field_family_member__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_salary_line__salary_attach
-#: model:ir.model.fields,field_description:odex_benefit.field_service_attachments_settings__service_attach
-msgid "Attachment"
-msgstr "مرفق"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_appliances_furniture__message_attachment_count
-#: model:ir.model.fields,field_description:odex_benefit.field_appliances_furniture_need__message_attachment_count
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_club__message_attachment_count
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_followers__message_attachment_count
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_food_basket__message_attachment_count
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_food_surplus__message_attachment_count
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_housing__message_attachment_count
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_loans__message_attachment_count
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_need__message_attachment_count
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_sms_configuration__message_attachment_count
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_zkat__message_attachment_count
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_needs__message_attachment_count
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__message_attachment_count
-#: model:ir.model.fields,field_description:odex_benefit.field_changes_requests__message_attachment_count
-#: model:ir.model.fields,field_description:odex_benefit.field_confirm_benefit_expense__message_attachment_count
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__message_attachment_count
-#: model:ir.model.fields,field_description:odex_benefit.field_family_member__message_attachment_count
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__message_attachment_count
-#: model:ir.model.fields,field_description:odex_benefit.field_needs_categories__message_attachment_count
-#: model:ir.model.fields,field_description:odex_benefit.field_needs_payment_line__message_attachment_count
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_appliances_furniture__message_attachment_count
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_benefit_loans__message_attachment_count
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_benefit_zkat__message_attachment_count
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_food_basket__message_attachment_count
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_food_surplus__message_attachment_count
-#: model:ir.model.fields,field_description:odex_benefit.field_service_request__message_attachment_count
-#: model:ir.model.fields,field_description:odex_benefit.field_visit_location__message_attachment_count
-msgid "Attachment Count"
-msgstr "عدد المرفقات"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_service_request__attachment_lines
-#: model:ir.model.fields,field_description:odex_benefit.field_services_settings__attachment_lines
-msgid "Attachment Lines"
-msgstr ""
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.family_member_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Attachment Name"
-msgstr "اسم المرفق"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_appliances_furniture__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_appliances_furniture_need__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_associations_line__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_attachments_settings__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_behaviors__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_behaviors_type__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_category__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_cloth__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_club__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_club_activity__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_expenses__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_family__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_followers__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_food_basket__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_food_surplus__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_housing__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_housing_rooms__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_housing_rooms_items__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_loans__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_need__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_programs__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_sms_configuration__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_zkat__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_zkat_line__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_needs__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__attachment_benefits_representative_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_branch_settings__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_cars_line__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_changes_requests__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_cloth_size__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_cloth_type__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_committees_line__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_confirm_benefit_expense__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_craft_skills__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_disabilities_settings__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_diseases_settings__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_divorcee_family__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_domestic_labor__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_donations_type__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_education_classroom__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_education_entities__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_education_illiterate_reason__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_education_level__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_education_result__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_entity_refuse_reason__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_exception_reason__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_expenses_line__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_expenses_type__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__attachment_external_benefits_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_external_request__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_family_debits__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_family_validation_setting__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_food_basket_benefits_line__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_food_basket_line__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_food_surplus_line__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_food_surplus_type__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_generate_reports_log__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__attachment_grant_benefit_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_hobbies_settings__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_home_maintenance_lines__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_hospital_hospital__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_house_need__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_housing_need__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_housing_rooms_members__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_housing_rooms_type__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_income_type__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_insurance_company__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_insurance_type__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_item_status__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_loan_giver__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_loan_reason__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_main_service__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_marital_status__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_member_disabilities__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_member_diseases__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_member_hobbies__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_member_location__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_needs_categories__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_needs_payment_line__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_other_associations__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_payment_collection_line__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_program_plane_line__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_purchase_product_loan__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_appliances_furniture__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_benefit_loans__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_benefit_zkat__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_food_basket__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_food_surplus__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_relation_settings__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_rent_lines__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_res_country_city__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_res_districts__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_rooms_categories__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_rooms_items__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_salary_line__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_service_attachments_settings__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_service_request__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_services_settings__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_specialization_specialization__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_sport_line__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_sport_type__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_study_material__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_survey_setting__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_suspend_reason__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_training_inclinations__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_training_type__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_visit_location__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_visits_types__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_widow_family__attachment_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_zkat_line__attachment_ids
-#: model_terms:ir.ui.view,arch_db:odex_benefit.family_member_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Attachments"
-msgstr "المستندات التعريفية"
-
-#. module: odex_benefit
-#: model:ir.actions.act_window,name:odex_benefit.attachments_settings_action
-#: model:ir.model,name:odex_benefit.model_attachments_settings
-#: model:ir.ui.menu,name:odex_benefit.attachment_settings_menu
-#: model:ir.ui.menu,name:odex_benefit.menu_attachment_settings
-msgid "Attachments Settings"
-msgstr "اعدادات المرفقات"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_program_plane_line__attendees
-msgid "Attendees"
-msgstr "الحضور"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__family_member__suspend_method__auto
-#: model:ir.model.fields.selection,name:odex_benefit.selection__grant_benefit__suspend_method__auto
-msgid "Auto"
-msgstr "تلقائي"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__auto_accept_for_member
-msgid "Auto Accept For members"
-msgstr ""
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_search
-msgid "Auto Suspended"
-msgstr "إيقاف تلقائي"
-
-#. module: odex_benefit
-#: model:ir.model.fields,help:odex_benefit.field_benefits_representative__receipt_reminder_email
-#: model:ir.model.fields,help:odex_benefit.field_external_benefits__receipt_reminder_email
-#: model:ir.model.fields,help:odex_benefit.field_grant_benefit__receipt_reminder_email
-msgid ""
-"Automatically send a confirmation email to the vendor X days before the "
-"expected receipt date, asking him to confirm the exact date."
-msgstr ""
-"قم بإرسال بريد التأكيد الإلكتروني إلى المورّد بعدد الأيام قبل تاريخ الإيصال "
-"المتوقع، تطلب فيه تأكيد التاريخ بالتحديد. "
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_confirm_benefit_expense__available_payment_method_line_ids
-msgid "Available Payment Method Line"
-msgstr "بند طريقة الدفع المتاحة "
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.benefit_housing_kanban_view
-msgid "Avatar"
-msgstr "الصورة الرمزية"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__benefit_housing__housing_cat__bad
-#: model:ir.model.fields.selection,name:odex_benefit.selection__grant_benefit__housing_cat__bad
-msgid "Bad"
-msgstr "سيء"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__bank_account_count
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__bank_id
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__bank_account_count
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__bank_id
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__bank_account_count
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__bank_id
-msgid "Bank"
-msgstr "بنك"
-
-#. module: odex_benefit
-#: model:res.groups,name:odex_benefit.group_benefit_bank_info
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Bank Account Information"
-msgstr "معلومات الحساب البنكي"
-
-#. module: odex_benefit
-#: model:ir.actions.act_window,name:odex_benefit.res_bank_list_action
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__bank_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__bank_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__bank_ids
-#: model:ir.ui.menu,name:odex_benefit.res_bank_menu
-msgid "Banks"
-msgstr "البنوك"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__barcode
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__barcode
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__barcode
-msgid "Barcode"
-msgstr "باركود"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_behaviors__behavior_id
-#: model:ir.model.fields,field_description:odex_benefit.field_generate_reports__behavior_id
-msgid "Behavior"
-msgstr "سلوك"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_behaviors__behavior_date
-msgid "Behavior Date"
-msgstr "تاريخ السلوك"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_programs__behaviors_programs
-msgid "Behaviors Programs"
-msgstr "برامج السلوك"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/benefit.py:0
-#, python-format
-msgid "Beneficial"
-msgstr "المستفيدين"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/benefit.py:0
-#, python-format
-msgid "Beneficiaries"
-msgstr "المستفيدين"
-
-#. module: odex_benefit
-#: model:ir.ui.menu,name:odex_benefit.benefit_approve_menu
-msgid "Beneficiaries Approve"
-msgstr "ملفات معتمده"
-
-#. module: odex_benefit
-#: model:ir.ui.menu,name:odex_benefit.benefit_black_list_menu
-msgid "Beneficiaries Black List"
-msgstr "ملفات في القائمة السوداء"
-
-#. module: odex_benefit
-#: model:ir.actions.act_window,name:odex_benefit.category_action
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_benefit_category_tree
-msgid "Beneficiaries Category"
-msgstr "فئات الأسر"
-
-#. module: odex_benefit
-#: model:res.groups,name:odex_benefit.group_benefit_edit
-msgid "Beneficiaries Edit User"
-msgstr "تعديل المستفيدين"
-
-#. module: odex_benefit
-#: model:res.groups,name:odex_benefit.group_benefit_info
-msgid "Beneficiaries Inforamtion"
-msgstr "بيانات المستفيدين"
-
-#. module: odex_benefit
-#: model:ir.module.category,name:odex_benefit.module_category_benefit
-msgid "Beneficiaries Management"
-msgstr "فئات المستفيدين"
-
-#. module: odex_benefit
-#: model:res.groups,name:odex_benefit.group_benefit_manager
-msgid "Beneficiaries Manager"
-msgstr "مدير المستفيدين"
-
-#. module: odex_benefit
-#: model:res.groups,name:odex_benefit.group_benefit_officer
-msgid "Beneficiaries Officer"
-msgstr "موظف المستفيدين"
-
-#. module: odex_benefit
-#: model:ir.ui.menu,name:odex_benefit.benefit_reject_menu
-msgid "Beneficiaries Reject"
-msgstr "ملفات مرفوضة"
-
-#. module: odex_benefit
-#: model:res.groups,name:odex_benefit.group_benefit_researcher
-msgid "Beneficiaries Researcher"
-msgstr "الاخصائي الاجتماعي"
-
-#. module: odex_benefit
-#: model:ir.ui.menu,name:odex_benefit.benefit_to_complete_menu
-msgid "Beneficiaries To Complete"
-msgstr "تسجيل البيانات التفصلية للأسر"
-
-#. module: odex_benefit
-#: model:ir.ui.menu,name:odex_benefit.benefit_draft_menu
-msgid "Beneficiaries To Draft"
-msgstr "طلب تسجيل ملف أسرة مبدئ"
-
-#. module: odex_benefit
-#: model:ir.ui.menu,name:odex_benefit.benefit_waiting_approve_menu
-msgid "Beneficiaries To Waiting Approve"
-msgstr "ملفات في انتظار الاعتماد"
-
-#. module: odex_benefit
-#: model:res.groups,name:odex_benefit.group_benefit_user
-msgid "Beneficiaries User"
-msgstr "المستفيد"
-
-#. module: odex_benefit
-#: model:ir.actions.act_window,name:odex_benefit.family_action
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_benefit_family_tree
-msgid "Beneficiaries family"
-msgstr "عائلات المستفيدين"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/wizards/entity_refused_wizard.py:0
-#: model:ir.model.fields,field_description:odex_benefit.field_appliances_furniture__benefit_id
-#: model:ir.model.fields,field_description:odex_benefit.field_appliances_furniture__benefit_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_appliances_furniture_need__benefit_id
-#: model:ir.model.fields,field_description:odex_benefit.field_associations_line__benefit_id
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_behaviors__benefit_id
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_cloth__benefit_id
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_club__benefit_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_expenses__benefit_id
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_followers__benefit_id
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_food_basket__benefit_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_zkat__benefit_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_zkat_line__benefit_id
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_needs__benefit_id
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_needs__benefit_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_cars_line__benefit_id
-#: model:ir.model.fields,field_description:odex_benefit.field_committees_line__benefit_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_craft_skills__benefit_id
-#: model:ir.model.fields,field_description:odex_benefit.field_divorcee_family__benefit_id
-#: model:ir.model.fields,field_description:odex_benefit.field_entity_refused_reason_wizard__entity_id
-#: model:ir.model.fields,field_description:odex_benefit.field_entity_return_reason_wizard__entity_id
-#: model:ir.model.fields,field_description:odex_benefit.field_expenses_line__benefit_id
-#: model:ir.model.fields,field_description:odex_benefit.field_family_debits__benefit_id
-#: model:ir.model.fields,field_description:odex_benefit.field_food_surplus_line__benefit_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_generate_reports__benefit_id
-#: model:ir.model.fields,field_description:odex_benefit.field_generate_reports__benefit_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_housing_need__benefit_id
-#: model:ir.model.fields,field_description:odex_benefit.field_housing_rooms_members__benefit_id
-#: model:ir.model.fields,field_description:odex_benefit.field_ir_attachment__benefit_id
-#: model:ir.model.fields,field_description:odex_benefit.field_mrp_document__benefit_id
-#: model:ir.model.fields,field_description:odex_benefit.field_program_plane_line__benefit_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_researcher_family_wizard__benefit_id
-#: model:ir.model.fields,field_description:odex_benefit.field_salary_line__benefit_id
-#: model:ir.model.fields,field_description:odex_benefit.field_sport_line__benefit_id
-#: model:ir.model.fields,field_description:odex_benefit.field_training_inclinations__benefit_id
-#: model:ir.model.fields,field_description:odex_benefit.field_widow_family__benefit_id
-#: model:ir.model.fields.selection,name:odex_benefit.selection__family_member__member_status__benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__generate_reports__service_to__benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__grant_benefit__mother_status__benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__grant_benefit__replacement_mother_status__benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__visit_location__benefit_type__benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__grant_benefit__benefit_type__benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.family_member_search
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_tree
-#, python-format
-msgid "Benefit"
-msgstr "مستفيد"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/controllers/benefit.py:0
-#, python-format
-msgid "Benefit Account Not Found "
-msgstr "حساب المستفيد غير موجود"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/controllers/benefit.py:0
-#, python-format
-msgid "Benefit Account Updated successfully"
-msgstr "تم تحديث حساب المستفيد"
-
-#. module: odex_benefit
-#: model:ir.actions.act_window,name:odex_benefit.grant_benefit_approve_action
-msgid "Benefit Approve"
-msgstr "ملفات معتمده"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__benefit_behavior_ids
-msgid "Benefit Behavior"
-msgstr "السلوك"
-
-#. module: odex_benefit
-#: model:ir.actions.act_window,name:odex_benefit.benefit_behaviors_type_action
-msgid "Benefit Behaviors Type"
-msgstr "نوع السلوك"
-
-#. module: odex_benefit
-#: model:ir.actions.act_window,name:odex_benefit.grant_benefit_black_list_action
-msgid "Benefit Black List"
-msgstr "القائمة المحظورة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__block
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__block
-msgid "Benefit Block"
-msgstr "مستفيد مستبعد"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_family_validation_setting__benefit_category_ids
-msgid "Benefit Categories"
-msgstr "فئات الاسرة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_category_amount_line__benefit_category_id
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__benefit_category_id
-#: model:ir.model.fields,field_description:odex_benefit.field_rent_lines__benefit_category_id
-msgid "Benefit Category"
-msgstr "فئة الأسرة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_food_surplus__benefit_count
-#: model:ir.model.fields,field_description:odex_benefit.field_rent_lines__benefit_count
-msgid "Benefit Count"
-msgstr "عدد أفراد الأسرة/المستفيدين"
-
-#. module: odex_benefit
-#: model:ir.ui.menu,name:odex_benefit.menu_confirm_benefit_expense
-msgid "Benefit Expense Flow"
-msgstr "اجراءت مصاريف الاسر"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/benefit.py:0
-#, python-format
-msgid "Benefit Expenses"
-msgstr "المصاريف"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_generate_reports__benefit_f_needs_percent
-msgid "Benefit F Needs Percent"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_account_bank_statement_line__benefit_family_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_account_bank_statement_line__family_confirm_id
-#: model:ir.model.fields,field_description:odex_benefit.field_account_move__benefit_family_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_account_move__family_confirm_id
-#: model:ir.model.fields,field_description:odex_benefit.field_account_move_line__benefit_family_id
-#: model:ir.model.fields,field_description:odex_benefit.field_account_move_line__family_confirm_id
-#: model:ir.model.fields,field_description:odex_benefit.field_account_payment__benefit_family_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_account_payment__family_confirm_id
-#: model:ir.model.fields,field_description:odex_benefit.field_food_basket_benefits_line__family_id
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__family_id
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_benefit_family_form
-msgid "Benefit Family"
-msgstr "اسرة المستفيد"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/benefit.py:0
-#: model_terms:ir.ui.view,arch_db:odex_benefit.benefit_followers_form
-#, python-format
-msgid "Benefit Followers"
-msgstr "التابعين"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/controllers/benefit.py:0
-#, python-format
-msgid "Benefit Found"
-msgstr "تم ايجاد المستفيد"
-
-#. module: odex_benefit
-#: model:ir.actions.act_window,name:odex_benefit.housing_action
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__housing_id
-msgid "Benefit Housing"
-msgstr "الوحدات السكنية للمستفيدين"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_entity_refuse_reason__entity_id
-msgid "Benefit Id"
-msgstr "هوية المستفيد"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_account_payment__benefit_loan_id
-msgid "Benefit Loan"
-msgstr "قرض المستفيد"
-
-#. module: odex_benefit
-#: model:ir.actions.act_window,name:odex_benefit.benefit_benefit_loans_action
-msgid "Benefit Loans"
-msgstr "القرض الحسن"
-
-#. module: odex_benefit
-#: model:ir.ui.menu,name:odex_benefit.benefits_root_menu
-msgid "Benefit Management"
-msgstr "ادارة المستفيدين"
-
-#. module: odex_benefit
-#: model:ir.ui.menu,name:odex_benefit.benefit_main_menu
-msgid "Benefit Managements"
-msgstr "ادارة المستفيدين"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.family_member_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Benefit Member"
-msgstr "فرد مستفيد"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_service_request__benefit_member_count
-msgid "Benefit Member count"
-msgstr "عدد المستفيدين"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Benefit Mother"
-msgstr "الأم مستفيدة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__benefit_nationality
-msgid "Benefit Nationality"
-msgstr "جنسية المستفيد"
-
-#. module: odex_benefit
-#: model:ir.actions.act_window,name:odex_benefit.benefit_need_action
-#: model:ir.model.fields,field_description:odex_benefit.field_house_need__benefit_need_id
-msgid "Benefit Need"
-msgstr "تحديد نسبة الأحتياج العامة والخاصة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_needs__benefit_need_type
-msgid "Benefit Need Type"
-msgstr "نوع احتياج المستفيد"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_family__benefit_needs_percent
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__benefit_needs_percent
-msgid "Benefit Needs Percent"
-msgstr "نسبة احتياج المستفيد"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__benefit_needs_value
-msgid "Benefit Needs Value"
-msgstr "قيمة احتياجات المستفيد"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_generate_reports__benefit_omra_ids
-msgid "Benefit Omra"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model,name:odex_benefit.model_benefit_club_activity
-#: model:ir.model,name:odex_benefit.model_benefit_programs
-#: model:ir.model,name:odex_benefit.model_program_plane_line
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_club__benefit_programs
-#: model_terms:ir.ui.view,arch_db:odex_benefit.benefit_programs_tree
-msgid "Benefit Programs"
-msgstr "انشطة النادي"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_generate_reports__benefit_qualification_ids
-msgid "Benefit Qualification"
-msgstr "مؤهلات المستفيد"
-
-#. module: odex_benefit
-#: model:ir.actions.act_window,name:odex_benefit.grant_benefit_reject_action
-msgid "Benefit Reject List"
-msgstr "ملفات مرفوضة"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.services_settings_form
-msgid "Benefit Rent Service Settings"
-msgstr "إعدادات خدمة الإيجار للفرد"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Benefit Replacement Mother"
-msgstr "مستفيدة"
-
-#. module: odex_benefit
-#: model:ir.actions.report,name:odex_benefit.generate_benefit_report_pdf
-msgid "Benefit Report"
-msgstr "تقرير المستفيدين"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_generate_reports__benefit_service_category
-msgid "Benefit Service Category"
-msgstr "فئة الخدمة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_family_member__member_status
-msgid "Benefit Status"
-msgstr "حالة الإستفادة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_generate_reports__benefit_teaching_ids
-msgid "Benefit Teaching"
-msgstr "تعليم"
-
-#. module: odex_benefit
-#: model:ir.actions.act_window,name:odex_benefit.grant_benefit_to_waiting_approve_action
-msgid "Benefit To Waiting Approve"
-msgstr "ملفات في انتظار الاعتماد"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_category__benefits_total
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_family__benefits_total
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_housing__benefits_total
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_loans__benefits_total
-#: model:ir.model.fields,field_description:odex_benefit.field_food_basket_benefits_line__family_member
-msgid "Benefit Total"
-msgstr "الإجمالي"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_generate_reports__benefit_training_ids
-msgid "Benefit Training"
-msgstr "التدريب"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_club__benefit_type
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_followers__follower_type
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__benefit_type
-#: model:ir.model.fields,field_description:odex_benefit.field_service_request__benefit_type
-#: model:ir.model.fields,field_description:odex_benefit.field_services_settings__benefit_type
-msgid "Benefit Type"
-msgstr "نوع المستفيدين"
-
-#. module: odex_benefit
-#: model:ir.actions.act_window,name:odex_benefit.benefit_zkat_action
-#: model_terms:ir.ui.view,arch_db:odex_benefit.benefit_zkat_form
-msgid "Benefit Zkat"
-msgstr "خدمات ذكاة الفطر"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.benefit_need_form
-msgid "Benefit need"
-msgstr "احتياج المستفيد"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/controllers/benefit.py:0
-#, python-format
-msgid "Benefit not Found"
-msgstr "لم يتم ايجاد المستفيد"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/housing_config.py:0
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_family__benefit_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_housing__benefit_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_housing__family_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_need__benefit_ids
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_benefit_category_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_benefit_family_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_benefit_housing_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_benefits_needs_form
-#, python-format
-msgid "Benefits"
-msgstr "المستفيدين"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.committees_view_form
-msgid "Employees"
-msgstr "الموظفين"
-
-#. module: odex_benefit
-#: model:ir.model,name:odex_benefit.model_res_country_city
-msgid "Benefits - City"
-msgstr "المدينة"
-
-#. module: odex_benefit
-#: model:ir.model,name:odex_benefit.model_grant_benefit
-msgid "Benefits - Profiles"
-msgstr "الملف الشخصي - المستفيد"
-
-#. module: odex_benefit
-#: model:ir.model,name:odex_benefit.model_salary_line
-msgid "Benefits - Salary line"
-msgstr "الراتب"
-
-#. module: odex_benefit
-#: model:ir.model,name:odex_benefit.model_benefit_behaviors
-msgid "Benefits - behaviors"
-msgstr "سلوكيات"
-
-#. module: odex_benefit
-#: model:ir.model,name:odex_benefit.model_benefit_behaviors_type
-msgid "Benefits - behaviors type"
-msgstr "نوع السلوك"
-
-#. module: odex_benefit
-#: model:ir.model,name:odex_benefit.model_benefit_category
-msgid "Benefits - category"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model,name:odex_benefit.model_domestic_labor
-msgid "Benefits - domestic labor"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model,name:odex_benefit.model_benefit_expenses
-msgid "Benefits - expenses"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model,name:odex_benefit.model_benefit_family
-msgid "Benefits - family"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model,name:odex_benefit.model_benefit_housing
-msgid "Benefits - housing"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model,name:odex_benefit.model_benefit_housing_rooms_items
-msgid "Benefits - housing items"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model,name:odex_benefit.model_housing_rooms_members
-msgid "Benefits - housing members"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model,name:odex_benefit.model_benefit_housing_rooms
-msgid "Benefits - housing rooms"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model,name:odex_benefit.model_training_inclinations
-msgid "Benefits - inclination"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model,name:odex_benefit.model_item_status
-msgid "Benefits - item status"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model,name:odex_benefit.model_rooms_categories
-msgid "Benefits - rooms categories"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model,name:odex_benefit.model_rooms_items
-msgid "Benefits - rooms items"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model,name:odex_benefit.model_housing_rooms_type
-msgid "Benefits - rooms type"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model,name:odex_benefit.model_craft_skills
-#: model:ir.model,name:odex_benefit.model_sport_line
-msgid "Benefits - sport"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model,name:odex_benefit.model_sport_type
-msgid "Benefits - sport Type"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.actions.act_window,name:odex_benefit.grant_benefit_dashboard_action
-#: model:ir.ui.menu,name:odex_benefit.benefit_dashboard_menu
-#: model_terms:ir.ui.view,arch_db:odex_benefit.committees_view_form
-msgid "Family Profile"
-msgstr "ملفات الأسر"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_generate_reports__benefits_need_ids
-msgid "Benefits Need"
-msgstr "احتياج المستفيد"
-
-#. module: odex_benefit
-#: model:ir.actions.act_window,name:odex_benefit.benefit_benefits_needs_action_2
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_benefits_needs_form
-msgid "Benefits Needs"
-msgstr "احتياجات المستفيدين"
-
-#. module: odex_benefit
-#: model:ir.actions.act_window,name:odex_benefit.needs_categories_action
-msgid "Benefits Needs Categories"
-msgstr "تصنيفات احتياجات المستفيدين"
-
-#. module: odex_benefit
-#: model:ir.actions.act_window,name:odex_benefit.benefits_representative_action
-#: model_terms:ir.ui.view,arch_db:odex_benefit.benefits_representative_view_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.benefits_representative_view_tree
-msgid "Benefits Representative"
-msgstr "المندوبين"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.benefit_zkat_form
-msgid "Benefits Total"
-msgstr ""
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.generate_reports_view_form
-msgid "Benefits Total of Family"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_needs__benefit_type
-msgid "Benefits Type"
-msgstr ""
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_benefits_needs_form
-msgid "Benefits and needs"
-msgstr "المستفيدين والاحتياجات"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_needs__benefit_count
-msgid "Benefits count for needs"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.actions.act_window,name:odex_benefit.grant_benefit_list_complete_action
-msgid "Benefits in complete"
-msgstr "تسجيل البيانات التفصلية للمستفيدين"
-
-#. module: odex_benefit
-#: model:ir.actions.act_window,name:odex_benefit.grant_benefit_list_draft_action
-msgid "Benefits in draft"
-msgstr "طلب تسجيل مستفيد مبدئ"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_followers__birth_date
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__birth_date
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__birth_date
-#: model:ir.model.fields,field_description:odex_benefit.field_family_member__birth_date
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__birth_date
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__father_birth_date
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__mother_birth_date
-msgid "Birth Date"
-msgstr "تاريخ الميلاد"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_generate_reports__black_list
-#: model:ir.model.fields.selection,name:odex_benefit.selection__benefit_sms_configuration__state__black_list
-#: model:ir.model.fields.selection,name:odex_benefit.selection__entity_black_list_wizard__state__black_list
-#: model:ir.model.fields.selection,name:odex_benefit.selection__entity_refused_reason_wizard__state__black_list
-#: model:ir.model.fields.selection,name:odex_benefit.selection__family_member__state__black_list
-#: model:ir.model.fields.selection,name:odex_benefit.selection__family_member__state_a__black_list
-#: model:ir.model.fields.selection,name:odex_benefit.selection__grant_benefit__state__black_list
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Black List"
-msgstr "القائمة المحظورة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_entity_black_list_wizard__black_list_message
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__black_list_message
-msgid "Black List Message"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_entity_black_list_wizard__black_list_reason
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__black_list_reason
-msgid "Black List Reason"
-msgstr "سبب الحظر"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/benefit.py:0
-#: code:addons/odex_benefit/models/family_members.py:0
-#, python-format
-msgid "Black List Wizard"
-msgstr "القائمة السوداء"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_entity_black_list_wizard_form
-msgid "Black list wizard"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__is_blacklisted
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__is_blacklisted
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__is_blacklisted
-msgid "Blacklist"
-msgstr "القائمة المحظورة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__mobile_blacklisted
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__mobile_blacklisted
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__mobile_blacklisted
-msgid "Blacklisted Phone Is Mobile"
-msgstr "الهاتف الذي تم إدراجه في القائمة السوداء هو هاتف محمول "
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__phone_blacklisted
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__phone_blacklisted
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__phone_blacklisted
-msgid "Blacklisted Phone is Phone"
-msgstr "الهاتف الذي تم إدراجه في القائمة السوداء هو هاتف "
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.benefit_loans_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.receive_benefit_loans_form
-msgid "Booked Up"
-msgstr ""
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/benefit_config.py:0
-#: code:addons/odex_benefit/models/benefit_need.py:0
-#: model:ir.model.fields.selection,name:odex_benefit.selection__associations_line__support_type__both
-#: model:ir.model.fields.selection,name:odex_benefit.selection__benefit_club__benefit_type__both
-#: model:ir.model.fields.selection,name:odex_benefit.selection__changes_requests__team_type__both
-#: model:ir.model.fields.selection,name:odex_benefit.selection__food_basket_line__donation_type__both
-#: model:ir.model.fields.selection,name:odex_benefit.selection__payment_collection_line__donation_type__both
-#: model:ir.model.fields.selection,name:odex_benefit.selection__receive_food_basket__donation_method__both
-#: model_terms:ir.ui.view,arch_db:odex_benefit.committees_search_view
-#, python-format
-msgid "Both"
-msgstr "مشترك"
-
-#. module: odex_benefit
-#: model:ir.actions.act_window,name:odex_benefit.action_social_search_committees
-msgid "Social Research Committees"
-msgstr "فرق البحث الاجتماعي"
-
-#. module: odex_benefit
-#: model:ir.ui.menu,name:odex_benefit.social_search_committees_menu
-msgid "Social Research Teams"
-msgstr "فرق البحث الاجتماعي"
-
-#. module: odex_benefit
-#: model:ir.ui.menu,name:odex_benefit.social_search_settings_menu
-msgid "Social Search Settings"
-msgstr "إعدادات البحث الاجتماعي"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__message_bounce
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__message_bounce
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__message_bounce
-msgid "Bounce"
-msgstr "المرتد"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_expense_line__branch_id
-#: model:ir.model.fields,field_description:odex_benefit.field_branch_settings__branch
-#: model:ir.model.fields,field_description:odex_benefit.field_changes_requests__branch_custom_id
-#: model:ir.model.fields,field_description:odex_benefit.field_changes_requests__researcher_branch_id
-#: model:ir.model.fields,field_description:odex_benefit.field_committees_line__branch_custom_id
-#: model:ir.model.fields,field_description:odex_benefit.field_confirm_benefit_expense__branch_custom_id
-#: model:ir.model.fields,field_description:odex_benefit.field_res_districts__branch_custom_id
-#: model:ir.model.fields,field_description:odex_benefit.field_service_request__branch_custom_id
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_search
-#: model_terms:ir.ui.view,arch_db:odex_benefit.service_request_search
-msgid "Branch"
-msgstr "الفرع"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__branch_custom_id
-#: model:ir.model.fields,field_description:odex_benefit.field_researcher_family_wizard__branch_custom_id
-msgid "Branch"
-msgstr "الفرع التشغيلي"
-
-#. module: odex_benefit
-#: model:res.groups,name:odex_benefit.group_benefit_branch_manager
-msgid "Branch Manager"
-msgstr "مدير الفرع"
-
-#. module: odex_benefit
-#: model:ir.actions.act_window,name:odex_benefit.res_branch_action
-#: model:ir.model,name:odex_benefit.model_branch_settings
-#: model:ir.ui.menu,name:odex_benefit.res_branch_menu
-msgid "Branch Settings"
-msgstr "إعدادات الفرع"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_branch_settings__branch_type
-msgid "Branch Type"
-msgstr "نوع الفرع"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__branch_settings__branch_type__branches
-msgid "Branches"
-msgstr "فروع الرياض"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_confirm_benefit_expense__branch_custom_ids
-msgid "Branches"
-msgstr "الفروع"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__can_publish
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__can_publish
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__can_publish
-msgid "Can Publish"
-msgstr "بإمكانه النشر "
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__benefit_zkat__state__cancel
-#: model:ir.model.fields.selection,name:odex_benefit.selection__receive_benefit_zkat__state__cancel
-#: model:ir.model.fields.selection,name:odex_benefit.selection__receive_food_basket__state__cancel
-#: model:ir.model.fields.selection,name:odex_benefit.selection__visit_location__state__cancel
-#: model_terms:ir.ui.view,arch_db:odex_benefit.benefit_receive_zkat_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.benefit_zkat_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.generate_reports_view_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.receive_food_basket_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.return_reason_wizard_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_confirm_benefit_expense_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_confirm_benefit_expense_search
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_family_bank_report_wizard_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_entity_black_list_wizard_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_entity_final_refused_reason_wizard_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_entity_refused_reason_wizard_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_entity_return_reason_wizard_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_exception_member_wizard_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_exception_wizard_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_reason_for_return_wizard
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_refuse_reason_wizard
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_resarcher_member_wizard_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_suspend_member_reason_wizard_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_suspend_reason_wizard_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_visit_skip_otp_wizard_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.visit_location_otp_wizard_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_visit_location_refusal_reason_wizard_form
-msgid "Cancel"
-msgstr "إلغاء"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__membership_cancel
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__membership_cancel
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__membership_cancel
-msgid "Cancel Membership Date"
-msgstr "تاريخ إلغاء العضوية"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__cancel_reason
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__cancel_reason
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__cancel_reason
-msgid "Cancel Reason"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__confirm_benefit_expense__state__cancel
-msgid "Cancelled"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__car_ids
-msgid "Car"
-msgstr "سيارة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__car_count
-msgid "Car Count"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_cars_line__car_model
-msgid "Car Model"
-msgstr "موديل السيارة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_education_status__case_study
-#: model:ir.model.fields,field_description:odex_benefit.field_family_member__case_study
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__case_study
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__replacement_case_study
-msgid "Case Study"
-msgstr "استمرارية التعليم"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_family_validation_setting__cash_expense
-msgid "Cash Expense"
-msgstr "مصاريف النقد"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_family_validation_setting__cash_expense_account_id
-msgid "Cash Expense Account"
-msgstr "حساب مصاريف النقد"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/family_validation_setting.py:0
-#, python-format
-msgid "Cash Expense should be positive if cash account selected"
-msgstr "يجب ان تكون مصاريف النقدية ايجابية اذا تم اختيار الحساب النقدي"
-
-#. module: odex_benefit
-#: model:ir.model,name:odex_benefit.model_needs_categories
-msgid "Categories of need of benefit "
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_zkat_line__category_id
-#: model:ir.model.fields,field_description:odex_benefit.field_expenses_line__category_id
-#: model:ir.model.fields,field_description:odex_benefit.field_generate_reports__category_id
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_benefit_category_form
-msgid "Category"
-msgstr "الفئة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_category__benefit_ids
-msgid "Category Benefits"
-msgstr "فئات الأسر"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_category__name
-msgid "Category Name"
-msgstr "اسم الفئة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__dead_certificate
-msgid "Certificate"
-msgstr "الشهادة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__dead_certificate_date
-msgid "Certificate Date"
-msgstr "تاريخ الشهادة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_craft_skills__certificates
-#: model:ir.model.fields,field_description:odex_benefit.field_training_inclinations__certificates
-msgid "Certificates"
-msgstr "الشهادات"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__certifications_count
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__certifications_count
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__certifications_count
-msgid "Certifications Count"
-msgstr "عدد الشهادات"
-
-#. module: odex_benefit
-#: model:ir.ui.menu,name:odex_benefit.change_requests_menu
-msgid "Change Requests"
-msgstr "طلبات النقل"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_changes_requests__change_type
-msgid "Change Type"
-msgstr "نوع النقل"
-
-#. module: odex_benefit
-#: model:ir.model,name:odex_benefit.model_changes_requests
-#: model:ir.ui.menu,name:odex_benefit.changes_requests_men
-#: model_terms:ir.ui.view,arch_db:odex_benefit.changes_requests_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.changes_requests_tree
-msgid "Changes Requests"
-msgstr "طلبات النقل"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__channel_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__channel_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__channel_ids
-msgid "Channels"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.actions.server,name:odex_benefit.ir_cron_auto_member_exception_ir_actions_server
-#: model:ir.cron,cron_name:odex_benefit.ir_cron_auto_member_exception
-#: model:ir.cron,name:odex_benefit.ir_cron_auto_member_exception
-msgid "Check Member Temporarily Exception"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.actions.server,name:odex_benefit.ir_cron_auto_exception_ir_actions_server
-#: model:ir.cron,cron_name:odex_benefit.ir_cron_auto_exception
-#: model:ir.cron,name:odex_benefit.ir_cron_auto_exception
-msgid "Check Temporarily Exception"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model.fields,help:odex_benefit.field_benefits_representative__is_company
-#: model:ir.model.fields,help:odex_benefit.field_external_benefits__is_company
-#: model:ir.model.fields,help:odex_benefit.field_grant_benefit__is_company
-msgid "Check if the contact is a company, otherwise it is a person"
-msgstr "فحص ما اذا كانت جهة الاتصال مؤسسة، وإلا كانت شخصًا"
-
-#. module: odex_benefit
-#: model:ir.model.fields,help:odex_benefit.field_benefits_representative__employee
-#: model:ir.model.fields,help:odex_benefit.field_external_benefits__employee
-#: model:ir.model.fields,help:odex_benefit.field_grant_benefit__employee
-msgid "Check this box if this contact is an Employee."
-msgstr "قم بتحديد هذا المربع إذا كانت جهة الاتصال المختارة موظفًا."
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__child_number
-msgid "Children"
-msgstr "الفروع"
-
-#. module: odex_benefit
-#: model:ir.ui.menu,name:odex_benefit.res_city_menu
-msgid "Cities"
-msgstr "المحافظات"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/benefit.py:0
-#: model:ir.model.fields.selection,name:odex_benefit.selection__grant_benefit__father_id_number_type__citizen
-#: model:ir.model.fields.selection,name:odex_benefit.selection__grant_benefit__mother_id_number_type__citizen
-#: model:ir.model.fields.selection,name:odex_benefit.selection__grant_benefit__replacement_mother_id_number_type__citizen
-#, python-format
-msgid "Citizen"
-msgstr "مواطن"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_food_surplus__city_id
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_housing__city_id
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_needs__city_id
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__city
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__city_id
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__city
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__city_id
-#: model:ir.model.fields,field_description:odex_benefit.field_external_request__city_id
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__city
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__city_id
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__father_city_id
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__mother_city_id
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__replacement_mother_city_id
-#: model:ir.model.fields,field_description:odex_benefit.field_other_associations__city_id
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_food_surplus__city_id
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_res_city_form
-msgid "City"
-msgstr "المحافظة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_branch_settings__city_id
-#: model:ir.model.fields,field_description:odex_benefit.field_res_districts__city_id
-msgid "City"
-msgstr "المدينة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_education_status__classroom
-#: model:ir.model.fields,field_description:odex_benefit.field_family_member__classroom
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__classroom
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__replacement_classroom
-msgid "Classroom"
-msgstr "الصف الدراسي"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.visits_form
-msgid "Close"
-msgstr "إغلاق الزيارة"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__visit_location__state__close
-msgid "Close"
-msgstr "تم الاستبيان"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__cloth_ids
-msgid "Cloth"
-msgstr "اللبس الخاص بالمستفيد"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_cloth__cloth_note
-msgid "Cloth Note"
-msgstr "ملاحظة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_cloth__cloth_size
-msgid "Cloth Size"
-msgstr "مقاس الملابس"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_cloth__cloth_type
-msgid "Cloth Type"
-msgstr "نوع الملابس"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_family_validation_setting__clothing_expense
-msgid "Clothing Expense"
-msgstr "مصاريف الكساء"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_family_validation_setting__clothing_expense_account_id
-msgid "Clothing Expense Account"
-msgstr "حساب مصاريف الكساء"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/family_validation_setting.py:0
-#, python-format
-msgid "Clothing Expense should be positive if clothing account selected"
-msgstr "يجب ان تكون مصاريف الكساء ايجابية اذا تم اختيار حساب الكساء"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__benefit_expenses__expenses_type__clothing
-#: model:ir.model.fields.selection,name:odex_benefit.selection__expenses_line__expenses_type__clothing
-msgid "Clothing Expenses"
-msgstr "مصاريف الكسوة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_external_request__club_id
-#: model:ir.model.fields,field_description:odex_benefit.field_program_plane_line__club_id
-msgid "Club"
-msgstr "النادي"
-
-#. module: odex_benefit
-#: model:ir.actions.act_window,name:odex_benefit.club_programs_action
-#: model:ir.model.fields,field_description:odex_benefit.field_generate_reports__club_programs
-msgid "Club Programs"
-msgstr "انشطة النادي"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_zkat__code
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__code
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__code
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__code
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_benefit_zkat__code
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_food_basket__code
-#: model:ir.model.fields,field_description:odex_benefit.field_res_bank__code
-#: model:ir.model.fields,field_description:odex_benefit.field_res_country_city__code
-#: model:ir.model.fields,field_description:odex_benefit.field_visit_location__benefit_code
-msgid "Code"
-msgstr "الكود"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__benefit_housing__housing_cat__collapsible
-#: model:ir.model.fields.selection,name:odex_benefit.selection__grant_benefit__housing_cat__collapsible
-msgid "Collapsible"
-msgstr "قابل للإنهيار"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__benefit_housing__housing_cat__collapsed
-#: model:ir.model.fields.selection,name:odex_benefit.selection__grant_benefit__housing_cat__collapsed
-msgid "Collapsed"
-msgstr "منهار"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__color
-#: model:ir.model.fields,field_description:odex_benefit.field_domestic_labor__color
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__color
-#: model:ir.model.fields,field_description:odex_benefit.field_food_basket_line__color
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__color
-msgid "Color Index"
-msgstr "معرف اللون"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__commercial_partner_id
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__commercial_partner_id
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__commercial_partner_id
-msgid "Commercial Entity"
-msgstr "الكيان التجاري"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__is_commercial_record
-msgid "Commercial Record"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__commercial_record_amount
-msgid "Commercial Record Amount"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__commercial_record_attach
-msgid "Commercial Record Attach"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__commercial_record_code
-msgid "Commercial Record Code"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__receive_appliances_furniture__donation_method__communication
-msgid "Communication"
-msgstr "اتصالات"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__ref_company_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__ref_company_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__ref_company_ids
-msgid "Companies that refers to partner"
-msgstr "مؤسسات تشير إلي شركاء"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_zkat__company_id
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__company_id
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__company_id
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__company_id
-#: model:ir.model.fields,field_description:odex_benefit.field_payment_orders__company_id
-#: model:ir.model.fields,field_description:odex_benefit.field_seasonal_service__company_id
-#: model:ir.model.fields,field_description:odex_benefit.field_service_request__company_id
-#: model:ir.model.fields,field_description:odex_benefit.field_services_settings__company_id
-msgid "Company"
-msgstr "الشركة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__certifications_company_count
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__certifications_company_count
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__certifications_company_count
-msgid "Company Certifications Count"
-msgstr "عدد شهادات الشركة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__company_name
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__company_name
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__company_name
-msgid "Company Name"
-msgstr "اسم الشركة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__commercial_company_name
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__commercial_company_name
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__commercial_company_name
-msgid "Company Name Entity"
-msgstr "اسم الجهة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__company_type
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__company_type
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__company_type
-msgid "Company Type"
-msgstr "نوع الشركة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__partner_gid
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__partner_gid
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__partner_gid
-msgid "Company database ID"
-msgstr "معرف قاعدة بيانات المؤسسة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__contact_address
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__contact_address
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__contact_address
-msgid "Complete Address"
-msgstr "عنوان الشركة"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__benefit_sms_configuration__state__complete_info
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Complete Information"
-msgstr "إكمال البيانات"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_needs__completion_ratio
-msgid "Completion Ratio"
-msgstr "نسبة الانجاز"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.benefit_receive_zkat_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.receive_food_basket_form
-msgid "Compute Purchase Order"
-msgstr ""
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Configuration"
-msgstr "إعدادات ملف الأسرة"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.return_reason_wizard_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_confirm_benefit_expense_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_confirm_benefit_expense_search
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_reason_for_return_wizard
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_refuse_reason_wizard
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_visit_skip_otp_wizard_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.visit_location_otp_wizard_form
-msgid "Confirm"
-msgstr "تاكيد"
-
-#. module: odex_benefit
-#: model:ir.model,name:odex_benefit.model_confirm_benefit_expense
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_expense_line__confirm_expense_id
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_confirm_benefit_expense_form
-msgid "Confirm Benefit Expense"
-msgstr "اجراءت مصاريف الاسر"
-
-#. module: odex_benefit
-#: model:ir.actions.act_window,name:odex_benefit.action_confirm_benefit_expense
-#: model_terms:ir.ui.view,arch_db:odex_benefit.payment_orders_form
-msgid "Confirm Benefit Expenses"
-msgstr "مصاريف الاسر"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__confirm_benefit_expense__state__confirm
-msgid "Confirmed"
-msgstr "تم"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__child_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__child_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__child_ids
-msgid "Contact"
-msgstr "تم التواصل"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__visit_location__state__contact
-msgid "Contact"
-msgstr "جاري التواصل"
-
-
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/controllers/benefit.py:0
-#: code:addons/odex_benefit/controllers/benefit_services.py:0
-#, python-format
-msgid "Contact Admin"
-msgstr "التواصل مع مدير النظام"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Contact Information"
-msgstr "بيانات التواصل"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__sms_phone
-msgid "Contact Phone"
-msgstr "رقم الجوال للتواصل"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_visit_location__sms_phone
-msgid "Contact Phone"
-msgstr "رقم الجوال للأسرة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__contact_type
-msgid "Contact Type"
-msgstr "طريقة التواصل الافتراضية"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__contract_num
-msgid "Contract Number"
-msgstr "رقم عقد الإيجار"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__copy_no
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__copy_no
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__copy_no
-msgid "Copy No"
-msgstr "رقم النسخه"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__payment_token_count
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__payment_token_count
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__payment_token_count
-msgid "Count Payment Token"
-msgstr "عدد رموز السداد السرية"
-
-#. module: odex_benefit
-#: model:ir.model.fields,help:odex_benefit.field_benefits_representative__message_bounce
-#: model:ir.model.fields,help:odex_benefit.field_external_benefits__message_bounce
-#: model:ir.model.fields,help:odex_benefit.field_grant_benefit__message_bounce
-msgid "Counter of the number of bounced emails for this contact"
-msgstr "عدد الرسائل المرتدة لجهة الاتصال هذه"
-
-#. module: odex_benefit
-#: model:ir.model,name:odex_benefit.model_res_country
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__country_id
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__country_id
-#: model:ir.model.fields,field_description:odex_benefit.field_external_request__country_id
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__country_id
-#: model:ir.model.fields,field_description:odex_benefit.field_res_country_city__country_id
-msgid "Country"
-msgstr "الدولة"
-
-#. module: odex_benefit
-#: model:ir.actions.act_window,name:odex_benefit.res_city_list_action
-msgid "Country Cities"
-msgstr "المحافظة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_external_request__state_id
-msgid "Country State"
-msgstr "المنطقة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__craft_skill_ids
-msgid "Craft Skill"
-msgstr ""
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.generate_reports_view_form
-msgid "Create A Club"
-msgstr ""
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.visits_form
-msgid "Create New Visit"
-msgstr "إنشاء زيارة جديدة"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Create Periodic visit"
-msgstr "إنشاء زيارة دورية"
-
-#. module: odex_benefit
-#: model_terms:ir.actions.act_window,help:odex_benefit.attachments_settings_action
-msgid "Create the Attachment Setting"
-msgstr "انشاء اعدادات مرفقات"
-
-#. module: odex_benefit
-#: model_terms:ir.actions.act_window,help:odex_benefit.grant_benefit_dashboard_action
-#: model_terms:ir.actions.act_window,help:odex_benefit.grant_benefit_list_complete_action
-#: model_terms:ir.actions.act_window,help:odex_benefit.grant_benefit_list_draft_action
-msgid "Create the Benefit"
-msgstr "انشاء ملف أسرة"
-
-#. module: odex_benefit
-#: model_terms:ir.actions.act_window,help:odex_benefit.benefit_need_action
-msgid "Create the Benefit Need"
-msgstr ""
-
-#. module: odex_benefit
-#: model_terms:ir.actions.act_window,help:odex_benefit.benefit_zkat_action
-msgid "Create the Benefit Zkat"
-msgstr ""
-
-#. module: odex_benefit
-#: model_terms:ir.actions.act_window,help:odex_benefit.category_action
-msgid "Create the Category"
-msgstr ""
-
-#. module: odex_benefit
-#: model_terms:ir.actions.act_window,help:odex_benefit.disabilities_settings_action
-msgid "Create the Disabilities Setting"
-msgstr ""
-
-#. module: odex_benefit
-#: model_terms:ir.actions.act_window,help:odex_benefit.diseases_settings_action
-msgid "Create the Diseases Setting"
-msgstr ""
-
-#. module: odex_benefit
-#: model_terms:ir.actions.act_window,help:odex_benefit.exception_reason_action
-msgid "Create the Exception Reason"
-msgstr "انشاء سبب استثناء من الايقاف"
-
-#. module: odex_benefit
-#: model_terms:ir.actions.act_window,help:odex_benefit.expenses_type_action
-msgid "Create the Expenses Type"
-msgstr "انشاء انواع المصاريف"
-
-#. module: odex_benefit
-#: model_terms:ir.actions.act_window,help:odex_benefit.res_branch_action
-msgid "Create the First Branch"
-msgstr "انشاء الفروع"
-
-#. module: odex_benefit
-#: model_terms:ir.actions.act_window,help:odex_benefit.districts_action
-msgid "Create the First District"
-msgstr ""
-
-#. module: odex_benefit
-#: model_terms:ir.actions.act_window,help:odex_benefit.visits_action
-msgid "Create the First Visit"
-msgstr ""
-
-#. module: odex_benefit
-#: model_terms:ir.actions.act_window,help:odex_benefit.benefit_food_surplus_action
-msgid "Create the Food Surplus"
-msgstr ""
-
-#. module: odex_benefit
-#: model_terms:ir.actions.act_window,help:odex_benefit.club_programs_action
-#: model_terms:ir.actions.act_window,help:odex_benefit.food_surplus_type_action
-msgid "Create the Food Surplus Type"
-msgstr ""
-
-#. module: odex_benefit
-#: model_terms:ir.actions.act_window,help:odex_benefit.hobbies_settings_action
-msgid "Create the Hobbies Setting"
-msgstr ""
-
-#. module: odex_benefit
-#: model_terms:ir.actions.act_window,help:odex_benefit.hospital_action
-msgid "Create the Hospital file"
-msgstr ""
-
-#. module: odex_benefit
-#: model_terms:ir.actions.act_window,help:odex_benefit.family_validation_action
-#: model_terms:ir.actions.act_window,help:odex_benefit.housing_action
-msgid "Create the Housing"
-msgstr ""
-
-#. module: odex_benefit
-#: model_terms:ir.actions.act_window,help:odex_benefit.housing_rooms_type_action
-msgid "Create the Housing Rooms Type"
-msgstr ""
-
-#. module: odex_benefit
-#: model_terms:ir.actions.act_window,help:odex_benefit.rooms_categories_action
-msgid "Create the Housing Rooms categories"
-msgstr ""
-
-#. module: odex_benefit
-#: model_terms:ir.actions.act_window,help:odex_benefit.housing_rooms_items_action
-#: model_terms:ir.actions.act_window,help:odex_benefit.item_status_action
-msgid "Create the Housing Rooms items"
-msgstr ""
-
-#. module: odex_benefit
-#: model_terms:ir.actions.act_window,help:odex_benefit.income_type_action
-msgid "Create the Income Type"
-msgstr "انشاء انواع الدخل"
-
-#. module: odex_benefit
-#: model_terms:ir.actions.act_window,help:odex_benefit.insurance_company_action
-msgid "Create the Insurance Company"
-msgstr ""
-
-#. module: odex_benefit
-#: model_terms:ir.actions.act_window,help:odex_benefit.loan_giver_action
-msgid "Create the Loan Giver"
-msgstr "انشاء جهات مانحة للقرض"
-
-#. module: odex_benefit
-#: model_terms:ir.actions.act_window,help:odex_benefit.loan_reason_action
-msgid "Create the Loan Reason"
-msgstr "انشاء اسباب القروض"
-
-#. module: odex_benefit
-#: model_terms:ir.actions.act_window,help:odex_benefit.benefit_reports_log_action
-msgid "Create the Log"
-msgstr ""
-
-#. module: odex_benefit
-#: model_terms:ir.actions.act_window,help:odex_benefit.marital_status_action
-msgid "Create the Marital Status"
-msgstr ""
-
-#. module: odex_benefit
-#: model_terms:ir.actions.act_window,help:odex_benefit.family_member_action
-msgid "Create the Member"
-msgstr ""
-
-#. module: odex_benefit
-#: model_terms:ir.actions.act_window,help:odex_benefit.member_location_action
-msgid "Create the Member Location"
-msgstr ""
-
-#. module: odex_benefit
-#: model_terms:ir.actions.act_window,help:odex_benefit.needs_categories_action
-msgid "Create the Needs Categories"
-msgstr ""
-
-#. module: odex_benefit
-#: model_terms:ir.actions.act_window,help:odex_benefit.other_associations_action
-msgid "Create the Other Associations"
-msgstr ""
-
-#. module: odex_benefit
-#: model_terms:ir.actions.act_window,help:odex_benefit.receive_benefit_loans_action
-msgid "Create the Receive benefit Loans"
-msgstr ""
-
-#. module: odex_benefit
-#: model_terms:ir.actions.act_window,help:odex_benefit.relation_action
-msgid "Create the Relation"
-msgstr "أنشاء ص قرابة"
-
-#. module: odex_benefit
-#: model_terms:ir.actions.act_window,help:odex_benefit.service_request_account_action
-#: model_terms:ir.actions.act_window,help:odex_benefit.service_request_action
-msgid "Create the Service Request"
-msgstr ""
-
-#. module: odex_benefit
-#: model_terms:ir.actions.act_window,help:odex_benefit.services_settings_action
-msgid "Create the Service Setting"
-msgstr "انشاء اعدادات الخدمات"
-
-#. module: odex_benefit
-#: model_terms:ir.actions.act_window,help:odex_benefit.specialization_action
-msgid "Create the Specialization"
-msgstr ""
-
-#. module: odex_benefit
-#: model_terms:ir.actions.act_window,help:odex_benefit.sport_type_action
-msgid "Create the Sport Type"
-msgstr ""
-
-#. module: odex_benefit
-#: model_terms:ir.actions.act_window,help:odex_benefit.visits_types_action
-msgid "Create the Visit Type"
-msgstr ""
-
-#. module: odex_benefit
-#: model_terms:ir.actions.act_window,help:odex_benefit.benefit_appliances_furniture_action
-#: model_terms:ir.actions.act_window,help:odex_benefit.receive_appliances_furniture_action
-msgid "Create the appliances and furniture"
-msgstr ""
-
-#. module: odex_benefit
-#: model_terms:ir.actions.act_window,help:odex_benefit.benefit_benefit_loans_action
-msgid "Create the benefit Loans"
-msgstr ""
-
-#. module: odex_benefit
-#: model_terms:ir.actions.act_window,help:odex_benefit.benefit_behaviors_type_action
-msgid "Create the benefitbehaviors.type"
-msgstr ""
-
-#. module: odex_benefit
-#: model_terms:ir.actions.act_window,help:odex_benefit.benefit_club_action
-msgid "Create the club"
-msgstr ""
-
-#. module: odex_benefit
-#: model_terms:ir.actions.act_window,help:odex_benefit.family_action
-msgid "Create the family"
-msgstr ""
-
-#. module: odex_benefit
-#: model_terms:ir.actions.act_window,help:odex_benefit.res_bank_list_action
-msgid "Create the first Bank"
-msgstr ""
-
-#. module: odex_benefit
-#: model_terms:ir.actions.act_window,help:odex_benefit.res_city_list_action
-msgid "Create the first City"
-msgstr "إنشاء محافظة"
-
-#. module: odex_benefit
-#: model_terms:ir.actions.act_window,help:odex_benefit.domestic_labor_action
-msgid "Create the first Domestic labor"
-msgstr ""
-
-#. module: odex_benefit
-#: model_terms:ir.actions.act_window,help:odex_benefit.benefit_food_basket_action
-msgid "Create the food basket"
-msgstr ""
-
-#. module: odex_benefit
-#: model_terms:ir.actions.act_window,help:odex_benefit.benefit_benefits_needs_action_2
-msgid "Create the needs"
-msgstr ""
-
-#. module: odex_benefit
-#: model_terms:ir.actions.act_window,help:odex_benefit.receive_food_basket_action
-msgid "Create the receive food basket"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_appliances_furniture__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_appliances_furniture_need__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_associations_line__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_attachments_settings__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_behaviors__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_behaviors_type__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_category__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_cloth__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_club__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_club_activity__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_expenses__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_family__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_followers__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_food_basket__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_food_surplus__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_housing__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_housing_rooms__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_housing_rooms_items__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_loans__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_need__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_programs__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_sms_configuration__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_zkat__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_zkat_line__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_needs__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_branch_settings__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_cars_line__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_changes_requests__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_cloth_size__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_cloth_type__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_committees_line__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_confirm_benefit_expense__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_craft_skills__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_disabilities_settings__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_diseases_settings__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_divorcee_family__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_domestic_labor__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_donations_type__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_education_classroom__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_education_entities__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_education_illiterate_reason__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_education_level__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_education_result__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_entity_black_list_wizard__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_entity_refuse_reason__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_entity_refused_reason_wizard__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_exception_reason__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_exception_wizard__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_expenses_line__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_expenses_type__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_external_request__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_family_debits__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_family_member__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_family_validation_setting__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_food_basket_benefits_line__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_food_basket_line__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_food_surplus_line__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_food_surplus_type__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_generate_reports__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_generate_reports_log__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_hobbies_settings__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_home_maintenance_lines__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_hospital_hospital__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_house_need__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_housing_need__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_housing_rooms_members__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_housing_rooms_type__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_income_type__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_insurance_company__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_insurance_type__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_item_status__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_loan_giver__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_loan_reason__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_main_service__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_marital_status__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_member_disabilities__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_member_diseases__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_member_hobbies__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_member_location__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_needs_categories__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_needs_payment_line__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_other_associations__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_payment_collection_line__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_program_plane_line__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_purchase_product_loan__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_appliances_furniture__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_benefit_loans__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_benefit_zkat__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_food_basket__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_food_surplus__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_relation_settings__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_rent_lines__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_res_country_city__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_res_districts__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_researcher_family_wizard__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_researcher_member_wizard__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_rooms_categories__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_rooms_items__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_salary_line__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_service_attachments_settings__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_service_request__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_services_settings__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_specialization_specialization__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_sport_line__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_sport_type__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_study_material__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_survey_setting__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_suspend_reason__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_suspend_reason_wizard__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_training_inclinations__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_training_type__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_visit_location__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_visits_types__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_widow_family__create_uid
-#: model:ir.model.fields,field_description:odex_benefit.field_zkat_line__create_uid
-msgid "Created by"
-msgstr "انشئ بواسطة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__is_from_portal
-msgid "is Created from Portal?"
-msgstr "هل تم إنشاءه من البوابة؟"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_appliances_furniture__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_appliances_furniture_need__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_associations_line__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_attachments_settings__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_behaviors__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_behaviors_type__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_category__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_cloth__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_club__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_club_activity__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_expenses__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_family__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_followers__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_food_basket__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_food_surplus__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_housing__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_housing_rooms__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_housing_rooms_items__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_loans__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_need__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_programs__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_sms_configuration__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_zkat__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_zkat_line__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_needs__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_branch_settings__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_cars_line__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_changes_requests__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_cloth_size__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_cloth_type__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_committees_line__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_confirm_benefit_expense__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_craft_skills__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_disabilities_settings__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_diseases_settings__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_divorcee_family__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_domestic_labor__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_donations_type__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_education_classroom__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_education_entities__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_education_illiterate_reason__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_education_level__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_education_result__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_entity_black_list_wizard__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_entity_refuse_reason__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_entity_refused_reason_wizard__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_exception_reason__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_exception_wizard__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_expenses_line__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_expenses_type__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_external_request__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_family_debits__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_family_member__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_family_validation_setting__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_food_basket_benefits_line__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_food_basket_line__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_food_surplus_line__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_food_surplus_type__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_generate_reports__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_generate_reports_log__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_hobbies_settings__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_home_maintenance_lines__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_hospital_hospital__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_house_need__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_housing_need__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_housing_rooms_members__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_housing_rooms_type__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_income_type__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_insurance_company__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_insurance_type__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_item_status__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_loan_giver__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_loan_reason__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_main_service__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_marital_status__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_member_disabilities__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_member_diseases__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_member_hobbies__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_member_location__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_needs_categories__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_needs_payment_line__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_other_associations__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_payment_collection_line__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_program_plane_line__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_purchase_product_loan__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_appliances_furniture__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_benefit_loans__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_benefit_zkat__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_food_basket__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_food_surplus__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_relation_settings__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_rent_lines__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_res_country_city__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_res_districts__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_researcher_family_wizard__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_researcher_member_wizard__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_rooms_categories__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_rooms_items__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_salary_line__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_service_attachments_settings__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_service_request__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_services_settings__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_specialization_specialization__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_sport_line__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_sport_type__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_study_material__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_survey_setting__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_suspend_reason__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_suspend_reason_wizard__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_training_inclinations__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_training_type__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_visit_location__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_visits_types__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_widow_family__create_date
-#: model:ir.model.fields,field_description:odex_benefit.field_zkat_line__create_date
-msgid "Created on"
-msgstr "تاريخ الانشاء"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__credit_limit
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__credit_limit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__credit_limit
-msgid "Credit Limit"
-msgstr "حد الائتمان"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_loans__currency_id
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__currency_id
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__currency_id
-#: model:ir.model.fields,field_description:odex_benefit.field_food_basket_line__currency_id
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__currency_id
-#: model:ir.model.fields,field_description:odex_benefit.field_seasonal_service__currency_id
-#: model:ir.model.fields,field_description:odex_benefit.field_needs_payment_line__currency_id
-#: model:ir.model.fields,field_description:odex_benefit.field_payment_collection_line__currency_id
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_benefit_loans__currency_id
-#: model:ir.model.fields,field_description:odex_benefit.field_services_settings__currency_id
-#: model:ir.model.fields,field_description:odex_benefit.field_payment_orders__currency_id
-#: model:ir.model.fields,field_description:odex_benefit.field_service_request__currency_id
-msgid "Currency"
-msgstr "العملة"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__education_status__education_status_type__current
-msgid "Current"
-msgstr "الحالية"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.family_member_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Current Education Status"
-msgstr "الحالة التعليمية الحالية"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/education_status.py:0
-#, python-format
-msgid "Current Education Status Already Exists"
-msgstr "الحالة التعليمية الحالية موجودة بالفعل"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__membership_state
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__membership_state
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__membership_state
-msgid "Current Membership Status"
-msgstr "حالة العضوية الحالية"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_generate_reports__current_user
-msgid "Current User"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model.fields,help:odex_benefit.field_appliances_furniture__qty_available
-#: model:ir.model.fields,help:odex_benefit.field_benefit_food_basket__qty_available
-#: model:ir.model.fields,help:odex_benefit.field_benefit_zkat__qty_available
-#: model:ir.model.fields,help:odex_benefit.field_receive_benefit_zkat__qty_available
-#: model:ir.model.fields,help:odex_benefit.field_receive_food_basket__qty_available
-msgid ""
-"Current quantity of products.\n"
-"In a context with a single Stock Location, this includes goods stored at this Location, or any of its children.\n"
-"In a context with a single Warehouse, this includes goods stored in the Stock Location of this Warehouse, or any of its children.\n"
-"stored in the Stock Location of the Warehouse of this Shop, or any of its children.\n"
-"Otherwise, this includes goods stored in any Stock Location with 'internal' type."
-msgstr ""
-"الكمية الحالية من المنتجات.\n"
-"في سياق مع موقع مخزون فردى ، وهذا يشمل البضائع المخزنة في هذا الموقع ، أو أي من أبنائها.\n"
-"في سياق مع مستودع فردى ، وهذا يشمل البضائع المخزنة في موقع مخزون هذا المستودع، أو أي من أبنائها.\n"
-"تخزينها في موقع المخزون من مستودع هذا المحل، أو أي من أبنائها.\n"
-"خلاف ذلك، وهذا يشمل البضائع المخزنة في أي موقع مع نوع 'الداخلية'."
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__property_stock_customer
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__property_stock_customer
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__property_stock_customer
-msgid "Customer Location"
-msgstr "مكان العميل"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__property_payment_term_id
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__property_payment_term_id
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__property_payment_term_id
-msgid "Customer Payment Terms"
-msgstr "شروط السداد للعميل"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__customer_rank
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__customer_rank
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__customer_rank
-msgid "Customer Rank"
-msgstr "رتبة العميل"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_zkat_line__date
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_needs__date
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__date
-#: model:ir.model.fields,field_description:odex_benefit.field_confirm_benefit_expense__date
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__date
-#: model:ir.model.fields,field_description:odex_benefit.field_food_basket_benefits_line__date
-#: model:ir.model.fields,field_description:odex_benefit.field_generate_reports__date
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__date
-msgid "Date"
-msgstr "التاريخ"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__date_death_husband
-#: model:ir.model.fields,field_description:odex_benefit.field_widow_family__date_death_husband
-msgid "Date Death Husband"
-msgstr "تاريخ وفاة الزوج"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_divorcee_family__date_divorcee
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__date_divorcee
-msgid "Date Divorcee"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_food_basket__date_end
-#: model:ir.model.fields,field_description:odex_benefit.field_food_surplus_line__date_end
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_food_basket__date_end
-msgid "Date End"
-msgstr "تاريخ النهاية"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_generate_reports__date_from
-#: model:ir.model.fields,field_description:odex_benefit.field_program_plane_line__date_from
-msgid "Date From"
-msgstr "تاريخ من"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_food_basket__date_start
-#: model:ir.model.fields,field_description:odex_benefit.field_food_surplus_line__date_start
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_food_basket__date_start
-msgid "Date Start"
-msgstr "تاريخ البداية"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_generate_reports__date_to
-#: model:ir.model.fields,field_description:odex_benefit.field_program_plane_line__date_to
-msgid "Date To"
-msgstr "تاريخ إلى"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_zkat__date_to
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_benefit_zkat__date_to
-msgid "Date end"
-msgstr "تاريخ النهاية"
-
-#. module: odex_benefit
-#: model:ir.model.fields,help:odex_benefit.field_benefits_representative__membership_start
-#: model:ir.model.fields,help:odex_benefit.field_external_benefits__membership_start
-#: model:ir.model.fields,help:odex_benefit.field_grant_benefit__membership_start
-msgid "Date from which membership becomes active."
-msgstr "تاريخ تنشيط العضوية."
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_appliances_furniture__date_receipt
-msgid "Date of Receipt"
-msgstr "تاريخ الاستلام"
-
-#. module: odex_benefit
-#: model:ir.model.fields,help:odex_benefit.field_benefits_representative__membership_cancel
-#: model:ir.model.fields,help:odex_benefit.field_external_benefits__membership_cancel
-#: model:ir.model.fields,help:odex_benefit.field_grant_benefit__membership_cancel
-msgid "Date on which membership has been cancelled"
-msgstr "تاريخ إلغاء العضوية"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_zkat__date_from
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_benefit_zkat__date_from
-msgid "Date start"
-msgstr "تاريخ البداية"
-
-#. module: odex_benefit
-#: model:ir.model.fields,help:odex_benefit.field_benefits_representative__membership_stop
-#: model:ir.model.fields,help:odex_benefit.field_external_benefits__membership_stop
-#: model:ir.model.fields,help:odex_benefit.field_grant_benefit__membership_stop
-msgid "Date until which membership remains active."
-msgstr "تاريخ انتهاء فعالية العضوية."
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_generate_reports_log__datetime
-msgid "Datetime"
-msgstr "التاريخ والوقت"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/benefit_config.py:0
-#: code:addons/odex_benefit/models/family_members.py:0
-#, python-format
-msgid "Daughter"
-msgstr "الابنة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__reminder_date_before_receipt
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__reminder_date_before_receipt
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__reminder_date_before_receipt
-msgid "Days Before Receipt"
-msgstr "الايام قبل الاستلام"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/benefit.py:0
-#: code:addons/odex_benefit/models/family_members.py:0
-#, python-format
-msgid "Dead"
-msgstr "متوفية"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__father_dead_res_city_id
-msgid "Dead City"
-msgstr "مدينة الوفاة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__father_dead_reason
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__father_dead_reason_id
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__mother_dead_reason
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__replacement_mother_dead_reason
-msgid "Dead Reason"
-msgstr "سبب الوفاة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__father_dead_country_id
-msgid "Father Dead Country"
-msgstr "بلد وفاة الأب"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__father_job
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__father_job_id
-msgid "Father Job"
-msgstr "وظيفة الأب"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__father_id_number_type
-msgid "Father ID number"
-msgstr "نوع هوية الأب"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__mother_id_number_type
-msgid "Mother ID number type"
-msgstr "نوع هوية الأم"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__replacement_mother_id_number_type
-msgid "Replacement Mother ID number type"
-msgstr "نوع هوية الأم البديلة "
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__national_address_attachment
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__replacement_national_address_attachment
-msgid "National Address Attachment"
-msgstr "مرفق العنوان الوطني"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__request_producer_relation
-msgid "Request Producer Relation"
-msgstr "صفة مقدم الطلب"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_family_member__age_status
-msgid "Age Status"
-msgstr "حالة العمر"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__family_member__age_status__minor
-msgid "Minor"
-msgstr "قاصر"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__family_member__age_status__non_minor
-msgid "Non-Minor"
-msgstr "غير قاصر"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_family_complaints__complaints_date
-msgid "Complaints Date"
-msgstr "تاريخ الشكوى"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_family_complaints__priority
-msgid "Priority"
-msgstr "الأولوية"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_family_complaints__complaints_reason
-msgid "Complaints Reason"
-msgstr "سبب الشكوى"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_family_complaints__complaints_category_ids
-msgid "Complaints Categories"
-msgstr "تصنيفات الشكوى"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__family_complaints__state__draft
-msgid "Draft"
-msgstr "مسودة"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__family_complaints__state__receiving_complaint
-msgid "Receiving the complaint"
-msgstr "استلام الشكوى"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__family_complaints__state__review_complaint
-msgid "Review Complaint"
-msgstr "مراجعة الشكوى"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__family_complaints__state__work_in_complaint
-msgid "Work in complaint"
-msgstr "المعالجة في الشكوى"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__family_complaints__state__complaint_done
-msgid "Complaint Done"
-msgstr "تم حل الشكوى"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__family_complaints__state__refuse
-msgid "Refuse"
-msgstr "مرفوض"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_expenses__debt_reason
-msgid "Debt Reason"
-msgstr "سبب الدين"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_expenses__debt_type
-msgid "Debt Type"
-msgstr "نوع الدين"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__benefit_expenses__expenses_type__debts
-#: model:ir.model.fields.selection,name:odex_benefit.selection__expenses_line__expenses_type__debts
-msgid "Debts Expenses"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_education_status__degree
-#: model:ir.model.fields,field_description:odex_benefit.field_family_member__degree
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__degree
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__replacement_degree
-msgid "Degree"
-msgstr "الدرجة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__trust
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__trust
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__trust
-msgid "Degree of trust you have in this debtor"
-msgstr "درجة ثقتكم في هذا المدين"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__benefit_zkat__state__delivery
-#: model:ir.model.fields.selection,name:odex_benefit.selection__receive_appliances_furniture__donation_method__delivery
-msgid "Delivery"
-msgstr "التوصيل"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_appliances_furniture__delivery_date
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_food_basket__delivery_date
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_loans__delivery_date
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_zkat__delivery_date
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_food_basket__delivery_date
-msgid "Delivery Date"
-msgstr "تاريخ التوصيل"
-
-#. module: odex_benefit
-#: model:ir.model,name:odex_benefit.model_hr_department
-msgid "Department"
-msgstr "القسم"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_branch_settings__name
-msgid "Department Name"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_category__description
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_club__description
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_club_activity__description
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_family__description
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_loans__description
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_programs__description
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_needs__description
-#: model:ir.model.fields,field_description:odex_benefit.field_family_debits__description
-#: model:ir.model.fields,field_description:odex_benefit.field_food_surplus_line__description
-#: model:ir.model.fields,field_description:odex_benefit.field_generate_reports__description
-#: model:ir.model.fields,field_description:odex_benefit.field_insurance_company__description
-#: model:ir.model.fields,field_description:odex_benefit.field_insurance_type__description
-#: model:ir.model.fields,field_description:odex_benefit.field_needs_categories__description
-#: model:ir.model.fields,field_description:odex_benefit.field_other_associations__description
-#: model:ir.model.fields,field_description:odex_benefit.field_program_plane_line__description
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_appliances_furniture__description
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_food_basket__description
-#: model:ir.model.fields,field_description:odex_benefit.field_rooms_categories__description
-#: model:ir.model.fields,field_description:odex_benefit.field_rooms_items__description
-#: model:ir.model.fields,field_description:odex_benefit.field_specialization_specialization__description
-#: model:ir.model.fields,field_description:odex_benefit.field_sport_type__description
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_confirm_benefit_expense_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_confirm_benefit_expense_tree
-msgid "Description"
-msgstr "الوصف"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_service_request__description
-msgid "Description"
-msgstr "ملاحظات إضافية"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_visit_location__description
-msgid "Description"
-msgstr "اسم الزيارة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_attachments_settings__disabilities_id
-#: model:ir.model.fields,field_description:odex_benefit.field_family_member__disabilities_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_ir_attachment__disabilities_id
-#: model_terms:ir.ui.view,arch_db:odex_benefit.family_member_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Disabilities"
-msgstr "الإعاقات"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/benefit_config.py:0
-#, python-format
-msgid "Disabilities Attach"
-msgstr "مرفقات الاعاقات"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_family_member__disabilities_attachment_ids
-msgid "Disabilities Attachments"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.actions.act_window,name:odex_benefit.disabilities_settings_action
-msgid "Disabilities Settings"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__disability_accessories
-msgid "Disability Accessories"
-msgstr "مستلزمات الإعاقة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__disability_amount
-msgid "Disability Amount"
-msgstr "مصاريف الإعاقة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__disability_attach
-msgid "Disability Attach"
-msgstr "مرفق إثبات الإعاقة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__disability_type
-msgid "Disability Type"
-msgstr "نوع الإعاقة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_rent_lines__discount_rate_shared_housing
-msgid "Discount Rate For Shared housing"
-msgstr "خصم الايجار للسكن المشترك"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_member_diseases__diseases_id
-msgid "Disease"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_attachments_settings__diseases_id
-#: model:ir.model.fields,field_description:odex_benefit.field_family_member__diseases_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_ir_attachment__diseases_id
-#: model_terms:ir.ui.view,arch_db:odex_benefit.family_member_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Diseases"
-msgstr "الأمراض"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/benefit_config.py:0
-#: model:ir.model.fields,field_description:odex_benefit.field_member_diseases__disease_attach
-#, python-format
-msgid "Diseases Attach"
-msgstr "مرفقات الامراض"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_family_member__diseases_attachment_ids
-msgid "Diseases Attachments"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.actions.act_window,name:odex_benefit.diseases_settings_action
-msgid "Diseases Settings"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_expenses__diseases_type
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__diseases_type
-msgid "Diseases Type"
-msgstr "نوع المرض"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_appliances_furniture__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_appliances_furniture_need__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_associations_line__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_attachments_settings__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_behaviors__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_behaviors_type__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_category__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_cloth__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_club__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_club_activity__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_expenses__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_family__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_followers__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_food_basket__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_food_surplus__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_housing__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_housing_rooms__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_housing_rooms_items__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_loans__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_need__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_programs__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_sms_configuration__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_zkat__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_zkat_line__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_needs__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_branch_settings__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_cars_line__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_changes_requests__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_cloth_size__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_cloth_type__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_committees_line__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_confirm_benefit_expense__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_craft_skills__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_disabilities_settings__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_diseases_settings__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_divorcee_family__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_domestic_labor__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_donations_type__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_education_classroom__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_education_entities__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_education_illiterate_reason__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_education_level__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_education_result__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_entity_black_list_wizard__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_entity_refuse_reason__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_entity_refused_reason_wizard__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_exception_reason__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_exception_wizard__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_expenses_line__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_expenses_type__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_external_request__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_family_debits__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_family_member__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_family_validation_setting__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_food_basket_benefits_line__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_food_basket_line__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_food_surplus_line__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_food_surplus_type__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_generate_reports__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_generate_reports_log__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_hobbies_settings__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_home_maintenance_lines__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_hospital_hospital__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_house_need__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_housing_need__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_housing_rooms_members__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_housing_rooms_type__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_income_type__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_insurance_company__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_insurance_type__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_item_status__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_loan_giver__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_loan_reason__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_main_service__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_marital_status__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_member_disabilities__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_member_diseases__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_member_hobbies__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_member_location__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_needs_categories__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_needs_payment_line__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_other_associations__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_payment_collection_line__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_program_plane_line__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_purchase_product_loan__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_appliances_furniture__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_benefit_loans__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_benefit_zkat__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_food_basket__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_food_surplus__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_relation_settings__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_rent_lines__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_report_odex_benefit_template_generate_benefit_report_pdf__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_res_country_city__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_res_districts__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_researcher_family_wizard__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_researcher_member_wizard__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_rooms_categories__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_rooms_items__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_salary_line__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_service_attachments_settings__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_service_request__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_services_settings__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_specialization_specialization__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_sport_line__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_sport_type__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_study_material__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_survey_setting__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_suspend_reason__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_suspend_reason_wizard__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_training_inclinations__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_training_type__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_visit_location__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_visits_types__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_widow_family__display_name
-#: model:ir.model.fields,field_description:odex_benefit.field_zkat_line__display_name
-msgid "Display Name"
-msgstr "الاسم"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_external_request__street
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__district_id
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_search
-msgid "District"
-msgstr "الحي"
-
-#. module: odex_benefit
-#: model:ir.actions.act_window,name:odex_benefit.districts_action
-#: model:ir.ui.menu,name:odex_benefit.res_district_menu
-#: model_terms:ir.ui.view,arch_db:odex_benefit.districts_tree
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_districts_form
-msgid "Districts"
-msgstr "الأحياء"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/benefit.py:0
-#: code:addons/odex_benefit/models/family_members.py:0
-#, python-format
-msgid "Divorced"
-msgstr "مطلقة"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/benefit.py:0
-#: code:addons/odex_benefit/models/family_members.py:0
-#, python-format
-msgid "Divorced From Another Man"
-msgstr "مطلقة من رجل اخر"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__document_count
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__document_count
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__document_count
-msgid "Document Count"
-msgstr "عدد المستندات"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_housing__domestic_labor_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__domestic_labor_ids
-#: model_terms:ir.ui.view,arch_db:odex_benefit.domestic_labor_tree
-msgid "Domestic Labor"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_food_basket__donation_amount
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_food_basket__donation_amount
-msgid "Donation Amount"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_zkat__donation_method
-#: model:ir.model.fields,field_description:odex_benefit.field_food_basket_line__donation_method
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_appliances_furniture__donation_method
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_benefit_zkat__donation_method
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_food_basket__donation_method
-msgid "Donation Method"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_appliances_furniture__donation_number
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_appliances_furniture__donation_number
-msgid "Donation Number"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_food_basket__donation_type
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_loans__donation_type
-#: model:ir.model.fields,field_description:odex_benefit.field_food_basket_line__donation_type
-#: model:ir.model.fields,field_description:odex_benefit.field_payment_collection_line__donation_type
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_appliances_furniture__donation_type
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_benefit_loans__donation_type
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_food_basket__donation_type
-msgid "Donation Type"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__appliances_furniture__state__done
-#: model:ir.model.fields.selection,name:odex_benefit.selection__benefit_club__state__done
-#: model:ir.model.fields.selection,name:odex_benefit.selection__benefit_food_basket__state__done
-#: model:ir.model.fields.selection,name:odex_benefit.selection__benefit_loans__state__done
-#: model:ir.model.fields.selection,name:odex_benefit.selection__benefit_zkat__state__done
-#: model:ir.model.fields.selection,name:odex_benefit.selection__benefits_needs__state__done
-#: model:ir.model.fields.selection,name:odex_benefit.selection__receive_appliances_furniture__state__done
-#: model:ir.model.fields.selection,name:odex_benefit.selection__receive_benefit_loans__state__done
-#: model:ir.model.fields.selection,name:odex_benefit.selection__receive_benefit_zkat__state__done
-#: model:ir.model.fields.selection,name:odex_benefit.selection__receive_food_basket__state__done
-#: model:ir.model.fields.selection,name:odex_benefit.selection__visit_location__state__done
-#: model_terms:ir.ui.view,arch_db:odex_benefit.appliances_furniture_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.benefit_club_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.benefit_food_basket_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.benefit_receive_zkat_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.benefit_zkat_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.receive_appliances_furniture_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.receive_food_basket_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_benefits_needs_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.visits_form
-msgid "Done"
-msgstr "تمت الزيارة"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.seasonal_service_form_view
-#: model:ir.model.fields.selection,name:odex_benefit.selection__payment_orders__state__done
-#: model:ir.model.fields.selection,name:odex_benefit.selection__seasonal_service__state__done
-msgid "Done"
-msgstr "تم"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_appliances_furniture__donor_name
-msgid "Donor Name"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_food_basket_line__donor_partner
-#: model:ir.model.fields,field_description:odex_benefit.field_payment_collection_line__donor_partner
-msgid "Donor Partner"
-msgstr ""
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.receive_appliances_furniture_form
-msgid "Donor data"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_food_basket_line__name
-#: model:ir.model.fields,field_description:odex_benefit.field_payment_collection_line__donor_name
-msgid "Donor name"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__appliances_furniture__state__draft
-#: model:ir.model.fields.selection,name:odex_benefit.selection__benefit_category__state__draft
-#: model:ir.model.fields.selection,name:odex_benefit.selection__benefit_club__state__draft
-#: model:ir.model.fields.selection,name:odex_benefit.selection__benefit_expenses__state__draft
-#: model:ir.model.fields.selection,name:odex_benefit.selection__benefit_food_basket__state__draft
-#: model:ir.model.fields.selection,name:odex_benefit.selection__benefit_food_surplus__state__draft
-#: model:ir.model.fields.selection,name:odex_benefit.selection__benefit_loans__state__draft
-#: model:ir.model.fields.selection,name:odex_benefit.selection__benefit_need__state__draft
-#: model:ir.model.fields.selection,name:odex_benefit.selection__benefit_zkat__state__draft
-#: model:ir.model.fields.selection,name:odex_benefit.selection__benefit_sms_configuration__state__draft
-#: model:ir.model.fields.selection,name:odex_benefit.selection__benefits_needs__state__draft
-#: model:ir.model.fields.selection,name:odex_benefit.selection__changes_requests__state__draft
-#: model:ir.model.fields.selection,name:odex_benefit.selection__confirm_benefit_expense__state__draft
-#: model:ir.model.fields.selection,name:odex_benefit.selection__entity_black_list_wizard__state__draft
-#: model:ir.model.fields.selection,name:odex_benefit.selection__entity_refused_reason_wizard__state__draft
-#: model:ir.model.fields.selection,name:odex_benefit.selection__external_request__state__draft
-#: model:ir.model.fields.selection,name:odex_benefit.selection__family_member__state__draft
-#: model:ir.model.fields.selection,name:odex_benefit.selection__family_member__state_a__draft
-#: model:ir.model.fields.selection,name:odex_benefit.selection__receive_appliances_furniture__state__draft
-#: model:ir.model.fields.selection,name:odex_benefit.selection__receive_benefit_loans__state__draft
-#: model:ir.model.fields.selection,name:odex_benefit.selection__receive_benefit_zkat__state__draft
-#: model:ir.model.fields.selection,name:odex_benefit.selection__receive_food_basket__state__draft
-#: model:ir.model.fields.selection,name:odex_benefit.selection__receive_food_surplus__state__draft
-#: model:ir.model.fields.selection,name:odex_benefit.selection__service_request__state__draft
-#: model:ir.model.fields.selection,name:odex_benefit.selection__visit_location__state__draft
-#: model_terms:ir.ui.view,arch_db:odex_benefit.service_request_search
-msgid "Draft"
-msgstr "مسودة"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__grant_benefit__state__draft
-msgid "Draft"
-msgstr "بانتظار الاسرة"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__benefit_sms_configuration__state__edit_info
-#: model:ir.model.fields.selection,name:odex_benefit.selection__family_member__action_type__edit_info
-#: model:ir.model.fields.selection,name:odex_benefit.selection__grant_benefit__action_type__edit_info
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Edit Information"
-msgstr "تحرير البيانات"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.family_member_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Education"
-msgstr "التعليم"
-
-#. module: odex_benefit
-#: model:ir.actions.act_window,name:odex_benefit.education_classroom_action
-#: model:ir.ui.menu,name:odex_benefit.education_classroom_menu
-#: model_terms:ir.ui.view,arch_db:odex_benefit.education_classroom_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.education_classroom_tree
-msgid "Education Classroom"
-msgstr "الصفوف الدراسية"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_education_status__education_end_date
-#: model:ir.model.fields,field_description:odex_benefit.field_family_member__education_end_date
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__education_end_date
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__replacement_education_end_date
-msgid "Education End Date"
-msgstr "تاريخ نهاية المرحلة التعليمية"
-
-#. module: odex_benefit
-#: model:ir.actions.act_window,name:odex_benefit.education_entities_action
-#: model:ir.model.fields,field_description:odex_benefit.field_education_period__education_entity_ids
-#: model:ir.ui.menu,name:odex_benefit.education_entities_menu
-#: model_terms:ir.ui.view,arch_db:odex_benefit.education_entities_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.education_entities_tree
-msgid "Education Entities"
-msgstr "الجهات التعليمية"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_education_status__education_entity
-#: model:ir.model.fields,field_description:odex_benefit.field_family_member__education_entity
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__education_entity
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__replacement_education_entity
-msgid "Education Entity"
-msgstr "نوع الجهة التعليمية"
-
-#. module: odex_benefit
-#: model:ir.actions.act_window,name:odex_benefit.education_illiterate_reason_action
-#: model:ir.model,name:odex_benefit.model_education_illiterate_reason
-#: model:ir.ui.menu,name:odex_benefit.illiterate_reason_menu
-msgid "Education Illiterate Reason"
-msgstr "أسباب انقطاع التعليم"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__education_institution
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__education_institution
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__education_institution
-msgid "Education Institution"
-msgstr "اسم الجهة التعليمية"
-
-#. module: odex_benefit
-#: model:ir.actions.act_window,name:odex_benefit.education_level_action
-#: model:ir.model.fields,field_description:odex_benefit.field_education_classroom__education_level_id
-#: model:ir.model.fields,field_description:odex_benefit.field_education_entities__education_level_id
-#: model:ir.ui.menu,name:odex_benefit.education_level_menu
-#: model_terms:ir.ui.view,arch_db:odex_benefit.education_level_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.education_level_tree
-msgid "Education Level"
-msgstr "المراحل التعليمية"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_education_period__education_level_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_education_status__education_levels
-#: model:ir.model.fields,field_description:odex_benefit.field_family_member__education_levels
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__education_levels
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__replacement_education_levels
-msgid "Education Levels"
-msgstr "المرحلة التعليمية"
-
-#. module: odex_benefit
-#: model:ir.actions.act_window,name:odex_benefit.education_result_action
-#: model:ir.ui.menu,name:odex_benefit.education_result_menu
-#: model_terms:ir.ui.view,arch_db:odex_benefit.education_result_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.education_result_tree
-msgid "Education Result"
-msgstr "الدرجات التعليمية"
-
-#. module: odex_benefit
-#: model:ir.ui.menu,name:odex_benefit.education_main_menu
-msgid "Education Settings"
-msgstr "إعدادات التعليم"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_education_status__education_start_date
-#: model:ir.model.fields,field_description:odex_benefit.field_family_member__education_start_date
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__education_start_date
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__replacement_education_start_date
-msgid "Education Start Date"
-msgstr "تاريخ بداية المرحلة التعليمية"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_education_status__education_status
-#: model:ir.model.fields,field_description:odex_benefit.field_family_member__education_status
-#: model:ir.model.fields,field_description:odex_benefit.field_generate_reports__case_study
-#: model:ir.model.fields,field_description:odex_benefit.field_generate_reports__education_status
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__education_status
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__graduation_status
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__replacement_education_status
-#: model:ir.model.fields,field_description:odex_benefit.field_ir_attachment__education_status_id
-#: model:ir.model.fields,field_description:odex_benefit.field_mrp_document__education_status_id
-#: model:ir.model.fields,field_description:odex_benefit.field_weak_course__education_status_id
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Education Status"
-msgstr "الحالة التعليمية"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_education_status__education_status_type
-msgid "Education Status Type"
-msgstr "نوع الحالة التعليمية"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_education_status__educational_certificate
-#: model:ir.model.fields,field_description:odex_benefit.field_family_member__educational_certificate
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__educational_certificate
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__replacement_educational_certificate
-msgid "Educational Certificate"
-msgstr "الشهادة التعليمية"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__benefit_expenses__expenses_type__educational
-#: model:ir.model.fields.selection,name:odex_benefit.selection__expenses_line__expenses_type__educational
-msgid "Educational Expenses"
-msgstr "مصاريف التعليم"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__educational_institution_information
-msgid "Educational institution information"
-msgstr "اسم الجهة التعليمية"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__education_level
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__education_level
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__education_level
-msgid "Educational level"
-msgstr "المرحلة التعليمية"
-
-#. module: odex_benefit
-#: model:ir.model.fields,help:odex_benefit.field_benefits_representative__partner_share
-#: model:ir.model.fields,help:odex_benefit.field_external_benefits__partner_share
-#: model:ir.model.fields,help:odex_benefit.field_grant_benefit__partner_share
-msgid ""
-"Either customer (not a user), either shared user. Indicated the current "
-"partner is a customer without access or with a limited access created for "
-"sharing data."
-msgstr ""
-"إما العميل (ليس مستخدماً)، إما مستخدم مشتَرَك. يشير إلى أن الشريك الحالي هو "
-"عميل بلا صلاحيات وصول أو مع صلاحيات وصول محدودة، تم إنشاؤها لمشاركة "
-"البيانات. "
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__electricity_attach
-msgid "Electricity Attach"
-msgstr "مرفق فاتورة الكهرباء"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_housing__electricity_bill_account_attach
-msgid "Electricity Bill "
-msgstr "فواتير الكهرباء"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_housing__electricity_bill_account_number
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__electricity_bill_account_number
-msgid "Electricity Bill Account Number"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__email
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__email
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__email
-#: model:ir.model.fields.selection,name:odex_benefit.selection__grant_benefit__contact_type__email
-msgid "Email"
-msgstr "البريد الإلكتروني"
-
-#. module: odex_benefit
-#: model:ir.actions.act_window,name:odex_benefit.email_list_action
-#: model:ir.ui.menu,name:odex_benefit.email_menu
-msgid "Email Template"
-msgstr "قالب البريد الإلكتروني"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__main_service__services__emergency_services
-msgid "Emergency Services"
-msgstr "خدمات طارئة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__employee
-#: model:ir.model.fields,field_description:odex_benefit.field_committees_line__employee_id
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__employee
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__employee
-msgid "Employee"
-msgstr "الموظف"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_family_member__end_date
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__end_date
-msgid "End Date"
-msgstr "تاريخ النهاية"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/controllers/benefit.py:0
-#, python-format
-msgid "Enter Id Number"
-msgstr ""
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/controllers/benefit.py:0
-#: code:addons/odex_benefit/controllers/benefit_services.py:0
-#, python-format
-msgid "Enter The "
-msgstr ""
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/controllers/benefit.py:0
-#, python-format
-msgid "Enter Your Residential unit Number"
-msgstr ""
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/benefit.py:0
-#: code:addons/odex_benefit/models/family_members.py:0
-#, python-format
-msgid "Enter a valid Saudi mobile number"
-msgstr "برجاء إدخال رقم سعودي صحيح"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/wizards/entity_black_list_wizard.py:0
-#: model:ir.model.fields,field_description:odex_benefit.field_education_status__entities
-#: model:ir.model.fields,field_description:odex_benefit.field_entity_black_list_wizard__entity_id
-#: model:ir.model.fields,field_description:odex_benefit.field_exception_wizard__entity_id
-#: model:ir.model.fields,field_description:odex_benefit.field_family_member__entities
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__entities
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__replacement_entities
-#: model:ir.model.fields,field_description:odex_benefit.field_suspend_reason_wizard__entity_id
-#, python-format
-msgid "Entity"
-msgstr "اسم الجهة التعليمية"
-
-#. module: odex_benefit
-#: model:ir.model,name:odex_benefit.model_entity_black_list_wizard
-msgid "Entity Black List Wizard"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_zkat__entry_id
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_benefit_zkat__entry_id
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_food_basket__entry_id
-msgid "Entry"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__benefit_expenses__trans_type__especially
-msgid "Especially"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_service_request__estimated_rent_amount
-msgid "Estimated Rent Amount"
-msgstr "قيمة الإيجار المقدرة من الجمعية"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__estimated_rent_amount
-msgid "Estimated Rent Amount"
-msgstr "القيمة التقديرية للإيجار"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_rent_lines__estimated_rent_branches
-msgid "Estimated Rent Branches"
-msgstr "الإيجار المتوقع لفروع الرياض"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_rent_lines__estimated_rent_governorate
-msgid "Estimated Rent Governorate"
-msgstr "الإيجار المتوقع لفروع المحافظات"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_education_result__evaluation
-msgid "Evaluation"
-msgstr "نتائج التقييم العقاري"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_visit_location__evaluation
-msgid "Evaluation"
-msgstr "التقييم"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__benefit_housing__housing_cat__excellent
-#: model:ir.model.fields.selection,name:odex_benefit.selection__grant_benefit__housing_cat__excellent
-msgid "Excellent"
-msgstr "ممتاز"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__main_service__service_type__exception
-#: model_terms:ir.ui.view,arch_db:odex_benefit.family_member_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Exception"
-msgstr "استثنائية"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__grant_benefit__action_type__exception
-#: model:ir.model.fields.selection,name:odex_benefit.selection__family_member__action_type__exception
-#: model:ir.model.fields,field_description:odex_benefit.field_service_request__exception
-msgid "Exception"
-msgstr "استثناء"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_exception_wizard__exception_attachment
-#: model:ir.model.fields,field_description:odex_benefit.field_family_member__exception_attachment
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__exception_attachment
-#: model:ir.model.fields,field_description:odex_benefit.field_service_request__exception_attach
-msgid "Exception Attachment"
-msgstr "مرفق الاستثناء"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_exception_wizard__exception_description
-#: model:ir.model.fields,field_description:odex_benefit.field_family_member__exception_description
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__exception_description
-msgid "Exception Description"
-msgstr "وصف الاستثناء"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_exception_wizard__exception_end_date
-#: model:ir.model.fields,field_description:odex_benefit.field_family_member__exception_end_date
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__exception_end_date
-msgid "Exception End Date"
-msgstr "تاريخ نهاية الاستثناء"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.family_member_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Exception Final Approve"
-msgstr "اعتماد المدير العام للاستثناء"
-
-#. module: odex_benefit
-#: model:ir.actions.act_window,name:odex_benefit.exception_reason_action
-#: model:ir.model.fields,field_description:odex_benefit.field_exception_wizard__exception_reason
-#: model:ir.model.fields,field_description:odex_benefit.field_family_member__exception_reason
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__exception_reason
-#: model:ir.ui.menu,name:odex_benefit.exception_reason_menu
-msgid "Exception Reason"
-msgstr "سبب الاستثناء"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.family_member_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Exception Refuse"
-msgstr "رفض الاستثناء"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__family_member__state__exception_second_approve
-#: model:ir.model.fields.selection,name:odex_benefit.selection__family_member__state_a__exception_second_approve
-#: model:ir.model.fields.selection,name:odex_benefit.selection__grant_benefit__state__exception_second_approve
-#: model:ir.model.fields.selection,name:odex_benefit.selection__payment_orders__state__waiting_gm
-#: model_terms:ir.ui.view,arch_db:odex_benefit.family_member_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Waiting for General Manager"
-msgstr "بانتظار المدير العام"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_exception_wizard__exception_start_date
-#: model:ir.model.fields,field_description:odex_benefit.field_family_member__exception_start_date
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__exception_start_date
-msgid "Exception Start Date"
-msgstr "تاريخ بداية الاستثناء"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_exception_wizard__exception_type
-#: model:ir.model.fields,field_description:odex_benefit.field_family_member__exception_type
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__exception_type
-msgid "Exception Type"
-msgstr "نوع الاستثناء"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/benefit.py:0
-#: code:addons/odex_benefit/models/family_members.py:0
-#: model:ir.model,name:odex_benefit.model_exception_wizard
-#, python-format
-msgid "Exception Wizard"
-msgstr "الاستثناء من ايقاف الخدمة"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Exception from suspension"
-msgstr "الاستثناء من الإيقاف"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_family_validation_setting__exceptional_age_has_disabilities
-msgid "Exceptional Age Has Disabilities"
-msgstr "حد عمر الاستفاد للمعاق"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_family_validation_setting__exceptional_age_medical_specialty
-msgid "Exceptional Age Medical Specialty"
-msgstr "حد عمر الاستفاد للتخصصات الطبية"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_family_validation_setting__exceptional_age_scientific_specialty
-msgid "Exceptional Age Scientific Specialty"
-msgstr "حد عمر الاستفاد للتخصصات العلمية"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__main_service__services__exceptional_services
-msgid "Exceptional Services"
-msgstr "خدمات استثنائية"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_family_member__is_excluded_suspension
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__is_excluded_suspension
-msgid "Excluded from suspension?"
-msgstr "مستثنى من إيقاف الخدمة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_category__expenses_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_need__expenses_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__expenses_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__expenses_total
-#: model_terms:ir.ui.view,arch_db:odex_benefit.expenses_line_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Expenses"
-msgstr "الالتزامات"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_electrical_devices__account_id
-#: model:ir.model.fields,field_description:odex_benefit.field_family_validation_setting__account_id
-#: model:ir.model.fields,field_description:odex_benefit.field_service_request__account_id
-#: model:ir.model.fields,field_description:odex_benefit.field_service_request__device_account_id
-#: model:ir.model.fields,field_description:odex_benefit.field_services_settings__account_id
-#: model:ir.model.fields,field_description:odex_benefit.field_transportation_insurance__account_id
-msgid "Expenses Account"
-msgstr "حساب المصروف"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__expenses_request_ids
-msgid "Expenses Request"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.actions.act_window,name:odex_benefit.expenses_type_action
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_expenses__expenses_type
-#: model:ir.model.fields,field_description:odex_benefit.field_expenses_line__expenses_type
-#: model:ir.ui.menu,name:odex_benefit.expenses_type_menu
-msgid "Expenses Type"
-msgstr "أنواع الالتزامات"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_expenses_line__expenses_type_custom
-msgid "Expenses Type Custom"
-msgstr "أنواع الالتزامات"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__main_service__services__experimental_services
-msgid "Experimental Services"
-msgstr "خدمات تجريبية"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_ir_attachment__expiration_date
-#: model:ir.model.fields,field_description:odex_benefit.field_member_disabilities__expiration_date
-#: model:ir.model.fields,field_description:odex_benefit.field_member_diseases__expiration_date
-#: model:ir.model.fields,field_description:odex_benefit.field_member_hobbies__expiration_date
-msgid "Expiration date"
-msgstr "تاريخ انتهاء صلاحية الملف"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__ir_attachment__attach_status__expired
-#: model:ir.model.fields.selection,name:odex_benefit.selection__member_disabilities__attach_status__expired
-#: model:ir.model.fields.selection,name:odex_benefit.selection__member_diseases__attach_status__expired
-#: model:ir.model.fields.selection,name:odex_benefit.selection__member_hobbies__attach_status__expired
-msgid "Expired"
-msgstr "منتهي"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_club__external_ids
-msgid "External"
-msgstr "خارجية"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_external_request__external_id
-#: model_terms:ir.ui.view,arch_db:odex_benefit.external_benefit_view_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.external_benefit_view_tree
-msgid "External Benefit"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__extra_code
-msgid "Extra Code"
-msgstr "الرمز الإضافي"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_zkat__external_ids
-msgid "External Benefits"
-msgstr ""
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/Services/benefit_club.py:0
-#: code:addons/odex_benefit/models/Services/benefit_zkat_alfter.py:0
-#: model:ir.model,name:odex_benefit.model_external_request
-#, python-format
-msgid "External Request"
-msgstr "طلبات المستفيدين الخارجين"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.benefit_club_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.benefit_zkat_form
-msgid "External benefit"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_needs__f_amount
-msgid "F Amount"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__family_member__required_attach__false
-#: model:ir.model.fields.selection,name:odex_benefit.selection__grant_benefit__income_required_attach__false
-#: model:ir.model.fields.selection,name:odex_benefit.selection__grant_benefit__required_attach__false
-msgid "False"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_confirm_benefit_expense__family_ids
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_confirm_benefit_expense_form
-msgid "Families"
-msgstr "الاسر المستفيدة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_expense_line__family_id
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_loans__family_id
-#: model:ir.model.fields,field_description:odex_benefit.field_changes_requests__benefit_id
-#: model:ir.model.fields,field_description:odex_benefit.field_generate_reports__family_id
-#: model:ir.model.fields,field_description:odex_benefit.field_service_request__family_id
-#: model:ir.model.fields,field_description:odex_benefit.field_visit_location__family_id
-#: model:ir.model.fields,field_description:odex_benefit.field_zkat_line__family_id
-#: model:ir.model.fields.selection,name:odex_benefit.selection__services_settings__benefit_type__family
-#: model:ir.model.fields.selection,name:odex_benefit.selection__generate_reports__service_to__family
-#: model:ir.model.fields.selection,name:odex_benefit.selection__service_request__benefit_type__family
-#: model:ir.model.fields.selection,name:odex_benefit.selection__visit_location__benefit_type__family
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_confirm_benefit_expense_form
-msgid "Family"
-msgstr "الأسرة"
-
-#. module: odex_benefit
-#: model:ir.model,name:odex_benefit.model_family_debits
-msgid "Family - Debits"
-msgstr ""
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_grant_benefit_activity
-msgid "Family Activity"
-msgstr ""
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/benefit_config.py:0
-#, python-format
-msgid "Family Attach"
-msgstr "مرفقات الاسرة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__family_bank
-msgid "Family Bank"
-msgstr "الحساب البنكي للأسرة"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Family Cars"
-msgstr "سيارات الأسرة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_service_request__family_category
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_search
-msgid "Family Category"
-msgstr "فئة الأسرة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_account_move_line__family_code
-msgid "Family Code"
-msgstr ""
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.visits_form
-msgid "Family Contact"
-msgstr "التواصل مع الاسرة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__family_debits_ids
-msgid "Family Debits"
-msgstr "ديون الأسرة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_confirm_benefit_expense__family_domain_ids
-msgid "Family Domain"
-msgstr ""
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/family_expense.py:0
-#: code:addons/odex_benefit/wizards/family_expense_move_wiz.py:0
-#, python-format
-msgid "Family Expense - %s"
-msgstr "مصروف الأسرة الشهري - %s"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Family Loans"
-msgstr "ديون الأسرة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_family_member_exam__member_id
-#: model_terms:ir.ui.view,arch_db:odex_benefit.family_member_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Family Member"
-msgstr "الفرد"
-
-#. module: odex_benefit
-#: model:ir.actions.act_window,name:odex_benefit.family_member_action
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_housing_rooms__family_members
-#: model:ir.model.fields,field_description:odex_benefit.field_seasonal_service__member_ids
-#: model:ir.ui.menu,name:odex_benefit.family_member_main_menu
-#: model:ir.ui.menu,name:odex_benefit.family_member_menu
-#: model_terms:ir.ui.view,arch_db:odex_benefit.family_member_tree
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Family Members"
-msgstr "أفراد الأسر"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_expense_line__family_monthly_clotting
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__family_monthly_clotting
-msgid "Family Monthly Clotting"
-msgstr "مصروف الكساء للأسرة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_expense_line__family_monthly_income
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__family_monthly_income
-msgid "Family Monthly Income"
-msgstr "المصروف النقدي للأسرة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_expense_line__family_monthly_meals
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__family_monthly_meals
-msgid "Family Monthly Meals"
-msgstr "مصروف الغذاء للأسرة"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Family Monthly salary"
-msgstr "التغذية الشهرية للأسرة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__family_name
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__family_name
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__family_name
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Family Name"
-msgstr "اسم الأسرة"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.family_member_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Member Name"
-msgstr "اسم الفرد"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_generate_reports__family_need_ids
-msgid "Family Need"
-msgstr "احتياج الاسرة"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.services_settings_form
-msgid "Family Rent Service Settings"
-msgstr "اعدادات خدمة الايجار للأسر"
-
-#. module: odex_benefit
-#: model:ir.actions.act_window,name:odex_benefit.family_validation_action
-#: model:ir.ui.menu,name:odex_benefit.family_validation_location
-#: model_terms:ir.ui.view,arch_db:odex_benefit.family_validation_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.family_validation_tree
-msgid "Family Validation Setting"
-msgstr "إعدادات تحقق الأسر"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_visit_location__benefit_id
-msgid "Family file"
-msgstr "ملف الأسرة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_generate_reports__fat
-msgid "Fat"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__grant_benefit__responsible__father
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Father"
-msgstr "بيانات الأب"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__father_dead_certificate
-msgid "Father Dead Certificate"
-msgstr "شهادة وفاة الأب"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__father_dead_date
-msgid "Father Dead Date"
-msgstr "تاريخ وفاة الأب"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/benefit.py:0
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__father_family_name
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__father_family_name
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__father_family_name
-#, python-format
-msgid "Father Family Name"
-msgstr "اسم عائلة الأب"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/benefit.py:0
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__father_name
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__father_name
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__father_name
-#, python-format
-msgid "Father First Name"
-msgstr "الاسم الاول للأب"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Father Information"
-msgstr "بيانات الأب"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__father_country_id
-msgid "Father Nationality"
-msgstr "جنسية الأب"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/benefit.py:0
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__father_second_name
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__father_second_name
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__father_second_name
-#, python-format
-msgid "Father Second Name"
-msgstr "الاسم الثاني للأب"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/benefit.py:0
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__father_third_name
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__father_third_name
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__father_third_name
-#, python-format
-msgid "Father Third Name"
-msgstr "الاسم الثالث للأب"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__grant_benefit__orphan_status__father
-msgid "Father-Orphan"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_expenses__expenses_fees_type
-msgid "Fees Type"
-msgstr "انواع المصاريف"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/benefit_config.py:0
-#: model:ir.model.fields.selection,name:odex_benefit.selection__changes_requests__team_type__female
-#: model:ir.model.fields.selection,name:odex_benefit.selection__family_member__gender__female
-#, python-format
-msgid "Female"
-msgstr "أنثى"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_family_validation_setting__female_benefit_age
-msgid "Female Benefit Age"
-msgstr "حد عمر الاستفاد للإناث"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__rooms_categories__gender__female
-msgid "Female only"
-msgstr ""
-
-#. module: odex_benefit
-#: model:ir.model.fields,help:odex_benefit.field_benefits_representative__phone_sanitized
-#: model:ir.model.fields,help:odex_benefit.field_external_benefits__phone_sanitized
-#: model:ir.model.fields,help:odex_benefit.field_grant_benefit__phone_sanitized
-msgid ""
-"Field used to store sanitized phone number. Helps speeding up searches and "
-"comparisons."
-msgstr ""
-"حقل مُستخدَم لتخزين أرقام الهواتف السليمة، مما يساعد على تسريع عمليات البحث "
-"والمقارنات. "
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.family_member_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "File content"
-msgstr "محتوى الملف"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__final_refusal_reason
-msgid "Final Refusal Reason"
-msgstr "سبب الرفض النهائي"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Final Refuse"
-msgstr "الرفض النهائي"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__final_refuse_date
-msgid "Final Refuse Date"
-msgstr "تاريخ الرفض النهائي"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_housing__financial_aid
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_need__financial_aid
-msgid "Financial Aid"
-msgstr ""
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Finish Complete"
-msgstr "انهاء اكمال البيانات"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "First Accept"
-msgstr "اعتماد رئيس العمليات"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.family_member_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.service_request_search
-msgid "First Approve"
-msgstr "اعتماد رئيس العمليات الإيقاف"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__family_member__state__first_approve
-#: model:ir.model.fields.selection,name:odex_benefit.selection__family_member__state_a__first_approve
-msgid "First Approved"
-msgstr "الاعتماد المبدئي"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__first_name
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__first_name
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__first_name
-#: model_terms:ir.ui.view,arch_db:odex_benefit.family_member_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "First Name"
-msgstr "الاسم الاول"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__benefit_sms_configuration__state__first_refusal
-#: model:ir.model.fields.selection,name:odex_benefit.selection__entity_black_list_wizard__state__first_refusal
-#: model:ir.model.fields.selection,name:odex_benefit.selection__entity_refused_reason_wizard__state__first_refusal
-#: model:ir.model.fields.selection,name:odex_benefit.selection__family_member__state__first_refusal
-#: model:ir.model.fields.selection,name:odex_benefit.selection__family_member__state_a__first_refusal
-#: model:ir.model.fields.selection,name:odex_benefit.selection__grant_benefit__state__first_refusal
-msgid "First Refusal"
-msgstr "الرفض المبدئي"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__first_refusal_reason
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "First Refusal Reason"
-msgstr "سبب الرفض المبدئي"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "First Refuse"
-msgstr "الرفض المبدئي"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__first_refuse_date
-msgid "First Refuse Date"
-msgstr "تاريخ الرفض المبدئي"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__property_account_position_id
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__property_account_position_id
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__property_account_position_id
-msgid "Fiscal Position"
-msgstr "الموقف الضريبي"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__benefit_expenses__expenses_fees_type__fixed
-msgid "Fixed"
-msgstr "ثابتة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_appliances_furniture__message_follower_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_appliances_furniture_need__message_follower_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_club__message_follower_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_followers__message_follower_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_food_basket__message_follower_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_food_surplus__message_follower_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_housing__message_follower_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_loans__message_follower_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_need__message_follower_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_sms_configuration__message_follower_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_zkat__message_follower_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_needs__message_follower_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__message_follower_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_changes_requests__message_follower_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_confirm_benefit_expense__message_follower_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__message_follower_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_family_member__message_follower_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__message_follower_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_needs_categories__message_follower_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_needs_payment_line__message_follower_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_appliances_furniture__message_follower_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_benefit_loans__message_follower_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_benefit_zkat__message_follower_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_food_basket__message_follower_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_food_surplus__message_follower_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_service_request__message_follower_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_visit_location__message_follower_ids
-msgid "Followers"
-msgstr "المتابعون"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_appliances_furniture__message_channel_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_appliances_furniture_need__message_channel_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_club__message_channel_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_followers__message_channel_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_food_basket__message_channel_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_food_surplus__message_channel_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_housing__message_channel_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_loans__message_channel_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_need__message_channel_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_sms_configuration__message_channel_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_zkat__message_channel_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_needs__message_channel_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__message_channel_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_changes_requests__message_channel_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_confirm_benefit_expense__message_channel_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__message_channel_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_family_member__message_channel_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__message_channel_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_needs_categories__message_channel_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_needs_payment_line__message_channel_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_appliances_furniture__message_channel_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_benefit_loans__message_channel_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_benefit_zkat__message_channel_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_food_basket__message_channel_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_food_surplus__message_channel_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_service_request__message_channel_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_visit_location__message_channel_ids
-msgid "Followers (Channels)"
-msgstr "المتابعون (القنوات)"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_appliances_furniture__message_partner_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_appliances_furniture_need__message_partner_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_club__message_partner_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_followers__message_partner_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_food_basket__message_partner_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_food_surplus__message_partner_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_housing__message_partner_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_loans__message_partner_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_need__message_partner_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_sms_configuration__message_partner_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_zkat__message_partner_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_needs__message_partner_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__message_partner_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_changes_requests__message_partner_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_confirm_benefit_expense__message_partner_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__message_partner_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_family_member__message_partner_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__message_partner_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_needs_categories__message_partner_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_needs_payment_line__message_partner_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_appliances_furniture__message_partner_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_benefit_loans__message_partner_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_benefit_zkat__message_partner_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_food_basket__message_partner_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_receive_food_surplus__message_partner_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_service_request__message_partner_ids
-#: model:ir.model.fields,field_description:odex_benefit.field_visit_location__message_partner_ids
-msgid "Followers (Partners)"
-msgstr "المتابعون (الشركاء)"
-
-#. module: odex_benefit
-#: model:ir.model.fields,help:odex_benefit.field_appliances_furniture__activity_type_icon
-#: model:ir.model.fields,help:odex_benefit.field_appliances_furniture_need__activity_type_icon
-#: model:ir.model.fields,help:odex_benefit.field_benefit_club__activity_type_icon
-#: model:ir.model.fields,help:odex_benefit.field_benefit_followers__activity_type_icon
-#: model:ir.model.fields,help:odex_benefit.field_benefit_food_basket__activity_type_icon
-#: model:ir.model.fields,help:odex_benefit.field_benefit_food_surplus__activity_type_icon
-#: model:ir.model.fields,help:odex_benefit.field_benefit_housing__activity_type_icon
-#: model:ir.model.fields,help:odex_benefit.field_benefit_loans__activity_type_icon
-#: model:ir.model.fields,help:odex_benefit.field_benefit_need__activity_type_icon
-#: model:ir.model.fields,help:odex_benefit.field_benefit_sms_configuration__activity_type_icon
-#: model:ir.model.fields,help:odex_benefit.field_benefit_zkat__activity_type_icon
-#: model:ir.model.fields,help:odex_benefit.field_benefits_needs__activity_type_icon
-#: model:ir.model.fields,help:odex_benefit.field_benefits_representative__activity_type_icon
-#: model:ir.model.fields,help:odex_benefit.field_changes_requests__activity_type_icon
-#: model:ir.model.fields,help:odex_benefit.field_confirm_benefit_expense__activity_type_icon
-#: model:ir.model.fields,help:odex_benefit.field_external_benefits__activity_type_icon
-#: model:ir.model.fields,help:odex_benefit.field_family_member__activity_type_icon
-#: model:ir.model.fields,help:odex_benefit.field_grant_benefit__activity_type_icon
-#: model:ir.model.fields,help:odex_benefit.field_needs_categories__activity_type_icon
-#: model:ir.model.fields,help:odex_benefit.field_needs_payment_line__activity_type_icon
-#: model:ir.model.fields,help:odex_benefit.field_receive_appliances_furniture__activity_type_icon
-#: model:ir.model.fields,help:odex_benefit.field_receive_benefit_loans__activity_type_icon
-#: model:ir.model.fields,help:odex_benefit.field_receive_benefit_zkat__activity_type_icon
-#: model:ir.model.fields,help:odex_benefit.field_receive_food_basket__activity_type_icon
-#: model:ir.model.fields,help:odex_benefit.field_receive_food_surplus__activity_type_icon
-#: model:ir.model.fields,help:odex_benefit.field_service_request__activity_type_icon
-#: model:ir.model.fields,help:odex_benefit.field_visit_location__activity_type_icon
-msgid "Font awesome icon e.g. fa-tasks"
-msgstr "رمز الخط الرائع ، على سبيل المثال FA- المهام"
-
-#. module: odex_benefit
-#: model:ir.actions.act_window,name:odex_benefit.benefit_food_basket_action
-#: model:ir.model.fields,field_description:odex_benefit.field_food_basket_line__food_basket_id
-#: model_terms:ir.ui.view,arch_db:odex_benefit.benefit_food_basket_form
-msgid "Food Basket"
-msgstr "هل الأسرة بحاجة إلى الأضحية؟"
-
-#. module: odex_benefit
-#: model:ir.actions.act_window,name:odex_benefit.benefit_food_surplus_action
-#: model:ir.model,name:odex_benefit.model_benefit_food_surplus
-#: model:ir.model,name:odex_benefit.model_food_surplus_line
-#: model:ir.model,name:odex_benefit.model_food_surplus_type
-#: model:ir.model.fields,field_description:odex_benefit.field_food_surplus_line__food_surplus_id
-#: model_terms:ir.ui.view,arch_db:odex_benefit.benefit_food_surplus_form
-msgid "Food Surplus"
-msgstr "فائض الطعام"
-
-#. module: odex_benefit
-#: model:ir.actions.act_window,name:odex_benefit.food_surplus_type_action
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__food_surplus_type
-#: model_terms:ir.ui.view,arch_db:odex_benefit.food_surplus_type_tree
-msgid "Food Surplus Type"
-msgstr "نوع فائض الطعام"
-
-#. module: odex_benefit
-#: model:ir.model.fields,help:odex_benefit.field_benefits_representative__email_formatted
-#: model:ir.model.fields,help:odex_benefit.field_external_benefits__email_formatted
-#: model:ir.model.fields,help:odex_benefit.field_grant_benefit__email_formatted
-msgid "Format email address \"Name \n"
-" \n"
-" \n"
-" \n"
-" \n"
-"
\n"
-" \n"
-" \n"
-" \n"
-" \n"
-" \n"
-" \n"
-"
\n"
-" \n"
-" \n"
-" \n"
-"
\n"
-" \n"
-" \n"
-"
\n"
-" \n"
-" \n"
-" \n"
-" \n"
-" \n"
-" \n"
-"
\n"
-" \n"
-" \n"
-"
\n"
-" to family ${(object.benefit_id.name)}\n"
-" in this location\n"
-" \n"
-" ${object.get_url_local()}\n"
-" \n"
-"
\n"
-" \n"
-" \n"
-"
\n"
-" \n"
-" \n"
-" \n"
-" \n"
-" \n"
-" \n"
-"
\n"
-" \n"
-" \n"
-" ${object.create_uid.company_id.name}\n"
-" \n"
-" \n"
-" ${object.create_uid.company_id.phone}\n"
-" % if object.create_uid.company_id.email\n"
-" | ${object.create_uid.company_id.email}\n"
-" % endif\n"
-" % if object.create_uid.company_id.website\n"
-" | \n"
-" ${object.create_uid.company_id.website}\n"
-" \n"
-" % endif\n"
-" \n"
-"
\n"
-" "
-msgstr ""
-"\n"
-" \n"
-" \n"
-" \n"
-" \n"
-"
\n"
-" \n"
-" \n"
-" \n"
-" \n"
-" \n"
-"
\n"
-"
\n"
-" \n"
-"
\n"
-
-#. module: odex_benefit
-#: model:mail.template,subject:odex_benefit.visit_notification_template
-msgid "${object.benefit_id.name or 'New Visit Assigned'}"
-msgstr "${object.benefit_id.name or 'تم تعيين زيارة جديدة'}"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Return to Waiting Approval"
-msgstr "إرجاع إلى انتظار الموافقة"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Are you sure you want to return this record to Waiting Approval?"
-msgstr "هل أنت متأكد أنك تريد إرجاع هذا السجل إلى حالة انتظار الموافقة؟"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Set To for Researcher"
-msgstr "إرجاع للاخصائي"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Are you sure you want to set the state to Waiting for Researcher?"
-msgstr "هل أنت متأكد أنك تريد الإرجاع للاخصائي؟"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/benefit.py:0
-#: model:ir.model,name:odex_benefit.model_entity_return_reason_wizard
-#: model:ir.model,name:odex_benefit.model_return_reason_wizard
-#, python-format
-msgid "Return Reason Wizard"
-msgstr "سبب الإرجاع"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_entity_return_reason_wizard__suspend_reason_id
-#: model:ir.model.fields,field_description:odex_benefit.field_suspend_reason__is_return_reason
-#: model:ir.model.fields,field_description:odex_benefit.field_return_reason_wizard__return_reason_id
-msgid "Return Reason"
-msgstr "سبب الإرجاع"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_benefit_expense_line__return_reason_id
-#: model:ir.model.fields,field_description:odex_benefit.field_service_request__return_reason_id
-msgid "Return Reason"
-msgstr "سبب إرجاع البنك"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_entity_return_reason_wizard_form
-msgid "Retrun"
-msgstr "إرجاع"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/res_users.py:0
-#, python-format
-msgid ""
-"Failed to delete this partner after the related user was "
-"removed.\n"
-" \n"
-"\n"
-" \n"
-" \n"
-"
\n"
-" \n"
-" \n"
-" \n"
-" \n"
-" \n"
-"
\n"
-"
\n"
-"
Reason: %s"
-msgstr "فشل في حذف هذا الشريك بعد حذف المستخدم المرتبط به.
السبب: %s"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/res_users.py:0
-#, python-format
-msgid "Cannot delete user '%s': linked to Benefits - Profiles %s"
-msgstr "لا يمكن حذف المستخدم '%s': مرتبط بملفات المستفيدين %s"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/benefit.py:0
-#, python-format
-msgid "Cannot delete user '%s': still linked to other benefit profiles."
-msgstr "لا يمكن حذف المستخدم '%s': لا يزال مرتبطًا بملفات مستفيدين أخرى."
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/res_partner.py:0
-#, python-format
-msgid "Cannot delete partner '%s': linked to Benefits - Profiles %s"
-msgstr "لا يمكن حذف الشريك '%s': مرتبط بملفات مستفيدين %s"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/res_users.py:0
-#, python-format
-msgid "Failed to delete partner '%s' (ID: %s) after user removal. Reason: %s"
-msgstr "فشل في حذف الشريك '%s' (المعرف: %s) بعد إزالة المستخدم. السبب: %s"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_family_member__member_education_status_ids
-msgid "Member Education Status"
-msgstr "الحالة التعليمية للفرد"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__education_status__case_study__intermittent
-msgid "Intermittent"
-msgstr "منقطع"
-
-#. module: odex_benefit
-#: model:res.groups,name:odex_benefit.group_benefit_back_to_draft
-msgid "Return Benefit Profile to Draft"
-msgstr "إعادة ملف الأسرة إلى مسودة"
-
-#. module: odex_benefit
-#: model:res.groups,comment:odex_benefit.group_benefit_back_to_draft
-msgid "Allows the user to return a benefit profile to draft status."
-msgstr "يسمح للمستخدم بإعادة ملف المستفيد إلى حالة المسودة."
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Set to Draft"
-msgstr "إرجاع إلى الاسرة"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Are you sure you want to set the state to Draft?"
-msgstr "هل أنت متأكد أنك تريد إرجاع الحالة إلى المسودة؟"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__applicant_name
-msgid "Applicant Name"
-msgstr "اسم مقدم الطلب"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__grant_benefit__state__new
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_search
-msgid "Researcher Assignment"
-msgstr "اسناد الاخصائي"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Are you sure you want to Researcher assignment ?"
-msgstr "هل أنت متأكد أنك تريد إسناد الأخصائي؟"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__grant_benefit__state__complete_info
-#: model:ir.model.fields.selection,name:odex_benefit.selection__family_member__state__complete_info
-#: model:ir.model.fields.selection,name:odex_benefit.selection__family_member__state_a__complete_info
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_search
-msgid "Waiting for Researcher"
-msgstr "بانتظار الاخصائي"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__grant_benefit__state__waiting_approve
-#: model:ir.model.fields.selection,name:odex_benefit.selection__family_member__state__waiting_approve
-#: model:ir.model.fields.selection,name:odex_benefit.selection__family_member__state_a__waiting_approve
-#: model:ir.model.fields.selection,name:odex_benefit.selection__service_request__state__waiting_approve
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_search
-#: model_terms:ir.ui.view,arch_db:odex_benefit.service_request_search
-msgid "Waiting for Operation Manager"
-msgstr "بانتظار رئيسة العمليات"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__grant_benefit__state__first_approve
-#: model:ir.model.fields.selection,name:odex_benefit.selection__family_member__state_a__exception_first_approve
-#: model:ir.model.fields.selection,name:odex_benefit.selection__grant_benefit__state__exception_first_approve
-#: model:ir.model.fields.selection,name:odex_benefit.selection__service_request__state__first_approve
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_search
-#: model_terms:ir.ui.view,arch_db:odex_benefit.service_request_search
-msgid "Waiting for Branch Manager"
-msgstr "بانتظار مدير الفرع"
-
-#. module: odex_benefit
-#: model:res.groups,name:odex_benefit.group_benefit_show_draft_record
-msgid "Show Draft Records"
-msgstr "إظهار الملفات المسودة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__doc_count
-msgid "Number of documents attached"
-msgstr ""
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Documents"
-msgstr "المستندات"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/benefit.py:0
-#: code:addons/odex_benefit/models/family_members.py:0
-#, python-format
-msgid ""
-"%s must contain only alphabetic characters and spaces. Numbers and special "
-"characters are not allowed."
-msgstr ""
-"%s يجب أن يحتوي فقط على الأحرف الأبجدية والمسافات. الأرقام والرموز الخاصة غير مسموح بها."
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_family_member__action_type
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__action_type
-msgid "Action Type"
-msgstr "نوع الإجراء"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Father Name"
-msgstr "اسم الأب"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/benefit.py:0
-#, python-format
-msgid "Account Number is required."
-msgstr "رقم آيبان مطلوب."
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/benefit.py:0
-#, python-format
-msgid "Bank is required."
-msgstr "البنك مطلوب."
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/benefit.py:0
-#, python-format
-msgid "Account Holder Name is required for non-family members."
-msgstr "اسم صاحب الحساب مطلوب لغير أفراد العائلة."
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/benefit.py:0
-#, python-format
-msgid "Family Member must be selected."
-msgstr "يجب اختيار أحد أفراد العائلة."
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_visits_types__creation_method
-msgid "Creation Method"
-msgstr "طريقة الإنشاء"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__visits_types__creation_method__automatic
-msgid "Automatic"
-msgstr "تلقائي"
-
-#. module: odex_benefit
-#: model:ir.model.fields,help:odex_benefit.field_visits_types__creation_method
-msgid "Whether the visit is entered manually or created automatically"
-msgstr "هل يتم إدخال الزيارة يدويًا أو تُنشأ تلقائيًا"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_services_settings__recurrence_interval
-#: model:ir.model.fields,field_description:odex_benefit.field_visits_types__recurrence_interval
-msgid "Recurrence Interval"
-msgstr "فترة التكرار"
-
-#. module: odex_benefit
-#: model:ir.model.fields,help:odex_benefit.field_visits_types__recurrence_interval
-msgid "Determines how often visits are created automatically"
-msgstr "تحدد كل كم يتم إنشاء الزيارة تلقائيًا (مثلاً كل 30 يومًا)"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_services_settings__recurrence_period
-#: model:ir.model.fields,field_description:odex_benefit.field_visits_types__recurrence_period
-msgid "Recurrence Period"
-msgstr "مدة التكرار"
-
-#. module: odex_benefit
-#: model:ir.model.fields,help:odex_benefit.field_visits_types__recurrence_period
-msgid "Time unit for recurrence"
-msgstr "وحدة الزمن للتكرار"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_visits_types__otp_verification
-#: model_terms:ir.ui.view,arch_db:odex_benefit.visit_location_otp_wizard_form
-msgid "OTP Verification"
-msgstr "التحقق عبرOTP"
-
-#. module: odex_benefit
-#: model:ir.model.fields,help:odex_benefit.field_visits_types__otp_verification
-msgid "Whether this visit requires OTP confirmation from the family"
-msgstr "هل تتطلب هذه الزيارة تأكيد OTP من الأسرة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_visits_types__otp_validity_minutes
-msgid "OTP Validity (Minutes)"
-msgstr "صلاحية OTP بالدقائق"
-
-#. module: odex_benefit
-#: model:ir.model.fields,help:odex_benefit.field_visits_types__otp_validity_minutes
-msgid "OTP code validity duration in minutes"
-msgstr "مدة صلاحية رمز التحقق (بالدقائق)"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_visits_types__survey_id
-msgid "Evaluation Survey"
-msgstr "استمارة التقييم"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__visits_types__recurrence_period__days
-msgid "Days"
-msgstr "أيام"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__visits_types__recurrence_period__weeks
-msgid "Weeks"
-msgstr "أسابيع"
-
-#. module: odex_benefit
-#: model:ir.model.fields.selection,name:odex_benefit.selection__services_settings__recurrence_period__months
-#: model:ir.model.fields.selection,name:odex_benefit.selection__visits_types__recurrence_period__months
-msgid "Months"
-msgstr "أشهر"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.visit_location_calendar_view
-msgid "visits"
-msgstr "الزيارات"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.visit_location_activity_view
-msgid "Visits Activity"
-msgstr "أنشطة الزيارات"
-
-#. module: odex_benefit
-#: model:mail.template,subject:odex_benefit.visit_location_otp_email_template
-msgid "Your OTP Code"
-msgstr "رمز التحقق الخاص بك"
-
-#. module: odex_benefit
-#: model:mail.template,body_html:odex_benefit.visit_location_otp_email_template
-msgid ""
-"\n"
-"
\n"
-" "
-msgstr ""
-"\n"
-" \n"
-" \n"
-" \n"
-" \n"
-"
\n"
-" \n"
-" \n"
-" \n"
-" \n"
-"
\n"
-"
\n"
-" ${user.company_id.name}\n"
-"
\n"
-" \n"
-"
"
-
-#. module: odex_benefit
-#: model:sms.template,name:odex_benefit.visit_location_otp_sms_template
-msgid "Visit Location OTP"
-msgstr "رمز التحقق لزيارة الموقع"
-
-#. module: odex_benefit
-#: model:sms.template,body:odex_benefit.visit_location_otp_sms_template
-msgid ""
-"\n"
-" Your verification code for visit ${object.name} is ${object.otp_code}.\n"
-" It is valid for ${object.visit_types.otp_validity_minutes or 5} minutes.\n"
-" "
-msgstr ""
-"\n"
-" رمز التحقق الخاص بزيارتك ${object.name} هو ${object.otp_code}.\n"
-" صالح لمدة ${object.visit_types.otp_validity_minutes or 5} دقائق.\n"
-" "
-
-#. module: odex_benefit
-#: model:res.groups,name:odex_benefit.group_otp_manager
-msgid "OTP Manager"
-msgstr "مدير المصادقة (OTP)"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/visit.py:0
-#: model_terms:ir.ui.view,arch_db:odex_benefit.view_visit_skip_otp_wizard_form
-#: model_terms:ir.ui.view,arch_db:odex_benefit.visits_form
-#, python-format
-msgid "Skip OTP Verification"
-msgstr "تخطي التحقق بالرمز (OTP)"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_visit_location__otp_code
-msgid "OTP Code"
-msgstr "رمز التحقق (OTP)"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_visit_location__otp_generated_at
-msgid "OTP Generated At"
-msgstr "تاريخ/وقت إنشاء رمز التحقق"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/visit.py:0
-#, python-format
-msgid ""
-"The family profile has no email address. OTP cannot be sent. Please add an "
-"email first."
-msgstr "ملف العائلة لا يحتوي على عنوان بريد إلكتروني. لا يمكن إرسال رمز التحقق. يرجى إضافة بريد إلكتروني أولاً."
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/visit.py:0
-#, python-format
-msgid ""
-"The email template 'Visit Location OTP Email' is missing. Please contact "
-"your administrator."
-msgstr "قالب البريد الإلكتروني 'رمز التحقق لزيارة الموقع' مفقود. يرجى التواصل مع مدير النظام."
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/visit.py:0
-#, python-format
-msgid ""
-"The family profile has no mobile number. Please add a valid phone number "
-"before sending OTP."
-msgstr "ملف العائلة لا يحتوي على رقم جوال. يرجى إضافة رقم صالح قبل إرسال رمز التحقق."
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/visit.py:0
-#, python-format
-msgid ""
-"The SMS template 'Visit Location OTP' is missing. Please contact your "
-"administrator."
-msgstr "قالب الرسائل القصيرة 'رمز التحقق لموقع الزيارة' غير موجود. يرجى التواصل مع المسؤول."
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/visit.py:0
-#, python-format
-msgid "Verify OTP"
-msgstr "تحقق من OTP"
-
-#. module: odex_benefit
-#: model:ir.model,name:odex_benefit.model_visit_location_otp_wizard
-msgid "Visit Location OTP Verification Wizard"
-msgstr "معالج التحقق من OTP لمكان الزيارة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_visit_location_otp_wizard__otp_code
-msgid "Enter OTP"
-msgstr "أدخل رمز التحقق OTP"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_visit_location_otp_wizard__visit_otp_code
-msgid "Visit OTP"
-msgstr "رمز التحقق للزيارة"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/wizards/visit_location_otp_wizard.py:0
-#, python-format
-msgid "You must provide a reason for skipping OTP verification."
-msgstr "يجب عليك إدخال سبب لتخطي التحقق باستخدام رمز OTP."
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_visit_skip_otp_wizard__reason
-msgid "Reason for Skipping OTP"
-msgstr "سبب تخطي التحقق برمز OTP"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/wizards/visit_location_otp_wizard.py:0
-#, python-format
-msgid "OTP verification skipped by %s.\n"
-" \n"
-"\n"
-" \n"
-" \n"
-"
\n"
-" \n"
-" \n"
-" \n"
-" \n"
-"
\n"
-"
\n"
-" ${user.company_id.name}\n"
-"
\n"
-"
Reason: %s"
-msgstr "تم تخطي التحقق برمز OTP بواسطة %s.
السبب: %s"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/wizards/visit_location_otp_wizard.py:0
-#, python-format
-msgid "Invalid OTP. Please try again."
-msgstr "رمز التحقق OTP غير صالح. يرجى المحاولة مرة أخرى."
-
-#. module: odex_benefit
-#: model:ir.model,name:odex_benefit.model_visit_skip_otp_wizard
-msgid "Skip OTP Reason Wizard"
-msgstr "معالج سبب تخطي رمز OTP"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/benefit.py:0
-#, python-format
-msgid "Please complete your pending visits before proceeding."
-msgstr "برجا اتمام الزيارة الاولية للأسرة لإستكمال الإجراء"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__mother_has_disabilities
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__replacement_mother_has_disabilities
-msgid "Has Disabilities?"
-msgstr "هل لديه إعاقة؟"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Basic Information"
-msgstr "المعلومات الأساسية"
-
-#. module: odex_benefit
-#: model:ir.actions.act_window,name:odex_benefit.benefit_vehicle_model_action
-#: model:ir.model,name:odex_benefit.model_benefit_vehicle_model
-#: model:ir.ui.menu,name:odex_benefit.benefit_vehicle_model_menu
-#: model_terms:ir.ui.view,arch_db:odex_benefit.benefit_vehicle_model_form_view
-#: model_terms:ir.ui.view,arch_db:odex_benefit.benefit_vehicle_model_tree
-msgid "Vehicle Model"
-msgstr "موديل المركبات"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/benefit_vehicle_model.py:0
-#: model:ir.model.constraint,message:odex_benefit.constraint_benefit_vehicle_model_name_unique
-#, python-format
-msgid "The name must be unique."
-msgstr "يجب أن يكون اسم الموديل فريداً."
-
-#. module: odex_benefit
-#: model_terms:ir.actions.act_window,help:odex_benefit.benefit_vehicle_model_action
-msgid "Create the First Vehicle Model"
-msgstr "إنشاء أول موديل للمركبات"
-
-#. module: odex_benefit
-#: model:ir.ui.menu,name:odex_benefit.benefit_vehicle_model_settings_menu
-msgid "Vehicle Settings"
-msgstr "إعدادات المركبات"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_cars_line__application_form
-#: model:ir.model.fields,field_description:odex_benefit.field_service_request__application_form
-msgid "Application Form"
-msgstr "الاستمارة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_cars_line__driving_license
-#: model:ir.model.fields,field_description:odex_benefit.field_service_request__driving_license
-msgid "Driving License"
-msgstr "رخصة القيادة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_cars_line__owner_identity
-#: model:ir.model.fields,field_description:odex_benefit.field_service_request__owner_identity
-msgid "Owner Identity"
-msgstr "هوية المالك"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_family_member__marriage_certificate
-msgid "Marriage Certificate"
-msgstr "شهادة الزواج"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_family_member__death_certificate
-msgid "Death Certificate"
-msgstr "شهادة الوفاة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_family_member__salary_certificate
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__mother_salary_certificate
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__replacement_mother_salary_certificate
-msgid "Salary Certificate"
-msgstr "شهادة الراتب"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/family_members.py:0
-#, python-format
-msgid "Death Certificate is required for member '%s' when marked as deceased."
-msgstr "شهادة الوفاة مطلوبة للفرد '%s' عند وضع علامة متوفى."
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/family_members.py:0
-#, python-format
-msgid "Income must be greater than 0 for member '%s' when working and age is greater than or equal to 18."
-msgstr "يجب أن يكون الدخل أكبر من 0 للفرد '%s' عند العمل وعمره أكبر من أو يساوي 18."
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/family_members.py:0
-#, python-format
-msgid "Salary Certificate is required for member '%s' when working and age is greater than or equal to 18."
-msgstr "شهادة الراتب مطلوبة للفرد '%s' عند العمل وعمره أكبر من أو يساوي 18."
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/family_members.py:0
-#, python-format
-msgid ""
-"Marriage Certificate is required for member '%s' when marked as married and "
-"not a mother."
-msgstr "شهادة الزواج مطلوبة للفرد '%s' عند تحديده كمتزوج وليس أماً."
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__family_edit
-msgid "Family Edit"
-msgstr "تعديل العائلة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__family_return_reason
-#: model:ir.model.fields,field_description:odex_benefit.field_suspend_reason__is_family_return_reason
-msgid "Family Return Reason"
-msgstr "سبب ارجاع للاسرة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_attachments_settings__is_mother_salary
-#: model:ir.model.fields,field_description:odex_benefit.field_salary_line__is_mother_salary
-msgid "Is Mother Salary"
-msgstr "هل هو راتب الأم"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_salary_line__approved
-msgid "Is Approved"
-msgstr "تم اعتماده"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
-msgid "Expenses and Income"
-msgstr "الدخل والالتزامات"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_expenses_line__deduct_from_family_income
-#: model:ir.model.fields,field_description:odex_benefit.field_family_debits__deduct_from_family_income
-msgid "Deduct from Family Income"
-msgstr "يخصم من دخل الأسرة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__mother_dead_country_id
-msgid "Mother Dead Country"
-msgstr "دولة وفاة الأم"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__mother_dead_certificate
-msgid "Mother Dead Certificate"
-msgstr "شهادة وفاة الأم"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__mother_dead_reason_id
-msgid "Mother Dead Reason"
-msgstr "سبب وفاة الأم"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__mother_dead_date
-msgid "Mother Dead Date"
-msgstr "تاريخ وفاة الأم"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__replacement_dead_city
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__replacement_dead_res_city_id
-msgid "Replacement Mother Dead City"
-msgstr "مدينة وفاة الأم البديلة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__replacement_mother_dead_date
-msgid "Replacement Mother Dead Date"
-msgstr "تاريخ وفاة الأم البديلة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__replacement_mother_dead_certificate
-msgid "Replacement Mother Dead Certificate"
-msgstr "شهادة وفاة الأم البديلة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__replacement_dead_reason
-msgid "Replacement Mother Dead Reason"
-msgstr "سبب وفاة الأم البديلة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__replacement_mother_dead_country_id
-msgid "Replacement Mother Dead Country"
-msgstr "دولة وفاة الأم البديلة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__replacement_dead_reason_id
-msgid "Replacement Mother Dead Reason"
-msgstr "سبب وفاة الأم البديلة"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/wizards/entity_refused_wizard.py:0
-#, python-format
-msgid ""
-"The benefit record %s state has been changed to %s.
Return"
-" Reason: %s
Reason: %s"
-msgstr "تم تغيير حالة حالة المستفيد %s إلى %s.
سبب الإرجاع: %s
الملاحظات: %s"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/wizards/entity_refused_wizard.py:0
-#, python-format
-msgid ""
-"The Benefit %s state changed to %s.
Suspend Reason: "
-"%s
Reason: %s"
-msgstr "تم تغيير حالة المستفيد %s إلى %s.
سبب الإيقاف: %s
الملاحظات: %s"
-
-#. module: odex_benefit
-#: model:ir.actions.act_window,name:odex_benefit.suspend_reason_action
-#: model:ir.ui.menu,name:odex_benefit.menu_suspend_reason
-#: model_terms:ir.actions.act_window,help:odex_benefit.suspend_reason_action
-msgid "Reasons of Suspension and Refusal"
-msgstr "أسباب الإيقاف والرفض"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_suspend_reason__is_stop_reason
-msgid "Stop Reason"
-msgstr "سبب إيقاف"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_suspend_reason__is_reject_reason
-msgid "Reject Reason"
-msgstr "سبب الرفض"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_suspend_reason__is_incomplete_visit_reason
-msgid "Incomplete Visit Reason"
-msgstr "سبب عدم اكمال الزيارة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_attachments_settings__show_in_portal
-#: model:ir.model.fields,field_description:odex_benefit.field_ir_attachment__show_in_portal
-#: model:ir.model.fields,field_description:odex_benefit.field_mrp_document__show_in_portal
-msgid "Show In Portal"
-msgstr "عرض في البوابة"
-
-#. module: odex_benefit
-#: model:ir.model,name:odex_benefit.model_visit_location_refusal_reason_wizard
-msgid "Reason for Visit Refusal"
-msgstr "سبب رفض الزيارة"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_visit_location_refusal_reason_wizard__suspend_reason_id
-msgid "Refusal Reason"
-msgstr "السبب"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/wizards/visit_location_refused_wizard.py:0
-#, python-format
-msgid ""
-"The visit record %s state has been changed to %s.
Refusal "
-"Reason: %s
Notes: %s"
-msgstr ""
-"تم تغيير حالة سجل الزيارة %s إلى %s.
سبب الرفض: %s
ملاحظات: %s"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.visits_form
-msgid "Resend Survey Link"
-msgstr "إعادة إرسال رابط الاستطلاع"
-
-#. module: odex_benefit
-#: model_terms:ir.ui.view,arch_db:odex_benefit.visits_form
-msgid "Surveys"
-msgstr "استطلاعات"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_visit_location__response_id
-msgid "Survey Responses"
-msgstr "إجابات الاستطلاع"
-
-#. module: odex_benefit
-#: model:ir.model.fields,field_description:odex_benefit.field_visit_location__response_count
-msgid "Responses Count"
-msgstr "عدد الإجابات"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/visit.py:0
-#, python-format
-msgid "Family Evaluation Responses"
-msgstr "جابات استطلاع الأسرة"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/visit.py:0
-#, python-format
-msgid "You must send the evaluation form before closing the visit."
-msgstr "يجب إرسال نموذج الاستطلاع قبل إغلاق الزيارة."
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/visit.py:0
-#, python-format
-msgid ""
-"The visit cannot be closed before the family completes the evaluation form."
-msgstr "لا يمكن إغلاق الزيارة قبل أن تُكمل الأسرة نموذج الاستطلاع."
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/visit.py:0
-#, python-format
-msgid "The family profile has no email address. Please add an email first."
-msgstr "ملف الأسرة لا يحتوي على عنوان بريد إلكتروني. يرجى إضافة البريد أولاً."
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/visit.py:0
-#, python-format
-msgid "The email template 'Visit Location Survey Email' is missing."
-msgstr "قالب البريد الإلكتروني 'زيارة - استطلاع' غير موجود."
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/visit.py:0
-#, python-format
-msgid ""
-"The family profile has no mobile number. Please add a valid phone number."
-msgstr "ملف الأسرة لا يحتوي على رقم جوال. يرجى إضافة رقم صالح."
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/visit.py:0
-#, python-format
-msgid "The SMS template 'Visit Location Survey' is missing."
-msgstr "قالب الرسائل القصيرة 'زيارة - استطلاع' غير موجود."
-
-#. module: odex_benefit
-#: model:sms.template,name:odex_benefit.visit_location_survey_sms_template
-msgid "Visit Location Survey SMS"
-msgstr "رسالة استطلاع الزيارة"
-
-#. module: odex_benefit
-#: model:sms.template,body:odex_benefit.visit_location_survey_sms_template
-msgid ""
-"\n"
-" Dear family, please complete the evaluation form for visit ${object.name}: ${object.survey_url}\n"
-" "
-msgstr ""
-"\n"
-" عائلة كريمة، يرجى تعبئة نموذج الاستطلاع للزيارة ${object.name}: ${object.survey_url}\n"
-" "
-
-#. module: odex_benefit
-#: model:mail.template,body_html:odex_benefit.visit_location_survey_email_template
-msgid ""
-"
\n"
-" ${user.company_id.name}\n"
-"
\n"
-"\n"
-"
\n"
-" ${user.company_id.name}\n"
-"
\n"
-"\n"
-" ' % self.url
-
- def get_researchers_email(self):
- email_ids = ''
- for rec in self.researcher_id.employee_id:
- if email_ids:
- email_ids = email_ids + ',' + str(rec.work_email)
- else:
- email_ids = str(rec.work_email)
- return email_ids
-
- @api.depends('room_ids')
- def get_rooms_total(self):
- for rec in self:
- if rec.id:
- rooms = rec.env['benefit.housing.rooms'].sudo().search([('housing_id', '=', rec.id)])
- rec.rooms_number = len(rooms)
-
- @api.onchange('room_ids')
- def onchange_room_ids(self):
- res = {}
- items_ids = []
- for record in self:
- items_ids.append(record.id)
- res['domain'] = {'items': [('room_id', 'in', items_ids)]}
- return res
-
- @api.onchange("father_country_id", 'mother_country_id')
- def onchange_father_mother_country_id(self):
- res = {}
- for rec in self:
- if rec.father_country_id and rec.mother_country_id:
- if rec.mother_country_id.code != 'SA' and rec.father_country_id.code != 'SA' and not rec.mother_country_id.is_excluded and not rec.father_country_id.is_excluded :
- rec.mother_country_id = False
- res['warning'] = {'title': _('ValidationError'),
- 'message': _('Non-Saudi mothers and fathers cannot register')}
- return res
-
- @api.constrains('acc_holder_id_number')
- def _check_acc_holder_id_number(self):
- for record in self:
- id_number = record.acc_holder_id_number
- if id_number:
- if not re.match(r'^\d{10}$', id_number):
- raise ValidationError(_("Account Holder ID Number must contain exactly 10 digits."))
-
- @api.constrains('father_id_number', 'mother_id_number', 'replacement_mother_id_number')
- def _onchange_id_numbers(self):
- id_numbers = {
- 'رقم هوية الأب': self.father_id_number,
- 'رقم هوية الأم': self.mother_id_number,
- 'رقم هوية الأم البديلة': self.replacement_mother_id_number,
- }
-
- # Check each ID number for 10-digit format and uniqueness within the parent model
- unique_ids = set()
- for label, id_number in id_numbers.items():
- if id_number:
- if not re.match(r'^\d{10}$', id_number):
- raise ValidationError(_("%s must contain exactly 10 digits.")%label)
- if id_number in unique_ids:
- raise ValidationError(_("%s must be unique within the same record.") % label)
- if id_number.startswith('1') and label == 'رقم هوية الأب':
- self.father_country_id = self.env["res.country"].search([('code','=','SA')],limit=1).id
- self.father_id_number_type = 'citizen'
- if id_number.startswith('1') and label == 'رقم هوية الأم':
- self.mother_country_id = self.env["res.country"].search([('code','=','SA')],limit=1).id
- self.mother_id_number_type = 'citizen'
- if id_number.startswith('1') and label == 'رقم هوية الأم البديلة':
- self.replacement_mother_country_id = self.env["res.country"].search([('code','=','SA')],limit=1).id
- self.replacement_mother_id_number_type = 'citizen'
- unique_ids.add(id_number)
-
- # Check for uniqueness against `member_id_number` in child records and across database records
- for member in self.member_ids:
- if member.member_id_number and member.member_id_number in unique_ids and member.id not in [self.mother_family_member_id.id,self.replacement_mother_family_member_id.id]:
- raise ValidationError(_("The ID number %s in the Family Members list must be unique across the record.")%member.member_id_number)
- for id_number in unique_ids:
- if id_number == self.father_id_number:
- conflict = self.env['grant.benefit'].search([
- ('id', '!=', self._origin.id),
- '|',
- ('mother_id_number', '=', id_number),
- ('replacement_mother_id_number', '=', id_number),
- ], limit=1)
- if conflict:
- raise ValidationError(
- _("Father ID %s is already used in another family (as non-father) with code %s.") %
- (id_number, conflict.code))
- elif id_number == self.mother_id_number:
- conflict = self.env['grant.benefit'].search([
- ('id', '!=', self._origin.id),
- '|',
- ('father_id_number', '=', id_number),
- ('replacement_mother_id_number', '=', id_number),
- ], limit=1)
- if conflict:
- raise ValidationError(
- _("Mother ID %s is already used in another family with code %s.") %
- (id_number, conflict.code))
- continue
- elif id_number == self.replacement_mother_id_number:
- conflict = self.env['grant.benefit'].search([
- ('id', '!=', self.id),
- '|',
- ('father_id_number', '=', id_number),
- ('mother_id_number', '=', id_number),
- ], limit=1)
- if conflict:
- raise ValidationError(
- _("Replacement Mother ID %s is already used in another family (as non-replacement) with code %s.") %
- (id_number, conflict.code)
- )
- duplicate_record_members = self.env['family.member'].search([('member_id_number', '=', id_number)])
- for member in duplicate_record_members:
- if member.relationn and member.relationn.relation_type in ['mother', 'replacement_mother']:
- continue
- if member.benefit_id.id != self.id:
- raise ValidationError(
- _("The ID number %s already exists in family with code %s. Please enter a unique ID number.") %
- (id_number, member.benefit_id.code)
- )
-
- @api.onchange("family_bank")
- def onchange_family_bank(self):
- for rec in self:
- if rec.family_bank:
- exist = self.search([('family_bank', '=', rec.family_bank.id)])
- if exist:
- raise ValidationError(
- _('The Family Bank Already Exist!'))
-
- @api.model
- def _geo_localize(self, street='', zip='', city='', state='', country=''):
- geo_obj = self.env['base.geocoder']
- search = geo_obj.geo_query_address(
- street=street, zip=zip, city=city, state=state, country=country
- )
- result = geo_obj.geo_find(search, force_country=country)
- if result is None:
- search = geo_obj.geo_query_address(
- city=city, state=state, country=country
- )
- result = geo_obj.geo_find(search, force_country=country)
- return result, search
-
- def geo_localize(self):
- for location in self.with_context(lang='en_US'):
- result = self._geo_localize(
- street=location.street,
- zip=location.zip,
- city=location.city_id.name,
- state=location.state_id.name,
- country=location.country_id.name,
- )
- if result:
- location.write(
- {
- 'lat': result[0][0],
- 'lon': result[0][1],
- }
- )
- return True
-
- def get_location_on_map(self):
- for location in self.with_context(lang='en_US'):
- url = "http://maps.google.com/maps/search/?api=1&query=%s,%s" % (location.lat, location.lon),
- return {
- 'type': 'ir.actions.act_url',
- 'target': 'new',
- 'url': url
- }
-
- def check_mother_status(self):
- validation_setting = self.env["family.validation.setting"].search([], limit=1)
- mini_income_for_mother = validation_setting.mini_income_for_mother
- max_income_for_mother = validation_setting.max_income_for_mother
- for rec in self:
- reasons = []
- status = 'benefit'
- if rec.mother_location_conf and rec.mother_marital_conf:
- if not rec.mother_location_conf.is_benefit or not rec.mother_marital_conf.is_benefit or rec.state in ['suspended_second_approve','refused']:
- reasons.append(_("The mother's marital or location conditions are not eligible."))
- status = 'non_benefit'
- elif rec.mother_marital_conf.is_benefit :
- if rec.is_mother_work and rec.mother_country_id.code == 'SA' or (
- rec.mother_country_id.code != 'SA' and rec.father_country_id.code == 'SA'):
- if mini_income_for_mother < rec.mother_income <= max_income_for_mother:
- reasons.append(_("The mother's income is between minimum and maximum thresholds."))
- status = 'non_benefit'
- elif rec.mother_income <= mini_income_for_mother:
- status = 'benefit'
- elif rec.mother_income > max_income_for_mother:
- status = 'benefit'
- elif not rec.is_mother_work and rec.mother_country_id.code == 'SA' or (
- rec.mother_country_id.code != 'SA' and rec.father_country_id.code == 'SA'):
- status = 'benefit'
- return status, reasons
-
- def check_replacement_mother_status(self):
- validation_setting = self.env["family.validation.setting"].search([], limit=1)
- mini_income_for_mother = validation_setting.mini_income_for_mother
- max_income_for_mother = validation_setting.max_income_for_mother
- for rec in self:
- reasons = []
- status = 'benefit'
- if not rec.add_replacement_mother:
- continue
- if not rec.replacement_mother_location_conf.is_benefit or not rec.replacement_mother_marital_conf.is_benefit or rec.state in ['suspended_second_approve','refused']:
- status = 'non_benefit'
- reasons.append(_("The replacement mother's marital or location conditions are not eligible."))
- elif rec.replacement_mother_marital_conf.is_benefit:
- if rec.replacement_is_mother_work and rec.replacement_mother_country_id.code == 'SA' or (
- rec.replacement_mother_country_id.code != 'SA' and rec.father_country_id.code == 'SA'):
- if mini_income_for_mother < rec.replacement_mother_income <= max_income_for_mother:
- status = 'non_benefit'
- reasons.append(_("The replacement mother's income is between minimum and maximum thresholds."))
- elif rec.replacement_mother_income <= mini_income_for_mother:
- status = 'benefit'
- elif rec.replacement_mother_income > max_income_for_mother:
- status = 'benefit'
- elif not rec.replacement_is_mother_work and rec.replacement_mother_country_id.code == 'SA' or (
- rec.replacement_mother_country_id.code != 'SA' and rec.father_country_id.code == 'SA'):
- status = 'benefit'
- return status, reasons
-
- def delete_from_db(self):
- find_id = self.env['benefit.housing'].search([])
- for r in find_id:
- r.unlink()
-
- @api.model
- def default_get(self, fields):
- res = super(GrantBenefitProfile, self).default_get(fields)
-
- # Get default attachments
- default_attachment = self.env["attachments.settings"].search([('is_default', '=', True)])
-
- # Prepare the list of default attachments for the one2many field
- default_attachments_data = []
- income_attachments_data = []
- for attach in default_attachment:
- if attach.attach_type == 'family_attach':
- default_attachments_data.append((0, 0, {
- 'name': attach.name,
- 'is_required': attach.is_required,
- 'is_default': attach.is_default,
- 'show_in_portal': attach.show_in_portal
- }))
- if attach.attach_type == 'income_attach':
- income_attachments_data.append((0, 0, {
- 'income_type': attach.id,
- 'is_required': attach.is_required,
- 'is_default': attach.is_default,
- # 'show_in_portal': attach.show_in_portal
- }))
-
- # Add the default attachments to the res dictionary for attachment_ids
- if 'attachment_ids' in fields:
- res['attachment_ids'] = default_attachments_data
- if 'salary_ids' in fields:
- res['salary_ids'] = income_attachments_data
- return res
-
- def write(self, vals):
- res = super(GrantBenefitProfile, self).write(vals)
- if "name" in vals and self.user_id:
- self.user_id.sudo().write({"name": vals.get("name")})
- if any(field in vals for field in ["name", "first_name", "second_name", "middle_name", "family_name",
- "father_name", "father_second_name", "father_third_name",
- "father_family_name"]):
- for record in self:
- record.partner_id.get_partner_name() # Force recomputation of name
- if record.user_id:
- record.sudo().user_id.write({"name": record.partner_id.name})
- #if not self.env.context.get('force_website', False) and not self.env.context.get('bypass_attachments_requirement', False):
- # self._validate_required_attachments()
-
- # Handle mother update/create
- mother_fields = [
- 'mother_name', 'mother_second_name', 'mother_third_name', 'mother_family_name', 'mother_id_number',
- 'mother_birth_date', 'mother_marital_conf', 'mother_location_conf', 'is_mother_work',
- 'mother_income', 'mother_age','education_status','mother_diseases_attachment_ids',
- 'mother_education_status_ids','mother_disabilities_attachment_ids'
- ]
- if any(field in vals for field in mother_fields):
- for rec in self:
- rec.calculate_income(rec.mother_income, rec.mother_status, rec.salary_ids)
- rec.add_or_replace_mother_as_member()
-
- # Handle replacement mother update/create
- replacement_fields = [
- 'replacement_mother_name', 'replacement_mother_second_name', 'replacement_mother_third_name',
- 'replacement_mother_family_name','replacement_mother_id_number',
- 'replacement_mother_birth_date', 'replacement_mother_marital_conf',
- 'replacement_mother_location_conf','replacement_mother_relation',
- 'replacement_is_mother_work', 'replacement_mother_income', 'replacement_education_status',
- 'replacement_mother_age','replacement_mother_disabilities_attachment_ids',
- 'replacement_education_status_ids', 'replacement_mother_diseases_attachment_ids'
- ]
- if any(field in vals for field in replacement_fields):
- for rec in self:
- if rec.add_replacement_mother:
- rec.calculate_income(rec.replacement_mother_income, rec.replacement_mother_status, rec.salary_ids)
- rec.add_or_replace_replacement_mother_as_member()
- return res
-
- @api.model
- def create(self, vals):
- res = super(GrantBenefitProfile, self).create(vals)
- if "applicant_name" not in vals:
- res.applicant_name = self.env.user.display_name
- if "name" in vals and res.user_id:
- res.user_id.sudo().write({"name": vals.get("name")})
- if res.user_id:
- res.sudo().user_id.write({"name": res.name})
- #if not self.env.context.get('force_website', False):
- ##res._validate_required_attachments()
- if not res.code or res.code == _('New'):
- res.code = self.env['ir.sequence'].sudo().next_by_code('benefit.sequence') or _('New')
- # Add mother
- if res.mother_id_number:
- res.calculate_income(res.mother_income, res.mother_status, res.salary_ids)
- res.add_or_replace_mother_as_member()
- # Add replacement mother
- if res.add_replacement_mother and res.replacement_mother_id_number:
- res.calculate_income(res.replacement_mother_income, res.replacement_mother_status, res.salary_ids)
- res.add_or_replace_replacement_mother_as_member()
- return res
-
- def unlink(self):
- users_to_delete = self.env['res.users']
- skip_user = self.env.context.get('skip_user_unlink')
- force_unlink = self.env.context.get('force_unlink', False)
-
- for record in self:
- if not force_unlink and record.state not in ['draft']:
- raise UserError(_('You cannot delete this record'))
-
- self.env['ir.attachment'].search([('benefit_id', '=', record.id)]).unlink()
- if record.member_ids:
- record.member_ids.unlink()
-
- if not skip_user and record.user_id:
- other_benefits = self.env['grant.benefit'].search([
- ('user_id', '=', record.user_id.id),
- ('id', '!=', record.id)
- ])
- if other_benefits:
- raise UserError(
- _("Cannot delete user '%s': still linked to other benefit profiles.")
- % record.user_id.name
- )
- users_to_delete |= record.user_id
-
- res = super().unlink()
-
- if not skip_user:
- users_to_delete.unlink()
-
- return res
-
- def copy(self, default=None):
- """Override the copy method to prevent duplicating the record."""
- raise UserError(_('You cannot Duplicate this record'))
-
- def complete_data(self):
- message = self.create_message('complete_info')
- self.partner_id.send_sms_notification(message, self.phone)
- # self.state = 'complete_info'
- return {
- 'name': _('Rerearcher Wizard'),
- 'view_mode': 'form',
- 'view_type': 'form',
- 'type': 'ir.actions.act_window',
- 'res_model': 'researcher.family.wizard',
- 'view_id': self.env.ref('odex_benefit.view_resarcher_family_wizard_form').id,
- 'target': 'new',
- }
-
- def finish_complete_data(self):
- message = self.create_message('waiting_approve')
- self.partner_id.send_sms_notification(message, self.phone)
- for rec in self:
- visits = self.env['visit.location'].search([('benefit_id', '=', rec.id),('state', 'not in', ['close', 'done'])])
- if rec.action_type == 'new' and not rec.benefit_category_id.is_benefit:
- raise ValidationError(_("The procedure cannot be continued; the family is not a beneficiary."))
- if rec.action_type == 'new' and visits:
- raise ValidationError(_("Please complete your pending visits before proceeding."))
- rec.validate_attachments()
- self.state = 'waiting_approve'
-
- def action_first_accepted(self):
- """Accept registration"""
- for rec in self:
- rec.state = "first_approve"
-
- def action_second_accepted(self):
- """Accept registration"""
- for rec in self:
- messages = []
- if rec.total_family_expenses:
- if not rec.acc_number:
- messages.append(_("Account Number is required."))
- if not rec.bank_id:
- messages.append(_("Bank is required."))
- if not rec.is_family_member and not rec.acc_holder_name:
- messages.append(_("Account Holder Name is required for non-family members."))
- if rec.is_family_member and not rec.family_member_id:
- messages.append(_("Family Member must be selected."))
-
- if messages:
- raise UserError("\n".join(messages))
-
- if not rec.user_id:
- self.sudo().create_user()
-
- rec.user_id.sudo().write({
- 'groups_id': [(3, self.env.ref('base.group_user', False).id)],
- })
- # rec.user_id.sudo().write({
- # 'groups_id': [(4, self.env.ref('odex_benefit.group_benefit_user', False).id)],
- # })
- rec.user_id.sudo().write({
- 'groups_id': [(4, self.env.ref('base.group_portal', False).id)],
- })
- if rec.action_type == 'new':
- rec.approve_date = datetime.now()
- self.sudo().send_approval_benefit_email()
- partner_ids = []
- for id in self.message_follower_ids.ids:
- partner_ids.append(self.env['mail.followers'].search([('id', '=', id)]).partner_id)
- self.state = "second_approve"
- self.action_type = "approved"
- self.sudo()._send_notification(partner_ids, rec.state)
- # for member in self.member_ids:
- # member.create_member_partner()
-
- # @api.multi
- def action_first_refusal(self):
- """First refusal to entity registration"""
- domain = []
- context = {}
- context = dict(self.env.context or {})
- context['state'] = "first_refusal"
- self.partner_id.send_sms_notification("First Refusal", self.phone)
- context['active_id'] = self.id
- return {
- 'name': _('Refuse Reason Wizard'),
- 'view_mode': 'form',
- 'view_type': 'form',
- 'type': 'ir.actions.act_window',
- 'res_model': 'entity.refused.reason.wizard',
- 'view_id': self.env.ref('odex_benefit.view_entity_refused_reason_wizard_form').id,
- 'target': 'new',
- 'domain': domain,
- 'context': context,
- }
-
- def action_set_to_draft(self):
- context = dict(self.env.context or {})
- context['target_state'] = "draft"
- context['active_id'] = self.id
- return {
- 'name': _('Return Reason Wizard'),
- 'view_mode': 'form',
- 'view_type': 'form',
- 'type': 'ir.actions.act_window',
- 'res_model': 'entity.return.reason.wizard',
- 'view_id': self.env.ref('odex_benefit.view_entity_return_reason_wizard_form').id,
- 'target': 'new',
- 'context': context,
- }
-
- def action_set_to_new(self):
- context = dict(self.env.context or {})
- context['target_state'] = "complete_info"
- context['active_id'] = self.id
- return {
- 'name': _('Return Reason Wizard'),
- 'view_mode': 'form',
- 'view_type': 'form',
- 'type': 'ir.actions.act_window',
- 'res_model': 'entity.return.reason.wizard',
- 'view_id': self.env.ref('odex_benefit.view_entity_return_reason_wizard_form').id,
- 'target': 'new',
- 'context': context,
- }
-
- def action_set_waiting_approve(self):
- context = dict(self.env.context or {})
- context['target_state'] = "waiting_approve"
- context['active_id'] = self.id
- return {
- 'name': _('Return Reason Wizard'),
- 'view_mode': 'form',
- 'view_type': 'form',
- 'type': 'ir.actions.act_window',
- 'res_model': 'entity.return.reason.wizard',
- 'view_id': self.env.ref('odex_benefit.view_entity_return_reason_wizard_form').id,
- 'target': 'new',
- 'context': context,
- }
-
-
- # @api.multi
- def action_refuse(self):
- """Refuse entity registration"""
- domain = []
- context = dict(self.env.context or {})
- context['state'] = "refused"
- context['active_id'] = self.id
- return {
- 'name': _('Refuse Reason Wizard'),
- 'view_mode': 'form',
- 'view_type': 'form',
- 'type': 'ir.actions.act_window',
- 'res_model': 'entity.refused.reason.wizard',
- 'view_id': self.env.ref('odex_benefit.view_entity_final_refused_reason_wizard_form').id,
- 'target': 'new',
- 'domain': domain,
- 'context': context,
- }
-
- # @api.multi
- def action_black_list(self):
- """Move benefit to black list"""
- domain = []
- context = dict(self.env.context or {})
- context['state'] = "black_list"
- context['active_id'] = self.id
- return {
- 'name': _('Black List Wizard'),
- 'view_mode': 'form',
- 'view_type': 'form',
- 'type': 'ir.actions.act_window',
- 'res_model': 'entity.black.list.wizard',
- 'view_id': self.env.ref('odex_benefit.view_entity_black_list_wizard_form').id,
- 'target': 'new',
- 'domain': domain,
- 'context': context,
- }
-
- # @api.multi
- def action_edit_info(self):
- user = self.user_id
- if not user:
- user = self.env['res.users'].sudo().search(
- [('partner_id', '=', self.partner_id.id), ('active', '=', False)])
- if user:
- user.write({'active': True})
- else:
- user = self.create_user()
- group_e = self.env.ref('odex_benefit.group_benefit_edit', False)
- try:
- group_e.sudo().write({'users': [(4, user.id)]})
- self.old_stage = self.state
- template = self.env.ref('odex_benefit.edit_benefit_email', False)
- except:
- pass
- self.state = 'complete_info'
- self.action_type = 'edit_info'
-
- def action_suspend(self):
- self.is_excluded_suspension = False
- for rec in self.member_ids:
- rec.is_excluded_suspension = False
- if rec.is_member_workflow:
- rec.is_member_workflow = False
- return {
- 'name': _('Suspend Reason Wizard'),
- 'view_mode': 'form',
- 'view_type': 'form',
- 'type': 'ir.actions.act_window',
- 'res_model': 'suspend.reason.wizard',
- 'view_id': self.env.ref('odex_benefit.view_suspend_reason_wizard_form').id,
- 'target': 'new',
- }
-
- def action_suspend_first_accept(self):
- for rec in self:
- rec.state = 'first_approve'
-
- def action_suspend_second_accept(self):
- for rec in self:
- rec.state = 'suspended_second_approve'
- rec.action_type = 'suspended'
-
- def action_auto_suspend(self):
- # Fetch grants in second approval state that are not excluded from suspension
- grants = self.env["grant.benefit"].search(
- [('state', '=', 'second_approve'), ('is_excluded_suspension', '=', False)]
- )
-
- for grant in grants:
- # Check if there are no benefit members
- if grant.benefit_member_count == 0:
- grant.state = 'suspended_second_approve'
- grant.suspend_method = 'auto'
-
- # Check if any attachment of the grant is expired
- for attachment in grant.attachment_ids:
- if attachment.attach_status == 'expired':
- # Change state to temporarily suspended if there are benefit members
- if grant.benefit_member_count != 0:
- grant.state = 'waiting_approve'
- grant.action_type = 'suspended'
- grant.suspend_method = 'auto'
- break # Exit attachment loop after processing
-
- # Check each member's attachments
- for member in grant.member_ids:
- for member_attachment in member.attachment_ids:
- if member_attachment.attach_status == 'expired':
- # Change state to temporarily suspended if there are benefit members
- if grant.benefit_member_count != 0:
- grant.state = 'waiting_approve'
- grant.action_type = 'suspended'
- grant.suspend_method = 'auto'
- break # Exit member attachment loop after processing
-
- def action_suspend_refuse(self):
- for rec in self:
- rec.state = 'second_approve'
- rec.action_type = 'approved'
- rec.get_member_income()
-
- #Excption Work flow
- def action_exception(self):
- return {
- 'name': _('Exception Wizard'),
- 'view_mode': 'form',
- 'view_type': 'form',
- 'type': 'ir.actions.act_window',
- 'res_model': 'exception.wizard',
- 'view_id': self.env.ref('odex_benefit.view_exception_wizard_form').id,
- 'target': 'new',
- }
-
- def action_exception_first_accept(self):
- for rec in self:
- rec.state = 'first_approve'
-
- def action_exception_second_accept(self):
- for rec in self:
- rec.state = 'exception_second_approve'
- def action_exception_final_accept(self):
- for rec in self:
- rec.is_excluded_suspension = True
- rec.state = 'second_approve'
- for member in self.member_ids:
- member.is_excluded_suspension = True
- rec.get_member_income()
-
- def action_auto_exception(self):
- obj = self.env["grant.benefit"].search(
- [('state', '=', 'second_approve'), ('is_excluded_suspension', '=', True)])
- for rec in obj:
- if rec.exception_end_date and rec.exception_end_date <= fields.Datetime.now():
- rec.is_excluded_suspension = False
- rec.state = 'suspended_second_approve'
- rec.action_type = 'suspended'
- for member in rec.member_ids:
- member.is_excluded_suspension = False
-
- def action_exception_refuse(self):
- for rec in self:
- rec.state = 'suspended_second_approve'
- rec.action_type = 'suspended'
-
- # @api.multi
- def action_remove_from_black_list(self):
- """Remove entity from black list"""
- partner_ids = []
- for entity in self:
- if self.old_stage == 'draft':
- entity.state = 'draft'
- else:
- entity.state = 'second_approve'
- entity.black_list_message = False
- user = self.env['res.users'].search([('partner_id', '=', entity.partner_id.id)], limit=1)
- user.toggle_active()
- # activate user
- subject = _('Beneficiaries')
- state_label = dict(entity.fields_get(allfields=['state'])['state']['selection'])[entity.state]
- body = ' '.join(
- (_(u'The Beneficial '), entity.name, _(u' State changed to '), state_label, u'.')).encode(
- 'utf-8')
- partner_ids += [(6, 0, entity.message_follower_ids.ids)]
- message_vals = {
- 'subject': subject,
- 'body': body,
- 'partner_ids': partner_ids,
- }
- # entity.message_post(body=body, subject=subject, message_type='email')
- # entity.send_remove_from_black_list_email()
-
- @api.depends('car_ids')
- def _onchange_car_count(self):
- for rec in self:
- rec.car_count = len(rec.car_ids)
- rec.has_car = any(line.member_id for line in rec.car_ids)
-
- @api.onchange('is_diseases')
- def onchange_is_diseases(self):
- for rec in self:
- rec.is_diseases = 'sick' if rec.is_diseases else 'healthy'
-
- def _onchange_is_has_needs(self):
- for rec in self:
- benefits_needs = rec.env['benefits.needs'].sudo().search(['|',
- ('benefit_id', '=', rec.id),
- ('benefit_ids', 'in', rec.id)])
- needs = []
- for need in benefits_needs:
- if need.state == 'published' and need.remaining_amount > 0.0:
- needs.append(need.id)
- if len(needs) > 0:
- rec.sudo().has_needs = True
- elif len(needs) == 0:
- rec.sudo().has_needs = False
-
- def _orphan_list_compute(self):
- for rec in self:
- benefits = rec.env['grant.benefit'].sudo().search([('mother_id', '=', rec.id)])
- rec.orphan_ids = [(6, 0, benefits.ids)]
- rec.orphan_count = len(rec.orphan_ids)
-
- def _compute_orphan_Type(self):
- for rec in self:
- if rec.benefit_type == "orphan":
- if not rec.father_is_life and not rec.mother_is_life:
- rec.orphan_status = 'parent'
- elif not rec.father_is_life:
- rec.orphan_status = 'father'
- elif not rec.mother_is_life:
- rec.orphan_status = 'mother'
- # TODO FIXME: i commented these lines because this field doen't exist in model grant.benefit
- # else:
- # rec.orphan_type = ''
- # else:
- # rec.orphan_type = ''
-
- @api.onchange('birth_date')
- def onchange_category(self):
- for rec in self:
- rec.expenses_ids = False
- for expenses in rec.benefit_category_id:
- if expenses.state == 'second_pprove':
- for i in expenses.expenses_ids:
- expenses = {}
- expenses['expenses_type'] = i.expenses_type
- expenses['amount'] = i.amount
- rec.expenses_ids = [(0, 0, expenses)]
- expenses = self.env['benefit.expenses'].sudo().search(
- [('benefit_id', '=', self._origin.id), ('state', '=', 'accreditation')])
- for expenses_extra in expenses:
- expenses = {}
- expenses['expenses_type'] = expenses_extra.expenses_type
- expenses['amount'] = expenses_extra.amount
- expenses['note'] = expenses_extra.name
- rec.expenses_ids = [(0, 0, expenses)]
- # Todo
-
- def create_message(self, case):
- sms_template = self.env['benefit.sms.configuration'].sudo().search([('state', '=', case)])
- if sms_template:
- message = sms_template.case_text
- if '$اسم_المستفيد' in message:
- if self.name:
- message = message.replace("$اسم_المستفيد", self.name)
- else:
- raise ValidationError(_("عفواءً القالب المخصص يتوجب وجود اسم المستفيد"))
- if '$رقم_الهوية' in message:
- if self.id_number:
- message = message.replace("$رقم_الهوية", self.id_number)
- else:
- raise ValidationError(_("عفواءً القالب المخصص يتوجب وجود رقم الهوية"))
- if '$اسم_العائلة' in message:
- if self.institution_id:
- message = message.replace("$اسم_العائلة", self.institution_id.name)
- else:
- raise ValidationError(_("عفواءً القالب المخصص يتوجب وجود اسم العائلة"))
- return message
-
- def get_error_response(self, result):
- if result == "105":
- raise ValidationError(_("Sorry, there is not enough credit!"))
- if result == "102":
- raise ValidationError(_("Sorry, wrong username!"))
- if result == "103":
- raise ValidationError(_("Sorry, wrong password!"))
- if result == "106":
- raise ValidationError(_("Sorry, sender name is not available!"))
- if result == "1013":
- raise ValidationError(_("Sorry, no message has been posted!"))
- if result == "1011":
- raise ValidationError(_("Sorry, no message has been posted!"))
-
- @api.depends('name')
- def _compute_qr_code(self):
- qr = qrcode.QRCode(
- version=1,
- error_correction=qrcode.constants.ERROR_CORRECT_L,
- box_size=15,
- border=4,
- )
- name = self.name
- qr.add_data(name)
- qr.make(fit=True)
- img = qr.make_image()
- temp = BytesIO()
- img.save(temp, format="PNG")
- qr_image = base64.b64encode(temp.getvalue())
- self.qr_code = qr_image
-
- @api.onchange('bank_id')
- def _compute_prefix_iban(self):
- if self.bank_id:
- self.iban = self.bank_id.iban
-
- @api.onchange('weight', 'height')
- def _compute_obesity_rate(self):
- for rec in self:
- if rec.weight and rec.height:
- height = (rec.height / 100)
- rec.p_weight = (rec.weight / (height * height))
-
- @api.depends(
- 'expenses_ids',
- 'estimated_rent_amount',
- 'expenses_ids.deduct_from_family_income',
- 'expenses_ids.amount',
- 'family_debits_ids',
- 'family_debits_ids.deduct_from_family_income',
- 'family_debits_ids.monthly_installment',
- )
- def get_total_expenses(self):
- for ben in self:
- followers = ben.env['benefit.followers'].sudo().search([('benefit_id', '=', ben.id)])
- expenses = ben.env['expenses.line'].sudo().search([('benefit_id', '=', ben.id)])
- total_expenses = 0.0
- if ben.expenses_ids and ben.family_debits_ids:
- total_expenses = sum(ben.expenses_ids.filtered(lambda e: e.deduct_from_family_income).mapped('amount')) + sum(ben.family_debits_ids.filtered(lambda e: e.deduct_from_family_income).mapped('monthly_installment'))
- elif ben.expenses_ids and not ben.family_debits_ids:
- total_expenses = sum(ben.expenses_ids.filtered(lambda e: e.deduct_from_family_income).mapped('amount'))
- elif ben.family_debits_ids and not ben.expenses_ids:
- total_expenses = sum(ben.family_debits_ids.filtered(lambda e: e.deduct_from_family_income).mapped('monthly_installment'))
- if followers:
- ben.followers_total = len(followers)
- if expenses:
- ben.expenses_total = len(expenses)
- ben.total_expenses = total_expenses + ben.estimated_rent_amount
-
- def calculate_income(self,income, status, salary_ids):
- validation_setting = self.env["family.validation.setting"].search([], limit=1)
- max_income_for_mother = validation_setting.max_income_for_mother
- total = 0.0
- existing_mother_salary = salary_ids.filtered(lambda x: x.is_mother_salary == True)
- should_have_salary_line = (status == 'benefit' and income > max_income_for_mother)
- income_type = self.env['attachments.settings'].search([('is_mother_salary', '=', True)], limit=1)
- if should_have_salary_line:
- if not existing_mother_salary:
- self.env['salary.line'].create({
- 'benefit_id': self.id,
- 'is_mother_salary': True,
- 'salary_amount': income,
- 'income_type': income_type and income_type.id or False,
- 'approved': True,
- })
- elif existing_mother_salary:
- existing_mother_salary.write({'salary_amount': income})
- else:
- if existing_mother_salary:
- existing_mother_salary.sudo().unlink()
-
- @api.depends(
- 'salary_ids',
- 'salary_ids.salary_amount',
- 'salary_ids.approved',
- )
- def get_total_income(self):
- for rec in self:
- total = 0.0
- rec.total_income = 0.0
- if not rec.add_replacement_mother:
- if rec.mother_status == 'non_benefit':
- total = sum(rec.salary_ids.filtered(lambda e: e.approved and not e.is_mother_salary).mapped(
- 'salary_amount'))
- elif rec.mother_status == 'benefit':
- total = sum(
- rec.salary_ids.filtered(lambda e: e.approved).mapped('salary_amount'))
- rec.total_income = total
- if rec.add_replacement_mother:
- if rec.replacement_mother_status == 'non_benefit':
- total = sum(rec.salary_ids.filtered(lambda e: e.approved and not e.is_mother_salary).mapped(
- 'salary_amount'))
- elif rec.replacement_mother_status == 'benefit':
- total = sum(
- rec.salary_ids.filtered(lambda e: e.approved).mapped('salary_amount'))
- rec.total_income += total
-
- def get_mother_name(self):
- for rec in self:
- name = ''
- if all([rec.mother_name, rec.mother_second_name, rec.mother_third_name, rec.mother_family_name]):
- name = rec.mother_name + " " + rec.mother_second_name + " " + rec.mother_third_name + " " + rec.mother_family_name
- else:
- name = name
- return name
-
- def get_replacement_mother_name(self):
- for rec in self:
- name = ''
- if all([rec.replacement_mother_name, rec.replacement_mother_second_name, rec.replacement_mother_third_name,
- rec.replacement_mother_family_name]):
- name = rec.replacement_mother_name + " " + rec.replacement_mother_second_name + " " + rec.replacement_mother_third_name + " " + rec.replacement_mother_family_name
- else:
- name = name
- return name
-
- def add_or_replace_mother_as_member(self):
- FamilyMember = self.env['family.member']
- Relation = self.env['relation.settings'].search([('relation_type', '=', 'mother')], limit=1)
-
- for rec in self:
- mother_name = rec.get_mother_name()
- val = {
- 'name': mother_name,
- 'mother_first_name': rec.mother_name,
- 'mother_second_name': rec.mother_second_name,
- 'mother_third_name': rec.mother_third_name,
- 'mother_family_name': rec.mother_family_name,
- 'member_id_number': rec.mother_id_number,
- 'is_mother': True,
- 'birth_date': rec.mother_birth_date,
- 'gender': 'female',
- 'relationn': Relation.id,
- 'mother_marital_conf': rec.mother_marital_conf.id,
- 'member_location_conf': rec.mother_location_conf.id,
- 'age': rec.mother_age,
- 'is_work': rec.is_mother_work,
- 'member_income': rec.mother_income,
- 'education_status': rec.education_status,
- #'member_status': rec.mother_status,
- 'member_education_status_ids': [(5, 0)] + [(4, edu.id) for edu in rec.mother_education_status_ids],
- 'salary_certificate': [(6, 0, rec.mother_salary_certificate.ids)],
- }
-
- mother_family_member = rec.mother_family_member_id
- if mother_family_member:
- mother_family_member.write(val)
- else:
- val['benefit_id'] = rec.id
- mother_family_member = FamilyMember.create(val)
- rec.write({'mother_family_member_id': mother_family_member.id})
- rec.mother_diseases_attachment_ids.write({'member_id': mother_family_member.id})
- rec.mother_disabilities_attachment_ids.write({'member_id': mother_family_member.id})
-
- def add_or_replace_replacement_mother_as_member(self):
- FamilyMember = self.env['family.member']
-
- for rec in self:
- mother_name = rec.get_replacement_mother_name()
- val = {
- 'name': mother_name,
- 'mother_first_name': rec.replacement_mother_name,
- 'mother_second_name': rec.replacement_mother_second_name,
- 'mother_third_name': rec.replacement_mother_third_name,
- 'mother_family_name': rec.replacement_mother_family_name,
- 'member_id_number': rec.replacement_mother_id_number,
- 'is_mother': False,
- 'birth_date': rec.replacement_mother_birth_date,
- 'gender': 'female',
- 'relationn': rec.replacement_mother_relation.id,
- 'mother_marital_conf': rec.replacement_mother_marital_conf.id,
- 'member_location_conf': rec.replacement_mother_location_conf.id,
- 'age': rec.replacement_mother_age,
- 'is_work': rec.replacement_is_mother_work,
- 'member_income': rec.replacement_mother_income,
- 'education_status': rec.replacement_education_status,
- #'member_status': rec.replacement_mother_status,
- 'member_education_status_ids': [(5, 0)] + [(4, edu.id) for edu in rec.replacement_education_status_ids],
- 'salary_certificate': [(6, 0, rec.replacement_mother_salary_certificate.ids)],
- }
-
- if rec.replacement_mother_family_member_id:
- rec.replacement_mother_family_member_id.write(val)
- replacement_member = rec.replacement_mother_family_member_id
- else:
- val['benefit_id'] = rec.id
- replacement_member = FamilyMember.create(val)
- rec.write({'replacement_mother_family_member_id': replacement_member.id})
-
- rec.replacement_mother_diseases_attachment_ids.write({'member_id': replacement_member.id})
- rec.replacement_mother_disabilities_attachment_ids.write({'member_id': replacement_member.id})
-
- def get_members_count(self):
- for ben in self:
- if ben.id:
- ben.benefit_member_count = len(ben.member_ids.filtered(lambda x: x.member_status == 'benefit'))
- if ben.add_replacement_mother and not ben.replacement_mother_family_member_id and ben.replacement_mother_status == 'benefit':
- ben.benefit_member_count += 1
-
- if not ben.mother_family_member_id and ben.mother_status == 'benefit':
- ben.benefit_member_count += 1
- else:
- ben.benefit_member_count = 0.0
-
- def get_non_members_count(self):
- for ben in self:
- if ben.id:
- ben.non_member_count = len(ben.member_ids.filtered(lambda x: x.member_status == 'non_benefit'))
- else:
- ben.non_member_count = 0.0
-
- @api.depends('benefit_member_count','total_income','total_expenses')
- def get_member_income(self):
- for ben in self:
- family_income = ben.total_income - ben.total_expenses
- if ben.benefit_member_count:
- if ben.benefit_member_count > 3:
- ben.member_income = family_income / ben.benefit_member_count
- elif ben.benefit_member_count <= 3:
- ben.member_income = family_income / 3
- else:
- ben.member_income = family_income
-
- @api.depends("member_income")
- def get_benefit_category(self):
- default_category = self.env['benefit.category'].sudo().search(
- [('is_benefit', '=', False)], limit=1
- )
- for record in self:
- if record.benefit_member_count <= 0:
- record.benefit_category_id = default_category.id if default_category else False
- continue
- category = self.env['benefit.category'].sudo().search(
- [
- ('mini_income_amount', '<=', record.member_income),
- ('max_income_amount', '>=', record.member_income)
- ],
- limit=1
- )
- record.benefit_category_id = category.id if category else default_category.id
-
- def open_followers(self):
- context = {}
- context['default_benefit_id'] = self.id
- return {
- 'name': _('Benefit Followers'),
- 'view_type': 'form',
- 'view_mode': 'tree,form',
- 'views': [(self.env.ref(
- 'odex_benefit.benefit_followers_tree').id, 'tree'),
- (self.env.ref('odex_benefit.benefit_followers_form').id, 'form')],
- 'res_model': 'benefit.followers',
- 'type': 'ir.actions.act_window',
- 'context': context,
- 'domain': "[('benefit_id','=',%s)]" % (self.id),
- 'target': 'current',
- }
-
- def open_expenses(self):
- context = {}
- context['default_benefit_id'] = self.id
- return {
- 'name': _('Benefit Expenses'),
- 'view_type': 'form',
- 'view_mode': 'tree,form',
- 'views': [(self.env.ref(
- 'odex_benefit.benefit_expenses_tree').id, 'tree'),
- (self.env.ref('odex_benefit.expenses_line_form').id, 'form')],
- 'res_model': 'benefit.expenses',
- 'type': 'ir.actions.act_window',
- 'context': context,
- 'domain': "[('benefit_id','=',%s)]" % (self.id),
- 'target': 'current',
- }
-
- @api.depends('father_birth_date')
- def _compute_get_father_age(self):
- for rec in self:
- if rec.father_birth_date:
- today = date.today()
- day = datetime.strptime(str(rec.father_birth_date), DEFAULT_SERVER_DATE_FORMAT)
- age = rd(today, day)
- rec.father_age = age.years
- else:
- rec.father_age = 0
-
- @api.depends('mother_birth_date')
- def _compute_get_mother_age(self):
- for rec in self:
- if rec.mother_birth_date:
- today = date.today()
- day = datetime.strptime(str(rec.mother_birth_date), DEFAULT_SERVER_DATE_FORMAT)
- age = rd(today, day)
- rec.mother_age = age.years
- else:
- rec.mother_age = 0
-
- @api.depends('replacement_mother_birth_date')
- def _compute_get_replacement_mother_age(self):
- for rec in self:
- if rec.replacement_mother_birth_date:
- today = date.today()
- day = datetime.strptime(str(rec.replacement_mother_birth_date), DEFAULT_SERVER_DATE_FORMAT)
- age = rd(today, day)
- rec.replacement_mother_age = age.years
- else:
- rec.replacement_mother_age = 0
-
- def action_finish_edit(self):
- for rec in self:
- group_e = self.env.ref('odex_benefit.group_benefit_edit', False)
- group_e.write({'users': [(3, self.user_id.id)]})
- rec.state = rec.old_stage
-
- # @api.multi
- def edit_password(self):
- if self.user_id:
- self.user_id.sudo().action_reset_password()
-
- def create_family_partner(self):
- bank_val = {
- 'acc_number':self.acc_number,
- 'acc_holder_name':self.acc_holder_name,
- 'bank_id':self.bank_id.id,
- }
- partner = self.env['res.partner'].create({
- 'name': self.name,
- 'email': self.email,
- 'phone': self.phone,
- # 'account_type':'family',
- 'is_family': True,
- 'code':self.code,
- 'bank_ids': [(0,0,bank_val)]
- })
- self.partner_id = partner.id
- # def create_member_partner(self):
- # # bank_val = {
- # # 'acc_number':self.acc_number,
- # # 'partner_id':self.account_holder,
- # # 'bank_name':self.bank_name,
- # # }
- # partner = self.env['res.partner'].create({
- # 'name': self.name,
- # 'email': self.email,
- # 'phone': self.phone,
- # 'account_type':'member',
- # 'code':self.code,
- # # 'bank_ids': [(0,0,bank_val)]
- # })
- # self.partner_id = partner.id
-
- def create_user(self):
- bank_val = {
- 'acc_number':self.acc_number,
- 'acc_holder_name':self.acc_holder_name,
- 'bank_id':self.bank_id.id,
- }
- for follower in self['message_follower_ids']:
- follower.sudo().unlink()
- if not self.partner_id:
- partner = self.create_family_partner()
- self.partner_id.write({
- 'name': self.name,
- 'email': self.email,
- 'phone': self.phone,
- # 'account_type': 'family',
- 'is_family': True,
- 'code': self.code,
- })
- if bank_val['acc_number'] and bank_val['acc_holder_name'] and bank_val['bank_id']:
- self.partner_id.write({
- 'bank_ids': [(0,0,bank_val)]
- })
- user = self.env['res.users'].sudo().with_context(no_reset_password=True).create({
- 'name': self.name,
- 'login': self.sms_phone or self.email,
- 'partner_id': self.partner_id.id,
- 'active': True,
- 'otp_mobile_phone': self.sms_phone,
- })
- self.user_id = user.id
- if self.password:
- user.sudo().write({'password': self.password, })
-
- user.sudo().write({
- 'groups_id': [(3, self.env.ref('base.group_user', False).id)],
- })
- user.sudo().write({
- 'groups_id': [(4, self.env.ref('base.group_portal', False).id)],
- })
-
- # @api.multi
- def send_approval_benefit_email(self):
- """Send approval email when benefit registration is accepted"""
- template = self.env.ref('odex_benefit.approval_benefit_email', False)
- if not template:
- return
- template.with_context(lang=self.env.user.lang).send_mail(self.id, force_send=True, raise_exception=False)
-
- # @api.multi
- def _send_notification(self, partner_ids, state):
- """Send notification when entity state changes"""
- subject = _('Beneficial')
- state_label = dict(self.fields_get(allfields=['state'])['state']['selection'])[state]
- body = ' '.join((_(u'The Beneficiaries '), self.name, _(u' State changed to '), state_label, u'.')).encode(
- 'utf-8')
- partner_list_ids = []
- for id in partner_ids:
- partner_list_ids.append(id.id)
- message_vals = {
- 'subject': subject,
- 'body': body,
- 'partner_ids': partner_list_ids,
- # 'model': self._name,
- # 'res_id': self.id,
- }
- test = self.sudo().message_post(message_type="notification", subtype_xmlid="mt_comment",
- **message_vals)
-
- def send_black_list_email(self):
- """Send black list email when entity black list"""
- template = self.env.ref('odex_benefit.black_list_entity_email', False)
- if not template:
- return
- template.with_context(lang=self.env.user.lang).send_mail(self.id, force_send=True, raise_exception=False)
-
- # @api.multi
- def send_remove_from_black_list_email(self):
- """Send black list email when entity black list"""
- template = self.env.ref('odex_benefit.black_list_remove_benefit_email', False)
- if not template:
- return
- template.with_context(lang=self.env.user.lang).send_mail(self.id, force_send=True, raise_exception=False)
-
- # # Validation Opertaion
- # @api.onchange('phone', 'phone2','sms_phone')
- # def _onchange_mobile_validation(self):
- # if self.phone:
- # if self.phone.startswith('+966'):
- # phone = self.phone[4:]
- # self.phone = phone
- # if re.match(SAUDI_MOBILE_PATTERN, self.phone) == None:
- # raise ValidationError(
- # _('Enter a valid Saudi mobile number'))
- # if self.phone2:
- # if self.phone2.startswith('+966'):
- # phone2 = self.phone2[4:]
- # self.phone2 = phone2
- # if re.match(SAUDI_MOBILE_PATTERN, self.phone2) == None:
- # raise ValidationError(
- # _('Enter a valid Saudi mobile number'))
- # if self.sms_phone:
- # if self.sms_phone.startswith('+966'):
- # sms_phone = self.sms_phone[4:]
- # self.sms_phone = sms_phone
- # if re.match(SAUDI_MOBILE_PATTERN, self.sms_phone) == None:
- # raise ValidationError(
- # _('Enter a valid Saudi mobile number'))
-
- @api.onchange('phone', 'phone2','sms_phone')
- def _onchange_phone_numbers(self):
- phone_numbers = {
- 'الهاتف': self.phone,
- 'رقم الجوال الثاني': self.phone2,
- 'رقم الجوال للتواصل': self.sms_phone,
- }
-
- # Check each ID number for 10-digit format and uniqueness within the parent model
- unique_ids = set()
- for label, phone_number in phone_numbers.items():
- if phone_number:
- if re.match(SAUDI_MOBILE_PATTERN,phone_number) == None:
- raise ValidationError(
- _('Enter a valid Saudi mobile number'))
- if phone_number in unique_ids:
- raise ValidationError(_("%s must be unique within the same record.") % label)
- unique_ids.add(phone_number)
-
- # Check for uniqueness against `member_phone` in child records and across database records
- for member in self.member_ids:
- if member.member_phone and member.member_phone in unique_ids:
- raise ValidationError(
- _("The Phone Number %s in the Family Members list must be unique across the record.") % member.member_phone)
- # Check for duplicate IDs across records in the database
- for phone_number in unique_ids:
- duplicate_record_family = self.env['grant.benefit'].search([
- '|', '|', ('phone', '=', phone_number), ('phone2', '=', phone_number),
- ('sms_phone', '=', phone_number), ('id', '!=', self._origin.id)
- ], limit=1)
- duplicate_record_member = self.env['family.member'].search([('member_phone', '=', phone_number)], limit=1)
- if duplicate_record_family:
- raise ValidationError(
- _("The phone number {} already exists in family with code {}.").format(
- phone_number, duplicate_record_family.code))
- if duplicate_record_member:
- raise ValidationError(
- _("The phone {} already exists in family with code {}.").format(
- phone_number, duplicate_record_member.benefit_id.code))
-
- @api.onchange('email')
- def onchange_email(self):
- if self.email:
- for rec in self:
- exist = self.search([('email', '=', rec.email)])
- if exist:
- raise ValidationError(
- _('The Email Already Exist!'))
-
- @api.onchange('sms_phone')
- def onchange_sms_phone(self):
- if self.sms_phone:
- for rec in self:
- exist = self.search([('sms_phone', '=', rec.sms_phone)])
- if exist:
- raise ValidationError(
- _('The SMS phone Already Exist!'))
-
- @api.onchange('acc_number')
- def onchange_acc_number(self):
- if self.acc_number:
- # Check if the value is numeric before anything else
- if not self.acc_number.isdigit():
- raise ValidationError(_("The account number should contain only digits."))
-
- # Check if the account number contains exactly 22 digits
- if len(self.acc_number) != 22:
- raise ValidationError(_("The IBAN number must contain exactly 22 digits."))
-
- # Check if the account number already exists in the partner bank or benefit
- partner_exist = self.env['res.partner.bank'].search([('acc_number', '=', self.acc_number)], limit=1)
- benefit_exist = self.search([('acc_number', '=', self.acc_number)], limit=1)
-
- if partner_exist or benefit_exist:
- raise ValidationError(_("The account number already exists!"))
-
- @api.onchange('mother_marital_conf', 'mother_location_conf', 'mother_income')
- def _onchange_mother_info(self):
- res = {}
- if self.mother_status == 'non_benefit':
- res['warning'] = {'title': _('ValidationError'),
- 'message': _('Not Benefit')}
- return res
-
- @api.onchange('replacement_mother_marital_conf', 'replacement_mother_location_conf', 'replacement_mother_income')
- def _onchange_replacement_mother_info(self):
- res = {}
- for rec in self:
- if rec.replacement_mother_status == 'non_benefit':
- res['warning'] = {'title': _('ValidationError'),
- 'message': _('Not Benefit')}
- return res
-
- def create_scheduled_visit(self):
- records = self.env["grant.benefit"].search([('state', '=', 'second_approve')])
- recurrence_visit_id = self.env.ref('odex_benefit.recurrence_visit')
- period_unit = {
- recurrence_visit_id.recurrence_period: recurrence_visit_id.recurrence_interval
- }
- for rec in records.filtered(lambda r: r.last_visit_date and (r.last_visit_date + rd(**period_unit)).date() <= fields.Date.context_today(self)):
- self.env['visit.location'].create({
- 'benefit_id': rec.id,
- 'visit_date': date.today(),
- 'visit_types': recurrence_visit_id.id,
- 'selector': 'researcher',
- 'researcher_id': rec.researcher_id.id,
- # 'researcher_team': rec.researcher_team.id,
- 'state': 'draft'
- })
-
- def create_manual_visit(self):
- self.env['visit.location'].create({
- 'benefit_id': self.id,
- 'visit_date': date.today(),
- 'visit_types': 2,
- # 'selector': 'researcher',
- 'researcher_id': self.researcher_id.id,
- # 'researcher_team': rec.researcher_team.id,
- 'state': 'draft'
- })
- def change_attachment_status(self):
- obj = self.env["grant.benefit"].search([])
- for attach in obj.attachment_ids:
- attach.get_status()
-
- # Notifications
- def send_expiry_date_notification(self):
- self.change_attachment_status()
- obj = self.env["grant.benefit"].search([])
- for rec in obj:
- for attach in rec.attachment_ids:
- if attach.attach_status == 'expired':
- template = self.env.ref('odex_benefit.attachment_expiration_family_email_template', False)
- if not template:
- return
- template.with_context(lang=self.env.user.lang).send_mail(rec.id, force_send=True,
- raise_exception=False)
- #Update data automatically daily
- def update_data_automatically(self):
- obj = self.env["grant.benefit"].search([])
- for member in obj.member_ids:
- # member._compute_get_age_date()
- member.check_member_status()
- self.action_auto_suspend()
-
-
-class BenefitFollowers(models.Model):
- _name = 'benefit.followers'
- _inherit = ['mail.thread', 'mail.activity.mixin']
-
- benefit_id = fields.Many2one('grant.benefit', )
- name = fields.Many2one('grant.benefit', domain="[('is_responsible','=',False)]")
- follower_type = fields.Selection(
- [('benefit', 'benefit'), ('orphan', 'orphan'), ('widow', 'widow'), ('poor', 'poor'), ('other', 'other'),
- ], string='Benefit Type', tracking=True, related="name.benefit_type", )
- birth_date = fields.Date(related="name.birth_date", string="Birth Date")
- age = fields.Integer(string="Age", compute='_compute_get_age_date', store=True)
- gender = fields.Selection(selection=[('male', 'Male'), ('female', 'Female')], string="Gender",
- related="name.gender", )
- is_live_with_family = fields.Boolean('Is Live With Family')
-
- @api.depends('birth_date')
- def _compute_get_age_date(self):
- for rec in self:
- if rec.birth_date:
- today = date.today()
- day = datetime.strptime(rec.birth_date, DEFAULT_SERVER_DATE_FORMAT)
- age = rd(today, day)
- rec.age = age.years
-
-
-class WidowFamily(models.Model):
- _name = 'widow.family'
-
- benefit_id = fields.Many2one('grant.benefit')
- widow_name = fields.Many2one('grant.benefit', domain="[('benefit_type','=','widow')]", string='Widow Name')
- widows_husband = fields.Char('Widows Husband', related="widow_name.husband_name")
- widows_husband_id = fields.Char('Widows Husband ID', related="widow_name.husband_id")
- date_death_husband = fields.Date(related="widow_name.date_death_husband")
-
-
-class divorceeFamily(models.Model):
- _name = 'divorcee.family'
-
- benefit_id = fields.Many2one('grant.benefit')
- divorcee_name = fields.Many2one('grant.benefit', 'divorcee Name')
- divorcee_husband = fields.Char('Widows Husband', related="divorcee_name.husband_name")
- divorcee_husband_id = fields.Char('Widows Husband ID', related="divorcee_name.husband_id")
- date_divorcee = fields.Date(related="divorcee_name.date_divorcee")
-
-
-class ExternalBenefit(models.Model):
- _name = 'external.benefits'
- _inherits = {'res.partner': 'partner_id'}
- _inherit = ['mail.thread', 'mail.activity.mixin']
-
- location = fields.Char(string='location')
- benefit_nationality = fields.Many2one('res.country', 'Benefit Nationality')
- block = fields.Char('Benefit Block')
- work = fields.Char()
- partner_id = fields.Many2one('res.partner', string='partner', required=True, ondelete="cascade")
-
- @api.onchange('first_name', 'second_name', 'middle_name', 'family_name')
- def get_benefit_name(self):
- for rec in self:
- if rec.first_name and rec.second_name and rec.middle_name and rec.family_name:
- rec.name = rec.first_name + " " + rec.second_name + " " + rec.middle_name + " " + rec.family_name
-
- def create_partner(self):
- partner = self.env['res.partner'].create({
- 'name': self.name,
- 'email': self.email,
- 'phone': self.phone,
- # 'city': self.city_id.name if self.city_id else False,
- # 'country_id': self.country_id.id,
- })
- self.partner_id = partner.id
-
-
-# neighborhood representative
-class Representative(models.Model):
- _name = 'benefits.representative'
- _inherits = {'res.partner': 'partner_id'}
- _inherit = ['mail.thread', 'mail.activity.mixin']
-
- location = fields.Char(string='location')
- block = fields.Char('Benefit Block')
- work = fields.Char()
- partner_id = fields.Many2one('res.partner', string='partner', required=True, ondelete="cascade")
diff --git a/odex25_ensan/odex_benefit/models/benefit_config.py b/odex25_ensan/odex_benefit/models/benefit_config.py
deleted file mode 100644
index d8d76ee97..000000000
--- a/odex25_ensan/odex_benefit/models/benefit_config.py
+++ /dev/null
@@ -1,900 +0,0 @@
-# -*- coding: utf-8 -*-
-
-from odoo import models, fields, api, _
-from odoo.exceptions import ValidationError
-from random import randint
-from datetime import date
-import logging
-import os
-
-_logger = logging.getLogger(__name__)
-
-
-class BenefitCategory(models.Model):
- _name = 'benefit.category'
- _description = "Benefits - category"
-
- name = fields.Char(string="Category Name")
- description = fields.Char(string="Description")
- gender = fields.Selection(selection=[('male', _('Male')), ('female', _('Female')) ,('both', _('Both'))], string="Gender")
- age_from = fields.Integer(string="From")
- age_to = fields.Integer(string="To")
- benefit_ids = fields.One2many('grant.benefit', 'benefit_category_id', string="Category Benefits")
- benefits_total = fields.Integer(string="Benefit Total", compute="get_benefits_total")
- mini_income_amount = fields.Float(string="Min Income Amount")
- max_income_amount = fields.Float(string="Max Income Amount")
- expenses_ids = fields.One2many('expenses.line', 'category_id')
- is_benefit = fields.Boolean(string="Is Benefit",default=True)
- state = fields.Selection([('draft', 'Draft'),
- ('approve', 'Approved'),
- ('rejected', 'Rejected'), ], default='draft')
-
- def get_benefits_total(self):
- for rec in self:
- rec.benefits_total = len(rec.benefit_ids)
-
- def action_approve(self):
- self.state = 'approve'
-
- def action_reject(self):
- self.state = 'rejected'
-
- def open_benefits(self):
- return {
- 'name': _("Benefits"),
- 'view_type': 'form',
- 'view_mode': 'tree,form',
- 'views': [(self.env.ref(
- 'odex_benefit.grant_benefit_tree').id, 'tree'),
- (self.env.ref('odex_benefit.grant_benefit_form').id, 'form')],
- 'res_model': 'grant.benefit',
- 'type': 'ir.actions.act_window',
- 'domain': [('id', 'in', self.benefit_ids.ids)],
- 'target': 'current',
- }
-
-
-class GrantFamily(models.Model):
- _name = 'benefit.family'
- _description = "Benefits - family"
-
- name = fields.Char(
- string='',
- required=False)
- responsible_benefit_id = fields.Many2one(
- 'grant.benefit',
- domain="[('is_responsible','=',True),('family_id','=',id)]")
- housing_id = fields.Many2one(
- 'benefit.housing')
- loan_ids = fields.Many2many('benefit.loans', 'family_id')
- total_expenses = fields.Float(
- compute='get_total_needs_percent',
- string='Total Expenses of Family',
- required=False)
- total_income = fields.Float(
- compute='get_total_needs_percent',
- string='Total Income of Family',
- required=False)
- benefit_needs_percent = fields.Float(
- compute='get_total_needs_percent',
- string='',
- store=True,
- required=False)
- is_producer = fields.Boolean(string='Producer')
- description = fields.Char(string="Description")
- benefits_total = fields.Integer(string="Benefit Total", compute="get_benefits_total", store=True)
- benefit_ids = fields.One2many('grant.benefit', 'family_id', string="Benefits")
-
- @api.depends("benefit_ids")
- def get_benefits_total(self):
- for rec in self:
- rec.benefits_total = len(rec.benefit_ids)
-
- def get_total_needs_percent(self):
- for rec in self:
- if rec.benefit_ids:
- percent = 0.0
- for amount in rec.benefit_ids:
- rec.total_income += amount.total_income
- rec.total_expenses += amount.total_expenses
- percent += amount.benefit_needs_percent
- rec.benefit_needs_percent = percent / len(rec.benefit_ids)
- else:
- rec.benefit_needs_percent = 0.0
- rec.total_income = 0.0
- rec.total_expenses = 0.0
-
-
- def open_benefits(self):
- return {
- 'name': "Benefits",
- 'view_type': 'form',
- 'view_mode': 'tree,form',
- 'views': [(self.env.ref(
- 'odex_benefit.grant_benefit_tree').id, 'tree'),
- (self.env.ref('odex_benefit.grant_benefit_form').id, 'form')],
- 'res_model': 'grant.benefit',
- 'type': 'ir.actions.act_window',
- 'domain': "[('family_id','=',%s)]" % (self.id),
- 'target': 'current',
- }
-
-
-class SportLine(models.Model):
- _name = 'sport.line'
- _description = "Benefits - sport"
-
- benefit_id = fields.Many2one(
- 'grant.benefit')
- sport_type = fields.Many2one(
- 'sport.type')
- sport_attendance = fields.Boolean(
- string='',
- required=False)
- Subtype = fields.Selection(
- string='Subtype',
- selection=[('daily', 'daily'),
- ('monthly', 'Monthly'),
- ('yearly', 'yearly'),
- ], )
- sport_time = fields.Selection(
- string='Sport Time',
- selection=[('morning', 'Morning'),
- ('day', 'day'),
- ('evening', 'evening'),
- ],
- required=False, )
- sport_club = fields.Char(
- string='',
- required=False)
- sport_amount = fields.Float(
- string='',
- required=False)
- sport_clothing = fields.Char(
- string='',
- required=False)
- sport_equipment = fields.Char(
- string='',
- required=False)
-
-
-class SportType(models.Model):
- _name = 'sport.type'
- _description = "Benefits - sport Type"
-
- name = fields.Char(
- string='',
- required=False)
- description = fields.Char(
- string='Description',
- required=False)
-
-
-class CraftSkills(models.Model):
- _name = 'craft.skills'
- _description = "Benefits - sport"
-
- name = fields.Char(
- string='',
- required=False)
- benefit_id = fields.Many2one(
- 'grant.benefit')
- is_invested = fields.Boolean(
- string='',
- required=False)
- skill_rating = fields.Float(
- string='',
- required=False)
- is_development = fields.Boolean(
- string='',
- required=False)
- is_capital = fields.Boolean(
- string='',
- required=False)
- is_work_place = fields.Boolean(
- string='',
- required=False)
- work_history = fields.Char(
- string='',
- required=False)
- achievements = fields.Char(
- string='',
- required=False)
- certificates = fields.Binary(string="")
- # Awards and certificates # TODO#
-
-
-class inclination(models.Model):
- _name = 'training.inclinations'
- _description = "Benefits - inclination"
-
- name = fields.Char(
- string='',
- required=False)
- benefit_id = fields.Many2one(
- 'grant.benefit')
- training_type_id = fields.Many2one('training.type',
- string='',
- required=False)
- is_invested = fields.Boolean(
- string='',
- required=False)
- training_rating = fields.Float(
- string='',
- required=False)
- is_development = fields.Boolean(
- string='',
- required=False)
- is_capital = fields.Boolean(
- string='',
- required=False)
- training_history = fields.Char(
- string='',
- required=False)
- book_history = fields.Char(
- string='What books has he read?',
- required=False)
- courses = fields.Char(
- string='What courses did he take?',
- required=False)
- steps = fields.Char(
- string='',
- required=False)
- training_future = fields.Char(
- string='',
- required=False)
- training_site = fields.Char(
- string='',
- required=False)
- training_records = fields.Char(
- string='',
- required=False)
- achievements = fields.Char()
- certificates = fields.Binary(string="")
- # Awards and certificates
-
-
-class BenefitBehaviors(models.Model):
- _name = 'benefit.behaviors'
- _description = "Benefits - behaviors"
-
- name = fields.Char(
- related='behavior_id.name')
- benefit_id = fields.Many2one(
- 'grant.benefit')
- behavior_id = fields.Many2one(
- 'benefit.behaviors.type')
- behavior_date = fields.Date(
- string='',
- required=False)
- need_help = fields.Boolean(
- string='',
- required=False)
-
-
-class BenefitBehaviorsType(models.Model):
- _name = 'benefit.behaviors.type'
- _description = "Benefits - behaviors type"
-
- name = fields.Char(
- string='',
- required=False)
- type = fields.Selection(
- string='',
- selection=[('negative', 'Negative'),
- ('positive', 'Positive'), ],
- required=False, )
-
-
-class Salary(models.Model):
- _name = 'salary.line'
- _description = "Benefits - Salary line"
-
- benefit_id = fields.Many2one(
- 'grant.benefit')
- currency_id = fields.Many2one('res.currency', related='benefit_id.currency_id')
- salary_type = fields.Char()
- income_type = fields.Many2one('attachments.settings',string='Income Type',domain="[('attach_type','=','income_attach')]")
- salary_amount = fields.Float(
- string='Income Amount',
- required=False)
- salary_attach = fields.Many2many('ir.attachment',string="Attachment")
- attach_start_date = fields.Date(string='Attach Start Date')
- attach_end_date = fields.Date(string='Attach End Date')
- is_required = fields.Boolean(string='Is Required?')
- is_mother_salary = fields.Boolean(string="Is Mother Salary", default=False)
- approved = fields.Boolean(string="Is Approved", default=False)
- is_default = fields.Boolean(string='Is Default?')
- state = fields.Selection(string='Status',selection=[('waiting', 'Waiting'),('accepted', 'Accepted'),('refused', 'Refused')],default="waiting")
- # total_salary = fields.Float(string="Total Salary", compute='_compute_total_salary',store=True)
-
- # @api.depends('salary_amount','state')
- # def _compute_total_salary(self):
- # total = 0
- # for record in self:
- # # Apply your custom condition here
- # records = self.env['salary.line'].search([('state', '=', 'accepted')])
- # for rec in records:
- # total += rec.salary_amount
- # record.total_salary = total
-
- @api.model
- def create(self, vals):
- if 'state' not in vals or vals.get('state') not in ['accepted', 'refused']:
- vals['state'] = 'waiting'
- return super(Salary, self).create(vals)
-
- def write(self, vals):
- if 'state' not in vals:
- for rec in self:
- if rec.state not in ['accepted', 'refused']:
- vals['state'] = 'waiting'
- break
- return super(Salary, self).write(vals)
-
- def action_accept(self):
- self.state = 'accepted'
-
- def action_refuse(self):
- self.state = 'refused'
-
- def get_salary_attachment_name(self):
- """Return salary attachment name without extension."""
- if self.salary_attach:
- return os.path.splitext(self.salary_attach.name)[0]
- return ''
-
- def get_notification_emails(self):
- """Return a list of valid emails to notify, removing False values."""
- emails = self.benefit_id.researcher_id.employee_id.mapped('work_email') or []
-
- emails.extend([
- self.benefit_id.branch_custom_id.branch.manager_id.work_email,
- self.benefit_id.branch_custom_id.branch.operation_manager_id.work_email
- ])
-
- # Remove False or None values
- emails = list(filter(None, emails)) # Filters out None and False values
-
- return ','.join(emails) if emails else 'admin@example.com'
-
- def action_send_attachment_expiry_email(self):
- """Send email notifications for attachments expiring today and log the body in the chatter."""
- today = date.today()
- salary_lines = self.search([('attach_end_date', '=', today)])
-
- mail_template = self.env.ref('odex_benefit.email_salary_attachment_expiry')
- if not mail_template:
- raise ValidationError("Salary Attachment Expiry Mail template not found!")
-
- for salary_line in salary_lines:
- # Render the email body
- email_body = mail_template._render_field('body_html', [salary_line.id], compute_lang=True)[salary_line.id]
-
- # Send the email
- mail_template.send_mail(salary_line.id, force_send=True)
-
- # Post the email body in the chatter of benefit_id
- if salary_line.benefit_id:
- salary_line.benefit_id.message_post(
- body=email_body,
- subtype_xmlid="mail.mt_note" # Log as a note in the chatter
- )
-
-
-class ibanBanks(models.Model):
- _inherit = 'res.bank'
- _description = "Add iban details in bank screen"
-
- iban = fields.Char("IBAN")
- code = fields.Char(string='Code')
-
-
-class benefitsExpensesLine(models.Model):
- _name = 'benefit.expenses'
- _description = "Benefits - expenses"
-
- name = fields.Char()
- benefit_id = fields.Many2one('grant.benefit')
- expenses_type = fields.Selection(
- string='',
- selection=[('governmental', 'Governmental Expenses'),
- ('medical', 'Medical Expenses'),
- ('transportation', 'Transportation Expenses'),
- ('debts', 'Debts Expenses'),
- ('pandemics', 'Pandemics Expenses'),
- ('living', 'Living Expenses'),
- ('educational', 'Educational Expenses'),
- ('clothing', 'Clothing Expenses'),
- ],
- required=False, )
- expenses_fees_type = fields.Selection(
- string='Fees Type',
- selection=[('fixed', 'Fixed'),
- ('dynamic', 'dynamic')], required=False, )
- medicine_type = fields.Selection(
- string='Medicine Type',
- selection=[('pills', 'pills'),
- ('drink', 'drink'),
- ('inhalation', 'inhalation')], required=False, )
- diseases_type = fields.Selection(
- string='Diseases Type',
- selection=[('chronic', 'chronic'),
- ('psycho', 'psycho'),
- ('organic', 'organic')], required=False, )
- trans_type = fields.Selection(
- string='trans Type',
- selection=[('general', 'General'),
- ('especially', 'Especially')], required=False, )
- debt_reason = fields.Char(string='', required=False)
- attach = fields.Binary(string="",attachment=True )
- debt_type = fields.Selection(selection=[('necessary', 'Necessary'),
- ('need', 'Need'),
- ('improve', 'to improve'),
- ('case', 'case or not'),
- ('Installed', 'Installed or not'),
- ])
- pandemics_explain = fields.Char(string='pandemics explain', required=False)
- amount = fields.Float()
- state = fields.Selection([('draft', 'Draft'),
- ('accreditation', 'Accreditation'),
- ], string='state', default="draft", tracking=True)
-
- def action_accepted(self):
- for i in self:
- i.state = 'accreditation'
-
-
-class cloth(models.Model):
- _name = 'benefit.cloth'
-
- name = fields.Char()
- benefit_id = fields.Many2one('grant.benefit')
- cloth_type = fields.Many2one('cloth.type')
- cloth_size = fields.Many2one('cloth.size')
- cloth_note = fields.Char()
-
-
-class ClothType(models.Model):
- _name = 'cloth.type'
-
- name = fields.Char()
-
-
-class ClothSize(models.Model):
- _name = 'cloth.size'
-
- name = fields.Char()
-
-
-class ExpensesLine(models.Model):
- _name = 'expenses.line'
-
- category_id = fields.Many2one(
- 'benefit.category')
- benefit_id = fields.Many2one('grant.benefit')
- currency_id = fields.Many2one('res.currency', related='benefit_id.currency_id')
- expenses_type_custom = fields.Many2one('expenses.type')
- expenses_type = fields.Selection(
- string='',
- selection=[('governmental', 'Governmental Expenses'),
- ('medical', 'Medical Expenses'),
- ('transportation', 'Transportation Expenses'),
- ('debts', 'Debts Expenses'),
- ('pandemics', 'Pandemics Expenses'),
- ('living', 'Living Expenses'),
- ('educational', 'Educational Expenses'),
- ('clothing', 'Clothing Expenses'),
- ],
- required=False, )
- amount = fields.Float()
- note = fields.Char()
- state = fields.Selection(string='Status', selection=[('waiting', 'Waiting'),('accepted', 'Accepted'), ('refused', 'Refused')],default="waiting")
- expense_attachments = fields.Many2many('ir.attachment','expenses_line_attachment_rel','expense_line_id','attachment_id',string="Attachment")
- deduct_from_family_income = fields.Boolean(string="Deduct from Family Income")
-
- def action_accept(self):
- # self.benefit_id.get_member_income()
- self.state = 'accepted'
-
-
- def action_refuse(self):
- self.state = 'refused'
-
-class EntityRefuseReason(models.Model):
- _name = 'entity.refuse_reason'
-
- name = fields.Text("Refuse Reason")
- user_id = fields.Many2one('res.users', 'Assigned to', default=lambda self: self.env.user, index=True)
- entity_id = fields.Many2one('grant.benefit', 'Benefit Id')
- date = fields.Datetime(string='Refuse Date', default=fields.Datetime.now)
-
-
-class specialization(models.Model):
- _name = 'specialization.specialization'
-
- name = fields.Char(
- string='',
- required=False)
- description = fields.Char(
- string='Description',
- required=False)
- is_scientific_specialty = fields.Boolean('Is Scientific Specialty?')
- is_medical_specialty = fields.Boolean('Is Medical Specialty?')
-
-
-class OtherAssociations(models.Model):
- _name = 'other.associations'
-
- name = fields.Char(
- string='',
- required=False)
- city_id = fields.Many2one(
- 'res.country.city')
- description = fields.Char(
- string='Description',
- required=False)
-
-
-class Associations(models.Model):
- _name = 'associations.line'
-
- benefit_id = fields.Many2one(
- 'grant.benefit')
- associations_ids = fields.Many2one(
- 'other.associations',
- string='Other Associations',
- required=False)
- support_type = fields.Selection(
- string='',
- selection=[('material', 'Material'),
- ('cash', 'cash'),
- ('both', 'Both'),
- ],
- required=False, )
- support_amount = fields.Float(
- string='',
- required=False)
- associations_description = fields.Text(
- string="",
- required=False)
-
-
-class Hospital(models.Model):
- _name = 'hospital.hospital'
-
- name = fields.Char(
- string='',
- required=False)
- Location = fields.Char(
- string='',
- required=False)
-
-
-class InsuranceCompany(models.Model):
- _name = 'insurance.company'
-
- name = fields.Char(
- string='',
- required=False)
- description = fields.Char(
- string='Description',
- required=False)
-
-
-class InsuranceType(models.Model):
- _name = 'insurance.type'
-
- name = fields.Char(
- string='',
- required=False)
- description = fields.Char(
- string='Description',
- required=False)
-
-
-class Cars(models.Model):
- _name = 'cars.line'
-
- name = fields.Char()
- benefit_id = fields.Many2one('grant.benefit')
- member_id = fields.Many2one('family.member',domain="[('benefit_id','=',benefit_id)]", string="Member")
- car_model = fields.Many2one('benefit.vehicle.model', ondelete='restrict')
- status = fields.Selection(
- string='',
- selection=[('good', 'Good'),
- ('bad', 'bad'), ],
- required=False, ) # TODO
-
- application_form = fields.Many2many('ir.attachment','cars_application_form_rel', 'cars_id','attachment_id',string="Application Form")
- driving_license = fields.Many2many('ir.attachment','cars_driving_license_rel','cars_id','attachment_id',string="Driving License")
- owner_identity = fields.Many2many('ir.attachment','cars_owner_identity_rel','cars_id', 'attachment_id',string="Owner Identity")
-
-
-
-class TrainingType(models.Model):
- _name = 'training.type'
-
- name = fields.Char()
-
-
-class Committees(models.Model):
- _name = 'committees.line'
-
- name = fields.Char()
- employee_id = fields.Many2many('hr.employee')
- type = fields.Selection(
- string='',
- selection=[('male', 'Men'),
- ('female', 'women'),
- ('both', 'combined'),
- ],
- required=False, )
- branch_custom_id = fields.Many2one("branch.settings", string="Branch")
- active = fields.Boolean('Active', default=True)
- benefit_count = fields.Integer(compute="get_benefit_count")
-
- def get_benefit_count(self):
- for record in self:
- benefit_ids = self.env['grant.benefit'].search([('researcher_id', 'in', record.ids)])
- record.benefit_count = len(benefit_ids)
-
- def action_view_benefits(self):
- return {
- 'name': _('Benefits'),
- 'type': 'ir.actions.act_window',
- 'res_model': 'grant.benefit',
- 'view_mode': 'tree,form',
- 'domain': [('researcher_id', 'in', self.ids)],
- 'target': 'current',
- }
-
-class ResDistricts(models.Model):
- _name = 'res.districts'
-
- name = fields.Char(string="Name")
- meal_card = fields.Boolean(string='Meal Card')
- city_id = fields.Many2one('res.country.city')
- branch_custom_id = fields.Many2one("branch.settings", string="Branch", domain="[('city_id', '=', city_id)]")
-
-class VisitsSettings(models.Model):
- _name = 'visits.types'
-
- name = fields.Char(string="Name", required=True)
- creation_method = fields.Selection(
- [('manual', 'Manual'),('automatic', 'Automatic')],
- string="Creation Method",
- default='manual',
- required=True,
- help="Whether the visit is entered manually or created automatically"
- )
- recurrence_interval = fields.Integer(
- string="Recurrence Interval",
- default=1,
- help="Determines how often visits are created automatically"
- )
- recurrence_period = fields.Selection([
- ('days', 'Days'),
- ('weeks', 'Weeks'),
- ('months', 'Months')
- ], string="Recurrence Period", default='days',
- help="Time unit for recurrence")
- otp_verification = fields.Boolean(
- string="OTP Verification",
- default=False,
- help="Whether this visit requires OTP confirmation from the family"
- )
- otp_validity_minutes = fields.Integer(
- string="OTP Validity (Minutes)",
- default=5,
- help="OTP code validity duration in minutes"
- )
- active = fields.Boolean(
- string="Active",
- default=True
- )
- survey_id = fields.Many2one(
- 'survey.survey',
- string="Evaluation Survey"
- )
-
-class SurveySetting(models.Model):
- _name = 'survey.setting'
-
- survey_url = fields.Char("Survey URL")
-
-class SuspendReason(models.Model):
- _name = 'suspend.reason'
- _description = "Suspend - Reason"
-
- name = fields.Char(string="Name", required=True)
- is_stop_reason = fields.Boolean(string="Stop Reason",default=False)
- is_reject_reason = fields.Boolean(string="Reject Reason",default=False)
- is_return_reason = fields.Boolean(string="Return Reason",default=False)
- is_family_return_reason = fields.Boolean(string="Family Return Reason",default=False)
- is_incomplete_visit_reason = fields.Boolean(string="Incomplete Visit Reason",default=False)
- active = fields.Boolean(default=True)
-
-class ReturnReason(models.Model):
- _name = "return.reason"
- _description = "Return Reasons"
-
- name = fields.Char(string="Name", required=True)
- active = fields.Boolean(string="Active", default=True)
-
-class BranchSettings(models.Model):
- _name = 'branch.settings'
- _description = "Branch Settings"
-
- name = fields.Char(related='branch.name')
- branch = fields.Many2one('hr.department',string='Branch',domain =[('is_branch', '=', True)])
- branch_type = fields.Selection(
- selection=[
- ('branches', 'Branches'),
- ('governorates', 'Governorates')],
- string='Branch Type')
- city_id = fields.Many2one('res.country.city')
- has_employees = fields.Boolean('Has Employees' ,defualt=True)
-
-class RelationSettings(models.Model):
- _name = 'relation.settings'
- _description = "Relation Settings"
-
- name = fields.Char(string='name')
- relation_type = fields.Selection(
- [('son', _('Son')), ('daughter', _('Daughter')),('mother', _('Mother')),('replacement_mother', _('Replacement Mother')),('other relation', _('Other Relation'))])
- age_difference = fields.Integer()
-
-class LocationSettings(models.Model):
- _name = 'location.settings'
- _description = "Location Settings"
-
- name = fields.Char(string='name')
- location_type = fields.Selection([('member', _('Member')), ('mother_location', _('Mother Location'))])
- is_benefit = fields.Boolean(string='Is Benefit?')
- is_far_from_family = fields.Boolean(string='Is Far From Family?')
-
-class AttachmentsSettings(models.Model):
- _name = 'attachments.settings'
- _description = "Attachments Settings"
- _order = 'family_appearance_seq,member_appearance_seq,income_appearance_seq asc'
-
- name = fields.Char(string='name')
- hobby_id = fields.Many2one('hobbies.settings',string='Hobbies')
- diseases_id = fields.Many2one('diseases.settings',string='Diseases')
- disabilities_id = fields.Many2one('disabilities.settings',string='Disabilities')
- attach_type = fields.Selection(
- [('family_attach', _('Family Attach')), ('member_attach', _('Member Attach')), ('hobbies_attach', _('Hobbies Attach')),
- ('diseases_attach', _('Diseases Attach')), ('disabilities_attach', _('Disabilities Attach')), ('income_attach', _('Income Attach')), ('exams_attach', _('Exams Attach'))])
- is_required = fields.Boolean(string='Is Required?')
- is_default = fields.Boolean(string='Is Default?')
- show_in_portal = fields.Boolean(default=True)
- family_appearance_seq = fields.Integer(string='Appearance Sequence')
- member_appearance_seq = fields.Integer(string='Appearance Sequence')
- income_appearance_seq = fields.Integer(string='Appearance Sequence')
- is_mother_salary = fields.Boolean(string="Is Mother Salary", default=False)
-
-class EducationIlliterateReason(models.Model):
- _name = 'education.illiterate.reason'
- _description = "Education Illiterate Reason"
-
- name = fields.Char(string='name')
-
-
-class EducationDelayReason(models.Model):
- _name = 'education.delay.reason'
- _description = "Education Delay Reason"
-
- name = fields.Char(string='Name', required=True)
-
-class IncomeType(models.Model):
- _name = 'income.type'
- _description = "Income Type"
-
- name = fields.Char(string='name')
-
-class LoanGiver(models.Model):
- _name = 'loan.giver'
- _description = "LoanGiver"
-
- name = fields.Char(string='name')
-
-class LoanReason(models.Model):
- _name = 'loan.reason'
- _description = "Loan Reason"
-
- name = fields.Char(string='name')
-
-class HobbiesSettings(models.Model):
- _name = 'hobbies.settings'
-
- name = fields.Char(string="Name")
-
-class DiseasesSettings(models.Model):
- _name = 'diseases.settings'
-
- name = fields.Char(string="Name")
-
-class DisabilitiesSettings(models.Model):
- _name = 'disabilities.settings'
-
- name = fields.Char(string="Name")
-
-class ExceptionReason(models.Model):
- _name = 'exception.reason'
-
- name = fields.Char(string="Name")
-
-class MaritalStatus(models.Model):
- _name = 'marital.status'
-
- name = fields.Char(string="Name")
- is_benefit = fields.Boolean(string='Is Benefit?')
- is_dead = fields.Boolean(string='Is Dead?')
-
-class AgeCategory(models.Model):
- _name = 'age.category'
-
- min_age = fields.Integer(string="From")
- max_age = fields.Integer(string="To")
- name = fields.Char(string="Name", compute="_compute_name", store=True)
-
- @api.depends('min_age', 'max_age')
- def _compute_name(self):
- for record in self:
- if record.min_age is not None and record.max_age is not None:
- record.name = f"[{record.min_age}:{record.max_age}]"
- else:
- record.name = ""
-
-class ComplaintsCategory(models.Model):
- _name = 'complaints.category'
-
- def _get_default_color(self):
- return randint(1, 11)
-
- name = fields.Char('Category Name', required=True, translate=True)
- color = fields.Integer('Color', default=_get_default_color)
-
-
-class ServiceAttachmentsSettings(models.Model):
- _name = 'service.attachments.settings'
- _description = "Service Attachments Settings"
-
- name = fields.Char(string='name')
- service_attach = fields.Many2many('ir.attachment','rel_service_attachments', 'service_id', 'attach_id',string="Attachment")
- service_type = fields.Selection(
- [('rent', 'Rent'), ('home_restoration', 'Home Restoration'), ('alternative_housing', 'Alternative Housing'),
- ('home_maintenance', 'Home Maintenance'), ('complete_building_house', 'Complete Building House'), ('electrical_devices', 'Electrical Devices'),
- ('home_furnishing', 'Home furnishing')
- , ('electricity_bill', 'Electricity bill'), ('water_bill', 'Water bill'), ('buy_car', 'Buy Car'),
- ('recruiting_driver', 'Recruiting Driver')
- , ('transportation_insurance', 'Transportation Insurance'), ('debits', 'Debits'),
- ('health_care', 'Health Care'),
- ('providing_medicines_medical_devices_and_needs_the_disabled',
- 'Providing Medicines Medical Devices And Needs The Disabled'),
- ('recruiting_domestic_worker_or_nurse', 'Recruiting a domestic worker or nurse'), ('marriage', 'Marriage'),
- ('eid_gift', 'Eid gift'),
- ('winter_clothing', 'Winter clothing'), ('ramadan_basket', 'Ramadan basket'),
- ('natural_disasters', 'Natural disasters'), ('legal_arguments', 'Legal arguments')],string='Service Type',related="service_id.service_type")
- service_id = fields.Many2one('services.settings',string='Service')
- service_request_id = fields.Many2one('service.request',string='Service Request')
- previous_service_attachment_settings_id = fields.Many2one('service.attachments.settings', readonly=True)
- notes = fields.Text(string='Notes')
-
-class HomeMaintenanceItems(models.Model):
- _name = 'home.maintenance.items'
-
- maintenance_items_id = fields.Many2one('home.maintenance.lines', string="Maintenance Items")
- service_request_id = fields.Many2one('service.request',string='Service Request')
-
-class HomeFurnishingItems(models.Model):
- _name = 'home.furnishing.items'
-
- home_furnishing_items = fields.Many2one('home.furnishing.lines', string='Furnishing Items')
- furnishing_cost = fields.Float(string='Furnishing Cost')
- price_first = fields.Float(string='Price First')
- price_first_attach = fields.Many2many('ir.attachment','rel_first_price_attachments', 'furnishing_id', 'attach_id',string="First Price Attachment")
- price_second = fields.Float(string='Price Second')
- price_second_attach = fields.Many2many('ir.attachment','rel_second_price_attachments', 'furnishing_id', 'attach_id',string="Second Price Attachment")
- service_request_id = fields.Many2one('service.request',string='Service Request')
diff --git a/odex25_ensan/odex_benefit/models/benefit_need.py b/odex25_ensan/odex_benefit/models/benefit_need.py
deleted file mode 100644
index 6e49135a4..000000000
--- a/odex25_ensan/odex_benefit/models/benefit_need.py
+++ /dev/null
@@ -1,329 +0,0 @@
-from odoo import fields, models, api, _
-
-
-class BenefitsNeeds(models.Model):
- _name = 'benefits.needs'
- _inherit = ['mail.thread', 'mail.activity.mixin']
- _description = 'percentage of need of benefit '
-
- name = fields.Char(string='', required=False)
- benefit_need_type = fields.Selection(
- string='',
- selection=[('special', 'special (for one)'),
- ('general', 'general(for group)'), ],
- required=False, )
- date = fields.Datetime(
- string='',
- required=False)
- benefit_id = fields.Many2one(
- 'grant.benefit',
- string='',
- required=False)
- description = fields.Char(
- string='',
- required=False)
- benefit_type = fields.Selection(
- string='Benefits Type',
- selection=[('orphans', _('orphans')),
- ('widows', _('widows')),
- ('both', _('Both')),
- ],
- compute='_onchange_benefit_ids',
- required=False, store=True)
- need_status = fields.Selection(string='',
- selection=[('urgent', 'urgent'),
- ('not_urgent', 'Not urgent'), ],
- required=False, )
- need_category = fields.Many2one('needs.categories', required=False)
- category_name = fields.Char(related='need_category.name')
- need_type_ids = fields.Many2many('product.product', string='')
- city_id = fields.Many2one('res.country.city')
- city_name = fields.Char(related='city_id.name')
- benefit_ids = fields.Many2many('grant.benefit', string='')
- target_amount = fields.Float(string='', compute="_onchange_paid_amount")
- f_amount = fields.Float(string='')
- paid_amount = fields.Float(string='', compute='_onchange_paid_amount')
- remaining_amount = fields.Float(string='', compute='_onchange_paid_amount')
- completion_ratio = fields.Float(string='', compute='_onchange_paid_amount')
- payments_ids = fields.One2many('needs.payment.line', 'need_id')
- need_attach = fields.Binary(string="", )
- state = fields.Selection([
- ('draft', 'Draft'),
- ('sent', 'sent'),
- ('review', 'Under Review'),
- ('approve', 'Approved'),
- ('published', 'Published'),
- ('refused', 'Refused'),
- ('done', 'Done'),
- ], string='state', default="draft", tracking=True)
-
- benefit_count = fields.Integer(string='Benefits count for needs',
- compute='_compute_needs_benefit_count', store=True)
-
- @api.depends('benefit_id', 'benefit_ids')
- def _compute_needs_benefit_count(self):
- """ Calculate needs benefits count """
- for rec in self:
- if rec.benefit_ids:
- rec.benefit_count = len(rec.benefit_ids)
- elif rec.benefit_id:
- rec.benefit_count = 1
- else:
- rec.benefit_count = 0
-
- def action_submit(self):
- for rec in self:
- rec.state = 'sent'
-
- def action_review(self):
- for rec in self:
- rec.state = 'review'
-
- def action_approve(self):
- for rec in self:
- rec.state = 'approve'
-
- def action_published(self):
- for rec in self:
- rec.state = 'published'
-
- def action_refused(self):
- for rec in self:
- rec.state = 'refused'
-
- def action_done(self):
- for rec in self:
- rec.state = 'done'
-
- @api.onchange('need_category')
- def _onchange_need_category(self):
- for rec in self:
- need_list = []
- for i in rec.need_category.product_ids:
- need_list.append(i.id)
- rec.need_type_ids = [(6, 0, need_list)]
-
- @api.onchange('benefit_ids', 'benefit_id')
- def _onchange_benefit_ids(self):
- for rec in self:
- b_type = []
- if rec.benefit_ids:
- for i in rec.benefit_ids:
- b_type.append(i.benefit_type)
- if rec.benefit_id:
- for i in rec.benefit_id:
- b_type.append(i.benefit_type)
- if 'orphan' in b_type and 'widow' not in b_type:
- rec.benefit_type = 'orphans'
- if 'widow' in b_type and 'orphan' not in b_type:
- rec.benefit_type = 'widows'
- if 'widow' in b_type and 'orphan' in b_type:
- rec.benefit_type = 'both'
- if b_type == []:
- rec.benefit_type = False
-
- @api.onchange('need_type_ids', 'paid_amount', 'need_category')
- def _onchange_paid_amount(self):
- for rec in self:
- paid_amount = 0.0
- target_amount = 0.0
- for pay in rec.payments_ids:
- if pay.state == 'paid':
- paid_amount += pay.amount
- rec.paid_amount = format(paid_amount, '.2f')
- for i in rec.need_type_ids:
- if rec.f_amount > 0:
- target_amount = rec.f_amount
- else:
- target_amount += i.lst_price
- rec.target_amount = format(target_amount, '.2f')
- if rec.target_amount:
- remaining_amount = format(rec.target_amount - rec.paid_amount, '.2f')
- rec.remaining_amount = remaining_amount
- if not rec.target_amount == 0.0 and rec.target_amount >= rec.paid_amount:
- completion_ratio = 100 - ((rec.remaining_amount / rec.target_amount) * 100)
- rec.completion_ratio = format(completion_ratio, '.2f')
- else:
- rec.completion_ratio = 0.0
- else:
- rec.remaining_amount = 0.0
- rec.completion_ratio = 0.0
- # else:
- # raise ValidationError(
- # _(u' You cant Add pay anymore'))
-
-
-class Payments(models.Model):
- _name = 'needs.payment.line'
- _inherit = ['mail.thread', 'mail.activity.mixin']
- _description = 'Payments'
-
- need_id = fields.Many2one('benefits.needs')
- invoice_id = fields.Many2one('account.move')
- partner_id = fields.Many2one('res.partner', related="invoice_id.partner_id")
- amount = fields.Monetary(related="invoice_id.amount_total")
- currency_id = fields.Many2one('res.currency', string='Currency', readonly=True, related="invoice_id.currency_id")
- state = fields.Selection([
- ('draft', 'Draft'),
- ('open', 'Open'),
- ('paid', 'Paid'),
- ('cancel', 'Cancelled'), ], store=True, related="invoice_id.state")
- date = fields.Date(related="invoice_id.invoice_date")
-
-
-class NeedsCategories(models.Model):
- _name = 'needs.categories'
- _inherit = ['mail.thread', 'mail.activity.mixin']
- _description = 'Categories of need of benefit '
-
- name = fields.Char(
- string='',
- required=False)
- description = fields.Char(
- string='',
- required=False)
- product_ids = fields.Many2many('product.product')
-
-
-class PercentageOfNeed(models.Model):
- _name = 'benefit.need'
- _inherit = ['mail.thread', 'mail.activity.mixin']
- _description = 'percentage of need of benefit '
-
- name = fields.Char()
- housing_id = fields.Many2one(
- 'benefit.housing',
- string='',
- tracking=True,
- required=False)
- benefit_ids = fields.One2many('grant.benefit', 'housing_id', string="Benefits")
- house_need = fields.One2many(
- comodel_name='house.need',
- inverse_name='benefit_need_id',
- string='',
- required=False)
- total_expenses = fields.Float(
- compute='_get_total_expenses',
- store=True,
- tracking=True,
- string='',
- required=False)
- expenses_ids = fields.Many2many(
- comodel_name='grant.benefit',relation='grant_benefit_group_rel',compute='_get_total_expenses',column1='benefit_id',column2='grant_id',tracking=True,
- store=True,
- string='',
- required=False)
- income_ids = fields.Many2many(
- 'grant.benefit',
- compute='_get_total_income',
- tracking=True,
- store=True,
- string='',
- required=False)
- total_income = fields.Float(
- compute='_get_total_income',
- tracking=True,
- store=True,
- string='total income',
- required=False)
- total_net = fields.Float(
- string='net',
- store=True,
- compute='_get_total_net',
- tracking=True,
- required=False)
- financial_aid = fields.Float(
- string='Financial Aid',
- store=True,
- compute='_get_total_net',
- tracking=True,
- required=False)
- state = fields.Selection([
- ('draft', 'Draft'),
- ('visit', 'field visit'),
- ('waiting_approve', 'Waiting Approved'),
- ('approve', 'Approved'),
- ('refused', 'Refused'),
- ], string='state', default="draft", tracking=True)
-
- def action_visit(self):
- self.state = 'visit'
-
- def action_waiting_approve(self):
- self.state = 'waiting_approve'
-
- def action_approve(self):
- self.state = 'approve'
-
- def action_refused(self):
- self.state = 'refused'
-
- @api.depends('housing_id')
- def _get_total_expenses(self):
- for rec in self:
- if rec.state == 'draft':
- benefit_id = rec.env['grant.benefit'].sudo().search([('housing_id', '=', rec.housing_id.id)])
- benefit_ids = rec.env['grant.benefit'].sudo().search(
- [('housing_id', '=', rec.housing_id.id), ('benefit_type', '=', 'benefit')])
- benefit = []
- total_expenses = 0.0
- for i in benefit_id:
- benefit.append(i.id)
- total_expenses += i.total_expenses
- for r in self:
- r.expenses_ids = [(6, 0, benefit)]
- r.total_expenses = total_expenses
-
- @api.depends('housing_id')
- def _get_total_income(self):
- for rec in self:
- if rec.state == 'draft':
- benefit_ids = rec.env['grant.benefit'].sudo().search(
- [('housing_id', '=', rec.housing_id.id), ('benefit_type', '=', 'benefit')])
- benefit = []
- total_income = 0.0
- for i in benefit_ids:
- benefit.append(i.id)
- total_income += i.total_income
- for r in rec:
- r.income_ids = [(6, 0, benefit)]
- r.total_income = total_income
-
- @api.depends('housing_id')
- def _get_total_net(self):
- for rec in self:
- if rec.state == 'draft':
- rec.total_net = 0.0
- rec.financial_aid = 0.0
- if rec.total_expenses >= rec.total_income:
- rec.total_net = rec.total_expenses - rec.total_income
- else:
- rec.total_net = rec.total_income - rec.total_expenses
- if rec.total_net < 0:
- rec.financial_aid = (abs(rec.total_net) * .5)
-
-
-class HouseNeed(models.Model):
- _name = 'house.need'
- _description = 'House Need'
-
- benefit_need_id = fields.Many2one(
- 'benefit.need',
- string='',
- required=False)
- housing_id = fields.Many2one(
- 'benefit.housing',
- string='',
- related="benefit_need_id.housing_id",
- required=False)
- room_id = fields.Many2one(
- 'benefit.housing.rooms',
- string='',
- domain="[('housing_id', '=', housing_id)]",
- required=False)
- needs = fields.Char(
- string='',
- required=False)
- needs_percentage = fields.Float(
- string='',
- required=False)
diff --git a/odex25_ensan/odex_benefit/models/benefit_vehicle_model.py b/odex25_ensan/odex_benefit/models/benefit_vehicle_model.py
deleted file mode 100644
index af69bc4d9..000000000
--- a/odex25_ensan/odex_benefit/models/benefit_vehicle_model.py
+++ /dev/null
@@ -1,14 +0,0 @@
-from odoo import fields, models,api,_
-from odoo.exceptions import UserError, ValidationError
-
-class BenefitVehicleModel(models.Model):
- _name = 'benefit.vehicle.model'
- _description = "Vehicle Model"
- _inherit = ['mail.thread', 'mail.activity.mixin']
-
- name = fields.Char(string="Name", required=True, tracking=True)
- active = fields.Boolean(default=True)
-
- _sql_constraints = [
- ("name_unique", "unique(name)", _("The name must be unique.")),
- ]
\ No newline at end of file
diff --git a/odex25_ensan/odex_benefit/models/branch_inherit.py b/odex25_ensan/odex_benefit/models/branch_inherit.py
deleted file mode 100644
index 5fabc76c8..000000000
--- a/odex25_ensan/odex_benefit/models/branch_inherit.py
+++ /dev/null
@@ -1,8 +0,0 @@
-# -*- coding: utf-8 -*-
-
-from odoo import models, fields, api, _
-
-class BranchInherit(models.Model):
- _inherit = 'res.branch'
-
- district_id = fields.Many2one('res.districts', string="District")
diff --git a/odex25_ensan/odex_benefit/models/changes_requests.py b/odex25_ensan/odex_benefit/models/changes_requests.py
deleted file mode 100644
index f4b48e52e..000000000
--- a/odex25_ensan/odex_benefit/models/changes_requests.py
+++ /dev/null
@@ -1,117 +0,0 @@
-from odoo import fields, models, api, _
-
-
-class ChangesRequests(models.Model):
- _name = 'changes.requests'
- _inherit = ['mail.thread', 'mail.activity.mixin']
- _description = 'Changes Requests'
-
- name = fields.Char()
- change_type = fields.Selection(
- string='Change Type',
- selection=[
- ('transfer_family_from_research_to_another_research', 'Transfer Family From Research To Another Research'),
- ('transfer_family_from_branch_to_another_branch', 'Transfer Family From Branch To Another Branch'),
- ('transfer_research_from_branch_to_another_branch', 'Transfer Research From Branch To Another Branch')],default="transfer_family_from_research_to_another_research")
- benefit_id = fields.Many2one("grant.benefit", string='Family')
- researcher_id = fields.Many2one("committees.line",compute="get_researcher_id",string='Researcher Team',store=True)
- branch_custom_id = fields.Many2one("branch.settings",compute="get_branch_id",string='Branch',store=True)
- new_branch_id = fields.Many2one("branch.settings",string='New Branch')
- new_researcher_id = fields.Many2one("committees.line", domain ="['&',('branch_custom_id','=',branch_custom_id),('id','!=',researcher_id)]",string='New Researcher Team')
- new_branch_researcher = fields.Many2one("committees.line", domain ="[('branch_custom_id','=',new_branch_id)]",string='New Researcher Team')
- execution_date = fields.Datetime(string="Transfer Execution Date")
- state = fields.Selection(
- string='State',
- selection=[
- ('draft', 'Draft'),
- ('approval_of_department_head', 'Approval of department head'),
- ('approval_of_branch_manager', 'Approval of branch manager')]
- ,default = 'draft')
- team_type = fields.Selection(
- string='Team Type',
- selection=[
- ('male', 'Male'),
- ('female', 'Female'),
- ('both', 'Both')])
- gender_researcher_id = fields.Many2one("committees.line",domain ="[('type','=',team_type)]",string='Researcher Team')
- is_whole_team = fields.Boolean(string='Is Whole Team?')
- researcher_branch_id = fields.Many2one("branch.settings",compute = "get_researcher_branch_id", store = True,string='Branch')
- new_gender_researcher_id = fields.Many2one("committees.line",domain ="['&',('branch_custom_id','=',researcher_branch_id),('id','!=',gender_researcher_id)]",string='Alternative Researcher Team for family')
- new_gender_researcher_one = fields.Many2one("committees.line",domain ="[('branch_custom_id','=',new_branch_id)]",string='Alternative Researcher Team for researcher')
- researcher_ids = fields.Many2many("hr.employee", string="Researcher",readonly=False)
-
- @api.onchange('gender_researcher_id')
- def item_researcher_ids_onchange(self):
- return {'domain': {'researcher_ids': [('id', 'in', self.gender_researcher_id.employee_id.ids)]}}
- @api.depends("benefit_id")
- def get_researcher_id(self):
- for rec in self:
- rec.researcher_id = rec.benefit_id.researcher_id
- @api.depends("benefit_id")
- def get_branch_id(self):
- for rec in self:
- rec.branch_custom_id = rec.benefit_id.branch_custom_id
- @api.depends("gender_researcher_id")
- def get_researcher_branch_id(self):
- for rec in self:
- rec.researcher_branch_id = rec.gender_researcher_id.branch_custom_id
-
- def approval_of_department_head_c1(self):
- for rec in self:
- rec.state = 'approval_of_department_head'
-
- def approval_of_branch_manager_c1(self):
- for rec in self:
- rec.state = 'approval_of_branch_manager'
- rec.benefit_id.researcher_id = rec.new_researcher_id
- message = "Your family has been transferred to another researcher team %s"% (self.new_researcher_id.name)
- mail = self.env['mail.mail'].create({
- 'body_html': message,
- 'subject': "transferred to another researcher team",
- 'email_to': self.benefit_id.email,
- })
- mail.send()
-
- def approval_of_department_head_c2(self):
- for rec in self:
- rec.state = 'approval_of_department_head'
-
- def approval_of_branch_manager_c2(self):
- for rec in self:
- rec.state = 'approval_of_branch_manager'
- rec.benefit_id.branch_custom_id = rec.new_branch_id
- rec.benefit_id.researcher_id = rec.new_branch_researcher
- message = "Your family has been transferred to another branch %s" % (self.new_branch_id.name)
- mail = self.env['mail.mail'].create({
- 'body_html': message,
- 'subject': "Transferred to another branch",
- 'email_to': self.benefit_id.email,
- })
- mail.send()
- def approval_of_department_head_c3(self):
- for rec in self:
- rec.state = 'approval_of_department_head'
-
- def approval_of_branch_manager_c3(self):
- obj = self.env["grant.benefit"].search([])
- for rec in self:
- rec.state = 'approval_of_branch_manager'
- rec.gender_researcher_id.branch_custom_id = rec.new_branch_id
- for item in obj.filtered(lambda r: r.researcher_id == rec.gender_researcher_id):
- item.researcher_id = rec.new_gender_researcher_id
- if rec.is_whole_team == False:
- for employee in rec.gender_researcher_id.employee_id:
- for i in rec.researcher_ids:
- if employee.id == i.id:
- rec.gender_researcher_id.sudo().write({'employee_id':[(3,employee.id)]})
- rec.new_gender_researcher_one.sudo().write({'employee_id':[(4,employee.id)]})
-
- message = "Your family has been transferred to another branch %s" % (self.new_branch_id.name)
- mail = self.env['mail.mail'].create({
- 'body_html': message,
- 'subject': "Transferred to another branch",
- 'email_to': self.benefit_id.email,
- })
- mail.send()
- # for rec in self.benefit_id.researcher_id.employee_id:
- # rec.benefit_id.researcher_id
\ No newline at end of file
diff --git a/odex25_ensan/odex_benefit/models/death_reason_settings.py b/odex25_ensan/odex_benefit/models/death_reason_settings.py
deleted file mode 100644
index a58e767e2..000000000
--- a/odex25_ensan/odex_benefit/models/death_reason_settings.py
+++ /dev/null
@@ -1,18 +0,0 @@
-from odoo import models, fields, _
-
-
-class DeathReasonSettings(models.Model):
- _name = 'death.reason.settings'
-
- name = fields.Char(required=True)
- not_defined = fields.Boolean(default=False)
- active = fields.Boolean(default=True)
-
- _sql_constraints = [
- (
- 'uniq_name',
- 'UNIQUE( name )',
- _('This death reason already exists!')
- )
- ]
-
\ No newline at end of file
diff --git a/odex25_ensan/odex_benefit/models/education_period.py b/odex25_ensan/odex_benefit/models/education_period.py
deleted file mode 100644
index 2764011d3..000000000
--- a/odex25_ensan/odex_benefit/models/education_period.py
+++ /dev/null
@@ -1,13 +0,0 @@
-from odoo import fields, models,api
-
-
-class EducationPeriod(models.Model):
- _name = 'education.period'
- _description = 'Education Period'
- _order = 'id desc'
-
- name = fields.Char(string="Name", required=True)
- start_date = fields.Date(string='Period Start Date', required=True)
- end_date = fields.Date(string='Period End Date', required=True)
- education_level_ids = fields.Many2many('education.level', string='Education Levels')
- education_entity_ids = fields.Many2many("education.entities", string='Education Entities')
\ No newline at end of file
diff --git a/odex25_ensan/odex_benefit/models/education_settings.py b/odex25_ensan/odex_benefit/models/education_settings.py
deleted file mode 100644
index e3bdcc8ed..000000000
--- a/odex25_ensan/odex_benefit/models/education_settings.py
+++ /dev/null
@@ -1,53 +0,0 @@
-from odoo import fields, models,api
-
-
-class EducationEntities(models.Model):
- _name = 'education.entities'
-
- name = fields.Char(string='Name')
- education_level_id = fields.Many2one('education.level', string='Education Level')
-
-
-class EducationLevel(models.Model):
- _name = 'education.level'
-
- name = fields.Char(string='Name')
- level_expected_age = fields.Float(string="Level Expected Age")
-
-class EducationClassroom(models.Model):
- _name = 'education.classroom'
-
- name = fields.Char(string='Name')
- education_level_id = fields.Many2one('education.level', string='Education Level')
-
-class EducationResults(models.Model):
- _name = 'education.result'
-
- name = fields.Char(string='Name',compute="get_name")
- evaluation = fields.Char(string='Evaluation')
- rate_type = fields.Selection([
- ('from_4', 'From 4'),
- ('from_5', 'From 5'),
- ('from_100', 'From 100'),
- ], string='Rate Type')
- min_degree = fields.Float(string='Mini Degree')
- max_degree = fields.Float(string='Max Degree')
-
- @api.depends("evaluation","min_degree","max_degree")
- def get_name(self):
- for rec in self:
- if rec.evaluation and rec.max_degree and rec.min_degree:
- rec.name = rec.evaluation + " " + str(rec.min_degree) + "-" + str(rec.max_degree)
- else:
- rec.name=""
-
-class StudyMaterial(models.Model):
- _name = 'study.material'
-
- name = fields.Char(string='Name')
-
-
-class EducationExamType(models.Model):
- _name = 'education.exam.type'
-
- name = fields.Char(string='Name', required=True)
\ No newline at end of file
diff --git a/odex25_ensan/odex_benefit/models/education_status.py b/odex25_ensan/odex_benefit/models/education_status.py
deleted file mode 100644
index b3970ea30..000000000
--- a/odex25_ensan/odex_benefit/models/education_status.py
+++ /dev/null
@@ -1,204 +0,0 @@
-from odoo import models, fields, api, _
-from odoo.tools import DEFAULT_SERVER_DATE_FORMAT
-from dateutil.relativedelta import relativedelta as rd
-from datetime import datetime, date
-
-
-class EducationStatus(models.Model):
- _name = 'education.status'
- _order = 'education_status_type asc, name desc'
-
- mother_grant_benefit_id = fields.Many2one('grant.benefit', string='Grant Benefit')
- replacement_grant_benefit_id = fields.Many2one('grant.benefit', string='Grant Benefit')
- family_member_id = fields.Many2one('family.member', string='Grant Benefit')
-
- name = fields.Char(
- string="Sequence",
- default="/",
- readonly=True,
- copy=False,
- index=True
- )
-
- education_status_type = fields.Selection(
- selection=[
- ('current', 'Current'),
- ('previous', 'Previous')
- ],
- required=False, compute="_compute_education_status_type", store=True
- )
- education_status = fields.Selection(
- string='Education Status',
- selection=[
- ('educated', 'Educated'),
- ('illiterate', 'Illiterate'),
- ('under_study_age', 'Under Study Age')
- ],
- compute="_compute_education_status",
- # store=True
- )
- case_study = fields.Selection(
- string='Case Study',
- selection=[('continuous', 'Continuous'),
- ('intermittent', 'Intermittent'),
- ('graduate', 'Graduate')]
- )
- education_entity = fields.Selection(
- string='Education Entity',
- selection=[('governmental', 'Governmental'),
- ('special', 'Special')]
- )
- education_start_date = fields.Date(string='Education Start Date')
- education_end_date = fields.Date(string='Education End Date')
-
- educational_certificate = fields.Many2many(
- 'ir.attachment',
- 'rel_education_status_educational_certificate_attachment',
- 'education_status_id',
- 'attachment_id',
- string='Educational Certificate'
- )
- education_levels = fields.Many2one("education.level", string='Education Levels')
- entities = fields.Many2one("education.entities", string='Entity',
- domain="[('education_level_id', '=', education_levels)]")
- education_period_id = fields.Many2one("education.period", string='Education Period', domain="['|', '|', ('education_level_ids', 'in', education_levels), ('education_level_ids', '=', False),'|',('education_entity_ids', 'in', entities), ('education_entity_ids', '=', False)]")
- classroom = fields.Many2one('education.classroom', string='Classroom',
- domain="[('education_level_id', '=', education_levels)]")
- rate_type = fields.Selection([
- ('from_4', 'From 4'),
- ('from_5', 'From 5'),
- ('from_100', 'From 100'),
- ], string='Rate Type')
- degree = fields.Many2one('education.result', string='Degree')
- percentage = fields.Float(string="Percentage%")
- specialization_ids = fields.Many2one('specialization.specialization', string='Specialization')
- intermittent_reason_id = fields.Many2one('education.illiterate.reason', string='Intermittent Reason')
- intermittent_date = fields.Date(string='Intermittent Date')
- family_member_age = fields.Integer(string="Age At Level Beginning", compute='_compute_family_member_age',
- store=True)
- family_member_delay = fields.Boolean(string="Member Delay", compute='_compute_family_member_delay', store=True)
- delay_reason_id = fields.Many2one('education.delay.reason', string='Delay Reason')
- weak_course_ids = fields.One2many('weak.course', 'education_status_id')
-
- @api.depends(
- 'mother_grant_benefit_id',
- 'mother_grant_benefit_id.education_status',
- 'replacement_grant_benefit_id',
- 'replacement_grant_benefit_id.replacement_education_status',
- 'family_member_id',
- 'family_member_id.education_status',
- )
- def _compute_education_status(self):
- for record in self:
- record.education_status = record.mother_grant_benefit_id.education_status or \
- record.replacement_grant_benefit_id.replacement_education_status or \
- record.family_member_id.education_status
-
- @api.depends("case_study")
- def _compute_education_status_type(self):
- for rec in self:
- if rec.case_study:
- if rec.case_study == "continuous":
- rec.education_status_type = "current"
- else:
- rec.education_status_type = "previous"
- else:
- rec.education_status_type = False
-
- @api.depends("education_start_date", "family_member_id", "family_member_id.birth_date")
- def _compute_family_member_age(self):
- for rec in self:
- if rec.education_start_date and rec.family_member_id and rec.family_member_id.birth_date:
- day = datetime.strptime(str(rec.family_member_id.birth_date), DEFAULT_SERVER_DATE_FORMAT)
- age = rd(rec.education_start_date, day)
- rec.family_member_age = age.years
- else:
- rec.family_member_age = 0
-
- @api.depends("family_member_age", "education_levels", "education_levels.level_expected_age")
- def _compute_family_member_delay(self):
- for rec in self:
- if rec.family_member_age > 0 and rec.education_levels and rec.education_levels.level_expected_age > 0:
- if rec.family_member_age > rec.education_levels.level_expected_age:
- rec.family_member_delay = True
- else:
- rec.family_member_delay = False
- else:
- rec.family_member_delay = False
-
- @api.onchange('education_status_type')
- def _onchange_education_status_type(self):
- relation_id = self.mother_grant_benefit_id or \
- self.replacement_grant_benefit_id or \
- self.family_member_id
- if self.education_status_type == 'current' and relation_id:
- existing_current = self.search([
- ('education_status_type', '=', 'current'),
- '|', '|',
- ('mother_grant_benefit_id', '=', relation_id._origin.id),
- ('replacement_grant_benefit_id', '=', relation_id._origin.id),
- ('family_member_id', '=', relation_id._origin.id)
- ], limit=1)
- if existing_current:
- return {
- "warning": {
- 'title': _('Current Education Status Already Exists'),
- 'message': _(
- "There is already an education status marked as Current.\nIf you save this, %s will be marked as Previous!") % existing_current.name
- }
- }
-
- @api.onchange('education_period_id', 'education_period_id.start_date', 'education_period_id.end_date')
- def _onchange_field_name(self):
- self.ensure_one()
- if self.education_period_id:
- if self.education_period_id.start_date:
- self.education_start_date = self.education_period_id.start_date
- if self.education_period_id.end_date:
- self.education_end_date = self.education_period_id.end_date
-
- @api.model
- def create(self, vals):
- # Determine the prefix based on the related field
- prefix = 'EDU/'
- relation_field = False
-
- if vals.get('mother_grant_benefit_id'):
- prefix = 'EDUM/'
- relation_field = 'mother_grant_benefit_id'
- elif vals.get('replacement_grant_benefit_id'):
- prefix = 'EDUR/'
- relation_field = 'replacement_grant_benefit_id'
- elif vals.get('family_member_id'):
- prefix = 'EDUF/'
- relation_field = 'family_member_id'
-
- # Build domain filter to count records for the same category
- domain = [('name', 'like', prefix)]
- if relation_field and vals.get(relation_field):
- domain.append((relation_field, '=', vals.get(relation_field)))
-
- # Get the count of existing records with the same prefix & relation ID
- existing_count = self.search_count(domain) + 1
- formatted_number = str(existing_count).zfill(4) # Format as 4-digit number
-
- # Assign computed sequence name
- vals['name'] = f"{prefix}{formatted_number}"
-
- # Ensure only one 'current' education status exists
- relation_id = vals.get('mother_grant_benefit_id',
- vals.get('replacement_grant_benefit_id', vals.get('family_member_id', False)))
- if not self.env.context.get('skip_current_check') and vals.get(
- 'education_status_type') == 'current' and relation_id:
- existing_current = self.search([
- ('education_status_type', '=', 'current'),
- '|', '|',
- ('mother_grant_benefit_id', '=', relation_id),
- ('replacement_grant_benefit_id', '=', relation_id),
- ('family_member_id', '=', relation_id)
- ], limit=1)
-
- if existing_current:
- existing_current.education_status_type = 'previous'
-
- return super(EducationStatus, self).create(vals)
diff --git a/odex25_ensan/odex_benefit/models/expenses_type.py b/odex25_ensan/odex_benefit/models/expenses_type.py
deleted file mode 100644
index 21cd9ec40..000000000
--- a/odex25_ensan/odex_benefit/models/expenses_type.py
+++ /dev/null
@@ -1,7 +0,0 @@
-from odoo import fields, models, api, _
-
-
-class ExpensesType(models.Model):
- _name = 'expenses.type'
-
- name = fields.Char(string='Name', required=False)
diff --git a/odex25_ensan/odex_benefit/models/family_complaints.py b/odex25_ensan/odex_benefit/models/family_complaints.py
deleted file mode 100644
index 517cfe727..000000000
--- a/odex25_ensan/odex_benefit/models/family_complaints.py
+++ /dev/null
@@ -1,52 +0,0 @@
-from odoo import fields, models, api, _
-from odoo.exceptions import UserError
-
-
-class FamilyComplaints(models.Model):
- _name = 'family.complaints'
- _rec_name = 'complaints_reason'
- _inherit = ['mail.thread', 'mail.activity.mixin']
-
-
- complaints_date = fields.Datetime(string="Complaints Date",default=fields.Datetime.now)
- family_id = fields.Many2one('grant.benefit',string='Family',domain="['|',('state','=','second_approve'),'&',('state','in',['waiting_approve','first_approve']),('action_type','=','suspended')]")
- researcher_id = fields.Many2one("committees.line", string="Researcher",related="family_id.researcher_id")
- branch_custom_id = fields.Many2one('branch.settings', string="Branch",related='family_id.branch_custom_id')
- complaints_reason = fields.Char(string="Complaints Reason")
- message = fields.Text(string="Message")
- complaints_category_ids = fields.Many2many('complaints.category',relation="family_complaints_category_rel",
- column1="family_complaints",
- column2="category",
- string="Complaints Categories")
- priority = fields.Selection( [ ('0', 'Normal'),('1', 'Low'),('2', 'High'),('3', 'Very High'),('4', 'Very Very High'),('5', 'Danger')], string='Priority')
- state = fields.Selection([('draft', 'Draft'),('receiving_complaint', 'Receiving the complaint'),('review_complaint', 'Review Complaint'),
- ('work_in_complaint', 'Work in complaint'),('complaint_done', 'Complaint Done'),('refuse', 'Refuse')],
- default='draft',tracking=True)
-
- def unlink(self):
- for order in self:
- if order.state not in ['draft']:
- raise UserError(_('You cannot delete this record'))
- return super(FamilyComplaints, self).unlink()
-
-
- def action_receiving_complaint(self):
- for rec in self:
- rec.state = 'receiving_complaint'
-
- def action_review_complaint(self):
- for rec in self:
- rec.state = 'review_complaint'
-
- def action_work_in_complaint(self):
- for rec in self:
- rec.state = 'work_in_complaint'
-
- def action_done(self):
- for rec in self:
- rec.state = 'complaint_done'
-
- def action_refuse(self):
- for rec in self:
- rec.state = 'refuse'
-
diff --git a/odex25_ensan/odex_benefit/models/family_debits.py b/odex25_ensan/odex_benefit/models/family_debits.py
deleted file mode 100644
index 7cdaaf0ea..000000000
--- a/odex25_ensan/odex_benefit/models/family_debits.py
+++ /dev/null
@@ -1,46 +0,0 @@
-from random import randint
-from odoo import fields, models, api, _
-
-
-class FamilyDebits(models.Model):
- _name = 'family.debits'
- _description = "Family - Debits"
-
-
- loan_giver = fields.Many2one("loan.giver",string='Loan Giver')
- loan_amount = fields.Float(string='Loan Amount')
- loan_total_paid = fields.Float(string='Loan Total Paid')
- loan_remaining = fields.Float(string='Loan Remaining',compute='_compute_loan_remaining',store=True)
- monthly_installment = fields.Float(string='Monthly Installment')
- number_of_installments = fields.Integer(string='Number of installments')
- last_paid_amount = fields.Float(string='Last Paid Amount')
- last_paid_amount_date = fields.Date(string='Last Paid Amount Date')
- loan_start_date = fields.Date(string='Loan Start Date')
- loan_end_date = fields.Date(string='Loan End Date')
- loan_reason = fields.Many2one("loan.reason",string='Loan Reason')
- benefit_id = fields.Many2one("grant.benefit")
- currency_id = fields.Many2one('res.currency', related='benefit_id.currency_id')
- loan_attach = fields.Binary(attachment=True,string='Loan Attach')
- description = fields.Char(string='Description')
- state = fields.Selection(string='Status', selection=[('accepted', 'Accepted'), ('refused', 'Refused')])
- deduct_from_family_income = fields.Boolean(string="Deduct from Family Income")
-
- def action_accept(self):
- self.state = 'accepted'
-
- def action_refuse(self):
- self.state = 'refused'
-
- @api.depends('loan_amount','loan_total_paid')
- def _compute_loan_remaining(self):
- for rec in self:
- rec.loan_remaining = rec.loan_amount - rec.loan_total_paid
-
- @api.onchange('loan_amount','number_of_installments')
- def get_monthly_installment(self):
- for rec in self:
- if rec.loan_amount and rec.number_of_installments > 0 :
- rec.monthly_installment = rec.loan_amount / rec.number_of_installments
- else:
- rec.monthly_installment = 0
-
diff --git a/odex25_ensan/odex_benefit/models/family_expense.py b/odex25_ensan/odex_benefit/models/family_expense.py
deleted file mode 100644
index 51ddcc36b..000000000
--- a/odex25_ensan/odex_benefit/models/family_expense.py
+++ /dev/null
@@ -1,404 +0,0 @@
-# -*- coding: utf-8 -*-
-from dateutil.relativedelta import relativedelta
-from odoo import models, fields, api, _
-from odoo.exceptions import UserError
-from odoo.tools import date_utils
-
-
-class ConfirmBenefitExpense(models.Model):
- _name = 'confirm.benefit.expense'
- _description = 'Confirm Benefit Expense'
- _inherit = ['mail.thread', 'mail.activity.mixin']
- _order = "family_expense_seq desc"
-
- # region [Default Methods]
-
- def _default_start_date(self):
- today = fields.Date.today()
- start_date = date_utils.start_of(today, 'month')
- return start_date
-
- def _default_end_date(self):
- today = fields.Date.today()
- end_date = date_utils.end_of(today, 'month')
- return end_date
-
- # endregion [Default Methods]
-
- family_expense_seq = fields.Char(string="Number", copy=False, readonly=True,
- default=lambda x: _('New'))
- state = fields.Selection(selection=[
- ('draft', 'Draft'),
- ('calculated', 'Calculated'),
- ('assistant_general_manager', 'Waiting For The Assistant General Manager'),
- ('accounting_approve', 'Accounting Approve'),
- ('cancel', 'Cancelled'),
- ('confirm', 'Confirmed'),
- ], string='Status', default='draft', required=True, copy=False, tracking=True)
- name = fields.Char(string="Name", states={'confirm': [('readonly', True)]}, copy=False)
- date = fields.Date(string="Date", default=fields.Date.context_today, required=False,
- states={'confirm': [('readonly', True)]})
- start_date = fields.Date(string="Start Date", default=_default_start_date, required=True)
- end_date = fields.Date(string="End Date", required=True, default=_default_end_date)
-
- family_ids = fields.Many2many(comodel_name='grant.benefit', relation='benefit_expense_grant_rel',
- column1='expense_id',
- column2='family_id', string='Families', states={'confirm': [('readonly', True)]},
- copy=False)
- benefit_expense_line_ids = fields.One2many(comodel_name='benefit.expense.line', inverse_name='confirm_expense_id',
- string='Benefit Expense Lines')
- othaim_line_ids = fields.One2many(comodel_name='benefit.expense.line', inverse_name='confirm_expense_id',
- string='Othaim Lines', domain=[('meal_card', '=', True)])
- cash_expense = fields.Boolean(string='Include Cash Expense', default=True, states={'confirm': [('readonly', True)]})
- meal_expense = fields.Boolean(string='Include Meal Expense', default=True, states={'confirm': [('readonly', True)]})
- cloth_expense = fields.Boolean(string='Include Clothing Expense', default=True,
- states={'confirm': [('readonly', True)]})
- payment_order_id = fields.Many2one('payment.orders', string='Payment Order', ondelete="set null", copy=False)
- move_id = fields.Many2one('account.move', ondelete='cascade')
- available_payment_method_line_ids = fields.Many2many(comodel_name='account.payment.method.line')
- family_monthly_income = fields.Float(string="Total Monthly Income", compute='_get_family_monthly_values',
- store=True)
- family_monthly_meals = fields.Float(string="Total Monthly Meals", compute='_get_family_monthly_values', store=True)
- family_monthly_clotting = fields.Float(string="Total Monthly Clotting", compute='_get_family_monthly_values',
- store=True)
- family_monthly_othaime = fields.Float(string="Total Othaim", compute='_get_family_monthly_values', store=True)
- family_monthly_total = fields.Float(string="Total", compute='_get_family_monthly_values', store=True)
- branch_custom_ids = fields.Many2many(comodel_name='branch.settings', relation='confirm_benefit_expense_branch_rel',
- column1='expense_id', column2='branch_id', string="Branches",
- domain="[('has_employees', '=', True)]")
- family_domain_ids = fields.Many2many(comodel_name='grant.benefit', compute='_compute_domain_ids')
- company_id = fields.Many2one('res.company', default=lambda self: self.env.company)
- currency_id = fields.Many2one(comodel_name='res.currency', string="Company Currency",
- related='company_id.currency_id')
- payment_state = fields.Selection(string='Payment State', selection=[
- ('none', 'None'),
- ('waiting', 'Waiting Payment'),
- ('done', 'Done Payment'), ], copy=False, compute="_compute_payment_move_state", store=True)
- move_state = fields.Selection(string='Move State', selection=[
- ('none', 'None'),
- ('waiting', 'Waiting Payment'),
- ('done', 'Done Payment'), ], copy=False, compute="_compute_payment_move_state", store=True)
- family_count_expense = fields.Integer(string="Family Count (Monthly Expense)",
- compute='_get_family_monthly_values', store=True)
-
- family_count_othaim = fields.Integer(string="Family Count (Othaim)", compute='_get_family_monthly_values',
- store=True)
- member_count_expense = fields.Integer(string="Member Count (Monthly Expense)", compute='_get_family_monthly_values',
- store=True, )
-
- member_count_othaim = fields.Integer(string="Member Count (Othaim)", compute='_get_family_monthly_values',
- store=True, )
- is_return_calculation = fields.Boolean(string="Return Calculation Mode", default=False,
- help="Enable to calculate returned amounts instead of regular monthly expense."
- )
- return_expense_line_ids = fields.One2many(comodel_name='benefit.expense.line', inverse_name='return_confirm_id',
- string="Selected Return Lines",
- domain="[('is_return', '=', True)]", )
- line_domain_ids = fields.Many2many(comodel_name='benefit.expense.line', compute='_compute_domain_ids',
- string="Return Line Domain",
- )
-
- @api.depends('payment_order_id', 'payment_order_id.state', 'move_id', 'move_id.state')
- def _compute_payment_move_state(self):
- for rec in self:
- payment_state = 'none'
- move_state = 'none'
- if rec.payment_order_id:
- if rec.payment_order_id.state == "done":
- payment_state = "done"
- else:
- payment_state = "waiting"
- if rec.move_id:
- if rec.move_id.state == "posted":
- move_state = "done"
- else:
- move_state = "waiting"
- rec.move_state = move_state
- rec.payment_state = payment_state
- if rec.move_state == 'done' and rec.payment_state == 'done':
- rec.state = 'confirm'
-
- @api.model
- def create(self, vals):
- res = super(ConfirmBenefitExpense, self).create(vals)
- if not res.family_ids:
- raise UserError(_('Select Family'))
- if not res.family_expense_seq or res.family_expense_seq == _('New'):
- res.family_expense_seq = self.env['ir.sequence'].sudo().next_by_code('family.expense.sequence') or _('New')
- return res
-
- def _update_benefit_expense_lines(self):
- self.ensure_one()
- for line in self.benefit_expense_line_ids:
- family = line.family_id
- income, meals, clotting, othaim = 0, 0, 0, 0
- if not family:
- continue
- monthly_meals = 0.0 if family.meal_card else family.family_monthly_meals
- othaime = family.family_monthly_meals if family.meal_card else 0.0
- if self.cash_expense:
- income = family.family_monthly_income
- if self.meal_expense:
- meals = monthly_meals
- othaim = othaime
- if self.cloth_expense:
- clotting = family.family_monthly_clotting
- vals = {
- 'branch_id': family.branch_custom_id.id,
- 'family_category_id': family.benefit_category_id.id,
- 'meal_card': family.meal_card,
- 'benefit_member_count': family.benefit_member_count,
- 'start_date': self.start_date,
- 'end_date': self.end_date,
- 'family_monthly_income': income,
- 'family_monthly_meals': meals,
- 'family_monthly_clotting': clotting,
- 'family_monthly_othaime': othaim,
- }
- line.write(vals)
-
- def _calculate_return_lines(self):
- self.ensure_one()
- return_lines = self.return_expense_line_ids
- if not return_lines:
- raise UserError(_("Please select at least one return line to calculate."))
-
- lines = []
- for line in return_lines:
- lines.append((0, 0, {
- 'family_id': line.family_id.id,
- 'branch_id': line.branch_id.id,
- 'family_category_id': line.family_category_id.id,
- 'meal_card': line.meal_card,
- 'benefit_member_count': line.benefit_member_count,
- 'start_date': self.start_date,
- 'end_date': self.end_date,
- 'family_monthly_income': line.family_monthly_income,
- 'family_monthly_meals': line.family_monthly_meals,
- 'family_monthly_clotting': line.family_monthly_clotting,
- 'family_monthly_othaime': 0,
- }))
- self.benefit_expense_line_ids = lines
-
- def action_calculate(self):
- for rec in self:
- if rec.state != 'draft':
- raise UserError(_("You can only calculate in draft state."))
-
- families = rec.family_ids
- if not families:
- raise UserError(_("Please select at least one family to calculate."))
-
- if not rec.cash_expense and not rec.meal_expense and not rec.cloth_expense:
- raise UserError(_("At least one expense type should be selected."))
-
- if rec.is_return_calculation:
- rec._calculate_return_lines()
- else:
- rec.benefit_expense_line_ids.unlink()
- lines = []
- for fam in families:
- vals = {
- 'confirm_expense_id': rec.id,
- 'family_id': fam.id,
- 'start_date': rec.start_date,
- 'end_date': rec.end_date,
- }
- lines.append((0, 0, vals))
-
- rec.write({'benefit_expense_line_ids': lines})
- rec._update_benefit_expense_lines()
- rec.state = 'calculated'
-
- def action_recalculate(self):
- for rec in self:
- if rec.state != 'calculated':
- raise UserError(_("You can only recalculate when status is 'Calculated'."))
- rec._update_benefit_expense_lines()
-
- @api.depends('is_return_calculation', 'branch_custom_ids', 'start_date', 'end_date')
- def _compute_domain_ids(self):
- for rec in self:
- Line = self.env['benefit.expense.line']
- validation_setting = self.env["family.validation.setting"].search([], limit=1)
- if rec.is_return_calculation:
- domain = [
- ('start_date', '<=', rec.end_date),
- ('end_date', '>=', rec.start_date),
- ('is_return', '=', True),
- ('return_reason_id', '!=', False),
- ('return_confirm_id', '=', False),
- ]
- if rec.branch_custom_ids:
- domain.append(('branch_id', 'in', rec.branch_custom_ids.ids))
-
- return_lines = Line.search(domain)
- rec.line_domain_ids = return_lines
- rec.family_domain_ids = return_lines.mapped('family_id')
- else:
- # Define base domain for family selection
-
- base_domain = ['|', ('state', '=', 'second_approve'), '&',
- ('state', 'in', ('waiting_approve', 'first_approve')), ('action_type', '=', 'suspended')]
- if rec.branch_custom_ids:
- base_domain.append(('branch_custom_id', 'in', rec.branch_custom_ids.ids))
- min_income = validation_setting.benefit_category_ids.mapped('mini_income_amount')
- max_income = validation_setting.benefit_category_ids.mapped('max_income_amount')
- base_domain.extend([('member_income', '>=', min(min_income)), ('member_income', '<=', max(max_income))])
- base_domain.extend([('benefit_category_id', '!=', False)])
- if rec.start_date and rec.end_date:
- conflicting_records = self.search([
- ('id', '!=', rec._origin.id),
- ('start_date', '<=', rec.end_date),
- ('end_date', '>=', rec.start_date),
- ])
-
- if conflicting_records:
- conflicting_family_ids = conflicting_records.mapped('family_ids').ids
- base_domain.append(('id', 'not in', conflicting_family_ids))
-
- rec.family_domain_ids = self.env['grant.benefit'].search(base_domain)
- rec.line_domain_ids = self.env['benefit.expense.line'].browse([])
-
- @api.onchange('branch_custom_ids')
- def _onchange_branch_custom_ids(self):
- if self.branch_custom_ids:
- allowed_families = self.env['grant.benefit'].search([
- ('id', 'in', self.family_ids.ids),
- ('branch_custom_id', 'in', self.branch_custom_ids.ids),
- ])
- self.family_ids = [(6, 0, allowed_families.ids)]
- else:
- self.family_ids = [(5, 0, 0)]
-
- def unlink(self):
- for rec in self:
- if rec.state not in ['draft']:
- raise UserError(_('This record can only be deleted in draft state.'))
- return super(ConfirmBenefitExpense, self).unlink()
-
- @api.depends('benefit_expense_line_ids')
- def _get_family_monthly_values(self):
- for rec in self:
- lines = rec.benefit_expense_line_ids
- rec.family_monthly_income = sum(lines.mapped('family_monthly_income'))
- rec.family_monthly_meals = sum(lines.mapped('family_monthly_meals'))
- rec.family_monthly_clotting = sum(lines.mapped('family_monthly_clotting'))
- rec.family_monthly_othaime = sum(lines.mapped('family_monthly_othaime'))
- rec.family_monthly_total = rec.family_monthly_income + rec.family_monthly_meals + rec.family_monthly_clotting
-
- expense_lines = lines.filtered(lambda l: not l.meal_card)
- othaim_lines = lines.filtered('meal_card')
- rec.family_count_expense = len(expense_lines.mapped('family_id'))
- rec.member_count_expense = sum(expense_lines.mapped('benefit_member_count'))
-
- rec.family_count_othaim = len(othaim_lines.mapped('family_id'))
- rec.member_count_othaim = sum(othaim_lines.mapped('benefit_member_count'))
-
- def action_assistant_manager(self):
- for family in self.family_ids:
- if self.end_date and family.last_disbursement_date:
- if self.end_date > family.last_disbursement_date:
- family.last_disbursement_date = self.end_date
- else:
- family.last_disbursement_date = self.end_date
-
- self.state = 'assistant_general_manager'
-
- def action_accounting_approve(self):
- self.state = 'accounting_approve'
-
- def action_cancel(self):
- self.state = 'cancel'
-
- def action_reset_to_draft(self):
- self.payment_order_id.unlink()
- self.move_id.unlink()
- self.benefit_expense_line_ids.unlink()
- self.state = 'draft'
-
- def action_open_related_move_records(self):
- moves = self.move_id.ids
- return {
- 'name': _('Vendor Bills'),
- 'type': 'ir.actions.act_window',
- 'res_model': 'account.move',
- 'view_mode': 'tree,form',
- 'domain': [('id', 'in', moves)],
- }
-
- def action_open_related_payment_orders(self):
- payment_orders = self.payment_order_id.ids
- return {
- 'name': _('Payment Orders'),
- 'type': 'ir.actions.act_window',
- 'res_model': 'payment.orders',
- 'view_mode': 'tree,form',
- 'domain': [('id', 'in', payment_orders)],
- }
-
- def action_accounting_transfer(self):
- for rec in self:
- validation_setting = self.env["family.validation.setting"].search([], limit=1)
- lines = rec.benefit_expense_line_ids
- if not lines:
- raise UserError(_("Please make sure you have benefit expense lines."))
-
- families = lines.mapped('family_id')
- invalid_families = families.filtered(
- lambda f: f.state != 'second_approve'
- or (f.state in ('waiting_approve', 'first_approve') and f.action_type == 'suspended')
- )
- if invalid_families:
- raise UserError(_(
- "Some selected benefits are not in valid state or are suspended:\n%s"
- ) % ", ".join(invalid_families.mapped('name')))
-
- if not validation_setting.cash_expense_account_id or not validation_setting.meal_expense_account_id or not validation_setting.clothing_expense_account_id:
- raise UserError(_("Please configure the expense accounts in the validation settings."))
-
- credit_account_id = validation_setting.account_id.id
-
- if not credit_account_id:
- raise UserError(_("Please select credit account."))
-
- # todo if have paymnet or move dont create again
-
- # Create Payment Order for Benefit Expense
- payment_order = self.env['payment.orders'].create({
- 'state': 'draft',
- 'accountant_id': validation_setting.accountant_id.id,
- 'benefit_expense_line_ids': [(6, 0, rec.benefit_expense_line_ids.ids)],
- 'type': 'benefit_expense',
- })
- rec.payment_order_id = payment_order
-
- if not rec.is_return_calculation:
- # Create Vendor Bill for Meal Card Invoice(othaime)
- account_id = validation_setting.meal_expense_account_id
- invoice_lines = []
- for line in lines.filtered(lambda l: l.meal_card):
- family = line.family_id
- invoice_lines.append((0, 0, {
- 'name': f'{family.name}/{family.code}',
- 'account_id': account_id.id,
- 'quantity': 1,
- 'benefit_family_id': family.id,
- 'price_unit': line.family_monthly_othaime,
- 'analytic_account_id': family.branch_family_id.branch.analytic_account_id.id
- }))
- invoice_vals = {
- 'move_type': 'in_invoice',
- 'partner_id': validation_setting.meal_partner_id.id,
- 'invoice_date': rec.date,
- 'family_confirm_id': rec.id,
- 'benefit_family_ids': [(6, 0, rec.benefit_expense_line_ids.mapped('family_id').ids)],
- 'journal_id': validation_setting.journal_id.id,
- 'invoice_line_ids': invoice_lines,
- 'ref': rec.name,
- }
-
- invoice = self.env['account.move'].create(invoice_vals)
- rec.move_id = invoice
-
- return True
diff --git a/odex25_ensan/odex_benefit/models/family_expense_line.py b/odex25_ensan/odex_benefit/models/family_expense_line.py
deleted file mode 100644
index 2c533b0f3..000000000
--- a/odex25_ensan/odex_benefit/models/family_expense_line.py
+++ /dev/null
@@ -1,49 +0,0 @@
-# -*- coding: utf-8 -*-
-from dateutil.relativedelta import relativedelta
-from odoo import models, fields, api, _
-from odoo.exceptions import UserError
-from odoo.tools import date_utils
-
-
-class BenefitExpenseLine(models.Model):
- _name = 'benefit.expense.line'
- _description = 'Benefit Expense Line'
- _inherit = ['mail.thread', 'mail.activity.mixin']
-
- confirm_expense_id = fields.Many2one(comodel_name='confirm.benefit.expense', string='Confirm Benefit Expense',
- ondelete='cascade')
- return_confirm_id = fields.Many2one('confirm.benefit.expense', string="Return Confirm", ondelete="set null", )
- family_id = fields.Many2one(comodel_name='grant.benefit', string='Family', required=True)
- branch_id = fields.Many2one(comodel_name='branch.settings', string='Branch')
- family_category_id = fields.Many2one(comodel_name='benefit.category', string='Family Category')
- meal_card = fields.Boolean(string="Meal Card")
- benefit_member_count = fields.Integer(string="Members count")
- family_monthly_income = fields.Float(string="Family Monthly Income")
- family_monthly_meals = fields.Float(string="Family Monthly Meals")
- family_monthly_clotting = fields.Float(string="Family Monthly Clotting")
- family_monthly_othaime = fields.Float(string="Othaim Total Monthly")
- total_family_expenses = fields.Float(string="Total Family Expenses", compute='_compute_total_family_expenses')
- start_date = fields.Date(string='Start Date', )
- end_date = fields.Date(string='End Date', )
- payment_order_id = fields.Many2one('payment.orders', string='Payment Order', ondelete="set null", copy=False)
- return_reason_id = fields.Many2one("return.reason", string="Return Reason")
- is_return = fields.Boolean(string="Is Returned?", default=False)
-
- @api.depends('family_monthly_income', 'family_monthly_clotting', 'family_monthly_meals')
- def _compute_total_family_expenses(self):
- for rec in self:
- rec.total_family_expenses = rec.family_monthly_income + rec.family_monthly_meals + rec.family_monthly_clotting
-
- def action_return_bank(self):
- self.ensure_one()
- return {
- 'name': _("Bank Return"),
- 'type': 'ir.actions.act_window',
- 'res_model': 'return.reason.wizard',
- 'view_mode': 'form',
- 'target': 'new',
- 'context': {
- 'default_line_id': self.id,
- 'default_line_model': 'benefit.expense.line',
- }
- }
diff --git a/odex25_ensan/odex_benefit/models/family_member_exam.py b/odex25_ensan/odex_benefit/models/family_member_exam.py
deleted file mode 100644
index f46a12024..000000000
--- a/odex25_ensan/odex_benefit/models/family_member_exam.py
+++ /dev/null
@@ -1,14 +0,0 @@
-from odoo import fields, models,api
-
-
-class FamilyMemberExam(models.Model):
- _name = 'family.member.exam'
- _description = 'Family Member Exam'
- _order = 'id desc'
-
- member_id = fields.Many2one('family.member', string='Family Member')
- exam_id = fields.Many2one('education.exam.type', string='Exam Type', required=True)
- exam_degree = fields.Float(string='Exam Degree')
- exam_date = fields.Date(string='Exam Date')
- exam_attachment = fields.Binary(string='Exam Attachment', attachment=True)
- exam_attachment_file_name = fields.Char(required=False)
diff --git a/odex25_ensan/odex_benefit/models/family_members.py b/odex25_ensan/odex_benefit/models/family_members.py
deleted file mode 100644
index ed6315b9f..000000000
--- a/odex25_ensan/odex_benefit/models/family_members.py
+++ /dev/null
@@ -1,1016 +0,0 @@
-# -*- coding: utf-8 -*-
-import logging
-from datetime import datetime, date
-from dateutil.relativedelta import relativedelta as rd
-from odoo import models, fields, api, _
-from odoo.exceptions import UserError, ValidationError
-from odoo.tools import DEFAULT_SERVER_DATE_FORMAT
-import qrcode
-import base64
-from io import BytesIO
-from odoo.osv import expression
-
-SAUDI_MOBILE_PATTERN = "(^(05|5)(5|0|3|6|4|9|1|8|7)([0-9]{7})$)"
-ALPHABETIC_PATTERN = "^[\u0600-\u065F\u066A-\u06EF\u06FA-\u06FFA-Za-z ]+$"
-import re
-
-_logger = logging.getLogger(__name__)
-
-
-class FamilyMemberProfile(models.Model):
- _name = 'family.member'
- _description = "Member - Profiles"
- _inherit = ['mail.thread', 'mail.activity.mixin']
- # _inherits = {'res.partner': 'partner_id'}
- _order = 'age desc'
-
- def _default_benefit(self):
- return self._context.get('active_id')
-
- member_first_name = fields.Char(string="Member First Name")
- member_second_name = fields.Char(string="Member Second Name", related="benefit_id.father_name")
- member_third_name = fields.Char(string="Member Third Name", related="benefit_id.father_second_name")
- member_family_name = fields.Char(string="Member Family Name", related="benefit_id.father_family_name")
- mother_first_name = fields.Char(string="Mother First Name")
- mother_second_name = fields.Char(string="Mother Second Name")
- mother_third_name = fields.Char(string="Mother Third Name")
- mother_family_name = fields.Char(string="MotherFamily Name")
- name = fields.Char(string="Name", compute='get_partner_name', store=True, readonly=False)
- member_id_number = fields.Char(string="Member Id Number")
- benefit_id = fields.Many2one("grant.benefit", string="Responsable", default=_default_benefit)
- gender = fields.Selection(selection=[('male', 'Male'), ('female', 'Female')], string="Gender")
- member_phone = fields.Char(string="Member Phone")
- member_location = fields.Selection(selection=[('with_family', 'With Family'), ('with_relative', 'with a relative'),
- ('study_inside_saudi_arabia', 'Study Inside Saudi Arabia'),
- ('study_outside_saudi_arabia', 'Study Outside Saudi Arabia'),
- ('rehabilitation_center_for_the_disabled',
- 'Rehabilitation center for the disabled'),
- ('house_of_social_observations', 'House of Social Observations'),
- ('girls_home', 'Girls Home'),
- ('university_housing', 'University Housing'),
- ('with_husband', 'With_husband'),
- ('work_inside_saudi_arabia', 'Work Inside Saudi Arabia')],
- string="Member Location")
- member_location_conf = fields.Many2one('location.settings', string='Member Location')
- # member_location = fields.Many2one('member.location', string="Member Location")
- birth_date = fields.Date(string="Birth Date")
- age = fields.Integer(string="Age", compute='_compute_get_age_date', store=True)
- age_status = fields.Selection(
- [('minor', 'Minor'), ('non_minor', 'Non-Minor')],
- string='Age Status',
- default='non_minor', compute='_compute_get_age_status', store=True
- )
- is_work = fields.Boolean('Is Work?')
- salary_certificate = fields.Many2many('ir.attachment', 'member_salary_cert_rel', 'member_id', 'attachment_id',
- string="Salary Certificate")
- is_dead = fields.Boolean('Is Dead?')
- death_certificate = fields.Many2many('ir.attachment', 'member_death_cert_rel', 'member_id', 'attachment_id',
- string="Death Certificate")
- member_income = fields.Float('Member Income')
- is_married = fields.Boolean('Is Married?')
- marriage_certificate = fields.Many2many('ir.attachment', 'member_marriage_cert_rel', 'member_id', 'attachment_id',
- string="Marriage Certificate")
- relationn = fields.Many2one('relation.settings',
- domain="['|',('relation_type','=','son'),('relation_type','=','daughter')]",
- string="Relation")
- relationn_type = fields.Selection(related="relationn.relation_type")
- relation = fields.Selection(
- [('son', _('Son')), ('daughter', _('Daughter'))])
- mother_marital = fields.Selection(
- [('married', _('Married')), ('widower', _('Widower')), ('divorced', _('Divorced')),
- ('divorced_from_another_man', _('Divorced From Another Man')), ('prisoner', _('Prisoner')),
- ('dead', _('Dead')), ('hanging', _('Hanging'))],
- _('Marital Status'))
- mother_marital_conf = fields.Many2one('marital.status', string='Mother Marital')
- mother_location = fields.Selection(
- [('with_husband_and_children', _('With Husband And Children')), ('with_children', _('With Children')),
- ('not_live_with_children', _('Not live with children'))], string='Mother Location')
- attachment_ids = fields.One2many("ir.attachment", 'member_id',
- domain=[('hobbies_id', '=', False), ('diseases_id', '=', False),
- ('disabilities_id', '=', False)])
- hobbies_attachment_ids = fields.One2many('ir.attachment', 'member_id', string='Hobbies Attachments',
- domain=[('hobbies_id', '!=', False)])
- diseases_attachment_ids = fields.One2many('ir.attachment', 'member_id', string='Diseases Attachments',
- domain=[('diseases_id', '!=', False)])
- disabilities_attachment_ids = fields.One2many('ir.attachment', 'member_id', string='Disabilities Attachments',
- domain=[('disabilities_id', '!=', False)])
- hobbies_ids = fields.One2many("member.hobbies", 'member_id')
- diseases_ids = fields.One2many("member.diseases", 'member_id')
- disabilities_ids = fields.One2many("member.disabilities", 'member_id')
- exam_ids = fields.One2many("family.member.exam", 'member_id')
- is_scientific_specialty = fields.Boolean('Is Scientific Specialty?',
- related="specialization_ids.is_scientific_specialty")
- is_medical_specialty = fields.Boolean('Is Medical Specialty?', related="specialization_ids.is_medical_specialty")
- minor_siblings = fields.Boolean('minor siblings?', compute="_compute_minor_siblings", store=True)
- # Education_data
- member_education_status_ids = fields.One2many('education.status', 'family_member_id')
- education_status = fields.Selection(
- string='Education Status',
- selection=[('educated', 'educated'), ('illiterate', 'illiterate'), ('under_study_age', 'Under Study Age')],
- default='under_study_age',
- )
- case_study = fields.Selection(string='Case Study',
- selection=[('continuous', 'continuous'), ('intermittent', 'intermittent'),
- ('graduate', 'Graduate')])
- illiterate_reason = fields.Char(string='Illiterate Reason')
- intermittent_reason = fields.Many2one('education.illiterate.reason', string='Intermittent Reason')
- educational_certificate = fields.Binary(attachment=True, string='Educational Certificate')
- education_entity = fields.Selection(string='Education Entity', selection=[('governmental', 'Governmental'),
- ('special', 'Special')])
- last_education_entity = fields.Selection(string='Last Education Entity',
- selection=[('governmental', 'Governmental'),
- ('special', 'Special')])
- entities = fields.Many2one("education.entities", string='Entity')
- last_entities = fields.Many2one("education.entities", string='Last Entity')
- education_levels = fields.Many2one("education.level", string='Education Levels')
- last_education_levels = fields.Many2one("education.level", string='Last Education Levels')
- nearest_literacy_school = fields.Char(string='The Nearest Literacy School', required=False)
- literacy_school_note = fields.Text(string="Literacy School Note", required=False)
- classroom = fields.Many2one('education.classroom', string='Classroom')
- last_classroom = fields.Many2one('education.classroom', string='Last Classroom')
- last_educational_certificate = fields.Binary(attachment=True, string='Last Educational Certificate')
- degree = fields.Many2one('education.result', string='Degree')
- last_degree = fields.Many2one('education.result', string='Last Degree')
- percentage = fields.Float(string="Percentage%")
- last_percentage = fields.Float(string="Last Percentage%")
- education_start_date = fields.Date(string='Education Start Date')
- education_end_date = fields.Date(string='Education End Date')
- end_date = fields.Date('End Date')
- specialization_ids = fields.Many2one('specialization.specialization', string='specialization')
- last_specialization_ids = fields.Many2one('specialization.specialization', string='Last Specialization')
- last_education_start_date = fields.Date(string='Last Education Start Date')
- last_education_end_date = fields.Date(string='Last Education End Date')
- weak_study = fields.Many2many('study.material', string='Weak Study')
- is_want_education = fields.Boolean(string='is Want Education', required=False)
- is_quran_memorize = fields.Boolean('memorize the quran ?')
- partner_id = fields.Many2one('res.partner')
- # Replacement Mother
- add_replacement_mother = fields.Boolean('Add Replacement Mother?')
- # replacement_mother_name = fields.Char(string="Replacement Mother Name", tracking=True)
- # replacement_mother_second_name = fields.Char(string="Replacement Mother Second Name", tracking=True)
- # replacement_mother_third_name = fields.Char(string="Replacement Mother Third Name", tracking=True)
- # replacement_mother_family_name = fields.Char(string="Replacement Mother Family Name", tracking=True)
- # replacement_mother_country_id = fields.Many2one('res.country', 'Replacement Mother Nationality', tracking=True)
- # replacement_mother_id_number = fields.Char(string="Replacement Mother Id Number", tracking=True)
- # replacement_mother_marital_conf = fields.Many2one('marital.status', string='Replacement Mother Marital')
- # replacement_mother_location = fields.Selection(
- # [('with_husband_and_children', _('With Husband And Children')), ('with_children', _('With Children')),
- # ('not_live_with_children', _('Not live with children'))], string='Replacement Mother Location')
- # replacement_is_mother_work = fields.Boolean('Is Replacement Mother Work?')
- # replacement_mother_income = fields.Float("Replacement Mother Income")
- # replacement_mother_birth_date = fields.Date(string="Replacement Mother Birth Date")
- # replacement_mother_age = fields.Integer(string="Replacement Mother Age",
- # compute='_compute_get_replacement_mother_age')
- # replacement_mother_city_id = fields.Many2one('res.country.city', string='City')
- # replacement_mother_dead_reason = fields.Char(string='Dead Reason', required=False)
- # replacement_mother_dead_date = fields.Date(string="Certificate Date")
- # replacement_mother_dead_city_id = fields.Many2one('res.country.city', string='Dead City')
- # replacement_mother_status = fields.Selection(selection=[
- # ('benefit', 'Benefit'),
- # ('non_benefit', 'Non Benefit'),
- # ], string='Replacement Mother Status', compute="check_replacement_mother_status", store=True, default=False)
- # # Education_data for replacement mother
- # replacement_education_status = fields.Selection(string='Education Status',
- # selection=[('educated', 'educated'), ('illiterate', 'illiterate')])
- # replacement_case_study = fields.Selection(string='Mother Case Study',
- # selection=[('continuous', 'continuous'), ('intermittent', 'intermittent'),
- # ('graduate', 'Graduate')])
- # replacement_illiterate_reason = fields.Char(string='Illiterate Reason')
- # replacement_intermittent_reason = fields.Many2one('education.illiterate.reason',
- # string='Intermittent Reason')
- # replacement_education_entity = fields.Selection(string='Education Entity',
- # selection=[('governmental', 'Governmental'),
- # ('special', 'Special')])
- # replacement_entities = fields.Many2one("education.entities", string='Entity')
- # replacement_specialization_ids = fields.Many2one('specialization.specialization', string='specialization')
- # replacement_classroom = fields.Many2one('education.classroom', string='Classroom')
- # replacement_degree = fields.Many2one('education.result', string='Degree')
- # replacement_percentage = fields.Float(string="Percentage%")
- # replacement_education_start_date = fields.Date(string='Education Start Date')
- # replacement_education_end_date = fields.Date(string='Education End Date')
- #
- # replacement_last_education_entity = fields.Selection(string='Last Education Entity',
- # selection=[('governmental', 'Governmental'),
- # ('special', 'Special')])
- # replacement_last_entities = fields.Many2one("education.entities", string='Last Entity')
- # replacement_education_levels = fields.Many2one("education.level", string='Education Levels')
- # replacement_last_education_levels = fields.Many2one("education.level", string='Last Education Levels')
- # replacement_last_specialization_ids = fields.Many2one('specialization.specialization', string='Last Specialization')
- #
- # replacement_last_classroom = fields.Many2one('education.classroom', string='Last Classroom')
- # replacement_last_degree = fields.Many2one('education.result', string='Last Degree')
- # replacement_last_percentage = fields.Float(string="Last Percentage%")
- # replacement_last_education_start_date = fields.Date(string='Last Education Start Date')
- # replacement_last_education_end_date = fields.Date(string='Last Education End Date')
- # replacement_last_educational_certificate = fields.Binary(attachment=True, string='Last Educational Certificate')
- # replacement_weak_study = fields.Many2many('study.material', string='Weak Study')
- state = fields.Selection([
- ('draft', 'Draft'),
- ('new', 'Researcher Assignment'),
- ('complete_info', 'Waiting for Researcher'),
- ('waiting_approve', 'Waiting for Operation Manager'),
- ('first_approve', 'Waiting for Branch Manager'),
- ('first_refusal', 'First Refusal'),
- ('second_approve', 'Second Approved'),
- ('refused', 'Refused'),
- ('suspended_second_approve', 'Suspended Second Approved'),
- ('exception_second_approve', 'Waiting for General Manager'),
- ('black_list', 'Black List'),
- ], string='state', tracking=True, compute='_get_state', store=True, group_expand='_expand_states')
- state_a = fields.Selection([
- ('draft', 'Draft'),
- ('new', 'Researcher Assignment'),
- ('complete_info', 'Waiting for Researcher'),
- ('waiting_approve', 'Waiting for Operation Manager'),
- ('first_approve', 'Waiting for Branch Manager'),
- ('first_refusal', 'First Refusal'),
- ('second_approve', 'Second Approved'),
- ('refused', 'Refused'),
- ('suspended_second_approve', 'Suspended Second Approved'),
- ('exception_second_approve', 'Waiting for General Manager'),
- ('black_list', 'Black List'),
- ], string='stateA', default="draft", tracking=True)
- action_type = fields.Selection(selection=[
- ('new', 'New'),
- ('edit_info', 'Edit Information'),
- ('approved', 'Approved'),
- ('suspended', 'Suspended'),
- ('exception', 'Exception'),
- ], string='Action Type', default='new', tracking=True)
- member_status = fields.Selection(selection=[
- ('benefit', 'Benefit'),
- ('non_benefit', 'Non Benefit'),
- ], string='Benefit Status', compute="check_member_status", default=False, store=True)
- suspend_reason = fields.Many2one('suspend.reason', string='Suspend Reason')
- reason = fields.Text(string='Reason')
- suspend_description = fields.Text(string='Suspend Description')
- suspend_attachment = fields.Binary(string='Suspend Attachment', attachment=True)
- suspend_type = fields.Selection(
- selection=[('temporarily_suspend', 'Temporarily Suspended'), ('suspend', 'Suspend')], string="Suspend Type")
- suspend_method = fields.Selection(selection=[('manual', 'Manual'), ('auto', 'Auto')], string="Suspend Method",
- default='auto')
- is_member_workflow = fields.Boolean('Is Member Workflow?')
- # sponsor_id = fields.Many2one('res.partner', string='Sponsor Partner',domain="[('account_type','=','sponsor')]")
- sponsor_id = fields.Many2one('res.partner', string='Sponsor Partner', domain="[('is_sponsor_portal', '=', True)]")
- sponsor_related_id = fields.Many2one('res.partner', string='Sponsor')
- sponsorship_id = fields.Many2one('takaful.sponsorship', string='Sponsorship')
- required_attach = fields.Selection(selection=[('true', 'True'), ('false', 'False')], compute='get_required_attach',
- store=True, string='Member Required Attach')
- # Exception fields
- exception_reason = fields.Many2one('exception.reason', string='Exception Reason')
- exception_description = fields.Text(string='Exception Description')
- exception_type = fields.Selection(
- selection=[('temporarily_exception', 'Temporarily Exception'), ('permanent_exception', 'Permanent Exception')],
- string="Exception Type")
- exception_attachment = fields.Binary(string='Exception Attachment', attachment=True)
- exception_start_date = fields.Datetime(string='Exception Start Date')
- exception_end_date = fields.Datetime(string='Exception End Date')
- is_excluded_suspension = fields.Boolean('Excluded from suspension?')
- is_mother = fields.Boolean('Is Mother?')
- total_member_service_requests = fields.Integer(compute='_get_total_member_service_requests')
- non_benefit_reason = fields.Text(string="Non Benefit Reason", tracking=True)
-
- # def create(self, vals):
- # for line_vals in vals:
- # if line_vals.get("education_status", False) == "educated" and "member_education_status_ids" not in line_vals:
- # raise ValidationError(
- # _("You should at least insert one current/previous education status!")
- # )
- # return super(FamilyMemberProfile, self).create(vals)
-
- # def write(self, vals):
- # education_status = vals.get("education_status", False) or self.education_status
- # if education_status == "educated" and "member_education_status_ids" not in vals and not len(self.member_education_status_ids):
- # raise ValidationError(
- # _("You should at least insert one current/previous education status!")
- # )
- # return super(FamilyMemberProfile, self).write(vals)
-
- def _expand_states(self, states, domain, order):
- return [key for key, val in type(self).state.selection]
-
-
- @api.model
- def _name_search(self, name, args=None, operator='ilike', limit=100, name_get_uid=None):
- if not args:
- args = []
- if name:
- args = expression.AND([args, ['|', ('name', operator, name), ('member_phone', operator, name)]])
-
- return self._search(args, limit=limit, access_rights_uid=name_get_uid)
-
- @api.onchange('age')
- def _check_son_daughter_age(self):
- for rec in self:
- if rec.relationn.relation_type in ['son', 'daughter'] and rec.relationn.age_difference > 0:
- if rec.benefit_id.father_age and rec.benefit_id.father_age - rec.age < rec.relationn.age_difference:
- raise ValidationError(
- _("The son/daughter's age is supposed to be less than the father's age by %s") % rec.relationn.age_difference
- )
- if rec.benefit_id.mother_age and rec.benefit_id.mother_age - rec.age < rec.relationn.age_difference:
- raise ValidationError(
- _("The son/daughter's age is supposed to be less than the mother's age by %s") % rec.relationn.age_difference
- )
-
- @api.depends('age_status', 'is_dead', 'benefit_id.member_ids.age_status', 'benefit_id.member_ids.is_dead')
- def _compute_minor_siblings(self):
- for member in self:
- member.minor_siblings = any(
- m.age_status == 'minor' and m.member_status == 'benefit'
- for m in member.benefit_id.member_ids
- )
-
- @api.constrains('is_dead', 'death_certificate')
- def _check_death_certificate_required(self):
- for rec in self:
- if rec.is_dead and not rec.death_certificate:
- raise ValidationError(_(
- "Death Certificate is required for member '%s' when marked as deceased."
- ) % rec.name)
-
- @api.constrains('is_work', 'age', 'member_income', 'salary_certificate')
- def _check_salary_certificate_required(self):
- for rec in self:
- if rec.age >= 18 and rec.is_work:
- if rec.member_income <= 0:
- raise ValidationError(_(
- "Income must be greater than 0 for member '%s' when working and age is greater than or equal to 18."
- ) % rec.name)
- if not rec.salary_certificate:
- raise ValidationError(_(
- "Salary Certificate is required for member '%s' when working and age is greater than or equal to 18."
- ) % rec.name)
-
- @api.constrains('is_mother', 'is_married', 'marriage_certificate')
- def _check_marriage_certificate_required(self):
- for rec in self:
- if not rec.is_mother and rec.is_married and not rec.marriage_certificate:
- raise ValidationError(_(
- "Marriage Certificate is required for member '%s' when marked as married and not a mother."
- ) % rec.name)
-
- @api.constrains('member_first_name')
- def _check_names_alphabetic(self):
- char_fields = {
- 'member_first_name': _('Member First Name'),
- }
- for record in self:
- for field_name, field_label in char_fields.items():
- field_value = getattr(record, field_name)
- if field_value and not re.match(ALPHABETIC_PATTERN, field_value.strip()):
- raise ValidationError(
- _("%s must contain only alphabetic characters and spaces. "
- "Numbers and special characters are not allowed.") % field_label
- )
-
- @api.depends('age')
- def _compute_get_age_status(self):
- for rec in self:
- current_education_status_id = rec.member_education_status_ids.filtered(
- lambda r: r.education_status_type == 'current')
- if rec.relationn.relation_type == 'son' and rec.age <= 18:
- rec.age_status = 'minor'
- elif rec.relationn.relation_type == 'daughter' and rec.age <= 26:
- rec.age_status = 'minor'
- elif rec.relationn.relation_type == 'son' and rec.age <= 22 and (
- current_education_status_id.specialization_ids.is_scientific_specialty or current_education_status_id.specialization_ids.is_medical_specialty):
- rec.age_status = 'minor'
- else:
- rec.age_status = 'non_minor'
-
- @api.constrains('birth_date')
- def _check_dates(self):
- today = date.today()
-
- for rec in self:
- # Check that dates are not in the future
- if rec.birth_date and rec.birth_date > today:
- raise ValidationError("Member's Birth Date cannot be in the future.")
-
- def unlink(self):
- for order in self:
- if order.state not in ['draft']:
- raise UserError(_('You cannot delete this record'))
- self.env['ir.attachment'].search([('member_id', '=', order.id)]).unlink()
- if order.hobbies_ids:
- order.hobbies_ids.unlink()
- if order.diseases_ids:
- order.diseases_ids.unlink()
- if order.disabilities_ids:
- order.disabilities_ids.unlink()
- if order.member_education_status_ids:
- order.member_education_status_ids.unlink()
-
- return super(FamilyMemberProfile, self).unlink()
-
- @api.depends('is_member_workflow', 'benefit_id.state', 'state_a')
- def _get_state(self):
- for rec in self:
- if not rec.is_member_workflow:
- rec.state = rec.benefit_id.state
- else:
- rec.state = rec.state_a
-
- @api.depends('member_first_name', 'member_second_name', 'member_third_name', 'member_family_name')
- def get_partner_name(self):
- for rec in self:
- rec.name = ''
- if all([rec.member_second_name, rec.member_first_name, rec.member_third_name, rec.member_family_name]):
- rec.name = rec.member_first_name + " " + rec.member_second_name + " " + rec.member_third_name + " " + rec.member_family_name
- elif all([rec.mother_second_name, rec.mother_first_name, rec.mother_third_name, rec.mother_family_name]):
- rec.name = rec.mother_first_name + " " + rec.mother_second_name + " " + rec.mother_third_name + " " + rec.mother_family_name
- else:
- rec.name = ''
-
- @api.model
- def default_get(self, fields):
- res = super(FamilyMemberProfile, self).default_get(fields)
-
- # Get default attachments
- default_attachment = self.env["attachments.settings"].search([('is_default', '=', True)])
-
- # Prepare the list of default attachments for the one2many field
- default_attachments_data = []
- for attach in default_attachment:
- if attach.attach_type == 'member_attach':
- if not attach.name: # Ensure name is set
- raise ValidationError('The attachment name is missing.')
- default_attachments_data.append((0, 0, {
- 'name': attach.name,
- 'attach_id': attach.id,
- 'is_required': attach.is_required,
- 'is_default': attach.is_default,
- 'show_in_portal': attach.show_in_portal
- }))
-
- # Add the default attachments to the res dictionary for attachment_ids
- if 'attachment_ids' in fields:
- res['attachment_ids'] = default_attachments_data
-
- return res
-
- def _get_total_member_service_requests(self):
- for rec in self:
- rec.total_member_service_requests = self.env['service.request'].search_count(
- [('benefit_type', '=', 'member'), ('member_id', '=', rec.id)])
-
- def action_open_related_member_service_requests(self):
- """ Opens a tree view with related records filtered by a dynamic domain """
- member_service_requests = self.env['service.request'].search([
- ('benefit_type', '=', 'member'),
- ('member_id', '=', self.id)
- ]).ids
-
- action = {
- 'type': 'ir.actions.act_window',
- 'name': _('Service Requests'),
- 'res_model': 'service.request',
- 'view_mode': 'tree,form',
- 'domain': [('id', 'in', member_service_requests)],
- 'target': 'current',
- }
- return action
-
- @api.depends('attachment_ids')
- def get_required_attach(self):
- for rec in self.attachment_ids:
- if rec.is_required and not rec.datas:
- self.required_attach = None
- break
- elif rec.is_required and rec.datas:
- self.required_attach = 'true'
- elif rec.is_default and not rec.is_required and (rec.datas or not rec.datas):
- self.required_attach = 'true'
- else:
- self.required_attach = 'true'
-
- # def create_member_partner(self):
- # self.partner_id.write({
- # 'email': self.email,
- # 'phone': self.phone,
- # 'account_type': 'benefit',
- # 'is_benefit': True,
- # 'code': self.benefit_id.code,
- # })
-
- @api.depends(
- 'member_education_status_ids',
- 'member_education_status_ids.specialization_ids',
- 'member_education_status_ids.education_status',
- 'member_education_status_ids.case_study',
- 'relationn',
- 'birth_date',
- 'is_married',
- 'minor_siblings',
- 'member_income',
- 'is_married',
- 'member_location_conf',
- 'state',
- 'is_dead',
- 'benefit_id.member_ids.member_status',
- )
- def check_member_status(self):
- for rec in self:
- reasons = []
- rec.non_benefit_reason = False
- current_education_status_id = rec.member_education_status_ids.filtered(
- lambda r: r.education_status_type == 'current')
- if rec.state == 'second_approve' and rec.is_excluded_suspension:
- rec.member_status = 'benefit'
- continue
- if rec.birth_date:
- validation_setting = self.env["family.validation.setting"].search([], limit=1)
- female_benefit_age = validation_setting.female_benefit_age
- male_benefit_age = validation_setting.male_benefit_age
- exceptional_age_scientific_specialty = validation_setting.exceptional_age_scientific_specialty
- exceptional_age_medical_specialty = validation_setting.exceptional_age_medical_specialty
- exceptional_age_has_disabilities = validation_setting.exceptional_age_has_disabilities
- minor_siblings_age = validation_setting.minor_siblings_age
- max_income_for_benefit = validation_setting.max_income_for_benefit
- rec.member_status = 'benefit' # Default to benefit
- benefiting_children = rec.benefit_id.member_ids.filtered(
- lambda m: m.relationn.relation_type in ['son', 'daughter'] and m.member_status == 'benefit'
- )
- if rec.relationn.relation_type == 'mother':
- if not benefiting_children:
- rec.write({'member_status': 'non_benefit'})
- reasons.append(_("Mother has no benefiting children"))
- else:
- rec.member_status, mother_reasons = rec.benefit_id.check_mother_status()
- reasons.append(mother_reasons)
- elif rec.relationn.relation_type == 'replacement_mother':
- rec.member_status, repl_reasons = rec.benefit_id.check_replacement_mother_status()
- reasons.append(repl_reasons)
- if rec.state in ['suspended_second_approve', 'refused'] or not benefiting_children:
- rec.member_status = 'non_benefit'
- reasons.append(
- _("The application has been rejected due to missing required documents, lack of official proofs, or the family's ineligibility for the association's services."))
- # continue # Skip further checks for mothers
- # Gender-specific checks
- elif rec.relationn.relation_type == 'son':
- if rec.age > male_benefit_age:
- if rec.age <= exceptional_age_has_disabilities and rec.disabilities_attachment_ids and rec.minor_siblings:
- rec.member_status = 'benefit'
- else:
- if rec.age > exceptional_age_has_disabilities and rec.disabilities_attachment_ids:
- rec.member_status = 'non_benefit'
- reasons.append(
- _("He has a physical or intellectual disability but is over %s years of age.") % exceptional_age_has_disabilities)
- elif current_education_status_id.specialization_ids.is_scientific_specialty and rec.age > exceptional_age_scientific_specialty and not rec.minor_siblings:
- rec.member_status = 'non_benefit'
- reasons.append(
- _("He is enrolled in a scientific or vocational specialization but is over %s years of age.") % exceptional_age_scientific_specialty)
- elif current_education_status_id.specialization_ids.is_medical_specialty and rec.age > exceptional_age_medical_specialty and not rec.minor_siblings:
- rec.member_status = 'non_benefit'
- reasons.append(
- _("He is enrolled in a medical specialization but is over %s years of age.") % exceptional_age_medical_specialty)
- elif not any([current_education_status_id.specialization_ids.is_scientific_specialty,
- current_education_status_id.specialization_ids.is_medical_specialty]):
- rec.member_status = 'non_benefit'
- reasons.append(
- _("He is over %s years of age and not enrolled in a scientific or medical specialization.") % exceptional_age_medical_specialty)
- if not rec.minor_siblings:
- rec.member_status = 'non_benefit'
- reasons.append(
- _("He is over %s years of age and not enrolled in an educational institution.") % male_benefit_age)
- if rec.is_work:
- if rec.member_income > max_income_for_benefit:
- rec.member_status = 'non_benefit'
- reasons.append(_("He is employed with a salary exceeding %s.") % max_income_for_benefit)
- if not rec.is_married and rec.education_status in ['illiterate']:
- rec.member_status = 'non_benefit'
- reasons.append(
- _("He is over %s years of age and not enrolled in an educational institution.") % male_benefit_age)
- if not rec.is_married and rec.education_status in [
- 'educated'] and current_education_status_id.case_study in [
- 'graduate', 'intermittent']:
- rec.member_status = 'non_benefit'
- reasons.append(
- _("He is over %s years of age and has completed his education.") % male_benefit_age)
- if not rec.member_location_conf.is_benefit:
- rec.member_status = 'non_benefit'
- reasons.append(_("He does not reside with his family."))
- if rec.state in ['suspended_second_approve', 'refused'] or rec.is_dead == True:
- rec.member_status = 'non_benefit'
- reasons.append(
- _("Failure to complete the required documents or official proofs, or the family’s ineligibility for the association’s services, and the application has been rejected."))
- elif rec.relationn.relation_type == 'daughter':
- if rec.age < female_benefit_age and rec.is_married:
- rec.member_status = 'non_benefit'
- reasons.append(_("Married"))
- if rec.age < female_benefit_age and rec.is_work and rec.education_status not in [
- 'educated'] and current_education_status_id.case_study != 'continuous':
- rec.member_status = 'non_benefit'
- reasons.append(_("She is employed and not enrolled in an educational institution."))
- if rec.age > female_benefit_age:
- if rec.age > minor_siblings_age and not rec.minor_siblings:
- rec.member_status = 'non_benefit'
- reasons.append(
- _("She is over %s years of age and has no underage brothers.") % female_benefit_age)
- elif not rec.minor_siblings:
- rec.member_status = 'non_benefit'
- reasons.append(
- _("She is over %s years of age and has no underage brothers.") % female_benefit_age)
- elif rec.minor_siblings and rec.age > minor_siblings_age:
- rec.member_status = 'non_benefit'
- reasons.append(_("She is over %s years of age.") % minor_siblings_age)
- # elif rec.is_work and current_education_status_id.education_status in ['illiterate'] and current_education_status_id.case_study in [
- # 'graduate', 'intermittent']:
- # rec.member_status = 'non_benefit'
- elif rec.is_married:
- rec.member_status = 'non_benefit'
- reasons.append(_("Married"))
- # elif not rec.minor_siblings:
- # rec.member_status = 'non_benefit'
- if rec.is_work and rec.member_income > max_income_for_benefit and rec.education_status in [
- 'educated'] and current_education_status_id.case_study == 'continuous':
- rec.member_status = 'non_benefit'
- reasons.append(_("She works with a salary greater than %s.") % max_income_for_benefit)
- if rec.is_work and rec.education_status in ['illiterate']:
- rec.member_status = 'non_benefit'
- reasons.append(_("She is employed and not enrolled in an educational institution."))
- if rec.is_work and rec.education_status in [
- 'educated'] and current_education_status_id.case_study in [
- 'graduate', 'intermittent']:
- rec.member_status = 'non_benefit'
- reasons.append(_("She is employed and has completed her education."))
- if not rec.member_location_conf.is_benefit:
- rec.member_status = 'non_benefit'
- reasons.append(_("She does not reside with the family."))
- if rec.state in ['suspended_second_approve', 'refused'] or rec.is_dead == True:
- rec.member_status = 'non_benefit'
- reasons.append(
- _("Application rejected due to missing documents, missing official proofs, or the family's ineligibility for the association's services."))
- # General checks for all members
- # if rec.is_work:
- # if rec.member_income > max_income_for_benefit:
- # rec.member_status = 'non_benefit'
- # if not rec.is_married and current_education_status_id.education_status in ['illiterate'] and current_education_status_id.case_study in [
- # 'graduate', 'intermittent']:
- # rec.member_status = 'non_benefit'
- # if rec.member_location in ['with_relative', 'study_outside_saudi_arabia']:
- # rec.member_status = 'non_benefit'
- else:
- rec.member_status = False
-
- if rec.member_status == 'non_benefit':
- reasons = [str(r) for r in reasons if r]
- rec.non_benefit_reason = "\n".join(reasons)
-
- # @api.depends('relationn','birth_date', 'is_scientific_specialty', 'is_medical_specialty', 'has_disabilities', 'is_married',
- # 'minor_siblings','member_income','is_married','member_location_conf','education_status','case_study','state','is_dead')
- # def check_member_status(self):
- # for rec in self:
- # if rec.state == 'second_approve' and rec.is_excluded_suspension:
- # rec.member_status = 'benefit'
- # continue
- # if rec.birth_date:
- # validation_setting = self.env["family.validation.setting"].search([], limit=1)
- # female_benefit_age = validation_setting.female_benefit_age
- # male_benefit_age = validation_setting.male_benefit_age
- # exceptional_age_scientific_specialty = validation_setting.exceptional_age_scientific_specialty
- # exceptional_age_medical_specialty = validation_setting.exceptional_age_medical_specialty
- # exceptional_age_has_disabilities = validation_setting.exceptional_age_has_disabilities
- # minor_siblings_age = validation_setting.minor_siblings_age
- # max_income_for_benefit = validation_setting.max_income_for_benefit
- # rec.member_status = 'benefit' # Default to benefit
- # if rec.relationn.relation_type == 'mother':
- # rec.member_status = rec.benefit_id.mother_status
- # if rec.relationn.relation_type == 'replacement_mother':
- # rec.member_status = rec.benefit_id.replacement_mother_status
- # if rec.state == 'suspended_second_approve':
- # rec.member_status = 'non_benefit'
- # # continue # Skip further checks for mothers
- # # Gender-specific checks
- # if rec.relationn.relation_type == 'son':
- # if rec.age > male_benefit_age:
- # if rec.has_disabilities and rec.age > exceptional_age_has_disabilities:
- # rec.member_status = 'non_benefit'
- # elif rec.is_scientific_specialty and rec.age > exceptional_age_scientific_specialty and not rec.has_disabilities and not rec.minor_siblings :
- # rec.member_status = 'non_benefit'
- # elif rec.is_medical_specialty and rec.age > exceptional_age_medical_specialty and not rec.has_disabilities and not rec.minor_siblings:
- # rec.member_status = 'non_benefit'
- # elif not any([rec.is_scientific_specialty, rec.is_medical_specialty, rec.has_disabilities]):
- # rec.member_status = 'non_benefit'
- # if rec.is_work:
- # if rec.member_income > max_income_for_benefit:
- # rec.member_status = 'non_benefit'
- # if not rec.is_married and rec.education_status in ['illiterate']:
- # rec.member_status = 'non_benefit'
- # if not rec.is_married and rec.education_status in ['educated'] and rec.case_study in [
- # 'graduate', 'intermittent']:
- # rec.member_status = 'non_benefit'
- # if not rec.member_location_conf.is_benefit:
- # rec.member_status = 'non_benefit'
- # if rec.state == 'suspended_second_approve' or rec.is_dead == True:
- # rec.member_status = 'non_benefit'
- # elif rec.relationn.relation_type == 'daughter':
- # if rec.age < female_benefit_age and rec.is_married:
- # rec.member_status = 'non_benefit'
- # if rec.age < female_benefit_age and rec.is_work and rec.education_status not in ['educated'] and rec.case_study != 'continuous':
- # rec.member_status = 'non_benefit'
- # if rec.age > female_benefit_age:
- # if rec.age > minor_siblings_age and not rec.minor_siblings:
- # rec.member_status = 'non_benefit'
- # elif not rec.minor_siblings:
- # rec.member_status = 'non_benefit'
- # elif rec.minor_siblings and rec.age > minor_siblings_age:
- # rec.member_status = 'non_benefit'
- # # elif rec.is_work and rec.education_status in ['illiterate'] and rec.case_study in [
- # # 'graduate', 'intermittent']:
- # # rec.member_status = 'non_benefit'
- # elif rec.is_married:
- # rec.member_status = 'non_benefit'
- # # elif not rec.minor_siblings:
- # # rec.member_status = 'non_benefit'
- # if rec.is_work and rec.member_income > max_income_for_benefit and rec.education_status in ['educated'] and rec.case_study == 'continuous':
- # rec.member_status = 'non_benefit'
- # if rec.is_work and rec.education_status in ['illiterate'] :
- # rec.member_status = 'non_benefit'
- # if rec.is_work and rec.education_status in ['educated'] and rec.case_study in [
- # 'graduate', 'intermittent']:
- # rec.member_status = 'non_benefit'
- # if not rec.member_location_conf.is_benefit:
- # rec.member_status = 'non_benefit'
- # if rec.state == 'suspended_second_approve' or rec.is_dead == True:
- # rec.member_status = 'non_benefit'
- # # General checks for all members
- # # if rec.is_work:
- # # if rec.member_income > max_income_for_benefit:
- # # rec.member_status = 'non_benefit'
- # # if not rec.is_married and rec.education_status in ['illiterate'] and rec.case_study in [
- # # 'graduate', 'intermittent']:
- # # rec.member_status = 'non_benefit'
- # # if rec.member_location in ['with_relative', 'study_outside_saudi_arabia']:
- # # rec.member_status = 'non_benefit'
- # else:
- # rec.member_status = False
-
- @api.depends('birth_date')
- def _compute_get_age_date(self):
- for rec in self:
- if rec.birth_date:
- today = date.today()
- day = datetime.strptime(str(rec.birth_date), DEFAULT_SERVER_DATE_FORMAT)
- age = rd(today, day)
- rec.age = age.years
- else:
- rec.age = 0
-
- @api.onchange("member_id_number")
- def onchange_member_id_number(self):
- for rec in self:
- if rec.member_id_number:
- if not rec.member_id_number.isdigit():
- raise ValidationError(_("The ID number should contain only digits."))
- if len(rec.member_id_number) != 10:
- raise ValidationError(_("The ID number must contain exactly 10 digits."))
-
- family = rec.benefit_id
- if rec.relationn.relation_type in ['mother', 'replacement_mother']:
- allowed_ids = [family.mother_id_number,family.replacement_mother_id_number]
- if rec.member_id_number in allowed_ids:
- continue
- if rec.member_id_number in [family.father_id_number,family.mother_id_number,family.replacement_mother_id_number]:
- raise ValidationError(
- _("Member ID %s cannot match father/mother/replacement mother ID.") %
- rec.member_id_number
- )
- existing_member = rec.search([
- ('id', '!=', rec._origin.id),
- ('member_id_number', '=', rec.member_id_number),
- ('relationn.relation_type', 'not in', ['mother', 'replacement_mother'])
- ], limit=1)
- if existing_member:
- raise ValidationError(_("This ID already exists."))
- if rec.relationn.relation_type not in ['mother', 'replacement_mother']:
- conflict_family = rec.env['grant.benefit'].search([
- ('id', '!=', family._origin.id),
- '|', '|',
- ('father_id_number', '=', rec.member_id_number),
- ('mother_id_number', '=', rec.member_id_number),
- ('replacement_mother_id_number', '=', rec.member_id_number),
- ], limit=1)
- if conflict_family:
- raise ValidationError(
- _("Member ID %s already exists in another family (code %s).") %
- (rec.member_id_number, conflict_family.code)
- )
-
- @api.onchange('relationn', 'member_status', 'gender', 'birth_date', 'is_scientific_specialty',
- 'is_medical_specialty', 'is_married',
- 'minor_siblings', 'member_income', 'is_married', 'member_location_conf', 'education_status',
- 'case_study')
- def onchange_member_status(self):
- res = {}
- for rec in self:
- if rec.member_status == 'non_benefit':
- res['warning'] = {'title': _('ValidationError'),
- 'message': _('Not Benefit')}
- return res
-
- # Member Suspend Manual
- def action_suspend(self):
- for rec in self:
- rec.is_member_workflow = True
- rec.is_excluded_suspension = False
- return {
- 'name': _('Suspend Reason Wizard'),
- 'view_mode': 'form',
- 'view_type': 'form',
- 'type': 'ir.actions.act_window',
- 'res_model': 'suspend.reason.wizard',
- 'view_id': self.env.ref('odex_benefit.view_suspend_member_reason_wizard_form').id,
- 'target': 'new',
- }
-
- def action_suspend_first_accept(self):
- for rec in self:
- rec.state_a = 'first_approve'
-
- def action_suspend_second_accept(self):
- for rec in self:
- rec.state_a = 'suspended_second_approve'
-
- def action_suspend_refuse(self):
- for rec in self:
- rec.state_a = 'second_approve'
- rec.is_member_workflow = False
-
- # Excption Work flow
- def action_exception(self):
- for rec in self:
- rec.is_member_workflow = True
- return {
- 'name': _('Exception Wizard'),
- 'view_mode': 'form',
- 'view_type': 'form',
- 'type': 'ir.actions.act_window',
- 'res_model': 'exception.wizard',
- 'view_id': self.env.ref('odex_benefit.view_exception_member_wizard_form').id,
- 'target': 'new',
- }
-
- def action_exception_first_accept(self):
- for rec in self:
- rec.state_a = 'first_approve'
-
- def action_exception_second_accept(self):
- for rec in self:
- rec.is_excluded_suspension = True
- rec.state_a = 'exception_second_approve'
- # rec.is_member_workflow = False
-
- def action_exception_final_accept(self):
- for rec in self:
- rec.is_excluded_suspension = True
- rec.state_a = 'second_approve'
- rec.is_member_workflow = False
-
- def action_auto_exception(self):
- obj = self.env["family.member"].search(
- [('state', '=', 'second_approve'), ('is_excluded_suspension', '=', True)])
- for rec in obj:
- if rec.exception_end_date and rec.exception_end_date <= fields.Datetime.now():
- rec.is_excluded_suspension = False
- rec.state = 'suspended_second_approve'
-
- def action_exception_refuse(self):
- for rec in self:
- rec.state_a = 'suspended_second_approve'
-
- # Methods for Work flow for Member
- def complete_data(self):
- # message = self.create_message('complete_info')
- # self.partner_id.send_sms_notification(message, self.phone)
- self.state_a = 'complete_info'
- return {
- 'name': _('Rerearcher Wizard'),
- 'view_mode': 'form',
- 'view_type': 'form',
- 'type': 'ir.actions.act_window',
- 'res_model': 'researcher.member.wizard',
- 'view_id': self.env.ref('odex_benefit.view_resarcher_member_wizard_form').id,
- 'target': 'new',
- }
-
- def finish_complete_data(self):
- message = self.create_message('waiting_approve')
- # self.partner_id.send_sms_notification(message, self.phone)
- self.state_a = 'waiting_approve'
-
- def action_accepted(self):
- """Accept registration"""
- self.state_a = "second_approve"
-
- def action_first_refusal(self):
- """First refusal to entity registration"""
- domain = []
- context = {}
- context = dict(self.env.context or {})
- context['state_a'] = "first_refusal"
- # self.partner_id.send_sms_notification("First Refusal", self.phone)
- context['active_id'] = self.id
- return {
- 'name': _('Refuse Reason Wizard'),
- 'view_mode': 'form',
- 'view_type': 'form',
- 'type': 'ir.actions.act_window',
- 'res_model': 'entity.refused.reason.wizard',
- 'view_id': self.env.ref('odex_benefit.view_entity_refused_reason_wizard_form').id,
- 'target': 'new',
- 'domain': domain,
- 'context': context,
- }
-
- def action_refuse(self):
- """Refuse entity registration"""
- domain = []
- context = dict(self.env.context or {})
- context['state'] = "refused"
- context['active_id'] = self.id
- return {
- 'name': _('Refuse Reason Wizard'),
- 'view_mode': 'form',
- 'view_type': 'form',
- 'type': 'ir.actions.act_window',
- 'res_model': 'entity.refused.reason.wizard',
- 'view_id': self.env.ref('odex_benefit.view_entity_final_refused_reason_wizard_form').id,
- 'target': 'new',
- 'domain': domain,
- 'context': context,
- }
-
- def action_black_list(self):
- """Move benefit to black list"""
- domain = []
- context = dict(self.env.context or {})
- context['state'] = "black_list"
- context['active_id'] = self.id
- return {
- 'name': _('Black List Wizard'),
- 'view_mode': 'form',
- 'view_type': 'form',
- 'type': 'ir.actions.act_window',
- 'res_model': 'entity.black.list.wizard',
- 'view_id': self.env.ref('odex_benefit.view_entity_black_list_wizard_form').id,
- 'target': 'new',
- 'domain': domain,
- 'context': context,
- }
-
- def action_edit_info(self):
- self.state = 'complete_info'
-
- def action_finish_edit(self):
- for rec in self:
- # group_e = self.env.ref('odex_benefit.group_benefit_edit', False)
- # group_e.write({'users': [(3, self.user_id.id)]})
- rec.state_a = rec.old_stage
-
- def create_manual_visit(self):
- self.env['visit.location'].create({
- 'benefit_id': self.id,
- 'visit_date': date.today(),
- 'visit_types': 2,
- # 'selector': 'researcher',
- 'researcher_id': self.researcher_id.id,
- # 'researcher_team': rec.researcher_team.id,
- 'state': 'draft'
- })
-
- @api.onchange('member_phone')
- def _onchange_member_phone_validation(self):
- if self.member_phone:
- if self.member_phone.startswith('+966'):
- member_phone = self.member_phone[4:]
- self.member_phone = member_phone
- if re.match(SAUDI_MOBILE_PATTERN, self.member_phone) == None:
- raise ValidationError(
- _('Enter a valid Saudi mobile number'))
- exist = self.search([('member_phone', '=', self.member_phone)])
- if exist:
- raise ValidationError(
- _('This Phone Already Exist!'))
- # Check if the father ID and mother ID are the same on the same record
- if self.member_phone == self.benefit_id.phone or self.member_phone == self.benefit_id.phone2 or self.member_phone == self.benefit_id.sms_phone:
- raise ValidationError(
- _("Phone number cannot be the same in The Family"))
-
- # Check if the ID number exists in other records or in family members
- exist = self.search([
- ('member_phone', '=', self.member_phone)
- ], limit=1)
- exist_in_family = self.env["grant.benefit"].search([
- '|', '|',
- ('phone', '=', self.member_phone),
- ('phone2', '=', self.member_phone),
- ('sms_phone', '=', self.member_phone),
- ], limit=1)
- if exist or exist_in_family:
- if exist_in_family:
- raise ValidationError(
- _("The phone Number already exists in Family with code %s") % exist_in_family.code)
- if exist:
- raise ValidationError(
- _("The phone Number already exists in Family with code %s") % exist.benefit_id.code)
diff --git a/odex25_ensan/odex_benefit/models/family_validation_setting.py b/odex25_ensan/odex_benefit/models/family_validation_setting.py
deleted file mode 100644
index 2d965aa5c..000000000
--- a/odex25_ensan/odex_benefit/models/family_validation_setting.py
+++ /dev/null
@@ -1,49 +0,0 @@
-from odoo import fields, models, api, _
-from odoo.exceptions import ValidationError
-
-
-class FamilyValidationSetting(models.Model):
- _name = 'family.validation.setting'
-
- female_benefit_age = fields.Integer(string='Female Benefit Age')
- male_benefit_age = fields.Integer(string='Male Benefit Age')
- exceptional_age_scientific_specialty = fields.Integer(string='Exceptional Age Scientific Specialty')
- exceptional_age_medical_specialty = fields.Integer(string='Exceptional Age Medical Specialty')
- exceptional_age_has_disabilities = fields.Integer(string='Exceptional Age Has Disabilities')
- max_income_for_benefit = fields.Float(string='Max Income Benefit')
- mini_income_for_mother = fields.Float(string='Min Income Mother')
- max_income_for_mother = fields.Float(string='Max Income Mother')
- minor_siblings_age = fields.Integer(string='Minor Siblings Age')
-
- cash_expense = fields.Float(string='Cash Expense')
- cash_expense_account_id = fields.Many2one('account.account', string='Cash Expense Account',
- domain=[('deprecated', '=', False), ('internal_type', '=', 'other')])
- meal_expense = fields.Float(string='Meal Expense')
- meal_expense_account_id = fields.Many2one('account.account', string='Meal Expense Account',
- domain=[('deprecated', '=', False), ('internal_type', '=', 'other')])
- clothing_expense = fields.Float(string='Clothing Expense')
- clothing_expense_account_id = fields.Many2one('account.account', string='Clothing Expense Account',
- domain=[('deprecated', '=', False), ('internal_type', '=', 'other')])
-
- benefit_category_ids = fields.Many2many(comodel_name='benefit.category',
- relation='benefit_category_family_validation_rel',
- column1='family_id', column2='categ_id', string='Benefit Categories')
-
- meal_partner_id = fields.Many2one('res.partner', string='Meal Partner')
- journal_id = fields.Many2one('account.journal', string='Journal')
- payment_journal_id = fields.Many2one('account.journal', string='Payment Journal' , domain="[('type', 'in', ['cash', 'bank'])]")
- account_id = fields.Many2one('account.account',string='Expenses Account')
- accountant_id = fields.Many2one('res.users', string='Accountant')
-
- @api.constrains('meal_expense_account_id', 'clothing_expense_account_id', 'cash_expense_account_id')
- def _constraint_amount_should_be_positive_if_account_selected(self):
- for rec in self:
- if rec.meal_expense_account_id:
- if rec.meal_expense <= 0:
- raise ValidationError(_('Meal Expense should be positive if meal account selected'))
- if rec.clothing_expense_account_id:
- if rec.clothing_expense <= 0:
- raise ValidationError(_('Clothing Expense should be positive if clothing account selected'))
- if rec.cash_expense_account_id:
- if rec.cash_expense <= 0:
- raise ValidationError(_('Cash Expense should be positive if cash account selected'))
diff --git a/odex25_ensan/odex_benefit/models/generate_reports.py b/odex25_ensan/odex_benefit/models/generate_reports.py
deleted file mode 100644
index 5518168fa..000000000
--- a/odex25_ensan/odex_benefit/models/generate_reports.py
+++ /dev/null
@@ -1,447 +0,0 @@
-import base64
-import datetime
-from odoo import fields, models, api, _
-from odoo.exceptions import ValidationError, UserError
-
-
-class ReportLog(models.Model):
- _name = 'generate.reports.log'
- _description = 'Reports log'
-
- name = fields.Char()
- datetime = fields.Datetime()
- user_id = fields.Many2one('res.users')
- attach = fields.Binary(string="", )
-
-
-class GenerateReports(models.TransientModel):
- _name = 'generate.reports'
- _description = 'Generate Reports For Benefits'
-
- name = fields.Char()
- current_user = fields.Many2one('res.users', 'Current User', default=lambda self: self.env.user)
- service_to = fields.Selection(
- selection=[('benefit', 'Benefit'), # 1
- ('family', 'Family'), # 2
- ('house', 'House')]) # 3
- service_category = fields.Selection(
- string='', selection=[('financial', 'financial'),
- ('In-kind', 'In-kind'),
- ('seasonal', 'seasonal'), ])
- house_service_category = fields.Selection(
- string='', selection=[('financial', 'financial'),
- ('In-kind', 'In-kind'),
- ('fittings', 'fittings'),
- ('car_need', 'car need'),
- ])
- benefit_service_category = fields.Selection(
- string='', selection=[('financial', 'financial'),
- ('In-kind', 'In-kind'),
- ('teaching', 'teaching'),
- ('qualification', 'qualification'),
- ('training', 'training'),
- ('omra', 'omra'),
- ])
- seasonal_service_type = fields.Selection(
- string='', selection=[
- ('zkat', 'zkat alfeter'),
- ('sacrifice', 'sacrifice')
- ])
- service_type = fields.Selection(
- string='', selection=[
- ('urgent', 'urgent'),
- ('non-urgent', 'non-urgent'),
- ])
- # position = fields.Selection(string="Position",
- # selection=service_to_benefit + service_to_benefit,
- # compute='calculation_list', store=True)
- # service_to_benefit = fields.Selection(string='Company Position', selection=service_to_benefit)
- housing_financial_type = fields.Selection(
- string='', selection=[
- ('rent', 'rent amount'),
- ('maintenance', 'maintenance expenses'),
- ('expenses', 'All expenses'),
- ])
- qualification_type = fields.Selection(
- string='', selection=[
- ('fat', 'fat'),
- ('behavior', 'behavior'),
- ])
- teaching_type = fields.Selection(
- string='', selection=[
- ('literacy', 'Literacy'),
- ('memorization', 'memorization'),
- ('specialty', 'specialty'),
- ])
- report_file = fields.Binary(string="", )
-
- education_status = fields.Selection(string='Education Status',
- selection=[('educated', 'educated'), ('illiterate', 'illiterate')])
- case_study = fields.Selection(string='Education Status', selection=[('continuous', 'continuous'),
- ('intermittent', 'intermittent')])
- category_id = fields.Many2many('benefit.category')
- date = fields.Datetime(string='Date', default=fields.Datetime.now)
- date_from = fields.Datetime()
- date_to = fields.Datetime()
- club_programs = fields.Many2one('benefit.programs', string='')
- age_from = fields.Integer()
- age_to = fields.Integer()
- max_rent = fields.Integer()
- family_id = fields.Many2many('benefit.family','benefit_family_group_rel','generate_id','benefit_id')
- benefit_id = fields.Many2many('grant.benefit')
- housing_id = fields.Many2many('benefit.housing')
- housing_room_ids = fields.Many2many('housing.rooms.members')
- housing_rent_ids = fields.Many2many('housing.need')
- specialization_id = fields.Many2one('specialization.specialization')
- product_id = fields.Many2one('product.product')
- appliances_furniture_need = fields.Many2many('appliances.furniture.need')
- # appliances_furniture_need = fields.Many2many('benefit.housing.rooms')
- behavior_id = fields.Many2one('benefit.behaviors.type')
- training_type_id = fields.Many2one('training.type')
- percentage = fields.Float()
- benefit_ids = fields.Many2many('grant.benefit', 'benefits', 'id_number', 'birth_date')
- benefit_f_needs_percent = fields.Many2many('grant.benefit', 'financial', 'id_number', 'birth_date')
- benefit_qualification_ids = fields.Many2many('grant.benefit', 'qualification', 'id_number', 'birth_date')
- benefit_teaching_ids = fields.Many2many('grant.benefit', 'teaching', 'id_number', 'specialization_ids')
- benefit_training_ids = fields.Many2many('grant.benefit', 'training', 'id_number', 'specialization_ids')
- benefit_omra_ids = fields.Many2many('grant.benefit', 'benefits_omra', 'age', 'amra_date')
- black_list = fields.Many2many('grant.benefit', 'black_list', 'id_number', 'is_zakat_fitr')
- housing_need_car_ids = fields.Many2many('benefit.housing', 'cars', 'name', 'benefit_ids')
- benefits_need_ids = fields.Many2many('benefits.needs')
- family_need_ids = fields.Many2many('benefit.family')
- description = fields.Char()
- fat = fields.Float(default=30.0)
-
- @api.onchange('service_to', 'service_type', 'benefit_service_category', 'house_service_category',
- 'service_category', 'behavior_id', 'seasonal_service_type',
- 'product_id', 'qualification_type',
- 'teaching_type', 'housing_financial_type', 'behavior_id')
- def calculation(self):
- domain = []
- domain += [('age', '>=', self.age_from), ('age', '<=', self.age_to if self.age_to != 0 else 3000)]
- if self.service_to == 'benefit': # 1
- # 1
- if self.benefit_service_category == 'financial':
- ids = []
- benefits_f_need = self.env['grant.benefit'].sudo().search([])
- for i in benefits_f_need:
- if i.benefit_needs_percent >= self.percentage:
- ids.append(i.id)
- self.benefit_f_needs_percent = ids
- # 2
- if self.benefit_service_category == 'In-kind' and self.product_id:
- if self.service_type == 'urgent':
- benefits_need = self.env['benefits.needs'].sudo().search(
- [('state', 'in', ['approve', 'published']), ('need_status', '=', 'urgent'),
- ('need_type_ids', 'in', self.product_id.id)])
- if self.service_type == 'non-urgent':
- benefits_need = self.env['benefits.needs'].sudo().search(
- [('state', 'in', ['approve', 'published']), ('need_status', '=', 'not_urgent'),
- ('need_type_ids', 'in', self.product_id.id)])
- if self.service_type:
- self.benefits_need_ids = [(6, 0, benefits_need.ids)]
- # 3
- if self.benefit_service_category == 'omra': # B
- benefits = self.env['grant.benefit'].sudo().search(domain)
- self.benefit_omra_ids = [(6, 0, benefits.ids)]
- # 4
- if self.benefit_service_category == 'qualification': # 2
- if self.qualification_type == 'behavior':
- benefits_list = []
- benefits = self.env['grant.benefit'].sudo().search(domain)
- for i in benefits:
- for x in i.benefit_behavior_ids:
- if self.behavior_id.id == x.behavior_id.id:
- benefits_list.append(i.id)
- self.benefit_qualification_ids = [(6, 0, benefits_list)]
- if self.qualification_type == 'fat': # 5
- domain += [('p_weight', '>', self.fat)]
- benefits = self.env['grant.benefit'].sudo().search(domain)
- self.benefit_qualification_ids = [(6, 0, benefits.ids)]
- # 5
- if self.benefit_service_category == 'teaching': # 5
- if self.teaching_type == 'literacy':
- domain += [('education_status', '=', 'illiterate')]
- benefits = self.env['grant.benefit'].sudo().search(domain)
- # self.benefit_teaching_ids = [(6, 0, benefits.ids)]
- if self.teaching_type == 'memorization':
- domain += [('is_quran_memorize', '=', True)]
- benefits = self.env['grant.benefit'].sudo().search(domain)
- # self.benefit_teaching_ids = [(6, 0, benefits.ids)]
- if self.teaching_type == 'specialty':
- domain += [('specialization_ids', '=', self.specialization_id.id)]
- benefits = self.env['grant.benefit'].sudo().search(domain)
- if self.teaching_type:
- self.benefit_teaching_ids = [(6, 0, benefits.ids)]
- # 6
- if self.benefit_service_category == 'teaching': # 5
- if self.training_type_id:
- self.benefit_teaching_ids = [(6, 0, benefits.ids)]
- if self.service_to == 'family': # 2
- if self.service_category == 'financial':
- ids = []
- benefit_family = self.env['benefit.family'].sudo().search([])
- for i in benefit_family:
- if i.benefit_needs_percent >= self.percentage:
- ids.append(i.id)
- self.family_need_ids = ids
- # 2
- if self.service_category == 'seasonal' and self.seasonal_service_type == 'zkat':
- benefits = self.env['grant.benefit'].sudo().search([])
- black_list = self.env['grant.benefit'].sudo().search([('is_zakat_fitr', '=', False)])
- self.black_list = [(6, 0, black_list.ids)]
- benefits_list = []
- for i in benefits:
- benefits_list.append(i.id)
- for i in black_list:
- if i.id in benefits_list:
- if i.id in self.black_list.ids:
- benefits_list.remove(i.id)
- self.benefit_ids = [(6, 0, benefits_list)]
- if self.service_to == 'house': # 3
- if self.house_service_category == 'In-kind' and self.product_id:
- for rec in self:
- rooms = rec.env['benefit.housing.rooms'].sudo().search(
- [('items.item.name', '=', rec.product_id.name)])
- room_list = []
- need_list = []
- for room in rooms:
- needs = {}
- needs["ap_id"] = self._origin.id
- needs["housing_id"] = room.housing_id.id
- needs["room_id"] = room.id
- for test in room.items:
- if test.item.name == rec.product_id.name:
- if test.percentage >= self.percentage:
- needs["percentage"] = test.percentage
- needs["status"] = test.status.id
- needs["name"] = test.item.name
- room_list.append(room.housing_id.id)
- need_list.append(needs)
- if rooms:
- benefit = []
- for room in rooms:
- benefits = rec.env['grant.benefit'].sudo().search(
- [('housing_id', '=', room.housing_id.id), ('benefit_type', '=', 'benefit')])
- for i in benefits:
- benefit.append(i.id)
- for r in rec:
- r.benefit_ids = [(6, 0, benefit)]
- for ap in self.appliances_furniture_need:
- for i in range(len(need_list)):
- if need_list[i]['housing_id'] == ap.housing_id:
- del need_list[i]
- break
- if not self.appliances_furniture_need:
- for need_item in need_list:
- self.appliances_furniture_need = [(0, 0, need_item)]
- if self.house_service_category == 'financial' and self.housing_financial_type == 'rent': # 3
- for rec in self:
- self.housing_rent_ids = False
- housing = rec.env['benefit.housing'].sudo().search([('rent_amount', '>=', rec.max_rent)])
- need_list = []
- for i in housing:
- needs = {}
- needs["ap_id"] = self._origin.id
- needs["housing_id"] = i.id
- # needs["benefit_id"] = room.housing_id.id
- needs["amount"] = i.rent_amount
- need_list.append(needs)
- self.housing_rent_ids = [(0, 0, needs)]
- if self.house_service_category == 'fittings':
- for rec in self:
- rooms = rec.env['housing.rooms.members'].sudo().search(
- [('is_accept', '!=', True)])
- self.housing_room_ids = rooms.ids
- if self.house_service_category == 'car_need':
- benefits = self.env['grant.benefit'].sudo().search([])
- ids = []
- for rec in benefits:
- if rec.car_count == 0:
- ids.append(rec.id)
- housing = rec.env['benefit.housing'].sudo().search([('benefit_ids', 'in', ids)])
- self.housing_need_car_ids = housing.ids
-
- @api.onchange('black_list')
- def calculation_2(self):
- if self.service_to == 'family' and self.service_category == 'seasonal' and self.service_type == 'zkat':
- black_list = self.env['grant.benefit'].sudo().search([('is_zakat_fitr', '=', False)])
- benefits_list = []
- for i in black_list:
- if i.id not in self.black_list.ids:
- benefits_list.append(i.id)
- for x in benefits_list:
- self.benefit_ids = [(4, x)]
-
- @api.onchange('benefit_ids')
- def calculation_3(self):
- if self.service_to == 'family' and self.service_category == 'seasonal' and self.service_type == 'zkat':
- benefit = self.env['grant.benefit'].sudo().search([])
- black_list = []
- for i in benefit:
- if i.id not in self.benefit_ids.ids:
- black_list.append(i.id)
- for x in black_list:
- self.black_list = [(4, x)]
-
- def get_result(self):
- # if self.service_to == 'family' and self.service_category == 'In-kind' and self.service_type == 'zkat':
- benefits_family = {}
- list = []
- for i in self.benefit_ids:
- dic = {}
- dic["family_id"] = i.family_id.id
- count = 0
- for x in self.benefit_ids:
- if x.family_id.id == dic["family_id"]:
- count += 1
- dic["benefits_total"] = count
- if dic not in list:
- list.append(dic)
- benefit_zkat = self.env['benefit.zkat'].sudo().create({'name': self.name, })
- for i in list:
- benefit_zkat.sudo().write({'zkat_ids': [(0, 0, i)]})
-
- def create_club(self):
- programs = self.env['benefit.programs'].sudo().search([('behaviors_programs', 'in', self.behavior_id.id)])
- benefit_club = self.env['benefit.club'].sudo().create({'name': self.name, 'benefit_type': 'internal', })
- benefit_club.benefit_programs = programs
- benefit_club.benefit_ids = self.benefit_qualification_ids
-
- def get_need(self):
- if self.service_to == 'benefit' and self.benefit_service_category == 'financial':
- ids = self.benefit_f_needs_percent.ids
- needs_value = 0.0
- for i in self.benefit_f_needs_percent:
- needs_value += i.benefit_needs_value
- benefit_need_type = ''
- if ids and len(ids) > 1:
- benefit_need_type = 'general'
- elif ids and len(ids) == 1:
- benefit_need_type = 'special'
- benefit_needs = self.env['benefits.needs'].sudo().create({
- 'name': self.name,
- 'benefit_need_type': benefit_need_type,
- 'date': datetime.datetime.now(),
- 'benefit_id': ids[0] if len(ids) == 1 else '',
- 'benefit_ids': [(6, 0, ids)] if len(ids) > 1 else [],
- 'f_amount': needs_value,
- 'state': 'sent',
- 'need_type_ids': [(4, self.product_id.id)] if self.product_id.id else []
- })
-
- def get_rent(self):
- pass
-
- # @api.multi
- def print_report(self):
- benefits = []
- needs = []
- family = []
- rooms = []
- columns_ar_headers = []
- columns_headers = []
- if self.service_to == 'benefit':
- if self.benefit_service_category == 'financial':
- columns_ar_headers = ['الاسم', 'العائلة', 'مبلغ الاحتياج', 'نسبة الاحتياج']
- columns_headers = ['name', 'family_id', 'benefit_needs_value', 'benefit_needs_percent']
- for i in self.benefit_f_needs_percent:
- benefits.append(i.id)
- if self.benefit_service_category == 'In-kind':
- columns_ar_headers = ['الاسم', 'نوع الاحتياج', 'التاريخ', 'نوع المستفيدين', 'حالة الاحتياج', 'الهدف',
- 'نسبة الاكمال', 'المستفيدين']
- columns_headers = ['name', 'benefit_need_type', 'date', 'benefit_type', 'need_status', 'target_amount',
- 'completion_ratio', 'benefit_ids']
- for i in self.benefits_need_ids:
- needs.append(i.id)
- if self.benefit_service_category == 'teaching':
- if self.teaching_type == 'memorization':
- columns_ar_headers = ['الاسم', 'العائلة', 'حافظ للقران']
- columns_headers = ['name', 'family_id', 'is_quran_memorize']
- if self.teaching_type == 'specialty':
- columns_ar_headers = ['الاسم', 'العائلة', 'التخصص']
- columns_headers = ['name', 'family_id', 'specialization_ids']
- for i in self.benefit_teaching_ids:
- benefits.append(i.id)
- if self.benefit_service_category == 'qualification':
- if self.qualification_type == 'behavior':
- columns_ar_headers = ['الاسم', 'النوع', 'العمر', 'السلوك']
- columns_headers = ['name', 'gender', 'age', 'benefit_behavior_ids']
- if self.qualification_type == 'fat':
- columns_ar_headers = ['الاسم', 'النوع', 'العمر', 'نسبة الدهون']
- columns_headers = ['name', 'gender', 'age', 'p_weight']
- for i in self.benefit_qualification_ids:
- benefits.append(i.id)
- if self.benefit_service_category == 'training':
- columns_ar_headers = ['الاسم', 'النوع', 'العمر', 'التدريب', 'السلوك']
- columns_headers = ['name', 'gender', 'age', 'p_weight', 'benefit_behavior_ids']
- if self.benefit_service_category == 'omra':
- columns_ar_headers = ['الاسم', 'النوع', 'العمر', 'تاريخ اخر عمرة']
- columns_headers = ['name', 'gender', 'age', 'amra_date']
- for i in self.benefit_omra_ids:
- benefits.append(i.id)
- if self.service_to == 'family':
- if self.service_category == 'financial':
- columns_ar_headers = ['الاسم', 'عدد المستفيدين', 'العائل', 'منتجة ام لا ', 'مجموع الدخل',
- 'مجموع المصروفات']
- columns_headers = ['name', 'benefits_total', 'responsible_benefit_id', 'is_producer', 'total_income',
- 'total_expenses']
- for i in self.family_need_ids:
- family.append(i.id)
- if self.service_category == 'seasonal' and self.seasonal_service_type == 'zkat':
- columns_ar_headers = ['الاسم', 'النوع', 'العمر', 'العائلة']
- columns_headers = ['name', 'gender', 'age', 'family_id']
- for i in self.benefit_ids:
- benefits.append(i.id)
- if self.service_to == 'house':
- if self.house_service_category == 'fittings':
- columns_ar_headers = ['الوحدة السكنية', 'الغرفة', 'نوع الغرفة', 'المستفيد', 'العمر', 'النوع']
- columns_headers = ['housing_id', 'room_id', 'rooms_categories_id', 'benefit_id', 'age', 'gender']
- for i in self.housing_room_ids:
- rooms.append(i.id)
-
- if benefits != [] or needs != [] or family != [] or rooms != [] or columns_ar_headers != [] or columns_headers != []:
- length = len(columns_headers)
- data = {'age_from': self.age_from, 'age_to': self.age_to, 'name': self.name, 'benefits': benefits,
- 'needs': needs,
- 'family': family,
- 'rooms': rooms,
- 'ar_headers': columns_ar_headers,
- 'length': length,
- 'header': columns_headers, }
- pdf = self.env.ref('odex_benefit.generate_benefit_report_pdf')._render_qweb_pdf(self, data=data)
- # b64_pdf = base64.b64encode(pdf[0])
- b64_pdf = base64.b64encode(pdf[0]).decode("ascii")
- # save pdf as attachment
- ir = self.env['ir.attachment'].create({
- 'name': self.name if self.name else '' + '.pdf',
- 'type': 'binary',
- 'datas': b64_pdf,
- # 'datas_fname': self.name + '.pdf',
- 'store_fname': self.name,
- 'res_model': self._name,
- 'res_id': self.id,
- 'mimetype': 'application/pdf'
- })
- self.env['generate.reports.log'].create({
- 'name': self.name,
- 'user_id': self.current_user.id,
- 'datetime': datetime.datetime.now(),
- 'attach': b64_pdf
- })
- self.report_file = b64_pdf
- return {'type': 'ir.actions.report', 'report_name': 'odex_benefit.template_generate_benefit_report_pdf',
- 'report_type': "qweb-pdf", 'data': data, }
- else:
- raise ValidationError(_("Sorry, there are no results for this selection !"))
-
- def rest(self):
- return {
- 'name': _('Generate Reports'),
- 'view_mode': 'form',
- 'view_type': 'form',
- 'type': 'ir.actions.act_window',
- 'res_model': 'generate.reports',
- 'view_id': self.env.ref('odex_benefit.generate_reports_view_form').id,
- 'target': 'new',
- }
diff --git a/odex25_ensan/odex_benefit/models/housing_config.py b/odex25_ensan/odex_benefit/models/housing_config.py
deleted file mode 100644
index 0869ddee5..000000000
--- a/odex25_ensan/odex_benefit/models/housing_config.py
+++ /dev/null
@@ -1,428 +0,0 @@
-from random import randint
-from odoo import fields, models, api, _
-
-
-class City(models.Model):
- _name = 'res.country.city'
- _description = "Benefits - City"
-
- @api.depends('code', 'name')
- def _load_country_id(self):
- for r in self:
- r.country_id = self.env.ref('base.sa')
-
- code = fields.Char(string='Code')
- name = fields.Char(string='Name')
-
- state_id = fields.Many2one('res.country.state', string='State')
- country_id = fields.Many2one('res.country', string='Country', compute='_load_country_id', store=True, readonly=False)
- active = fields.Boolean(default=True)
-
-
-class housing(models.Model):
- _name = 'benefit.housing'
- _inherit = ['mail.thread', 'mail.activity.mixin']
- _description = "Benefits - housing"
-
- name = fields.Char(compute='_compute_get_name')
- city_id = fields.Many2one('res.country.city', string='City')
- block = fields.Char(string='block')
- street = fields.Char(string='street')
- url = fields.Char(compute="open_map")
- url_html = fields.Html(
- sanitize=False,
- compute="get_html")
- lat = fields.Char()
- lon = fields.Char()
- house_number = fields.Char(string='house number')
- floor = fields.Char(string='floor')
- housing_number = fields.Char(string='housing number')
- image = fields.Binary(string="", )
- image_1 = fields.Binary(string="", )
- image_2 = fields.Binary(string="", )
- image_3 = fields.Binary(string="", )
- image_4 = fields.Binary(string="", )
- nearby_mosque = fields.Char(string='Nearby mosque')
- housing_note = fields.Char(string='housing note')
- note_neighborhood = fields.Char()
- rent_amount = fields.Integer()
- housing_type = fields.Selection([
- ('apartment', 'apartment'),
- ('villa', 'villa'),
- ('popular_house', 'popular house'),
- ('tent', 'tent'),
- ('Appendix', 'Appendix'), ], default='apartment')
- housing_cat = fields.Selection([
- ('excellent', 'Excellent'),
- ('good', 'Good'),
- ('bad', 'Bad'),
- ('collapsible', 'Collapsible'),
- ('collapsed', 'Collapsed')])
- property_type = fields.Selection([
- ('ownership', 'ownership'),
- ('rent', 'rent'),
- ('charitable', 'charitable'),
- ('ownership_shared', 'Ownership Shared'),
- ('rent_shared', 'Rent Shared')])
- rooms_number = fields.Integer('Rooms Number', compute="get_rooms_total", required=True)
- room_ids = fields.One2many('benefit.housing.rooms', inverse_name='housing_id')
- water_bill_account_number = fields.Char(string='water Bill Account Number')
- electricity_bill_account_number = fields.Char(string='Electricity Bill Account Number')
- water_bill_account_attach = fields.Many2many('ir.attachment',
- relation="ir_water_bill_account_number_rel",
- column1="water_bill_account_number",
- column2="name",
- string="water Bill")
- electricity_bill_account_attach = fields.Many2many('ir.attachment',
- relation="ir_electricity_bill_account_attach_rel",
- column1="electricity_bill_account_number",
- column2="name",
- string="Electricity Bill ")
- benefits_total = fields.Integer(string="Benefit Total", compute="get_benefits_total")
- benefit_ids = fields.One2many('grant.benefit', 'housing_id', string="Benefits")
- family_ids = fields.One2many('benefit.family', 'housing_id', string="Benefits")
- total_income = fields.Float(compute='get_total')
- total_expenses = fields.Float(compute='get_total')
- total_net = fields.Float(compute='get_total')
- financial_aid = fields.Float(compute='get_total')
- domestic_labor_ids = fields.Many2many('domestic.labor')
-
- def get_html(self):
- for rec in self:
- print(f'')
- rec.url_html = f''
-
- # @api.multi
- def open_map(self):
- for Location in self:
- url = "http://maps.google.com/maps?oi=map&q="
- if Location.street:
- url += Location.street.replace(' ', '+')
- if Location.city_id:
- url += '+' + Location.city_id.name.replace(' ', '+')
- url += '+' + Location.city_id.state_id.name.replace(' ', '+')
- url += '+' + Location.city_id.country_id.name.replace(' ', '+')
- if Location.nearby_mosque:
- url += Location.nearby_mosque.replace(' ', '+')
- return {
- 'type': 'ir.actions.act_url',
- 'target': 'new',
- 'url': url
- }
-
- @api.onchange('url')
- def onchange_image_url(self):
- if self.image_url:
- self.img_attach = '
' % self.url
-
- @api.depends('benefit_ids')
- def get_benefits_total(self):
- for rec in self:
- rec.benefits_total = len(rec.benefit_ids)
-
- def get_total(self):
- for rec in self:
- for total in rec.benefit_ids:
- rec.total_income += total.total_income
- rec.total_expenses += total.total_expenses
- # rec.total_net = rec.total_expenses - rec.total_income
- if rec.total_expenses >= rec.total_income:
- rec.total_net = rec.total_expenses - rec.total_income
- else:
- rec.total_net = rec.total_income - rec.total_expenses
- if rec.total_net > 0:
- rec.financial_aid = (abs(rec.total_net) * .5)
- else:
- rec.financial_aid = 0
-
- @api.depends('room_ids')
- def get_rooms_total(self):
- for rec in self:
- if rec.id:
- rooms = rec.env['benefit.housing.rooms'].sudo().search([('housing_id', '=', rec.id)])
- rec.rooms_number = len(rooms)
-
- @api.onchange('block', 'city_id', 'housing_number', 'house_number')
- def _compute_get_name(self):
- for rec in self:
- if rec.block and rec.city_id and rec.housing_number and rec.house_number:
- rec.name = str(rec.housing_number + "-" + rec.house_number + "-" + rec.block + "-" + str(
- rec.city_id.code) + "-" + rec.street)
-
- def open_benefits(self):
- return {
- 'name': _("Benefits"),
- 'view_type': 'form',
- 'view_mode': 'tree,form',
- 'views': [(self.env.ref(
- 'odex_benefit.grant_benefit_tree').id, 'tree'),
- (self.env.ref('odex_benefit.grant_benefit_form').id, 'form')],
- 'res_model': 'grant.benefit',
- 'type': 'ir.actions.act_window',
- 'domain': "[('housing_id','=',%s)]" % (self.id),
- 'target': 'current',
- }
-
- def open_rooms(self):
- context = {}
- context['default_housing_id'] = self.id
- return {
- 'name': _("Rooms"),
- 'view_type': 'form',
- 'view_mode': 'tree,form',
- 'views': [(self.env.ref(
- 'odex_benefit.housing_rooms_tree').id, 'tree'),
- (self.env.ref('odex_benefit.housing_rooms_form').id, 'form')],
- 'res_model': 'benefit.housing.rooms',
- 'type': 'ir.actions.act_window',
- 'context': context,
- 'domain': "[('housing_id','=',%s)]" % (self.id),
- 'target': 'current',
- }
-
- @api.onchange('room_ids')
- def onchange_room_ids(self):
- res = {}
- items_ids = []
- for record in self:
- items_ids.append(record.id)
- res['domain'] = {'items': [('room_id', 'in', items_ids)]}
- return res
-
-
-class housingRooms(models.Model):
- _name = 'benefit.housing.rooms'
- _rec_name = 'rooms_type'
- _description = "Benefits - housing rooms"
-
- name = fields.Char(related='rooms_type.name')
- housing_id = fields.Many2one(
- 'benefit.housing')
- rooms_type = fields.Many2one(
- 'housing.rooms.type',
- string='room',
- required=False)
- rooms_categories_id = fields.Many2one(
- 'rooms.categories')
- family_members = fields.Integer(
- string='',
- required=False)
- # male_members = fields.Integer(
- # string='',
- # required=False)
- # female_members = fields.Integer(
- # string='',
- # required=False)
- members_ids = fields.One2many(
- 'housing.rooms.members',
- 'room_id',
- string='')
- items = fields.One2many(
- comodel_name='benefit.housing.rooms.items',
- inverse_name='room_id',
- string='items',
- required=False)
- room_ribs = fields.Char(
- compute='_compute_space')
- width = fields.Selection(
- string='',
- selection=[('1', '1'),
- ('2', '2'),
- ('3', '3'),
- ('4', '4'),
- ('5', '5'),
- ('6', '6'),
- ('7', '7'),
- ('8', '8'),
- ('9', '9'), ],
- required=False, )
- length = fields.Selection(
- string='',
- selection=[('1', '1'),
- ('2', '2'),
- ('3', '3'),
- ('4', '4'),
- ('5', '5'),
- ('6', '6'),
- ('7', '7'),
- ('8', '8'),
- ('9', '9'), ],
- required=False, )
- room_space = fields.Char(
- compute='_compute_space')
- room_condition = fields.Char(
- string='',
- required=False)
-
- @api.onchange('width', 'length')
- def _compute_space(self):
- for i in self:
- if i.width and i.length:
- i.room_ribs = i.width + "*" + i.length
- i.room_space = int(i.width) * int(i.length)
-
- @api.onchange('rooms_type')
- def _load_items(self):
- items_list = []
- for r in self.rooms_type.mapped('items'):
- for item in r:
- items_list.append(item)
- for i in self.items:
- if i.item in items_list:
- items_list.remove(i.item)
- for room in items_list:
- self.sudo().update({'items': [(0, 0, {'item': room.id})]})
-
-
-class HousingRoomsItems(models.Model):
- _name = 'benefit.housing.rooms.items'
- _description = "Benefits - housing items"
-
- name = fields.Char(
- string='',
- required=False)
- room_id = fields.Many2one(
- comodel_name='benefit.housing.rooms')
- item = fields.Many2one(
- 'rooms.items',
- string='item',
- required=False)
- status = fields.Many2one(
- 'item.status', )
- # compute='set_status')
- percentage = fields.Float(
- string='',
- # related="status.percentage",
- required=False)
-
- # @api.onchange('percentage')
- # def set_status(self):
- # for rec in self:
- # if rec.percentage:
- # print(rec.percentage)
- # status = rec.env['item.status'].sudo().search(
- # [('minimum_percentage', '<=', rec.percentage)('maximum_percentage', '>=', rec.percentage)])
- # rec.status = status.id
-
-
-class HousingRoomsMembers(models.Model):
- _name = 'housing.rooms.members'
- _description = "Benefits - housing members"
-
- room_id = fields.Many2one(
- 'benefit.housing.rooms')
- housing_id = fields.Many2one('benefit.housing', related='room_id.housing_id')
- rooms_categories_id = fields.Many2one('rooms.categories', related='room_id.rooms_categories_id',
- string='',
- required=False)
- benefit_id = fields.Many2one(
- 'grant.benefit',
- string='')
- age = fields.Integer(
- string='',
- related='benefit_id.age', required=False)
- gender = fields.Selection(selection=[('male', 'Male'), ('female', 'Female')], related='benefit_id.gender',
- string="Gender")
- is_accept = fields.Boolean(
- string='',
- store=True,
- compute='_check_accept',
- required=False)
-
- @api.depends('age', 'gender')
- def _check_accept(self):
- for i in self:
- i.is_accept = False
- if i.age >= i.room_id.rooms_categories_id.age_from and i.age <= i.room_id.rooms_categories_id.age_to and (
- i.gender == i.room_id.rooms_categories_id.gender or i.room_id.rooms_categories_id.gender == 'both'):
- i.is_accept = True
-
-
-class RoomsType(models.Model):
- _name = 'housing.rooms.type'
- _rec_name = 'name'
- _description = "Benefits - rooms type"
-
- name = fields.Char(
- string='',
- required=False)
- items = fields.Many2many('rooms.items',
- string='')
-
-
-class RoomsItems(models.Model):
- _name = 'rooms.items'
- _rec_name = 'name'
- _description = "Benefits - rooms items"
-
- name = fields.Char(
- string='',
- required=False)
- description = fields.Char(
- string='Description',
- required=False)
-
-
-class RoomsCategories(models.Model):
- _name = 'rooms.categories'
- _rec_name = 'name'
- _description = "Benefits - rooms categories"
-
- name = fields.Char(
- string='',
- required=False)
- age_from = fields.Integer(
- string='',
- required=False)
- age_to = fields.Integer(
- string='',
- required=False)
- gender = fields.Selection(selection=[('male', 'Male only'), ('female', 'Female only'), ('both', 'both')],
- string="Gender")
- description = fields.Char(
- string='Description',
- required=False)
-
-
-class ItemStatus(models.Model):
- _name = 'item.status'
- _description = "Benefits - item status"
-
- name = fields.Char(
- string='',
- required=False)
-
- minimum_percentage = fields.Float(
- string='',
- required=False)
- maximum_percentage = fields.Float(
- string='',
- required=False)
-
-
-class DomesticLabor(models.Model):
- _name = 'domestic.labor'
- _description = "Benefits - domestic labor"
-
- name = fields.Char(string='name')
-
- # @staticmethod
- # def _get_default_color():
- # return randint(1, 11)
-
- color = fields.Integer(string='Color Index')
-
-
-class housingNeed(models.Model):
- _name = 'housing.need'
- _description = 'housing needs'
-
- ap_id = fields.Many2one(
- 'appliances.furniture')
- housing_id = fields.Many2one(
- 'benefit.housing')
- benefit_id = fields.Many2one(
- 'grant.benefit')
- amount = fields.Float(
- string='',
- required=False)
diff --git a/odex25_ensan/odex_benefit/models/hr_department.py b/odex25_ensan/odex_benefit/models/hr_department.py
deleted file mode 100644
index 13e6c4cc3..000000000
--- a/odex25_ensan/odex_benefit/models/hr_department.py
+++ /dev/null
@@ -1,22 +0,0 @@
-from odoo import models, fields
-
-class HrDepartment(models.Model):
- _inherit = 'hr.department'
-
- operation_manager_id = fields.Many2one('hr.employee', string='Operation Manager')
- # def name_get(self):
- # result = []
- # for department in self:
- # name = department.name
- # result.append((department.id, name))
- # return result
-
- # def name_get(self):
- # result = []
- # print(self.env.context) # Log the context for debugging
- # if self.env.context.get('special_display_name', True):
- # for department in self:
- # name = department.name
- # result.append((department.id, name))
- # return result
- # return super(HrDepartment, self).name_get()
\ No newline at end of file
diff --git a/odex25_ensan/odex_benefit/models/ir_attachment_inherit.py b/odex25_ensan/odex_benefit/models/ir_attachment_inherit.py
deleted file mode 100644
index 81a5fe460..000000000
--- a/odex25_ensan/odex_benefit/models/ir_attachment_inherit.py
+++ /dev/null
@@ -1,77 +0,0 @@
-from odoo import fields, models, api, _
-
-
-class BenefitAttachment(models.Model):
-
- _inherit = 'ir.attachment'
-
- benefit_id = fields.Many2one('grant.benefit',string="Benefit")
- education_status_id = fields.Many2one('education.status')
- member_id = fields.Many2one('family.member',string="Member")
- expiration_date = fields.Date(string='Expiration date')
- attach_status = fields.Selection(selection=[
- ('valid', 'Valid'),
- ('expired', 'Expired'),
- ], string='Attach Status',compute = "get_status",store=True)
- allow_days = fields.Integer(compute='get_allow_days',string='Allow Days')
- attach_id = fields.Many2one('attachments.settings', string="Attach",domain=[('attach_type', '=', 'member_attach')])
- hobbies_id = fields.Many2one('attachments.settings', string="Hobby",domain=[('attach_type', '=', 'hobbies_attach')])
- diseases_id = fields.Many2one('attachments.settings', string="Diseases",domain=[('attach_type', '=', 'diseases_attach')])
- disabilities_id = fields.Many2one('attachments.settings', string="Disabilities",domain=[('attach_type', '=', 'disabilities_attach')])
- hobby_attach = fields.Binary(attachment=True, string="Hobby Attach")
- # fields to management required and delete records in benefit attachment
- is_required = fields.Boolean(string='Is Required?')
- is_default = fields.Boolean(string='Is Default?')
- mother_grant_benefit_id = fields.Many2one('grant.benefit', string='Mother Grant Benefit')
- replacement_mother_grant_benefit_id = fields.Many2one('grant.benefit', string='Replacement Mother Grant Benefit')
- show_in_portal = fields.Boolean(default=False, string="Show In Portal")
-
- def action_preview_attachment(self):
- # Custom function to open the preview
- return {
- 'type': 'ir.actions.act_url',
- 'url': f'/browse/document/{self.id}',
- 'target': 'new', # Opens in a new tab
- }
-
- @api.depends('expiration_date')
- def get_status(self):
- for rec in self:
- today = fields.Date.today()
- if rec.expiration_date:
- if rec.expiration_date and rec.expiration_date > today:
- rec.attach_status = 'valid'
- else:
- rec.attach_status = 'expired'
- else:
- rec.attach_status = ''
-
- @api.depends('attach_status')
- def get_allow_days(self):
- for rec in self:
- today = fields.Date.today()
- if rec.attach_status == 'expired' and rec.expiration_date:
- difference = today - rec.expiration_date
- days = difference.days
- rec.allow_days = days
- else:
- rec.allow_days = 0
-
- @api.onchange('hobbies_id')
- def onchange_hobbies_id(self):
- for rec in self:
- if rec.hobbies_id:
- rec.name = rec.hobbies_id.name
-
- @api.onchange('diseases_id')
- def onchange_diseases_id(self):
- for rec in self:
- if rec.diseases_id:
- rec.name = rec.diseases_id.name
-
- @api.onchange('disabilities_id')
- def onchange_disabilities_id(self):
- for rec in self:
- if rec.disabilities_id:
- rec.name = rec.disabilities_id.name
-
diff --git a/odex25_ensan/odex_benefit/models/job_settings.py b/odex25_ensan/odex_benefit/models/job_settings.py
deleted file mode 100644
index 1b1fef94a..000000000
--- a/odex25_ensan/odex_benefit/models/job_settings.py
+++ /dev/null
@@ -1,18 +0,0 @@
-from odoo import models, fields, _
-
-
-class JobSettings(models.Model):
- _name = 'job.settings'
-
- name = fields.Char(required=True)
- not_defined = fields.Boolean(default=False)
- active = fields.Boolean(default=True)
-
- _sql_constraints = [
- (
- 'uniq_name',
- 'UNIQUE( name )',
- _('This job already exists!')
- )
- ]
-
\ No newline at end of file
diff --git a/odex25_ensan/odex_benefit/models/main_service.py b/odex25_ensan/odex_benefit/models/main_service.py
deleted file mode 100644
index 7fcac06e1..000000000
--- a/odex25_ensan/odex_benefit/models/main_service.py
+++ /dev/null
@@ -1,17 +0,0 @@
-from odoo import fields, models
-
-class MainService(models.Model):
- _name = 'main.service'
-
- name = fields.Char(string='Name')
- service_type = fields.Selection([
- ('service', 'Service'),
- ('exception', 'Exception'),
- ], string='Service Type')
- services = fields.Selection([
- ('experimental_services', 'Experimental Services'),
- ('exceptional_services', 'Exceptional Services'),
- ('emergency_services', 'Emergency Services'),
- ('seasonal_services', 'Seasonal Services'),
- ('permanent_services', 'Permanent Services'),
- ], string='Services')
diff --git a/odex25_ensan/odex_benefit/models/member_disabilities.py b/odex25_ensan/odex_benefit/models/member_disabilities.py
deleted file mode 100644
index 9b8a0152e..000000000
--- a/odex25_ensan/odex_benefit/models/member_disabilities.py
+++ /dev/null
@@ -1,29 +0,0 @@
-from odoo import fields, models , api
-
-class MemberDisabilities(models.Model):
- _name = 'member.disabilities'
-
- name = fields.Char(string="Name")
- member_id = fields.Many2one('family.member',string="Member")
- disabilities_id = fields.Many2one('disabilities.settings', string="disability")
- disability_attach = fields.Binary(attachment=True, string="disability Attach")
- expiration_date = fields.Date(string='Expiration date')
- attach_status = fields.Selection(selection=[
- ('valid', 'Valid'),
- ('expired', 'Expired'),
- ], string='Attach Status', compute="get_status", store=True)
- # fields to management required and delete records in benefit attachment
- is_required = fields.Boolean(string='Is Required?')
- is_default = fields.Boolean(string='Is Default?')
-
- @api.depends('expiration_date')
- def get_status(self):
- for rec in self:
- today = fields.Date.today()
- if rec.expiration_date:
- if rec.expiration_date and rec.expiration_date > today:
- rec.attach_status = 'valid'
- else:
- rec.attach_status = 'expired'
- else:
- rec.attach_status = ''
\ No newline at end of file
diff --git a/odex25_ensan/odex_benefit/models/member_diseases.py b/odex25_ensan/odex_benefit/models/member_diseases.py
deleted file mode 100644
index a1edb5c44..000000000
--- a/odex25_ensan/odex_benefit/models/member_diseases.py
+++ /dev/null
@@ -1,29 +0,0 @@
-from odoo import fields, models, api
-
-class MemberDiseases(models.Model):
- _name = 'member.diseases'
-
- name = fields.Char(string="Name")
- member_id = fields.Many2one('family.member',string="Member")
- diseases_id = fields.Many2one('diseases.settings', string="Disease")
- disease_attach = fields.Binary(attachment=True, string="Diseases Attach")
- expiration_date = fields.Date(string='Expiration date')
- attach_status = fields.Selection(selection=[
- ('valid', 'Valid'),
- ('expired', 'Expired'),
- ], string='Attach Status', compute="get_status", store=True)
- # fields to management required and delete records in benefit attachment
- is_required = fields.Boolean(string='Is Required?')
- is_default = fields.Boolean(string='Is Default?')
-
- @api.depends('expiration_date')
- def get_status(self):
- for rec in self:
- today = fields.Date.today()
- if rec.expiration_date:
- if rec.expiration_date and rec.expiration_date > today:
- rec.attach_status = 'valid'
- else:
- rec.attach_status = 'expired'
- else:
- rec.attach_status = ''
\ No newline at end of file
diff --git a/odex25_ensan/odex_benefit/models/member_location.py b/odex25_ensan/odex_benefit/models/member_location.py
deleted file mode 100644
index 511ca6aca..000000000
--- a/odex25_ensan/odex_benefit/models/member_location.py
+++ /dev/null
@@ -1,6 +0,0 @@
-from odoo import fields, models
-
-class MemberLocation(models.Model):
- _name = 'member.location'
-
- name = fields.Char(string="Name")
\ No newline at end of file
diff --git a/odex25_ensan/odex_benefit/models/members_hobbies.py b/odex25_ensan/odex_benefit/models/members_hobbies.py
deleted file mode 100644
index de373c697..000000000
--- a/odex25_ensan/odex_benefit/models/members_hobbies.py
+++ /dev/null
@@ -1,31 +0,0 @@
-from odoo import fields, models ,api
-
-class MemberHobbies(models.Model):
- _name = 'member.hobbies'
-
- name = fields.Char(string="Name")
- member_id = fields.Many2one('family.member',string="Member")
- hobbies_id = fields.Many2one('hobbies.settings',string="Hobby")
- hobby_attach = fields.Binary(attachment=True,string="Hobby Attach")
- expiration_date = fields.Date(string='Expiration date')
- attach_status = fields.Selection(selection=[
- ('valid', 'Valid'),
- ('expired', 'Expired'),
- ], string='Attach Status', compute="get_status", store=True)
- # fields to management required and delete records in benefit attachment
- is_required = fields.Boolean(string='Is Required?')
- is_default = fields.Boolean(string='Is Default?')
-
- @api.depends('expiration_date')
- def get_status(self):
- for rec in self:
- today = fields.Date.today()
- if rec.expiration_date:
- if rec.expiration_date and rec.expiration_date > today:
- rec.attach_status = 'valid'
- else:
- rec.attach_status = 'expired'
- else:
- rec.attach_status = ''
-
-
diff --git a/odex25_ensan/odex_benefit/models/payment_order.py b/odex25_ensan/odex_benefit/models/payment_order.py
deleted file mode 100644
index b4627683e..000000000
--- a/odex25_ensan/odex_benefit/models/payment_order.py
+++ /dev/null
@@ -1,252 +0,0 @@
-from odoo import fields, models, api, _
-from stdnum.au.acn import to_abn
-from odoo.exceptions import ValidationError, UserError
-
-
-class PaymentOrders(models.Model):
- _name = 'payment.orders'
- _description = "Payment Orders"
- _inherit = ['mail.thread', 'mail.activity.mixin']
- _order = 'payment_order_date desc'
-
- def _default_journal(self):
- setting = self.env['family.validation.setting'].search([], limit=1)
- return setting.payment_journal_id.id if setting and setting.journal_id else False
-
- name = fields.Char(string="Code", copy=False, readonly=True, default=lambda x: _('New'))
- # todo handel _compute_ref_num
- ref_num = fields.Many2one('seasonal.service', string='Ref. Number', compute='_compute_ref_num')
- payment_order_date = fields.Datetime(string="Payment Order Date", default=fields.Datetime.now)
- accountant_id = fields.Many2one('res.users', string='Accountant')
- # todo remove _compute_service_type_id and _inverse_service_type_id
- payment_order_description = fields.Many2one('services.settings',
- string='Payment Order Description',
- compute='_compute_service_type_id',
- inverse='_inverse_service_type_id',
- store=True)
- service_requests_ids = fields.Many2many(comodel_name='service.request',
- relation='service_request_payment_order_rel',
- column1='payment_order_id', column2='service_request_id',
- string='Service Requests', )
- benefit_expense_line_ids = fields.One2many('benefit.expense.line', 'payment_order_id',
- string='Benefit Expense Lines')
- # todo need to remove seasonal_requests_ids
- seasonal_requests_ids = fields.One2many('seasonal.service', 'payment_order_id', string='Seasonal Requests')
- state = fields.Selection(string='Status',
- selection=[('draft', 'Draft'),
- ('waiting_head', 'Waiting for Head of Expenses Department'),
- ('waiting_finance', 'Waiting for Financial Manager'),
- ('waiting_gm', 'Waiting for General Manager'),
- ('waiting_deposit', 'Waiting for Deposit'),
- ('done', 'Done'),
- ('refused', 'Refused')], default='draft', tracking=True)
- is_seasonal = fields.Boolean(string='Is Seasonal Service?')
- journal_id = fields.Many2one(comodel_name='account.journal', string="Journal", copy=False,
- domain="[('type','in',['cash','bank'])]", default=_default_journal)
- type = fields.Selection(
- selection=[
- ('services', 'Services'),
- ('seasonal_services', 'Seasonal Services'),
- ('benefit_expense', 'Monthly Expense'),
- ],
- string='Payment Order Type', required=True, default='services', )
- move_id = fields.Many2one('account.move', ondelete='cascade')
- move_count = fields.Integer(string="Move Count", compute='_compute_move_count')
- total_amount = fields.Float(string="Total Amount", compute='_compute_total_amount', store=True)
- company_id = fields.Many2one('res.company', string='Company', default=lambda self: self.env.company)
- currency_id = fields.Many2one('res.currency', string='Currency',
- related='company_id.currency_id')
-
- @api.depends('service_requests_ids', 'benefit_expense_line_ids')
- def _compute_total_amount(self):
- for rec in self:
- if rec.type in ['services', 'seasonal_services']:
- rec.total_amount = sum(rec.service_requests_ids.mapped('requested_service_amount'))
- elif rec.type == 'benefit_expense':
- rec.total_amount = sum(rec.benefit_expense_line_ids.mapped('total_family_expenses'))
- else:
- rec.total_amount = 0.0
-
- def action_manager_approval(self):
- for rec in self:
- if self.env.user != rec.accountant_id:
- raise ValidationError(_("Only the assigned accountant can approve this payment order."))
- rec.state = 'waiting_head'
-
- def action_head_approval(self):
- for rec in self:
- rec.state = 'waiting_finance'
-
- def action_finance_approval(self):
- for rec in self:
- rec.state = 'waiting_gm'
-
- def create_entry(self):
- for rec in self:
- if not rec.journal_id:
- raise UserError(_("Please select a journal before creating the entry."))
- line_ids = rec.get_lines()
- move_vals = {
- 'journal_id': rec.journal_id.id,
- 'line_ids': line_ids,
- 'ref': rec.name + '/' + rec.type,
- }
- if rec.type == "benefit_expense":
- # ref1 = ", ".join(rec.benefit_expense_line_ids.mapped('name'))
- # ref2 = ", ".join(rec.benefit_expense_line_ids.mapped('family_expense_seq'))
- family_ids = rec.benefit_expense_line_ids.mapped('family_id').ids
-
- move_vals.update({
- # 'ref': ref1 + '/' + ref2,
- 'benefit_family_ids': [(6, 0, family_ids)],
- })
- move_id = self.env['account.move'].create(move_vals)
- # move_id.action_post()
- rec.move_id = move_id
-
- def action_deposit(self):
- for rec in self:
- rec.state = 'done'
-
- def action_gm_approval(self):
- for rec in self:
- rec.state = 'waiting_deposit'
-
- def action_refuse(self):
- for rec in self:
- rec.state = 'refused'
-
- def action_reset_to_draft(self):
- for rec in self:
- rec.state = 'draft'
-
- # Compute method
- @api.depends('seasonal_requests_ids')
- def _compute_ref_num(self):
- for record in self:
- record.ref_num = record.seasonal_requests_ids[0] if record.seasonal_requests_ids else False
-
- @api.depends('seasonal_requests_ids.service_type_id')
- def _compute_service_type_id(self):
- for record in self:
- # Take value from first seasonal_requests record (if exists)
- record.payment_order_description = record.seasonal_requests_ids[:1].service_type_id
-
- # Inverse method
- def _inverse_service_type_id(self):
- for record in self:
- if record.seasonal_requests_ids:
- # Update first related record
- record.seasonal_requests_ids[0].service_type_id = record.payment_order_description
- else:
- # Create new seasonal_requests record if none exists
- self.env['seasonal.service'].create({
- 'payment_order_id': record.id,
- 'service_type_id': record.payment_order_description.id,
- # Add other required fields here if necessary
- })
-
- @api.model
- def create(self, vals):
- res = super(PaymentOrders, self).create(vals)
- if not res.name or res.name == _('New'):
- res.name = self.env['ir.sequence'].sudo().next_by_code('payment.orders.sequence') or _('New')
- return res
-
- def unlink(self):
- for payment in self:
- if payment.state not in ['draft']:
- raise ValidationError(_(
- "You cannot delete this payment order.\n"
- "Only records in the *Draft* state may be deleted."
- ))
- return super(PaymentOrders, self).unlink()
-
- # todo remove search override
- @api.model
- def search(self, args, offset=0, limit=None, order=None, count=False):
- if self.env.user and self.env.user.id and self.env.user.has_group(
- "odex_benefit.group_benefit_payment_accountant_accept"):
- args += [('accountant_id', '=', self.env.user.id)]
- return super(PaymentOrders, self).search(args, offset, limit, order, count)
-
- def _compute_move_count(self):
- for rec in self:
- rec.move_count = 1 if rec.move_id else 0
-
- def action_open_related_move_records(self):
- return {
- 'name': _('Moves'),
- 'type': 'ir.actions.act_window',
- 'res_model': 'account.move',
- 'view_mode': 'tree,form',
- 'domain': [('id', 'in', self.move_id.ids)],
- }
-
- def _prepare_entry_lines(self, line, validation_setting):
- entry_lines = []
- total_credit_amount = 0
- expense_types = [
- ('family_monthly_income', 'cash_expense', validation_setting.cash_expense_account_id.id),
- ('family_monthly_meals', 'meal_expense', validation_setting.meal_expense_account_id.id),
- ('family_monthly_clotting', 'clothing_expense', validation_setting.clothing_expense_account_id.id),
- ]
-
- for field, expense_type, debit_account_id in expense_types:
- amount = getattr(line, field, 0.0)
- if amount:
- name = _("Family Code - %s Family Expense - %s - %s/%s") % (
- line.family_id.code, expense_type, line.confirm_expense_id.name,
- line.confirm_expense_id.family_expense_seq)
- entry_lines.append(self._create_debit_line(line, debit_account_id, amount, name))
- total_credit_amount += amount
-
- return entry_lines, total_credit_amount
-
- def _create_debit_line(self, line, account_id, amount, name):
- """Create a debit line"""
- return {
- 'name': name,
- 'family_confirm_id': line.confirm_expense_id.id,
- 'benefit_family_id': line.family_id.id,
- 'partner_id': line.family_id.partner_id.id,
- 'analytic_account_id': line.family_id.branch_family_id.branch.analytic_account_id.id,
- 'account_id': account_id,
- 'debit': amount,
- 'credit': 0.0,
- }
-
- def get_lines(self):
- lines = []
- total_credit = 0
- # credit_line_name = _("Total Credit for Family Expenses")
- if self.type in ['seasonal_services', 'services']:
- if self.service_requests_ids:
- for request in self.service_requests_ids:
- lines.append(
- {
- 'name': f'{_("Family code")}-{request.family_id.code}-{request.description}-{request.payment_order_id.name}-{request.payment_order_id.ref_num}',
- 'benefit_family_id': request.family_id.id,
- 'account_id': request.account_id.id,
- 'partner_id': request.family_id.partner_id.id,
- 'analytic_account_id': request.family_id.branch_family_id.branch.analytic_account_id.id,
- 'debit': request.requested_service_amount,
- 'credit': 0.0,
- }
- )
- total_credit += request.requested_service_amount
- elif self.type == 'benefit_expense':
- validation_setting = self.env["family.validation.setting"].search([], limit=1)
- for line in self.benefit_expense_line_ids:
- sum_line, credit_total = self._prepare_entry_lines(line, validation_setting)
- total_credit += credit_total
- lines += sum_line
-
- payment_type = dict(self._fields['type']._description_selection(self.env)).get(self.type)
- lines.append({
- 'account_id': self.journal_id.default_account_id.id,
- 'name': f'{self.name}-{payment_type}',
- 'credit': total_credit,
- 'debit': 0.0,
- })
- return [(0, 0, line) for line in lines]
diff --git a/odex25_ensan/odex_benefit/models/res_config_settings.py b/odex25_ensan/odex_benefit/models/res_config_settings.py
deleted file mode 100644
index 626667067..000000000
--- a/odex25_ensan/odex_benefit/models/res_config_settings.py
+++ /dev/null
@@ -1,89 +0,0 @@
-from odoo import fields, models, api
-
-
-class ResConfigSettings(models.TransientModel):
- _inherit = 'res.config.settings'
-
- benefit_partner_id = fields.Many2one('res.partner')
- ##### receive zkat alfert ########
- receive_zkat_bank_account_id = fields.Many2one('account.account', string="Bank Account For zkat")
- receive_zkat_journal_id = fields.Many2one('account.journal', string="Journal For zkat")
- receive_zkat_picking_type_id = fields.Many2one('stock.picking.type', 'Picking Type For Receive zkat')
- ##### zkat alfert ########
- zkat_picking_type_id = fields.Many2one('stock.picking.type', 'Picking Type For zkat')
- ########استلامات الاضاحي###########
- receive_Adha_bank_account_id = fields.Many2one('account.account', string="Bank Account For Adha")
- receive_Adha_journal_id = fields.Many2one('account.journal', string="Journal For Adha")
- receive_Adha_picking_type_id = fields.Many2one('stock.picking.type', "Picking Type For Receive Adha")
- ##### الاضاحي ########
- Adha_picking_type_id = fields.Many2one('stock.picking.type', "Picking Type For Adha")
- ############## receive.appliances.furniture#######
- receive_af_picking_type_id = fields.Many2one('stock.picking.type', "Picking Type For Receive af")
- ############## appliances.furniture#######
- Af_picking_type_id = fields.Many2one('stock.picking.type', "Picking Type For af")
- ###############R lons#############
- receive_loan_bank_account_id = fields.Many2one('account.account', string="Bank Account For Receive loan")
- receive_loan_journal_id = fields.Many2one('account.journal', string="Journal For Receive loan")
- ###############lons#############
- loan_bank_account_id = fields.Many2one('account.account', string="Bank Account For loan")
- loan_journal_id = fields.Many2one('account.journal', string="Journal For Receive loan")
-
- # @api.multi
- def set_values(self):
- res = super(ResConfigSettings, self).set_values()
- param = self.env['ir.config_parameter'].sudo()
- benefit_partner_id = self.benefit_partner_id or False
- receive_zkat_bank_account_id = self.receive_zkat_bank_account_id.id or False
- receive_zkat_journal_id = self.receive_zkat_journal_id or False
- receive_zkat_picking_type_id = self.receive_zkat_picking_type_id or False
- zkat_picking_type_id = self.zkat_picking_type_id or False
- receive_Adha_bank_account_id = self.receive_Adha_bank_account_id or False
- receive_Adha_journal_id = self.receive_Adha_journal_id or False
- Adha_picking_type_id = self.Adha_picking_type_id or False
- receive_af_picking_type_id = self.Adha_picking_type_id or False
- Af_picking_type_id = self.Af_picking_type_id or False
- receive_loan_bank_account_id = self.receive_loan_bank_account_id or False
- receive_loan_journal_id = self.receive_loan_journal_id or False
- loan_bank_account_id = self.loan_bank_account_id or False
- loan_journal_id = self.loan_bank_account_id or False
- param.set_param('odex_benefit.benefit_partner_id', benefit_partner_id) # 1
- param.set_param('odex_benefit.receive_zkat_bank_account_id', receive_zkat_bank_account_id) # 2
- param.set_param('odex_benefit.receive_zkat_journal_id', receive_zkat_journal_id) # 3
- param.set_param('odex_benefit.receive_zkat_picking_type_id', receive_zkat_picking_type_id) # 4
- param.set_param('odex_benefit.zkat_picking_type_id', zkat_picking_type_id) # 5
- param.set_param('odex_benefit.receive_Adha_bank_account_id', receive_Adha_bank_account_id) # 6
- param.set_param('odex_benefit.receive_Adha_journal_id', receive_Adha_journal_id) # 7
- param.set_param('odex_benefit.Adha_picking_type_id', Adha_picking_type_id) # 8
- param.set_param('odex_benefit.receive_af_picking_type_id', receive_af_picking_type_id) # 9
- param.set_param('odex_benefit.Af_picking_type_id', Af_picking_type_id) # 10
- param.set_param('odex_benefit.receive_loan_bank_account_id', receive_loan_bank_account_id) # 11
- param.set_param('odex_benefit.receive_loan_journal_id', receive_loan_journal_id) # 12
- param.set_param('odex_benefit.loan_bank_account_id', loan_bank_account_id) # 13
- param.set_param('odex_benefit.loan_journal_id', loan_journal_id) # 14
- return res
-
- @api.model
- def get_values(self):
- res = super(ResConfigSettings, self).get_values()
- params = self.env['ir.config_parameter'].sudo()
- res.update(
- benefit_partner_id=params.sudo().get_param('odex_benefit.benefit_partner_id', default=""),
- receive_zkat_bank_account_id=params.sudo().get_param('odex_benefit.receive_zkat_bank_account_id',
- default=""),
- receive_zkat_journal_id=params.sudo().get_param('odex_benefit.receive_zkat_journal_id', default=""),
- receive_zkat_picking_type_id=params.sudo().get_param('odex_benefit.receive_zkat_picking_type_id',
- default=""),
- zkat_picking_type_id=params.sudo().get_param('odex_benefit.zkat_picking_type_id', default=""),
- receive_Adha_bank_account_id=params.sudo().get_param('odex_benefit.receive_Adha_bank_account_id',
- default=""),
- receive_Adha_journal_id=params.sudo().get_param('odex_benefit.receive_Adha_journal_id', default=""),
- Adha_picking_type_id=params.sudo().get_param('odex_benefit.Adha_picking_type_id', default=""),
- receive_af_picking_type_id=params.sudo().get_param('odex_benefit.receive_af_picking_type_id', default=""),
- Af_picking_type_id=params.sudo().get_param('odex_benefit.Af_picking_type_id', default=""),
- receive_loan_bank_account_id=params.sudo().get_param('odex_benefit.receive_loan_bank_account_id',
- default=""),
- receive_loan_journal_id=params.sudo().get_param('odex_benefit.receive_loan_journal_id', default=""),
- loan_bank_account_id=params.sudo().get_param('odex_benefit.loan_bank_account_id', default=""),
- loan_journal_id=params.sudo().get_param('odex_benefit.loan_journal_id', default=""),
- )
- return res
diff --git a/odex25_ensan/odex_benefit/models/res_country_inherit.py b/odex25_ensan/odex_benefit/models/res_country_inherit.py
deleted file mode 100644
index 44b1f6abc..000000000
--- a/odex25_ensan/odex_benefit/models/res_country_inherit.py
+++ /dev/null
@@ -1,7 +0,0 @@
-from odoo import fields, models
-
-class MemberHobbies(models.Model):
- _inherit = 'res.country'
-
- is_excluded = fields.Boolean(string='Is Excluded?')
-
diff --git a/odex25_ensan/odex_benefit/models/res_partner.py b/odex25_ensan/odex_benefit/models/res_partner.py
deleted file mode 100644
index 89a992279..000000000
--- a/odex25_ensan/odex_benefit/models/res_partner.py
+++ /dev/null
@@ -1,24 +0,0 @@
-from odoo import api, fields, models, _
-from odoo.exceptions import ValidationError
-
-import logging
-
-_logger = logging.getLogger(__name__)
-
-class ResPartner(models.Model):
- _inherit = "res.partner"
-
- def unlink(self):
- env = self.env
-
- for partner in self:
- grants = env['grant.benefit'].search([
- ('partner_id', '=', partner.id),
- ('state', 'not in', ['draft', 'new'])
- ])
- if grants:
- grant_info = ', '.join('[%s: %s]' % (g.code or g.name or g.id, dict(g._fields['state'].selection).get(g.state)) for g in grants)
- raise ValidationError(
- _("Cannot delete partner '%s': linked to Benefits - Profiles %s") % (partner.name, grant_info)
- )
- return super().unlink()
\ No newline at end of file
diff --git a/odex25_ensan/odex_benefit/models/res_users.py b/odex25_ensan/odex_benefit/models/res_users.py
deleted file mode 100644
index 3e7438619..000000000
--- a/odex25_ensan/odex_benefit/models/res_users.py
+++ /dev/null
@@ -1,44 +0,0 @@
-from odoo import api, fields, models, _
-from odoo.exceptions import ValidationError
-
-import logging
-
-_logger = logging.getLogger(__name__)
-
-class ResUsers(models.Model):
- _inherit = 'res.users'
-
- def unlink(self):
- for user in self:
- grants = self.env['grant.benefit'].search([
- ('user_id', '=', user.id),
- ('state', 'not in', ['draft', 'new'])
- ])
- if grants:
- grant_info = ', '.join('[%s: %s]' % (g.code or g.name or g.id, dict(self.env['grant.benefit']._fields['state'].selection).get(g.state)) for g in grants)
- raise ValidationError(
- _("Cannot delete user '%s': linked to Benefits - Profiles %s") % (user.name, grant_info)
- )
- partners = self.mapped('partner_id')
-
- for user in self:
- benefits = self.env['grant.benefit'].search([('user_id', '=', user.id)])
- benefits.with_context(skip_user_unlink=True).unlink()
-
- res = super(ResUsers, self).unlink()
-
- for partner in partners:
- still_linked = self.env['res.users'].search([('partner_id', '=', partner.id)], limit=1)
- if not still_linked:
- try:
- partner.unlink()
- except Exception as e:
- _logger.warning(
- "Failed to delete partner ID %s after user removal. Reason: %s", partner.id, str(e)
- )
- raise ValidationError(
- _("Failed to delete partner '%s' (ID: %s) after user removal. Reason: %s")
- % (partner.display_name, partner.id, str(e))
- )
-
- return res
diff --git a/odex25_ensan/odex_benefit/models/seasonal_service.py b/odex25_ensan/odex_benefit/models/seasonal_service.py
deleted file mode 100644
index 16f5fc439..000000000
--- a/odex25_ensan/odex_benefit/models/seasonal_service.py
+++ /dev/null
@@ -1,267 +0,0 @@
-from asyncore import write
-
-from odoo import fields, models, api, _
-from odoo.exceptions import UserError, ValidationError
-from datetime import timedelta
-from dateutil.relativedelta import relativedelta
-
-
-class SeasonalService(models.Model):
- _name = 'seasonal.service'
- _inherit = ['mail.thread', 'mail.activity.mixin']
- _order = "name desc"
-
- name = fields.Char(string='Reference', required=True, copy=False, readonly=True, index=True,
- default=lambda self: _('New'))
- date = fields.Datetime(string='Request Date', default=fields.Datetime.now, copy=False)
- service_type_id = fields.Many2one('services.settings', domain="[('is_seasonal_service','=',True)]",
- string="Seasonal Service Type", required=True)
- benefit_type = fields.Selection(string='Benefit Type', related='service_type_id.benefit_type')
- branch_ids = fields.Many2many('branch.settings', 'service_branch_rel', 'service_id', 'branch_id', string='Branches',
- required=True, domain="[('has_employees', '=', True)]")
- family_category_ids = fields.Many2many(
- 'benefit.category',
- 'service_category_rel',
- 'service_id',
- 'category_id',
- string='Family Category',
- compute='_compute_family_category_ids', )
- aid_amount = fields.Float(string="Aid Amount", compute="_compute_amounts", store=True, readonly=False)
- benefit_member_count = fields.Integer(string="Benefit Member count", compute="compute_family_benefit", store=True)
- family_count = fields.Integer(string="Family count", compute="compute_family_benefit", store=True)
- family_disbursement_total_amount = fields.Float(string="Total Family Disbursement Amount",
- compute="_compute_family_disbursement", store=True)
- payment_order_id = fields.Many2one('payment.orders', string='Payment Order', copy=False, ondelete="set null")
- state = fields.Selection(selection=[
- ('draft', 'Draft'),
- ('calculated', 'Calculated'),
- ('gm_assistant', 'Waiting Assistant General Manager'),
- ('accounting_approve', 'Accounting Approve'),
- ('waiting_receive', 'Waiting for Receive'),
- ('done', 'Done'),
- ], string='state', default='draft', tracking=True, copy=False)
- is_payment_order_done = fields.Boolean(string='Is Payment Order Done?', copy=False)
- payment_order_state = fields.Selection(string='Payment Order State', selection=[
- ('none', 'None'),
- ('waiting', 'Waiting Payment'),
- ('done', 'Done Payment'), ], copy=False, compute="_compute_payment_order_state", store=True)
- account_id = fields.Many2one('account.account', string='Expenses Account', related="service_type_id.account_id")
- service_requests_ids = fields.One2many('service.request', 'seasonal_service_id', string='Service Requests')
- benefit_ids = fields.Many2many(comodel_name='grant.benefit', relation='benefit_grant_seasonal_service_rel',
- column1='seasonal_service_id',
- column2='benefit_id', string='Families', copy=False)
- member_ids = fields.Many2many(comodel_name='family.member', relation='family_member_seasonal_service_rel',
- column1='seasonal_service_id',
- column2='family_member_id', string='Family Members', copy=False)
- family_domain_ids = fields.Many2many(comodel_name='grant.benefit', compute='_compute_domain_ids',
- string="Eligible Families")
- service_delivery_method = fields.Selection(selection=[
- ('cash', 'Cash'),
- ('in_kind', 'In kind'), ], string='Service Delivery Method', default='cash')
- is_in_kind = fields.Boolean(string="In Kind", related="service_type_id.in_kind")
- company_id = fields.Many2one('res.company', string="Company", default=lambda self: self.env.user.company_id)
- currency_id = fields.Many2one('res.currency', string="Currency", related='company_id.currency_id')
-
- @api.depends('payment_order_id', 'payment_order_id.state')
- def _compute_payment_order_state(self):
- for rec in self:
- payment_order_state = 'none'
- if rec.payment_order_state:
- if rec.payment_order_id.state == "done":
- payment_order_state = "done"
- rec.service_requests_ids.write({'state': 'send_request_to_supplier'})
- rec.state = 'waiting_receive'
- else:
- payment_order_state = "waiting"
- rec.payment_order_state = payment_order_state
-
- @api.depends('branch_ids', 'family_category_ids')
- def _compute_domain_ids(self):
- for rec in self:
- domain = ['|', ('state', '=', 'second_approve'), '&', ('state', 'in', ('waiting_approve', 'first_approve')),
- ('action_type', '=', 'suspended')]
- if self.branch_ids:
- domain.append(('branch_custom_id', 'in', self.branch_ids.ids))
- if self.family_category_ids:
- domain.append(('benefit_category_id', 'in', self.family_category_ids.ids))
-
- families = self.env['grant.benefit'].sudo().search(domain)
- rec.family_domain_ids = families
-
- @api.depends('service_type_id', 'service_type_id.benefit_category_ids')
- def _compute_family_category_ids(self):
- for record in self:
- if record.service_type_id and record.service_type_id.benefit_category_ids:
- record.family_category_ids = record.service_type_id.benefit_category_ids
- else:
- record.family_category_ids = []
-
- @api.model
- def create(self, vals):
- res = super(SeasonalService, self).create(vals)
- if not res.name or res.name == _('New'):
- res.name = self.env['ir.sequence'].sudo().next_by_code('seasonal.service.sequence') or _('New')
- return res
-
- def unlink(self):
- for service in self:
- if service.state not in ['draft']:
- raise UserError(_('You cannot delete this record'))
- return super(SeasonalService, self).unlink()
-
- @api.onchange('service_type_id')
- def _onchange_service_type_id(self):
- if self.benefit_ids:
- self.benefit_ids = [(5, 0, 0)]
- if self.member_ids:
- self.member_ids = [(5, 0, 0)]
-
- def action_create_payment_order(self):
- for rec in self:
- if rec.state != 'accounting_approve':
- raise UserError(_("All selected requests should be in Accounting Approve state"))
- if rec.payment_order_id:
- raise UserError(_("There are already disbursement orders associated with the request(s)."))
- self.env['payment.orders'].create({
- 'state': 'draft',
- 'accountant_id': rec.service_type_id.accountant_id.id,
- 'seasonal_requests_ids': rec.ids,
- 'service_requests_ids': rec.service_requests_ids.ids,
- 'is_seasonal': True,
- 'type': 'seasonal_services',
- })
- # rec.payment_order_id = payment_order.id
- rec.is_payment_order_done = True
-
- @api.depends('service_requests_ids')
- def compute_family_benefit(self):
- for record in self:
- families = record.service_requests_ids.mapped('family_id')
- family_count = len(families)
- member_count = sum(record.service_requests_ids.mapped('service_benefit_count'))
- record.family_count = family_count
- record.benefit_member_count = member_count
-
- @api.depends('service_type_id')
- def _compute_amounts(self):
- for record in self:
- if record.service_type_id and record.service_delivery_method == 'cash':
- record.aid_amount = record.service_type_id.max_amount
- else:
- record.aid_amount = 0
-
- @api.depends('service_requests_ids')
- def _compute_family_disbursement(self):
- for record in self:
- if record.service_requests_ids:
- if record.service_delivery_method == "cash":
- record.family_disbursement_total_amount = sum(
- record.service_requests_ids.mapped('requested_service_amount'))
- else:
- record.family_disbursement_total_amount = sum(
- record.service_requests_ids.mapped('service_qty'))
- else:
- record.family_disbursement_total_amount = 0.0
-
- def action_first_approval(self):
- for rec in self:
- if not rec.service_requests_ids:
- raise UserError(_("You must add at least one service request."))
- if rec.service_type_id.needs_beneficiary_manager_approval:
- rec.state = 'gm_assistant'
- rec.service_requests_ids.write({'state': 'gm_assistant'})
- elif rec.service_delivery_method == "cash":
- # rec.action_create_payment_order()
- rec.state = "accounting_approve"
- rec.service_requests_ids.write({'state': 'accounting_approve'})
- elif rec.service_delivery_method == "in_kind":
- rec.state = 'waiting_receive'
- rec.service_requests_ids.write({'state': 'send_request_to_supplier'})
-
- def action_approval_of_gm_assistant(self):
- for rec in self:
- if rec.service_delivery_method == "cash":
- # rec.action_create_payment_order()
- rec.state = "accounting_approve"
- rec.service_requests_ids.write({'state': 'accounting_approve'})
- elif rec.service_delivery_method == "in_kind":
- rec.state = 'waiting_receive'
- rec.service_requests_ids.write({'state': 'send_request_to_supplier'})
-
- def action_done(self):
- for rec in self:
- rec.state = 'done'
- rec.service_requests_ids.write({'state': 'family_received_device'})
-
- def action_calculate(self):
- for rec in self:
- rec._generate_service_requests()
- rec.state = 'calculated'
-
- def action_recalculate(self):
- for rec in self:
- rec.service_requests_ids.unlink()
- rec._generate_service_requests()
-
- def _generate_service_requests(self):
- Service = self.env['service.request']
-
- for rec in self:
- if not rec.benefit_ids:
- raise UserError(_("You must add at least one family."))
-
- if rec.benefit_type == "family":
- for benefit in rec.benefit_ids:
- service_request = Service.create({
- 'family_id': benefit.id,
- 'service_cat': rec.service_type_id.id,
- 'seasonal_service_id': rec.id,
- 'benefit_type': rec.benefit_type,
- })
- service_request.onchange_requested_service_amount()
-
- if rec.service_delivery_method == "cash":
- service_request.requested_service_amount = service_request.service_max_amount
- if service_request.requested_service_amount == 0:
- service_request.unlink()
- else:
- service_request.requested_service_amount = 0
- service_request.is_in_kind = True
- service_request.service_qty = rec.aid_amount
-
- else:
- if not rec.member_ids:
- raise UserError(_("You must add at least one member."))
- for member in rec.member_ids:
- if not member.benefit_id:
- raise UserError(_("Member %s has no related family (benefit).") % member.name)
-
- service_request = Service.create({
- 'family_id': member.benefit_id.id,
- 'member_id': member.id,
- 'service_cat': rec.service_type_id.id,
- 'seasonal_service_id': rec.id,
- 'benefit_type': rec.benefit_type,
- })
-
- service_request.onchange_requested_service_amount()
-
- if rec.service_delivery_method == "cash":
- service_request.requested_service_amount = service_request.service_max_amount
- if service_request.requested_service_amount == 0:
- service_request.unlink()
- else:
- service_request.requested_service_amount = 0
- service_request.is_in_kind = True
- service_request.service_qty = rec.aid_amount
-
- def action_reset_to_draft(self):
- for rec in self:
- rec.service_requests_ids.write({'state': 'draft'})
- rec.service_requests_ids.unlink()
- rec.state = 'draft'
-
- def action_reset_to_calculated(self):
- for rec in self:
- rec.service_requests_ids.write({'state': 'draft'})
- rec.state = 'calculated'
diff --git a/odex25_ensan/odex_benefit/models/service_refuse_reason.py b/odex25_ensan/odex_benefit/models/service_refuse_reason.py
deleted file mode 100644
index d83ba8d99..000000000
--- a/odex25_ensan/odex_benefit/models/service_refuse_reason.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# -*- coding: utf-8 -*-
-from odoo import models, fields
-
-
-class RefuseReason(models.Model):
- _name = 'service.refuse.reason'
- _description = 'Reasons for Service Rejection'
-
- name = fields.Char(string='Reason', required=True)
diff --git a/odex25_ensan/odex_benefit/models/service_request.py b/odex25_ensan/odex_benefit/models/service_request.py
deleted file mode 100644
index 3c3b406f4..000000000
--- a/odex25_ensan/odex_benefit/models/service_request.py
+++ /dev/null
@@ -1,1134 +0,0 @@
-from odoo import fields, models, api, _
-from odoo.exceptions import UserError, ValidationError
-from datetime import datetime, timedelta
-from dateutil.relativedelta import relativedelta
-
-
-class ServiceRequest(models.Model):
- _name = 'service.request'
- _inherit = ['mail.thread', 'mail.activity.mixin']
- _order = "date desc"
-
- name = fields.Char(string='Reference', required=True, copy=False, readonly=True, index=True,
- default=lambda self: _('New'))
- benefit_type = fields.Selection(string='Benefit Type', selection=[('family', 'Family'), ('member', 'Member')])
- date = fields.Datetime(string='Request Date', default=fields.Datetime.now)
- marriage_contract_date = fields.Date(string="Marriage Contract Date")
- family_id = fields.Many2one('grant.benefit', string='Family',
- domain="['|',('state','=','second_approve'),'&',('state','in',['waiting_approve','first_approve']),('action_type','=','suspended')]")
- researcher_id = fields.Many2one("committees.line", string="Researcher", related="family_id.researcher_id",
- store=True)
- family_category = fields.Many2one('benefit.category', string='Family Category',
- related='family_id.benefit_category_id')
- benefit_member_count = fields.Integer(string="Benefit Member count", related='family_id.benefit_member_count')
- branch_custom_id = fields.Many2one('branch.settings', string="Branch", related='family_id.branch_custom_id',
- store=True)
- member_id = fields.Many2one('family.member', domain="[('benefit_id','=',family_id)]", string='Member')
- description = fields.Char(string='Description')
- need_status = fields.Selection(string='Need Status', selection=[('urgent', 'urgent'), ('not_urgent', 'Not urgent')])
- main_service_category = fields.Many2one('services.settings', domain="[('service_type','=','main_service')]",
- string="Main Service Category")
- sub_service_category = fields.Many2one('services.settings',
- domain="[('service_type','=','main_service'),('service_type','=',False),('parent_service','=',main_service_category)]",
- string='Sub Service Category')
- service_cat = fields.Many2one('services.settings', string='Service Cat.')
- available_service_cats = fields.Many2many('services.settings', compute='_compute_available_service_cats',
- store=True)
- service_attach = fields.Many2many('ir.attachment', 'rel_service_attachment_service_request', 'service_request_id',
- 'attachment_id', string='Service Attachment')
- requested_service_amount = fields.Float(string="Requested Service Amount")
- # yearly Estimated Rent Amount
- estimated_rent_amount = fields.Float(string="Estimated Rent Amount", compute="_get_estimated_rent_amount")
- # The value of payment by payment method(yearly-half-quartarly)
- estimated_rent_amount_payment = fields.Float(string="Estimated Rent Amount Payment",
- compute="_get_estimated_rent_amount_payment")
- paid_rent_amount = fields.Float(string="Paid Rent Amount", compute="_get_paid_rent_amount")
- service_type = fields.Selection([('rent', 'Rent')], string='Service Type', related='service_cat.service_type')
- max_limit_period = fields.Selection(string='Maximum Limit Period', related='service_cat.max_limit_period')
- # is_alternative_housing = fields.Boolean(string='Is Alternative Housing?')
- rent_contract_number = fields.Char(string="Rent Contract Number", compute='_compute_rent_details', store=True)
- rent_start_date = fields.Date(string='Rent Start Date', compute='_compute_rent_details', store=True)
- rent_end_date = fields.Date(string='Rent End Date', compute='_compute_rent_details', store=True)
- rent_amount = fields.Float(string='Rent Amount', compute='_compute_rent_details', store=True)
- rent_amount_payment = fields.Float(string='Rent Amount Payment', compute='_get_rent_amount_payment')
- payment_type = fields.Selection(
- [
- ('1', 'Yearly'),
- ('2', 'Half-yearly'),
- ('4', 'Quarterly'),
- ('5', 'Monthly')
- ],
- string='Payment Type',
- compute='_compute_rent_details',
- store=True
- )
- rent_attachment = fields.Many2many('ir.attachment', 'rel_rent_attachment_service_request', 'service_request_id',
- 'attachment_id', string='Rent Attachment', compute='_compute_rent_details',
- store=True)
- rent_payment_date = fields.Date(string='Rent Payment Date')
- rent_payment_date_exception = fields.Boolean(string='Rent Payment Date Exception?')
- start = fields.Date(string="Start Date")
- end = fields.Date(string='End Date')
- # New Rent Contract
- new_rent_contract = fields.Boolean(string='New Rent Contract?')
- new_start = fields.Date(string="Start Date")
- new_end = fields.Date(string='End Date')
- new_rent_contract_number = fields.Char(string="Rent Contract Number")
- new_rent_start_date = fields.Date(string='Rent Start Date')
- new_rent_end_date = fields.Date(string='Rent End Date')
- new_rent_amount = fields.Float(string='Rent Amount')
- new_rent_amount_payment = fields.Float(string='New Rent Amount Payment', compute='_get_new_rent_amount_payment')
- new_payment_type = fields.Selection([
- ('1', 'Yearly'),
- ('2', 'Half-yearly'),
- ('4', 'Quarterly'),
- ('5', 'Monthly')
- ],
- string='Payment Type'
- )
- new_rent_attachment = fields.Many2many('ir.attachment', 'rel_rent_attachment_service_request', 'service_request_id',
- 'attachment_id', string='Rent Attachment')
- new_rent_payment_date = fields.Date(string='Rent Payment Date')
- new_rent_payment_date_exception = fields.Boolean(string='Rent Payment Date Exception?')
- # Rent details for member
- member_rent_contract_number = fields.Char(string="Rent Contract Number")
- member_rent_start_date = fields.Date(string='Rent Start Date')
- member_rent_end_date = fields.Date(string='Rent End Date')
- member_rent_attachment = fields.Many2many('ir.attachment', 'rel_member_rent_attachment_service_request',
- 'service_request_id',
- 'attachment_id', string='Rent Attachment')
- added_amount_if_mother_dead = fields.Float(string="Added Amount (If mother dead)",
- compute="_get_added_amount_if_mother_dead")
- attachment_lines = fields.One2many(
- 'service.attachments.settings',
- 'service_request_id',
- compute='_compute_attachment_lines',
- readonly=False,
- copy=False,
- store=True
- )
- account_id = fields.Many2one(
- 'account.account',
- string='Expenses Account',
- compute="_compute_account_id"
- )
- device_account_id = fields.Many2one('account.account', string='Expenses Account', related='device_id.account_id')
- accountant_id = fields.Many2one('res.users', string='Accountant', related='service_cat.accountant_id',
- readonly=False)
- service_producer_id = fields.Many2one('res.partner', string='Service Producer',
- related='service_cat.service_producer_id')
- is_service_producer = fields.Boolean(string='Is Service Producer?', related='service_cat.is_service_producer')
- # maintenance_items_id = fields.Many2one('home.maintenance.lines', string="Maintenance Items")
- maintenance_items_ids = fields.One2many('home.maintenance.items', 'service_request_id',
- string="Maintenance Items", )
- payment_order_ids = fields.Many2many(comodel_name='payment.orders', relation='service_request_payment_order_rel',
- column1='service_request_id',
- column2='payment_order_id', string='Payment Orders', copy=False, )
- payment_order_id = fields.Many2one('payment.orders', string='Payment Order', copy=False)
- payment_order_count = fields.Integer(compute='_compute_payment_order', string='Number of Payment Orders')
- is_payment_order_done = fields.Boolean(string='Is Payment Order Done?')
- aid_amount = fields.Float(string='Aid Amount', compute='_get_aid_amount')
- # Fields for alternative house
- providing_alternative_housing_based_rent = fields.Boolean(string='Providing alternative housing based on rent')
- rent_for_alternative_housing = fields.Many2one('services.settings', compute='_get_rent_for_alternative_housing')
- # Fields for electrical_devices service
- device_id = fields.Many2one('electrical.devices', string='Device',
- domain="[('min_count_member','<=',benefit_member_count),('max_count_member','>=',benefit_member_count)]")
- vendor_bill = fields.Many2one('account.move', copy=False)
- requested_quantity = fields.Integer(string='Requested Quantity')
- exception_or_steal = fields.Boolean(string='Exception Or Steal?')
- exception_or_steal_attach = fields.Many2many('ir.attachment', 'rel_exception_or_steal_attachment_service_request',
- 'exception_or_steal_id', 'attachment_id',
- string='Exception or steal Attachment')
- # Home furnishing Exception
- home_furnishing_exception = fields.Boolean(string='Exception(Fire Or Steal or Natural disaster)')
- furnishing_items_ids = fields.One2many('home.furnishing.items', 'service_request_id', string="Furnishing Items")
- # Transportation insurance
- # service_reason = fields.Selection(selection=[
- # ('government_transportation', 'Government Transportation'),
- # ('universities_training_institutes_transportation', 'Universities Training Institutes Transportation'),
- # ('hospitals_transportation', 'Hospitals Transportation'),
- # ('programs_transportation', 'Programs Transportation'),
- # ], string='Service Reason')
- service_reason_id = fields.Many2one('transportation.insurance')
- max_amount = fields.Float(string='Max Transportation Amount')
- requests_counts = fields.Integer(string='Requests Counts', default=1)
- # Marriage
- member_age = fields.Integer(string="Member Age", related="member_id.age")
- member_payroll = fields.Float(string="Member Payroll", related="member_id.member_income")
- has_marriage_course = fields.Selection(selection=[
- ('yes', 'Yes'),
- ('no', 'No'),
- ], string='Has Marriage Course')
- service_benefit_count = fields.Integer(string='Service Benefit Count', compute="_compute_service_benefit_count")
- # Buy home
- amount_for_buy_home_for_member_count = fields.Float(string="Amount For Buy Home for member count")
- home_age = fields.Integer(string='Home Age')
- required_attach = fields.Boolean(string='Required Attach', related='service_cat.required_attach')
- state = fields.Selection(selection=[
- ('draft', 'Draft'),
- ('waiting_family', 'Waiting Family'),
- ('researcher', 'Researcher'),
- ('waiting_approve', 'Waiting for Operation Manager'),
- ('first_approve', 'Waiting for Branch Manager'),
- ('family_services_manager', 'Waiting Family Services Manager'),
- ('legal_department', 'Waiting Legal Department'),
- ('projects_department', 'Waiting Projects Department'),
- ('gm_assistant', 'Waiting Assistant General Manager'),
- ('accounting_approve', 'Accounting Approve'),
- ('return_to_bank', 'Return to Bank'),
- ('approval_of_beneficiary_services', 'Approval of beneficiary services'),
- ('send_request_to_supplier', 'Send Request To Supplier'),
- ('family_received_device', 'Family Received Device'),
- ('refused', 'Refused')
- ], string='state', default='draft', tracking=True, group_expand='_expand_states')
- # dynamic_state = fields.Selection(selection=[],string="State",default='draft',tracking=True,)
- state_a = fields.Selection(related='state', tracking=False)
- state_b = fields.Selection(related='state', tracking=False)
- refuse_reason_id = fields.Many2one('service.refuse.reason', string="Refuse Reason")
- return_reason = fields.Text(string="Reason for Returning the Request")
- refuse_reason = fields.Text(string="Reason for Refusal")
- specialist_note = fields.Text(string="Specialist's Note After Return")
- exception = fields.Boolean(string='Exception', default=False)
- exception_attach = fields.Many2many('ir.attachment', 'rel_exception_attachment_service_request',
- 'service_request_id',
- 'attachment_id', string='Exception Attachment')
- service_conditions = fields.Html(related='service_cat.service_conditions', string="Service Conditions")
- service_approval_date = fields.Datetime(string="Service Approval Date", readonly=True, )
- company_id = fields.Many2one('res.company', string="Company", default=lambda self: self.env.user.company_id)
- currency_id = fields.Many2one('res.currency', string="Currency", related='company_id.currency_id')
- service_max_amount = fields.Float(string="Maximum Amount", copy=False)
- rent_period = fields.Integer('Rent Period')
- is_orphan = fields.Boolean(string='Orphaned (Both Parents Deceased)', compute='_compute_is_orphan', store=True)
- has_money_for_payment_is_appearance = fields.Boolean(string='Has money Field is appearance?',
- compute='_get_money_for_payment_is_appearance')
- has_money_for_payment = fields.Selection([('yes', 'Yes'), ('no', 'No')], string='Has money for payment?')
- has_money_to_pay_first_payment = fields.Selection([('yes', 'Yes'), ('no', 'No')],
- string='Has money to pay first payment?')
- has_money_field_is_appearance = fields.Boolean(string='Has money Field is appearance?',
- compute='_get_money_field_is_appearance')
- car_name = fields.Char(string='Car Name')
- car_owner_id = fields.Many2one('family.member', domain="[('benefit_id','=',family_id)]", string="Car Owner")
- car_model_id = fields.Many2one('benefit.vehicle.model', string='Car model')
- application_form = fields.Many2many('ir.attachment', 'request_application_form_rel', 'request_id', 'attachment_id',
- string="Application Form")
- driving_license = fields.Many2many('ir.attachment', 'request_driving_license_rel', 'request_id', 'attachment_id',
- string="Driving License")
- owner_identity = fields.Many2many('ir.attachment', 'request_owner_identity_rel', 'request_id', 'attachment_id',
- string="Owner Identity")
- seasonal_service_id = fields.Many2one('seasonal.service', string='Seasonal Service', ondelete='cascade')
- is_seasonal = fields.Boolean(string='Is Seasonal Service?', related='service_cat.is_seasonal_service')
- is_in_kind = fields.Boolean(string="In Kind", default=False)
- service_qty = fields.Float(string='Quantity', default=1)
- payment_order_state = fields.Selection(string='Payment Order State', selection=[
- ('none', 'None'),
- ('waiting', 'Waiting Payment'),
- ('done', 'Done Payment'), ], copy=False, compute="_compute_payment_order_state", store=True)
- total_moves = fields.Integer(string="Total Move", compute='_get_total_move_lines')
- return_reason_id = fields.Many2one("return.reason", string="Return Reason")
-
- @api.depends('payment_order_ids')
- def _compute_payment_order(self):
- for rec in self:
- if rec.payment_order_ids:
- rec.payment_order_count = len(rec.payment_order_ids)
- else:
- rec.payment_order_count = 0
-
- @api.depends('payment_order_id', 'payment_order_id.state', 'vendor_bill', 'vendor_bill.state')
- def _compute_payment_order_state(self):
- for rec in self:
- payment_order_state = 'none'
- if rec.payment_order_id:
- if rec.payment_order_id.state == "done":
- payment_order_state = "done"
- rec.service_approval_date = fields.Datetime.now()
- if rec.state == 'accounting_approve':
- rec.state = 'send_request_to_supplier'
- rec.is_payment_order_done = True
- else:
- payment_order_state = "waiting"
- elif rec.vendor_bill:
- if rec.vendor_bill.state == "posted":
- payment_order_state = "done"
- rec.state = 'send_request_to_supplier'
- else:
- payment_order_state = "waiting"
- rec.payment_order_state = payment_order_state
-
- def action_return_bank(self):
- self.ensure_one()
- return {
- 'name': _("Bank Return"),
- 'type': 'ir.actions.act_window',
- 'res_model': 'return.reason.wizard',
- 'view_mode': 'form',
- 'target': 'new',
- 'context': {
- 'default_line_id': self.id,
- 'default_line_model': 'service.request',
- }
- }
-
- def action_processed(self):
- for record in self:
- record.state = 'accounting_approve'
-
- @api.depends('requested_service_amount', 'service_max_amount')
- def _get_money_for_payment_is_appearance(self):
- for rec in self:
- if rec.requested_service_amount and rec.service_max_amount and rec.requested_service_amount > rec.service_max_amount:
- rec.has_money_for_payment_is_appearance = True
- else:
- rec.has_money_for_payment_is_appearance = False
-
- @api.depends('requested_service_amount', 'service_max_amount')
- def _get_money_field_is_appearance(self):
- for rec in self:
- if rec.requested_service_amount and rec.service_max_amount and rec.requested_service_amount > rec.service_max_amount:
- rec.has_money_field_is_appearance = True
- else:
- rec.has_money_field_is_appearance = False
-
- @api.depends('family_id.mother_marital_conf', 'family_id.replacement_mother_marital_conf')
- def _compute_is_orphan(self):
- for rec in self:
- if not rec.family_id.add_replacement_mother:
- mother_dead = bool(getattr(rec.family_id.mother_marital_conf, 'is_dead', False))
- else:
- mother_dead = bool(getattr(rec.family_id.replacement_mother_marital_conf, 'is_dead', False))
- rec.is_orphan = mother_dead
-
- def _expand_states(self, states, domain, order):
- return [key for key, val in type(self).state.selection]
-
- @api.depends('service_cat', 'service_reason_id')
- def _compute_account_id(self):
- for rec in self:
- if rec.service_type == 'transportation_insurance':
- rec.account_id = rec.service_reason_id.account_id
- else:
- rec.account_id = rec.service_cat.account_id
-
- @api.depends('service_cat')
- def _compute_attachment_lines(self):
- for rec in self:
- commands = [(5, 0, 0)]
-
- if rec.service_cat:
- for attachment_line in rec.service_cat.attachment_lines:
- commands.append((0, 0, {
- 'service_id': False,
- 'service_request_id': rec.id,
- 'name': attachment_line.name,
- 'notes': attachment_line.notes,
- 'previous_service_attachment_settings_id': attachment_line.id,
- }))
-
- rec.attachment_lines = commands
-
- @api.model
- def create(self, vals):
- # Define the list of fields to check
- new_rent_fields = [
- 'new_rent_contract_number',
- 'new_rent_start_date',
- 'new_rent_end_date',
- 'new_rent_amount',
- 'new_payment_type',
- 'new_rent_attachment'
- ]
- res = super(ServiceRequest, self).create(vals)
- if not res.name or res.name == _('New'):
- res.name = self.env['ir.sequence'].sudo().next_by_code('service.request.sequence') or _('New')
- # Check if any of the specified fields are present in vals
- if any(field in vals for field in new_rent_fields) and vals['new_rent_contract']:
- if res.family_id:
- # Prepare values for family_id write
- update_values = {}
- if 'new_rent_contract_number' in vals:
- update_values['contract_num'] = vals['new_rent_contract_number']
- if 'new_rent_start_date' in vals:
- update_values['rent_start_date'] = vals['new_rent_start_date']
- if 'new_rent_end_date' in vals:
- update_values['rent_end_date'] = vals['new_rent_end_date']
- if 'new_rent_amount' in vals:
- update_values['rent_amount'] = vals['new_rent_amount']
- if 'new_payment_type' in vals:
- update_values['payment_type'] = vals['new_payment_type']
- if 'new_rent_attachment' in vals:
- update_values['rent_attachment'] = vals['new_rent_attachment']
-
- # Write updates to the related family_id
- res.family_id.write(update_values)
- return res
-
- def write(self, vals):
- # Define the list of fields you want to check
- new_rent_fields = ['new_rent_contract_number', 'new_rent_start_date', 'new_rent_end_date', 'new_rent_amount',
- 'new_payment_type', 'new_rent_attachment']
- result = super(ServiceRequest, self).write(vals)
- update_values = {}
- if any(field in vals for field in new_rent_fields) and self.new_rent_contract:
- for record in self:
- # Ensure family_id exists before proceeding
- if record.family_id:
- # Prepare values for family_id write
- update_values = {}
- # Add fields to update_values only if they exist in vals
- if 'new_rent_contract_number' in vals:
- update_values['contract_num'] = vals['new_rent_contract_number']
- if 'new_rent_start_date' in vals:
- update_values['rent_start_date'] = vals['new_rent_start_date']
- if 'new_rent_end_date' in vals:
- update_values['rent_end_date'] = vals['new_rent_end_date']
- if 'new_rent_amount' in vals:
- update_values['rent_amount'] = vals['new_rent_amount']
- if 'new_payment_type' in vals:
- update_values['payment_type'] = vals['new_payment_type']
- if 'new_rent_attachment' in vals:
- update_values['rent_attachment'] = vals['new_rent_attachment']
-
- # Write the prepared update values to `family_id`
- record.family_id.write(update_values)
-
- return result
-
- def unlink(self):
- for request in self:
- if request.state not in ['draft']:
- raise UserError(_('You cannot delete this record'))
- return super(ServiceRequest, self).unlink()
-
- @api.depends('family_id')
- def _compute_rent_details(self):
- for rec in self:
- # Compute values only if they are not already set
- if rec.family_id:
- if not rec.rent_contract_number:
- rec.rent_contract_number = rec.family_id.contract_num
- if not rec.rent_start_date:
- rec.rent_start_date = rec.family_id.rent_start_date
- if not rec.rent_end_date:
- rec.rent_end_date = rec.family_id.rent_end_date
- if not rec.rent_amount:
- rec.rent_amount = rec.family_id.rent_amount
- if not rec.payment_type:
- rec.payment_type = rec.family_id.payment_type
- if not rec.rent_attachment:
- rec.rent_attachment = rec.family_id.rent_attachment
-
- def _get_estimated_rent_amount(self):
- for rec in self:
- rec.estimated_rent_amount = 0.0 # Default value
-
- if not rec.family_id:
- continue
- if rec.service_type == 'rent':
- for item in rec.service_cat.rent_lines:
- # Check if benefit category and member count match
- if rec.family_id.benefit_category_id != item.benefit_category_id or rec.family_id.benefit_member_count != item.benefit_count:
- continue
-
- # Determine rent amount based on branch type and property type
- branch_type = rec.family_id.branch_custom_id.branch_type
- is_shared_rent = rec.family_id.property_type == 'rent_shared'
-
- if branch_type == 'branches':
- rec.estimated_rent_amount = item.estimated_rent_branches * (
- item.discount_rate_shared_housing if is_shared_rent else 1)
- elif branch_type == 'governorates':
- rec.estimated_rent_amount = item.estimated_rent_governorate * (
- item.discount_rate_shared_housing if is_shared_rent else 1)
- if rec.service_type == 'alternative_housing':
- for item in rec.rent_for_alternative_housing.rent_lines:
- # Check if benefit category and member count match
- if rec.family_id.benefit_category_id != item.benefit_category_id or rec.family_id.benefit_member_count != item.benefit_count:
- continue
-
- # Determine rent amount based on branch type and property type
- branch_type = rec.family_id.branch_custom_id.branch_type
- is_shared_rent = rec.family_id.property_type == 'rent_shared'
-
- if branch_type == 'branches':
- rec.estimated_rent_amount = item.estimated_rent_branches * (
- item.discount_rate_shared_housing if is_shared_rent else 1)
- elif branch_type == 'governorates':
- rec.estimated_rent_amount = item.estimated_rent_governorate * (
- item.discount_rate_shared_housing if is_shared_rent else 1)
-
- def _get_estimated_rent_amount_payment(self):
- for rec in self:
- rec.estimated_rent_amount_payment = 0.0
- if rec.estimated_rent_amount and rec.payment_type:
- rec.estimated_rent_amount_payment = rec.estimated_rent_amount / int(rec.payment_type)
- if rec.estimated_rent_amount and rec.new_payment_type:
- rec.estimated_rent_amount_payment = rec.estimated_rent_amount / int(rec.new_payment_type)
-
- def _get_rent_amount_payment(self):
- for rec in self:
- if rec.rent_amount and rec.payment_type:
- rec.rent_amount_payment = rec.rent_amount / int(rec.payment_type)
- else:
- rec.rent_amount_payment = 0.0
-
- def _get_new_rent_amount_payment(self):
- for rec in self:
- if rec.new_rent_amount and rec.new_payment_type:
- rec.new_rent_amount_payment = rec.new_rent_amount / int(rec.new_payment_type)
- else:
- rec.new_rent_amount_payment = 0.0
-
- def _get_paid_rent_amount(self):
- for rec in self:
- rec.paid_rent_amount = min(rec.estimated_rent_amount_payment, rec.requested_service_amount)
-
- def _get_added_amount_if_mother_dead(self):
- for rec in self:
- rec.added_amount_if_mother_dead = 0.0
- if rec.family_id.mother_marital_conf.is_dead:
- rec.added_amount_if_mother_dead = rec.service_cat.raise_amount_for_orphan
-
- def _get_aid_amount(self):
- for rec in self:
- if rec.service_type == 'rent':
- rec.aid_amount = rec.paid_rent_amount + rec.added_amount_if_mother_dead
- else:
- rec.aid_amount = rec.requested_service_amount
-
- def _get_rent_for_alternative_housing(self):
- for rec in self:
- if rec.service_cat.service_type == 'alternative_housing':
- rec.rent_for_alternative_housing = self.env['services.settings'].search([('service_type', '=', 'rent')],
- limit=1).id
- else:
- rec.rent_for_alternative_housing = False
-
- @api.depends('family_id', 'service_cat')
- def _compute_service_benefit_count(self):
- for rec in self:
- count = 1
- if rec.benefit_type == "family":
- count = len(rec.family_id.member_ids.filtered(lambda m: m.member_status == 'benefit'))
- if rec.service_cat.max_age > 0:
- count = len(
- rec.family_id.member_ids.filtered(lambda x: x.age <= rec.service_cat.max_age))
- rec.service_benefit_count = count
-
- @api.onchange('requests_counts', 'service_type', 'service_reason_id')
- def _get_max_transportation_amounts(self):
- for rec in self:
- rec.max_amount = rec.requests_counts * rec.service_reason_id.limit_amount
-
- def action_send_to_researcher(self):
- for rec in self:
- rec.state = 'researcher'
-
- def action_return_to_family(self):
- for rec in self:
- rec.state = 'waiting_family'
-
- def action_researcher_send_request(self):
- for rec in self:
- if not rec.requested_service_amount or rec.requested_service_amount <= 0:
- raise UserError(_("Please enter a valid service amount."))
-
- if rec.attachment_lines:
- for attach_line in rec.attachment_lines:
- if not attach_line.service_attach:
- raise UserError(_(
- "Some attachment records are missing files. Please make sure all required attachments are uploaded before submitting."
- ))
-
- rec.state = 'waiting_approve'
-
- def action_operations_chief_approve(self):
- for rec in self:
- rec.state = 'first_approve'
-
- def action_branch_manager_approve(self):
- for rec in self:
- if rec.service_cat.needs_services_head_approval or rec.exception:
- rec.state = 'family_services_manager'
- else:
- rec.state = 'accounting_approve'
-
- def action_family_services_manager_approve(self):
- for rec in self:
- if rec.service_cat.needs_legal_approval:
- rec.state = 'legal_department'
- elif rec.service_cat.needs_project_management_approval:
- rec.state = 'projects_department'
- elif rec.service_cat.needs_beneficiary_manager_approval or rec.exception:
- rec.state = 'gm_assistant'
- else:
- rec.state = 'accounting_approve'
-
- def action_legal_department_approve(self):
- for rec in self:
- if rec.service_cat.needs_project_management_approval:
- rec.state = 'projects_department'
- elif rec.service_cat.needs_beneficiary_manager_approval or rec.exception:
- rec.state = 'gm_assistant'
-
- def action_projects_department_approve(self):
- for rec in self:
- if rec.service_cat.needs_beneficiary_manager_approval or rec.exception:
- rec.state = 'gm_assistant'
- else:
- rec.state = 'accounting_approve'
-
- def action_beneficiary_manager_approve(self):
- for rec in self:
- rec.state = 'accounting_approve'
-
- def action_accounting_approve(self):
- for rec in self:
- if rec.service_type == 'electrical_devices':
- rec.state = 'approval_of_beneficiary_services'
- else:
- rec.service_approval_date = fields.Datetime.now()
- rec.state = 'send_request_to_supplier'
-
- def action_supplier_approve(self):
- for rec in self:
- rec.service_approval_date = fields.Datetime.now()
- rec.state = 'send_request_to_supplier'
-
- def action_request_done(self):
- for rec in self:
- if rec.service_type == 'buy_car':
- car_vals = {
- 'benefit_id': rec.family_id.id,
- 'name': rec.car_name,
- 'member_id': rec.car_owner_id.id,
- 'car_model': rec.car_model_id.id,
- }
- car = self.env['cars.line'].create(car_vals)
- if rec.application_form:
- car.application_form = [(6, 0, rec.application_form.ids)]
- if rec.driving_license:
- car.driving_license = [(6, 0, rec.driving_license.ids)]
- if rec.owner_identity:
- car.owner_identity = [(6, 0, rec.owner_identity.ids)]
- rec.family_id.has_car = True
- rec.state = 'family_received_device'
-
- def action_send_request_to_supplier(self):
- for rec in self:
- rec.state = 'family_received_device'
-
- def action_first_refuse(self):
- return {
- 'name': _('Reason for Returning the Request'),
- 'type': 'ir.actions.act_window',
- 'res_model': 'reason.for.return.wizard',
- 'view_mode': 'form',
- 'target': 'new',
- }
-
- def action_refuse(self):
- return {
- 'name': _('Refuse Reason'),
- 'type': 'ir.actions.act_window',
- 'res_model': 'service.refuse.reason.wizard',
- 'view_mode': 'form',
- 'target': 'new',
- }
-
- @api.onchange('rent_payment_date', 'new_rent_payment_date')
- def onchange_rent_payment_date(self):
- today_date = fields.Date.today()
- for rec in self:
- if rec.rent_payment_date and not rec.rent_payment_date_exception and not rec.new_rent_payment_date:
- month_before_rent_payment_date = rec.rent_payment_date - timedelta(days=30)
- if today_date > month_before_rent_payment_date:
- raise UserError(_("You Should request At least a month ago rent payment date"))
- if rec.new_rent_payment_date and not rec.new_rent_payment_date_exception:
- new_month_before_rent_payment_date = rec.new_rent_payment_date - timedelta(days=30)
- if today_date > new_month_before_rent_payment_date:
- raise UserError(_("You Should request At least a month ago rent payment date"))
-
- @api.onchange('furnishing_items_ids')
- def _onchange_home_furnishing_cost(self):
- furnishing_cost_sum = 0
- for rec in self.furnishing_items_ids:
- furnishing_cost_sum += rec.furnishing_cost
- self.requested_service_amount = furnishing_cost_sum
-
- @api.onchange('family_id', 'service_cat')
- def _onchange_member(self):
- for rec in self:
- rec.benefit_type = rec.service_cat.benefit_type
- if not rec.family_id:
- rec.member_id = False
- rec.service_cat = False
- rec.available_service_cats = False
-
- @api.onchange('service_cat', 'family_id')
- def _onchange_service_cat(self):
- if self.service_cat.service_type == 'rent' and self.family_id.property_type != 'rent' and self.family_id.property_type != 'rent_shared' and self.benefit_type == 'family':
- raise UserError(_("You cannot benefit from this service (property type not rent)"))
-
- @api.onchange(
- 'requested_service_amount',
- 'benefit_type',
- 'date',
- 'service_cat',
- 'family_id',
- 'member_id',
- 'exception_or_steal',
- 'home_furnishing_exception',
- 'has_marriage_course',
- 'home_age',
- 'service_reason_id',
- 'device_id',
- 'requested_quantity',
- 'amount_for_buy_home_for_member_count',
- 'marriage_contract_date',
- 'start', 'end'
- )
- def onchange_requested_service_amount(self):
- res = {}
- Service = self.env['service.request']
- today = fields.Date.today()
- date_before_year = today - timedelta(days=365)
-
- for rec in self:
- if not rec.exception and not rec.exception_attach:
- family_id = rec.family_id.id
- service_type = rec.service_cat.service_type
- allowed = rec.service_cat.allowed_recurrence
- interval = rec.service_cat.recurrence_interval or 1
- period = rec.service_cat.recurrence_period or 'months'
- max_limit_type = rec.service_cat.max_limit_type
- special_services = ['home_furnishing', 'electrical_devices', 'rent', 'alternative_housing']
- base_domain = [('family_id', '=', family_id), ('service_cat', '=', rec.service_cat.id),
- ('id', '!=', rec._origin.id), ('state', '!=', 'refused')]
- if rec.benefit_type == "member":
- base_domain.append(('member_id', '=', rec.member_id.id))
- if rec.service_cat.service_type == 'buy_car':
- if rec.family_id.has_car:
- raise ValidationError(_("You cannot request this service because you have a car."))
- if rec.benefit_member_count < rec.service_cat.min_count_member:
- raise ValidationError(
- _("You cannot request this service because you are less than %s") % rec.service_cat.min_count_member)
- if rec.service_cat.service_type == 'recruiting_driver':
- son_members_above_age = rec.family_id.mapped('member_ids').filtered(
- lambda x: x.relationn.relation_type == 'son' and x.age > 18)
- daughter_members_above_age = rec.family_id.mapped('member_ids').filtered(
- lambda x: x.relationn.relation_type == 'daughter' and x.age > 18)
- disable_mother = rec.family_id.mapped('member_ids').filtered(
- lambda x: x.relationn.relation_type == 'mother')
- work_mother = rec.family_id.mapped('member_ids').filtered(
- lambda x: x.relationn.relation_type == 'mother' and x.benefit_id.is_mother_work)
- disable_replacement_mother = rec.family_id.mapped('member_ids').filtered(
- lambda x: x.relationn.relation_type == 'replacement_mother')
- work_replacement_mother = rec.family_id.mapped('member_ids').filtered(
- lambda
- x: x.relationn.relation_type == 'replacement_mother' and x.replacement_is_mother_work)
- if not rec.family_id.has_car:
- raise ValidationError(_("You cannot request this service because you do not have a car"))
- if son_members_above_age or daughter_members_above_age:
- raise ValidationError(
- _("You cannot request this service because children above 18 years"))
- if rec.family_id.add_replacement_mother and not disable_replacement_mother and not work_replacement_mother:
- raise ValidationError(
- _("You cannot request this service because mother should be worked or has disability"))
- if not rec.family_id.add_replacement_mother and not disable_mother and not work_mother:
- raise ValidationError(
- _("You cannot request this service because mother should be worked or has disability"))
- if service_type in ['home_maintenance', 'complete_building_house', 'buy_home']:
- existing_request_restoration = Service.search([
- ('family_id', '=', family_id),
- ('service_cat.service_type', '=', 'home_restoration'),
- ('id', '!=', rec._origin.id),
- ('state', '!=', 'refused')
- ], order='date desc', limit=1)
-
- if existing_request_restoration and existing_request_restoration.date:
- if service_type == 'buy_home':
- raise ValidationError(_(
- "You cannot request this service together with 'home_restoration' within the same recurrence period."
- ))
- else:
- restoration_date = existing_request_restoration.date.date()
- next_allowed_restoration_date = (
- restoration_date + relativedelta(months=interval)
- if period == 'months'
- else restoration_date + relativedelta(years=interval)
- )
-
- if rec.date.date() < next_allowed_restoration_date:
- raise ValidationError(_(
- "You cannot request this service together with 'home_restoration' within the same recurrence period."
- ))
- if service_type == 'transportation_insurance':
- if rec.family_id.has_car:
- raise ValidationError(_("You cannot request this service because you have a car."))
- if service_type == 'buy_home':
- if rec.service_cat.buy_home_max_total_amount < rec.amount_for_buy_home_for_member_count:
- raise ValidationError(_(
- "You can request this service because the total housing amount (%.2f) "
- "is still under the maximum limit of %.2f."
- ) % (rec.amount_for_buy_home_for_member_count, rec.service_cat.buy_home_max_total_amount))
- if rec.home_age > rec.service_cat.home_age:
- raise ValidationError(
- _("You cannot request this service Again Because the home Age More than %s") % rec.service_cat.home_age)
-
- if rec.start and rec.end:
- if rec.start > rec.end:
- raise ValidationError(_("Start date must be before end date."))
- overlap_domain = base_domain + [
- ('start', '!=', False),
- ('end', '!=', False),
- ('start', '<=', rec.end),
- ('end', '>=', rec.start)
- ]
- overlap_requests = Service.search(overlap_domain)
- if overlap_requests:
- raise ValidationError(
- _("This service request overlaps with an existing requests [%s] for the same service "
- "between %s and %s.") % (", ".join(overlap_requests.mapped('name')), rec.start, rec.end)
- )
-
- if allowed:
- if allowed == 'unlimited':
- pass
- elif allowed == 'once':
- if Service.search_count(base_domain):
- raise ValidationError(_("You cannot request this service more than once."))
- else:
- if service_type in special_services:
- if service_type == 'home_furnishing':
- delta_kwargs = {period: interval}
- date_before = rec.date - relativedelta(**delta_kwargs)
- domain = base_domain + [('date', '>', date_before)]
- existing_requests = Service.search(domain)
- total_amount = sum(existing_requests.mapped('requested_service_amount')) + sum(
- rec.furnishing_items_ids.mapped('furnishing_cost'))
- if not rec.home_furnishing_exception:
- rec.service_max_amount = rec.service_cat.max_amount
- if total_amount > rec.service_cat.max_amount:
- raise ValidationError(
- _("You cannot request more than %s") % rec.service_max_amount)
- if rec.home_furnishing_exception:
- rec.service_max_amount = rec.service_cat.max_furnishing_amount_if_exception
- if total_amount > rec.service_cat.max_furnishing_amount_if_exception:
- raise ValidationError(
- _("You cannot request more than %s") % rec.service_max_amount)
- if service_type == 'electrical_devices':
- rec.service_max_amount = rec.device_id.price_unit if rec.device_id else 0.0
- if rec.device_id:
- delta_kwargs = {period: interval}
- date_before = rec.date - relativedelta(**delta_kwargs)
- domain = base_domain + [
- ('device_id', '=', rec.device_id.id),
- ('date', '>', date_before)
- ]
- existing_requests = Service.search(domain)
- total_previous_qty = sum(existing_requests.mapped('requested_quantity'))
- total_qty = total_previous_qty + rec.requested_quantity
- allowed_line = rec.service_cat.electrical_devices_lines.filtered(
- lambda l: l.id == rec.device_id.id
- )
- allowed_qty = allowed_line.allowed_quantity if allowed_line else 0
- if total_qty > allowed_qty:
- raise ValidationError(_(
- "You cannot request this device more than %s times within %s %s."
- ) % (allowed_qty, interval, period))
-
- else:
- last_request = Service.search(base_domain, order='date desc', limit=1)
- if last_request and last_request.date:
- last_date = (
- last_request.date.date()
- if isinstance(last_request.date, datetime)
- else last_request.date
- )
- next_allowed_date = (
- last_date + relativedelta(months=interval)
- if period == 'months'
- else last_date + relativedelta(years=interval)
- )
- if isinstance(next_allowed_date, datetime):
- next_allowed_date = next_allowed_date.date()
-
- if rec.date.date() < next_allowed_date:
- raise ValidationError(_(
- "You can only request this service again after %s."
- ) % next_allowed_date.strftime('%Y-%m-%d'))
-
- if max_limit_type and service_type not in special_services:
- if max_limit_type == 'fixed':
- rec.service_max_amount = rec.service_cat.max_amount
- elif max_limit_type == 'category':
- rec.service_max_amount = rec.service_cat.category_amount_lines and max(
- rec.service_cat.category_amount_lines.filtered(
- lambda r: r.benefit_category_id.id == rec.family_category.id).mapped('max_amount'),
- default=0.0) or 0
- elif max_limit_type == 'category_person':
- rec.service_max_amount = rec.service_cat.bill_lines and max(rec.service_cat.bill_lines.filtered(
- lambda x: x.benefit_category_id.id == rec.family_category.id and
- x.min_count_member <= rec.benefit_member_count <= x.max_count_member).mapped(
- 'max_amount_for_bill'), default=0.0) or 0
- elif max_limit_type == 'service':
- pass
- elif max_limit_type == 'none':
- pass
- elif max_limit_type == 'amount_person':
- rec.service_max_amount = rec.service_cat.limit_person_line_ids and max(
- rec.service_cat.limit_person_line_ids.filtered(
- lambda
- x: x.min_count_member <= rec.benefit_member_count <= x.max_count_member)).amount or 0
-
- if rec.max_limit_period:
- if rec.max_limit_period == "month":
- if rec.start and rec.end:
- start_date = rec.start.date() if isinstance(rec.start, datetime) else rec.start
- end_date = rec.end.date() if isinstance(rec.end, datetime) else rec.end
- num_months = (end_date.year - start_date.year) * 12 + (
- end_date.month - start_date.month) + 1
- if num_months > rec.service_cat.max_months_limit:
- raise ValidationError(
- _("You cannot request this service for more than %s months.") % rec.service_cat.max_months_limit
- )
- rec.service_max_amount *= num_months
- elif rec.max_limit_period == "year":
- before_year_domain = base_domain + [('date', '>', date_before_year)]
- existing_requests_within_year = Service.search(before_year_domain)
- total_spent = sum(existing_requests_within_year.mapped('requested_service_amount'))
- rec.service_max_amount = rec.service_cat.max_amount - total_spent
- elif rec.max_limit_period == "individual":
- rec.service_max_amount *= rec.service_benefit_count
- elif rec.max_limit_period == "recurrence_period":
- pass
-
- if service_type == 'transportation_insurance':
- if rec.service_reason_id and rec.requested_service_amount > rec.max_amount:
- raise ValidationError(_("You cannot request more than %s"))
- continue
-
- if rec.service_cat.service_type == 'marriage':
- if rec.member_id.relationn.relation_type == 'son' and not rec.member_id.is_work:
- raise ValidationError(_("This service is not eligible because the son is not working."))
-
- if rec.marriage_contract_date and rec.date:
- request_date = rec.date.date() if isinstance(rec.date, datetime) else rec.date
- contract_date = rec.marriage_contract_date
- diff_days = (request_date - contract_date).days
- if diff_days > 365:
- raise ValidationError(
- _("You cannot request this service because the marriage contract date exceeds one year."))
- rec.service_max_amount = rec.service_cat.fatherless_member_amount
- if rec.is_orphan:
- rec.service_max_amount = rec.service_cat.orphan_member_amount
- rec.requested_service_amount = rec.service_max_amount
- if rec.member_age > rec.service_cat.max_age:
- raise ValidationError(_("Member Age should be less than %s ") % rec.service_cat.max_age)
- if rec.member_payroll > rec.service_cat.member_max_payroll:
- raise ValidationError(
- _("Member Payroll should be less than %s ") % rec.service_cat.member_max_payroll)
- if not rec.is_orphan and rec.requested_service_amount > rec.service_max_amount:
- raise ValidationError(_("You cannot request more than %s ") % rec.service_max_amount)
- if rec.is_orphan and rec.requested_service_amount > rec.service_max_amount:
- raise ValidationError(_("You cannot request more than %s ") % rec.service_max_amount)
- if rec.has_marriage_course == 'no':
- raise UserError(_("You Should take a course"))
- continue
-
- if rec.requested_service_amount > rec.service_max_amount and service_type not in special_services and not max_limit_type == 'none':
- raise ValidationError(
- _("You cannot request more than %s") % rec.service_max_amount
- )
-
- # Validation for 'member' benefit type
- if rec.benefit_type == 'member' and rec.service_cat.service_type == 'rent':
- max_requested_amount = rec.service_cat.max_amount_for_student
- if rec.requested_service_amount > max_requested_amount:
- self.benefit_type = False
- res['warning'] = {'title': _('ValidationError'),
- 'message': _("You cannot request more than %s") % max_requested_amount}
- return res
- # Validation for 'family' benefit type
- if rec.benefit_type == 'family' and rec.service_cat.service_type == 'rent':
- rent_line_id = rec.service_cat.rent_lines.filtered(
- lambda r: r.benefit_category_id.id == rec.family_category.id \
- and r.benefit_count == rec.benefit_member_count
- )
- max_requested_amount = rent_line_id.estimated_rent_branches if rec.branch_custom_id.branch_type == 'branches' else rent_line_id.estimated_rent_governorate
- if rec.requested_service_amount > max_requested_amount:
- self.benefit_type = False
- res['warning'] = {'title': _('ValidationError'),
- 'message': _("You cannot request more than %s") % max_requested_amount}
- return res
- if rec.benefit_type == 'family' and rec.service_cat.service_type == 'alternative_housing' and not rec.providing_alternative_housing_based_rent:
- if rec.requested_service_amount > rec.service_cat.rent_amount_for_alternative_housing:
- raise UserError(
- _("You Cannot request amount more than %s") % rec.service_cat.rent_amount_for_alternative_housing)
- elif rec.rent_period > rec.service_cat.rent_period:
- raise UserError(
- _("You Cannot request this service for period more than %s") % rec.service_cat.rent_period)
- # Validation for 'family' benefit type with 'eid_gift' service type
- # if rec.benefit_type == 'family' and rec.service_cat.service_type == 'eid_gift':
- # if rec.eid_gift_benefit_count == 0:
- # raise UserError(
- # _("You cannot request this service because family should have members his age less than %s") % rec.service_cat.max_age)
- # Validation for 'member' benefit type with 'eid_gift' service type
- # if rec.benefit_type == 'member' and rec.service_cat.service_type == 'eid_gift':
- # if rec.member_id.age > rec.service_cat.max_age:
- # raise UserError(
- # _("You cannot request this service because your age should be less than %s") % rec.service_cat.max_age)
-
- @api.onchange('member_id')
- def onchange_member_id(self):
- for rec in self:
- if rec.member_id and rec.service_type == 'rent' and not rec.member_id.member_location_conf.is_far_from_family:
- raise UserError(_("You Cannot request Service if you not study inside Saudi Arabia"))
-
- @api.onchange('start', 'end', 'rent_start_date', 'rent_end_date', 'new_start', 'new_end', 'new_rent_start_date',
- 'new_rent_end_date', 'new_rent_contract')
- def _check_date_range(self):
- for rec in self:
- # Ensure both start and end dates are set
- if rec.start and rec.end and rec.rent_start_date and rec.rent_end_date and not rec.new_rent_contract:
- # Check if `start` and `end` are within `rent_start_date` and `rent_end_date`
- if not (rec.rent_start_date <= rec.start <= rec.rent_end_date and
- rec.rent_start_date <= rec.end <= rec.rent_end_date):
- raise UserError(
- "The Start Date and End Date must be within the Rent Start Date and Rent End Date range.")
- if rec.new_start and rec.new_end and rec.new_rent_start_date and rec.new_rent_end_date and rec.new_rent_contract:
- # Check if `start` and `end` are within `rent_start_date` and `rent_end_date`
- if not (rec.new_rent_start_date <= rec.new_start <= rec.new_rent_end_date and
- rec.new_rent_start_date <= rec.new_end <= rec.new_rent_end_date):
- raise UserError(
- "The Start Date and End Date must be within the Rent Start Date and Rent End Date range.")
-
- @api.depends('family_category')
- def _compute_available_service_cats(self):
- for rec in self:
- domain = [('is_seasonal_service', '=', False), ('service_type', '!=', 'main_service'),
- ('benefit_category_ids', 'in', [rec.family_category.id])]
- if rec.family_id.property_type not in ['ownership', 'ownership_shared', 'charitable']:
- domain.append(('service_type', '!=', 'home_restoration'))
- else:
- domain.append(('service_type', '!=', 'buy_home'))
- rec.available_service_cats = rec.available_service_cats.sudo().search(domain)
- # if rec.member_id.member_status != 'benefit':
- # domain.append(('allow_non_beneficiary','=',True))
-
- def action_set_to_draft(self):
- for rec in self:
- rec.state = 'draft'
-
- def action_accounting_transfer(self):
- validation_setting = self.env["family.validation.setting"].search([], limit=1)
- line_ids = []
- service_cats = self.mapped('service_cat')
- if len(service_cats) > 1:
- cat_names = ", ".join(service_cats.mapped('service_name'))
- raise UserError(_(
- "All selected service requests must belong to the same Service Cat.\n\n"
- "Selected Services Cat:\n%s"
- ) % cat_names)
-
- if service_cats.payment_method == "payment_order":
- invalid_records = self.filtered(
- lambda r: r.state != 'accounting_approve'
- or r.payment_order_state != 'none'
- or r.payment_order_id
- )
-
- if invalid_records:
- names = ", ".join(invalid_records.mapped('name'))
- raise UserError(_(
- "The following service requests do not meet the conditions:\n%s\n"
- "Each request must:\n"
- "• Be in 'Accounting Approve' state\n"
- "• Have payment order state = 'None'\n"
- "• Not be linked to any payment order"
- ) % names)
-
- payment_order = self.env['payment.orders'].create({
- 'state': 'draft',
- 'accountant_id': service_cats.accountant_id.id,
- 'service_requests_ids': [(6, 0, self.ids)],
- 'type': 'services',
- })
- self.write({
- 'payment_order_ids': [(4, payment_order.id)],
- 'payment_order_id': payment_order.id,
- })
-
- elif service_cats.payment_method == "invoice":
- invalid_records = self.filtered(
- lambda r: r.state != 'accounting_approve'
- or r.payment_order_state != 'none'
- or r.vendor_bill
- )
-
- if invalid_records:
- names = ", ".join(invalid_records.mapped('name'))
- raise UserError(_(
- "The following service requests do not meet the conditions:\n%s\n"
- "Each request must:\n"
- "• Be in 'Accounting Approve' state\n"
- "• Have payment order state = 'None'\n"
- "• Not be linked to any invoice"
- ) % names)
-
- for rec in self:
- invoice_line = (0, 0, {
- 'name': f'{rec.family_id.name}/{rec.device_id.device_name}/{rec.description}/{rec.name}',
- 'account_id': rec.device_account_id.id,
- 'analytic_account_id': rec.family_id.branch_family_id.branch.analytic_account_id.id,
- 'quantity': rec.requested_quantity,
- 'price_unit': rec.requested_service_amount,
- 'benefit_family_id': rec.family_id.id,
- })
- line_ids.append(invoice_line)
- vendor_bill = self.env['account.move'].create({
- 'move_type': 'in_invoice',
- 'partner_id': self[0].service_producer_id.id,
- 'journal_id': validation_setting.journal_id.id,
- # 'accountant_id': self.accountant_id.id,
- 'invoice_line_ids': line_ids,
- })
- self.vendor_bill = vendor_bill
-
- def _get_total_move_lines(self):
- for rec in self:
- if self.service_cat.payment_method == "payment_order":
- moves = rec.payment_order_ids.mapped('move_id')
- elif self.service_cat.payment_method == "invoice":
- moves = self.vendor_bill
-
- rec.total_moves = len(moves)
-
- def action_open_related_move_records(self):
- if self.service_cat.payment_method == "payment_order":
- moves = self.payment_order_ids.mapped('move_id')
- elif self.service_cat.payment_method == "invoice":
- moves = self.vendor_bill.ids
-
- return {
- 'name': _('Vendor Bills'),
- 'type': 'ir.actions.act_window',
- 'res_model': 'account.move',
- 'view_mode': 'tree,form',
- 'domain': [('id', 'in', moves.ids)],
- }
-
- def action_open_payment_orders(self):
- self.ensure_one()
- if not self.payment_order_ids:
- raise UserError(_("No payment orders are linked to this request."))
-
- return {
- 'name': _('Payment Orders'),
- 'type': 'ir.actions.act_window',
- 'res_model': 'payment.orders',
- 'view_mode': 'tree,form',
- 'domain': [('id', 'in', self.payment_order_ids.ids)],
- 'context': {'create': False},
- }
diff --git a/odex25_ensan/odex_benefit/models/services_settings.py b/odex25_ensan/odex_benefit/models/services_settings.py
deleted file mode 100644
index 4b2ff759f..000000000
--- a/odex25_ensan/odex_benefit/models/services_settings.py
+++ /dev/null
@@ -1,202 +0,0 @@
-from odoo import fields, models, api, _
-
-
-class ServicesSettings(models.Model):
- _name = 'services.settings'
- _rec_name = 'service_name'
- _order = 'service_number'
-
- service_name = fields.Char(string='Service Name')
- benefit_type = fields.Selection(string='Benefit Type', selection=[('family', 'Family'), ('member', 'Member')])
- parent_service = fields.Many2one('services.settings',string='Parent Service')
- is_main_service = fields.Boolean(string='Is Main Service?')
- is_service_producer = fields.Boolean(string='Is Service Producer?')
- service_producer_id = fields.Many2one('res.partner',string='Service Producer')
- is_this_service_for_student = fields.Boolean(string='Is Service For Student?')
- service_type = fields.Selection([('rent', 'Rent'),('home_restoration', 'Home Restoration'),('alternative_housing', 'Alternative Housing'),('home_maintenance','Home Maintenance')
- ,('complete_building_house','Complete Building House'),('electrical_devices','Electrical Devices'),('home_furnishing','Home furnishing')
- ,('electricity_bill','Electricity bill'),('water_bill','Water bill'),('buy_car','Buy Car'),('recruiting_driver','Recruiting Driver')
- ,('transportation_insurance','Transportation Insurance'),('debits','Debits'),('health_care','Health Care'),
- ('providing_medicines_medical_devices_and_needs_the_disabled','Providing Medicines Medical Devices And Needs The Disabled'),
- ('recruiting_domestic_worker_or_nurse','Recruiting a domestic worker or nurse') ,('marriage','Marriage'),('eid_gift','Eid gift'),
- ('winter_clothing','Winter clothing'),('ramadan_basket','Ramadan basket'),('natural_disasters','Natural disasters'),
- ('legal_arguments','Legal arguments'),('buy_home','Buy Home'),('main_service','Main Service'),('normal_service', 'Normal Service')]
- ,string='Service Type')
- max_amount_for_student = fields.Float(string='Max Amount for Student')
- raise_amount_for_orphan = fields.Float(string='Raise Amount For Orphan')
- rent_lines = fields.One2many('rent.lines','services_settings_id')
- attachment_lines = fields.One2many('service.attachments.settings','service_id')
- #Fields for home restoration
- category_amount_lines = fields.One2many('category.amount.line','services_settings_id')
- rent_amount_for_alternative_housing = fields.Float(string='Rent Amount For Alternative Housing')
- rent_period = fields.Integer('Rent Period')
- home_maintenance_lines = fields.One2many('home.maintenance.lines','services_settings_id')
- benefit_category_ids = fields.Many2many('benefit.category', string='Allowed Categories')
- account_id = fields.Many2one('account.account',string='Expenses Account',domain="[('user_type_id.id','=',15)]")
- accountant_id = fields.Many2one('res.users',string='Accountant')
- #For Electrical Devices
- electrical_devices_lines = fields.One2many('electrical.devices','services_settings_id')
- #Home Furnishing
- home_furnishing_lines = fields.One2many('home.furnishing.lines','services_settings_id')
- max_furnishing_amount_if_exception = fields.Float(string='Max Furnishing Amount (Exception)')
- bill_lines = fields.One2many('bill.lines', 'services_settings_id')
- min_count_member = fields.Integer(string='Mini Count Member')
- #Transportation insurance
- transportation_insurance_ids = fields.One2many('transportation.insurance', 'services_settings_id')
- member_max_payroll = fields.Float(string='Member Max Payroll')
- fatherless_member_amount = fields.Float(string='Fatherless Member Amount')
- orphan_member_amount = fields.Float(string='Orphan Member Amount')
- #Buy Home
- limit_person_line_ids = fields.One2many('service.limit.person.line', 'services_settings_id')
- buy_home_max_total_amount = fields.Float(string='Buy Home Max Total Amount')
- home_age = fields.Integer(string='Home Age')
- required_attach = fields.Boolean(string='Required Attach')
- is_seasonal_service = fields.Boolean(string='Is Seasonal Service?')
- active = fields.Boolean('Active', default=True)
- show_in_portal = fields.Boolean(string="Show in Portal",copy=False)
- service_number = fields.Char(string="Service Number",copy=False)
- service_category = fields.Selection([
- ('emergency', 'Emergency'),
- ('permanent', 'Permanent'),
- ('exceptional', 'Exceptional'),
- ('seasonal', 'Seasonal'),
- ], string="Service Category",copy=False)
- company_id = fields.Many2one('res.company', string="Company", default=lambda self: self.env.user.company_id)
- currency_id = fields.Many2one('res.currency', string="Currency", related='company_id.currency_id')
- max_amount = fields.Monetary(string="Maximum Amount", currency_field='currency_id',copy=False)
- max_age = fields.Integer(string="Maximum Age",copy=False)
- service_description = fields.Text(string="Service Description")
- service_conditions = fields.Html(string="Service Conditions")
- allowed_recurrence = fields.Selection([
- ('once', 'Once'),
- ('periodic', 'Every Period'),
- ('unlimited', 'Unlimited'),
- ], string="Allowed Recurrence", default='once')
- recurrence_period = fields.Selection([
- ('months', 'Months'),
- ('years', 'Years'),],
- string="Recurrence Period", default='months'
- )
- recurrence_interval = fields.Integer(
- string="Recurrence Interval",
- default=1,
- )
- requires_visit = fields.Boolean(
- string="Requires Visit?"
- )
- max_limit_type = fields.Selection([
- ('none', 'No Limit'),
- ('fixed', 'Fixed Amount'),
- ('amount_person', 'Amount by Individuals'),
- ('category', 'Amount by Category'),
- ('category_person', 'Amount by Category and Individuals'),
- ('region', 'Amount by Region'),
- ('service', 'Amount by Service'),
- ], string="Max Limit Type"
- )
- needs_beneficiary_manager_approval = fields.Boolean("Needs Beneficiary Manager Approval")
- needs_services_head_approval = fields.Boolean(string="Needs Services Head Approval")
- needs_legal_approval = fields.Boolean(string="Needs Legal Approval")
- needs_project_management_approval = fields.Boolean(string="Needs Project Management Approval")
- allow_non_beneficiary = fields.Boolean(string="Allow Non Beneficiary")
- max_limit_period = fields.Selection([
- ('request', 'Per Request'),
- ('individual', 'Per Individual'),
- ('month', 'Per Month'),
- ('year', 'Per Year'),
- ('recurrence_period', 'For Allowed Recurrence Period'),
- ], string='Maximum Limit Period')
- max_months_limit = fields.Integer(
- string='Maximum Number of Months',
- help='Specify the maximum allowed number of months when the period type is monthly.'
- )
- in_kind = fields.Boolean(string="In Kind")
- payment_method = fields.Selection([
- ('none', 'None'),
- ('payment_order', 'Payment Order'),
- ('invoice', 'Invoice'),
- ], string='Payment Method',default="payment_order")
-
-
-
-class RentLines(models.Model):
- _name = 'rent.lines'
-
- benefit_category_id = fields.Many2one('benefit.category', string='Benefit Category')
- services_settings_id = fields.Many2one('services.settings', string='Services Settings')
- benefit_count = fields.Integer('Benefit Count')
- estimated_rent_branches = fields.Float(string='Estimated Rent Branches')
- estimated_rent_governorate = fields.Float(string='Estimated Rent Governorate')
- discount_rate_shared_housing = fields.Float(string='Discount Rate For Shared housing')
-
- _sql_constraints = [
- (
- 'uniq_category_count',
- 'UNIQUE(benefit_category_id, benefit_count)',
- _("Couldn't create same benefit category and count")
- )
- ]
-
-
-class CategoryAmountLine(models.Model):
- _name = 'category.amount.line'
-
- benefit_category_id = fields.Many2one('benefit.category', string='Benefit Category')
- services_settings_id = fields.Many2one('services.settings', string='Services Settings')
- max_amount = fields.Float(string='Max Amount')
-
-class HomeMaintenanceLines(models.Model):
- _name = 'home.maintenance.lines'
- _rec_name = 'maintenance_name'
-
- services_settings_id = fields.Many2one('services.settings', string='Services Settings')
- maintenance_name = fields.Char(string='Maintenance Name')
-
-class ElectricalDevices(models.Model):
- _name = 'electrical.devices'
- _rec_name = 'device_name'
-
- min_count_member = fields.Integer(string='From')
- max_count_member = fields.Integer(string='To')
- device_name = fields.Char(string="Device Name")
- allowed_quantity = fields.Integer(string='Allowed Quantity')
- account_id = fields.Many2one('account.account',string='Expenses Account',domain="[('user_type_id.id','=',15)]")
- services_settings_id = fields.Many2one('services.settings')
- price_unit = fields.Float()
-
-class HomeFurnishingLines(models.Model):
- _name = 'home.furnishing.lines'
-
- services_settings_id = fields.Many2one('services.settings')
- name = fields.Char(string="Furnishing Name")
- max_furnishing_amount = fields.Float(string='Furnishing Amount')
-
-class BillLines(models.Model):
- _name = 'bill.lines'
-
- benefit_category_id = fields.Many2one('benefit.category', string='Benefit Category')
- min_count_member = fields.Integer(string='From')
- max_count_member = fields.Integer(string='To')
- max_amount_for_bill = fields.Float(string='Max Amount For Bill')
- services_settings_id = fields.Many2one('services.settings', string='Services Settings')
-
-class ServiceLimitByPersonLine(models.Model):
- _name = 'service.limit.person.line'
-
- min_count_member = fields.Integer(string='Minimum Number of Persons')
- max_count_member = fields.Integer(string='Maximum Number of Persons')
- amount = fields.Float(string='Amount')
- services_settings_id = fields.Many2one('services.settings', string='Services Settings')
-
-class TransportationInsurance(models.Model):
- _name = 'transportation.insurance'
-
- services_settings_id = fields.Many2one('services.settings')
- name = fields.Char(string="Insurance Name", required=True)
- limit_amount = fields.Float(required=True)
- account_id = fields.Many2one(
- 'account.account',
- string='Expenses Account',
- domain="[('user_type_id.id', '=', 15)]",
- required=True
- )
diff --git a/odex25_ensan/odex_benefit/models/sms.py b/odex25_ensan/odex_benefit/models/sms.py
deleted file mode 100644
index bb94a5ea3..000000000
--- a/odex25_ensan/odex_benefit/models/sms.py
+++ /dev/null
@@ -1,23 +0,0 @@
-from odoo import models, fields, _
-
-
-class SmsConfiguration(models.Model):
- _name = 'benefit.sms.configuration'
- _inherit = ['mail.thread', 'mail.activity.mixin']
-
- name = fields.Char("name")
- case_text = fields.Text("case Text", tracking=True)
- state = fields.Selection([
- ('draft', 'Draft'),
- ('complete_info', 'Complete Information'),
- ('waiting_approve', 'Waiting Approved'),
- ('approve', 'Approved'),
- ('add_family', 'add Family'),
- ('first_refusal', 'First Refusal'),
- ('refused', 'Refused'),
- ('black_list', 'Black List'),
- ('approve_family', 'Approve Family'),
- ('zkat', 'zkat'),
- ('adha', 'adha'),
- ('loans', 'loans'),
- ])
diff --git a/odex25_ensan/odex_benefit/models/visit.py b/odex25_ensan/odex_benefit/models/visit.py
deleted file mode 100644
index f40cec3a5..000000000
--- a/odex25_ensan/odex_benefit/models/visit.py
+++ /dev/null
@@ -1,403 +0,0 @@
-from odoo import fields, models, api, _
-import math, random
-from odoo.exceptions import UserError, ValidationError
-from datetime import timedelta
-import werkzeug
-
-
-class Visit(models.Model):
- _name = 'visit.location'
- _inherit = ['mail.thread', 'mail.activity.mixin']
- _order = 'create_date desc'
-
- @api.model
- def _default_researcher_team(self):
- researcher_team = self.env['committees.line'].search([('employee_id', 'in', [self.env.user.employee_id.id])],
- limit=1)
- return researcher_team.id
-
- benefit_type = fields.Selection([
- ('benefit', 'Benefit'),
- ('family', 'Family'),
- ], string='Type', default="benefit")
- benefit_id = fields.Many2one(
- 'grant.benefit', string='Family file', domain="[('state', '=', 'second_approve')]")
- benefit_name = fields.Char(related="benefit_id.name")
- benefit_code = fields.Char(related="benefit_id.code")
- sms_phone = fields.Char(string="Contact Phone", related="benefit_id.sms_phone")
- researcher_team = fields.Many2one("committees.line", string="Researcher Team", related="benefit_id.researcher_id")
- researcher_ids = fields.Many2many("hr.employee", string="Researcher", compute="get_researcher_ids", readonly=False)
- visit_date = fields.Datetime(string='Visit Date', tracking=True)
- description = fields.Char(string='Description')
- message = fields.Text(string='Message')
- visit_objective = fields.Selection([
- ('inform_visit', 'Inform Visit'),
- ('objective_visit', 'Objective Visit'),
- ], string='Visit Objective')
- visit_types = fields.Many2one(
- 'visits.types',
- string='Visits Types',
- ondelete='restrict'
- )
- visit_types_creation_method = fields.Selection(related='visit_types.creation_method')
- evaluation = fields.Selection(
- [('1', '1'), ('2', '2'), ('3', '3'), ('4', '4'), ('5', '5'), ('6', '6')],
- string='Evaluation')
- state = fields.Selection([
- ('draft', 'Draft'),
- ('contact', 'Contact'),
- ('schedule_a_visit', 'Schedule a visit'),
- ('pending', 'Pending'),
- ('done', 'Done'),
- ('close', 'Close'),
- ('cancel', 'Cancel'),
- ], string='State', default="draft", tracking=True, group_expand='_expand_states')
- color = fields.Integer('Color Index', default=0)
- family_id = fields.Many2one('benefit.family')
- reason = fields.Text(string='Reason/Justification')
- name = fields.Char(string='Reference', required=True, copy=False, readonly=True, index=True,
- default=lambda self: _('New'))
- otp_code = fields.Char(string="OTP Code", readonly=True, copy=False)
- otp_generated_at = fields.Datetime(string="OTP Generated At", readonly=True, copy=False)
- response_id = fields.Many2one('survey.user_input', string="Survey Responses", copy=False)
- response_count = fields.Integer(compute="_compute_response_count", store=True, string="Responses Count", copy=False)
- survey_url = fields.Char(string="Survey URL")
-
-
- def action_postpone(self):
- """Open wizard to postpone"""
- context = dict(self.env.context or {})
- context['target_state'] = "pending"
- context['active_id'] = self.id
- return {
- 'name': _('Postpone Visit'),
- 'view_mode': 'form',
- 'view_type': 'form',
- 'type': 'ir.actions.act_window',
- 'res_model': 'visit.location.refusal.reason.wizard',
- 'view_id': self.env.ref('odex_benefit.view_visit_location_refusal_reason_wizard_form').id,
- 'target': 'new',
- 'context': context,
- }
-
- def action_reschedule(self):
- for rec in self:
- rec.state = "contact"
-
- def action_create_new_visit(self):
- for rec in self:
- new_visit = self.create({
- 'creation_type': rec.creation_type,
- 'visit_types': rec.visit_types.id,
- 'benefit_id': rec.benefit_id.id,
- 'researcher_ids': [(6, 0, rec.researcher_ids.ids)],
- 'visit_date': fields.Datetime.now(),
- 'state': 'draft',
- })
- return {
- 'type': 'ir.actions.act_window',
- 'res_model': 'visit.location',
- 'view_mode': 'form',
- 'res_id': new_visit.id,
- }
-
- @api.depends('response_id')
- def _compute_response_count(self):
- for rec in self:
- rec.response_count = self.env['survey.user_input'].search_count([('visit_id', '=', rec.id)])
-
- def action_view_responses(self):
- self.ensure_one()
- return {
- 'name': _("Family Evaluation Responses"),
- 'type': 'ir.actions.act_window',
- 'res_model': 'survey.user_input',
- 'view_mode': 'tree,form',
- 'domain': [('visit_id', '=', self.id)],
- 'context': {'create': False},
- }
-
- def _expand_states(self, states, domain, order):
- return [key for key, val in type(self).state.selection]
-
- def unlink(self):
- for order in self:
- if order.state not in ['draft'] or order.visit_types.creation_method == 'automatic':
- raise UserError(_('You cannot delete this record'))
- return super(Visit, self).unlink()
-
- @api.model
- def create(self, vals):
- # If the 'name' field is 'New', generate a new sequence number
- if vals.get('name', _('New')) == _('New'):
- vals['name'] = self.env['ir.sequence'].next_by_code('visit.location.sequence') or _('New')
- return super(Visit, self).create(vals)
-
- def assign_sequence_to_records(self):
- sequence = self.env['ir.sequence']
- sorted_records = self.sorted(lambda r: r.create_date)
-
- for record in sorted_records:
- if not record.name or record.name == _('New'):
- record.name = sequence.next_by_code('visit.location.sequence')
-
- def get_researchers_email(self):
- email_ids = ''
- for rec in self.researcher_ids:
- if email_ids:
- email_ids = email_ids + ',' + str(rec.work_email)
- else:
- email_ids = str(rec.work_email)
- return email_ids
-
- def action_draft(self):
- self.state = 'draft'
-
- def action_contact(self):
- self.state = 'contact'
- if self.benefit_id.contact_type == 'email':
- template = self.env.ref('odex_benefit.schedule_a_visit_email_template', False)
- if not template:
- return
- template.with_context(lang=self.env.user.lang).send_mail(self.id, force_send=True,
- raise_exception=False)
- elif self.benefit_id.contact_type == 'sms':
- self.benefit_id.partner_id.send_sms_notification(self.message, self.benefit_id.sms_phone)
-
- def action_schedule_a_visit(self):
- self.state = 'schedule_a_visit'
-
- def action_cancel(self):
- context = dict(self.env.context or {})
- context['target_state'] = "cancel"
- context['active_id'] = self.id
- return {
- 'name': _('Refuse Reason Wizard'),
- 'view_mode': 'form',
- 'view_type': 'form',
- 'type': 'ir.actions.act_window',
- 'res_model': 'visit.location.refusal.reason.wizard',
- 'view_id': self.env.ref('odex_benefit.view_visit_location_refusal_reason_wizard_form').id,
- 'target': 'new',
- 'context': context,
- }
-
- def action_done(self):
- if self.visit_types.otp_verification:
- otp_validity = self.visit_types.otp_validity_minutes or 5
- expired = (
- not self.otp_code
- or not self.otp_generated_at
- or fields.Datetime.now() > self.otp_generated_at + timedelta(minutes=otp_validity)
- )
-
- if expired:
- self.otp_code = self.generateOTP()
- self.otp_generated_at = fields.Datetime.now()
-
- if self.benefit_id.contact_type == 'email':
- if not self.benefit_id.email:
- raise UserError(
- _("The family profile has no email address. OTP cannot be sent. Please add an email first."))
- template = self.env.ref('odex_benefit.visit_location_otp_email_template', False)
- if not template:
- raise UserError(
- _("The email template 'Visit Location OTP Email' is missing. Please contact your administrator."))
- template.write({'email_to': self.benefit_id.email,
- 'email_cc': self.env.user.company_id.hr_email or self.env.user.company_id.email, })
- email_values = {"email_from": self.env.user.company_id.hr_email or self.env.user.company_id.email,
- 'res_id': None}
- template.with_context({'lang': self.env.user.lang}).send_mail(self.id, force_send=True,
- raise_exception=False, email_values=email_values)
- elif self.benefit_id.contact_type == 'sms':
- if not self.benefit_id.sms_phone:
- raise UserError(
- _("The family profile has no mobile number. Please add a valid phone number before sending OTP."))
- sms_template_id = self.env.ref('odex_benefit.visit_location_otp_sms_template')
- if not sms_template_id:
- raise UserError(
- _("The SMS template 'Visit Location OTP' is missing. Please contact your administrator."))
-
- sms_body = sms_template_id._render_template(sms_template_id.body,self._name,[self.id],post_process=True)[self.id]
- sms_values = {
- 'number': self.benefit_id.sms_phone,
- 'body': sms_body,
- 'partner_id': self.benefit_id.partner_id.id,
- 'state': 'outgoing',
- }
- self.env['sms.sms'].sudo().create(sms_values).send()
-
- # don't delete this code
- # bot = self.env.ref('base.partner_root').id
- # self.with_context(tracking_disable=True)._message_sms_with_template(
- # template=sms_template_id,
- # put_in_queue=False,
- # partner_ids=self.benefit_id.partner_id.ids,
- # author_id=bot
- # )
- # message = _("Your verification code is %s. It is valid for %s minutes.") % (
- # self.otp_code,
- # self.visit_types.otp_validity_minutes or 5
- # )
- # self.benefit_id.user_id.send_sms_to_user(message, self.benefit_id.sms_phone)
-
- context = dict(self.env.context or {})
- context['active_id'] = self.id
- return {
- 'name': _('Verify OTP'),
- 'view_mode': 'form',
- 'view_type': 'form',
- 'type': 'ir.actions.act_window',
- 'res_model': 'visit.location.otp.wizard',
- 'view_id': self.env.ref('odex_benefit.visit_location_otp_wizard_form').id,
- 'target': 'new',
- 'context': context,
- }
- else:
- self.state = 'done'
- self.benefit_id.last_visit_date = self.visit_date
- self.action_send_survey()
-
- def action_skip_otp(self):
- self.ensure_one()
- context = dict(self.env.context or {})
- context['active_id'] = self.id
- return {
- 'name': _('Skip OTP Verification'),
- 'type': 'ir.actions.act_window',
- 'res_model': 'visit.skip.otp.wizard',
- 'view_mode': 'form',
- 'view_type': 'form',
- 'view_id': self.env.ref('odex_benefit.view_visit_skip_otp_wizard_form').id,
- 'target': 'new',
- 'context': context,
- }
-
- def action_send_survey(self):
- self.ensure_one()
- if self.visit_types.survey_id:
- survey = self.visit_types.survey_id
-
- if self.response_id:
- response = self.response_id
- if response.survey_id.id != survey.id or response.state != 'done':
- response.sudo().unlink()
- self.response_id = False
-
- if not self.response_id:
- response = survey.sudo()._create_answer(
- user=self.benefit_id.user_id,
- partner=self.benefit_id.partner_id,
- email=self.benefit_id.email,
- test_entry=False,
- check_attempts=True,
- visit_id=self.id
- )
- self.response_id = response.id
- else:
- response = self.response_id
-
- self.survey_url = '%s%s?%s' % (
- survey.get_base_url(),
- survey.get_start_url(),
- # werkzeug.urls.url_encode({'answer_token': response.access_token})
- werkzeug.urls.url_encode({'answer_token': response and response.access_token or None})
- )
- link_tracker = self.env['link.tracker'].sudo().create({
- 'url': self.survey_url,
- 'title': 'Survey Link',
- 'campaign_id': False,
- 'medium_id': False,
- 'source_id': False,
- })
- self.survey_url = link_tracker.short_url
- if self.benefit_id.contact_type == 'email':
- if not self.benefit_id.email:
- raise UserError(_("The family profile has no email address. Please add an email first."))
- template = self.env.ref('odex_benefit.visit_location_survey_email_template', False)
- if not template:
- raise UserError(_("The email template 'Visit Location Survey Email' is missing."))
- email_values = {"email_from": self.env.user.company_id.hr_email or self.env.user.company_id.email,"res_id": None}
- template.write({'email_to': self.benefit_id.email,
- 'email_cc': self.env.user.company_id.hr_email or self.env.user.company_id.email, })
- template.with_context(
- lang=self.env.user.lang,
- survey_url=self.survey_url
- ).send_mail(self.id, force_send=True, raise_exception=False, email_values=email_values)
- elif self.benefit_id.contact_type == 'sms':
- if not self.benefit_id.sms_phone:
- raise UserError(_("The family profile has no mobile number. Please add a valid phone number."))
- sms_template = self.env.ref('odex_benefit.visit_location_survey_sms_template', False)
- if not sms_template:
- raise UserError(_("The SMS template 'Visit Location Survey' is missing."))
-
- sms_body = sms_template._render_template(sms_template.body, self._name, [self.id], post_process=True)[self.id]
- sms_values = {
- 'number': self.benefit_id.sms_phone,
- 'body': sms_body,
- 'partner_id': self.benefit_id.partner_id.id,
- 'state': 'outgoing',
- }
- self.env['sms.sms'].sudo().create(sms_values).send()
- # self.with_context(tracking_disable=True, survey_url=self.survey_url)._message_sms_with_template(
- # template=sms_template,
- # put_in_queue=False,
- # partner_ids=self.benefit_id.partner_id.ids,
- # author_id=self.env.ref('base.partner_root').id
- # )
-
- # def action_close(self):
- # self.ensure_one()
- # if self.visit_types.survey_id:
- # if not self.response_id:
- # raise UserError(_("You must send the evaluation form before closing the visit."))
- # if self.response_id.state != 'done':
- # raise UserError(_("The visit cannot be closed before the family completes the evaluation form."))
- # self.state = 'close'
-
- @api.depends("researcher_team")
- def get_researcher_ids(self):
- for rec in self:
- rec.researcher_ids = rec.researcher_team.employee_id
-
- def send_visit_date_email(self):
- template = self.env.ref('odex_benefit.visit_date_email', False)
- if not template:
- return
- template.with_context(lang=self.env.user.lang).send_mail(self.id, force_send=True, raise_exception=False)
-
- # function to generate OTP
- def generateOTP(self):
- digits = "0123456789"
- OTP = ""
-
- # length of password can be changed
- # by changing value in range
- for i in range(4):
- OTP += digits[math.floor(random.random() * 10)]
-
- return OTP
-
- def geo_localize(self):
- for visit in self:
- if visit.benefit_id:
- url = "http://maps.google.com/maps/search/?api=1&query=%s,%s" % (
- visit.benefit_id.lat, visit.benefit_id.lon),
- return {
- 'type': 'ir.actions.act_url',
- 'target': 'new',
- 'url': url
- }
-
- def get_url_local(self):
- for visit in self:
- if visit.benefit_id:
- url = "http://maps.google.com/maps/search/?api=1&query=%s,%s" % (
- visit.benefit_id.lat, visit.benefit_id.lon)
- return url
-
-
-class MemberEducationStatus(models.Model):
- _name = 'member.education.status'
-
- name = fields.Char()
diff --git a/odex25_ensan/odex_benefit/models/visit_survey.py b/odex25_ensan/odex_benefit/models/visit_survey.py
deleted file mode 100644
index 8fecaef08..000000000
--- a/odex25_ensan/odex_benefit/models/visit_survey.py
+++ /dev/null
@@ -1,13 +0,0 @@
-from odoo import api, fields, models, exceptions, _
-
-class SurveyUserInput(models.Model):
- _inherit = 'survey.user_input'
-
- visit_id = fields.Many2one('visit.location', string="Visit")
-
-
- def _mark_done(self):
- super(SurveyUserInput, self)._mark_done()
- self.sudo().visit_id.write({
- 'state': 'close'
- })
diff --git a/odex25_ensan/odex_benefit/models/weak_course.py b/odex25_ensan/odex_benefit/models/weak_course.py
deleted file mode 100644
index b77b60360..000000000
--- a/odex25_ensan/odex_benefit/models/weak_course.py
+++ /dev/null
@@ -1,11 +0,0 @@
-from odoo import models, fields
-
-
-class WeakCourse(models.Model):
- _name = 'weak.course'
-
- education_status_id = fields.Many2one('education.status')
- weak_course_id = fields.Many2one('study.material', required=True)
- result_before = fields.Char('Result before remedial class')
- remedial_class_name = fields.Char()
- result_after = fields.Char('Result after remedial class')
diff --git a/odex25_ensan/odex_benefit/reports/__init__.py b/odex25_ensan/odex_benefit/reports/__init__.py
deleted file mode 100644
index 36787abff..000000000
--- a/odex25_ensan/odex_benefit/reports/__init__.py
+++ /dev/null
@@ -1,2 +0,0 @@
-from . import benefit_report
-from . import family_bank_report
\ No newline at end of file
diff --git a/odex25_ensan/odex_benefit/reports/benefit_report.py b/odex25_ensan/odex_benefit/reports/benefit_report.py
deleted file mode 100644
index d3523a483..000000000
--- a/odex25_ensan/odex_benefit/reports/benefit_report.py
+++ /dev/null
@@ -1,71 +0,0 @@
-# -*- coding: utf-8 -*-
-
-import io
-import base64
-import matplotlib.pyplot as plt
-from odoo import api, fields, models, tools, _
-from odoo.exceptions import ValidationError, UserError
-
-from datetime import datetime, timedelta, date
-from odoo.tools import DEFAULT_SERVER_DATE_FORMAT
-import arabic_reshaper
-from bidi.algorithm import get_display
-import io
-import base64
-import matplotlib.pyplot as plt
-
-
-class BenefitREP(models.AbstractModel):
- _name = 'report.odex_benefit.template_generate_benefit_report_pdf'
-
- @api.model
- def _get_report_values(self, docids, data=None):
- benefits = data['benefits']
- needs = data['needs']
- family = data['family']
- rooms = data['rooms']
- length = data['length']
- header = data['header']
- ar_headers = data['ar_headers']
- f_data = []
- benefits = self.env['grant.benefit'].sudo().search([('id', 'in', benefits)])
- benefits_need_ids = self.env['benefits.needs'].sudo().search([('id', 'in', needs)])
- family_need_ids = self.env['benefit.family'].sudo().search([('id', 'in', family)])
- housing_room_ids = self.env['housing.rooms.members'].sudo().search([('id', 'in', rooms)])
- result = benefits if benefits else benefits_need_ids if benefits_need_ids else family_need_ids if family_need_ids else housing_room_ids
- for i in result:
- test = []
- for x in header:
- z = i[x]
- if type(z).__name__ not in ['str', 'int', 'date', 'bool', 'float']:
- z = z.name
- if type(z).__name__ == 'float':
- z = round(z, 2)
- if z == True: # TODO
- z = 'نعم'
- if z == 'false': # TODO
- z = 'لا'
- if z == 'male': # TODO
- z = 'ذكر'
- if z == 'female': # TODO
- z = 'أنثى'
- test.append(z)
- f_data.append(test)
- age_from, age_to = ' / ', ' / '
- if data['age_from'] and data['age_to']:
- age_from = data['age_from']
- age_to = data['age_to']
- name = data['name']
- return {
- 'name': name,
- 'date_from': age_from,
- 'age_to': age_to,
- 'docs': header,
- 'record': data,
- 'data': f_data,
- 'data_len': len(f_data),
- 'header': header,
- 'ar_headers': ar_headers,
- 'benefits': benefits,
- 'length': length,
- }
diff --git a/odex25_ensan/odex_benefit/reports/benefit_template.xml b/odex25_ensan/odex_benefit/reports/benefit_template.xml
deleted file mode 100644
index c3096f907..000000000
--- a/odex25_ensan/odex_benefit/reports/benefit_template.xml
+++ /dev/null
@@ -1,118 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ';
- if (this.o.calendarWeeks){
- this.picker.find('.datepicker-days .datepicker-switch')
- .attr('colspan', function(i, val){
- return parseInt(val) + 1;
- });
- html += ' ';
- this.picker.find('.datepicker-days thead').append(html);
- },
-
- fillMonths: function(){
- var localDate = this._utc_to_local(this.viewDate);
- var html = '',
- i = 0;
- while (i < 12){
- var focused = localDate && localDate.getMonth() === i ? ' focused' : '';
- html += '' + dates[this.o.language].monthsShort[i++]+'';
- }
- this.picker.find('.datepicker-months td').html(html);
- },
-
- setRange: function(range){
- if (!range || !range.length)
- delete this.range;
- else
- this.range = $.map(range, function(d){
- return d.valueOf();
- });
- this.fill();
- },
-
- getClassNames: function(date){
- var cls = [],
- year = this.viewDate.getUTCFullYear(),
- month = this.viewDate.getUTCMonth(),
- today = new Date();
- if (date.getUTCFullYear() < year || (date.getUTCFullYear() === year && date.getUTCMonth() < month)){
- cls.push('old');
- }
- else if (date.getUTCFullYear() > year || (date.getUTCFullYear() === year && date.getUTCMonth() > month)){
- cls.push('new');
- }
- if (this.focusDate && date.valueOf() === this.focusDate.valueOf())
- cls.push('focused');
- // Compare internal UTC date with local today, not UTC today
- if (this.o.todayHighlight &&
- date.getUTCFullYear() === today.getFullYear() &&
- date.getUTCMonth() === today.getMonth() &&
- date.getUTCDate() === today.getDate()){
- cls.push('today');
- }
- if (this.dates.contains(date) !== -1)
- cls.push('active');
- if (!this.dateWithinRange(date)){
- cls.push('disabled');
- }
- if (this.dateIsDisabled(date)){
- cls.push('disabled', 'disabled-date');
- }
- if ($.inArray(date.getUTCDay(), this.o.daysOfWeekHighlighted) !== -1){
- cls.push('highlighted');
- }
-
- if (this.range){
- if (date > this.range[0] && date < this.range[this.range.length-1]){
- cls.push('range');
- }
- if ($.inArray(date.valueOf(), this.range) !== -1){
- cls.push('selected');
- }
- if (date.valueOf() === this.range[0]){
- cls.push('range-start');
- }
- if (date.valueOf() === this.range[this.range.length-1]){
- cls.push('range-end');
- }
- }
- return cls;
- },
-
- _fill_yearsView: function(selector, cssClass, factor, step, currentYear, startYear, endYear, callback){
- var html, view, year, steps, startStep, endStep, thisYear, i, classes, tooltip, before;
-
- html = '';
- view = this.picker.find(selector);
- year = parseInt(currentYear / factor, 10) * factor;
- startStep = parseInt(startYear / step, 10) * step;
- endStep = parseInt(endYear / step, 10) * step;
- steps = $.map(this.dates, function(d){
- return parseInt(d.getUTCFullYear() / step, 10) * step;
- });
-
- view.find('.datepicker-switch').text(year + '-' + (year + step * 9));
-
- thisYear = year - step;
- for (i = -1; i < 11; i += 1) {
- classes = [cssClass];
- tooltip = null;
-
- if (i === -1) {
- classes.push('old');
- } else if (i === 10) {
- classes.push('new');
- }
- if ($.inArray(thisYear, steps) !== -1) {
- classes.push('active');
- }
- if (thisYear < startStep || thisYear > endStep) {
- classes.push('disabled');
- }
- if (thisYear === this.viewDate.getFullYear()) {
- classes.push('focused');
- }
-
- if (callback !== $.noop) {
- before = callback(new Date(thisYear, 0, 1));
- if (before === undefined) {
- before = {};
- } else if (typeof(before) === 'boolean') {
- before = {enabled: before};
- } else if (typeof(before) === 'string') {
- before = {classes: before};
- }
- if (before.enabled === false) {
- classes.push('disabled');
- }
- if (before.classes) {
- classes = classes.concat(before.classes.split(/\s+/));
- }
- if (before.tooltip) {
- tooltip = before.tooltip;
- }
- }
-
- html += '' + thisYear + '';
- thisYear += step;
- }
- view.find('td').html(html);
- },
-
- fill: function(){
- var d = new Date(this.viewDate),
- year = d.getUTCFullYear(),
- month = d.getUTCMonth(),
- startYear = this.o.startDate !== -Infinity ? this.o.startDate.getUTCFullYear() : -Infinity,
- startMonth = this.o.startDate !== -Infinity ? this.o.startDate.getUTCMonth() : -Infinity,
- endYear = this.o.endDate !== Infinity ? this.o.endDate.getUTCFullYear() : Infinity,
- endMonth = this.o.endDate !== Infinity ? this.o.endDate.getUTCMonth() : Infinity,
- todaytxt = dates[this.o.language].today || dates['en'].today || '',
- cleartxt = dates[this.o.language].clear || dates['en'].clear || '',
- titleFormat = dates[this.o.language].titleFormat || dates['en'].titleFormat,
- tooltip,
- before;
- if (isNaN(year) || isNaN(month))
- return;
- this.picker.find('.datepicker-days .datepicker-switch')
- .text(DPGlobal.formatDate(d, titleFormat, this.o.language));
- this.picker.find('tfoot .today')
- .text(todaytxt)
- .toggle(this.o.todayBtn !== false);
- this.picker.find('tfoot .clear')
- .text(cleartxt)
- .toggle(this.o.clearBtn !== false);
- this.picker.find('thead .datepicker-title')
- .text(this.o.title)
- .toggle(this.o.title !== '');
- this.updateNavArrows();
- this.fillMonths();
- var prevMonth = UTCDate(year, month-1, 28),
- day = DPGlobal.getDaysInMonth(prevMonth.getUTCFullYear(), prevMonth.getUTCMonth());
- prevMonth.setUTCDate(day);
- prevMonth.setUTCDate(day - (prevMonth.getUTCDay() - this.o.weekStart + 7)%7);
- var nextMonth = new Date(prevMonth);
- if (prevMonth.getUTCFullYear() < 100){
- nextMonth.setUTCFullYear(prevMonth.getUTCFullYear());
- }
- nextMonth.setUTCDate(nextMonth.getUTCDate() + 42);
- nextMonth = nextMonth.valueOf();
- var html = [];
- var clsName;
- while (prevMonth.valueOf() < nextMonth){
- if (prevMonth.getUTCDay() === this.o.weekStart){
- html.push(' ';
- }
- while (dowCnt < this.o.weekStart + 7){
- html += ''+dates[this.o.language].daysMin[(dowCnt++)%7]+' ';
- }
- html += '');
- if (this.o.calendarWeeks){
- // ISO 8601: First week contains first thursday.
- // ISO also states week starts on Monday, but we can be more abstract here.
- var
- // Start of current week: based on weekstart/current date
- ws = new Date(+prevMonth + (this.o.weekStart - prevMonth.getUTCDay() - 7) % 7 * 864e5),
- // Thursday of this week
- th = new Date(Number(ws) + (7 + 4 - ws.getUTCDay()) % 7 * 864e5),
- // First Thursday of year, year from thursday
- yth = new Date(Number(yth = UTCDate(th.getUTCFullYear(), 0, 1)) + (7 + 4 - yth.getUTCDay())%7*864e5),
- // Calendar week: ms between thursdays, div ms per day, div 7 days
- calWeek = (th - yth) / 864e5 / 7 + 1;
- html.push(' ');
- }
- prevMonth.setUTCDate(prevMonth.getUTCDate()+1);
- }
- this.picker.find('.datepicker-days tbody').empty().append(html.join(''));
-
- var monthsTitle = dates[this.o.language].monthsTitle || dates['en'].monthsTitle || 'Months';
- var months = this.picker.find('.datepicker-months')
- .find('.datepicker-switch')
- .text(this.o.maxViewMode < 2 ? monthsTitle : year)
- .end()
- .find('span').removeClass('active');
-
- $.each(this.dates, function(i, d){
- if (d.getUTCFullYear() === year)
- months.eq(d.getUTCMonth()).addClass('active');
- });
-
- if (year < startYear || year > endYear){
- months.addClass('disabled');
- }
- if (year === startYear){
- months.slice(0, startMonth).addClass('disabled');
- }
- if (year === endYear){
- months.slice(endMonth+1).addClass('disabled');
- }
-
- if (this.o.beforeShowMonth !== $.noop){
- var that = this;
- $.each(months, function(i, month){
- var moDate = new Date(year, i, 1);
- var before = that.o.beforeShowMonth(moDate);
- if (before === undefined)
- before = {};
- else if (typeof(before) === 'boolean')
- before = {enabled: before};
- else if (typeof(before) === 'string')
- before = {classes: before};
- if (before.enabled === false && !$(month).hasClass('disabled'))
- $(month).addClass('disabled');
- if (before.classes)
- $(month).addClass(before.classes);
- if (before.tooltip)
- $(month).prop('title', before.tooltip);
- });
- }
-
- // Generating decade/years picker
- this._fill_yearsView(
- '.datepicker-years',
- 'year',
- 10,
- 1,
- year,
- startYear,
- endYear,
- this.o.beforeShowYear
- );
-
- // Generating century/decades picker
- this._fill_yearsView(
- '.datepicker-decades',
- 'decade',
- 100,
- 10,
- year,
- startYear,
- endYear,
- this.o.beforeShowDecade
- );
-
- // Generating millennium/centuries picker
- this._fill_yearsView(
- '.datepicker-centuries',
- 'century',
- 1000,
- 100,
- year,
- startYear,
- endYear,
- this.o.beforeShowCentury
- );
- },
-
- updateNavArrows: function(){
- if (!this._allow_update)
- return;
-
- var d = new Date(this.viewDate),
- year = d.getUTCFullYear(),
- month = d.getUTCMonth();
- switch (this.viewMode){
- case 0:
- if (this.o.startDate !== -Infinity && year <= this.o.startDate.getUTCFullYear() && month <= this.o.startDate.getUTCMonth()){
- this.picker.find('.prev').css({visibility: 'hidden'});
- }
- else {
- this.picker.find('.prev').css({visibility: 'visible'});
- }
- if (this.o.endDate !== Infinity && year >= this.o.endDate.getUTCFullYear() && month >= this.o.endDate.getUTCMonth()){
- this.picker.find('.next').css({visibility: 'hidden'});
- }
- else {
- this.picker.find('.next').css({visibility: 'visible'});
- }
- break;
- case 1:
- case 2:
- case 3:
- case 4:
- if (this.o.startDate !== -Infinity && year <= this.o.startDate.getUTCFullYear() || this.o.maxViewMode < 2){
- this.picker.find('.prev').css({visibility: 'hidden'});
- }
- else {
- this.picker.find('.prev').css({visibility: 'visible'});
- }
- if (this.o.endDate !== Infinity && year >= this.o.endDate.getUTCFullYear() || this.o.maxViewMode < 2){
- this.picker.find('.next').css({visibility: 'hidden'});
- }
- else {
- this.picker.find('.next').css({visibility: 'visible'});
- }
- break;
- }
- },
-
- click: function(e){
- e.preventDefault();
- e.stopPropagation();
-
- var target, dir, day, year, month, monthChanged, yearChanged;
- target = $(e.target);
-
- // Clicked on the switch
- if (target.hasClass('datepicker-switch')){
- this.showMode(1);
- }
-
- // Clicked on prev or next
- var navArrow = target.closest('.prev, .next');
- if (navArrow.length > 0) {
- dir = DPGlobal.modes[this.viewMode].navStep * (navArrow.hasClass('prev') ? -1 : 1);
- if (this.viewMode === 0){
- this.viewDate = this.moveMonth(this.viewDate, dir);
- this._trigger('changeMonth', this.viewDate);
- } else {
- this.viewDate = this.moveYear(this.viewDate, dir);
- if (this.viewMode === 1){
- this._trigger('changeYear', this.viewDate);
- }
- }
- this.fill();
- }
-
- // Clicked on today button
- if (target.hasClass('today') && !target.hasClass('day')){
- this.showMode(-2);
- this._setDate(UTCToday(), this.o.todayBtn === 'linked' ? null : 'view');
- }
-
- // Clicked on clear button
- if (target.hasClass('clear')){
- this.clearDates();
- }
-
- if (!target.hasClass('disabled')){
- // Clicked on a day
- if (target.hasClass('day')){
- day = parseInt(target.text(), 10) || 1;
- year = this.viewDate.getUTCFullYear();
- month = this.viewDate.getUTCMonth();
-
- // From last month
- if (target.hasClass('old')){
- if (month === 0) {
- month = 11;
- year = year - 1;
- monthChanged = true;
- yearChanged = true;
- } else {
- month = month - 1;
- monthChanged = true;
- }
- }
-
- // From next month
- if (target.hasClass('new')) {
- if (month === 11){
- month = 0;
- year = year + 1;
- monthChanged = true;
- yearChanged = true;
- } else {
- month = month + 1;
- monthChanged = true;
- }
- }
- this._setDate(UTCDate(year, month, day));
- if (yearChanged) {
- this._trigger('changeYear', this.viewDate);
- }
- if (monthChanged) {
- this._trigger('changeMonth', this.viewDate);
- }
- }
-
- // Clicked on a month
- if (target.hasClass('month')) {
- this.viewDate.setUTCDate(1);
- day = 1;
- month = target.parent().find('span').index(target);
- year = this.viewDate.getUTCFullYear();
- this.viewDate.setUTCMonth(month);
- this._trigger('changeMonth', this.viewDate);
- if (this.o.minViewMode === 1){
- this._setDate(UTCDate(year, month, day));
- this.showMode();
- } else {
- this.showMode(-1);
- }
- this.fill();
- }
-
- // Clicked on a year
- if (target.hasClass('year')
- || target.hasClass('decade')
- || target.hasClass('century')) {
- this.viewDate.setUTCDate(1);
-
- day = 1;
- month = 0;
- year = parseInt(target.text(), 10)||0;
- this.viewDate.setUTCFullYear(year);
-
- if (target.hasClass('year')){
- this._trigger('changeYear', this.viewDate);
- if (this.o.minViewMode === 2){
- this._setDate(UTCDate(year, month, day));
- }
- }
- if (target.hasClass('decade')){
- this._trigger('changeDecade', this.viewDate);
- if (this.o.minViewMode === 3){
- this._setDate(UTCDate(year, month, day));
- }
- }
- if (target.hasClass('century')){
- this._trigger('changeCentury', this.viewDate);
- if (this.o.minViewMode === 4){
- this._setDate(UTCDate(year, month, day));
- }
- }
-
- this.showMode(-1);
- this.fill();
- }
- }
-
- if (this.picker.is(':visible') && this._focused_from){
- $(this._focused_from).focus();
- }
- delete this._focused_from;
- },
-
- _toggle_multidate: function(date){
- var ix = this.dates.contains(date);
- if (!date){
- this.dates.clear();
- }
-
- if (ix !== -1){
- if (this.o.multidate === true || this.o.multidate > 1 || this.o.toggleActive){
- this.dates.remove(ix);
- }
- } else if (this.o.multidate === false) {
- this.dates.clear();
- this.dates.push(date);
- }
- else {
- this.dates.push(date);
- }
-
- if (typeof this.o.multidate === 'number')
- while (this.dates.length > this.o.multidate)
- this.dates.remove(0);
- },
-
- _setDate: function(date, which){
- if (!which || which === 'date')
- this._toggle_multidate(date && new Date(date));
- if (!which || which === 'view')
- this.viewDate = date && new Date(date);
-
- this.fill();
- this.setValue();
- if (!which || which !== 'view') {
- this._trigger('changeDate');
- }
- if (this.inputField){
- this.inputField.change();
- }
- if (this.o.autoclose && (!which || which === 'date')){
- this.hide();
- }
- },
-
- moveDay: function(date, dir){
- var newDate = new Date(date);
- newDate.setUTCDate(date.getUTCDate() + dir);
-
- return newDate;
- },
-
- moveWeek: function(date, dir){
- return this.moveDay(date, dir * 7);
- },
-
- moveMonth: function(date, dir){
- if (!isValidDate(date))
- return this.o.defaultViewDate;
- if (!dir)
- return date;
- var new_date = new Date(date.valueOf()),
- day = new_date.getUTCDate(),
- month = new_date.getUTCMonth(),
- mag = Math.abs(dir),
- new_month, test;
- dir = dir > 0 ? 1 : -1;
- if (mag === 1){
- test = dir === -1
- // If going back one month, make sure month is not current month
- // (eg, Mar 31 -> Feb 31 == Feb 28, not Mar 02)
- ? function(){
- return new_date.getUTCMonth() === month;
- }
- // If going forward one month, make sure month is as expected
- // (eg, Jan 31 -> Feb 31 == Feb 28, not Mar 02)
- : function(){
- return new_date.getUTCMonth() !== new_month;
- };
- new_month = month + dir;
- new_date.setUTCMonth(new_month);
- // Dec -> Jan (12) or Jan -> Dec (-1) -- limit expected date to 0-11
- if (new_month < 0 || new_month > 11)
- new_month = (new_month + 12) % 12;
- }
- else {
- // For magnitudes >1, move one month at a time...
- for (var i=0; i < mag; i++)
- // ...which might decrease the day (eg, Jan 31 to Feb 28, etc)...
- new_date = this.moveMonth(new_date, dir);
- // ...then reset the day, keeping it in the new month
- new_month = new_date.getUTCMonth();
- new_date.setUTCDate(day);
- test = function(){
- return new_month !== new_date.getUTCMonth();
- };
- }
- // Common date-resetting loop -- if date is beyond end of month, make it
- // end of month
- while (test()){
- new_date.setUTCDate(--day);
- new_date.setUTCMonth(new_month);
- }
- return new_date;
- },
-
- moveYear: function(date, dir){
- return this.moveMonth(date, dir*12);
- },
-
- moveAvailableDate: function(date, dir, fn){
- do {
- date = this[fn](date, dir);
-
- if (!this.dateWithinRange(date))
- return false;
-
- fn = 'moveDay';
- }
- while (this.dateIsDisabled(date));
-
- return date;
- },
-
- weekOfDateIsDisabled: function(date){
- return $.inArray(date.getUTCDay(), this.o.daysOfWeekDisabled) !== -1;
- },
-
- dateIsDisabled: function(date){
- return (
- this.weekOfDateIsDisabled(date) ||
- $.grep(this.o.datesDisabled, function(d){
- return isUTCEquals(date, d);
- }).length > 0
- );
- },
-
- dateWithinRange: function(date){
- return date >= this.o.startDate && date <= this.o.endDate;
- },
-
- keydown: function(e){
- if (!this.picker.is(':visible')){
- if (e.keyCode === 40 || e.keyCode === 27) { // allow down to re-show picker
- this.show();
- e.stopPropagation();
- }
- return;
- }
- var dateChanged = false,
- dir, newViewDate,
- focusDate = this.focusDate || this.viewDate;
- switch (e.keyCode){
- case 27: // escape
- if (this.focusDate){
- this.focusDate = null;
- this.viewDate = this.dates.get(-1) || this.viewDate;
- this.fill();
- }
- else
- this.hide();
- e.preventDefault();
- e.stopPropagation();
- break;
- case 37: // left
- case 38: // up
- case 39: // right
- case 40: // down
- if (!this.o.keyboardNavigation || this.o.daysOfWeekDisabled.length === 7)
- break;
- dir = e.keyCode === 37 || e.keyCode === 38 ? -1 : 1;
- if (this.viewMode === 0) {
- if (e.ctrlKey){
- newViewDate = this.moveAvailableDate(focusDate, dir, 'moveYear');
-
- if (newViewDate)
- this._trigger('changeYear', this.viewDate);
- }
- else if (e.shiftKey){
- newViewDate = this.moveAvailableDate(focusDate, dir, 'moveMonth');
-
- if (newViewDate)
- this._trigger('changeMonth', this.viewDate);
- }
- else if (e.keyCode === 37 || e.keyCode === 39){
- newViewDate = this.moveAvailableDate(focusDate, dir, 'moveDay');
- }
- else if (!this.weekOfDateIsDisabled(focusDate)){
- newViewDate = this.moveAvailableDate(focusDate, dir, 'moveWeek');
- }
- } else if (this.viewMode === 1) {
- if (e.keyCode === 38 || e.keyCode === 40) {
- dir = dir * 4;
- }
- newViewDate = this.moveAvailableDate(focusDate, dir, 'moveMonth');
- } else if (this.viewMode === 2) {
- if (e.keyCode === 38 || e.keyCode === 40) {
- dir = dir * 4;
- }
- newViewDate = this.moveAvailableDate(focusDate, dir, 'moveYear');
- }
- if (newViewDate){
- this.focusDate = this.viewDate = newViewDate;
- this.setValue();
- this.fill();
- e.preventDefault();
- }
- break;
- case 13: // enter
- if (!this.o.forceParse)
- break;
- focusDate = this.focusDate || this.dates.get(-1) || this.viewDate;
- if (this.o.keyboardNavigation) {
- this._toggle_multidate(focusDate);
- dateChanged = true;
- }
- this.focusDate = null;
- this.viewDate = this.dates.get(-1) || this.viewDate;
- this.setValue();
- this.fill();
- if (this.picker.is(':visible')){
- e.preventDefault();
- e.stopPropagation();
- if (this.o.autoclose)
- this.hide();
- }
- break;
- case 9: // tab
- this.focusDate = null;
- this.viewDate = this.dates.get(-1) || this.viewDate;
- this.fill();
- this.hide();
- break;
- }
- if (dateChanged){
- if (this.dates.length)
- this._trigger('changeDate');
- else
- this._trigger('clearDate');
- if (this.inputField){
- this.inputField.change();
- }
- }
- },
-
- showMode: function(dir){
- if (dir){
- this.viewMode = Math.max(this.o.minViewMode, Math.min(this.o.maxViewMode, this.viewMode + dir));
- }
- this.picker
- .children('div')
- .hide()
- .filter('.datepicker-' + DPGlobal.modes[this.viewMode].clsName)
- .show();
- this.updateNavArrows();
- }
- };
-
- var DateRangePicker = function(element, options){
- $(element).data('datepicker', this);
- this.element = $(element);
- this.inputs = $.map(options.inputs, function(i){
- return i.jquery ? i[0] : i;
- });
- delete options.inputs;
-
- datepickerPlugin.call($(this.inputs), options)
- .on('changeDate', $.proxy(this.dateUpdated, this));
-
- this.pickers = $.map(this.inputs, function(i){
- return $(i).data('datepicker');
- });
- this.updateDates();
- };
- DateRangePicker.prototype = {
- updateDates: function(){
- this.dates = $.map(this.pickers, function(i){
- return i.getUTCDate();
- });
- this.updateRanges();
- },
- updateRanges: function(){
- var range = $.map(this.dates, function(d){
- return d.valueOf();
- });
- $.each(this.pickers, function(i, p){
- p.setRange(range);
- });
- },
- dateUpdated: function(e){
- // `this.updating` is a workaround for preventing infinite recursion
- // between `changeDate` triggering and `setUTCDate` calling. Until
- // there is a better mechanism.
- if (this.updating)
- return;
- this.updating = true;
-
- var dp = $(e.target).data('datepicker');
-
- if (typeof(dp) === "undefined") {
- return;
- }
-
- var new_date = dp.getUTCDate(),
- i = $.inArray(e.target, this.inputs),
- j = i - 1,
- k = i + 1,
- l = this.inputs.length;
- if (i === -1)
- return;
-
- $.each(this.pickers, function(i, p){
- if (!p.getUTCDate())
- p.setUTCDate(new_date);
- });
-
- if (new_date < this.dates[j]){
- // Date being moved earlier/left
- while (j >= 0 && new_date < this.dates[j]){
- this.pickers[j--].setUTCDate(new_date);
- }
- }
- else if (new_date > this.dates[k]){
- // Date being moved later/right
- while (k < l && new_date > this.dates[k]){
- this.pickers[k++].setUTCDate(new_date);
- }
- }
- this.updateDates();
-
- delete this.updating;
- },
- remove: function(){
- $.map(this.pickers, function(p){ p.remove(); });
- delete this.element.data().datepicker;
- }
- };
-
- function opts_from_el(el, prefix){
- // Derive options from element data-attrs
- var data = $(el).data(),
- out = {}, inkey,
- replace = new RegExp('^' + prefix.toLowerCase() + '([A-Z])');
- prefix = new RegExp('^' + prefix.toLowerCase());
- function re_lower(_,a){
- return a.toLowerCase();
- }
- for (var key in data)
- if (prefix.test(key)){
- inkey = key.replace(replace, re_lower);
- out[inkey] = data[key];
- }
- return out;
- }
-
- function opts_from_locale(lang){
- // Derive options from locale plugins
- var out = {};
- // Check if "de-DE" style date is available, if not language should
- // fallback to 2 letter code eg "de"
- if (!dates[lang]){
- lang = lang.split('-')[0];
- if (!dates[lang])
- return;
- }
- var d = dates[lang];
- $.each(locale_opts, function(i,k){
- if (k in d)
- out[k] = d[k];
- });
- return out;
- }
-
- var old = $.fn.datepicker;
- var datepickerPlugin = function(option){
- var args = Array.apply(null, arguments);
- args.shift();
- var internal_return;
- this.each(function(){
- var $this = $(this),
- data = $this.data('datepicker'),
- options = typeof option === 'object' && option;
- if (!data){
- var elopts = opts_from_el(this, 'date'),
- // Preliminary otions
- xopts = $.extend({}, defaults, elopts, options),
- locopts = opts_from_locale(xopts.language),
- // Options priority: js args, data-attrs, locales, defaults
- opts = $.extend({}, defaults, locopts, elopts, options);
- if ($this.hasClass('input-daterange') || opts.inputs){
- $.extend(opts, {
- inputs: opts.inputs || $this.find('input').toArray()
- });
- data = new DateRangePicker(this, opts);
- }
- else {
- data = new Datepicker(this, opts);
- }
- $this.data('datepicker', data);
- }
- if (typeof option === 'string' && typeof data[option] === 'function'){
- internal_return = data[option].apply(data, args);
- }
- });
-
- if (
- internal_return === undefined ||
- internal_return instanceof Datepicker ||
- internal_return instanceof DateRangePicker
- )
- return this;
-
- if (this.length > 1)
- throw new Error('Using only allowed for the collection of a single element (' + option + ' function)');
- else
- return internal_return;
- };
- $.fn.datepicker = datepickerPlugin;
-
- var defaults = $.fn.datepicker.defaults = {
- assumeNearbyYear: false,
- autoclose: false,
- beforeShowDay: $.noop,
- beforeShowMonth: $.noop,
- beforeShowYear: $.noop,
- beforeShowDecade: $.noop,
- beforeShowCentury: $.noop,
- calendarWeeks: false,
- clearBtn: false,
- toggleActive: false,
- daysOfWeekDisabled: [],
- daysOfWeekHighlighted: [],
- datesDisabled: [],
- endDate: Infinity,
- forceParse: true,
- format: 'mm/dd/yyyy',
- keyboardNavigation: true,
- language: 'en',
- minViewMode: 0,
- maxViewMode: 4,
- multidate: false,
- multidateSeparator: ',',
- orientation: "auto",
- rtl: false,
- startDate: -Infinity,
- startView: 0,
- todayBtn: false,
- todayHighlight: false,
- weekStart: 0,
- disableTouchKeyboard: false,
- enableOnReadonly: true,
- showOnFocus: true,
- zIndexOffset: 10,
- container: 'body',
- immediateUpdates: false,
- title: '',
- templates: {
- leftArrow: '«',
- rightArrow: '»'
- }
- };
- var locale_opts = $.fn.datepicker.locale_opts = [
- 'format',
- 'rtl',
- 'weekStart'
- ];
- $.fn.datepicker.Constructor = Datepicker;
- var dates = $.fn.datepicker.dates = {
- en: {
- days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
- daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
- daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
- months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
- monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
- today: "Today",
- clear: "Clear",
- titleFormat: "MM yyyy"
- }
- };
-
- var DPGlobal = {
- modes: [
- {
- clsName: 'days',
- navFnc: 'Month',
- navStep: 1
- },
- {
- clsName: 'months',
- navFnc: 'FullYear',
- navStep: 1
- },
- {
- clsName: 'years',
- navFnc: 'FullYear',
- navStep: 10
- },
- {
- clsName: 'decades',
- navFnc: 'FullDecade',
- navStep: 100
- },
- {
- clsName: 'centuries',
- navFnc: 'FullCentury',
- navStep: 1000
- }],
- isLeapYear: function(year){
- return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0));
- },
- getDaysInMonth: function(year, month){
- return [31, (DPGlobal.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];
- },
- validParts: /dd?|DD?|mm?|MM?|yy(?:yy)?/g,
- nonpunctuation: /[^ -\/:-@\u5e74\u6708\u65e5\[-`{-~\t\n\r]+/g,
- parseFormat: function(format){
- if (typeof format.toValue === 'function' && typeof format.toDisplay === 'function')
- return format;
- // IE treats \0 as a string end in inputs (truncating the value),
- // so it's a bad format delimiter, anyway
- var separators = format.replace(this.validParts, '\0').split('\0'),
- parts = format.match(this.validParts);
- if (!separators || !separators.length || !parts || parts.length === 0){
- throw new Error("Invalid date format.");
- }
- return {separators: separators, parts: parts};
- },
- parseDate: function(date, format, language, assumeNearby){
- if (!date)
- return undefined;
- if (date instanceof Date)
- return date;
- if (typeof format === 'string')
- format = DPGlobal.parseFormat(format);
- if (format.toValue)
- return format.toValue(date, format, language);
- var part_re = /([\-+]\d+)([dmwy])/,
- parts = date.match(/([\-+]\d+)([dmwy])/g),
- fn_map = {
- d: 'moveDay',
- m: 'moveMonth',
- w: 'moveWeek',
- y: 'moveYear'
- },
- dateAliases = {
- yesterday: '-1d',
- today: '+0d',
- tomorrow: '+1d'
- },
- part, dir, i, fn;
- if (/^[\-+]\d+[dmwy]([\s,]+[\-+]\d+[dmwy])*$/.test(date)){
- date = new Date();
- for (i=0; i < parts.length; i++){
- part = part_re.exec(parts[i]);
- dir = parseInt(part[1]);
- fn = fn_map[part[2]];
- date = Datepicker.prototype[fn](date, dir);
- }
- return UTCDate(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate());
- }
-
- if (typeof dateAliases[date] !== 'undefined') {
- date = dateAliases[date];
- parts = date.match(/([\-+]\d+)([dmwy])/g);
-
- if (/^[\-+]\d+[dmwy]([\s,]+[\-+]\d+[dmwy])*$/.test(date)){
- date = new Date();
- for (i=0; i < parts.length; i++){
- part = part_re.exec(parts[i]);
- dir = parseInt(part[1]);
- fn = fn_map[part[2]];
- date = Datepicker.prototype[fn](date, dir);
- }
-
- return UTCDate(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate());
- }
- }
-
- parts = date && date.match(this.nonpunctuation) || [];
- date = new Date();
-
- function applyNearbyYear(year, threshold){
- if (threshold === true)
- threshold = 10;
-
- // if year is 2 digits or less, than the user most likely is trying to get a recent century
- if (year < 100){
- year += 2000;
- // if the new year is more than threshold years in advance, use last century
- if (year > ((new Date()).getFullYear()+threshold)){
- year -= 100;
- }
- }
-
- return year;
- }
-
- var parsed = {},
- setters_order = ['yyyy', 'yy', 'M', 'MM', 'm', 'mm', 'd', 'dd'],
- setters_map = {
- yyyy: function(d,v){
- return d.setUTCFullYear(assumeNearby ? applyNearbyYear(v, assumeNearby) : v);
- },
- yy: function(d,v){
- return d.setUTCFullYear(assumeNearby ? applyNearbyYear(v, assumeNearby) : v);
- },
- m: function(d,v){
- if (isNaN(d))
- return d;
- v -= 1;
- while (v < 0) v += 12;
- v %= 12;
- d.setUTCMonth(v);
- while (d.getUTCMonth() !== v)
- d.setUTCDate(d.getUTCDate()-1);
- return d;
- },
- d: function(d,v){
- return d.setUTCDate(v);
- }
- },
- val, filtered;
- setters_map['M'] = setters_map['MM'] = setters_map['mm'] = setters_map['m'];
- setters_map['dd'] = setters_map['d'];
- date = UTCToday();
- var fparts = format.parts.slice();
- // Remove noop parts
- if (parts.length !== fparts.length){
- fparts = $(fparts).filter(function(i,p){
- return $.inArray(p, setters_order) !== -1;
- }).toArray();
- }
- // Process remainder
- function match_part(){
- var m = this.slice(0, parts[i].length),
- p = parts[i].slice(0, m.length);
- return m.toLowerCase() === p.toLowerCase();
- }
- if (parts.length === fparts.length){
- var cnt;
- for (i=0, cnt = fparts.length; i < cnt; i++){
- val = parseInt(parts[i], 10);
- part = fparts[i];
- if (isNaN(val)){
- switch (part){
- case 'MM':
- filtered = $(dates[language].months).filter(match_part);
- val = $.inArray(filtered[0], dates[language].months) + 1;
- break;
- case 'M':
- filtered = $(dates[language].monthsShort).filter(match_part);
- val = $.inArray(filtered[0], dates[language].monthsShort) + 1;
- break;
- }
- }
- parsed[part] = val;
- }
- var _date, s;
- for (i=0; i < setters_order.length; i++){
- s = setters_order[i];
- if (s in parsed && !isNaN(parsed[s])){
- _date = new Date(date);
- setters_map[s](_date, parsed[s]);
- if (!isNaN(_date))
- date = _date;
- }
- }
- }
- return date;
- },
- formatDate: function(date, format, language){
- if (!date)
- return '';
- if (typeof format === 'string')
- format = DPGlobal.parseFormat(format);
- if (format.toDisplay)
- return format.toDisplay(date, format, language);
- var val = {
- d: date.getUTCDate(),
- D: dates[language].daysShort[date.getUTCDay()],
- DD: dates[language].days[date.getUTCDay()],
- m: date.getUTCMonth() + 1,
- M: dates[language].monthsShort[date.getUTCMonth()],
- MM: dates[language].months[date.getUTCMonth()],
- yy: date.getUTCFullYear().toString().substring(2),
- yyyy: date.getUTCFullYear()
- };
- val.dd = (val.d < 10 ? '0' : '') + val.d;
- val.mm = (val.m < 10 ? '0' : '') + val.m;
- date = [];
- var seps = $.extend([], format.separators);
- for (var i=0, cnt = format.parts.length; i <= cnt; i++){
- if (seps.length)
- date.push(seps.shift());
- date.push(val[format.parts[i]]);
- }
- return date.join('');
- },
- headTemplate: ''+
- ''+ calWeek +' ');
- }
- }
- clsName = this.getClassNames(prevMonth);
- clsName.push('day');
-
- if (this.o.beforeShowDay !== $.noop){
- before = this.o.beforeShowDay(this._utc_to_local(prevMonth));
- if (before === undefined)
- before = {};
- else if (typeof(before) === 'boolean')
- before = {enabled: before};
- else if (typeof(before) === 'string')
- before = {classes: before};
- if (before.enabled === false)
- clsName.push('disabled');
- if (before.classes)
- clsName = clsName.concat(before.classes.split(/\s+/));
- if (before.tooltip)
- tooltip = before.tooltip;
- }
-
- //Check if uniqueSort exists (supported by jquery >=1.12 and >=2.2)
- //Fallback to unique function for older jquery versions
- if ($.isFunction($.uniqueSort)) {
- clsName = $.uniqueSort(clsName);
- } else {
- clsName = $.unique(clsName);
- }
-
- html.push(''+prevMonth.getUTCDate() + ' ');
- tooltip = null;
- if (prevMonth.getUTCDay() === this.o.weekEnd){
- html.push(''+
- ' '+
- ''+
- ' '+
- ' '+
- '',
- contTemplate: '« '+
- ''+
- ' » '+
- ' ',
- footTemplate: ''+
- ''+
- ' '+
- ''+
- ' '+
- ' '+
- ''
- };
- DPGlobal.template = ''+
- ' '+
- DPGlobal.headTemplate+
- ''+
- DPGlobal.footTemplate+
- '
'+
- ''+
- DPGlobal.headTemplate+
- DPGlobal.contTemplate+
- DPGlobal.footTemplate+
- '
'+
- ''+
- DPGlobal.headTemplate+
- DPGlobal.contTemplate+
- DPGlobal.footTemplate+
- '
'+
- ''+
- DPGlobal.headTemplate+
- DPGlobal.contTemplate+
- DPGlobal.footTemplate+
- '
'+
- ''+
- DPGlobal.headTemplate+
- DPGlobal.contTemplate+
- DPGlobal.footTemplate+
- '
'+
- '";
- if (this.o.calendarWeeks) {
- var i = ' ", this.picker.find(".datepicker-days thead").append(e)
- },
- fillMonths: function() {
- for (var t = "", e = 0; 12 > e;) t += '' + f[this.o.language].monthsShort[e++] + "";
- this.picker.find(".datepicker-months td").html(t)
- },
- setRange: function(e) {
- e && e.length ? this.range = t.map(e, function(t) {
- return t.valueOf()
- }) : delete this.range, this.fill()
- },
- getClassNames: function(e) {
- var i = [],
- a = this.viewDate.getUTCFullYear(),
- s = this.viewDate.getUTCMonth(),
- n = new Date;
- return e.getUTCFullYear() < a || e.getUTCFullYear() === a && e.getUTCMonth() < s ? i.push("old") : (e.getUTCFullYear() > a || e.getUTCFullYear() === a && e.getUTCMonth() > s) && i.push("new"), this.focusDate && e.valueOf() === this.focusDate.valueOf() && i.push("focused"), this.o.todayHighlight && e.getUTCFullYear() === n.getFullYear() && e.getUTCMonth() === n.getMonth() && e.getUTCDate() === n.getDate() && i.push("today"), -1 !== this.dates.contains(e) && i.push("active"), (e.valueOf() < this.o.startDate || e.valueOf() > this.o.endDate || -1 !== t.inArray(e.getUTCDay(), this.o.daysOfWeekDisabled)) && i.push("disabled"), this.range && (e > this.range[0] && e < this.range[this.range.length - 1] && i.push("range"), -1 !== t.inArray(e.valueOf(), this.range) && i.push("selected")), i
- },
- fill: function() {
- var a, s = new Date(this.viewDate),
- n = s.getUTCFullYear(),
- r = s.getUTCMonth(),
- h = this.o.startDate !== -1 / 0 ? this.o.startDate.getUTCFullYear() : -1 / 0,
- o = this.o.startDate !== -1 / 0 ? this.o.startDate.getUTCMonth() : -1 / 0,
- d = 1 / 0 !== this.o.endDate ? this.o.endDate.getUTCFullYear() : 1 / 0,
- l = 1 / 0 !== this.o.endDate ? this.o.endDate.getUTCMonth() : 1 / 0,
- c = f[this.o.language].today || f.en.today || "",
- u = f[this.o.language].clear || f.en.clear || "";
- this.picker.find(".datepicker-days thead th.datepicker-switch").text(f[this.o.language].months[r] + " " + n), this.picker.find("tfoot th.today").text(c).toggle(this.o.todayBtn !== !1), this.picker.find("tfoot th.clear").text(u).toggle(this.o.clearBtn !== !1), this.updateNavArrows(), this.fillMonths();
- var p = i(n, r - 1, 28),
- v = g.getDaysInMonth(p.getUTCFullYear(), p.getUTCMonth());
- p.setUTCDate(v), p.setUTCDate(v - (p.getUTCDay() - this.o.weekStart + 7) % 7);
- var D = new Date(p);
- D.setUTCDate(D.getUTCDate() + 42), D = D.valueOf();
- for (var m, y = []; p.valueOf() < D;) {
- if (p.getUTCDay() === this.o.weekStart && (y.push(" ';
- e += i, this.picker.find(".datepicker-days thead tr:first-child").prepend(i)
- }
- for (; t < this.o.weekStart + 7;) e += '' + f[this.o.language].daysMin[t++ % 7] + " ";
- e += ""), this.o.calendarWeeks)) {
- var w = new Date(+p + (this.o.weekStart - p.getUTCDay() - 7) % 7 * 864e5),
- k = new Date(Number(w) + (11 - w.getUTCDay()) % 7 * 864e5),
- _ = new Date(Number(_ = i(k.getUTCFullYear(), 0, 1)) + (11 - _.getUTCDay()) % 7 * 864e5),
- C = (k - _) / 864e5 / 7 + 1;
- y.push(' "), p.setUTCDate(p.getUTCDate() + 1)
- }
- this.picker.find(".datepicker-days tbody").empty().append(y.join(""));
- var b = this.picker.find(".datepicker-months").find("th:eq(1)").text(n).end().find("span").removeClass("active");
- t.each(this.dates, function(t, e) {
- e.getUTCFullYear() === n && b.eq(e.getUTCMonth()).addClass("active")
- }), (h > n || n > d) && b.addClass("disabled"), n === h && b.slice(0, o).addClass("disabled"), n === d && b.slice(l + 1).addClass("disabled"), y = "", n = 10 * parseInt(n / 10, 10);
- var U = this.picker.find(".datepicker-years").find("th:eq(1)").text(n + "-" + (n + 9)).end().find("td");
- n -= 1;
- for (var M, x = t.map(this.dates, function(t) {
- return t.getUTCFullYear()
- }), S = -1; 11 > S; S++) M = ["year"], -1 === S ? M.push("old") : 10 === S && M.push("new"), -1 !== t.inArray(n, x) && M.push("active"), (h > n || n > d) && M.push("disabled"), y += '' + n + "", n += 1;
- U.html(y)
- },
- updateNavArrows: function() {
- if (this._allow_update) {
- var t = new Date(this.viewDate),
- e = t.getUTCFullYear(),
- i = t.getUTCMonth();
- switch (this.viewMode) {
- case 0:
- this.o.startDate !== -1 / 0 && e <= this.o.startDate.getUTCFullYear() && i <= this.o.startDate.getUTCMonth() ? this.picker.find(".prev").css({
- visibility: "hidden"
- }) : this.picker.find(".prev").css({
- visibility: "visible"
- }), 1 / 0 !== this.o.endDate && e >= this.o.endDate.getUTCFullYear() && i >= this.o.endDate.getUTCMonth() ? this.picker.find(".next").css({
- visibility: "hidden"
- }) : this.picker.find(".next").css({
- visibility: "visible"
- });
- break;
- case 1:
- case 2:
- this.o.startDate !== -1 / 0 && e <= this.o.startDate.getUTCFullYear() ? this.picker.find(".prev").css({
- visibility: "hidden"
- }) : this.picker.find(".prev").css({
- visibility: "visible"
- }), 1 / 0 !== this.o.endDate && e >= this.o.endDate.getUTCFullYear() ? this.picker.find(".next").css({
- visibility: "hidden"
- }) : this.picker.find(".next").css({
- visibility: "visible"
- })
- }
- }
- },
- click: function(e) {
- e.preventDefault();
- var a, s, n, r = t(e.target).closest("span, td, th");
- if (1 === r.length) switch (r[0].nodeName.toLowerCase()) {
- case "th":
- switch (r[0].className) {
- case "datepicker-switch":
- this.showMode(1);
- break;
- case "prev":
- case "next":
- var h = g.modes[this.viewMode].navStep * ("prev" === r[0].className ? -1 : 1);
- switch (this.viewMode) {
- case 0:
- this.viewDate = this.moveMonth(this.viewDate, h), this._trigger("changeMonth", this.viewDate);
- break;
- case 1:
- case 2:
- this.viewDate = this.moveYear(this.viewDate, h), 1 === this.viewMode && this._trigger("changeYear", this.viewDate)
- }
- this.fill();
- break;
- case "today":
- var o = new Date;
- o = i(o.getFullYear(), o.getMonth(), o.getDate(), 0, 0, 0), this.showMode(-2);
- var d = "linked" === this.o.todayBtn ? null : "view";
- this._setDate(o, d);
- break;
- case "clear":
- var l;
- this.isInput ? l = this.element : this.component && (l = this.element.find("input")), l && l.val("").change(), this.update(), this._trigger("changeDate"), this.o.autoclose && this.hide()
- }
- break;
- case "span":
- r.is(".disabled") || (this.viewDate.setUTCDate(1), r.is(".month") ? (n = 1, s = r.parent().find("span").index(r), a = this.viewDate.getUTCFullYear(), this.viewDate.setUTCMonth(s), this._trigger("changeMonth", this.viewDate), 1 === this.o.minViewMode && this._setDate(i(a, s, n))) : (n = 1, s = 0, a = parseInt(r.text(), 10) || 0, this.viewDate.setUTCFullYear(a), this._trigger("changeYear", this.viewDate), 2 === this.o.minViewMode && this._setDate(i(a, s, n))), this.showMode(-1), this.fill());
- break;
- case "td":
- r.is(".day") && !r.is(".disabled") && (n = parseInt(r.text(), 10) || 1, a = this.viewDate.getUTCFullYear(), s = this.viewDate.getUTCMonth(), r.is(".old") ? 0 === s ? (s = 11, a -= 1) : s -= 1 : r.is(".new") && (11 === s ? (s = 0, a += 1) : s += 1), this._setDate(i(a, s, n)))
- }
- this.picker.is(":visible") && this._focused_from && t(this._focused_from).focus(), delete this._focused_from
- },
- _toggle_multidate: function(t) {
- var e = this.dates.contains(t);
- if (t ? -1 !== e ? this.dates.remove(e) : this.dates.push(t) : this.dates.clear(), "number" == typeof this.o.multidate)
- for (; this.dates.length > this.o.multidate;) this.dates.remove(0)
- },
- _setDate: function(t, e) {
- e && "date" !== e || this._toggle_multidate(t && new Date(t)), e && "view" !== e || (this.viewDate = t && new Date(t)), this.fill(), this.setValue(), this._trigger("changeDate");
- var i;
- this.isInput ? i = this.element : this.component && (i = this.element.find("input")), i && i.change(), !this.o.autoclose || e && "date" !== e || this.hide()
- },
- moveMonth: function(t, i) {
- if (!t) return e;
- if (!i) return t;
- var a, s, n = new Date(t.valueOf()),
- r = n.getUTCDate(),
- h = n.getUTCMonth(),
- o = Math.abs(i);
- if (i = i > 0 ? 1 : -1, 1 === o) s = -1 === i ? function() {
- return n.getUTCMonth() === h
- } : function() {
- return n.getUTCMonth() !== a
- }, a = h + i, n.setUTCMonth(a), (0 > a || a > 11) && (a = (a + 12) % 12);
- else {
- for (var d = 0; o > d; d++) n = this.moveMonth(n, i);
- a = n.getUTCMonth(), n.setUTCDate(r), s = function() {
- return a !== n.getUTCMonth()
- }
- }
- for (; s();) n.setUTCDate(--r), n.setUTCMonth(a);
- return n
- },
- moveYear: function(t, e) {
- return this.moveMonth(t, 12 * e)
- },
- dateWithinRange: function(t) {
- return t >= this.o.startDate && t <= this.o.endDate
- },
- keydown: function(t) {
- if (this.picker.is(":not(:visible)")) return 27 === t.keyCode && this.show(), void 0;
- var e, i, s, n = !1,
- r = this.focusDate || this.viewDate;
- switch (t.keyCode) {
- case 27:
- this.focusDate ? (this.focusDate = null, this.viewDate = this.dates.get(-1) || this.viewDate, this.fill()) : this.hide(), t.preventDefault();
- break;
- case 37:
- case 39:
- if (!this.o.keyboardNavigation) break;
- e = 37 === t.keyCode ? -1 : 1, t.ctrlKey ? (i = this.moveYear(this.dates.get(-1) || a(), e), s = this.moveYear(r, e), this._trigger("changeYear", this.viewDate)) : t.shiftKey ? (i = this.moveMonth(this.dates.get(-1) || a(), e), s = this.moveMonth(r, e), this._trigger("changeMonth", this.viewDate)) : (i = new Date(this.dates.get(-1) || a()), i.setUTCDate(i.getUTCDate() + e), s = new Date(r), s.setUTCDate(r.getUTCDate() + e)), this.dateWithinRange(i) && (this.focusDate = this.viewDate = s, this.setValue(), this.fill(), t.preventDefault());
- break;
- case 38:
- case 40:
- if (!this.o.keyboardNavigation) break;
- e = 38 === t.keyCode ? -1 : 1, t.ctrlKey ? (i = this.moveYear(this.dates.get(-1) || a(), e), s = this.moveYear(r, e), this._trigger("changeYear", this.viewDate)) : t.shiftKey ? (i = this.moveMonth(this.dates.get(-1) || a(), e), s = this.moveMonth(r, e), this._trigger("changeMonth", this.viewDate)) : (i = new Date(this.dates.get(-1) || a()), i.setUTCDate(i.getUTCDate() + 7 * e), s = new Date(r), s.setUTCDate(r.getUTCDate() + 7 * e)), this.dateWithinRange(i) && (this.focusDate = this.viewDate = s, this.setValue(), this.fill(), t.preventDefault());
- break;
- case 32:
- break;
- case 13:
- r = this.focusDate || this.dates.get(-1) || this.viewDate, this._toggle_multidate(r), n = !0, this.focusDate = null, this.viewDate = this.dates.get(-1) || this.viewDate, this.setValue(), this.fill(), this.picker.is(":visible") && (t.preventDefault(), this.o.autoclose && this.hide());
- break;
- case 9:
- this.focusDate = null, this.viewDate = this.dates.get(-1) || this.viewDate, this.fill(), this.hide()
- }
- if (n) {
- this.dates.length ? this._trigger("changeDate") : this._trigger("clearDate");
- var h;
- this.isInput ? h = this.element : this.component && (h = this.element.find("input")), h && h.change()
- }
- },
- showMode: function(t) {
- t && (this.viewMode = Math.max(this.o.minViewMode, Math.min(2, this.viewMode + t))), this.picker.find(">div").hide().filter(".datepicker-" + g.modes[this.viewMode].clsName).css("display", "block"), this.updateNavArrows()
- }
- };
- var l = function(e, i) {
- this.element = t(e), this.inputs = t.map(i.inputs, function(t) {
- return t.jquery ? t[0] : t
- }), delete i.inputs, t(this.inputs).datepicker(i).bind("changeDate", t.proxy(this.dateUpdated, this)), this.pickers = t.map(this.inputs, function(e) {
- return t(e).data("datepicker")
- }), this.updateDates()
- };
- l.prototype = {
- updateDates: function() {
- this.dates = t.map(this.pickers, function(t) {
- return t.getUTCDate()
- }), this.updateRanges()
- },
- updateRanges: function() {
- var e = t.map(this.dates, function(t) {
- return t.valueOf()
- });
- t.each(this.pickers, function(t, i) {
- i.setRange(e)
- })
- },
- dateUpdated: function(e) {
- if (!this.updating) {
- this.updating = !0;
- var i = t(e.target).data("datepicker"),
- a = i.getUTCDate(),
- s = t.inArray(e.target, this.inputs),
- n = this.inputs.length;
- if (-1 !== s) {
- if (t.each(this.pickers, function(t, e) {
- e.getUTCDate() || e.setUTCDate(a)
- }), a < this.dates[s])
- for (; s >= 0 && a < this.dates[s];) this.pickers[s--].setUTCDate(a);
- else if (a > this.dates[s])
- for (; n > s && a > this.dates[s];) this.pickers[s++].setUTCDate(a);
- this.updateDates(), delete this.updating
- }
- }
- },
- remove: function() {
- t.map(this.pickers, function(t) {
- t.remove()
- }), delete this.element.data().datepicker
- }
- };
- var c = t.fn.datepicker;
- t.fn.datepicker = function(i) {
- var a = Array.apply(null, arguments);
- a.shift();
- var s;
- return this.each(function() {
- var h = t(this),
- o = h.data("datepicker"),
- c = "object" == typeof i && i;
- if (!o) {
- var p = n(this, "date"),
- f = t.extend({}, u, p, c),
- g = r(f.language),
- v = t.extend({}, u, g, p, c);
- if (h.is(".input-daterange") || v.inputs) {
- var D = {
- inputs: v.inputs || h.find("input").toArray()
- };
- h.data("datepicker", o = new l(this, t.extend(v, D)))
- } else h.data("datepicker", o = new d(this, v))
- }
- return "string" == typeof i && "function" == typeof o[i] && (s = o[i].apply(o, a), s !== e) ? !1 : void 0
- }), s !== e ? s : this
- };
- var u = t.fn.datepicker.defaults = {
- autoclose: !1,
- beforeShowDay: t.noop,
- calendarWeeks: !1,
- clearBtn: !1,
- daysOfWeekDisabled: [],
- endDate: 1 / 0,
- forceParse: !0,
- format: "mm/dd/yyyy",
- keyboardNavigation: !0,
- language: "en",
- minViewMode: 0,
- multidate: !1,
- multidateSeparator: ",",
- orientation: "auto",
- rtl: !1,
- startDate: -1 / 0,
- startView: 0,
- todayBtn: !1,
- todayHighlight: !1,
- weekStart: 0
- },
- p = t.fn.datepicker.locale_opts = ["format", "rtl", "weekStart"];
- t.fn.datepicker.Constructor = d;
- var f = t.fn.datepicker.dates = {
- en: {
- days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"],
- daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
- daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"],
- months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
- monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
- today: "Today",
- clear: "Clear"
- }
- },
- g = {
- modes: [{
- clsName: "days",
- navFnc: "Month",
- navStep: 1
- }, {
- clsName: "months",
- navFnc: "FullYear",
- navStep: 1
- }, {
- clsName: "years",
- navFnc: "FullYear",
- navStep: 10
- }],
- isLeapYear: function(t) {
- return t % 4 === 0 && t % 100 !== 0 || t % 400 === 0
- },
- getDaysInMonth: function(t, e) {
- return [31, g.isLeapYear(t) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][e]
- },
- validParts: /dd?|DD?|mm?|MM?|yy(?:yy)?/g,
- nonpunctuation: /[^ -\/:-@\[\u3400-\u9fff-`{-~\t\n\r]+/g,
- parseFormat: function(t) {
- var e = t.replace(this.validParts, "\x00").split("\x00"),
- i = t.match(this.validParts);
- if (!e || !e.length || !i || 0 === i.length) throw new Error("Invalid date format.");
- return {
- separators: e,
- parts: i
- }
- },
- parseDate: function(a, s, n) {
- function r() {
- var t = this.slice(0, u[l].length),
- e = u[l].slice(0, t.length);
- return t === e
- }
- if (!a) return e;
- if (a instanceof Date) return a;
- "string" == typeof s && (s = g.parseFormat(s));
- var h, o, l, c = /([\-+]\d+)([dmwy])/,
- u = a.match(/([\-+]\d+)([dmwy])/g);
- if (/^[\-+]\d+[dmwy]([\s,]+[\-+]\d+[dmwy])*$/.test(a)) {
- for (a = new Date, l = 0; l < u.length; l++) switch (h = c.exec(u[l]), o = parseInt(h[1]), h[2]) {
- case "d":
- a.setUTCDate(a.getUTCDate() + o);
- break;
- case "m":
- a = d.prototype.moveMonth.call(d.prototype, a, o);
- break;
- case "w":
- a.setUTCDate(a.getUTCDate() + 7 * o);
- break;
- case "y":
- a = d.prototype.moveYear.call(d.prototype, a, o)
- }
- return i(a.getUTCFullYear(), a.getUTCMonth(), a.getUTCDate(), 0, 0, 0)
- }
- u = a && a.match(this.nonpunctuation) || [], a = new Date;
- var p, v, D = {},
- m = ["yyyy", "yy", "M", "MM", "m", "mm", "d", "dd"],
- y = {
- yyyy: function(t, e) {
- return t.setUTCFullYear(e)
- },
- yy: function(t, e) {
- return t.setUTCFullYear(2e3 + e)
- },
- m: function(t, e) {
- if (isNaN(t)) return t;
- for (e -= 1; 0 > e;) e += 12;
- for (e %= 12, t.setUTCMonth(e); t.getUTCMonth() !== e;) t.setUTCDate(t.getUTCDate() - 1);
- return t
- },
- d: function(t, e) {
- return t.setUTCDate(e)
- }
- };
- y.M = y.MM = y.mm = y.m, y.dd = y.d, a = i(a.getFullYear(), a.getMonth(), a.getDate(), 0, 0, 0);
- var w = s.parts.slice();
- if (u.length !== w.length && (w = t(w).filter(function(e, i) {
- return -1 !== t.inArray(i, m)
- }).toArray()), u.length === w.length) {
- var k;
- for (l = 0, k = w.length; k > l; l++) {
- if (p = parseInt(u[l], 10), h = w[l], isNaN(p)) switch (h) {
- case "MM":
- v = t(f[n].months).filter(r), p = t.inArray(v[0], f[n].months) + 1;
- break;
- case "M":
- v = t(f[n].monthsShort).filter(r), p = t.inArray(v[0], f[n].monthsShort) + 1
- }
- D[h] = p
- }
- var _, C;
- for (l = 0; l < m.length; l++) C = m[l], C in D && !isNaN(D[C]) && (_ = new Date(a), y[C](_, D[C]), isNaN(_) || (a = _))
- }
- return a
- },
- formatDate: function(e, i, a) {
- if (!e) return "";
- "string" == typeof i && (i = g.parseFormat(i));
- var s = {
- d: e.getUTCDate(),
- D: f[a].daysShort[e.getUTCDay()],
- DD: f[a].days[e.getUTCDay()],
- m: e.getUTCMonth() + 1,
- M: f[a].monthsShort[e.getUTCMonth()],
- MM: f[a].months[e.getUTCMonth()],
- yy: e.getUTCFullYear().toString().substring(2),
- yyyy: e.getUTCFullYear()
- };
- s.dd = (s.d < 10 ? "0" : "") + s.d, s.mm = (s.m < 10 ? "0" : "") + s.m, e = [];
- for (var n = t.extend([], i.separators), r = 0, h = i.parts.length; h >= r; r++) n.length && e.push(n.shift()), e.push(s[i.parts[r]]);
- return e.join("")
- },
- headTemplate: '' + C + " ")
- }
- if (m = this.getClassNames(p), m.push("day"), this.o.beforeShowDay !== t.noop) {
- var T = this.o.beforeShowDay(this._utc_to_local(p));
- T === e ? T = {} : "boolean" == typeof T ? T = {
- enabled: T
- } : "string" == typeof T && (T = {
- classes: T
- }), T.enabled === !1 && m.push("disabled"), T.classes && (m = m.concat(T.classes.split(/\s+/))), T.tooltip && (a = T.tooltip)
- }
- m = t.unique(m), y.push('" + p.getUTCDate() + " "), p.getUTCDay() === this.o.weekEnd && y.push(" ',
- contTemplate: '« » ',
- footTemplate: ' '
- };
- g.template = '' + g.headTemplate + "" + g.footTemplate + '
' + g.headTemplate + g.contTemplate + g.footTemplate + '
' + g.headTemplate + g.contTemplate + g.footTemplate + "
$.calendars, to access the functionality.year specified above).
- @param {number} [day] The day for the date (if numeric year specified above).
- @param {BaseCalendar|string} [calendar='gregorian'] The underlying calendar or the name of the calendar.
- @param {string} [language=''] The language to use for localisation (default English).
- @return {CDate} The new date.
- @throws Error if an invalid date.
- @example $.calendars.newDate()
-$.calendars.newDate(otherDate)
-$.calendars.newDate(2001, 1, 1)
-$.calendars.newDate(1379, 10, 12, 'persian') */
- newDate: function(year, month, day, calendar, language) {
- calendar = ((typeof year !== 'undefined' && year !== null) && year.year ? year.calendar() :
- (typeof calendar === 'string' ? this.instance(calendar, language) : calendar)) || this.instance();
- return calendar.newDate(year, month, day);
- },
-
- /** A simple digit substitution function for localising numbers via the
- {@linkcode GregorianCalendar.regionalOptions|Calendar digits} option.
- @memberof Calendars
- @param {string[]} digits The substitute digits, for 0 through 9.
- @return {CalendarsDigits} The substitution function.
- @example digits: $.calendars.substituteDigits(['۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹']) */
- substituteDigits: function(digits) {
- return function(value) {
- return (value + '').replace(/[0-9]/g, function(digit) {
- return digits[digit];
- });
- };
- },
-
- /** Digit substitution function for localising Chinese style numbers via the
- {@linkcode GregorianCalendar.regionalOptions|Calendar digits} option.
- @memberof Calendars
- @param {string[]} digits The substitute digits, for 0 through 9.
- @param {string[]} powers The characters denoting powers of 10, i.e. 1, 10, 100, 1000.
- @return {CalendarsDigits} The substitution function.
- @example digits: $.calendars.substituteChineseDigits(
- ['〇', '一', '二', '三', '四', '五', '六', '七', '八', '九'], ['', '十', '百', '千']) */
- substituteChineseDigits: function(digits, powers) {
- return function(value) {
- var localNumber = '';
- var power = 0;
- while (value > 0) {
- var units = value % 10;
- localNumber = (units === 0 ? '' : digits[units] + powers[power]) + localNumber;
- power++;
- value = Math.floor(value / 10);
- }
- if (localNumber.indexOf(digits[1] + powers[1]) === 0) {
- localNumber = localNumber.substr(1);
- }
- return localNumber || digits[0];
- };
- }
- });
-
- /** Generic date, based on a particular calendar.
- @class CDate
- @param {BaseCalendar} calendar The underlying calendar implementation.
- @param {number} year The year for this date.
- @param {number} month The month for this date.
- @param {number} day The day for this date.
- @return {CDate} The date object.
- @throws Error if an invalid date. */
- function CDate(calendar, year, month, day) {
- this._calendar = calendar;
- this._year = year;
- this._month = month;
- this._day = day;
- if (this._calendar._validateLevel === 0 &&
- !this._calendar.isValid(this._year, this._month, this._day)) {
- throw ($.calendars.local.invalidDate || $.calendars.regionalOptions[''].invalidDate).
- replace(/\{0\}/, this._calendar.local.name);
- }
- }
-
- /** Pad a numeric value with leading zeroes.
- @private
- @param {number} value The number to format.
- @param {number} length The minimum length.
- @return {string} The formatted number. */
- function pad(value, length) {
- value = '' + value;
- return '000000'.substring(0, length - value.length) + value;
- }
-
- $.extend(CDate.prototype, {
-
- /** Create a new date.
- @memberof CDate
- @param {CDate|number} [year] The date to copy or the year for the date (default to this date).
- @param {number} [month] The month for the date (if numeric year specified above).
- @param {number} [day] The day for the date (if numeric year specified above).
- @return {CDate} The new date.
- @throws Error if an invalid date.
- @example date.newDate()
-date.newDate(otherDate)
-date.newDate(2001, 1, 1) */
- newDate: function(year, month, day) {
- return this._calendar.newDate((typeof year === 'undefined' || year === null ? this : year), month, day);
- },
-
- /** Set or retrieve the year for this date.
- @memberof CDate
- @param {number} [year] The year for the date.
- @return {number|CDate} The date's year (if no parameter) or the updated date.
- @throws Error if an invalid date.
- @example date.year(2001)
-var year = date.year() */
- year: function(year) {
- return (arguments.length === 0 ? this._year : this.set(year, 'y'));
- },
-
- /** Set or retrieve the month for this date.
- @memberof CDate
- @param {number} [month] The month for the date.
- @return {number|CDate} The date's month (if no parameter) or the updated date.
- @throws Error if an invalid date.
- @example date.month(1)
-var month = date.month() */
- month: function(month) {
- return (arguments.length === 0 ? this._month : this.set(month, 'm'));
- },
-
- /** Set or retrieve the day for this date.
- @memberof CDate
- @param {number} [day] The day for the date.
- @return {number|CData} The date's day (if no parameter) or the updated date.
- @throws Error if an invalid date.
- @example date.day(1)
-var day = date.day() */
- day: function(day) {
- return (arguments.length === 0 ? this._day : this.set(day, 'd'));
- },
-
- /** Set new values for this date.
- @memberof CDate
- @param {number} year The year for the date.
- @param {number} month The month for the date.
- @param {number} day The day for the date.
- @return {CDate} The updated date.
- @throws Error if an invalid date.
- @example date.date(2001, 1, 1) */
- date: function(year, month, day) {
- if (!this._calendar.isValid(year, month, day)) {
- throw ($.calendars.local.invalidDate || $.calendars.regionalOptions[''].invalidDate).
- replace(/\{0\}/, this._calendar.local.name);
- }
- this._year = year;
- this._month = month;
- this._day = day;
- return this;
- },
-
- /** Determine whether this date is in a leap year.
- @memberof CDate
- @return {boolean} true if this is a leap year, false if not.
- @example if (date.leapYear()) ...*/
- leapYear: function() {
- return this._calendar.leapYear(this);
- },
-
- /** Retrieve the epoch designator for this date, e.g. BCE or CE.
- @memberof CDate
- @return {string} The current epoch.
- @example var epoch = date.epoch() */
- epoch: function() {
- return this._calendar.epoch(this);
- },
-
- /** Format the year, if not a simple sequential number.
- @memberof CDate
- @return {string} The formatted year.
- @example var year = date.formatYear() */
- formatYear: function() {
- return this._calendar.formatYear(this);
- },
-
- /** Retrieve the month of the year for this date,
- i.e. the month's position within a numbered year.
- @memberof CDate
- @return {number} The month of the year: minMonth to months per year.
- @example var month = date.monthOfYear() */
- monthOfYear: function() {
- return this._calendar.monthOfYear(this);
- },
-
- /** Retrieve the week of the year for this date.
- @memberof CDate
- @return {number} The week of the year: 1 to weeks per year.
- @example var week = date.weekOfYear() */
- weekOfYear: function() {
- return this._calendar.weekOfYear(this);
- },
-
- /** Retrieve the number of days in the year for this date.
- @memberof CDate
- @return {number} The number of days in this year.
- @example var days = date.daysInYear() */
- daysInYear: function() {
- return this._calendar.daysInYear(this);
- },
-
- /** Retrieve the day of the year for this date.
- @memberof CDate
- @return {number} The day of the year: 1 to days per year.
- @example var doy = date.dayOfYear() */
- dayOfYear: function() {
- return this._calendar.dayOfYear(this);
- },
-
- /** Retrieve the number of days in the month for this date.
- @memberof CDate
- @return {number} The number of days.
- @example var days = date.daysInMonth() */
- daysInMonth: function() {
- return this._calendar.daysInMonth(this);
- },
-
- /** Retrieve the day of the week for this date.
- @memberof CDate
- @return {number} The day of the week: 0 to number of days - 1.
- @example var dow = date.dayOfWeek() */
- dayOfWeek: function() {
- return this._calendar.dayOfWeek(this);
- },
-
- /** Determine whether this date is a week day.
- @memberof CDate
- @return {boolean} true if a week day, false if not.
- @example if (date.weekDay()) ... */
- weekDay: function() {
- return this._calendar.weekDay(this);
- },
-
- /** Retrieve additional information about this date.
- @memberof CDate
- @return {object} Additional information - contents depends on calendar.
- @example var info = date.extraInfo() */
- extraInfo: function() {
- return this._calendar.extraInfo(this);
- },
-
- /** Add period(s) to a date.
- @memberof CDate
- @param {number} offset The number of periods to adjust by.
- @param {string} period One of 'y' for years, 'm' for months, 'w' for weeks, 'd' for days.
- @return {CDate} The updated date.
- @example date.add(10, 'd') */
- add: function(offset, period) {
- return this._calendar.add(this, offset, period);
- },
-
- /** Set a portion of the date.
- @memberof CDate
- @param {number} value The new value for the period.
- @param {string} period One of 'y' for year, 'm' for month, 'd' for day.
- @return {CDate} The updated date.
- @throws Error if not a valid date.
- @example date.set(10, 'd') */
- set: function(value, period) {
- return this._calendar.set(this, value, period);
- },
-
- /** Compare this date to another date.
- @memberof CDate
- @param {CDate} date The other date.
- @return {number} -1 if this date is before the other date,
- 0 if they are equal, or +1 if this date is after the other date.
- @example if (date1.compareTo(date2) < 0) ... */
- compareTo: function(date) {
- if (this._calendar.name !== date._calendar.name) {
- throw ($.calendars.local.differentCalendars || $.calendars.regionalOptions[''].differentCalendars).
- replace(/\{0\}/, this._calendar.local.name).replace(/\{1\}/, date._calendar.local.name);
- }
- var c = (this._year !== date._year ? this._year - date._year :
- this._month !== date._month ? this.monthOfYear() - date.monthOfYear() :
- this._day - date._day);
- return (c === 0 ? 0 : (c < 0 ? -1 : +1));
- },
-
- /** Retrieve the calendar backing this date.
- @memberof CDate
- @return {BaseCalendar} The calendar implementation.
- @example var cal = date.calendar() */
- calendar: function() {
- return this._calendar;
- },
-
- /** Retrieve the Julian date equivalent for this date,
- i.e. days since January 1, 4713 BCE Greenwich noon.
- @memberof CDate
- @return {number} The equivalent Julian date.
- @example var jd = date.toJD() */
- toJD: function() {
- return this._calendar.toJD(this);
- },
-
- /** Create a new date from a Julian date.
- @memberof CDate
- @param {number} jd The Julian date to convert.
- @return {CDate} The equivalent date.
- @example var date2 = date1.fromJD(jd) */
- fromJD: function(jd) {
- return this._calendar.fromJD(jd);
- },
-
- /** Convert this date to a standard (Gregorian) JavaScript Date.
- @memberof CDate
- @return {Date} The equivalent JavaScript date.
- @example var jsd = date.toJSDate() */
- toJSDate: function() {
- return this._calendar.toJSDate(this);
- },
-
- /** Create a new date from a standard (Gregorian) JavaScript Date.
- @memberof CDate
- @param {Date} jsd The JavaScript date to convert.
- @return {CDate} The equivalent date.
- @example var date2 = date1.fromJSDate(jsd) */
- fromJSDate: function(jsd) {
- return this._calendar.fromJSDate(jsd);
- },
-
- /** Convert to a string for display.
- @memberof CDate
- @return {string} This date as a string. */
- toString: function() {
- return (this.year() < 0 ? '-' : '') + pad(Math.abs(this.year()), 4) +
- '-' + pad(this.month(), 2) + '-' + pad(this.day(), 2);
- }
- });
-
- /** Basic functionality for all calendars.
- Other calendars should extend this:
- OtherCalendar.prototype = new BaseCalendar();
- @class BaseCalendar */
- function BaseCalendar() {
- this.shortYearCutoff = '+10';
- }
-
- $.extend(BaseCalendar.prototype, {
- _validateLevel: 0, // "Stack" to turn validation on/off
-
- /** Create a new date within this calendar - today if no parameters given.
- @memberof BaseCalendar
- @param {CDate|number} year The date to duplicate or the year for the date.
- @param {number} [month] The month for the date (if numeric year specified above).
- @param {number} [day] The day for the date (if numeric year specified above).
- @return {CDate} The new date.
- @throws Error if not a valid date or a different calendar is used.
- @example var date = calendar.newDate(2014, 1, 26)
-var date2 = calendar.newDate(date1)
-var today = calendar.newDate() */
- newDate: function(year, month, day) {
- if (typeof year === 'undefined' || year === null) {
- return this.today();
- }
- if (year.year) {
- this._validate(year, month, day,
- $.calendars.local.invalidDate || $.calendars.regionalOptions[''].invalidDate);
- day = year.day();
- month = year.month();
- year = year.year();
- }
- return new CDate(this, year, month, day);
- },
-
- /** Create a new date for today.
- @memberof BaseCalendar
- @return {CDate} Today's date.
- @example var today = calendar.today() */
- today: function() {
- return this.fromJSDate(new Date());
- },
-
- /** Retrieve the epoch designator for this date.
- @memberof BaseCalendar
- @param {CDate|number} year The date to examine or the year to examine.
- @return {string} The current epoch.
- @throws Error if an invalid year or a different calendar is used.
- @example var epoch = calendar.epoch(date)
-var epoch = calendar.epoch(2014) */
- epoch: function(year) {
- var date = this._validate(year, this.minMonth, this.minDay,
- $.calendars.local.invalidYear || $.calendars.regionalOptions[''].invalidYear);
- return (date.year() < 0 ? this.local.epochs[0] : this.local.epochs[1]);
- },
-
- /** Format the year, if not a simple sequential number
- @memberof BaseCalendar
- @param {CDate|number} year The date to format or the year to format.
- @return {string} The formatted year.
- @throws Error if an invalid year or a different calendar is used.
- @example var year = calendar.formatYear(date)
-var year = calendar.formatYear(2014) */
- formatYear: function(year) {
- var date = this._validate(year, this.minMonth, this.minDay,
- $.calendars.local.invalidYear || $.calendars.regionalOptions[''].invalidYear);
- return (date.year() < 0 ? '-' : '') + pad(Math.abs(date.year()), 4);
- },
-
- /** Retrieve the number of months in a year.
- @memberof BaseCalendar
- @param {CDate|number} year The date to examine or the year to examine.
- @return {number} The number of months.
- @throws Error if an invalid year or a different calendar is used.
- @example var months = calendar.monthsInYear(date)
-var months = calendar.monthsInYear(2014) */
- monthsInYear: function(year) {
- this._validate(year, this.minMonth, this.minDay,
- $.calendars.local.invalidYear || $.calendars.regionalOptions[''].invalidYear);
- return 12;
- },
-
- /** Calculate the month's ordinal position within the year -
- for those calendars that don't start at month 1!
- @memberof BaseCalendar
- @param {CDate|number} year The date to examine or the year to examine.
- @param {number} [month] The month to examine (if numeric year specified above).
- @return {number} The ordinal position, starting from minMonth.
- @throws Error if an invalid year/month or a different calendar is used.
- @example var pos = calendar.monthOfYear(date)
-var pos = calendar.monthOfYear(2014, 7) */
- monthOfYear: function(year, month) {
- var date = this._validate(year, month, this.minDay,
- $.calendars.local.invalidMonth || $.calendars.regionalOptions[''].invalidMonth);
- return (date.month() + this.monthsInYear(date) - this.firstMonth) %
- this.monthsInYear(date) + this.minMonth;
- },
-
- /** Calculate actual month from ordinal position, starting from minMonth.
- @memberof BaseCalendar
- @param {number} year The year to examine.
- @param {number} ord The month's ordinal position.
- @return {number} The month's number.
- @throws Error if an invalid year/month.
- @example var month = calendar.fromMonthOfYear(2014, 7) */
- fromMonthOfYear: function(year, ord) {
- var m = (ord + this.firstMonth - 2 * this.minMonth) %
- this.monthsInYear(year) + this.minMonth;
- this._validate(year, m, this.minDay,
- $.calendars.local.invalidMonth || $.calendars.regionalOptions[''].invalidMonth);
- return m;
- },
-
- /** Retrieve the number of days in a year.
- @memberof BaseCalendar
- @param {CDate|number} year The date to examine or the year to examine.
- @return {number} The number of days.
- @throws Error if an invalid year or a different calendar is used.
- @example var days = calendar.daysInYear(date)
-var days = calendar.daysInYear(2014) */
- daysInYear: function(year) {
- var date = this._validate(year, this.minMonth, this.minDay,
- $.calendars.local.invalidYear || $.calendars.regionalOptions[''].invalidYear);
- return (this.leapYear(date) ? 366 : 365);
- },
-
- /** Retrieve the day of the year for a date.
- @memberof BaseCalendar
- @param {CDate|number} year The date to convert or the year to convert.
- @param {number} [month] The month to convert (if numeric year specified above).
- @param {number} [day] The day to convert (if numeric year specified above).
- @return {number} The day of the year: 1 to days per year.
- @throws Error if an invalid date or a different calendar is used.
- @example var doy = calendar.dayOfYear(date)
-var doy = calendar.dayOfYear(2014, 7, 1) */
- dayOfYear: function(year, month, day) {
- var date = this._validate(year, month, day,
- $.calendars.local.invalidDate || $.calendars.regionalOptions[''].invalidDate);
- return date.toJD() - this.newDate(date.year(),
- this.fromMonthOfYear(date.year(), this.minMonth), this.minDay).toJD() + 1;
- },
-
- /** Retrieve the number of days in a week.
- @memberof BaseCalendar
- @return {number} The number of days.
- @example var days = calendar.daysInWeek() */
- daysInWeek: function() {
- return 7;
- },
-
- /** Retrieve the day of the week for a date.
- @memberof BaseCalendar
- @param {CDate|number} year The date to examine or the year to examine.
- @param {number} [month] The month to examine (if numeric year specified above).
- @param {number} [day] The day to examine (if numeric year specified above).
- @return {number} The day of the week: 0 to number of days - 1.
- @throws Error if an invalid date or a different calendar is used.
- @example var dow = calendar.dayOfWeek(date)
-var dow = calendar.dayOfWeek(2014, 1, 26) */
- dayOfWeek: function(year, month, day) {
- var date = this._validate(year, month, day,
- $.calendars.local.invalidDate || $.calendars.regionalOptions[''].invalidDate);
- return (Math.floor(this.toJD(date)) + 2) % this.daysInWeek();
- },
-
- /** Retrieve additional information about a date.
- @memberof BaseCalendar
- @param {CDate|number} year The date to examine or the year to examine.
- @param {number} [month] The month to examine (if numeric year specified above).
- @param {number} [day] The day to examine (if numeric year specified above).
- @return {object} Additional information - content depends on calendar.
- @throws Error if an invalid date or a different calendar is used.
- @example var info = calendar.extraInfo(date)
-var info = calendar.extraInfo(2014, 1, 26) */
- extraInfo: function(year, month, day) {
- this._validate(year, month, day,
- $.calendars.local.invalidDate || $.calendars.regionalOptions[''].invalidDate);
- return {};
- },
-
- /** Add period(s) to a date.
- Cater for no year zero.
- @memberof BaseCalendar
- @param {CDate} date The starting date.
- @param {number} offset The number of periods to adjust by.
- @param {string} period One of 'y' for years, 'm' for months, 'w' for weeks, 'd' for days.
- @return {CDate} The updated date.
- @throws Error if a different calendar is used.
- @example calendar.add(date, 10, 'd') */
- add: function(date, offset, period) {
- this._validate(date, this.minMonth, this.minDay,
- $.calendars.local.invalidDate || $.calendars.regionalOptions[''].invalidDate);
- return this._correctAdd(date, this._add(date, offset, period), offset, period);
- },
-
- /** Add period(s) to a date.
- @memberof BaseCalendar
- @private
- @param {CDate} date The starting date.
- @param {number} offset The number of periods to adjust by.
- @param {string} period One of 'y' for years, 'm' for months, 'w' for weeks, 'd' for days.
- @return {number[]} The updated date as year, month, and day. */
- _add: function(date, offset, period) {
- this._validateLevel++;
- var d;
- if (period === 'd' || period === 'w') {
- var jd = date.toJD() + offset * (period === 'w' ? this.daysInWeek() : 1);
- d = date.calendar().fromJD(jd);
- this._validateLevel--;
- return [d.year(), d.month(), d.day()];
- }
- try {
- var y = date.year() + (period === 'y' ? offset : 0);
- var m = date.monthOfYear() + (period === 'm' ? offset : 0);
- d = date.day();
- var resyncYearMonth = function(calendar) {
- while (m < calendar.minMonth) {
- y--;
- m += calendar.monthsInYear(y);
- }
- var yearMonths = calendar.monthsInYear(y);
- while (m > yearMonths - 1 + calendar.minMonth) {
- y++;
- m -= yearMonths;
- yearMonths = calendar.monthsInYear(y);
- }
- };
- if (period === 'y') {
- if (date.month() !== this.fromMonthOfYear(y, m)) { // Hebrew
- m = this.newDate(y, date.month(), this.minDay).monthOfYear();
- }
- m = Math.min(m, this.monthsInYear(y));
- d = Math.min(d, this.daysInMonth(y, this.fromMonthOfYear(y, m)));
- }
- else if (period === 'm') {
- resyncYearMonth(this);
- d = Math.min(d, this.daysInMonth(y, this.fromMonthOfYear(y, m)));
- }
- var ymd = [y, this.fromMonthOfYear(y, m), d];
- this._validateLevel--;
- return ymd;
- }
- catch (e) {
- this._validateLevel--;
- throw e;
- }
- },
-
- /** Correct a candidate date after adding period(s) to a date.
- Handle no year zero if necessary.
- @memberof BaseCalendar
- @private
- @param {CDate} date The starting date.
- @param {number[]} ymd The added date.
- @param {number} offset The number of periods to adjust by.
- @param {string} period One of 'y' for years, 'm' for months, 'w' for weeks, 'd' for days.
- @return {CDate} The updated date. */
- _correctAdd: function(date, ymd, offset, period) {
- if (!this.hasYearZero && (period === 'y' || period === 'm')) {
- if (ymd[0] === 0 || // In year zero
- (date.year() > 0) !== (ymd[0] > 0)) { // Crossed year zero
- var adj = {y: [1, 1, 'y'], m: [1, this.monthsInYear(-1), 'm'],
- w: [this.daysInWeek(), this.daysInYear(-1), 'd'],
- d: [1, this.daysInYear(-1), 'd']}[period];
- var dir = (offset < 0 ? -1 : +1);
- ymd = this._add(date, offset * adj[0] + dir * adj[1], adj[2]);
- }
- }
- return date.date(ymd[0], ymd[1], ymd[2]);
- },
-
- /** Set a portion of the date.
- @memberof BaseCalendar
- @param {CDate} date The starting date.
- @param {number} value The new value for the period.
- @param {string} period One of 'y' for year, 'm' for month, 'd' for day.
- @return {CDate} The updated date.
- @throws Error if an invalid date or a different calendar is used.
- @example calendar.set(date, 10, 'd') */
- set: function(date, value, period) {
- this._validate(date, this.minMonth, this.minDay,
- $.calendars.local.invalidDate || $.calendars.regionalOptions[''].invalidDate);
- var y = (period === 'y' ? value : date.year());
- var m = (period === 'm' ? value : date.month());
- var d = (period === 'd' ? value : date.day());
- if (period === 'y' || period === 'm') {
- d = Math.min(d, this.daysInMonth(y, m));
- }
- return date.date(y, m, d);
- },
-
- /** Determine whether a date is valid for this calendar.
- @memberof BaseCalendar
- @param {number} year The year to examine.
- @param {number} month The month to examine.
- @param {number} day The day to examine.
- @return {boolean} true if a valid date, false if not.
- @example if (calendar.isValid(2014, 2, 31)) ... */
- isValid: function(year, month, day) {
- this._validateLevel++;
- var valid = (this.hasYearZero || year !== 0);
- if (valid) {
- var date = this.newDate(year, month, this.minDay);
- valid = (month >= this.minMonth && month - this.minMonth < this.monthsInYear(date)) &&
- (day >= this.minDay && day - this.minDay < this.daysInMonth(date));
- }
- this._validateLevel--;
- return valid;
- },
-
- /** Convert the date to a standard (Gregorian) JavaScript Date.
- @memberof BaseCalendar
- @param {CDate|number} year The date to convert or the year to convert.
- @param {number} [month] The month to convert (if numeric year specified above).
- @param {number} [day] The day to convert (if numeric year specified above).
- @return {Date} The equivalent JavaScript date.
- @throws Error if an invalid date or a different calendar is used.
- @example var jsd = calendar.toJSDate(date)
-var jsd = calendar.toJSDate(2014, 1, 26) */
- toJSDate: function(year, month, day) {
- var date = this._validate(year, month, day,
- $.calendars.local.invalidDate || $.calendars.regionalOptions[''].invalidDate);
- return $.calendars.instance().fromJD(this.toJD(date)).toJSDate();
- },
-
- /** Convert the date from a standard (Gregorian) JavaScript Date.
- @memberof BaseCalendar
- @param {Date} jsd The JavaScript date.
- @return {CDate} The equivalent calendar date.
- @example var date = calendar.fromJSDate(jsd) */
- fromJSDate: function(jsd) {
- return this.fromJD($.calendars.instance().fromJSDate(jsd).toJD());
- },
-
- /** Check that a candidate date is from the same calendar and is valid.
- @memberof BaseCalendar
- @private
- @param {CDate|number} year The date to validate or the year to validate.
- @param {number} [month] The month to validate (if numeric year specified above).
- @param {number} [day] The day to validate (if numeric year specified above).
- @param {string} error Error message if invalid.
- @throws Error if an invalid date or a different calendar is used. */
- _validate: function(year, month, day, error) {
- if (year.year) {
- if (this._validateLevel === 0 && this.name !== year.calendar().name) {
- throw ($.calendars.local.differentCalendars || $.calendars.regionalOptions[''].differentCalendars).
- replace(/\{0\}/, this.local.name).replace(/\{1\}/, year.calendar().local.name);
- }
- return year;
- }
- try {
- this._validateLevel++;
- if (this._validateLevel === 1 && !this.isValid(year, month, day)) {
- throw error.replace(/\{0\}/, this.local.name);
- }
- var date = this.newDate(year, month, day);
- this._validateLevel--;
- return date;
- }
- catch (e) {
- this._validateLevel--;
- throw e;
- }
- }
- });
-
- /** Implementation of the Proleptic Gregorian Calendar.
- See http://en.wikipedia.org/wiki/Gregorian_calendar
- and http://en.wikipedia.org/wiki/Proleptic_Gregorian_calendar.
- @class GregorianCalendar
- @augments BaseCalendar
- @param {string} [language=''] The language code (default English) for localisation. */
- function GregorianCalendar(language) {
- this.local = this.regionalOptions[language] || this.regionalOptions[''];
- }
-
- GregorianCalendar.prototype = new BaseCalendar();
-
- $.extend(GregorianCalendar.prototype, {
- /** The calendar name.
- @memberof GregorianCalendar */
- name: 'Gregorian',
- /** Julian date of start of Gregorian epoch: 1 January 0001 CE.
- @memberof GregorianCalendar */
- jdEpoch: 1721425.5,
- /** Days per month in a common year.
- @memberof GregorianCalendar */
- daysPerMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
- /** true if has a year zero, false if not.
- @memberof GregorianCalendar */
- hasYearZero: false,
- /** The minimum month number.
- @memberof GregorianCalendar */
- minMonth: 1,
- /** The first month in the year.
- @memberof GregorianCalendar */
- firstMonth: 1,
- /** The minimum day number.
- @memberof GregorianCalendar */
- minDay: 1,
-
- /** Convert a number into a localised form.
- @callback CalendarsDigits
- @param {number} value The number to convert.
- @return {string} The localised number.
- @example digits: $.calendars.substituteDigits(['۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹']) */
-
- /** Localisations for the plugin.
- Entries are objects indexed by the language code ('' being the default US/English).
- Each object has the following attributes.
- @memberof GregorianCalendar
- @property {string} [name='Gregorian'] The calendar name.
- @property {string[]} [epochs=['BCE','CE']] The epoch names.
- @property {string[]} [monthNames=[...]] The long names of the months of the year.
- @property {string[]} [monthNamesShort=[...]] The short names of the months of the year.
- @property {string[]} [dayNames=[...]] The long names of the days of the week.
- @property {string[]} [dayNamesShort=[...]] The short names of the days of the week.
- @property {string[]} [dayNamesMin=[...]] The minimal names of the days of the week.
- @property {CalendarsDigits} [digits=null] Convert numbers to localised versions.
- @property {string} [dateFormat='mm/dd/yyyy'] The date format for this calendar.
- See the options on {@linkcode BaseCalendar.formatDate|formatDate} for details.
- @property {number} [firstDay=0] The number of the first day of the week, starting at 0.
- @property {boolean} [isRTL=false] true if this localisation reads right-to-left. */
- regionalOptions: { // Localisations
- '': {
- name: 'Gregorian',
- epochs: ['BCE', 'CE'],
- monthNames: ['January', 'February', 'March', 'April', 'May', 'June',
- 'July', 'August', 'September', 'October', 'November', 'December'],
- monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
- dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
- dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
- dayNamesMin: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],
- digits: null,
- dateFormat: 'mm/dd/yyyy',
- firstDay: 0,
- isRTL: false
- }
- },
-
- /** Determine whether this date is in a leap year.
- @memberof GregorianCalendar
- @param {CDate|number} year The date to examine or the year to examine.
- @return {boolean} true if this is a leap year, false if not.
- @throws Error if an invalid year or a different calendar is used. */
- leapYear: function(year) {
- var date = this._validate(year, this.minMonth, this.minDay,
- $.calendars.local.invalidYear || $.calendars.regionalOptions[''].invalidYear);
- year = date.year() + (date.year() < 0 ? 1 : 0); // No year zero
- return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
- },
-
- /** Determine the week of the year for a date - ISO 8601.
- @memberof GregorianCalendar
- @param {CDate|number} year The date to examine or the year to examine.
- @param {number} [month] The month to examine (if numeric year specified above).
- @param {number} [day] The day to examine (if numeric year specified above).
- @return {number} The week of the year, starting from 1.
- @throws Error if an invalid date or a different calendar is used. */
- weekOfYear: function(year, month, day) {
- // Find Thursday of this week starting on Monday
- var checkDate = this.newDate(year, month, day);
- checkDate.add(4 - (checkDate.dayOfWeek() || 7), 'd');
- return Math.floor((checkDate.dayOfYear() - 1) / 7) + 1;
- },
-
- /** Retrieve the number of days in a month.
- @memberof GregorianCalendar
- @param {CDate|number} year The date to examine or the year of the month.
- @param {number} [month] The month (if numeric year specified above).
- @return {number} The number of days in this month.
- @throws Error if an invalid month/year or a different calendar is used. */
- daysInMonth: function(year, month) {
- var date = this._validate(year, month, this.minDay,
- $.calendars.local.invalidMonth || $.calendars.regionalOptions[''].invalidMonth);
- return this.daysPerMonth[date.month() - 1] +
- (date.month() === 2 && this.leapYear(date.year()) ? 1 : 0);
- },
-
- /** Determine whether this date is a week day.
- @memberof GregorianCalendar
- @param {CDate|number} year The date to examine or the year to examine.
- @param {number} [month] The month to examine (if numeric year specified above).
- @param {number} [day] The day to examine (if numeric year specified above).
- @return {boolean} true if a week day, false if not.
- @throws Error if an invalid date or a different calendar is used. */
- weekDay: function(year, month, day) {
- return (this.dayOfWeek(year, month, day) || 7) < 6;
- },
-
- /** Retrieve the Julian date equivalent for this date,
- i.e. days since January 1, 4713 BCE Greenwich noon.
- @memberof GregorianCalendar
- @param {CDate|number} year The date to convert or the year to convert.
- @param {number} [month] The month to convert (if numeric year specified above).
- @param {number} [day] The day to convert (if numeric year specified above).
- @return {number} The equivalent Julian date.
- @throws Error if an invalid date or a different calendar is used. */
- toJD: function(year, month, day) {
- var date = this._validate(year, month, day,
- $.calendars.local.invalidDate || $.calendars.regionalOptions[''].invalidDate);
- year = date.year();
- month = date.month();
- day = date.day();
- if (year < 0) { year++; } // No year zero
- // Jean Meeus algorithm, "Astronomical Algorithms", 1991
- if (month < 3) {
- month += 12;
- year--;
- }
- var a = Math.floor(year / 100);
- var b = 2 - a + Math.floor(a / 4);
- return Math.floor(365.25 * (year + 4716)) +
- Math.floor(30.6001 * (month + 1)) + day + b - 1524.5;
- },
-
- /** Create a new date from a Julian date.
- @memberof GregorianCalendar
- @param {number} jd The Julian date to convert.
- @return {CDate} The equivalent date. */
- fromJD: function(jd) {
- // Jean Meeus algorithm, "Astronomical Algorithms", 1991
- var z = Math.floor(jd + 0.5);
- var a = Math.floor((z - 1867216.25) / 36524.25);
- a = z + 1 + a - Math.floor(a / 4);
- var b = a + 1524;
- var c = Math.floor((b - 122.1) / 365.25);
- var d = Math.floor(365.25 * c);
- var e = Math.floor((b - d) / 30.6001);
- var day = b - d - Math.floor(e * 30.6001);
- var month = e - (e > 13.5 ? 13 : 1);
- var year = c - (month > 2.5 ? 4716 : 4715);
- if (year <= 0) { year--; } // No year zero
- return this.newDate(year, month, day);
- },
-
- /** Convert this date to a standard (Gregorian) JavaScript Date.
- @memberof GregorianCalendar
- @param {CDate|number} year The date to convert or the year to convert.
- @param {number} [month] The month to convert (if numeric year specified above).
- @param {number} [day] The day to convert (if numeric year specified above).
- @return {Date} The equivalent JavaScript date.
- @throws Error if an invalid date or a different calendar is used. */
- toJSDate: function(year, month, day) {
- var date = this._validate(year, month, day,
- $.calendars.local.invalidDate || $.calendars.regionalOptions[''].invalidDate);
- var jsd = new Date(date.year(), date.month() - 1, date.day());
- jsd.setHours(0);
- jsd.setMinutes(0);
- jsd.setSeconds(0);
- jsd.setMilliseconds(0);
- // Hours may be non-zero on daylight saving cut-over:
- // > 12 when midnight changeover, but then cannot generate
- // midnight datetime, so jump to 1AM, otherwise reset.
- jsd.setHours(jsd.getHours() > 12 ? jsd.getHours() + 2 : 0);
- return jsd;
- },
-
- /** Create a new date from a standard (Gregorian) JavaScript Date.
- @memberof GregorianCalendar
- @param {Date} jsd The JavaScript date to convert.
- @return {CDate} The equivalent date. */
- fromJSDate: function(jsd) {
- return this.newDate(jsd.getFullYear(), jsd.getMonth() + 1, jsd.getDate());
- }
- });
-
- // Singleton manager
- $.calendars = new Calendars();
-
- // Date template
- $.calendars.cdate = CDate;
-
- // Base calendar template
- $.calendars.baseCalendar = BaseCalendar;
-
- // Gregorian calendar implementation
- $.calendars.calendars.gregorian = GregorianCalendar;
-
-})(jQuery);
diff --git a/odex25_ensan/odex_benefit/static/src/js/jquery.calendars.picker-ar.js b/odex25_ensan/odex_benefit/static/src/js/jquery.calendars.picker-ar.js
deleted file mode 100644
index dd2f16f98..000000000
--- a/odex25_ensan/odex_benefit/static/src/js/jquery.calendars.picker-ar.js
+++ /dev/null
@@ -1,33 +0,0 @@
-/* http://keith-wood.name/calendars.html
- Arabic localisation for calendars datepicker for jQuery.
- Khaled Al Horani -- خالد الحوراني -- koko.dw@gmail.com */
-(function($) {
- 'use strict';
- $.calendarsPicker.regionalOptions.ar = {
- renderer: $.calendarsPicker.defaultRenderer,
- prevText: '<السابق',
- prevStatus: 'عرض الشهر السابق',
- prevJumpText: '<<',
- prevJumpStatus: '',
- nextText: 'التالي>',
- nextStatus: 'عرض الشهر القادم',
- nextJumpText: '>>',
- nextJumpStatus: '',
- currentText: 'اليوم',
- currentStatus: 'عرض الشهر الحالي',
- todayText: 'اليوم',
- todayStatus: 'عرض الشهر الحالي',
- clearText: 'مسح',
- clearStatus: 'امسح التاريخ الحالي',
- closeText: 'إغلاق',
- closeStatus: 'إغلاق بدون حفظ',
- yearStatus: 'عرض سنة آخرى',
- monthStatus: 'عرض شهر آخر',
- weekText: 'أسبوع',
- weekStatus: 'أسبوع السنة',
- dayStatus: 'اختر D, M d',
- defaultStatus: 'اختر يوم',
- isRTL: true
- };
- $.calendarsPicker.setDefaults($.calendarsPicker.regionalOptions.ar);
-})(jQuery);
diff --git a/odex25_ensan/odex_benefit/static/src/js/jquery.calendars.picker.ext.js b/odex25_ensan/odex_benefit/static/src/js/jquery.calendars.picker.ext.js
deleted file mode 100644
index 4716eb8d1..000000000
--- a/odex25_ensan/odex_benefit/static/src/js/jquery.calendars.picker.ext.js
+++ /dev/null
@@ -1,282 +0,0 @@
-/* http://keith-wood.name/calendars.html
- Calendars date picker extensions for jQuery v2.1.0.
- Written by Keith Wood (wood.keith{at}optusnet.com.au) August 2009.
- Available under the MIT (http://keith-wood.name/licence.html) license.
- Please attribute the author if you use it. */
-
-(function($) { // Hide scope, no $ conflict
- 'use strict';
-
- var themeRollerRenderer = {
- picker: '',
- monthRow: '{weekHeader}{weeks}
{days} ',
- dayHeader: '{day} ',
- week: '{days} ',
- day: '{day} ',
- monthSelector: '.ui-datepicker-group',
- daySelector: 'td',
- rtlClass: 'ui-datepicker-rtl',
- multiClass: 'ui-datepicker-multi',
- defaultClass: 'ui-state-default',
- selectedClass: 'ui-state-active',
- highlightedClass: 'ui-state-hover',
- todayClass: 'ui-state-highlight',
- otherMonthClass: 'ui-datepicker-other-month',
- weekendClass: 'ui-datepicker-week-end',
- commandClass: 'ui-datepicker-cmd',
- commandButtonClass: 'ui-state-default ui-corner-all',
- commandLinkClass: '',
- disabledClass: 'ui-datepicker-disabled'
- };
-
- $.extend($.calendarsPicker, {
-
- /** Template for generating a calendar picker showing week of year.
- Used with the {@linkcode CalendarsPicker.regionalOptions|renderer} regional option.
- @memberof CalendarsPicker
- @example renderer: $.calendarsPicker.weekOfYearRenderer */
- weekOfYearRenderer: $.extend({}, $.calendarsPicker.defaultRenderer, {
- weekHeader: ' ',
- week: '' +
- '{l10n:weekText} {days} '
- }),
-
- /** ThemeRoller template for generating a calendar picker.
- Used with the {@linkcode CalendarsPicker.regionalOptions|renderer} regional option.
- @memberof CalendarsPicker
- @example renderer: $.calendarsPicker.themeRollerRenderer */
- themeRollerRenderer: themeRollerRenderer,
-
- /** ThemeRoller template for generating a calendar picker showing week of year.
- Used with the {@linkcode CalendarsPicker.regionalOptions|renderer} regional option.
- @memberof CalendarsPicker
- @example renderer: $.calendarsPicker.themeRollerWeekOfYearRenderer */
- themeRollerWeekOfYearRenderer: $.extend({}, themeRollerRenderer, {
- weekHeader: '{weekOfYear} {days} ',
- week: '{l10n:weekText} {days} '
- }),
-
- /** Don't allow weekends to be selected.
- Used with the {@linkcode CalendarsPicker.defaultOptions|onDate} option.
- @memberof CalendarsPicker
- @param {CDate} date The current date.
- @return {object} Information about this date.
- @example onDate: $.calendarsPicker.noWeekends */
- noWeekends: function(date) {
- return {selectable: date.weekDay()};
- },
-
- /** Change the first day of the week by clicking on the day header.
- Used with the {@linkcode CalendarsPicker.defaultOptions|onShow} option.
- @memberof CalendarsPicker
- @param {jQuery} picker The completed datepicker division.
- @example onShow: $.calendarsPicker.changeFirstDay */
- changeFirstDay: function(picker) {
- var target = $(this);
- picker.find('th span').each(function() {
- if (this.parentNode.className.match(/.*calendars-week.*/)) {
- return;
- }
- $('' + $(this).text() + '').
- click(function() {
- var dow = parseInt(this.className.replace(/^.*calendars-dow-(\d+).*$/, '$1'), 10);
- target.calendarsPicker('option', {firstDay: dow});
- }).
- replaceAll(this);
- });
- },
-
- /** A function to call when a date is hovered.
- @callback CalendarsPickerOnHover
- @param {CDate} date The date being hovered or {weekOfYear} {days}null on exit.
- @param {boolean} selectable true if this date is selectable, false if not.
- @example function showHovered(date, selectable) {
- $('#feedback').text('You are viewing ' + (date ? date.formatDate() : 'nothing'));
- } */
-
- /** Add a callback when hovering over dates.
- Used with the {@linkcode CalendarsPicker.defaultOptions|onShow} option.
- @memberof CalendarsPicker
- @param {CalendarsPickerOnHover} onHover The callback when hovering.
- @example onShow: $.calendarsPicker.hoverCallback(showHovered) */
- hoverCallback: function(onHover) {
- return function(picker, calendar, inst) {
- if ($.isFunction(onHover)) {
- var target = this;
- var renderer = inst.options.renderer;
- picker.find(renderer.daySelector + ' a, ' + renderer.daySelector + ' span').
- hover(function() {
- onHover.apply(target, [$(target).calendarsPicker('retrieveDate', this),
- this.nodeName.toLowerCase() === 'a']);
- },
- function() { onHover.apply(target, []); });
- }
- };
- },
-
- /** Highlight the entire week when hovering over it.
- Used with the {@linkcode CalendarsPicker.defaultOptions|onShow} option.
- @memberof CalendarsPicker
- @param {jQuery} picker The completed datepicker division.
- @param {BaseCalendar} calendar The calendar implementation.
- @param {object} inst The current instance settings.
- @example onShow: $.calendarsPicker.highlightWeek */
- highlightWeek: function(picker, calendar, inst) {
- var renderer = inst.options.renderer;
- picker.find(renderer.daySelector + ' a, ' + renderer.daySelector + ' span').
- hover(function() {
- $(this).parents('tr').find(renderer.daySelector + ' *').
- addClass(renderer.highlightedClass);
- },
- function() {
- $(this).parents('tr').find(renderer.daySelector + ' *').
- removeClass(renderer.highlightedClass);
- });
- },
-
- /** Show a status bar with messages.
- Used with the {@linkcode CalendarsPicker.defaultOptions|onShow} option.
- @memberof CalendarsPicker
- @param {jQuery} picker The completed datepicker division.
- @param {BaseCalendar} calendar The calendar implementation.
- @param {object} inst The current instance settings.
- @example onShow: $.calendarsPicker.showStatus */
- showStatus: function(picker, calendar, inst) {
- var isTR = (inst.options.renderer.selectedClass === 'ui-state-active');
- var defaultStatus = inst.options.defaultStatus || ' ';
- var status = $('').
- insertAfter(picker.find('.calendars-month-row:last,.ui-datepicker-row-break:last'));
- picker.find('*[title]').each(function() {
- var title = $(this).attr('title');
- $(this).removeAttr('title').hover(
- function() { status.text(title || defaultStatus); },
- function() { status.text(defaultStatus); });
- });
- },
-
- /** Allow easier navigation by month.
- Used with the {@linkcode CalendarsPicker.defaultOptions|onShow} option.
- @memberof CalendarsPicker
- @param {jQuery} picker The completed datepicker division.
- @param {BaseCalendar} calendar The calendar implementation.
- @param {object} inst The current instance settings.
- @example onShow: $.calendarsPicker.monthNavigation */
- monthNavigation: function(picker, calendar, inst) {
- var target = $(this);
- var isTR = (inst.options.renderer.selectedClass === 'ui-state-active');
- var minDate = inst.curMinDate();
- var maxDate = inst.get('maxDate');
- var year = inst.drawDate.year();
- var html = 'input field to popup a calendar for date entry,
- or a div or span to show an inline calendar.<input type="text"> or <div></div>
- <input type="text" data-calendarsPicker="name: 'value'"/>
- @class CalendarsPicker
- @augments JQPlugin
- @example $(selector).calendarsPicker()
-$(selector).calendarsPicker({minDate: 0, maxDate: '+1m +1w'}) */
- $.JQPlugin.createPlugin({
-
- /** The name of the plugin.
- @memberof CalendarsPicker
- @default 'calendarsPicker' */
- name: pluginName,
-
- /** Default template for generating a datepicker.
- Insert anywhere:
-
-
- @memberof CalendarsPicker
- @property {string} picker Overall structure: '{months}' to insert calendar months.
- @property {string} monthRow One row of months: '{months}' to insert calendar months.
- @property {string} month A single month: '{monthHeader:dateFormat}' to insert the month header -
- dateFormat is optional and defaults to 'MM yyyy',
- '{weekHeader}' to insert a week header, '{weeks}' to insert the month's weeks.
- @property {string} weekHeader A week header: '{days}' to insert individual day names.
- @property {string} dayHeader Individual day header: '{day}' to insert day name.
- @property {string} week One week of the month: '{days}' to insert the week's days,
- '{weekOfYear}' to insert week of year.
- @property {string} day An individual day: '{day}' to insert day value.
- @property {string} monthSelector jQuery selector, relative to picker, for a single month.
- @property {string} daySelector jQuery selector, relative to picker, for individual days.
- @property {string} rtlClass Class for right-to-left (RTL) languages.
- @property {string} multiClass Class for multi-month datepickers.
- @property {string} defaultClass Class for selectable dates.
- @property {string} selectedClass Class for currently selected dates.
- @property {string} highlightedClass Class for highlighted dates.
- @property {string} todayClass Class for today.
- @property {string} otherMonthClass Class for days from other months.
- @property {string} weekendClass Class for days on weekends.
- @property {string} commandClass Class prefix for commands.
- @property {string} commandButtonClass Extra class(es) for commands that are buttons.
- @property {string} commandLinkClass Extra class(es) for commands that are links.
- @property {string} disabledClass Class for disabled commands. */
- defaultRenderer: {
- picker: '{weekHeader}{weeks}
{days} ',
- dayHeader: '{day} ',
- week: '{days} ',
- day: '{day} ',
- monthSelector: '.calendars-month',
- daySelector: 'td',
- rtlClass: 'calendars-rtl',
- multiClass: 'calendars-multi',
- defaultClass: '',
- selectedClass: 'calendars-selected',
- highlightedClass: 'calendars-highlight',
- todayClass: 'calendars-today',
- otherMonthClass: 'calendars-other-month',
- weekendClass: 'calendars-weekend',
- commandClass: 'calendars-cmd',
- commandButtonClass: '',
- commandLinkClass: '',
- disabledClass: 'calendars-disabled'
- },
-
- /** Command actions that may be added to a layout by name.
-
-
- The command name is the key name and is used to add the command to a layout
- with '{button:name}' or '{link:name}'. Each has the following attributes.
- @memberof CalendarsPicker
- @property {string} text The field in the regional settings for the displayed text.
- @property {string} status The field in the regional settings for the status text.
- @property {object} keystroke The keystroke to trigger the action, with attributes:
- @property {number} keystroke.keyCode the code for the keystroke,
- @property {boolean} [keystroke.ctrlKey] monthsToStep option) - PageUpmonthsToJump option) - Ctrl+PageUpmonthsToStep option) - PageDownmonthsToJump option) - Ctrl+PageDowntrue if Ctrl is required,
- @property {boolean} [keystroke.altKey] true if Alt is required,
- @property {boolean} [keystroke.shiftKey] true if Shift is required.
- @property {CalendarsPickerCommandEnabled} enabled The function that indicates the command is enabled.
- @property {CalendarsPickerCommandDate} date The function to get the date associated with this action.
- @property {CalendarsPickerCommandAction} action The function that implements the action. */
- commands: {
- prev: {
- text: 'prevText',
- status: 'prevStatus', // Previous month
- keystroke: {keyCode: 33}, // Page up
- enabled: function(inst) {
- var minDate = inst.curMinDate();
- return (!minDate || inst.drawDate.newDate().
- add(1 - inst.options.monthsToStep - inst.options.monthsOffset, 'm').
- day(inst.options.calendar.minDay).add(-1, 'd').compareTo(minDate) !== -1);
- },
- date: function(inst) {
- return inst.drawDate.newDate().
- add(-inst.options.monthsToStep - inst.options.monthsOffset, 'm').
- day(inst.options.calendar.minDay);
- },
- action: function(inst) {
- plugin.changeMonth(this, -inst.options.monthsToStep);
- }
- },
- prevJump: {
- text: 'prevJumpText',
- status: 'prevJumpStatus', // Previous year
- keystroke: {keyCode: 33, ctrlKey: true}, // Ctrl + Page up
- enabled: function(inst) {
- var minDate = inst.curMinDate();
- return (!minDate || inst.drawDate.newDate().
- add(1 - inst.options.monthsToJump - inst.options.monthsOffset, 'm').
- day(inst.options.calendar.minDay).add(-1, 'd').compareTo(minDate) !== -1);
- },
- date: function(inst) {
- return inst.drawDate.newDate().
- add(-inst.options.monthsToJump - inst.options.monthsOffset, 'm').
- day(inst.options.calendar.minDay);
- },
- action: function(inst) {
- plugin.changeMonth(this, -inst.options.monthsToJump);
- }
- },
- next: {
- text: 'nextText',
- status: 'nextStatus', // Next month
- keystroke: {keyCode: 34}, // Page down
- enabled: function(inst) {
- var maxDate = inst.get('maxDate');
- return (!maxDate || inst.drawDate.newDate().
- add(inst.options.monthsToStep - inst.options.monthsOffset, 'm').
- day(inst.options.calendar.minDay).compareTo(maxDate) !== +1);
- },
- date: function(inst) {
- return inst.drawDate.newDate().
- add(inst.options.monthsToStep - inst.options.monthsOffset, 'm').
- day(inst.options.calendar.minDay);
- },
- action: function(inst) {
- plugin.changeMonth(this, inst.options.monthsToStep);
- }
- },
- nextJump: {
- text: 'nextJumpText',
- status: 'nextJumpStatus', // Next year
- keystroke: {keyCode: 34, ctrlKey: true}, // Ctrl + Page down
- enabled: function(inst) {
- var maxDate = inst.get('maxDate');
- return (!maxDate || inst.drawDate.newDate().
- add(inst.options.monthsToJump - inst.options.monthsOffset, 'm').
- day(inst.options.calendar.minDay).compareTo(maxDate) !== +1);
- },
- date: function(inst) {
- return inst.drawDate.newDate().
- add(inst.options.monthsToJump - inst.options.monthsOffset, 'm').
- day(inst.options.calendar.minDay);
- },
- action: function(inst) {
- plugin.changeMonth(this, inst.options.monthsToJump);
- }
- },
- current: {
- text: 'currentText',
- status: 'currentStatus', // Current month
- keystroke: {keyCode: 36, ctrlKey: true}, // Ctrl + Home
- enabled: function(inst) {
- var minDate = inst.curMinDate();
- var maxDate = inst.get('maxDate');
- var curDate = inst.selectedDates[0] || inst.options.calendar.today();
- return (!minDate || curDate.compareTo(minDate) !== -1) &&
- (!maxDate || curDate.compareTo(maxDate) !== +1);
- },
- date: function(inst) {
- return inst.selectedDates[0] || inst.options.calendar.today();
- },
- action: function(inst) {
- var curDate = inst.selectedDates[0] || inst.options.calendar.today();
- plugin.showMonth(this, curDate.year(), curDate.month());
- }
- },
- today: {
- text: 'todayText',
- status: 'todayStatus', // Today's month
- keystroke: {keyCode: 36, ctrlKey: true}, // Ctrl + Home
- enabled: function(inst) {
- var minDate = inst.curMinDate();
- var maxDate = inst.get('maxDate');
- return (!minDate || inst.options.calendar.today().compareTo(minDate) !== -1) &&
- (!maxDate || inst.options.calendar.today().compareTo(maxDate) !== +1);
- },
- date: function(inst) {
- return inst.options.calendar.today();
- },
- action: function() {
- plugin.showMonth(this);
- }
- },
- clear: {
- text: 'clearText',
- status: 'clearStatus', // Clear the datepicker
- keystroke: {keyCode: 35, ctrlKey: true}, // Ctrl + End
- enabled: function() { return true; },
- date: function() { return null; },
- action: function() { plugin.clear(this); }
- },
- close: {
- text: 'closeText',
- status: 'closeStatus', // Close the datepicker
- keystroke: {keyCode: 27}, // Escape
- enabled: function() { return true; },
- date: function() { return null; },
- action: function() { plugin.hide(this); }
- },
- prevWeek: {
- text: 'prevWeekText',
- status: 'prevWeekStatus', // Previous week
- keystroke: {keyCode: 38, ctrlKey: true}, // Ctrl + Up
- enabled: function(inst) {
- var minDate = inst.curMinDate();
- return (!minDate || inst.drawDate.newDate().
- add(-inst.options.calendar.daysInWeek(), 'd').compareTo(minDate) !== -1);
- },
- date: function(inst) {
- return inst.drawDate.newDate().add(-inst.options.calendar.daysInWeek(), 'd');
- },
- action: function(inst) {
- plugin.changeDay(this, -inst.options.calendar.daysInWeek());
- }
- },
- prevDay: {
- text: 'prevDayText',
- status: 'prevDayStatus', // Previous day
- keystroke: {keyCode: 37, ctrlKey: true}, // Ctrl + Left
- enabled: function(inst) {
- var minDate = inst.curMinDate();
- return (!minDate || inst.drawDate.newDate().add(-1, 'd').compareTo(minDate) !== -1);
- },
- date: function(inst) {
- return inst.drawDate.newDate().add(-1, 'd');
- },
- action: function() {
- plugin.changeDay(this, -1);
- }
- },
- nextDay: {
- text: 'nextDayText',
- status: 'nextDayStatus', // Next day
- keystroke: {keyCode: 39, ctrlKey: true}, // Ctrl + Right
- enabled: function(inst) {
- var maxDate = inst.get('maxDate');
- return (!maxDate || inst.drawDate.newDate().add(1, 'd').compareTo(maxDate) !== +1);
- },
- date: function(inst) {
- return inst.drawDate.newDate().add(1, 'd');
- },
- action: function() {
- plugin.changeDay(this, 1);
- }
- },
- nextWeek: {
- text: 'nextWeekText',
- status: 'nextWeekStatus', // Next week
- keystroke: {keyCode: 40, ctrlKey: true}, // Ctrl + Down
- enabled: function(inst) {
- var maxDate = inst.get('maxDate');
- return (!maxDate || inst.drawDate.newDate().
- add(inst.options.calendar.daysInWeek(), 'd').compareTo(maxDate) !== +1);
- },
- date: function(inst) {
- return inst.drawDate.newDate().add(inst.options.calendar.daysInWeek(), 'd');
- },
- action: function(inst) {
- plugin.changeDay(this, inst.options.calendar.daysInWeek());
- }
- }
- },
-
- /** Determine whether a command is enabled.
- @callback CalendarsPickerCommandEnabled
- @param {object} inst The current instance settings.
- @return {boolean} true if this command is enabled, false if not.
- @example enabled: function(inst) {
- return !!inst.curMinDate();
-} */
-
- /** Calculate the representative date for a command.
- @callback CalendarsPickerCommandDate
- @param {object} inst The current instance settings.
- @return {CDate} A date appropriate for this command.
- @example date: function(inst) {
- return inst.curMinDate();
-} */
-
- /** Perform the action for a command.
- @callback CalendarsPickerCommandAction
- @param {object} inst The current instance settings.
- @example date: function(inst) {
- $.datepick.setDate(inst.elem, inst.curMinDate());
-} */
-
- /** Calculate the week of the year for a date.
- @callback CalendarsPickerCalculateWeek
- @param {CDate} date The date to evaluate.
- @return {number} The week of the year.
- @example calculateWeek: function(date) {
- var startYear = date.newDate(date.year(), 1, 1);
- return Math.floor((date.dayOfYear() - startYear.dayOfYear()) / 7) + 1;
-} */
-
- /** Provide information about an individual date shown in the calendar.
- @callback CalendarsPickerOnDate
- @param {CDate} date The date to evaluate.
- @return {object} Information about that date, with the properties above.
- @property {boolean} selectable true if this date can be selected.
- @property {string} dateClass Class(es) to be applied to the date.
- @property {string} content The date cell content.
- @property {string} tooltip A popup tooltip for the date.
- @example onDate: function(date) {
- return {selectable: date.day() > 0 && date.day() < 5,
- dateClass: date.day() === 4 ? 'last-day' : ''};
-} */
-
- /** Update the datepicker display.
- @callback CalendarsPickerOnShow
- @param {jQuery} picker The datepicker div to be shown.
- @param {object} inst The current instance settings.
- @example onShow: function(picker, inst) {
- picker.append('').
- find('button:last').click(function() {
- alert('Hi!');
- });
-} */
-
- /** React to navigating through the months/years.
- @callback CalendarsPickerOnChangeMonthYear
- @param {number} year The new year.
- @param {number} month The new month (calendar minimum month to maximum month).
- @example onChangeMonthYear: function(year, month) {
- alert('Now in ' + month + '/' + year);
-} */
-
- /** Datepicker on select callback.
- Triggered when a date is selected.
- @callback CalendarsPickerOnSelect
- @param {CDate[]} dates The selected date(s).
- @example onSelect: function(dates) {
- alert('Selected ' + dates);
-} */
-
- /** Datepicker on close callback.
- Triggered when a popup calendar is closed.
- @callback CalendarsPickerOnClose
- @param {CDate[]} dates The selected date(s).
- @example onClose: function(dates) {
- alert('Selected ' + dates);
-} */
-
- /** Default settings for the plugin.
- @memberof CalendarsPicker
- @property {Calendar} [calendar=$.calendars.instance()] The calendar for this datepicker.
- @property {string} [pickerClass=''] CSS class to add to this instance of the datepicker.
- @property {boolean} [showOnFocus=true] true for popup on focus, false for not.
- @property {string|Element|jQuery} [showTrigger=null] Element to be cloned for a trigger,
- null for none.
- @property {string} [showAnim='show'] Name of jQuery animation for popup, '' for no animation.
- @property {object} [showOptions=null] Options for enhanced animations.
- @property {string|number} [showSpeed='normal'] Duration of display/closure, named or in milliseconds.
- @property {string|Element|jQuery} [popupContainer=null] The element to which a popup calendar is added,
- null for body.
- @property {string} [alignment='bottom'] Alignment of popup - with nominated corner of input:
- 'top' or 'bottom' aligns depending on language direction,
- 'topLeft', 'topRight', 'bottomLeft', 'bottomRight'.
- @property {boolean} [fixedWeeks=false] true to always show 6 weeks,
- false to only show as many as are needed.
- @property {number} [firstDay=null] First day of the week, 0 = Sunday, 1 = Monday, etc.,
- null for calendar default.
- @property {CalendarsPickerCalculateWeek} [calculateWeek=null] Calculate week of the year from a date,
- null for calendar default.
- @property {boolean} [localNumbers=false] true to localise numbers (if available),
- false to use normal Arabic numerals.
- @property {number|number[]} [monthsToShow=1] How many months to show, cols or [rows, cols].
- @property {number} [monthsOffset=0] How many months to offset the primary month by;
- may be a function that takes the date and returns the offset.
- @property {number} [monthsToStep=1] How many months to move when prev/next clicked.
- @property {number} [monthsToJump=12] How many months to move when large prev/next clicked.
- @property {boolean} [useMouseWheel=true] true to use mousewheel if available,
- false to never use it.
- @property {boolean} [changeMonth=true] true to change month/year via drop-down,
- false for navigation only.
- @property {string} [yearRange='c-10:c+10'] Range of years to show in drop-down: 'any' for direct text entry
- or 'start:end', where start/end are '+-nn' for relative to today
- or 'c+-nn' for relative to the currently selected date
- or 'nnnn' for an absolute year.
- @property {boolean} [showOtherMonths=false] true to show dates from other months,
- false to not show them.
- @property {boolean} [selectOtherMonths=false] true to allow selection of dates
- from other months too.
- @property {string|number|CDate} [defaultDate=null] Date to show if no other selected.
- @property {boolean} [selectDefaultDate=false] true to pre-select the default date
- if no other is chosen.
- @property {string|number|CDate} [minDate=null] The minimum selectable date.
- @property {string|number|CDate} [maxDate=null] The maximum selectable date.
- @property {string} [dateFormat='mm/dd/yyyy'] Format for dates.
- @property {boolean} [autoSize=false] true to size the input field according to the date format.
- @property {boolean} [rangeSelect=false] Allows for selecting a date range on one date picker.
- @property {string} [rangeSeparator=' - '] Text between two dates in a range.
- @property {number} [multiSelect=0] Maximum number of selectable dates, zero for single select.
- @property {string} [multiSeparator=','] Text between multiple dates.
- @property {CalendarsPickerOnDate} [onDate=null] Callback as a date is added to the datepicker.
- @property {CalendarsPickerOnShow} [onShow=null] Callback just before a datepicker is shown.
- @property {CalendarsPickerOnChangeMonthYear} [onChangeMonthYear=null] Callback when a new month/year
- is selected.
- @property {CalendarsPickerOnSelect} [onSelect=null] Callback when a date is selected.
- @property {CalendarsPickerOnClose} [onClose=null] Callback when a datepicker is closed.
- @property {string|Element|jQuery} [altField=null] Alternate field to update in synch with the datepicker.
- @property {string} [altFormat=null] Date format for alternate field, defaults to dateFormat.
- @property {boolean} [constrainInput=true] true to constrain typed input to
- dateFormat allowed characters.
- @property {boolean} [commandsAsDateFormat=false] true to apply
- formatDate to the command texts.
- @property {object} [commands=this.commands] Command actions that may be added to a layout by name.
- @example $(selector).calendarsPicker({calendar: $.calendars.instance('persian')})
-$(selector).calendarsPicker({monthsToShow: [2, 3], monthsToStep: 6})
-$(selector).calendarsPicker({minDate: $.calendars.newDate(2001, 1, 1),
- maxDate: $.calendars.newDate(2010, 12, 31)}) */
- defaultOptions: {
- calendar: $.calendars.instance(),
- pickerClass: '',
- showOnFocus: true,
- showTrigger: null,
- showAnim: 'show',
- showOptions: {},
- showSpeed: 'normal',
- popupContainer: null,
- alignment: 'bottom',
- fixedWeeks: false,
- firstDay: null,
- calculateWeek: null,
- localNumbers: false,
- monthsToShow: 1,
- monthsOffset: 0,
- monthsToStep: 1,
- monthsToJump: 12,
- useMouseWheel: true,
- changeMonth: true,
- yearRange: 'c-10:c+0',
- showOtherMonths: false,
- selectOtherMonths: false,
- defaultDate: null,
- selectDefaultDate: false,
- minDate: null,
- maxDate: null,
- dateFormat: null,
- autoSize: false,
- rangeSelect: false,
- rangeSeparator: ' - ',
- multiSelect: 0,
- multiSeparator: ',',
- onDate: null,
- onShow: null,
- onChangeMonthYear: null,
- onSelect: null,
- onClose: null,
- altField: null,
- altFormat: null,
- constrainInput: true,
- commandsAsDateFormat: false,
- commands: {} // this.commands
- },
-
- /** Localisations for the plugin.
- Entries are objects indexed by the language code ('' being the default US/English).
- Each object has the following attributes.
- @memberof CalendarsPicker
- @property {string} [renderer=this.defaultRenderer] The rendering templates.
- @property {string} [prevText='<Prev'] Text for the previous month command.
- @property {string} [prevStatus='Show the previous month'] Status text for the
- previous month command.
- @property {string} [prevJumpText='<<'] Text for the previous year command.
- @property {string} [prevJumpStatus='Show the previous year'] Status text for the
- previous year command.
- @property {string} [nextText='Next>'] Text for the next month command.
- @property {string} [nextStatus='Show the next month'] Status text for the next month command.
- @property {string} [nextJumpText='>>'] Text for the next year command.
- @property {string} [nextJumpStatus='Show the next year'] Status text for the
- next year command.
- @property {string} [currentText='Current'] Text for the current month command.
- @property {string} [currentStatus='Show the current month'] Status text for the
- current month command.
- @property {string} [todayText='Today'] Text for the today's month command.
- @property {string} [todayStatus='Show today\'s month'] Status text for the today's month command.
- @property {string} [clearText='Clear'] Text for the clear command.
- @property {string} [clearStatus='Clear all the dates'] Status text for the clear command.
- @property {string} [closeText='Close'] Text for the close command.
- @property {string} [closeStatus='Close the datepicker'] Status text for the close command.
- @property {string} [yearStatus='Change the year'] Status text for year selection.
- @property {string} [earlierText=' ▲'] Text for earlier years.
- @property {string} [laterText=' ▼'] Text for later years.
- @property {string} [monthStatus='Change the month'] Status text for month selection.
- @property {string} [weekText='Wk'] Text for week of the year column header.
- @property {string} [weekStatus='Week of the year'] Status text for week of the year
- column header.
- @property {string} [dayStatus='Select DD, M d, yyyy'] Status text for selectable days.
- @property {string} [defaultStatus='Select a date'] Status text shown by default.
- @property {boolean} [isRTL=false] true if language is right-to-left. */
- regionalOptions: { // Available regional settings, indexed by language/country code
- '': { // Default regional settings - English/US
- renderer: {}, // this.defaultRenderer
- prevText: '<Prev',
- prevStatus: 'Show the previous month',
- prevJumpText: '<<',
- prevJumpStatus: 'Show the previous year',
- nextText: 'Next>',
- nextStatus: 'Show the next month',
- nextJumpText: '>>',
- nextJumpStatus: 'Show the next year',
- currentText: 'Current',
- currentStatus: 'Show the current month',
- todayText: 'Today',
- todayStatus: 'Show today\'s month',
- clearText: 'Clear',
- clearStatus: 'Clear all the dates',
- closeText: 'Close',
- closeStatus: 'Close the datepicker',
- yearStatus: 'Change the year',
- earlierText: ' ▲',
- laterText: ' ▼',
- monthStatus: 'Change the month',
- weekText: 'Wk',
- weekStatus: 'Week of the year',
- dayStatus: 'Select DD, M d, yyyy',
- defaultStatus: 'Select a date',
- isRTL: false
- }
- },
-
- _disabled: [],
-
- _popupClass: 'calendars-popup', // Marker for popup division
- _triggerClass: 'calendars-trigger', // Marker for trigger element
- _disableClass: 'calendars-disable', // Marker for disabled element
- _monthYearClass: 'calendars-month-year', // Marker for month/year inputs
- _curMonthClass: 'calendars-month-', // Marker for current month/year
- _anyYearClass: 'calendars-any-year', // Marker for year direct input
- _curDoWClass: 'calendars-dow-', // Marker for day of week
-
- _init: function() {
- this.defaultOptions.commands = this.commands;
- this.regionalOptions[''].renderer = this.defaultRenderer;
- this._super();
- },
-
- _instSettings: function(elem, options) { // jshint unused:false
- return {selectedDates: [], drawDate: null, pickingRange: false,
- inline: ($.inArray(elem[0].nodeName.toLowerCase(), ['div', 'span']) > -1),
- get: function(name) { // Get a setting value, computing if necessary
- if ($.inArray(name, ['defaultDate', 'minDate', 'maxDate']) > -1) { // Decode date settings
- return this.options.calendar.determineDate(this.options[name], null,
- this.selectedDates[0], this.get('dateFormat'), this.getConfig());
- }
- if (name === 'dateFormat') {
- return this.options.dateFormat || this.options.calendar.local.dateFormat;
- }
- return this.options[name];
- },
- curMinDate: function() {
- return (this.pickingRange ? this.selectedDates[0] : this.get('minDate'));
- },
- getConfig: function() {
- return {dayNamesShort: this.options.dayNamesShort, dayNames: this.options.dayNames,
- monthNamesShort: this.options.monthNamesShort, monthNames: this.options.monthNames,
- calculateWeek: this.options.calculateWeek, shortYearCutoff: this.options.shortYearCutoff};
- }
- };
- },
-
- _postAttach: function(elem, inst) {
- if (inst.inline) {
- inst.drawDate = plugin._checkMinMax((inst.selectedDates[0] ||
- inst.get('defaultDate') || inst.options.calendar.today()).newDate(), inst);
- inst.prevDate = inst.drawDate.newDate();
- this._update(elem[0]);
- if ($.fn.mousewheel) {
- elem.mousewheel(this._doMouseWheel);
- }
- }
- else {
- this._attachments(elem, inst);
- elem.on('keydown.' + inst.name, this._keyDown).on('keypress.' + inst.name, this._keyPress).
- on('keyup.' + inst.name, this._keyUp);
- if (elem.attr('disabled')) {
- this.disable(elem[0]);
- }
- }
- },
-
- _optionsChanged: function(elem, inst, options) {
- if (options.calendar && options.calendar !== inst.options.calendar) {
- var discardDate = function(name) {
- return (typeof inst.options[name] === 'object' ? null : inst.options[name]);
- };
- options = $.extend({defaultDate: discardDate('defaultDate'),
- minDate: discardDate('minDate'), maxDate: discardDate('maxDate')}, options);
- inst.selectedDates = [];
- inst.drawDate = null;
- }
- var dates = inst.selectedDates;
- $.extend(inst.options, options);
- this.setDate(elem[0], dates, null, false, true);
- inst.pickingRange = false;
- var calendar = inst.options.calendar;
- var defaultDate = inst.get('defaultDate');
- inst.drawDate = this._checkMinMax((defaultDate ? defaultDate : inst.drawDate) ||
- defaultDate || calendar.today(), inst).newDate();
- if (!inst.inline) {
- this._attachments(elem, inst);
- }
- if (inst.inline || inst.div) {
- this._update(elem[0]);
- }
- },
-
- /** Attach events and trigger, if necessary.
- @memberof CalendarsPicker
- @private
- @param {jQuery} elem The control to affect.
- @param {object} inst The current instance settings. */
- _attachments: function(elem, inst) {
- elem.off('focus.' + inst.name);
- if (inst.options.showOnFocus) {
- elem.on('focus.' + inst.name, this.show);
- }
- if (inst.trigger) {
- inst.trigger.remove();
- }
- var trigger = inst.options.showTrigger;
- inst.trigger = (!trigger ? $([]) :
- $(trigger).clone().removeAttr('id').addClass(this._triggerClass)
- [inst.options.isRTL ? 'insertBefore' : 'insertAfter'](elem).
- click(function() {
- if (!plugin.isDisabled(elem[0])) {
- plugin[plugin.curInst === inst ? 'hide' : 'show'](elem[0]);
- }
- }));
- this._autoSize(elem, inst);
- var dates = this._extractDates(inst, elem.val());
- if (dates) {
- this.setDate(elem[0], dates, null, true);
- }
- var defaultDate = inst.get('defaultDate');
- if (inst.options.selectDefaultDate && defaultDate && inst.selectedDates.length === 0) {
- this.setDate(elem[0], (defaultDate || inst.options.calendar.today()).newDate());
- }
- },
-
- /** Apply the maximum length for the date format.
- @memberof CalendarsPicker
- @private
- @param {jQuery} elem The control to affect.
- @param {object} inst The current instance settings. */
- _autoSize: function(elem, inst) {
- if (inst.options.autoSize && !inst.inline) {
- var calendar = inst.options.calendar;
- var date = calendar.newDate(2009, 10, 20); // Ensure double digits
- var dateFormat = inst.get('dateFormat');
- if (dateFormat.match(/[DM]/)) {
- var findMax = function(names) {
- var max = 0;
- var maxI = 0;
- for (var i = 0; i < names.length; i++) {
- if (names[i].length > max) {
- max = names[i].length;
- maxI = i;
- }
- }
- return maxI;
- };
- date.month(findMax(calendar.local[dateFormat.match(/MM/) ? // Longest month
- 'monthNames' : 'monthNamesShort']) + 1);
- date.day(findMax(calendar.local[dateFormat.match(/DD/) ? // Longest day
- 'dayNames' : 'dayNamesShort']) + 20 - date.dayOfWeek());
- }
- inst.elem.attr('size', date.formatDate(dateFormat,
- {localNumbers: inst.options.localnumbers}).length);
- }
- },
-
- _preDestroy: function(elem, inst) {
- if (inst.trigger) {
- inst.trigger.remove();
- }
- elem.empty().off('.' + inst.name);
- if (inst.inline && $.fn.mousewheel) {
- elem.unmousewheel();
- }
- if (!inst.inline && inst.options.autoSize) {
- elem.removeAttr('size');
- }
- },
-
- /** Apply multiple event functions.
- @memberof CalendarsPicker
- @param {function} fns The functions to apply.
- @example onShow: multipleEvents(fn1, fn2, ...) */
- multipleEvents: function(fns) { // jshint unused:false
- var funcs = arguments;
- return function() {
- for (var i = 0; i < funcs.length; i++) {
- funcs[i].apply(this, arguments);
- }
- };
- },
-
- /** Enable the control.
- @memberof CalendarsPicker
- @param {Element} elem The control to affect.
- @example $(selector).datepick('enable') */
- enable: function(elem) {
- elem = $(elem);
- if (!elem.hasClass(this._getMarker())) {
- return;
- }
- var inst = this._getInst(elem);
- if (inst.inline) {
- elem.children('.' + this._disableClass).remove().end().
- find('button,select').prop('disabled', false).end().
- find('a').attr('href', '#');
- }
- else {
- elem.prop('disabled', false);
- inst.trigger.filter('button.' + this._triggerClass).prop('disabled', false).end().
- filter('img.' + this._triggerClass).css({opacity: '1.0', cursor: ''});
- }
- this._disabled = $.map(this._disabled,
- function(value) { return (value === elem[0] ? null : value); }); // Delete entry
- },
-
- /** Disable the control.
- @memberof CalendarsPicker
- @param {Element} elem The control to affect.
- @example $(selector).datepick('disable') */
- disable: function(elem) {
- elem = $(elem);
- if (!elem.hasClass(this._getMarker())) {
- return;
- }
- var inst = this._getInst(elem);
- if (inst.inline) {
- var inline = elem.children(':last');
- var offset = inline.offset();
- var relOffset = {left: 0, top: 0};
- inline.parents().each(function() {
- if ($(this).css('position') === 'relative') {
- relOffset = $(this).offset();
- return false;
- }
- });
- var zIndex = elem.css('zIndex');
- zIndex = (zIndex === 'auto' ? 0 : parseInt(zIndex, 10)) + 1;
- elem.prepend('').
- find('button,select').prop('disabled', true).end().
- find('a').removeAttr('href');
- }
- else {
- elem.prop('disabled', true);
- inst.trigger.filter('button.' + this._triggerClass).prop('disabled', true).end().
- filter('img.' + this._triggerClass).css({opacity: '0.5', cursor: 'default'});
- }
- this._disabled = $.map(this._disabled,
- function(value) { return (value === elem[0] ? null : value); }); // Delete entry
- this._disabled.push(elem[0]);
- },
-
- /** Is the first field in a jQuery collection disabled as a datepicker?
- @memberof CalendarsPicker
- @param {Element} elem The control to examine.
- @return {boolean} true if disabled, false if enabled.
- @example if ($(selector).datepick('isDisabled')) {...} */
- isDisabled: function(elem) {
- return (elem && $.inArray(elem, this._disabled) > -1);
- },
-
- /** Show a popup datepicker.
- @memberof CalendarsPicker
- @param {Event|Element} elem a focus event or the control to use.
- @example $(selector).datepick('show') */
- show: function(elem) {
- elem = $(elem.target || elem);
- var inst = plugin._getInst(elem);
- if (plugin.curInst === inst) {
- return;
- }
- if (plugin.curInst) {
- plugin.hide(plugin.curInst, true);
- }
- if (!$.isEmptyObject(inst)) {
- // Retrieve existing date(s)
- inst.lastVal = null;
- inst.selectedDates = plugin._extractDates(inst, elem.val());
- inst.pickingRange = false;
- inst.drawDate = plugin._checkMinMax((inst.selectedDates[0] ||
- inst.get('defaultDate') || inst.options.calendar.today()).newDate(), inst);
- inst.prevDate = inst.drawDate.newDate();
- plugin.curInst = inst;
- // Generate content
- plugin._update(elem[0], true);
- // Adjust position before showing
- var offset = plugin._checkOffset(inst);
- inst.div.css({left: offset.left, top: offset.top});
- // And display
- var showAnim = inst.options.showAnim;
- var showSpeed = inst.options.showSpeed;
- showSpeed = (showSpeed === 'normal' && $.ui &&
- parseInt($.ui.version.substring(2)) >= 8 ? '_default' : showSpeed);
- if ($.effects && ($.effects[showAnim] || ($.effects.effect && $.effects.effect[showAnim]))) {
- var data = inst.div.data(); // Update old effects data
- for (var key in data) {
- if (key.match(/^ec\.storage\./)) {
- data[key] = inst._mainDiv.css(key.replace(/ec\.storage\./, ''));
- }
- }
- inst.div.data(data).show(showAnim, inst.options.showOptions, showSpeed);
- }
- else {
- inst.div[showAnim || 'show'](showAnim ? showSpeed : 0);
- }
- }
- },
-
- /** Extract possible dates from a string.
- @memberof CalendarsPicker
- @private
- @param {object} inst The current instance settings.
- @param {string} text The text to extract from.
- @return {CDate[]} The extracted dates. */
- _extractDates: function(inst, datesText) {
- if (datesText === inst.lastVal) {
- return;
- }
- inst.lastVal = datesText;
- datesText = datesText.split(inst.options.multiSelect ? inst.options.multiSeparator :
- (inst.options.rangeSelect ? inst.options.rangeSeparator : '\x00'));
- var dates = [];
- for (var i = 0; i < datesText.length; i++) {
- try {
- var date = inst.options.calendar.parseDate(inst.get('dateFormat'), datesText[i]);
- if (date) {
- var found = false;
- for (var j = 0; j < dates.length; j++) {
- if (dates[j].compareTo(date) === 0) {
- found = true;
- break;
- }
- }
- if (!found) {
- dates.push(date);
- }
- }
- }
- catch (e) {
- // Ignore
- }
- }
- dates.splice(inst.options.multiSelect || (inst.options.rangeSelect ? 2 : 1), dates.length);
- if (inst.options.rangeSelect && dates.length === 1) {
- dates[1] = dates[0];
- }
- return dates;
- },
-
- /** Update the datepicker display.
- @memberof CalendarsPicker
- @private
- @param {Event|Element} elem A focus event or the control to use.
- @param {boolean} hidden true to initially hide the datepicker. */
- _update: function(elem, hidden) {
- elem = $(elem.target || elem);
- var inst = plugin._getInst(elem);
- if (!$.isEmptyObject(inst)) {
- if (inst.inline || plugin.curInst === inst) {
- if ($.isFunction(inst.options.onChangeMonthYear) && (!inst.prevDate ||
- inst.prevDate.year() !== inst.drawDate.year() ||
- inst.prevDate.month() !== inst.drawDate.month())) {
- inst.options.onChangeMonthYear.apply(elem[0],
- [inst.drawDate.year(), inst.drawDate.month()]);
- }
- }
- if (inst.inline) {
- var index = $('a, :input', elem).index($(':focus', elem));
- elem.html(this._generateContent(elem[0], inst));
- var focus = elem.find('a, :input');
- focus.eq(Math.max(Math.min(index, focus.length - 1), 0)).focus();
- }
- else if (plugin.curInst === inst) {
- if (!inst.div) {
- inst.div = $('').addClass(this._popupClass).
- css({display: (hidden ? 'none' : 'static'), position: 'absolute',
- left: elem.offset().left, top: elem.offset().top + elem.outerHeight()}).
- appendTo($(inst.options.popupContainer || 'body'));
- if ($.fn.mousewheel) {
- inst.div.mousewheel(this._doMouseWheel);
- }
- }
- inst.div.html(this._generateContent(elem[0], inst));
- elem.focus();
- }
- }
- },
-
- /** Update the input field and any alternate field with the current dates.
- @memberof CalendarsPicker
- @private
- @param {Element} elem The control to use.
- @param {boolean} keyUp true if coming from keyUp processing (internal). */
- _updateInput: function(elem, keyUp) {
- var inst = this._getInst(elem);
- if (!$.isEmptyObject(inst)) {
- var value = '';
- var altValue = '';
- var sep = (inst.options.multiSelect ? inst.options.multiSeparator :
- inst.options.rangeSeparator);
- var calendar = inst.options.calendar;
- var dateFormat = inst.get('dateFormat');
- var altFormat = inst.options.altFormat || dateFormat;
- var settings = {localNumbers: inst.options.localNumbers};
- for (var i = 0; i < inst.selectedDates.length; i++) {
- value += (keyUp ? '' : (i > 0 ? sep : '') +
- calendar.formatDate(dateFormat, inst.selectedDates[i], settings));
- altValue += (i > 0 ? sep : '') +
- calendar.formatDate(altFormat, inst.selectedDates[i], settings);
- }
- if (!inst.inline && !keyUp) {
- $(elem).val(value);
- }
- $(inst.options.altField).val(altValue);
- if ($.isFunction(inst.options.onSelect) && !keyUp && !inst.inSelect) {
- inst.inSelect = true; // Prevent endless loops
- inst.options.onSelect.apply(elem, [inst.selectedDates]);
- inst.inSelect = false;
- }
- $(elem).change();
- }
- },
-
- /** Retrieve the size of left and top borders for an element.
- @memberof CalendarsPicker
- @private
- @param {jQuery} elem The element of interest.
- @return {number[]} The left and top borders. */
- _getBorders: function(elem) {
- var convert = function(value) {
- return {thin: 1, medium: 3, thick: 5}[value] || value;
- };
- return [parseFloat(convert(elem.css('border-left-width'))),
- parseFloat(convert(elem.css('border-top-width')))];
- },
-
- /** Check positioning to remain on the screen.
- @memberof CalendarsPicker
- @private
- @param {object} inst The current instance settings.
- @return {object} The updated offset for the datepicker. */
- _checkOffset: function(inst) {
- var base = (inst.elem.is(':hidden') && inst.trigger ? inst.trigger : inst.elem);
- var offset = base.offset();
- var browserWidth = $(window).width();
- var browserHeight = $(window).height();
- if (browserWidth === 0) {
- return offset;
- }
- var isFixed = false;
- $(inst.elem).parents().each(function() {
- isFixed = isFixed || $(this).css('position') === 'fixed';
- return !isFixed;
- });
- var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
- var scrollY = document.documentElement.scrollTop || document.body.scrollTop;
- var above = offset.top - (isFixed ? scrollY : 0) - inst.div.outerHeight();
- var below = offset.top - (isFixed ? scrollY : 0) + base.outerHeight();
- var alignL = offset.left - (isFixed ? scrollX : 0);
- var alignR = offset.left - (isFixed ? scrollX : 0) + base.outerWidth() - inst.div.outerWidth();
- var tooWide = (offset.left - scrollX + inst.div.outerWidth()) > browserWidth;
- var tooHigh = (offset.top - scrollY + inst.elem.outerHeight() +
- inst.div.outerHeight()) > browserHeight;
- inst.div.css('position', isFixed ? 'fixed' : 'absolute');
- var alignment = inst.options.alignment;
- if (alignment === 'topLeft') {
- offset = {left: alignL, top: above};
- }
- else if (alignment === 'topRight') {
- offset = {left: alignR, top: above};
- }
- else if (alignment === 'bottomLeft') {
- offset = {left: alignL, top: below};
- }
- else if (alignment === 'bottomRight') {
- offset = {left: alignR, top: below};
- }
- else if (alignment === 'top') {
- offset = {left: (inst.options.isRTL || tooWide ? alignR : alignL), top: above};
- }
- else { // bottom
- offset = {left: (inst.options.isRTL || tooWide ? alignR : alignL),
- top: (tooHigh ? above : below)};
- }
- offset.left = Math.max((isFixed ? 0 : scrollX), offset.left);
- offset.top = Math.max((isFixed ? 0 : scrollY), offset.top);
- return offset;
- },
-
- /** Close date picker if clicked elsewhere.
- @memberof CalendarsPicker
- @private
- @param {MouseEvent} event The mouse click to check. */
- _checkExternalClick: function(event) {
- if (!plugin.curInst) {
- return;
- }
- var elem = $(event.target);
- if (elem.closest('.' + plugin._popupClass + ',.' + plugin._triggerClass).length === 0 &&
- !elem.hasClass(plugin._getMarker())) {
- plugin.hide(plugin.curInst);
- }
- },
-
- /** Hide a popup datepicker.
- @memberof CalendarsPicker
- @param {Element|object} elem The control to use or the current instance settings.
- @param {boolean} immediate true to close immediately without animation (internal).
- @example $(selector).datepick('hide') */
- hide: function(elem, immediate) {
- if (!elem) {
- return;
- }
- var inst = this._getInst(elem);
- if ($.isEmptyObject(inst)) {
- inst = elem;
- }
- if (inst && inst === plugin.curInst) {
- var showAnim = (immediate ? '' : inst.options.showAnim);
- var showSpeed = inst.options.showSpeed;
- showSpeed = (showSpeed === 'normal' && $.ui &&
- parseInt($.ui.version.substring(2)) >= 8 ? '_default' : showSpeed);
- var postProcess = function() {
- if (!inst.div) {
- return;
- }
- inst.div.remove();
- inst.div = null;
- plugin.curInst = null;
- if ($.isFunction(inst.options.onClose)) {
- inst.options.onClose.apply(elem, [inst.selectedDates]);
- }
- };
- inst.div.stop();
- if ($.effects && ($.effects[showAnim] || ($.effects.effect && $.effects.effect[showAnim]))) {
- inst.div.hide(showAnim, inst.options.showOptions, showSpeed, postProcess);
- }
- else {
- var hideAnim = (showAnim === 'slideDown' ? 'slideUp' :
- (showAnim === 'fadeIn' ? 'fadeOut' : 'hide'));
- inst.div[hideAnim]((showAnim ? showSpeed : ''), postProcess);
- }
- if (!showAnim) {
- postProcess();
- }
- }
- },
-
- /** Handle keystrokes in the datepicker.
- @memberof CalendarsPicker
- @private
- @param {KeyEvent} event The keystroke.
- @return {boolean} true if not handled, false if handled. */
- _keyDown: function(event) {
- var elem = (event.data && event.data.elem) || event.target;
- var inst = plugin._getInst(elem);
- var handled = false;
- var command;
- if (inst.inline || inst.div) {
- if (event.keyCode === 9) { // Tab - close
- plugin.hide(elem);
- }
- else if (event.keyCode === 13) { // Enter - select
- plugin.selectDate(elem,
- $('a.' + inst.options.renderer.highlightedClass, inst.div)[0]);
- handled = true;
- }
- else { // Command keystrokes
- var commands = inst.options.commands;
- for (var name in commands) {
- if (inst.options.commands.hasOwnProperty(name)) {
- command = commands[name];
- /* jshint -W018 */ // Dislikes !!
- if (command.keystroke.keyCode === event.keyCode &&
- !!command.keystroke.ctrlKey === !!(event.ctrlKey || event.metaKey) &&
- !!command.keystroke.altKey === event.altKey &&
- !!command.keystroke.shiftKey === event.shiftKey) {
- /* jshint +W018 */
- plugin.performAction(elem, name);
- handled = true;
- break;
- }
- }
- }
- }
- }
- else { // Show on 'current' keystroke
- command = inst.options.commands.current;
- /* jshint -W018 */ // Dislikes !!
- if (command.keystroke.keyCode === event.keyCode &&
- !!command.keystroke.ctrlKey === !!(event.ctrlKey || event.metaKey) &&
- !!command.keystroke.altKey === event.altKey &&
- !!command.keystroke.shiftKey === event.shiftKey) {
- /* jshint +W018 */
- plugin.show(elem);
- handled = true;
- }
- }
- inst.ctrlKey = ((event.keyCode < 48 && event.keyCode !== 32) || event.ctrlKey || event.metaKey);
- if (handled) {
- event.preventDefault();
- event.stopPropagation();
- }
- return !handled;
- },
-
- /** Filter keystrokes in the datepicker.
- @memberof CalendarsPicker
- @private
- @param {KeyEvent} event The keystroke.
- @return {boolean} true if allowed, false if not allowed. */
- _keyPress: function(event) {
- var inst = plugin._getInst((event.data && event.data.elem) || event.target);
- if (!$.isEmptyObject(inst) && inst.options.constrainInput) {
- var ch = String.fromCharCode(event.keyCode || event.charCode);
- var allowedChars = plugin._allowedChars(inst);
- return (event.metaKey || inst.ctrlKey || ch < ' ' ||
- !allowedChars || allowedChars.indexOf(ch) > -1);
- }
- return true;
- },
-
- /** Determine the set of characters allowed by the date format.
- @memberof CalendarsPicker
- @private
- @param {object} inst The current instance settings.
- @return {string} The set of allowed characters, or null if anything allowed. */
- _allowedChars: function(inst) {
- var allowedChars = (inst.options.multiSelect ? inst.options.multiSeparator :
- (inst.options.rangeSelect ? inst.options.rangeSeparator : ''));
- var literal = false;
- var hasNum = false;
- var dateFormat = inst.get('dateFormat');
- for (var i = 0; i < dateFormat.length; i++) {
- var ch = dateFormat.charAt(i);
- if (literal) {
- if (ch === '\'' && dateFormat.charAt(i + 1) !== '\'') {
- literal = false;
- }
- else {
- allowedChars += ch;
- }
- }
- else {
- switch (ch) {
- case 'd':
- case 'm':
- case 'o':
- case 'w':
- allowedChars += (hasNum ? '' : '0123456789');
- hasNum = true;
- break;
- case 'y':
- case '@':
- case '!':
- allowedChars += (hasNum ? '' : '0123456789') + '-';
- hasNum = true;
- break;
- case 'J':
- allowedChars += (hasNum ? '' : '0123456789') + '-.';
- hasNum = true;
- break;
- case 'D':
- case 'M':
- case 'Y':
- return null; // Accept anything
- case '\'':
- if (dateFormat.charAt(i + 1) === '\'') {
- allowedChars += '\'';
- }
- else {
- literal = true;
- }
- break;
- default:
- allowedChars += ch;
- }
- }
- }
- return allowedChars;
- },
-
- /** Synchronise datepicker with the field.
- @memberof CalendarsPicker
- @private
- @param {KeyEvent} event The keystroke.
- @return {boolean} true if allowed, false if not allowed. */
- _keyUp: function(event) {
- var elem = (event.data && event.data.elem) || event.target;
- var inst = plugin._getInst(elem);
- if (!$.isEmptyObject(inst) && !inst.ctrlKey && inst.lastVal !== inst.elem.val()) {
- try {
- var dates = plugin._extractDates(inst, inst.elem.val());
- if (dates.length > 0) {
- plugin.setDate(elem, dates, null, true);
- }
- }
- catch (e) {
- // Ignore
- }
- }
- return true;
- },
-
- /** Increment/decrement month/year on mouse wheel activity.
- @memberof CalendarsPicker
- @private
- @param {event} event The mouse wheel event.
- @param {number} delta The amount of change. */
- _doMouseWheel: function(event, delta) {
- var elem = (plugin.curInst && plugin.curInst.elem[0]) ||
- $(event.target).closest('.' + plugin._getMarker())[0];
- if (plugin.isDisabled(elem)) {
- return;
- }
- var inst = plugin._getInst(elem);
- if (inst.options.useMouseWheel) {
- delta = (delta < 0 ? -1 : +1);
- plugin.changeMonth(elem, -inst.options[event.ctrlKey ? 'monthsToJump' : 'monthsToStep'] * delta);
- }
- event.preventDefault();
- },
-
- /** Clear an input and close a popup datepicker.
- @memberof CalendarsPicker
- @param {Element} elem The control to use.
- @example $(selector).datepick('clear') */
- clear: function(elem) {
- var inst = this._getInst(elem);
- if (!$.isEmptyObject(inst)) {
- inst.selectedDates = [];
- this.hide(elem);
- var defaultDate = inst.get('defaultDate');
- if (inst.options.selectDefaultDate && defaultDate) {
- this.setDate(elem, (defaultDate || inst.options.calendar.today()).newDate());
- }
- else {
- this._updateInput(elem);
- }
- }
- },
-
- /** Retrieve the selected date(s) for a datepicker.
- @memberof CalendarsPicker
- @param {Element} elem The control to examine.
- @return {CDate[]} The selected date(s).
- @example var dates = $(selector).datepick('getDate') */
- getDate: function(elem) {
- var inst = this._getInst(elem);
- return (!$.isEmptyObject(inst) ? inst.selectedDates : []);
- },
-
- /** Set the selected date(s) for a datepicker.
- @memberof CalendarsPicker
- @param {Element} elem The control to examine.
- @param {CDate|number|string|array} dates The selected date(s).
- @param {CDate|number|string} [endDate] The ending date for a range.
- @param {boolean} [keyUp] true if coming from keyUp processing (internal).
- @param {boolean} [setOpt] true if coming from option processing (internal).
- @example $(selector).datepick('setDate', new Date(2014, 12-1, 25))
-$(selector).datepick('setDate', '12/25/2014', '01/01/2015')
-$(selector).datepick('setDate', [date1, date2, date3]) */
- setDate: function(elem, dates, endDate, keyUp, setOpt) {
- var inst = this._getInst(elem);
- if (!$.isEmptyObject(inst)) {
- if (!$.isArray(dates)) {
- dates = [dates];
- if (endDate) {
- dates.push(endDate);
- }
- }
- var minDate = inst.get('minDate');
- var maxDate = inst.get('maxDate');
- var curDate = inst.selectedDates[0];
- inst.selectedDates = [];
- for (var i = 0; i < dates.length; i++) {
- var date = inst.options.calendar.determineDate(
- dates[i], null, curDate, inst.get('dateFormat'), inst.getConfig());
- if (date) {
- if ((!minDate || date.compareTo(minDate) !== -1) &&
- (!maxDate || date.compareTo(maxDate) !== +1)) {
- var found = false;
- for (var j = 0; j < inst.selectedDates.length; j++) {
- if (inst.selectedDates[j].compareTo(date) === 0) {
- found = true;
- break;
- }
- }
- if (!found) {
- inst.selectedDates.push(date);
- }
- }
- }
- }
- inst.selectedDates.splice(inst.options.multiSelect ||
- (inst.options.rangeSelect ? 2 : 1), inst.selectedDates.length);
- if (inst.options.rangeSelect) {
- switch (inst.selectedDates.length) {
- case 1:
- inst.selectedDates[1] = inst.selectedDates[0];
- break;
- case 2:
- inst.selectedDates[1] = (inst.selectedDates[0].compareTo(inst.selectedDates[1]) === +1 ?
- inst.selectedDates[0] : inst.selectedDates[1]);
- break;
- }
- inst.pickingRange = false;
- }
- inst.prevDate = (inst.drawDate ? inst.drawDate.newDate() : null);
- inst.drawDate = this._checkMinMax((inst.selectedDates[0] ||
- inst.get('defaultDate') || inst.options.calendar.today()).newDate(), inst);
- if (!setOpt) {
- this._update(elem);
- this._updateInput(elem, keyUp);
- }
- }
- },
-
- /** Determine whether a date is selectable for this datepicker.
- @memberof CalendarsPicker
- @private
- @param {Element} elem The control to check.
- @param {CDate|string|number} date The date to check.
- @return {boolean} true if selectable, false if not.
- @example var selectable = $(selector).datepick('isSelectable', date) */
- isSelectable: function(elem, date) {
- var inst = this._getInst(elem);
- if ($.isEmptyObject(inst)) {
- return false;
- }
- date = inst.options.calendar.determineDate(date,
- inst.selectedDates[0] || inst.options.calendar.today(), null,
- inst.options.dateFormat, inst.getConfig());
- return this._isSelectable(elem, date, inst.options.onDate,
- inst.get('minDate'), inst.get('maxDate'));
- },
-
- /** Internally determine whether a date is selectable for this datepicker.
- @memberof CalendarsPicker
- @private
- @param {Element} elem The control to check.
- @param {CDate} date The date to check.
- @param {function|boolean} onDate Any onDate callback or callback.selectable.
- @param {CDate} minDate The minimum allowed date.
- @param {CDate} maxDate The maximum allowed date.
- @return {boolean} true if selectable, false if not. */
- _isSelectable: function(elem, date, onDate, minDate, maxDate) {
- var dateInfo = (typeof onDate === 'boolean' ? {selectable: onDate} :
- (!$.isFunction(onDate) ? {} : onDate.apply(elem, [date, true])));
- return (dateInfo.selectable !== false) &&
- (!minDate || date.toJD() >= minDate.toJD()) && (!maxDate || date.toJD() <= maxDate.toJD());
- },
-
- /** Perform a named action for a datepicker.
- @memberof CalendarsPicker
- @param {element} elem The control to affect.
- @param {string} action The name of the {@link CalendarsPicker.commands|action}.
- @example $(selector).calendarsPicker('performAction', 'next') */
- performAction: function(elem, action) {
- var inst = this._getInst(elem);
- if (!$.isEmptyObject(inst) && !this.isDisabled(elem)) {
- var commands = inst.options.commands;
- if (commands[action] && commands[action].enabled.apply(elem, [inst])) {
- commands[action].action.apply(elem, [inst]);
- }
- }
- },
-
- /** Set the currently shown month, defaulting to today's.
- @memberof CalendarsPicker
- @param {Element} elem The control to affect.
- @param {number} [year] The year to show.
- @param {number} [month] The month to show (calendar minimum month to maximum month).
- @param {number} [day] The day to show.
- @example $(selector).datepick('showMonth', 2014, 12, 25) */
- showMonth: function(elem, year, month, day) {
- var inst = this._getInst(elem);
- if (!$.isEmptyObject(inst) && ((typeof day !== 'undefined' && day !== null) ||
- inst.drawDate.year() !== year || inst.drawDate.month() !== month)) {
- inst.prevDate = inst.drawDate.newDate();
- var calendar = inst.options.calendar;
- var show = this._checkMinMax(typeof year !== 'undefined' && year !== null ?
- calendar.newDate(year, month, 1) : calendar.today(), inst);
- inst.drawDate.date(show.year(), show.month(),
- typeof day !== 'undefined' && day !== null ? day : Math.min(inst.drawDate.day(),
- calendar.daysInMonth(show.year(), show.month())));
- this._update(elem);
- }
- },
-
- /** Adjust the currently shown month.
- @memberof CalendarsPicker
- @param {Element} elem The control to affect.
- @param {number} offset The number of months to change by.
- @example $(selector).datepick('changeMonth', 2)*/
- changeMonth: function(elem, offset) {
- var inst = this._getInst(elem);
- if (!$.isEmptyObject(inst)) {
- var date = inst.drawDate.newDate().add(offset, 'm');
- this.showMonth(elem, date.year(), date.month());
- }
- },
-
- /** Adjust the currently shown day.
- @memberof CalendarsPicker
- @param {Element} elem The control to affect.
- @param {number} offset The number of days to change by.
- @example $(selector).datepick('changeDay', 7)*/
- changeDay: function(elem, offset) {
- var inst = this._getInst(elem);
- if (!$.isEmptyObject(inst)) {
- var date = inst.drawDate.newDate().add(offset, 'd');
- this.showMonth(elem, date.year(), date.month(), date.day());
- }
- },
-
- /** Restrict a date to the minimum/maximum specified.
- @memberof CalendarsPicker
- @private
- @param {CDate} date The date to check.
- @param {object} inst The current instance settings. */
- _checkMinMax: function(date, inst) {
- var minDate = inst.get('minDate');
- var maxDate = inst.get('maxDate');
- date = (minDate && date.compareTo(minDate) === -1 ? minDate.newDate() : date);
- date = (maxDate && date.compareTo(maxDate) === +1 ? maxDate.newDate() : date);
- return date;
- },
-
- /** Retrieve the date associated with an entry in the datepicker.
- @memberof CalendarsPicker
- @param {Element} elem The control to examine.
- @param {Element} target The selected datepicker element.
- @return {CDate} The corresponding date, or null.
- @example var date = $(selector).datepick('retrieveDate',
- $('div.datepick-popup a:contains(10)')[0]) */
- retrieveDate: function(elem, target) {
- var inst = this._getInst(elem);
- return ($.isEmptyObject(inst) ? null : inst.options.calendar.fromJD(
- parseFloat(target.className.replace(/^.*jd(\d+\.5).*$/, '$1'))));
- },
-
- /** Select a date for this datepicker.
- @memberof CalendarsPicker
- @param {Element} elem The control to examine.
- @param {Element} target The selected datepicker element.
- @example $(selector).datepick('selectDate', $('div.datepick-popup a:contains(10)')[0]) */
- selectDate: function(elem, target) {
- var inst = this._getInst(elem);
- if (!$.isEmptyObject(inst) && !this.isDisabled(elem)) {
- var date = this.retrieveDate(elem, target);
- if (inst.options.multiSelect) {
- var found = false;
- for (var i = 0; i < inst.selectedDates.length; i++) {
- if (date.compareTo(inst.selectedDates[i]) === 0) {
- inst.selectedDates.splice(i, 1);
- found = true;
- break;
- }
- }
- if (!found && inst.selectedDates.length < inst.options.multiSelect) {
- inst.selectedDates.push(date);
- }
- }
- else if (inst.options.rangeSelect) {
- if (inst.pickingRange) {
- inst.selectedDates[1] = date;
- }
- else {
- inst.selectedDates = [date, date];
- }
- inst.pickingRange = !inst.pickingRange;
- }
- else {
- inst.selectedDates = [date];
- }
- inst.prevDate = inst.drawDate = date.newDate();
- this._updateInput(elem);
- if (inst.inline || inst.pickingRange || inst.selectedDates.length <
- (inst.options.multiSelect || (inst.options.rangeSelect ? 2 : 1))) {
- this._update(elem);
- }
- else {
- this.hide(elem);
- }
- }
- },
-
- /** Generate the datepicker content for this control.
- @memberof CalendarsPicker
- @private
- @param {Element} elem The control to affect.
- @param {object} inst The current instance settings.
- @return {jQuery} The datepicker content */
- _generateContent: function(elem, inst) {
- var monthsToShow = inst.options.monthsToShow;
- monthsToShow = ($.isArray(monthsToShow) ? monthsToShow : [1, monthsToShow]);
- inst.drawDate = this._checkMinMax(
- inst.drawDate || inst.get('defaultDate') || inst.options.calendar.today(), inst);
- var drawDate = inst.drawDate.newDate().add(-inst.options.monthsOffset, 'm');
- // Generate months
- var monthRows = '';
- for (var row = 0; row < monthsToShow[0]; row++) {
- var months = '';
- for (var col = 0; col < monthsToShow[1]; col++) {
- months += this._generateMonth(elem, inst, drawDate.year(),
- drawDate.month(), inst.options.calendar, inst.options.renderer, (row === 0 && col === 0));
- drawDate.add(1, 'm');
- }
- monthRows += this._prepare(inst.options.renderer.monthRow, inst).replace(/\{months\}/, months);
- }
- var picker = this._prepare(inst.options.renderer.picker, inst).replace(/\{months\}/, monthRows).
- replace(/\{weekHeader\}/g, this._generateDayHeaders(inst, inst.options.calendar, inst.options.renderer));
- // Add commands
- var addCommand = function(type, open, close, name, classes) {
- if (picker.indexOf('{' + type + ':' + name + '}') === -1) {
- return;
- }
- var command = inst.options.commands[name];
- var date = (inst.options.commandsAsDateFormat ? command.date.apply(elem, [inst]) : null);
- picker = picker.replace(new RegExp('\\{' + type + ':' + name + '\\}', 'g'),
- '<' + open + (command.status ? ' title="' + inst.options[command.status] + '"' : '') +
- ' class="' + inst.options.renderer.commandClass + ' ' +
- inst.options.renderer.commandClass + '-' + name + ' ' + classes +
- (command.enabled(inst) ? '' : ' ' + inst.options.renderer.disabledClass) + '">' +
- (date ? date.formatDate(inst.options[command.text], {localNumbers: inst.options.localNumbers}) :
- inst.options[command.text]) + '' + close + '>');
- };
- for (var name in inst.options.commands) {
- if (inst.options.commands.hasOwnProperty(name)) {
- addCommand('button', 'button type="button"', 'button', name,
- inst.options.renderer.commandButtonClass);
- addCommand('link', 'a href="javascript:void(0)"', 'a', name,
- inst.options.renderer.commandLinkClass);
- }
- }
- picker = $(picker);
- if (monthsToShow[1] > 1) {
- var count = 0;
- $(inst.options.renderer.monthSelector, picker).each(function() {
- var nth = ++count % monthsToShow[1];
- $(this).addClass(nth === 1 ? 'first' : (nth === 0 ? 'last' : ''));
- });
- }
- // Add datepicker behaviour
- var self = this;
- function removeHighlight(elem) {
- (inst.inline ? $(elem).closest('.' + self._getMarker()) : inst.div).
- find(inst.options.renderer.daySelector + ' a').
- removeClass(inst.options.renderer.highlightedClass);
- }
- picker.find(inst.options.renderer.daySelector + ' a').hover(
- function() {
- removeHighlight(this);
- $(this).addClass(inst.options.renderer.highlightedClass);
- },
- function() {
- removeHighlight(this);
- }).
- click(function() {
- self.selectDate(elem, this);
- }).end().
- find('select.' + this._monthYearClass + ':not(.' + this._anyYearClass + ')').
- change(function() {
- var monthYear = $(this).val().split('/');
- self.showMonth(elem, parseInt(monthYear[1], 10), parseInt(monthYear[0], 10));
- }).end().
- find('select.' + this._anyYearClass).click(function() {
- $(this).css('visibility', 'hidden').
- next('input').css({left: this.offsetLeft, top: this.offsetTop,
- width: this.offsetWidth, height: this.offsetHeight}).show().focus();
- }).end().
- find('input.' + self._monthYearClass).change(function() {
- try {
- var year = parseInt($(this).val(), 10);
- year = (isNaN(year) ? inst.drawDate.year() : year);
- self.showMonth(elem, year, inst.drawDate.month(), inst.drawDate.day());
- }
- catch (e) {
- // Ignore
- }
- }).keydown(function(event) {
- if (event.keyCode === 13) { // Enter
- $(event.elem).change();
- }
- else if (event.keyCode === 27) { // Escape
- $(event.elem).hide().prev('select').css('visibility', 'visible');
- inst.elem.focus();
- }
- });
- // Add keyboard handling
- var data = {elem: inst.elem[0]};
- picker.keydown(data, this._keyDown).keypress(data, this._keyPress).keyup(data, this._keyUp);
- // Add command behaviour
- picker.find('.' + inst.options.renderer.commandClass).click(function() {
- if (!$(this).hasClass(inst.options.renderer.disabledClass)) {
- var action = this.className.replace(
- new RegExp('^.*' + inst.options.renderer.commandClass + '-([^ ]+).*$'), '$1');
- plugin.performAction(elem, action);
- }
- });
- // Add classes
- if (inst.options.isRTL) {
- picker.addClass(inst.options.renderer.rtlClass);
- }
- if (monthsToShow[0] * monthsToShow[1] > 1) {
- picker.addClass(inst.options.renderer.multiClass);
- }
- if (inst.options.pickerClass) {
- picker.addClass(inst.options.pickerClass);
- }
- // Resize
- $('body').append(picker);
- var width = 0;
- picker.find(inst.options.renderer.monthSelector).each(function() {
- width += $(this).outerWidth();
- });
- picker.width(width / monthsToShow[0]);
- // Pre-show customisation
- if ($.isFunction(inst.options.onShow)) {
- inst.options.onShow.apply(elem, [picker, inst.options.calendar, inst]);
- }
- return picker;
- },
-
- /** Generate the content for a single month.
- @memberof CalendarsPicker
- @private
- @param {Element} elem The control to affect.
- @param {object} inst The current instance settings.
- @param {number} year The year to generate.
- @param {number} month The month to generate.
- @param {BaseCalendar} calendar The current calendar.
- @param {object} renderer The rendering templates.
- @param {boolean} first true if first of multiple months.
- @return {string} The month content. */
- _generateMonth: function(elem, inst, year, month, calendar, renderer, first) {
- var daysInMonth = calendar.daysInMonth(year, month);
- var monthsToShow = inst.options.monthsToShow;
- monthsToShow = ($.isArray(monthsToShow) ? monthsToShow : [1, monthsToShow]);
- var fixedWeeks = inst.options.fixedWeeks || (monthsToShow[0] * monthsToShow[1] > 1);
- var firstDay = inst.options.firstDay;
- firstDay = (typeof firstDay === 'undefined' || firstDay === null ? calendar.local.firstDay : firstDay);
- var leadDays = (calendar.dayOfWeek(year, month, calendar.minDay) -
- firstDay + calendar.daysInWeek()) % calendar.daysInWeek();
- var numWeeks = (fixedWeeks ? 6 : Math.ceil((leadDays + daysInMonth) / calendar.daysInWeek()));
- var selectOtherMonths = inst.options.selectOtherMonths && inst.options.showOtherMonths;
- var minDate = (inst.pickingRange ? inst.selectedDates[0] : inst.get('minDate'));
- var maxDate = inst.get('maxDate');
- var showWeeks = renderer.week.indexOf('{weekOfYear}') > -1;
- var today = calendar.today();
- var drawDate = calendar.newDate(year, month, calendar.minDay);
- drawDate.add(-leadDays - (fixedWeeks &&
- (drawDate.dayOfWeek() === firstDay || drawDate.daysInMonth() < calendar.daysInWeek())?
- calendar.daysInWeek() : 0), 'd');
- var jd = drawDate.toJD();
- // Localise numbers if requested and available
- var localiseNumbers = function(value) {
- return (inst.options.localNumbers && calendar.local.digits ? calendar.local.digits(value) : value);
- };
- // Generate weeks
- var weeks = '';
- for (var week = 0; week < numWeeks; week++) {
- var weekOfYear = (!showWeeks ? '' : '' +
- ($.isFunction(inst.options.calculateWeek) ?
- inst.options.calculateWeek(drawDate) : drawDate.weekOfYear()) + '');
- var days = '';
- for (var day = 0; day < calendar.daysInWeek(); day++) {
- var selected = false;
- if (inst.options.rangeSelect && inst.selectedDates.length > 0) {
- selected = drawDate.compareTo(inst.selectedDates[0]) !== -1 &&
- drawDate.compareTo(inst.selectedDates[1]) !== +1;
- }
- else {
- for (var i = 0; i < inst.selectedDates.length; i++) {
- if (inst.selectedDates[i].compareTo(drawDate) === 0) {
- selected = true;
- break;
- }
- }
- }
- var dateInfo = (!$.isFunction(inst.options.onDate) ? {} :
- inst.options.onDate.apply(elem, [drawDate, drawDate.month() === month]));
- var selectable = (selectOtherMonths || drawDate.month() === month) &&
- this._isSelectable(elem, drawDate, dateInfo.selectable, minDate, maxDate);
- days += this._prepare(renderer.day, inst).replace(/\{day\}/g,
- (selectable ? '' +
- (inst.options.showOtherMonths || drawDate.month() === month ?
- dateInfo.content || localiseNumbers(drawDate.day()) : ' ') +
- (selectable ? '' : ''));
- drawDate.add(1, 'd');
- jd++;
- }
- weeks += this._prepare(renderer.week, inst).replace(/\{days\}/g, days).
- replace(/\{weekOfYear\}/g, weekOfYear);
- }
- var monthHeader = this._prepare(renderer.month, inst).match(/\{monthHeader(:[^\}]+)?\}/);
- monthHeader = (monthHeader[0].length <= 13 ? 'MM yyyy' :
- monthHeader[0].substring(13, monthHeader[0].length - 1));
- monthHeader = (first ? this._generateMonthSelection(
- inst, year, month, minDate, maxDate, monthHeader, calendar, renderer) :
- calendar.formatDate(monthHeader, calendar.newDate(year, month, calendar.minDay),
- {localNumbers: inst.options.localNumbers}));
- var weekHeader = this._prepare(renderer.weekHeader, inst).
- replace(/\{days\}/g, this._generateDayHeaders(inst, calendar, renderer));
- return this._prepare(renderer.month, inst).replace(/\{monthHeader(:[^\}]+)?\}/g, monthHeader).
- replace(/\{weekHeader\}/g, weekHeader).replace(/\{weeks\}/g, weeks);
- },
-
- /** Generate the HTML for the day headers.
- @memberof CalendarsPicker
- @private
- @param {object} inst The current instance settings.
- @param {BaseCalendar} calendar The current calendar.
- @param {object} renderer The rendering templates.
- @return {string} A week's worth of day headers. */
- _generateDayHeaders: function(inst, calendar, renderer) {
- var firstDay = inst.options.firstDay;
- firstDay = (typeof firstDay === 'undefined' || firstDay === null ? calendar.local.firstDay : firstDay);
- var header = '';
- for (var day = 0; day < calendar.daysInWeek(); day++) {
- var dow = (day + firstDay) % calendar.daysInWeek();
- header += this._prepare(renderer.dayHeader, inst).replace(/\{day\}/g,
- '' + calendar.local.dayNamesMin[dow] + '');
- }
- return header;
- },
-
- /** Generate the selection controls for a month.
- @memberof CalendarsPicker
- @private
- @param {object} inst The current instance settings.
- @param {number} year The year to generate.
- @param {number} month The month to generate.
- @param {CDate} minDate The minimum date allowed.
- @param {CDate} maxDate The maximum date allowed.
- @param {string} monthHeader The month/year format.
- @param {BaseCalendar} calendar The current calendar.
- @return {string} The month selection content. */
- _generateMonthSelection: function(inst, year, month, minDate, maxDate, monthHeader, calendar) {
- if (!inst.options.changeMonth) {
- return calendar.formatDate(monthHeader, calendar.newDate(year, month, 1),
- {localNumbers: inst.options.localNumbers});
- }
- // Months
- var monthNames = calendar.local[
- 'monthNames' + (monthHeader.match(/mm/i) ? '' : 'Short')];
- var html = monthHeader.replace(/m+/i, '\\x2E').replace(/y+/i, '\\x2F');
- var selector = '';
- html = html.replace(/\\x2E/, selector);
- // Years
- var localiseNumbers = function(value) {
- return (inst.options.localNumbers && calendar.local.digits ? calendar.local.digits(value) : value);
- };
- var yearRange = inst.options.yearRange;
- if (yearRange === 'any') {
- selector = '' +
- '';
- }
- else {
- yearRange = yearRange.split(':');
- var todayYear = calendar.today().year();
- var start = (yearRange[0].match('c[+-].*') ? year + parseInt(yearRange[0].substring(1), 10) :
- ((yearRange[0].match('[+-].*') ? todayYear : 0) + parseInt(yearRange[0], 10)));
- var end = (yearRange[1].match('c[+-].*') ? year + parseInt(yearRange[1].substring(1), 10) :
- ((yearRange[1].match('[+-].*') ? todayYear : 0) + parseInt(yearRange[1], 10)));
- selector = '';
- }
- html = html.replace(/\\x2F/, selector);
- return html;
- },
-
- /** Prepare a render template for use.
- Exclude popup/inline sections that are not applicable.
- Localise text of the form: {l10n:name}.
- @memberof CalendarsPicker
- @private
- @param {string} text The text to localise.
- @param {object} inst The current instance settings.
- @return {string} The localised text. */
- _prepare: function(text, inst) {
- var replaceSection = function(type, retain) {
- while (true) {
- var start = text.indexOf('{' + type + ':start}');
- if (start === -1) {
- return;
- }
- var end = text.substring(start).indexOf('{' + type + ':end}');
- if (end > -1) {
- text = text.substring(0, start) +
- (retain ? text.substr(start + type.length + 8, end - type.length - 8) : '') +
- text.substring(start + end + type.length + 6);
- }
- }
- };
- replaceSection('inline', inst.inline);
- replaceSection('popup', !inst.inline);
- var pattern = /\{l10n:([^\}]+)\}/;
- var matches = pattern.exec(text);
- while (matches) {
- text = text.replace(matches[0], inst.options[matches[1]]);
- matches = pattern.exec(text);
- }
- return text;
- }
- });
-
- var plugin = $.calendarsPicker; // Singleton instance
-
- $(function() {
- $(document).on('mousedown.' + pluginName, plugin._checkExternalClick).
- on('resize.' + pluginName, function() { plugin.hide(plugin.curInst); });
- });
-
-})(jQuery);
diff --git a/odex25_ensan/odex_benefit/static/src/js/jquery.calendars.plus.js b/odex25_ensan/odex_benefit/static/src/js/jquery.calendars.plus.js
deleted file mode 100644
index f3014705e..000000000
--- a/odex25_ensan/odex_benefit/static/src/js/jquery.calendars.plus.js
+++ /dev/null
@@ -1,463 +0,0 @@
-/* http://keith-wood.name/calendars.html
- Calendars extras for jQuery v2.1.0.
- Written by Keith Wood (wood.keith{at}optusnet.com.au) August 2009.
- Available under the MIT (http://keith-wood.name/licence.html) license.
- Please attribute the author if you use it. */
-
-(function($) { // Hide scope, no $ conflict
- 'use strict';
-
- $.extend($.calendars.regionalOptions[''], {
- invalidArguments: 'Invalid arguments',
- invalidFormat: 'Cannot format a date from another calendar',
- missingNumberAt: 'Missing number at position {0}',
- unknownNameAt: 'Unknown name at position {0}',
- unexpectedLiteralAt: 'Unexpected literal at position {0}',
- unexpectedText: 'Additional text found at end'
- });
- $.calendars.local = $.calendars.regionalOptions[''];
-
- $.extend($.calendars.cdate.prototype, {
-
- /** Format this date.
- Found in the jquery.calendars.plus.js module.
- @memberof CDate
- @param {string} [format] The date format to use (see {@linkcode BaseCalendar.formatDate|formatDate}).
- @param {object} [settings] Options for the formatDate function.
- @return {string} The formatted date. */
- formatDate: function(format, settings) {
- if (typeof format !== 'string') {
- settings = format;
- format = '';
- }
- return this._calendar.formatDate(format || '', this, settings);
- }
- });
-
- $.extend($.calendars.baseCalendar.prototype, {
-
- UNIX_EPOCH: $.calendars.instance().newDate(1970, 1, 1).toJD(),
- SECS_PER_DAY: 24 * 60 * 60,
- TICKS_EPOCH: $.calendars.instance().jdEpoch, // 1 January 0001 CE
- TICKS_PER_DAY: 24 * 60 * 60 * 10000000,
-
- /** Date format for ATOM (RFC 3339/ISO 8601) - 'yyyy-mm-dd'.
- @memberof BaseCalendar */
- ATOM: 'yyyy-mm-dd',
- /** Date format for cookies - 'D, dd M yyyy'.
- @memberof BaseCalendar */
- COOKIE: 'D, dd M yyyy',
- /** Date format for the full date - 'DD, MM d, yyyy'.
- @memberof BaseCalendar */
- FULL: 'DD, MM d, yyyy',
- /** Date format for ISO 8601 - 'yyyy-mm-dd'.
- @memberof BaseCalendar */
- ISO_8601: 'yyyy-mm-dd',
- /** Date format for Julian date - days since January 1, 4713 BCE Greenwich noon.
- @memberof BaseCalendar */
- JULIAN: 'J',
- /** Date format for RFC 822 - 'D, d M yy'.
- @memberof BaseCalendar */
- RFC_822: 'D, d M yy',
- /** Date format for RFC 850 - 'DD, dd-M-yy'.
- @memberof BaseCalendar */
- RFC_850: 'DD, dd-M-yy',
- /** Date format for RFC 1036 - 'D, d M yy'.
- @memberof BaseCalendar */
- RFC_1036: 'D, d M yy',
- /** Date format for RFC 1123 - 'D, d M yyyy'.
- @memberof BaseCalendar */
- RFC_1123: 'D, d M yyyy',
- /** Date format for RFC 2822 - 'D, d M yyyy'.
- @memberof BaseCalendar */
- RFC_2822: 'D, d M yyyy',
- /** Date format for RSS (RFC 822) - 'D, d M yy'.
- @memberof BaseCalendar */
- RSS: 'D, d M yy',
- /** Date format for Windows ticks - number of 100-nanosecond ticks since 1 January 0001 00:00:00 UTC.
- @memberof BaseCalendar */
- TICKS: '!',
- /** Date format for Unix timestamp - number of seconds elapsed since the
- start of the Unix epoch at 1 January 1970 00:00:00 UTC.
- @memberof BaseCalendar */
- TIMESTAMP: '@',
- /** Date format for W3C (ISO 8601) - 'yyyy-mm-dd'.
- @memberof BaseCalendar */
- W3C: 'yyyy-mm-dd',
-
- /** Format a date object into a string value.
- The format can be combinations of the following:
-
-
- Found in the jquery.calendars.plus.js module.
- @memberof BaseCalendar
- @param {string} [format] The desired format of the date (defaults to calendar format).
- @param {CDate} date The date value to format.
- @param {object} [settings] Addition options, whose attributes include:
- @param {string[]} [settings.dayNamesShort] Abbreviated names of the days from day 0 (Sunday).
- @param {string[]} [settings.dayNames] Names of the days from day 0 (Sunday).
- @param {string[]} [settings.monthNamesShort] Abbreviated names of the months.
- @param {string[]} [settings.monthNames] Names of the months.
- @param {boolean} [settings.localNumbers=false] true to localise numbers (if available),
- false to use normal Arabic numerals.
- @return {string} The date in the above format.
- @throws Errors if the date is from a different calendar. */
- formatDate: function(format, date, settings) {
- if (typeof format !== 'string') {
- settings = date;
- date = format;
- format = '';
- }
- if (!date) {
- return '';
- }
- if (date.calendar() !== this) {
- throw $.calendars.local.invalidFormat || $.calendars.regionalOptions[''].invalidFormat;
- }
- format = format || this.local.dateFormat;
- settings = settings || {};
- var dayNamesShort = settings.dayNamesShort || this.local.dayNamesShort;
- var dayNames = settings.dayNames || this.local.dayNames;
- var monthNamesShort = settings.monthNamesShort || this.local.monthNamesShort;
- var monthNames = settings.monthNames || this.local.monthNames;
- var localNumbers = settings.localNumbers || this.local.localNumbers;
- // Check whether a format character is doubled
- var doubled = function(match, step) {
- var matches = 1;
- while (iFormat + matches < format.length && format.charAt(iFormat + matches) === match) {
- matches++;
- }
- iFormat += matches - 1;
- return Math.floor(matches / (step || 1)) > 1;
- };
- // Format a number, with leading zeroes if necessary
- var formatNumber = function(match, value, len, step) {
- var num = '' + value;
- if (doubled(match, step)) {
- while (num.length < len) {
- num = '0' + num;
- }
- }
- return num;
- };
- // Format a name, short or long as requested
- var formatName = function(match, value, shortNames, longNames) {
- return (doubled(match) ? longNames[value] : shortNames[value]);
- };
- // Localise numbers if requested and available
- var localiseNumbers = localNumbers && this.local.digits ?
- this.local.digits : function(value) { return value; };
- var output = '';
- var literal = false;
- for (var iFormat = 0; iFormat < format.length; iFormat++) {
- if (literal) {
- if (format.charAt(iFormat) === '\'' && !doubled('\'')) {
- literal = false;
- }
- else {
- output += format.charAt(iFormat);
- }
- }
- else {
- switch (format.charAt(iFormat)) {
- case 'd':
- output += localiseNumbers(formatNumber('d', date.day(), 2));
- break;
- case 'D':
- output += formatName('D', date.dayOfWeek(), dayNamesShort, dayNames);
- break;
- case 'o':
- output += formatNumber('o', date.dayOfYear(), 3);
- break;
- case 'w':
- output += formatNumber('w', date.weekOfYear(), 2);
- break;
- case 'm':
- output += localiseNumbers(formatNumber('m', date.month(), 2));
- break;
- case 'M':
- output += formatName('M', date.month() - this.minMonth, monthNamesShort, monthNames);
- break;
- case 'y':
- output += localiseNumbers(doubled('y', 2) ? date.year() :
- (date.year() % 100 < 10 ? '0' : '') + date.year() % 100);
- break;
- case 'Y':
- doubled('Y', 2);
- output += date.formatYear();
- break;
- case 'J':
- output += date.toJD();
- break;
- case '@':
- output += (date.toJD() - this.UNIX_EPOCH) * this.SECS_PER_DAY;
- break;
- case '!':
- output += (date.toJD() - this.TICKS_EPOCH) * this.TICKS_PER_DAY;
- break;
- case '\'':
- if (doubled('\'')) {
- output += '\'';
- }
- else {
- literal = true;
- }
- break;
- default:
- output += format.charAt(iFormat);
- }
- }
- }
- return output;
- },
-
- /** Parse a string value into a date object.
- See {@linkcode BaseCalendar.formatDate|formatDate} for the possible formats, plus:
-
-
- Found in the jquery.calendars.plus.js module.
- @memberof BaseCalendar
- @param {string} format The expected format of the date ('' for default calendar format).
- @param {string} value The date in the above format.
- @param {object} [settings] Additional options whose attributes include:
- @param {number} [settings.shortYearCutoff] The cutoff year for determining the century.
- @param {string[]} [settings.dayNamesShort] Abbreviated names of the days from day 0 (Sunday).
- @param {string[]} [settings.dayNames] Names of the days from day 0 (Sunday).
- @param {string[]} [settings.monthNamesShort] Abbreviated names of the months.
- @param {string[]} [settings.monthNames] Names of the months.
- @return {CDate} The extracted date value or null if value is blank.
- @throws Errors if the format and/or value are missing,
- if the value doesn't match the format, or if the date is invalid. */
- parseDate: function(format, value, settings) {
- if (typeof value === 'undefined' || value === null) {
- throw $.calendars.local.invalidArguments || $.calendars.regionalOptions[''].invalidArguments;
- }
- value = (typeof value === 'object' ? value.toString() : value + '');
- if (value === '') {
- return null;
- }
- format = format || this.local.dateFormat;
- settings = settings || {};
- var shortYearCutoff = settings.shortYearCutoff || this.shortYearCutoff;
- shortYearCutoff = (typeof shortYearCutoff !== 'string' ? shortYearCutoff :
- this.today().year() % 100 + parseInt(shortYearCutoff, 10));
- var dayNamesShort = settings.dayNamesShort || this.local.dayNamesShort;
- var dayNames = settings.dayNames || this.local.dayNames;
- var monthNamesShort = settings.monthNamesShort || this.local.monthNamesShort;
- var monthNames = settings.monthNames || this.local.monthNames;
- var jd = -1;
- var year = -1;
- var month = -1;
- var day = -1;
- var doy = -1;
- var shortYear = false;
- var literal = false;
- // Check whether a format character is doubled
- var doubled = function(match, step) {
- var matches = 1;
- while (iFormat + matches < format.length && format.charAt(iFormat + matches) === match) {
- matches++;
- }
- iFormat += matches - 1;
- return Math.floor(matches / (step || 1)) > 1;
- };
- // Extract a number from the string value
- var getNumber = function(match, step) {
- var isDoubled = doubled(match, step);
- var size = [2, 3, isDoubled ? 4 : 2, isDoubled ? 4 : 2, 10, 11, 20]['oyYJ@!'.indexOf(match) + 1];
- var digits = new RegExp('^-?\\d{1,' + size + '}');
- var num = value.substring(iValue).match(digits);
- if (!num) {
- throw ($.calendars.local.missingNumberAt || $.calendars.regionalOptions[''].missingNumberAt).
- replace(/\{0\}/, iValue);
- }
- iValue += num[0].length;
- return parseInt(num[0], 10);
- };
- // Extract a name from the string value and convert to an index
- var calendar = this;
- var getName = function(match, shortNames, longNames, step) {
- var names = (doubled(match, step) ? longNames : shortNames);
- for (var i = 0; i < names.length; i++) {
- if (value.substr(iValue, names[i].length).toLowerCase() === names[i].toLowerCase()) {
- iValue += names[i].length;
- return i + calendar.minMonth;
- }
- }
- throw ($.calendars.local.unknownNameAt || $.calendars.regionalOptions[''].unknownNameAt).
- replace(/\{0\}/, iValue);
- };
- // Confirm that a literal character matches the string value
- var checkLiteral = function() {
- if (value.charAt(iValue) !== format.charAt(iFormat)) {
- throw ($.calendars.local.unexpectedLiteralAt ||
- $.calendars.regionalOptions[''].unexpectedLiteralAt).replace(/\{0\}/, iValue);
- }
- iValue++;
- };
- var iValue = 0;
- for (var iFormat = 0; iFormat < format.length; iFormat++) {
- if (literal) {
- if (format.charAt(iFormat) === '\'' && !doubled('\'')) {
- literal = false;
- }
- else {
- checkLiteral();
- }
- }
- else {
- switch (format.charAt(iFormat)) {
- case 'd':
- day = getNumber('d');
- break;
- case 'D':
- getName('D', dayNamesShort, dayNames);
- break;
- case 'o':
- doy = getNumber('o');
- break;
- case 'w':
- getNumber('w');
- break;
- case 'm':
- month = getNumber('m');
- break;
- case 'M':
- month = getName('M', monthNamesShort, monthNames);
- break;
- case 'y':
- var iSave = iFormat;
- shortYear = !doubled('y', 2);
- iFormat = iSave;
- year = getNumber('y', 2);
- break;
- case 'Y':
- year = getNumber('Y', 2);
- break;
- case 'J':
- jd = getNumber('J') + 0.5;
- if (value.charAt(iValue) === '.') {
- iValue++;
- getNumber('J');
- }
- break;
- case '@':
- jd = getNumber('@') / this.SECS_PER_DAY + this.UNIX_EPOCH;
- break;
- case '!':
- jd = getNumber('!') / this.TICKS_PER_DAY + this.TICKS_EPOCH;
- break;
- case '*':
- iValue = value.length;
- break;
- case '\'':
- if (doubled('\'')) {
- checkLiteral();
- }
- else {
- literal = true;
- }
- break;
- default:
- checkLiteral();
- }
- }
- }
- if (iValue < value.length) {
- throw $.calendars.local.unexpectedText || $.calendars.regionalOptions[''].unexpectedText;
- }
- if (year === -1) {
- year = this.today().year();
- }
- else if (year < 100 && shortYear) {
- year += (shortYearCutoff === -1 ? 1900 : this.today().year() -
- this.today().year() % 100 - (year <= shortYearCutoff ? 0 : 100));
- }
- if (doy > -1) {
- month = 1;
- day = doy;
- for (var dim = this.daysInMonth(year, month); day > dim; dim = this.daysInMonth(year, month)) {
- month++;
- day -= dim;
- }
- }
- return (jd > -1 ? this.fromJD(jd) : this.newDate(year, month, day));
- },
-
- /** A date may be specified as an exact value or a relative one.
- Found in the jquery.calendars.plus.js module.
- @memberof BaseCalendar
- @param {CDate|number|string} dateSpec The date as an object or string in the given format or
- an offset - numeric days from today, or string amounts and periods, e.g. '+1m +2w'.
- @param {CDate} defaultDate The date to use if no other supplied, may be null.
- @param {CDate} [currentDate=null] The current date as a possible basis for relative dates,
- if null today is used.
- @param {string} [dateFormat] The expected date format -
- see {@linkcode BaseCalendar.formatDate|formatDate}. Use '' for the calendar default format.
- @param {object} [settings] Additional options whose attributes include:
- @param {number} [settings.shortYearCutoff] The cutoff year for determining the century.
- @param {string[]} [settings.dayNamesShort] Abbreviated names of the days from day 0 (Sunday).
- @param {string[]} [settings.dayNames] Names of the days from day 0 (Sunday).
- @param {string[]} [settings.monthNamesShort] Abbreviated names of the months.
- @param {string[]} [settings.monthNames] Names of the months.
- @return {CDate} The decoded date. */
- determineDate: function(dateSpec, defaultDate, currentDate, dateFormat, settings) {
- if (currentDate && typeof currentDate !== 'object') {
- settings = dateFormat;
- dateFormat = currentDate;
- currentDate = null;
- }
- if (typeof dateFormat !== 'string') {
- settings = dateFormat;
- dateFormat = '';
- }
- var calendar = this;
- var offsetString = function(offset) {
- try {
- return calendar.parseDate(dateFormat, offset, settings);
- }
- catch (e) {
- // Ignore
- }
- offset = offset.toLowerCase();
- var date = (offset.match(/^c/) && currentDate ?
- currentDate.newDate() : null) || calendar.today();
- var pattern = /([+-]?[0-9]+)\s*(d|w|m|y)?/g;
- var matches = pattern.exec(offset);
- while (matches) {
- date.add(parseInt(matches[1], 10), matches[2] || 'd');
- matches = pattern.exec(offset);
- }
- return date;
- };
- defaultDate = (defaultDate ? defaultDate.newDate() : null);
- dateSpec = (typeof dateSpec === 'undefined' || dateSpec === null ? defaultDate :
- (typeof dateSpec === 'string' ? offsetString(dateSpec) : (typeof dateSpec === 'number' ?
- (isNaN(dateSpec) || dateSpec === Infinity || dateSpec === -Infinity ? defaultDate :
- calendar.today().add(dateSpec, 'd')) : calendar.newDate(dateSpec))));
- return dateSpec;
- }
- });
-
-})(jQuery);
diff --git a/odex25_ensan/odex_benefit/static/src/js/jquery.calendars.ummalqura.js b/odex25_ensan/odex_benefit/static/src/js/jquery.calendars.ummalqura.js
deleted file mode 100644
index d43dc18cf..000000000
--- a/odex25_ensan/odex_benefit/static/src/js/jquery.calendars.ummalqura.js
+++ /dev/null
@@ -1,355 +0,0 @@
-/* http://keith-wood.name/calendars.html
- UmmAlQura calendar for jQuery v2.1.0.
- Written by Amro Osama March 2013.
- Modified by Binnooh.com & www.elm.sa - 2014 - Added dates back to 1276 Hijri year.
- Available under the MIT (http://keith-wood.name/licence.html) license.
- Please attribute the author if you use it. */
-
-(function ($) { // Hide scope, no $ conflict
- 'use strict';
-
- /** Implementation of the UmmAlQura or 'saudi' calendar.
- See also http://en.wikipedia.org/wiki/Islamic_calendar#Saudi_Arabia.27s_Umm_al-Qura_calendar.
- http://www.ummulqura.org.sa/About.aspx
- http://www.staff.science.uu.nl/~gent0113/islam/ummalqura.htm
- @class UmmAlQuraCalendar
- @param {string} [language=''] The language code (default English) for localisation. */
- function UmmAlQuraCalendar(language) {
- this.local = this.regionalOptions[language || ''] || this.regionalOptions[''];
- }
-
- UmmAlQuraCalendar.prototype = new $.calendars.baseCalendar();
-
- $.extend(UmmAlQuraCalendar.prototype, {
- /** The calendar name.
- @memberof UmmAlQuraCalendar */
- name: 'UmmAlQura',
- //jdEpoch: 1948440, // Julian date of start of UmmAlQura epoch: 14 March 1937 CE
- //daysPerMonth: // Days per month in a common year, replaced by a method.
- /** true if has a year zero, false if not.
- @memberof UmmAlQuraCalendar */
- hasYearZero: false,
- /** The minimum month number.
- @memberof UmmAlQuraCalendar */
- minMonth: 1,
- /** The first month in the year.
- @memberof UmmAlQuraCalendar */
- firstMonth: 1,
- /** The minimum day number.
- @memberof UmmAlQuraCalendar */
- minDay: 1,
-
- /** Localisations for the plugin.
- Entries are objects indexed by the language code ('' being the default US/English).
- Each object has the following attributes.
- @memberof UmmAlQuraCalendar
- @property {string} name The calendar name.
- @property {string[]} epochs The epoch names (before/after year 0).
- @property {string[]} monthNames The long names of the months of the year.
- @property {string[]} monthNamesShort The short names of the months of the year.
- @property {string[]} dayNames The long names of the days of the week.
- @property {string[]} dayNamesShort The short names of the days of the week.
- @property {string[]} dayNamesMin The minimal names of the days of the week.
- @property {string} dateFormat The date format for this calendar.
- See the options on formatDate for details.
- @property {number} firstDay The number of the first day of the week, starting at 0.
- @property {boolean} isRTL true if this localisation reads right-to-left. */
- regionalOptions: { // Localisations
- '': {
- name: 'Umm al-Qura',
- epochs: ['BH', 'AH'],
- monthNames: 'محرم_صفر_ربيع الأول_ربيع الثاني_جمادى الأول_جمادى الآخر_رجب_شعبان_رمضان_شوال_ذو القعدة_ذو الحجة'.split('_'),
- monthNamesShort: 'محرم_صفر_ربيع1_ربيع2_جمادى1_جمادى2_رجب_شعبان_رمضان_شوال_القعدة_الحجة'.split('_'),
- dayNames: ['الأحد', 'الإثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
- dayNamesShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
- dayNamesMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
- digits: $.calendars.substituteDigits(['٠', '١', '٢', '٣', '٤', '٥', '٦', '٧', '٨', '٩']),
- dateFormat: 'yyyy/mm/dd',
- firstDay: 6,
- isRTL: true
- }
- },
-
- /** Determine whether this date is in a leap year.
- @memberof UmmAlQuraCalendar
- @param {CDate|number} year The date to examine or the year to examine.
- @return {boolean} true if this is a leap year, false if not.
- @throws Error if an invalid year or a different calendar used. */
- leapYear: function (year) {
- var date = this._validate(year, this.minMonth, this.minDay, $.calendars.local.invalidYear);
- return (this.daysInYear(date.year()) === 355);
- },
-
- /** Determine the week of the year for a date.
- @memberof UmmAlQuraCalendar
- @param {CDate|number} year The date to examine or the year to examine.
- @param {number} [month] The month to examine (if only year specified above).
- @param {number} [day] The day to examine (if only year specified above).
- @return {number} The week of the year.
- @throws Error if an invalid date or a different calendar used. */
- weekOfYear: function (year, month, day) {
- // Find Sunday of this week starting on Sunday
- var checkDate = this.newDate(year, month, day);
- checkDate.add(-checkDate.dayOfWeek(), 'd');
- return Math.floor((checkDate.dayOfYear() - 1) / 7) + 1;
- },
-
- /** Retrieve the number of days in a year.
- @memberof UmmAlQuraCalendar
- @param {CDate|number} year The date to examine or the year to examine.
- @return {number} The number of days.
- @throws Error if an invalid year or a different calendar used. */
- daysInYear: function (year) {
- var daysCount = 0;
- for (var i = 1; i <= 12; i++) {
- daysCount += this.daysInMonth(year, i);
- }
- return daysCount;
- },
-
- /** Retrieve the number of days in a month.
- @memberof UmmAlQuraCalendar
- @param {CDate|number} year The date to examine or the year of the month.
- @param {number} [month] The month (if only year specified above).
- @return {number} The number of days in this month.
- @throws Error if an invalid month/year or a different calendar used. */
- daysInMonth: function (year, month) {
- var date = this._validate(year, month, this.minDay, $.calendars.local.invalidMonth);
- var mcjdn = date.toJD() - 2400000 + 0.5; // Modified Chronological Julian Day Number (MCJDN)
- // the MCJDN's of the start of the lunations in the Umm al-Qura calendar are stored in the 'ummalquraData' array
- var index = 0;
- for (var i = 0; i < ummalquraData.length; i++) {
- if (ummalquraData[i] > mcjdn) {
- return (ummalquraData[index] - ummalquraData[index - 1]);
- }
- index++;
- }
- return 30; // Unknown outside
- },
-
- /** Determine whether this date is a week day.
- @memberof UmmAlQuraCalendar
- @param {CDate|number} year The date to examine or the year to examine.
- @param {number} [month] The month to examine (if only year specified above).
- @param {number} [day] The day to examine (if only year specified above).
- @return {boolean} true if a week day, false if not.
- @throws Error if an invalid date or a different calendar used. */
- weekDay: function (year, month, day) {
- return this.dayOfWeek(year, month, day) !== 5;
- },
-
- /** Retrieve the Julian date equivalent for this date,
- i.e. days since January 1, 4713 BCE Greenwich noon.
- @memberof UmmAlQuraCalendar
- @param {CDate|number} year The date to convert or the year to convert.
- @param {number} [month] The month to convert (if only year specified above).
- @param {number} [day] The day to convert (if only year specified above).
- @return {number} The equivalent Julian date.
- @throws Error if an invalid date or a different calendar used. */
- toJD: function (year, month, day) {
- var date = this._validate(year, month, day, $.calendars.local.invalidDate);
- var index = (12 * (date.year() - 1)) + date.month() - 15292;
- var mcjdn = date.day() + ummalquraData[index - 1] - 1;
- return mcjdn + 2400000 - 0.5; // Modified Chronological Julian Day Number (MCJDN)
- },
-
- /** Create a new date from a Julian date.
- @memberof UmmAlQuraCalendar
- @param {number} jd The Julian date to convert.
- @return {CDate} The equivalent date. */
- fromJD: function (jd) {
- var mcjdn = jd - 2400000 + 0.5; // Modified Chronological Julian Day Number (MCJDN)
- // the MCJDN's of the start of the lunations in the Umm al-Qura calendar
- // are stored in the 'ummalquraData' array
- var index = 0;
- for (var i = 0; i < ummalquraData.length; i++) {
- if (ummalquraData[i] > mcjdn) {
- break;
- }
- index++;
- }
- var lunation = index + 15292; //UmmAlQura Lunation Number
- var ii = Math.floor((lunation - 1) / 12);
- var year = ii + 1;
- var month = lunation - 12 * ii;
- var day = mcjdn - ummalquraData[index - 1] + 1;
- return this.newDate(year, month, day);
- },
-
- /** Determine whether a date is valid for this calendar.
- @memberof UmmAlQuraCalendar
- @param {number} year The year to examine.
- @param {number} month The month to examine.
- @param {number} day The day to examine.
- @return {boolean} true if a valid date, false if not. */
- isValid: function(year, month, day) { // jshint unused:false
- var valid = $.calendars.baseCalendar.prototype.isValid.apply(this, arguments);
- if (valid) {
- year = (typeof year.year !== 'undefined' && year.year !== null ? year.year : year);
- valid = (year >= 1276 && year <= 1500);
- }
- return valid;
- },
-
- /** Check that a candidate date is from the same calendar and is valid.
- @memberof UmmAlQuraCalendar
- @private
- @param {CDate|number} year The date to validate or the year to validate.
- @param {number} month The month to validate (if only year specified above).
- @param {number} day The day to validate (if only year specified above).
- @param {string} error Error message if invalid.
- @throws Error if different calendars used or invalid date. */
- _validate: function(year, month, day, error) {
- var date = $.calendars.baseCalendar.prototype._validate.apply(this, arguments);
- if (date.year < 1276 || date.year > 1500) {
- throw error.replace(/\{0\}/, this.local.name);
- }
- return date;
- }
- });
-
- // UmmAlQura calendar implementation
- $.calendars.calendars.ummalqura = UmmAlQuraCalendar;
-
- var ummalquraData = [
- 20, 50, 79, 109, 138, 168, 197, 227, 256, 286, 315, 345, 374, 404, 433, 463, 492, 522, 551, 581,
- 611, 641, 670, 700, 729, 759, 788, 818, 847, 877, 906, 936, 965, 995, 1024, 1054, 1083, 1113, 1142, 1172,
- 1201, 1231, 1260, 1290, 1320, 1350, 1379, 1409, 1438, 1468, 1497, 1527, 1556, 1586, 1615, 1645, 1674, 1704, 1733, 1763,
- 1792, 1822, 1851, 1881, 1910, 1940, 1969, 1999, 2028, 2058, 2087, 2117, 2146, 2176, 2205, 2235, 2264, 2294, 2323, 2353,
- 2383, 2413, 2442, 2472, 2501, 2531, 2560, 2590, 2619, 2649, 2678, 2708, 2737, 2767, 2796, 2826, 2855, 2885, 2914, 2944,
- 2973, 3003, 3032, 3062, 3091, 3121, 3150, 3180, 3209, 3239, 3268, 3298, 3327, 3357, 3386, 3416, 3446, 3476, 3505, 3535,
- 3564, 3594, 3623, 3653, 3682, 3712, 3741, 3771, 3800, 3830, 3859, 3889, 3918, 3948, 3977, 4007, 4036, 4066, 4095, 4125,
- 4155, 4185, 4214, 4244, 4273, 4303, 4332, 4362, 4391, 4421, 4450, 4480, 4509, 4539, 4568, 4598, 4627, 4657, 4686, 4716,
- 4745, 4775, 4804, 4834, 4863, 4893, 4922, 4952, 4981, 5011, 5040, 5070, 5099, 5129, 5158, 5188, 5218, 5248, 5277, 5307,
- 5336, 5366, 5395, 5425, 5454, 5484, 5513, 5543, 5572, 5602, 5631, 5661, 5690, 5720, 5749, 5779, 5808, 5838, 5867, 5897,
- 5926, 5956, 5985, 6015, 6044, 6074, 6103, 6133, 6162, 6192, 6221, 6251, 6281, 6311, 6340, 6370, 6399, 6429, 6458, 6488,
- 6517, 6547, 6576, 6606, 6635, 6665, 6694, 6724, 6753, 6783, 6812, 6842, 6871, 6901, 6930, 6960, 6989, 7019, 7048, 7078,
- 7107, 7137, 7166, 7196, 7225, 7255, 7284, 7314, 7344, 7374, 7403, 7433, 7462, 7492, 7521, 7551, 7580, 7610, 7639, 7669,
- 7698, 7728, 7757, 7787, 7816, 7846, 7875, 7905, 7934, 7964, 7993, 8023, 8053, 8083, 8112, 8142, 8171, 8201, 8230, 8260,
- 8289, 8319, 8348, 8378, 8407, 8437, 8466, 8496, 8525, 8555, 8584, 8614, 8643, 8673, 8702, 8732, 8761, 8791, 8821, 8850,
- 8880, 8909, 8938, 8968, 8997, 9027, 9056, 9086, 9115, 9145, 9175, 9205, 9234, 9264, 9293, 9322, 9352, 9381, 9410, 9440,
- 9470, 9499, 9529, 9559, 9589, 9618, 9648, 9677, 9706, 9736, 9765, 9794, 9824, 9853, 9883, 9913, 9943, 9972, 10002, 10032,
- 10061, 10090, 10120, 10149, 10178, 10208, 10237, 10267, 10297, 10326, 10356, 10386, 10415, 10445, 10474, 10504, 10533, 10562, 10592, 10621,
- 10651, 10680, 10710, 10740, 10770, 10799, 10829, 10858, 10888, 10917, 10947, 10976, 11005, 11035, 11064, 11094, 11124, 11153, 11183, 11213,
- 11242, 11272, 11301, 11331, 11360, 11389, 11419, 11448, 11478, 11507, 11537, 11567, 11596, 11626, 11655, 11685, 11715, 11744, 11774, 11803,
- 11832, 11862, 11891, 11921, 11950, 11980, 12010, 12039, 12069, 12099, 12128, 12158, 12187, 12216, 12246, 12275, 12304, 12334, 12364, 12393,
- 12423, 12453, 12483, 12512, 12542, 12571, 12600, 12630, 12659, 12688, 12718, 12747, 12777, 12807, 12837, 12866, 12896, 12926, 12955, 12984,
- 13014, 13043, 13072, 13102, 13131, 13161, 13191, 13220, 13250, 13280, 13310, 13339, 13368, 13398, 13427, 13456, 13486, 13515, 13545, 13574,
- 13604, 13634, 13664, 13693, 13723, 13752, 13782, 13811, 13840, 13870, 13899, 13929, 13958, 13988, 14018, 14047, 14077, 14107, 14136, 14166,
- 14195, 14224, 14254, 14283, 14313, 14342, 14372, 14401, 14431, 14461, 14490, 14520, 14550, 14579, 14609, 14638, 14667, 14697, 14726, 14756,
- 14785, 14815, 14844, 14874, 14904, 14933, 14963, 14993, 15021, 15051, 15081, 15110, 15140, 15169, 15199, 15228, 15258, 15287, 15317, 15347,
- 15377, 15406, 15436, 15465, 15494, 15524, 15553, 15582, 15612, 15641, 15671, 15701, 15731, 15760, 15790, 15820, 15849, 15878, 15908, 15937,
- 15966, 15996, 16025, 16055, 16085, 16114, 16144, 16174, 16204, 16233, 16262, 16292, 16321, 16350, 16380, 16409, 16439, 16468, 16498, 16528,
- 16558, 16587, 16617, 16646, 16676, 16705, 16734, 16764, 16793, 16823, 16852, 16882, 16912, 16941, 16971, 17001, 17030, 17060, 17089, 17118,
- 17148, 17177, 17207, 17236, 17266, 17295, 17325, 17355, 17384, 17414, 17444, 17473, 17502, 17532, 17561, 17591, 17620, 17650, 17679, 17709,
- 17738, 17768, 17798, 17827, 17857, 17886, 17916, 17945, 17975, 18004, 18034, 18063, 18093, 18122, 18152, 18181, 18211, 18241, 18270, 18300,
- 18330, 18359, 18388, 18418, 18447, 18476, 18506, 18535, 18565, 18595, 18625, 18654, 18684, 18714, 18743, 18772, 18802, 18831, 18860, 18890,
- 18919, 18949, 18979, 19008, 19038, 19068, 19098, 19127, 19156, 19186, 19215, 19244, 19274, 19303, 19333, 19362, 19392, 19422, 19452, 19481,
- 19511, 19540, 19570, 19599, 19628, 19658, 19687, 19717, 19746, 19776, 19806, 19836, 19865, 19895, 19924, 19954, 19983, 20012, 20042, 20071,
- 20101, 20130, 20160, 20190, 20219, 20249, 20279, 20308, 20338, 20367, 20396, 20426, 20455, 20485, 20514, 20544, 20573, 20603, 20633, 20662,
- 20692, 20721, 20751, 20780, 20810, 20839, 20869, 20898, 20928, 20957, 20987, 21016, 21046, 21076, 21105, 21135, 21164, 21194, 21223, 21253,
- 21282, 21312, 21341, 21371, 21400, 21430, 21459, 21489, 21519, 21548, 21578, 21607, 21637, 21666, 21696, 21725, 21754, 21784, 21813, 21843,
- 21873, 21902, 21932, 21962, 21991, 22021, 22050, 22080, 22109, 22138, 22168, 22197, 22227, 22256, 22286, 22316, 22346, 22375, 22405, 22434,
- 22464, 22493, 22522, 22552, 22581, 22611, 22640, 22670, 22700, 22730, 22759, 22789, 22818, 22848, 22877, 22906, 22936, 22965, 22994, 23024,
- 23054, 23083, 23113, 23143, 23173, 23202, 23232, 23261, 23290, 23320, 23349, 23379, 23408, 23438, 23467, 23497, 23527, 23556, 23586, 23616,
- 23645, 23674, 23704, 23733, 23763, 23792, 23822, 23851, 23881, 23910, 23940, 23970, 23999, 24029, 24058, 24088, 24117, 24147, 24176, 24206,
- 24235, 24265, 24294, 24324, 24353, 24383, 24413, 24442, 24472, 24501, 24531, 24560, 24590, 24619, 24648, 24678, 24707, 24737, 24767, 24796,
- 24826, 24856, 24885, 24915, 24944, 24974, 25003, 25032, 25062, 25091, 25121, 25150, 25180, 25210, 25240, 25269, 25299, 25328, 25358, 25387,
- 25416, 25446, 25475, 25505, 25534, 25564, 25594, 25624, 25653, 25683, 25712, 25742, 25771, 25800, 25830, 25859, 25888, 25918, 25948, 25977,
- 26007, 26037, 26067, 26096, 26126, 26155, 26184, 26214, 26243, 26272, 26302, 26332, 26361, 26391, 26421, 26451, 26480, 26510, 26539, 26568,
- 26598, 26627, 26656, 26686, 26715, 26745, 26775, 26805, 26834, 26864, 26893, 26923, 26952, 26982, 27011, 27041, 27070, 27099, 27129, 27159,
- 27188, 27218, 27248, 27277, 27307, 27336, 27366, 27395, 27425, 27454, 27484, 27513, 27542, 27572, 27602, 27631, 27661, 27691, 27720, 27750,
- 27779, 27809, 27838, 27868, 27897, 27926, 27956, 27985, 28015, 28045, 28074, 28104, 28134, 28163, 28193, 28222, 28252, 28281, 28310, 28340,
- 28369, 28399, 28428, 28458, 28488, 28517, 28547, 28577,
- // From 1356
- 28607, 28636, 28665, 28695, 28724, 28754, 28783, 28813, 28843, 28872, 28901, 28931, 28960, 28990, 29019, 29049, 29078, 29108, 29137, 29167,
- 29196, 29226, 29255, 29285, 29315, 29345, 29375, 29404, 29434, 29463, 29492, 29522, 29551, 29580, 29610, 29640, 29669, 29699, 29729, 29759,
- 29788, 29818, 29847, 29876, 29906, 29935, 29964, 29994, 30023, 30053, 30082, 30112, 30141, 30171, 30200, 30230, 30259, 30289, 30318, 30348,
- 30378, 30408, 30437, 30467, 30496, 30526, 30555, 30585, 30614, 30644, 30673, 30703, 30732, 30762, 30791, 30821, 30850, 30880, 30909, 30939,
- 30968, 30998, 31027, 31057, 31086, 31116, 31145, 31175, 31204, 31234, 31263, 31293, 31322, 31352, 31381, 31411, 31441, 31471, 31500, 31530,
- 31559, 31589, 31618, 31648, 31676, 31706, 31736, 31766, 31795, 31825, 31854, 31884, 31913, 31943, 31972, 32002, 32031, 32061, 32090, 32120,
- 32150, 32180, 32209, 32239, 32268, 32298, 32327, 32357, 32386, 32416, 32445, 32475, 32504, 32534, 32563, 32593, 32622, 32652, 32681, 32711,
- 32740, 32770, 32799, 32829, 32858, 32888, 32917, 32947, 32976, 33006, 33035, 33065, 33094, 33124, 33153, 33183, 33213, 33243, 33272, 33302,
- 33331, 33361, 33390, 33420, 33450, 33479, 33509, 33539, 33568, 33598, 33627, 33657, 33686, 33716, 33745, 33775, 33804, 33834, 33863, 33893,
- 33922, 33952, 33981, 34011, 34040, 34069, 34099, 34128, 34158, 34187, 34217, 34247, 34277, 34306, 34336, 34365, 34395, 34424, 34454, 34483,
- 34512, 34542, 34571, 34601, 34631, 34660, 34690, 34719, 34749, 34778, 34808, 34837, 34867, 34896, 34926, 34955, 34985, 35015, 35044, 35074,
- 35103, 35133, 35162, 35192, 35222, 35251, 35280, 35310, 35340, 35370, 35399, 35429, 35458, 35488, 35517, 35547, 35576, 35605, 35635, 35665,
- 35694, 35723, 35753, 35782, 35811, 35841, 35871, 35901, 35930, 35960, 35989, 36019, 36048, 36078, 36107, 36136, 36166, 36195, 36225, 36254,
- 36284, 36314, 36343, 36373, 36403, 36433, 36462, 36492, 36521, 36551, 36580, 36610, 36639, 36669, 36698, 36728, 36757, 36786, 36816, 36845,
- 36875, 36904, 36934, 36963, 36993, 37022, 37052, 37081, 37111, 37141, 37170, 37200, 37229, 37259, 37288, 37318, 37347, 37377, 37406, 37436,
- 37465, 37495, 37524, 37554, 37584, 37613, 37643, 37672, 37701, 37731, 37760, 37790, 37819, 37849, 37878, 37908, 37938, 37967, 37997, 38027,
- 38056, 38085, 38115, 38144, 38174, 38203, 38233, 38262, 38292, 38322, 38351, 38381, 38410, 38440, 38469, 38499, 38528, 38558, 38587, 38617,
- 38646, 38676, 38705, 38735, 38764, 38794, 38823, 38853, 38882, 38912, 38941, 38971, 39001, 39030, 39059, 39089, 39118, 39148, 39178, 39208,
- 39237, 39267, 39297, 39326, 39355, 39385, 39414, 39444, 39473, 39503, 39532, 39562, 39592, 39621, 39650, 39680, 39709, 39739, 39768, 39798,
- 39827, 39857, 39886, 39916, 39946, 39975, 40005, 40035, 40064, 40094, 40123, 40153, 40182, 40212, 40241, 40271, 40300, 40330, 40359, 40389,
- 40418, 40448, 40477, 40507, 40536, 40566, 40595, 40625, 40655, 40685, 40714, 40744, 40773, 40803, 40832, 40862, 40892, 40921, 40951, 40980,
- 41009, 41039, 41068, 41098, 41127, 41157, 41186, 41216, 41245, 41275, 41304, 41334, 41364, 41393, 41422, 41452, 41481, 41511, 41540, 41570,
- 41599, 41629, 41658, 41688, 41718, 41748, 41777, 41807, 41836, 41865, 41894, 41924, 41953, 41983, 42012, 42042, 42072, 42102, 42131, 42161,
- 42190, 42220, 42249, 42279, 42308, 42337, 42367, 42397, 42426, 42456, 42485, 42515, 42545, 42574, 42604, 42633, 42662, 42692, 42721, 42751,
- 42780, 42810, 42839, 42869, 42899, 42929, 42958, 42988, 43017, 43046, 43076, 43105, 43135, 43164, 43194, 43223, 43253, 43283, 43312, 43342,
- 43371, 43401, 43430, 43460, 43489, 43519, 43548, 43578, 43607, 43637, 43666, 43696, 43726, 43755, 43785, 43814, 43844, 43873, 43903, 43932,
- 43962, 43991, 44021, 44050, 44080, 44109, 44139, 44169, 44198, 44228, 44258, 44287, 44317, 44346, 44375, 44405, 44434, 44464, 44493, 44523,
- 44553, 44582, 44612, 44641, 44671, 44700, 44730, 44759, 44788, 44818, 44847, 44877, 44906, 44936, 44966, 44996, 45025, 45055, 45084, 45114,
- 45143, 45172, 45202, 45231, 45261, 45290, 45320, 45350, 45380, 45409, 45439, 45468, 45498, 45527, 45556, 45586, 45615, 45644, 45674, 45704,
- 45733, 45763, 45793, 45823, 45852, 45882, 45911, 45940, 45970, 45999, 46028, 46058, 46088, 46117, 46147, 46177, 46206, 46236, 46265, 46295,
- 46324, 46354, 46383, 46413, 46442, 46472, 46501, 46531, 46560, 46590, 46620, 46649, 46679, 46708, 46738, 46767, 46797, 46826, 46856, 46885,
- 46915, 46944, 46974, 47003, 47033, 47063, 47092, 47122, 47151, 47181, 47210, 47240, 47269, 47298, 47328, 47357, 47387, 47417, 47446, 47476,
- 47506, 47535, 47565, 47594, 47624, 47653, 47682, 47712, 47741, 47771, 47800, 47830, 47860, 47890, 47919, 47949, 47978, 48008, 48037, 48066,
- 48096, 48125, 48155, 48184, 48214, 48244, 48273, 48303, 48333, 48362, 48392, 48421, 48450, 48480, 48509, 48538, 48568, 48598, 48627, 48657,
- 48687, 48717, 48746, 48776, 48805, 48834, 48864, 48893, 48922, 48952, 48982, 49011, 49041, 49071, 49100, 49130, 49160, 49189, 49218, 49248,
- 49277, 49306, 49336, 49365, 49395, 49425, 49455, 49484, 49514, 49543, 49573, 49602, 49632, 49661, 49690, 49720, 49749, 49779, 49809, 49838,
- 49868, 49898, 49927, 49957, 49986, 50016, 50045, 50075, 50104, 50133, 50163, 50192, 50222, 50252, 50281, 50311, 50340, 50370, 50400, 50429,
- 50459, 50488, 50518, 50547, 50576, 50606, 50635, 50665, 50694, 50724, 50754, 50784, 50813, 50843, 50872, 50902, 50931, 50960, 50990, 51019,
- 51049, 51078, 51108, 51138, 51167, 51197, 51227, 51256, 51286, 51315, 51345, 51374, 51403, 51433, 51462, 51492, 51522, 51552, 51582, 51611,
- 51641, 51670, 51699, 51729, 51758, 51787, 51816, 51846, 51876, 51906, 51936, 51965, 51995, 52025, 52054, 52083, 52113, 52142, 52171, 52200,
- 52230, 52260, 52290, 52319, 52349, 52379, 52408, 52438, 52467, 52497, 52526, 52555, 52585, 52614, 52644, 52673, 52703, 52733, 52762, 52792,
- 52822, 52851, 52881, 52910, 52939, 52969, 52998, 53028, 53057, 53087, 53116, 53146, 53176, 53205, 53235, 53264, 53294, 53324, 53353, 53383,
- 53412, 53441, 53471, 53500, 53530, 53559, 53589, 53619, 53648, 53678, 53708, 53737, 53767, 53796, 53825, 53855, 53884, 53913, 53943, 53973,
- 54003, 54032, 54062, 54092, 54121, 54151, 54180, 54209, 54239, 54268, 54297, 54327, 54357, 54387, 54416, 54446, 54476, 54505, 54535, 54564,
- 54593, 54623, 54652, 54681, 54711, 54741, 54770, 54800, 54830, 54859, 54889, 54919, 54948, 54977, 55007, 55036, 55066, 55095, 55125, 55154,
- 55184, 55213, 55243, 55273, 55302, 55332, 55361, 55391, 55420, 55450, 55479, 55508, 55538, 55567, 55597, 55627, 55657, 55686, 55716, 55745,
- 55775, 55804, 55834, 55863, 55892, 55922, 55951, 55981, 56011, 56040, 56070, 56100, 56129, 56159, 56188, 56218, 56247, 56276, 56306, 56335,
- 56365, 56394, 56424, 56454, 56483, 56513, 56543, 56572, 56601, 56631, 56660, 56690, 56719, 56749, 56778, 56808, 56837, 56867, 56897, 56926,
- 56956, 56985, 57015, 57044, 57074, 57103, 57133, 57162, 57192, 57221, 57251, 57280, 57310, 57340, 57369, 57399, 57429, 57458, 57487, 57517,
- 57546, 57576, 57605, 57634, 57664, 57694, 57723, 57753, 57783, 57813, 57842, 57871, 57901, 57930, 57959, 57989, 58018, 58048, 58077, 58107,
- 58137, 58167, 58196, 58226, 58255, 58285, 58314, 58343, 58373, 58402, 58432, 58461, 58491, 58521, 58551, 58580, 58610, 58639, 58669, 58698,
- 58727, 58757, 58786, 58816, 58845, 58875, 58905, 58934, 58964, 58994, 59023, 59053, 59082, 59111, 59141, 59170, 59200, 59229, 59259, 59288,
- 59318, 59348, 59377, 59407, 59436, 59466, 59495, 59525, 59554, 59584, 59613, 59643, 59672, 59702, 59731, 59761, 59791, 59820, 59850, 59879,
- 59909, 59939, 59968, 59997, 60027, 60056, 60086, 60115, 60145, 60174, 60204, 60234, 60264, 60293, 60323, 60352, 60381, 60411, 60440, 60469,
- 60499, 60528, 60558, 60588, 60618, 60648, 60677, 60707, 60736, 60765, 60795, 60824, 60853, 60883, 60912, 60942, 60972, 61002, 61031, 61061,
- 61090, 61120, 61149, 61179, 61208, 61237, 61267, 61296, 61326, 61356, 61385, 61415, 61445, 61474, 61504, 61533, 61563, 61592, 61621, 61651,
- 61680, 61710, 61739, 61769, 61799, 61828, 61858, 61888, 61917, 61947, 61976, 62006, 62035, 62064, 62094, 62123, 62153, 62182, 62212, 62242,
- 62271, 62301, 62331, 62360, 62390, 62419, 62448, 62478, 62507, 62537, 62566, 62596, 62625, 62655, 62685, 62715, 62744, 62774, 62803, 62832,
- 62862, 62891, 62921, 62950, 62980, 63009, 63039, 63069, 63099, 63128, 63157, 63187, 63216, 63246, 63275, 63305, 63334, 63363, 63393, 63423,
- 63453, 63482, 63512, 63541, 63571, 63600, 63630, 63659, 63689, 63718, 63747, 63777, 63807, 63836, 63866, 63895, 63925, 63955, 63984, 64014,
- 64043, 64073, 64102, 64131, 64161, 64190, 64220, 64249, 64279, 64309, 64339, 64368, 64398, 64427, 64457, 64486, 64515, 64545, 64574, 64603,
- 64633, 64663, 64692, 64722, 64752, 64782, 64811, 64841, 64870, 64899, 64929, 64958, 64987, 65017, 65047, 65076, 65106, 65136, 65166, 65195,
- 65225, 65254, 65283, 65313, 65342, 65371, 65401, 65431, 65460, 65490, 65520, 65549, 65579, 65608, 65638, 65667, 65697, 65726, 65755, 65785,
- 65815, 65844, 65874, 65903, 65933, 65963, 65992, 66022, 66051, 66081, 66110, 66140, 66169, 66199, 66228, 66258, 66287, 66317, 66346, 66376,
- 66405, 66435, 66465, 66494, 66524, 66553, 66583, 66612, 66641, 66671, 66700, 66730, 66760, 66789, 66819, 66849, 66878, 66908, 66937, 66967,
- 66996, 67025, 67055, 67084, 67114, 67143, 67173, 67203, 67233, 67262, 67292, 67321, 67351, 67380, 67409, 67439, 67468, 67497, 67527, 67557,
- 67587, 67617, 67646, 67676, 67705, 67735, 67764, 67793, 67823, 67852, 67882, 67911, 67941, 67971, 68000, 68030, 68060, 68089, 68119, 68148,
- 68177, 68207, 68236, 68266, 68295, 68325, 68354, 68384, 68414, 68443, 68473, 68502, 68532, 68561, 68591, 68620, 68650, 68679, 68708, 68738,
- 68768, 68797, 68827, 68857, 68886, 68916, 68946, 68975, 69004, 69034, 69063, 69092, 69122, 69152, 69181, 69211, 69240, 69270, 69300, 69330,
- 69359, 69388, 69418, 69447, 69476, 69506, 69535, 69565, 69595, 69624, 69654, 69684, 69713, 69743, 69772, 69802, 69831, 69861, 69890, 69919,
- 69949, 69978, 70008, 70038, 70067, 70097, 70126, 70156, 70186, 70215, 70245, 70274, 70303, 70333, 70362, 70392, 70421, 70451, 70481, 70510,
- 70540, 70570, 70599, 70629, 70658, 70687, 70717, 70746, 70776, 70805, 70835, 70864, 70894, 70924, 70954, 70983, 71013, 71042, 71071, 71101,
- 71130, 71159, 71189, 71218, 71248, 71278, 71308, 71337, 71367, 71397, 71426, 71455, 71485, 71514, 71543, 71573, 71602, 71632, 71662, 71691,
- 71721, 71751, 71781, 71810, 71839, 71869, 71898, 71927, 71957, 71986, 72016, 72046, 72075, 72105, 72135, 72164, 72194, 72223, 72253, 72282,
- 72311, 72341, 72370, 72400, 72429, 72459, 72489, 72518, 72548, 72577, 72607, 72637, 72666, 72695, 72725, 72754, 72784, 72813, 72843, 72872,
- 72902, 72931, 72961, 72991, 73020, 73050, 73080, 73109, 73139, 73168, 73197, 73227, 73256, 73286, 73315, 73345, 73375, 73404, 73434, 73464,
- 73493, 73523, 73552, 73581, 73611, 73640, 73669, 73699, 73729, 73758, 73788, 73818, 73848, 73877, 73907, 73936, 73965, 73995, 74024, 74053,
- 74083, 74113, 74142, 74172, 74202, 74231, 74261, 74291, 74320, 74349, 74379, 74408, 74437, 74467, 74497, 74526, 74556, 74586, 74615, 74645,
- 74675, 74704, 74733, 74763, 74792, 74822, 74851, 74881, 74910, 74940, 74969, 74999, 75029, 75058, 75088, 75117, 75147, 75176, 75206, 75235,
- 75264, 75294, 75323, 75353, 75383, 75412, 75442, 75472, 75501, 75531, 75560, 75590, 75619, 75648, 75678, 75707, 75737, 75766, 75796, 75826,
- 75856, 75885, 75915, 75944, 75974, 76003, 76032, 76062, 76091, 76121, 76150, 76180, 76210, 76239, 76269, 76299, 76328, 76358, 76387, 76416,
- 76446, 76475, 76505, 76534, 76564, 76593, 76623, 76653, 76682, 76712, 76741, 76771, 76801, 76830, 76859, 76889, 76918, 76948, 76977, 77007,
- 77036, 77066, 77096, 77125, 77155, 77185, 77214, 77243, 77273, 77302, 77332, 77361, 77390, 77420, 77450, 77479, 77509, 77539, 77569, 77598,
- 77627, 77657, 77686, 77715, 77745, 77774, 77804, 77833, 77863, 77893, 77923, 77952, 77982, 78011, 78041, 78070, 78099, 78129, 78158, 78188,
- 78217, 78247, 78277, 78307, 78336, 78366, 78395, 78425, 78454, 78483, 78513, 78542, 78572, 78601, 78631, 78661, 78690, 78720, 78750, 78779,
- 78808, 78838, 78867, 78897, 78926, 78956, 78985, 79015, 79044, 79074, 79104, 79133, 79163, 79192, 79222, 79251, 79281, 79310, 79340, 79369,
- 79399, 79428, 79458, 79487, 79517, 79546, 79576, 79606, 79635, 79665, 79695, 79724, 79753, 79783, 79812, 79841, 79871, 79900, 79930, 79960,
- 79990
- ];
-
-})(jQuery);
diff --git a/odex25_ensan/odex_benefit/static/src/js/jquery.plugin.js b/odex25_ensan/odex_benefit/static/src/js/jquery.plugin.js
deleted file mode 100644
index 2d3098540..000000000
--- a/odex25_ensan/odex_benefit/static/src/js/jquery.plugin.js
+++ /dev/null
@@ -1,388 +0,0 @@
-/* globals JQClass */
-/*! Simple JavaScript Inheritance
- * By John Resig http://ejohn.org/
- * MIT Licensed.
- */
-// Inspired by base2 and Prototype
-(function(){
- 'use strict';
- var initializing = false;
-
- // The base JQClass implementation (does nothing)
- window.JQClass = function(){};
-
- // Collection of derived classes
- JQClass.classes = {};
-
- // Create a new JQClass that inherits from this class
- JQClass.extend = function extender(prop) {
- var base = this.prototype;
-
- // Instantiate a base class (but only create the instance, don't run the init constructor)
- initializing = true;
- var prototype = new this();
- initializing = false;
-
- // Copy the properties over onto the new prototype
- for (var name in prop) { // jshint loopfunc:true
- // Check if we're overwriting an existing function
- if (typeof prop[name] === 'function' && typeof base[name] === 'function') {
- prototype[name] = (function (name, fn) {
- return function () {
- var __super = this._super;
- // Add a new ._super() method that is the same method but on the super-class
- this._super = function (args) {
- return base[name].apply(this, args || []);
- };
- var ret = fn.apply(this, arguments);
- // The method only needs to be bound temporarily, so we remove it when we're done executing
- this._super = __super;
- return ret;
- };
- })(name, prop[name]);
- // Check if we're overwriting existing default options.
- } else if (typeof prop[name] === 'object' && typeof base[name] === 'object' && name === 'defaultOptions') {
- var obj1 = base[name];
- var obj2 = prop[name];
- var obj3 = {};
- var key;
- for (key in obj1) { // jshint forin:false
- obj3[key] = obj1[key];
- }
- for (key in obj2) { // jshint forin:false
- obj3[key] = obj2[key];
- }
- prototype[name] = obj3;
- } else {
- prototype[name] = prop[name];
- }
- }
-
- // The dummy class constructor
- function JQClass() {
- // All construction is actually done in the init method
- if (!initializing && this._init) {
- this._init.apply(this, arguments);
- }
- }
-
- // Populate our constructed prototype object
- JQClass.prototype = prototype;
-
- // Enforce the constructor to be what we expect
- JQClass.prototype.constructor = JQClass;
-
- // And make this class extendable
- JQClass.extend = extender;
-
- return JQClass;
- };
-})();
-/*! Abstract base class for collection plugins v1.0.3.
- Written by Keith Wood (wood.keith{at}optusnet.com.au) December 2013.
- Licensed under the MIT license (http://keith-wood.name/licence.html). */
-(function($) { // Ensure $, encapsulate
- 'use strict';
-
- /**
-
- @module JQPlugin
- @abstract */
- JQClass.classes.JQPlugin = JQClass.extend({
-
- /** Name to identify this plugin.
- @example name: 'tabs' */
- name: 'plugin',
-
- /** Default options for instances of this plugin (default: {}).
- @example defaultOptions: {
- selectedClass: 'selected',
- triggers: 'click'
-} */
- defaultOptions: {},
-
- /** Options dependent on the locale.
- Indexed by language and (optional) country code, with '' denoting the default language (English/US).
- Normally additional languages would be provided as separate files to all them to be included as needed.
- @example regionalOptions: {
- '': {
- greeting: 'Hi'
- }
-} */
- regionalOptions: {},
-
- /** Whether or not a deep merge should be performed when accumulating options.
- The default is
- Metadata is specified as an attribute on the element:
- data-<pluginName>="<option name>: '<value>', ...".
- Dates should be specified as strings in this format: 'new Date(y, m-1, d)'.$(selector).pluginName('functionName').true but can be overridden in a sub-class. */
- deepMerge: true,
-
- /** Retrieve a marker class for affected elements.
- In the format: is-<pluginName>.
- @protected
- @return {string} The marker class. */
- _getMarker: function() {
- return 'is-' + this.name;
- },
-
- /** Initialise the plugin.
- Create the jQuery bridge - plugin name xyz
- produces singleton $.xyz and collection function $.fn.xyz.
- @protected */
- _init: function() {
- // Apply default localisations
- $.extend(this.defaultOptions, (this.regionalOptions && this.regionalOptions['']) || {});
- // Camel-case the name
- var jqName = camelCase(this.name);
- // Expose jQuery singleton manager
- $[jqName] = this;
- // Expose jQuery collection plugin
- $.fn[jqName] = function(options) {
- var otherArgs = Array.prototype.slice.call(arguments, 1);
- var inst = this;
- var returnValue = this;
- this.each(function () {
- if (typeof options === 'string') {
- if (options[0] === '_' || !$[jqName][options]) {
- throw 'Unknown method: ' + options;
- }
- var methodValue = $[jqName][options].apply($[jqName], [this].concat(otherArgs));
- if (methodValue !== inst && methodValue !== undefined) {
- returnValue = methodValue;
- return false;
- }
- } else {
- $[jqName]._attach(this, options);
- }
- });
- return returnValue;
- };
- },
-
- /** Set default options for all subsequent instances.
- @param {object} options The new default options.
- @example $.pluginName.setDefaults({name: value, ...}) */
- setDefaults: function(options) {
- $.extend(this.defaultOptions, options || {});
- },
-
- /** Initialise an element. Called internally only.
- Adds an instance object as data named for the plugin.
- Override {@linkcode module:JQPlugin~_postAttach|_postAttach} for plugin-specific processing.
- @private
- @param {Element} elem The element to enhance.
- @param {object} options Overriding settings. */
- _attach: function(elem, options) {
- elem = $(elem);
- if (elem.hasClass(this._getMarker())) {
- return;
- }
- elem.addClass(this._getMarker());
- options = $.extend(this.deepMerge, {}, this.defaultOptions, this._getMetadata(elem), options || {});
- var inst = $.extend({name: this.name, elem: elem, options: options}, this._instSettings(elem, options));
- elem.data(this.name, inst); // Save instance against element
- this._postAttach(elem, inst);
- this.option(elem, options);
- },
-
- /** Retrieve additional instance settings.
- Override this in a sub-class to provide extra settings.
- These are added directly to the instance object.
- Default attributes of an instance object are shown as properties below:
- @protected
- @param {jQuery} elem The current jQuery element.
- @param {object} options The instance options.
- @return {object} Any extra instance values.
- @property {Element} elem The element to which this instance applies.
- @property {string} name The name of this plugin.
- @property {object} options The accumulated options for this instance.
- @example _instSettings: function(elem, options) {
- return {nav: elem.find(options.navSelector)};
-} */
- _instSettings: function(elem, options) { // jshint unused:false
- return {};
- },
-
- /** Plugin specific post initialisation.
- Override this in a sub-class to perform extra activities.
- This is where you would implement your plugin's main functionality.
- @protected
- @param {jQuery} elem The current jQuery element.
- @param {object} inst The instance settings.
- @example _postAttach: function(elem, inst) {
- elem.on('click.' + this.name, function() {
- ...
- });
-} */
- _postAttach: function(elem, inst) { // jshint unused:false
- },
-
- /** Retrieve metadata configuration from the element.
- Metadata is specified as an attribute:
- data-<pluginName>="<option name>: '<value>', ...".
- Dates should be specified as strings in this format: 'new Date(y, m-1, d)'.
- @private
- @param {jQuery} elem The source element.
- @return {object} The inline configuration or {}. */
- _getMetadata: function(elem) {
- try {
- var data = elem.data(this.name.toLowerCase()) || '';
- data = data.replace(/(\\?)'/g, function(e, t) {
- return t ? '\'' : '"';
- }).replace(/([a-zA-Z0-9]+):/g, function(match, group, i) {
- var count = data.substring(0, i).match(/"/g); // Handle embedded ':'
- return (!count || count.length % 2 === 0 ? '"' + group + '":' : group + ':');
- }).replace(/\\:/g, ':');
- data = $.parseJSON('{' + data + '}');
- for (var key in data) {
- if (data.hasOwnProperty(key)) {
- var value = data[key];
- if (typeof value === 'string' && value.match(/^new Date\(([-0-9,\s]*)\)$/)) { // Convert dates
- data[key] = eval(value); // jshint ignore:line
- }
- }
- }
- return data;
- }
- catch (e) {
- return {};
- }
- },
-
- /** Retrieve the instance data for element.
- @protected
- @param {Element} elem The source element.
- @return {object} The instance data or {} if none. */
- _getInst: function(elem) {
- return $(elem).data(this.name) || {};
- },
-
- /** Retrieve or reconfigure the settings for a plugin.
- If new settings are provided they are applied to the instance options.
- If an option name only is provided the value of that option is returned.
- If no name or value is provided, all options are returned.
- Override {@linkcode module:JQPlugin~_optionsChanged|_optionsChanged}
- for plugin-specific processing when option values change.
- @param {Element} elem The source element.
- @param {object|string} [name] The collection of new option values or the name of a single option.
- @param {any} [value] The value for a single named option.
- @return {any|object} If retrieving a single value or all options.
- @example $(selector).plugin('option', 'name', value) // Set one option
-$(selector).plugin('option', {name: value, ...}) // Set multiple options
-var value = $(selector).plugin('option', 'name') // Get one option
-var options = $(selector).plugin('option') // Get all options */
- option: function(elem, name, value) {
- elem = $(elem);
- var inst = elem.data(this.name);
- var options = name || {};
- if (!name || (typeof name === 'string' && typeof value === 'undefined')) {
- options = (inst || {}).options;
- return (options && name ? options[name] : options);
- }
- if (!elem.hasClass(this._getMarker())) {
- return;
- }
- if (typeof name === 'string') {
- options = {};
- options[name] = value;
- }
- this._optionsChanged(elem, inst, options);
- $.extend(inst.options, options);
- },
-
- /** Plugin specific options processing.
- Old value available in inst.options[name], new value in options[name].
- Override this in a sub-class to perform extra activities.
- @protected
- @param {jQuery} elem The current jQuery element.
- @param {object} inst The instance settings.
- @param {object} options The new options.
- @example _optionsChanged: function(elem, inst, options) {
- if (options.name != inst.options.name) {
- elem.removeClass(inst.options.name).addClass(options.name);
- }
-} */
- _optionsChanged: function(elem, inst, options) { // jshint unused:false
- },
-
- /** Remove all trace of the plugin.
- Override {@linkcode module:JQPlugin~_preDestroy|_preDestroy} for plugin-specific processing.
- @param {Element} elem The source element.
- @example $(selector).plugin('destroy') */
- destroy: function(elem) {
- elem = $(elem);
- if (!elem.hasClass(this._getMarker())) {
- return;
- }
- this._preDestroy(elem, this._getInst(elem));
- elem.removeData(this.name).removeClass(this._getMarker());
- },
-
- /** Plugin specific pre destruction.
- It is invoked as part of the {@linkcode module:JQPlugin~destroy|destroy} processing.
- Override this in a sub-class to perform extra activities and undo everything that was
- done in the {@linkcode module:JQPlugin~_postAttach|_postAttach} or
- {@linkcode module:JQPlugin~_optionsChanged|_optionsChanged} functions.
- @protected
- @param {jQuery} elem The current jQuery element.
- @param {object} inst The instance settings.
- @example _preDestroy: function(elem, inst) {
- elem.off('.' + this.name);
-} */
- _preDestroy: function(elem, inst) { // jshint unused:false
- }
- });
-
- /** Convert names from hyphenated to camel-case.
- @private
- @param {string} value The original hyphenated name.
- @return {string} The camel-case version. */
- function camelCase(name) {
- return name.replace(/-([a-z])/g, function(match, group) {
- return group.toUpperCase();
- });
- }
-
- /** Expose the plugin base.
- @namespace $.JQPlugin */
- $.JQPlugin = {
-
- /** Create a new collection plugin.
- @memberof $.JQPlugin
- @param {string} [superClass='JQPlugin'] The name of the parent class to inherit from.
- @param {object} overrides The property/function overrides for the new class.
- See {@link module:JQPlugin|JQPlugin} for the base functionality.
- @example $.JQPlugin.createPlugin({ // Define the plugin
- name: 'tabs',
- defaultOptions: {selectedClass: 'selected'},
- _initSettings: function(elem, options) { return {...}; },
- _postAttach: function(elem, inst) { ... }
-});
-$('selector').tabs(); // And instantiate it */
- createPlugin: function(superClass, overrides) {
- if (typeof superClass === 'object') {
- overrides = superClass;
- superClass = 'JQPlugin';
- }
- superClass = camelCase(superClass);
- var className = camelCase(overrides.name);
- JQClass.classes[className] = JQClass.classes[superClass].extend(overrides);
- new JQClass.classes[className](); // jshint ignore:line
- }
- };
-
-})(jQuery);
\ No newline at end of file
diff --git a/odex25_ensan/odex_benefit/static/src/js/odex_attches.js b/odex25_ensan/odex_benefit/static/src/js/odex_attches.js
deleted file mode 100644
index adf8e7109..000000000
--- a/odex25_ensan/odex_benefit/static/src/js/odex_attches.js
+++ /dev/null
@@ -1,217 +0,0 @@
-odoo.define('odex_grant_management.odex_attches', function (require) {
- "use strict";
- $(document).ready(function () {
-
- $('form#entity_account_update-form')
- .on('submit', function (e) {
- var form = $(this);
- var formData = new FormData();
- var formParams = form.serializeArray();
- $.each(form.find('input[type="file"]'), function (i, tag) {
- $.each($(tag)[0].files, function (i, file) {
- formData.append(tag.name, file);
- });
- });
-
- $.each(formParams, function (i, val) {
- formData.append(val.name, val.value);
- });
- $.blockUI({message: "جاري رفع التعديلات ..."});
- $.ajax({
- type: 'POST',
- url: '/page/entity_profile/edit/update',
- data: formData,
- dataType: "json",
- success: function (d) {
- window.location.href = '/page/entity_profile';
- $.unblockUI();
- },
- error: function () {
- window.location.href = '/page/entity_profile';
- $.unblockUI();
- },
- });
- return false;
- });
- $('form#upload_grant_attachments').on('submit', function (evt) {
- evt.preventDefault();
- var form_data = new FormData();
- form_data.append("file", $("#attach_desc_file")[0].files[0]);
- form_data.append("description", $("#attach_desc").val());
- form_data.append("grant_id", $("#grant_data").val());
- form_data.append("file_name", $("#attach_desc_file")[0].files[0].name);
- $.blockUI({message: "جاري اتمام تحميل المرفقات ..."});
- $.ajax({
- url: "/upload/grant/attaches", // NB: Use the correct action name
- type: "POST",
- data: form_data,
- processData: false,
- contentType: false,
- success: function (response) {
-
- var base_url = window.location.origin;
- response = $.parseJSON(response);
- if (response.status === 'ok') {
- var attach = response.attachment;
- var name = response.name;
- var description = response.description
- var date = response.date;
- var item = "" + "" + name + "";
- var markup = "" +
- " ";
- $(".attach_table tbody").append(markup);
- $.unblockUI();
- $("form#upload_grant_attachments").trigger("reset");
- } else {
- var message = response.msg;
- alert(message)
- $.unblockUI();
- }
-
- },
- error: function (response) {
-
- $.unblockUI();
- }
- });
- });
-
- $('form#upload_voucher_attachments').on('submit', function (evt) {
- evt.preventDefault();
- var form_data = new FormData();
- form_data.append("file", $("#attach_voucher_file")[0].files[0]);
- form_data.append("grant_id", $("#grant_voucher_data").val());
- form_data.append("file_name", $("#attach_voucher_file")[0].files[0].name);
- $.blockUI({message: "جاري اتمام تحميل المرفقات ..."});
- $.ajax({
- url: "/upload/voucher/attaches", // NB: Use the correct action name
- type: "POST",
- data: form_data,
- processData: false,
- contentType: false,
- success: function (response) {
- response = $.parseJSON(response);
- var base_url = window.location.origin;
- if (response.status === 'ok') {
- var attach = response.attachment;
- var name = response.name;
- var description = response.description
- var date = response.date;
- var item = "" + "" + name + "";
- var markup = "" +
- "" +
- " " +
- "" + date + " " +
- "" + description + " " +
- "" + item + " " +
- "" +
- " ";
- $(".attach_table tbody").append(markup);
- $.unblockUI();
- $("form#upload_voucher_attachments").trigger("reset");
- } else {
- var message = response.msg;
- alert(message)
- $.unblockUI();
- }
-
- },
- error: function (response) {
- $.unblockUI();
- }
- });
- });
-
- $('form#upload_report_attachments').on('submit', function (evt) {
- evt.preventDefault();
- var form_data = new FormData();
- form_data.append("file", $("#attach_report_file")[0].files[0]);
- form_data.append("grant_id", $("#grant_report_data").val());
- form_data.append("file_name", $("#attach_report_file")[0].files[0].name);
- $.blockUI({message: "جاري اتمام تحميل المرفقات ..."});
- $.ajax({
- url: "/upload/report/attaches", // NB: Use the correct action name
- type: "POST",
- data: form_data,
- processData: false,
- contentType: false,
- success: function (response) {
- response = $.parseJSON(response);
- var base_url = window.location.origin;
- if (response.status === 'ok') {
- var attach = response.attachment;
- var name = response.name;
- var description = response.description
- var date = response.date;
- var item = "" + "" + name + "";
- var markup = "" +
- "" +
- " " +
- "" + date + " " +
- "" + description + " " +
- "" + item + " " +
- "" +
- " ";
- $(".attach_table tbody").append(markup);
- $.unblockUI();
- $("form#upload_report_attachments").trigger("reset");
- } else {
- var message = response.msg;
- alert(message)
- $.unblockUI();
- }
-
- },
- error: function (response) {
-
- $.unblockUI();
- }
- });
- });
-
- $(".check_all").click(function () {
-
- if (this.checked) {
- $("#record").each(function () {
- $('input[name=record]').prop('checked', true);
- });
- } else {
- $("#record").each(function () {
- $('input[name=record]').prop('checked', false);
- });
- }
- });
-
- $(".delete-row").click(function () {
- $(".attach_table tbody").find('input[name="record"]').each(function () {
- var self = this;
- if ($(self).is(":checked")) {
- var data = new FormData();
- data.append("attach", $(self).val());
- data.append("grant_id", $("#grant_data").val());
- $.blockUI({message: "جاري حذف المرفقات ..."});
- $.ajax({
- url: "/remove/grant/attaches", // NB: Use the correct action name
- type: "POST",
- data: data,
- processData: false,
- contentType: false,
- success: function (response) {
- $(self).parents("tr").remove();
- $.unblockUI();
- },
- error: function (response) {
- $.unblockUI();
- }
- });
- }
- });
- });
- });
-});
diff --git a/odex25_ensan/odex_benefit/static/src/js/portal.js b/odex25_ensan/odex_benefit/static/src/js/portal.js
deleted file mode 100644
index 8e12214d0..000000000
--- a/odex25_ensan/odex_benefit/static/src/js/portal.js
+++ /dev/null
@@ -1,6 +0,0 @@
-$(document).ready(function(){
-
-
-});
-
-
diff --git a/odex25_ensan/odex_benefit/static/src/js/project.js b/odex25_ensan/odex_benefit/static/src/js/project.js
deleted file mode 100644
index 3c0f694b6..000000000
--- a/odex25_ensan/odex_benefit/static/src/js/project.js
+++ /dev/null
@@ -1,45 +0,0 @@
-openerp.project = function(openerp) {
- openerp.web_kanban.KanbanView.include({
- project_display_members_names: function() {
- /*
- * Set avatar title for members.
- * In kanban views, many2many fields only return a list of ids.
- * We can implement return value of m2m fields like [(1,"Adminstration"),...].
- */
- var self = this;
- var members_ids = [];
-
- // Collect members ids
- self.$el.find('img[data-member_id]').each(function() {
- members_ids.push($(this).data('member_id'));
- });
-
- // Find their matching names
- var dataset = new openerp.web.DataSetSearch(self, 'res.users', self.session.context, [['id', 'in', _.uniq(members_ids)]]);
- dataset.read_slice(['id', 'name']).done(function(result) {
- _.each(result, function(v, k) {
- // Set the proper value in the DOM
- self.$el.find('img[data-member_id=' + v.id + ']').attr('title', v.name).tooltip();
- });
- });
- },
- on_groups_started: function() {
- var self = this;
- self._super.apply(self, arguments);
-
- if (self.dataset.model === 'project.project') {
- self.project_display_members_names();
- }
- }
- });
-
- openerp.web_kanban.KanbanRecord.include({
- on_card_clicked: function() {
- if (this.view.dataset.model === 'project.project') {
- this.$('.oe_kanban_project_list a').first().click();
- } else {
- this._super.apply(this, arguments);
- }
- },
- });
-};
diff --git a/odex25_ensan/odex_benefit/static/src/scss/custom_style.scss b/odex25_ensan/odex_benefit/static/src/scss/custom_style.scss
deleted file mode 100644
index 88108a295..000000000
--- a/odex25_ensan/odex_benefit/static/src/scss/custom_style.scss
+++ /dev/null
@@ -1,3 +0,0 @@
-.custom_stat_value .o_stat_value {
- color: #FF0000 !important;
-}
\ No newline at end of file
diff --git a/odex25_ensan/odex_benefit/static/src/xml/base_template.xml b/odex25_ensan/odex_benefit/static/src/xml/base_template.xml
deleted file mode 100644
index 582bb850f..000000000
--- a/odex25_ensan/odex_benefit/static/src/xml/base_template.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-" +
- "" +
- " " +
- "" + date + " " +
- "" + description + " " +
- "" + item + " " +
- "
-
-
-
- ${object.first_refusal_reason}
-
-
-
-
-
- ${object.final_refusal_reason}.
-
-
-
-
-
- ${object.black_list_reason}.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Benefit System
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- المرشحات
-
-
- zkat alfert
- الاضاحي
- receive.appliances.furniture
- loans
-
-
-
-
-
-
-
- الرجاء استخدام هذه المفاتيح لاستخدام في القالب :
-
- 1/ عند الحوجة لاستخدام اسم المستفيد ادخل $اسم_المستفيد
-
- 2/ عند الحوجة لاستخدام اسم عائلة المستفيد ادخل $اسم_العائلة
-
- 3/ عند الحوجة لاستخدام رقم هوية المستفيد ادخل $رقم_الهوية
-
-
-
"
- "Suspend Reason: %s
"
- "Notes: %s"
- ) % (rec.entity_id.name,state_label,rec.suspend_reason_id.name if rec.suspend_reason_id else '',rec.refused_reason)
- partner_ids += [(6, 0, rec.entity_id.message_follower_ids.ids)]
- now = fields.datetime.now()
- first_refuse_date = datetime.strftime(now, '%Y-%m-%d')
- rec.entity_id.message_post(body=body, subject=subject, message_type='email')
- rec.entity_id.sudo().write({
- "state": 'first_refusal',
- "first_refusal_reason": rec.refused_reason,
- "first_refuse_date": first_refuse_date,
- "family_return_reason": rec.refused_reason
- })
- return {'type': 'ir.actions.act_window_close'}
-
- # @api.multi
- def final_refuse(self):
- """Throw pop up to write the refusal reason for entity"""
- partner_ids = []
- for rec in self:
- if rec.entity_id:
- state = "refused"
- user = self.env['res.users'].search([('partner_id', '=', rec.entity_id.partner_id.id)], limit=1)
-
- refuse_reason = self.env['entity.refuse_reason'].sudo().create(
- {
- 'name': rec.refused_reason,
- 'entity_id': rec.entity_id.id,
- 'user_id': self.env.uid,
- }
- )
- subject = _('Benefit')
- state_label = dict(rec.fields_get(allfields=['state'])['state']['selection'])[state]
- body = ' '.join(
- (
- _(u'The Benefit record '), rec.entity_id.name, _(u' State changed to '), state_label,
- u'.')).encode(
- 'utf-8')
- partner_ids += [(6, 0, rec.entity_id.message_follower_ids.ids)]
- message_vals = {
- 'subject': subject,
- 'body': body,
- 'partner_ids': partner_ids,
- }
- rec.entity_id.message_post(body=body, subject=subject, message_type='email')
- # rec.entity_id.sudo().unlink()
- if user:
- user.sudo().unlink()
- # rec.entity_id.partner_id.sudo().unlink()
- result = rec.entity_id.sudo().write({
- "state": 'refused',
- "final_refusal_reason": rec.refused_reason,
- })
- return result
- # return {
- # 'name': _(u'Benefit To Accept'),
- # 'view_mode': 'tree,form',
- # 'views': [(self.env.ref('odex_benefit.grant_benefit_tree').id, 'tree'),(self.env.ref('odex_benefit.grant_benefit_form').id, 'form')],
- # 'res_model': 'grant.benefit',
- # 'type': 'ir.actions.act_window',
- # 'target': 'main',
- # }
-
-class EntityReturnReasonWizard(models.TransientModel):
- _name = 'entity.return.reason.wizard'
- _description = "Return Reason Wizard"
-
- def _default_entity(self):
- return self._context.get('active_id')
-
- def _get_target_state(self):
- return self._context.get('target_state', 'complete_info')
-
- entity_id = fields.Many2one("grant.benefit", string="Benefit", default=_default_entity)
- suspend_reason_id = fields.Many2one("suspend.reason", string="Return Reason", required=True)
- return_reason = fields.Text(string='Notes', required=True)
- target_state = fields.Char(string='Target State', default=_get_target_state)
-
- def action_confirm_return(self):
- for rec in self:
- if rec.entity_id:
- target_state = rec.target_state
- state_label = dict(rec.entity_id.fields_get(['state'])['state']['selection']).get(target_state,
- target_state)
-
- subject = _('Benefit')
- body = _(
- "The benefit record %s state has been changed to %s.
"
- "Return Reason: %s
"
- "Notes: %s") % (rec.entity_id.name,state_label,rec.suspend_reason_id.name or '',rec.return_reason or '')
-
- rec.entity_id.message_post(
- body=body,
- subject=subject,
- message_type='notification'
- )
-
- rec.entity_id.sudo().write({"state": target_state,"family_return_reason": rec.return_reason})
- if rec.entity_id.state == 'draft':
- rec.entity_id.sudo().write({"family_edit": True})
- message = rec.entity_id.create_message(target_state)
- rec.entity_id.user_id.send_sms_to_user(message, rec.entity_id.sms_phone)
-
- return {'type': 'ir.actions.act_window_close'}
-
- @api.onchange('target_state')
- def _onchange_target_state(self):
- domain = []
- if self.target_state == "draft":
- domain = [('is_family_return_reason', '=', True)]
- elif self.target_state == "complete_info":
- domain = [('is_return_reason', '=', True)]
- return {'domain': {'suspend_reason_id': domain}}
\ No newline at end of file
diff --git a/odex25_ensan/odex_benefit/wizards/entity_refused_wizard_view.xml b/odex25_ensan/odex_benefit/wizards/entity_refused_wizard_view.xml
deleted file mode 100644
index 3ba2f5980..000000000
--- a/odex25_ensan/odex_benefit/wizards/entity_refused_wizard_view.xml
+++ /dev/null
@@ -1,120 +0,0 @@
-
-%s
-
-
-
%s
Reason: %s") % (self.env.user.name, self.reason),
- message_type='notification'
- )
- return {'type': 'ir.actions.act_window_close'}
\ No newline at end of file
diff --git a/odex25_ensan/odex_benefit/wizards/visit_location_otp_wizard_view.xml b/odex25_ensan/odex_benefit/wizards/visit_location_otp_wizard_view.xml
deleted file mode 100644
index 06e1c43a4..000000000
--- a/odex25_ensan/odex_benefit/wizards/visit_location_otp_wizard_view.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-
-
"
- "Refusal Reason: %s
"
- "Notes: %s") % (
- rec.visit_location_id.name, state_label, rec.suspend_reason_id.name or '', rec.refusal_notes or '')
-
- rec.visit_location_id.message_post(
- body=body,
- subject=subject,
- message_type='notification'
- )
-
- rec.visit_location_id.sudo().write({"state": target_state, "reason": rec.refusal_notes})
-
- return {'type': 'ir.actions.act_window_close'}
diff --git a/odex25_ensan/odex_benefit/wizards/visit_location_refused_wizard_view.xml b/odex25_ensan/odex_benefit/wizards/visit_location_refused_wizard_view.xml
deleted file mode 100644
index bd6dfc86e..000000000
--- a/odex25_ensan/odex_benefit/wizards/visit_location_refused_wizard_view.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
- ${ctx.get('body')} -
- -- Thank you, -
- -- From ${ctx.get('company_name')}. -
- ]]> - - - diff --git a/odex25_ensan/odex_takaful/i18n/ar_001.po b/odex25_ensan/odex_takaful/i18n/ar_001.po deleted file mode 100644 index 3582cee76..000000000 --- a/odex25_ensan/odex_takaful/i18n/ar_001.po +++ /dev/null @@ -1,7565 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * odex_takaful -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 14.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-19 10:59+0000\n" -"PO-Revision-Date: 2025-10-19 10:59+0000\n" -"Last-Translator: \n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Plural-Forms: \n" - -#. module: odex_takaful -#: model:ir.actions.report,print_report_name:odex_takaful.action_report_transfer_deduction_pdf -msgid "" -"\n" -" (object.sponsorship_creation_date and ('Transfer Deduction Report - %s' % (object.sponsorship_creation_date.strftime('%Y-%m-%d'))) or 'Transfer Deduction Report')\n" -" " -msgstr "" - -#. module: odex_takaful -#: model:mail.template,body_html:odex_takaful.push_notification_email_template -msgid "" -"\n" -"\n" -" Dear ${ctx.get('partner_name')},\n" -"
\n" -" \n" -"\n" -" ${ctx.get('body')}\n" -"
\n" -"\n" -"\n" -" Thank you,\n" -"
\n" -"\n" -"\n" -" From ${ctx.get('company_name')}.\n" -"
\n" -" " -msgstr "" - -#. module: odex_takaful -#: code:addons/odex_takaful/models/takaful_month_payment.py:0 -#, python-format -msgid " No benefits for pay" -msgstr "" - -#. module: odex_takaful -#: code:addons/odex_takaful/models/takaful_sponorship_model.py:0 -#, python-format -msgid " Please set Journal in Payment Details " -msgstr "يرجى تعيين اليومية في تفاصيل الدفع" - -#. module: odex_takaful -#: code:addons/odex_takaful/models/takaful_sponorship_model.py:0 -#, python-format -msgid " Please set donor's payable and receivable accounts first " -msgstr "يرجى تحديد حسابات الدفع والقبض أولا" - -#. module: odex_takaful -#: code:addons/odex_takaful/models/takaful_sponorship_model.py:0 -#: code:addons/odex_takaful/models/takaful_sponorship_model.py:0 -#, python-format -msgid "" -" Please set income journal in settings (kafala_journal_id Payment Journal)" -msgstr "يرجى ضبط دفتر الإيراد في الإعدادات" - -#. module: odex_takaful -#: code:addons/odex_takaful/models/takaful_sponorship_model.py:0 -#, python-format -msgid " Please set orphan restricted income account in settings " -msgstr "يرجى تعيين حساب الإيراد المقيد للأيتام في الإعدادات" - -#. module: odex_takaful -#: code:addons/odex_takaful/models/takaful_sponorship_model.py:0 -#, python-format -msgid " Please set widow restricted income account in settings " -msgstr "يرجى تعيين حساب الإيراد المقيد للأرملة في الإعدادات" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_donations_items___quantity -msgid " Quantity" -msgstr "" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsor__event_count -msgid "# Events" -msgstr "عدد الفعاليات" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsor__meeting_count -msgid "# Meetings" -msgstr "عدد الاجتماعات" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsor__operation_count -msgid "# Of Operations" -msgstr "العمليات" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsor__signature_count -msgid "# Signatures" -msgstr "التوقيعات" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsor__task_count -msgid "# Tasks" -msgstr "عدد المهام" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsor__supplier_invoice_count -msgid "# Vendor Bills" -msgstr "عدد فواتير الموردين" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsor__contribution_count -msgid "# of Contributions" -msgstr "المساهمين" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsor__gift_count -msgid "# of Gifts" -msgstr "عدد الهدايا" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsor__kafalat_count -msgid "# of Kafalat" -msgstr "عدد الكفالات" - -#. module: odex_takaful -#: model:mail.template,subject:odex_takaful.push_notification_email_template -msgid "${ctx.get('company_name')} - ${ctx.get('title')}" -msgstr "" - -#. module: odex_takaful -#: model_terms:ir.ui.view,arch_db:odex_takaful.product_product_view_kanban -msgid "" -msgstr "" - -#. module: odex_takaful -#: model_terms:ir.ui.view,arch_db:odex_takaful.product_product_view_kanban -msgid "" -msgstr "" - -#. module: odex_takaful -#: code:addons/odex_takaful/models/takaful_sponorship_model.py:0 -#, python-format -msgid "" -"\n" -" Create a new product\n" -"
" -msgstr "" - -#. module: odex_takaful -#: model_terms:ir.ui.view,arch_db:odex_takaful.takaful_sponsorship_payment_form -msgid " Months" -msgstr "" - -#. module: odex_takaful -#: model_terms:ir.ui.view,arch_db:odex_takaful.takaful_sponsorship_payment_form -msgid " Riyal" -msgstr "" - -#. module: odex_takaful -#: model_terms:ir.ui.view,arch_db:odex_takaful.takaful_settings_view2 -msgid "Hours" -msgstr "الساعات" - -#. module: odex_takaful -#: model_terms:ir.ui.view,arch_db:odex_takaful.kafalat_payment_report_pdf -#: model_terms:ir.ui.view,arch_db:odex_takaful.makfuleen_report_pdf -msgid " Sponsor Name: " -msgstr "" - -#. module: odex_takaful -#: model_terms:ir.ui.view,arch_db:odex_takaful.benefit_payment_report_pdf -msgid "Benefits Payments Report" -msgstr "" - -#. module: odex_takaful -#: model_terms:ir.ui.view,arch_db:odex_takaful.benefit_month_payment_share -msgid "Benefits Payments Shares Report From Sponsorship:" -msgstr "" - -#. module: odex_takaful -#: model_terms:ir.ui.view,arch_db:odex_takaful.benefit_month_payment_report_pdf -msgid "Sponsorship Monthly Payments of Benefits :" -msgstr "" - -#. module: odex_takaful -#: model_terms:ir.ui.view,arch_db:odex_takaful.report_payment_voucher -msgid "Amount Paid:" -msgstr "مبلغ التبرع:" - -#. module: odex_takaful -#: model_terms:ir.ui.view,arch_db:odex_takaful.report_payment_voucher -msgid "Beneficiary:" -msgstr "المستفيد:" - -#. module: odex_takaful -#: model_terms:ir.ui.view,arch_db:odex_takaful.report_transfer_deduction_document -msgid "Benefit Members" -msgstr "الأفراد المستفيدين" - -#. module: odex_takaful -#: model_terms:ir.ui.view,arch_db:odex_takaful.report_transfer_deduction_document -msgid "Branches" -msgstr "الفروع" - -#. module: odex_takaful -#: model_terms:ir.ui.view,arch_db:odex_takaful.report_payment_voucher -msgid "Donation Amount:" -msgstr "المبلغ المدفوع:" - -#. module: odex_takaful -#: model_terms:ir.ui.view,arch_db:odex_takaful.report_payment_voucher -msgid "Donation Name:" -msgstr "اسم التبرع:" - -#. module: odex_takaful -#: model_terms:ir.ui.view,arch_db:odex_takaful.report_payment_voucher -msgid "Donation Type:" -msgstr "نوع التبرع:" - -#. module: odex_takaful -#: model_terms:ir.ui.view,arch_db:odex_takaful.report_transfer_deduction_document -msgid "End Date" -msgstr "تاريخ النهاية" - -#. module: odex_takaful -#: model_terms:ir.ui.view,arch_db:odex_takaful.report_payment_voucher -msgid "Payment Date:" -msgstr "تاريخ الدفع:" - -#. module: odex_takaful -#: model_terms:ir.ui.view,arch_db:odex_takaful.report_payment_voucher -msgid "Payment Method:" -msgstr "طريقة الدفع:" - -#. module: enasan_geidea_sponsorship -#: model_terms:ir.ui.view,arch_db:enasan_geidea_sponsorship.view_account_payment_register_form_geidea -msgid "Process on Terminal" -msgstr "الدفع على المنصة" - -#. module: odex_takaful -#: model_terms:ir.ui.view,arch_db:odex_takaful.report_transfer_deduction_document -msgid "Payment Method" -msgstr "طريقة الدفع" - -#. module: odex_takaful -#: model_terms:ir.ui.view,arch_db:odex_takaful.report_payment_voucher -msgid "Point of Sale:" -msgstr "نقطة البيع:" - -#. module: odex_takaful -#: model_terms:ir.ui.view,arch_db:odex_takaful.report_payment_voucher -msgid "Scheduling Sequence(s):" -msgstr "تسلسلات الجدولة:" - -#. module: odex_takaful -#: model_terms:ir.ui.view,arch_db:odex_takaful.report_payment_voucher -msgid "Sponsor Name:" -msgstr "المتبرع/الكافل:" - -#. module: odex_takaful -#: model_terms:ir.ui.view,arch_db:odex_takaful.report_transfer_deduction_document -msgid "Sponsors" -msgstr "المتبرعين" - -#. module: odex_takaful -#: model_terms:ir.ui.view,arch_db:odex_takaful.report_transfer_deduction_document -msgid "Start Date" -msgstr "تاريخ البداية" - -#. module: odex_takaful -#: model_terms:ir.ui.view,arch_db:odex_takaful.report_transfer_deduction_document -msgid "Selected Criteria" -msgstr "المعايير المختارة" - -#. module: odex_takaful -#: model_terms:ir.ui.view,arch_db:odex_takaful.report_transfer_deduction_document -msgid "Sponsorship Details" -msgstr "تفاصيل الكفالات" - -#. module: odex_takaful -#: code:addons/odex_takaful/models/res_partner.py:0 -#, python-format -msgid "" -"A contact cannot be both Family/Beneficiary and Donor/Member/Sponsor at the " -"same time!" -msgstr "لا يمكن أن تكون جهة الاتصال أسرة/مستفيد ومتبرع/عضو/كافل في نفس الوقت!" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_donations_items__account_id -#: model:ir.model.fields,field_description:odex_takaful.field_month_payment__account_id -msgid "Account" -msgstr "حساب" - -#. module: odex_takaful -#: code:addons/odex_takaful/reports/month_payment_report.py:0 -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsor__account_number -#, python-format -msgid "Account Number" -msgstr "رقم الحساب" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsor__property_account_payable_id -msgid "Account Payable" -msgstr "حساب الدائنون" - -#. module: odex_takaful -#: model:ir.model,name:odex_takaful.model_account_payment -msgid "Account Payment Inherit Model" -msgstr "" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_payment_details_lines__account_payment_method -msgid "Account Payment Method" -msgstr "طريقة الدفع المرتبطة بالحاب" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsor__property_account_receivable_id -msgid "Account Receivable" -msgstr "حساب المدينون" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsor__account_type -msgid "Account Type" -msgstr "نوع الحساب" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_donations_details_lines__message_needaction -#: model:ir.model.fields,field_description:odex_takaful.field_month_payment__message_needaction -#: model:ir.model.fields,field_description:odex_takaful.field_replacement_process__message_needaction -#: model:ir.model.fields,field_description:odex_takaful.field_sponsorship_cancellation__message_needaction -#: model:ir.model.fields,field_description:odex_takaful.field_sponsorship_payment__message_needaction -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsor__message_needaction -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsorship__message_needaction -msgid "Action Needed" -msgstr "إجراء مطلوب" - -#. module: odex_takaful -#: model_terms:ir.ui.view,arch_db:odex_takaful.donations_details_lines_view_form -msgid "Action Refund" -msgstr "إجراء الإرجاع" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsor__activation_mode -msgid "Activation Mode" -msgstr "نموذج الأنشطة" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsor__active -#: model:ir.model.fields.selection,name:odex_takaful.selection__donations_details_lines__state__active -#: model_terms:ir.ui.view,arch_db:odex_takaful.donations_details_lines_view_search -msgid "Active" -msgstr "نشط" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsor__active_lang_count -msgid "Active Lang Count" -msgstr "عدد اللغات النشطة" - -#. module: odex_takaful -#: model:ir.actions.server,name:odex_takaful.action_active_sponsor_report -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsor__active_counts -#: model_terms:ir.ui.view,arch_db:odex_takaful.active_sponsor_report_pivot_view -msgid "Active Sponsors Count" -msgstr "عدد الكفلاء النشطين" - -#. module: odex_takaful -#: code:addons/odex_takaful/models/takaful_sponsor_model.py:0 -#, python-format -msgid "Active Sponsors Count Report" -msgstr "تقرير عدد الكفلاء النشطين" - -#. module: odex_takaful -#: model:ir.ui.menu,name:odex_takaful.active_sponsor_report_menu -msgid "Active Sponsors Report" -msgstr "تقرير الكفلاء النشطين" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_month_payment__activity_ids -#: model:ir.model.fields,field_description:odex_takaful.field_replacement_process__activity_ids -#: model:ir.model.fields,field_description:odex_takaful.field_sponsorship_cancellation__activity_ids -#: model:ir.model.fields,field_description:odex_takaful.field_sponsorship_payment__activity_ids -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsor__activity_ids -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsorship__activity_ids -msgid "Activities" -msgstr "الأنشطة" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_month_payment__activity_exception_decoration -#: model:ir.model.fields,field_description:odex_takaful.field_replacement_process__activity_exception_decoration -#: model:ir.model.fields,field_description:odex_takaful.field_sponsorship_cancellation__activity_exception_decoration -#: model:ir.model.fields,field_description:odex_takaful.field_sponsorship_payment__activity_exception_decoration -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsor__activity_exception_decoration -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsorship__activity_exception_decoration -msgid "Activity Exception Decoration" -msgstr "زخرفة استثناء النشاط" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_month_payment__activity_state -#: model:ir.model.fields,field_description:odex_takaful.field_replacement_process__activity_state -#: model:ir.model.fields,field_description:odex_takaful.field_sponsorship_cancellation__activity_state -#: model:ir.model.fields,field_description:odex_takaful.field_sponsorship_payment__activity_state -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsor__activity_state -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsorship__activity_state -msgid "Activity State" -msgstr "حالة النشاط" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_month_payment__activity_type_icon -#: model:ir.model.fields,field_description:odex_takaful.field_replacement_process__activity_type_icon -#: model:ir.model.fields,field_description:odex_takaful.field_sponsorship_cancellation__activity_type_icon -#: model:ir.model.fields,field_description:odex_takaful.field_sponsorship_payment__activity_type_icon -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsor__activity_type_icon -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsorship__activity_type_icon -msgid "Activity Type Icon" -msgstr "أيقونة نوع النشاط" - -#. module: odex_takaful -#: model_terms:ir.ui.view,arch_db:odex_takaful.add_details_wizard_form -msgid "Add" -msgstr "إضافة" - -#. module: odex_takaful -#: code:addons/odex_takaful/models/takaful_conf.py:0 -#, python-format -msgid "Add Details Wizard" -msgstr "إضافة التفاصيل" - -#. module: odex_takaful -#: model_terms:ir.ui.view,arch_db:odex_takaful.product_product_view_kanban -msgid "Add Payment" -msgstr "طريقة الدفع" - -#. module: odex_takaful -#: model_terms:ir.ui.view,arch_db:odex_takaful.product_product_view_kanban -msgid "Add Payment Method" -msgstr "طريقة الدفع" - -#. module: odex_takaful -#: model_terms:ir.ui.view,arch_db:odex_takaful.takaful_sponsorship_form -msgid "Add a line" -msgstr "إضافة بند" - -#. module: odex_takaful -#: model_terms:ir.ui.view,arch_db:odex_takaful.takaful_sponsorship_form -msgid "Add a section" -msgstr "إضافة قطاع" - -#. module: odex_takaful -#: code:addons/odex_takaful/models/donation_details_lines.py:0 -#, python-format -msgid "Added: %s" -msgstr "" - -#. module: odex_takaful -#: model:ir.model.fields,help:odex_takaful.field_takaful_sponsor__l10n_sa_additional_identification_number -msgid "Additional Identification Number for Seller/Buyer" -msgstr "رقم التعريف الإضافي للبائع/المشتري" - -#. module: odex_takaful -#: model:ir.model.fields,help:odex_takaful.field_takaful_sponsor__l10n_sa_additional_identification_scheme -msgid "Additional Identification scheme for Seller/Buyer" -msgstr "مخطط التعريف الإضافي للبائع/المشتري" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsor__additional_info -msgid "Additional info" -msgstr "معلومات إضافية" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsor__type -msgid "Address Type" -msgstr "نوع العنوان" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsor__affiliate_id -msgid "Affiliate" -msgstr "الشريك التابع" - -#. module: odex_takaful -#: model:ir.model,name:odex_takaful.model_res_config_settings -msgid "Affiliate Configuration Model" -msgstr "" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsor__affiliate_key -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsor__res_affiliate_key -msgid "Affiliate key" -msgstr "مفتاح الشريك التابع" - -#. module: odex_takaful -#: code:addons/odex_takaful/models/takaful_notification.py:0 -#: model:ir.model.fields.selection,name:odex_takaful.selection__takaful_notification__notification_type__after_kafala_end -#, python-format -msgid "After Kafala End Date" -msgstr "بعد انتهاء تاريخ الكفالة" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsor__age -msgid "Age" -msgstr "العمر" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_donations_details_lines__age_category_id -#: model:ir.model.fields,field_description:odex_takaful.field_replacement_wiz__age_category_id -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsorship__age_category_id -msgid "Age Category" -msgstr "الفئة العمرية" - -#. module: odex_takaful -#: code:addons/odex_takaful/wizards/transfer_deduction_wizard.py:0 -#: code:addons/odex_takaful/wizards/transfer_deduction_wizard.py:0 -#: code:addons/odex_takaful/wizards/transfer_deduction_wizard.py:0 -#: code:addons/odex_takaful/wizards/transfer_deduction_wizard.py:0 -#, python-format -msgid "All" -msgstr "" - -#. module: odex_takaful -#: model:ir.model.fields,help:odex_takaful.field_takaful_sponsor__lang -msgid "" -"All the emails and documents sent to this contact will be translated in this" -" language." -msgstr "" -"سيتم ترجمة كافة رسائل البريد الإلكتروني والمستندات المرسلة لجهة الاتصال " -"المختارة إلى هذه اللغة." - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_donations_details_lines__allowed_payment_method_ids -msgid "Allowed Payment Method" -msgstr "طرق الدفع المسموحة" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsorship__allowed_sponsor_ids -msgid "Allowed Sponsor" -msgstr "" - -#. module: odex_takaful -#: code:addons/odex_takaful/reports/month_payment_report.py:0 -#: code:addons/odex_takaful/reports/month_payment_report.py:0 -#: code:addons/odex_takaful/wizards/transfer_deduction_wizard.py:0 -#: model:ir.model.fields,field_description:odex_takaful.field_month_payment_line__amount -#: model:ir.model.fields,field_description:odex_takaful.field_sponsorship_scheduling_line__amount -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_contribution__amount -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsor_operation__amount -#: model_terms:ir.ui.view,arch_db:odex_takaful.benefit_month_payment_report_pdf -#: model_terms:ir.ui.view,arch_db:odex_takaful.benefit_month_payment_share -#: model_terms:ir.ui.view,arch_db:odex_takaful.benefit_payment_report_pdf -#: model_terms:ir.ui.view,arch_db:odex_takaful.report_transfer_deduction_document -#, python-format -msgid "Amount" -msgstr "مبلغ" - -#. module: odex_takaful -#: model_terms:ir.ui.view,arch_db:odex_takaful.product_product_view_kanban -msgid "Amount :" -msgstr "المبلغ :" - -#. module: odex_takaful -#: model:ir.model.fields,help:odex_takaful.field_donation_extension_wizard__amount -msgid "Amount per month for the extension period" -msgstr "المبلغ لكل شهر لفترة التمديد" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsorship__another_sponsors -#: model_terms:ir.ui.view,arch_db:odex_takaful.takaful_sponsorship_form -msgid "Another Sponsors" -msgstr "المهدي لهم" - -#. module: odex_takaful -#: model_terms:ir.ui.view,arch_db:odex_takaful.benefit_month_payment_form -msgid "Approve" -msgstr "تصديق الموارد البشرية" - -#. module: odex_takaful -#: model:ir.model.fields.selection,name:odex_takaful.selection__sponsorship_scheduling_line__status__approve_refund -#: model:ir.model.fields.selection,name:odex_takaful.selection__sponsorship_states__name__approve_refund -#: model:ir.model.fields.selection,name:odex_takaful.selection__takaful_sponsorship__state__approve_refund -#: model_terms:ir.ui.view,arch_db:odex_takaful.donations_details_lines_view_form -#: model_terms:ir.ui.view,arch_db:odex_takaful.takaful_sponsorship_form -#: model_terms:ir.ui.view,arch_db:odex_takaful.takaful_sponsorship_view_search -#: model_terms:ir.ui.view,arch_db:odex_takaful.view_sponsorship_scheduling_line_search -msgid "Approve Refund" -msgstr "موافقة الإرجاع" - -#. module: odex_takaful -#: model:ir.model.fields.selection,name:odex_takaful.selection__month_payment__state__approve -msgid "Approved" -msgstr "تم التصديق" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsor__approved_amt -msgid "Approved Amount" -msgstr "" - -#. module: odex_takaful -#: model_terms:ir.ui.view,arch_db:odex_takaful.benefit_month_payment_form -msgid "Are you sure you want to Approve?" -msgstr "هل أنت متأكد أنك تريد الموافقة؟" - -#. module: odex_takaful -#: model_terms:ir.ui.view,arch_db:odex_takaful.benefit_month_payment_form -msgid "Are you sure you want to Cancel?" -msgstr "هل أنت متأكد أنك تريد الإلغاء؟" - -#. module: odex_takaful -#: model_terms:ir.ui.view,arch_db:odex_takaful.benefit_month_payment_form -msgid "Are you sure you want to Create lines Manually?" -msgstr "هل أنت متأكد أنك تريد إنشاء البنود يدوياً؟" - -#. module: odex_takaful -#: model_terms:ir.ui.view,arch_db:odex_takaful.benefit_month_payment_form -msgid "Are you sure you want to Refuse?" -msgstr "هل أنت متأكد أنك تريد الرفض؟" - -#. module: odex_takaful -#: model_terms:ir.ui.view,arch_db:odex_takaful.benefit_month_payment_form -msgid "Are you sure you want to Send Pay Notify?" -msgstr "هل أنت متأكد أنك تريد إرسال إشعار الدفع؟" - -#. module: odex_takaful -#: model_terms:ir.ui.view,arch_db:odex_takaful.benefit_month_payment_form -msgid "Are you sure you want to Submit?" -msgstr "هل أنت متأكد أنك تريد الإرسال؟" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_sponsorship_benefit_arrears__arrears_month_number -msgid "Arrears Months Number" -msgstr "عدد الأشهر المتأخرة" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_sponsorship_benefit_arrears__arrears_total -msgid "Arrears Total" -msgstr "إجمالي المتأخرات" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_donations_details_lines__message_attachment_count -#: model:ir.model.fields,field_description:odex_takaful.field_month_payment__message_attachment_count -#: model:ir.model.fields,field_description:odex_takaful.field_replacement_process__message_attachment_count -#: model:ir.model.fields,field_description:odex_takaful.field_sponsorship_cancellation__message_attachment_count -#: model:ir.model.fields,field_description:odex_takaful.field_sponsorship_payment__message_attachment_count -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsor__message_attachment_count -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsorship__message_attachment_count -msgid "Attachment Count" -msgstr "عدد المرفقات" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_donate_for_another_person__attachment_ids -#: model:ir.model.fields,field_description:odex_takaful.field_donation_extension_history__attachment_ids -#: model:ir.model.fields,field_description:odex_takaful.field_donations_details_lines__attachment_ids -#: model:ir.model.fields,field_description:odex_takaful.field_donations_items__attachment_ids -#: model:ir.model.fields,field_description:odex_takaful.field_grant_benefit_invoice__attachment_ids -#: model:ir.model.fields,field_description:odex_takaful.field_month_payment__attachment_ids -#: model:ir.model.fields,field_description:odex_takaful.field_month_payment_line__attachment_ids -#: model:ir.model.fields,field_description:odex_takaful.field_payment_details_lines__attachment_ids -#: model:ir.model.fields,field_description:odex_takaful.field_points_of_sale_custom__attachment_ids -#: model:ir.model.fields,field_description:odex_takaful.field_preferred_communication__attachment_ids -#: model:ir.model.fields,field_description:odex_takaful.field_refund_details_lines__attachment_ids -#: model:ir.model.fields,field_description:odex_takaful.field_refund_reasons__attachment_ids -#: model:ir.model.fields,field_description:odex_takaful.field_refund_wiz__attachment_ids -#: model:ir.model.fields,field_description:odex_takaful.field_replacement_process__attachment_ids -#: model:ir.model.fields,field_description:odex_takaful.field_replacement_process_line__attachment_ids -#: model:ir.model.fields,field_description:odex_takaful.field_replacement_reasons__attachment_ids -#: model:ir.model.fields,field_description:odex_takaful.field_sponsorship_benefit_arrears__attachment_ids -#: model:ir.model.fields,field_description:odex_takaful.field_sponsorship_cancellation__attachment_ids -#: model:ir.model.fields,field_description:odex_takaful.field_sponsorship_payment__attachment_ids -#: model:ir.model.fields,field_description:odex_takaful.field_sponsorship_reason_stop__attachment_ids -#: model:ir.model.fields,field_description:odex_takaful.field_sponsorship_scheduling_line__attachment_ids -#: model:ir.model.fields,field_description:odex_takaful.field_sponsorship_states__attachment_ids -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_contribution__attachment_ids -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_message_template__attachment_ids -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_payment_method__attachment_ids -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_push_notification__attachment_ids -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsor__attachment_takaful_sponsor_ids -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsor_operation__attachment_ids -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsorship__attachment_ids -msgid "Attachments" -msgstr "المرفقات" - -#. module: odex_takaful -#: model:ir.model.fields.selection,name:odex_takaful.selection__sponsorship_cancellation__cancel_type__sys -msgid "Automatically" -msgstr "تلقائياً" - -#. module: odex_takaful -#: model:ir.model.fields,help:odex_takaful.field_takaful_sponsor__receipt_reminder_email -msgid "" -"Automatically send a confirmation email to the vendor X days before the " -"expected receipt date, asking him to confirm the exact date." -msgstr "" -"قم بإرسال بريد التأكيد الإلكتروني إلى المورّد بعدد الأيام قبل تاريخ الإيصال " -"المتوقع، تطلب فيه تأكيد التاريخ بالتحديد." - -#. module: odex_takaful -#: code:addons/odex_takaful/models/takaful_sponorship_model.py:0 -#, python-format -msgid "Bail Receipts Number %s" -msgstr "مقبوضات الكفالة رقم %s" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsor__bank_account_count -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsor__bank_id -#: model_terms:ir.ui.view,arch_db:odex_takaful.benefit_month_payment_report_pdf -#: model_terms:ir.ui.view,arch_db:odex_takaful.benefit_month_payment_share -msgid "Bank" -msgstr "البنك" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsor__bank_entity_name -msgid "Bank Entity Name" -msgstr "اسم كيان البنك" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_benefits_representative__bank_journal_id -#: model:ir.model.fields,field_description:odex_takaful.field_external_benefits__bank_journal_id -#: model:ir.model.fields,field_description:odex_takaful.field_grant_benefit__bank_journal_id -#: model:ir.model.fields,field_description:odex_takaful.field_res_partner__bank_journal_id -#: model:ir.model.fields,field_description:odex_takaful.field_res_users__bank_journal_id -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsor__bank_journal_id -msgid "Bank Journal" -msgstr "يومية البنك" - -#. module: odex_takaful -#: code:addons/odex_takaful/reports/month_payment_report.py:0 -#: code:addons/odex_takaful/reports/month_payment_report.py:0 -#: model:ir.model.fields,field_description:odex_takaful.field_sponsorship_payment__bank_id -#, python-format -msgid "Bank Name" -msgstr "اسم البنك" - -#. module: odex_takaful -#: code:addons/odex_takaful/reports/month_payment_report.py:0 -#: code:addons/odex_takaful/reports/month_payment_report.py:0 -#, python-format -msgid "Bank Sheet" -msgstr "ورقة البنك" - -#. module: odex_takaful -#: model:ir.model.fields.selection,name:odex_takaful.selection__takaful_payment_method__payment_method__bank_transfer -#: model:ir.model.fields.selection,name:odex_takaful.selection__takaful_sponsorship__parent_payment_method__bank_transfer -#: model:ir.model.fields.selection,name:odex_takaful.selection__takaful_sponsorship__payment_method__bank -#: model_terms:ir.ui.view,arch_db:odex_takaful.view_sponsorship_scheduling_line_search -msgid "Bank Transfer" -msgstr "حوالة بنكية" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_payment_details_lines__bank_transfer_amount -msgid "Bank Transfer Amount" -msgstr "مبلغ الحوالة" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsor__bank_ids -msgid "Banks" -msgstr "البنوك" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsor__barcode -msgid "Barcode" -msgstr "باركود" - -#. module: odex_takaful -#: model_terms:ir.ui.view,arch_db:odex_takaful.takaful_sponsorship_form -msgid "Basic Information" -msgstr "البيانات الأساسية" - -#. module: odex_takaful -#: code:addons/odex_takaful/models/takaful_notification.py:0 -#: model:ir.model.fields.selection,name:odex_takaful.selection__takaful_notification__notification_type__before_cancel -#, python-format -msgid "Before Cancel" -msgstr "قبل الإلغاء" - -#. module: odex_takaful -#: code:addons/odex_takaful/models/takaful_notification.py:0 -#: model:ir.model.fields.selection,name:odex_takaful.selection__takaful_notification__notification_type__before_finish -#, python-format -msgid "Before Kafala End Date" -msgstr "قبل تاريخ إنتهاء الكفالة" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_grant_benefit_invoice__benefit_ids -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_contribution__benefit_ids -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsor_operation__benefit_ids -msgid "Beneficiaries" -msgstr "المستفيدين" - -#. module: odex_takaful -#: model:ir.actions.act_window,name:odex_takaful.benefit_grant_due_invoice_action -msgid "Beneficiaries Due Payments" -msgstr "المدفوعات المستحقة للمستفيدين" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_donations_details_lines__benefit_ids -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsorship__benefit_ids -msgid "Beneficiaries Names" -msgstr "أسماء المستفيدين" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsor__name_in_certificate -msgid "Beneficiaries Names In Certificate" -msgstr "أسماء المستفيدين في الشهادة" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_grant_benefit_invoice__benefit_type -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_contribution__benefit_type -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsor_operation__benefit_type -msgid "Beneficiaries Type" -msgstr "نوع المستفيدين" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsor__type_in_certificate -msgid "Beneficiaries Type In Certificate" -msgstr "نوع المستفيدين في الشهادة" - -#. module: odex_takaful -#: code:addons/odex_takaful/wizards/transfer_deduction_wizard.py:0 -#: model:ir.model.fields,field_description:odex_takaful.field_sponsorship_benefit_arrears__benefit_id -#: model:ir.model.fields,field_description:odex_takaful.field_sponsorship_scheduling_line__beneficiary_id -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_contribution__benefit_id -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsor_operation__benefit_id -#: model_terms:ir.ui.view,arch_db:odex_takaful.report_transfer_deduction_document -#: model_terms:ir.ui.view,arch_db:odex_takaful.view_sponsorship_scheduling_line_search -#, python-format -msgid "Beneficiary" -msgstr "المستفيد" - -#. module: odex_takaful -#: model:res.groups,name:odex_takaful.group_beneficiary_department_access -msgid "Beneficiary - Department Access" -msgstr "" - -#. module: odex_takaful -#: model_terms:ir.ui.view,arch_db:odex_takaful.takaful_sponsorship_form -msgid "Beneficiary Filters" -msgstr " حقول التصفية" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_add_benefit_wizard__benefit_id -#: model:ir.model.fields,field_description:odex_takaful.field_donations_details_lines__benefit_id -#: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsorship__benefit_id -msgid "Beneficiary Name" -msgstr "اسم المستفيد" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_sponsorship_benefit_arrears__benefit_type -msgid "Beneficiary Type" -msgstr "نوع المستفيد" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_month_payment_line__benefit_id -msgid "Benefit" -msgstr "ملف الأسرة" - -#. module: odex_takaful -#: model_terms:ir.ui.view,arch_db:odex_takaful.donations_details_lines_view_form -msgid "Benefit Details" -msgstr "تفاصيل ملف الأسرة" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_donations_details_lines__benefit_family_code -msgid "Benefit Family Code" -msgstr "" - -#. module: odex_takaful -#: code:addons/odex_takaful/reports/month_payment_report.py:0 -#: code:addons/odex_takaful/reports/month_payment_report.py:0 -#: model:ir.model.fields,field_description:odex_takaful.field_donations_details_lines__benefit_id_number -#: model_terms:ir.ui.view,arch_db:odex_takaful.benefit_month_payment_report_pdf -#: model_terms:ir.ui.view,arch_db:odex_takaful.benefit_month_payment_share -#: model_terms:ir.ui.view,arch_db:odex_takaful.benefit_payment_report_pdf -#, python-format -msgid "Benefit ID Number" -msgstr "رقم هوية المستفيد" - -#. module: odex_takaful -#: code:addons/odex_takaful/models/donation_details_lines.py:0 -#, python-format -msgid "Benefit IDs changed in a donation item:- Create a new donation -
""") - } - - @api.model - # @api.model_create_multi - def create(self, vals): - # Check if sequence_no is not already set - if vals.get('sequence_no', '/') == '/': - # Assign the next sequence number - vals['sequence_no'] = self.env['ir.sequence'].next_by_code('donations.details.lines.sequence') or '/' - if vals.get('display_type'): - vals.update({ - 'product_template_id': False, - 'donation_type': False, - }) - - record = super(DonationsDetailsLines, self).create(vals) - if record.benefit_ids == 1: - record.benefit_id = record.benefit_ids[0].id - print('Vals >>> ' , vals) - return record - - def write(self, vals): - res = False - for rec in self: - old_benefit = rec.benefit_id.name - old_benefits = rec.benefit_ids.mapped('name') # assuming benefit has a 'name' - old_benefits_set = set(old_benefits) - res |= super(DonationsDetailsLines, rec).write(vals) - rec.invalidate_cache() - rec = self.browse(rec.id) - - if 'display_type' in vals and self.filtered(lambda line: line.display_type != vals.get('display_type')): - raise UserError( - _("You cannot change the type of a sale quote line. Instead you should delete the current line and create a new line of the proper type.")) - if 'benefit_id' in vals: - new_benefit = rec.benefit_id.name or 'None' - sponsorship = self.env['takaful.sponsorship'].browse( - self.env.context.get(rec.sponsorship_id)) - if sponsorship and len(sponsorship) == 1: - message = _("Benefit changed from %s to %s in a donation item.") % ( - old_benefit or 'None', new_benefit) - sponsorship.message_post(body=message) - - # Auto-trigger state change when benefit is assigned to waiting line - - if 'benefit_ids' in vals: - new_benefits = rec.benefit_ids.mapped('name') - new_benefits_set = set(new_benefits) - - added = new_benefits_set - old_benefits_set - removed = old_benefits_set - new_benefits_set - - changes = [] - if added: - changes.append(_("Added: %s") % ', '.join(added)) - if removed: - changes.append(_("Removed: %s") % ', '.join(removed)) - - if changes: - # Find sponsorship - sponsorship = rec.sponsorship_id or self.env['takaful.sponsorship'].browse( - self.env.context.get(rec.sponsorship_id)) - - if sponsorship and len(sponsorship) == 1: - message = _("Benefit IDs changed in a donation item:- Create a new donation -
""") - } - - def sol_by_cart(self, operation, product_id, sponsorship_id): - """ - Create Sale Order Line By - Cart Functionality - """ - - sol_object = self.env["donations.details.lines"] - sol_data = dict() - sol_data["product_template_id"] = product_id.id - sol_data["sponsorship_id"] = sponsorship_id.id - # sol_data["donation_amount"] = product_id.fixed_donation_amount - sol_data["donation_amount"] = product_id.list_price - # sol_data["donation_amount"] = product_id.list_price * product_id._quantity - sol_data["donation_qty"] = product_id._quantity - sol_data["donation_types"] = 'donation' - sol_data["name"] = product_id.name - - if operation == "add": - sol_object.create(sol_data) - return - - - sol_ = sol_object.search( - [('sponsorship_id', '=', sponsorship_id.id), ('product_template_id', '=', product_id.id), ]) # ("cart_flag", "=", True) - - - if operation == "update": - sol_.update(sol_data) - - if operation == "remove": - sol_.unlink() - return - - def user_input_qty_sol(self, _qty, product_id, sponsorship_id): - # sol_object = self.env["donations.details.lines"] - # product_object = self.env["product.template"] - - # donation_id = product_object.search([('id', '=', product_id)]) - # sol_data = dict() - # sol_data["product_template_id"] = donation_id.id - # sol_data["sponsorship_id"] = sponsorship_id - # sol_data["donation_amount"] = donation_id.fixed_donation_amount - # sol_data["donation_types"] = 'donation' - # sol_data["name"] = donation_id.name - # so = sol_object.create(sol_data) - sol_object = self.env["donations.details.lines"].sudo() - product_object = self.env["product.template"].sudo() - - product = product_object.browse(product_id) - if not product.exists(): - return - - existing = sol_object.search([ - ("sponsorship_id", "=", sponsorship_id), - ("product_template_id", "=", product_id), - ], limit=1) - - if _qty and _qty > 0: - if existing: - existing.write({"donation_qty": _qty}) - else: - sol_object.create({ - "product_template_id": product.id, - "sponsorship_id": sponsorship_id, - "donation_types": 'donation', - "name": product.name, - "donation_qty": _qty, - "donation_amount": product.lst_price - }) - else: - # remove if qty <= 0 - if existing: - existing.unlink() - return - - @api.depends('journal_entry_ids') - def _compute_journal_entry_count(self): - for rec in self: - rec.journal_entry_count = len(rec.journal_entry_ids.filtered(lambda r: r.move_type == 'out_invoice')) - - @api.depends('journal_entry_ids') - def _compute_journal_entry_count_vendor(self): - for rec in self: - rec.journal_entry_count_vendor = len(rec.journal_entry_ids.filtered(lambda r: r.move_type == 'in_invoice')) - - @api.depends('donations_details_lines') - def _compute_donation_count(self): - for rec in self: - rec.donations_count = len(rec.donations_details_lines.filtered(lambda r: r.display_type == False)) + len(rec.donations_details_lines_mechanism_ids.filtered(lambda r: r.display_type == False)) - - def action_view_journal_entries(self): - self.ensure_one() # Ensure the method is called on a single record - action = self.env.ref('account.action_move_out_invoice_type').read()[0] - action['domain'] = [('move_type', '=', 'out_invoice'), ('id', 'in', self.journal_entry_ids.ids)] - action['context'] = { - 'default_takaful_sponsorship_id': self.id, - 'create': False - } - return action - - def action_view_journal_entries_vendor(self): - self.ensure_one() # Ensure the method is called on a single record - action = self.env.ref('account.action_move_out_invoice_type').read()[0] - action['domain'] = [('move_type', '=', 'in_invoice'), ('id', 'in', self.journal_entry_ids.ids)] - action['context'] = { - 'default_takaful_sponsorship_id': self.id, - 'create': False - } - return action - - @api.depends('journal_entry_ids') - def _compute_refund_move_count(self): - for rec in self: - rec.refund_move_count = len(rec.journal_entry_ids.filtered(lambda r: r.move_type == 'out_refund')) - - def action_view_refund_moves(self): - self.ensure_one() - return { - 'name': _('Moves'), - 'type': 'ir.actions.act_window', - 'res_model': 'account.move', - 'view_mode': 'tree,form', - 'domain': [('id', 'in', self.journal_entry_ids.filtered(lambda r: r.move_type == 'out_refund').ids)], - } - - def action_open_donation_catalog(self): - """ Opens product catalog to link products to sponsorship """ - self.ensure_one() - return { - 'name': _('Donation Catalog'), - 'type': 'ir.actions.act_window', - 'res_model': 'product.template', - 'view_mode': 'tree', - 'view_id': self.env.ref('odex_takaful.view_product_template_tree_sponsorship').id, - 'context': { - 'sponsorship_id': self.id, 'create': False, 'edit': False, 'delete': False, - }, - 'domain': [('donation_category', '=', 'donation'), ('id', 'not in', self.donations_details_lines.mapped('product_template_id').ids)], - 'target': 'new', - } - - def _compute_related_move_lines_records(self): - for record in self: - record.related_move_lines_records_count = len(self.env['account.move'].search([ - ('takaful_sponsorship_id', '=', record.id), ('move_type', '=', 'out_refund') - ]).mapped('line_ids').ids) - - def action_open_related_move_lines_records(self): - """ Opens a tree view with related records filtered by a dynamic domain """ - move_lines = self.env['account.move'].search([ - ('takaful_sponsorship_id', '=', self.id), ('move_type','=','out_refund') - ]).mapped('line_ids').ids - - return { - 'name': _('Moves'), - 'type': 'ir.actions.act_window', - 'res_model': 'account.move.line', - 'view_mode': 'tree,form', - 'domain': [('id', 'in', move_lines)], - } - - @api.depends('branch_custom_id') - def _compute_manager_id(self): - for record in self: - if record.branch_custom_id: - department = record.branch_custom_id.branch - record.manager_id = department.manager_id if department else False - - def action_show_payment_details(self): - self.write({'show_payment_details': True}) - return True - - def action_confirm_payment(self): - pass - - def _default_branch_custom_id(self): - return self.env['branch.settings'].sudo().search([('branch', '=', self.env.user.department_id.id)], limit=1) - - # @api.constrains('payment_details_lines') - # def check_payment_amount(self): - # total_amount = 0 - # for rec in self.payment_details_lines: - # total_amount += rec.donation_amount - # if total_amount != self.total_sponsorship_amount: - # raise ValidationError( - # _('Total Payment Amount Should be Total Sponsorship Amount')) - - @api.constrains('donations_details_lines','donations_details_lines_mechanism_ids') - def check_donation_types(self): - # Search for an existing record - record_exist = self.env["donations.details.lines"].search( - [('donation_type', '=', 'sponsorship'), - ('sponsorship_id', '=', self.id)], - ) - - # Raise error if record already exists - if record_exist and len(record_exist) > 1: - raise ValidationError(_("You cannot Add more than one sponsorship")) - - @api.constrains('end_date') - def check_end_date(self): - if self.sponsorship_duration == "temporary" and not self.end_date: - raise ValidationError( - _(u'Please Select End Date')) - - elif self.sponsorship_duration == "temporary" and self.end_date: - start_date = trunc_datetime(parse(str(self.start_date))).date() - end_date = trunc_datetime(parse(str(self.end_date))).date() - if start_date >= end_date: - raise ValidationError( - _(u'End Date Must Be More Than Start Date in Months')) - - @api.depends('benefit_id.benefit_id') - @api.onchange('benefit_id') - def _compute_supporter_status(self): - for rec in self: - if rec.benefit_id: - if rec.benefit_id.benefit_id: - rec.supporter_status = 'yes' - else: - rec.supporter_status = 'no' - else: - rec.supporter_status = '' - @api.depends('donations_details_lines', 'donations_details_lines_mechanism_ids') - def _get_total_sponsorship_amount(self): - for rec in self: - rec.total_sponsorship_amount = ( - sum(line.total_donation_amount for line in rec.donations_details_lines) + - sum(line.total_donation_amount for line in rec.donations_details_lines_mechanism_ids) - ) - @api.depends('donations_details_lines', 'donations_details_lines_mechanism_ids') - def _get_total_waqf_and_donation_amount(self): - for rec in self: - rec.total_waqf_and_donation_amount = ( - sum(line.total_donation_amount for line in - rec.donations_details_lines.filtered(lambda line: line.donation_type != 'sponsorship')) + - sum(line.total_donation_amount for line in rec.donations_details_lines_mechanism_ids.filtered( - lambda line: line.donation_type != 'sponsorship')) - ) - @api.onchange('donations_details_lines') - def onchange_donations_details_lines(self): - for rec in self: - rec.benefit_ids = ( - rec.donations_details_lines.mapped('benefit_ids').ids + - rec.donations_details_lines_mechanism_ids.mapped('benefit_ids').ids - ) - @api.depends('gender','education_status','education_level','sponsorship_type','benefit_type','age_category_id') - def _compute_domain_ids(self): - # Create a domain - self.members_domain_ids = [(6, 0, [])] - if self.benefit_type == 'orphan' and self.sponsorship_type: - base_domain = \ - [ - '|', ('state', '=', 'second_approve'), '&', ('state', 'in', ('waiting_approve', 'first_approve')),('action_type', '=', 'suspended'), - ('member_status', '=', 'benefit'), - '|', - ('relationn.relation_type', '=', 'daughter'), - ('relationn.relation_type', '=', 'son') - ] - if self.gender: - if self.gender == 'female': - base_domain = [ - '|', ('state', '=', 'second_approve'), '&', - ('state', 'in', ('waiting_approve', 'first_approve')), ('action_type', '=', 'suspended'), - ('member_status', '=', 'benefit'), ('relationn.relation_type', '=', 'daughter')] - if self.gender == 'male': - base_domain = [ - '|', ('state', '=', 'second_approve'), '&',('state', 'in', ('waiting_approve', 'first_approve')), ('action_type', '=', 'suspended'), - ('member_status', '=', 'benefit'),('relationn.relation_type', '=', 'son')] - if self.education_status: - base_domain.append(('education_status', '=', self.education_status)) - if self.education_level: - base_domain.append(('education_levels', '=', self.education_level.id)) - if self.age_category_id: - base_domain.append(('age', '<=', self.age_category_id.max_age)) - base_domain.append(('age', '>=', self.age_category_id.min_age)) - self.members_domain_ids = self.env['family.member'].sudo().search(base_domain) - domain = {'benefit_id': [('id', 'in', self.members_domain_ids.ids)]} - # return {'domain': domain} - if self.benefit_type == 'widow' and self.sponsorship_type: - self.benefit_count = 0 - self.min_needs_percent = 0 - self.max_needs_percent = 0 - base_domain = ['|',('state','=','second_approve'),'&',('state','in',('waiting_approve','first_approve')),('action_type','=','suspended'),('member_status','=','benefit'),'|',('relationn.relation_type', '=', 'mother'),('relationn.relation_type', '=', 'replacement_mother')] - if self.education_status: - base_domain.append(('education_status', '=', self.education_status)) - if self.education_level: - base_domain.append(('education_levels', '=', self.education_level.id)) - if self.age_category_id: - base_domain.append(('age', '<=', self.age_category_id.max_age)) - base_domain.append(('age', '>=', self.age_category_id.min_age)) - self.members_domain_ids = self.env['family.member'].sudo().search(base_domain) - domain = {'benefit_id': [('id', 'in', self.members_domain_ids.ids)]} - # return {'domain': domain} - - # @api.depends('sponsorship_type') - # def onchange_benefit_type(self): - # # Create a domain - # if self.benefit_type and self.benefit_id and not self.benefit_id.benefit_type == self.benefit_type: - # self.benefit_id = False - # elif self.benefit_type and self.benefit_ids and not self.benefit_ids[0].benefit_type == self.benefit_type: - # self.benefit_ids = [(6, 0, [])] - # self.benefit_count = 0 - # self.min_needs_percent = 0 - # self.max_needs_percent = 0 - # - # if self.benefit_type and self.sponsorship_type == 'person': - # self.benefit_ids = [(6, 0, [])] - # self.benefit_count = 0 - # self.min_needs_percent = 0 - # self.max_needs_percent = 0 - # base_domain = [('state', 'in', ('second_approve', 'temporarily_suspended', 'suspended_first_approve'))] - # if self.gender: - # if self.gender == 'female': - # base_domain.append(('relationn.relation_type', '=','daughter')) - # if self.gender == 'male': - # base_domain.append(('relationn.relation_type', '=', 'son')) - # if self.education_status: - # base_domain.append(('education_status', '=', self.education_status)) - # if self.education_level: - # base_domain.append(('education_levels', '=', self.education_level.id)) - # benefit_ids = self.env['family.member'].sudo().search(base_domain) - # domain = {'benefit_id': [('id', 'in', benefit_ids.mapped('id'))]} - # return {'domain': domain} - # elif self.benefit_type and self.sponsorship_type == 'group': - # self.benefit_id = False - # benefit_ids = self.env['grant.benefit'].sudo().search( - # [('benefit_type', '=', self.benefit_type), ('state', '=', 'approve')], limit=self.benefit_count) - # # domain = {'benefit_ids': [('id', 'in', benefit_ids.filtered(lambda ben: ben.benefit_needs_percent > 0 and ben.benefit_needs_percent >= self.min_needs_percent and ben.benefit_needs_percent <= self.max_needs_percent).mapped('id'))]} - # domain = {'benefit_ids': [('id', 'in', benefit_ids.mapped('id'))]} - # return {'domain': domain} - - gender = fields.Selection(selection=[('male', 'Male'), ('female', 'Female')], string="Gender") - age_category_id = fields.Many2one('age.category',string='Age Category') - city_id = fields.Many2one( - 'res.country.city',string='District') - - benefit_count = fields.Integer(string='Sponsorship Beneficiaries Number',compute="_get_benefits_count") - - start_date = fields.Date(string="Sponsorship Start Date", copy=False) - end_date = fields.Date(string="Sponsorship End Date") - - min_needs_percent = fields.Float(string='Min Needs Percentage') - max_needs_percent = fields.Float(string='Max Needs Percentage') - - sponsorship_class = fields.Selection([ - ('partial', 'Partial Sponsorship'), - ('fully', 'Fully Sponsorship')], - string='Sponsorship Beneficiaries Classification', - tracking=True - ) - benefit_ids = fields.Many2many('family.member',string='Beneficiaries Names') - - with_orphan_ids = fields.Many2many( - 'grant.benefit',relation='takaful_sponsor_grant_benefit_rel', - string='Orphans Names Of Widow' - ) - - is_widow_orphan = fields.Boolean( - string='Widow with Her Orphans?', default=False) - - payment_option = fields.Selection([('month', 'Monthly'),('once', 'For Once')], string='Payment Option') - payment_journal_id = fields.Many2one('account.journal', string='Payment Method', domain="[('type', 'in', ['cash', 'bank'])]",) - - cancel_reason_id = fields.Many2one('sponsorship.cancellation', string='Cancellation Entry', - tracking=True) - reason = fields.Text(string="Cancellation Reason", - related="cancel_reason_id.note", store=True) - - state = fields.Selection([ - ('draft', 'Draft'), - ('confirmed', 'Confirmed'), - ('wait_pay', 'Enter Payment Details'), - ('paid', 'Paid'), - # ('progress', 'In Progress'), - ('partial_refund', 'Partial Refund'), - ('fully_refund', 'Fully Refund'), - # ('to_cancel', 'About To Cancel'), - ('approve_refund', 'Approve Refund'), - ('under_refund', 'Under Refund Procedure'), - ('under_replacement', 'Under Replacement'), - ('replacement_done', 'Replacement Done'), - ('canceled', 'Canceled'), - ('closed', 'Closed'), - ], string='state', default='draft', tracking=True, store=True, compute='_compute_state') - - has_delay = fields.Boolean(string='Has Payment Delay?', compute='_check_if_has_delay', related=False, readonly=True, - store=True) - due_days = fields.Integer(string='Overdue in Days', - compute='_check_if_has_delay', store=True) - contribution_value = fields.Float(string="Contribution Value") - load_amount = fields.Float(string="Load Amount Per Person") - currency_id = fields.Many2one('res.currency', string='Currency', - default=lambda self: self.env.company.currency_id, readonly=True) - total_contribution = fields.Float(string="Contributions Total", - compute='calculate_total_paid') - - total_voucher = fields.Float(string="Voucher Total", - compute='voucher_total_paid') - # New Added - to_renew = fields.Boolean(string='Need To Renew?', default=False) - overdue_amount = fields.Float( - string='Overdue Amount', compute='_compute_overdue_total_amount') - expected_cancel_date = fields.Date( - string='Expected Cancel Date', compute='_check_if_has_delay') - month_count = fields.Integer( - string='Sponsorship Months Count', compute='_compute_month_count') - paid_month_count = fields.Integer( - string='Paid Months Count', compute='_compute_paid_month_count') - next_due_date = fields.Date( - string='Next Payment Date', compute='_compute_next_due_date', store=True) - close_to_be_canceled_date = fields.Date(string='Close To Cancel Date') - - # NN - invoice_count = fields.Integer(string='Invoices', - compute='_compute_invoice_count') - last_invoice_date = fields.Date(string='Last Invoice') - voucher_ids = fields.One2many('account.move','sponsorship_id',string='Vouchers', copy=False) - record_type = fields.Selection([ - ('donation', 'Donation'), - ('sponsorship', 'Sponsorship'), - ], string="Record Type", required=True, default=lambda self: self._get_default_record_type(), copy=False) - is_donations_coordinator = fields.Boolean(string="Is Donations Coordinator", compute='_compute_is_coordinator') - is_sponsorship_coordinator = fields.Boolean(string="Is Sponsorship Coordinator", compute='_compute_is_coordinator') - amount_paid = fields.Float(string='Amount Paid', compute='_compute_amount_paid') - - @api.depends('payment_ids', 'payment_ids.move_id.state') - def _compute_amount_paid(self): - for rec in self: - amount_paid = 0 - for payment in rec.payment_ids: - if self.env.context.get('exclude_direct_debit', False) and payment.direct_debit: - continue - if payment.state == 'posted': - amount_paid += payment.amount - rec.amount_paid = amount_paid - - @api.depends('payment_ids') - def _compute_state(self): - for sponsorship in self: - if not sponsorship.payment_ids: - sponsorship.state = sponsorship.state - continue - if sponsorship.amount_paid >= sponsorship.total_sponsorship_amount: - sponsorship.state = 'paid' - - vendor_bill_vals = [] - benefit_journal_id = sponsorship.env.company.kafala_benefit_journal_id.id - sponsorship_lines = (sponsorship.donations_details_lines + sponsorship.donations_details_lines_mechanism_ids).filtered(lambda l: not l.direct_debit) - - if sponsorship.record_type == 'donation' and sponsorship.donation_mechanism == 'with_conditions': - family_ids = sponsorship_lines.family_id - for family in family_ids: - family_lines = sponsorship_lines.filtered(lambda l: l.family_id == family) - bill_values = { - 'takaful_sponsorship_id': sponsorship.id, - 'name': self.env['ir.sequence'].next_by_code('account.move.accrsp'), - 'move_type': 'in_invoice', - 'journal_id': benefit_journal_id, - 'date': fields.Date.today(), - 'invoice_date': fields.Date.today(), - 'partner_id': family.partner_id.id, - 'invoice_origin': sponsorship.code, - 'invoice_line_ids': [(0, 0, { - 'product_id': line.product_id.id, - 'price_unit': line.donation_amount, - 'quantity': 1, - 'name': _("Benefit Number %s") % (line.sequence_no), - 'analytic_account_id': sponsorship.branch_custom_id.branch.analytic_account_id.id, - }) for line in family_lines] - } - vendor_bill_vals.append(bill_values) - - bill_id = self.env['account.move'].sudo().create(vendor_bill_vals) - for line in bill_id.invoice_line_ids: - line.account_id = line._get_computed_account() - taxes = line._get_computed_taxes() - if taxes and line.move_id.fiscal_position_id: - taxes = line.move_id.fiscal_position_id.map_tax(taxes, partner=line.partner_id) - line.tax_ids = taxes - line.product_uom_id = line._get_computed_uom() - bill_id.action_post() - else: - sponsorship.state = 'wait_pay' - - def copy(self, default=None): - self.ensure_one() - default = dict(default or {}) - default["record_type"] = self.record_type - return super(TakafulSponsorship, self).copy(default) - - @api.onchange('sponsor_donor_type') - def _onchange_sponsor_donor_type(self): - for rec in self: - if rec.sponsor_donor_type == 'registered': - rec.sponsor_or_donor_type = 'registered' - elif rec.sponsor_donor_type == 'new_sponsor': - rec.sponsor_or_donor_type = 'new_sponsor' - # Clear sponsor_id and related fields when switching to new_sponsor - if rec.sponsor_id: - rec.sponsor_id = False - rec.sponsor_phone = False - else: - # Clear sponsor_id and related fields when switching to unknown or other types - if rec.sponsor_id: - rec.sponsor_id = False - rec.sponsor_phone = False - - @api.onchange('sponsor_or_donor_type') - def _onchange_sponsor_or_donor_type(self): - for rec in self: - # Clear sponsor_id and related fields when not 'registered' - if rec.sponsor_or_donor_type != 'registered' and rec.sponsor_id: - rec.sponsor_id = False - rec.sponsor_phone = False - - @api.onchange('sponsor_id') - def _onchange_sponsor_id(self): - """ - Smart logic: If user manually selects a different sponsor from the list - after creating a new sponsor, automatically change the type to 'registered' - """ - for rec in self: - if rec.sponsor_id: - # Get the newly created sponsor ID from context (if exists) - newly_created_sponsor_id = self.env.context.get('newly_created_sponsor_id', False) - - # If the selected sponsor is NOT the newly created one, change type to 'registered' - if newly_created_sponsor_id and rec.sponsor_id.id != newly_created_sponsor_id: - if rec.record_type == 'donation' and rec.sponsor_or_donor_type == 'new_sponsor': - rec.sponsor_or_donor_type = 'registered' - elif rec.record_type == 'sponsorship' and rec.sponsor_donor_type == 'new_sponsor': - rec.sponsor_donor_type = 'registered' - - # Update related fields from selected sponsor - rec.sponsor_phone = rec.sponsor_id.mobile - rec.preferred_communication = rec.sponsor_id.preferred_communication - - @api.model - def create(self, vals): - """Override create to validate new sponsor requirement before creating""" - # Check if creating with 'new_sponsor' but no sponsor_id - record_type = vals.get('record_type') - sponsor_or_donor_type = vals.get('sponsor_or_donor_type') - sponsor_donor_type = vals.get('sponsor_donor_type') - sponsor_id = vals.get('sponsor_id') - state = vals.get('state', 'draft') - print('Vals >>> ' , vals) - # Only validate when state is draft and saving (not during onchange) - if state == 'draft': - # Check for donation with new_sponsor - if record_type == 'donation' and sponsor_or_donor_type == 'new_sponsor' and not sponsor_id: - raise ValidationError(_( - 'يجب إنشاء مشترك جديد أولاً قبل الحفظ.\n' - 'اضغط على زر "إنشاء مشترك" لإضافة مشترك جديد.' - )) - # Check for sponsorship with new_sponsor - elif record_type == 'sponsorship' and sponsor_donor_type == 'new_sponsor' and not sponsor_id: - raise ValidationError(_( - 'يجب إنشاء كافل جديد أولاً قبل الحفظ.\n' - 'اضغط على زر "إنشاء مشترك" لإضافة كافل جديد.' - )) - - # If validation passed, create the record - return super(TakafulSponsorship, self).create(vals) - - def _get_default_record_type(self): - if self.env.user.has_group("odex_takaful.donation_officer_group"): - return "donation" - if self.env.user.has_group("odex_takaful.sponsorship_officer_group"): - return "sponsorship" - return "" - - @api.depends_context("uid") - @api.depends('sponsorship_creation_date') - def _compute_is_coordinator(self): - for record in self: - record.is_donations_coordinator = self.env.user.has_group('odex_takaful.group_donations_coordinator') - record.is_sponsorship_coordinator = self.env.user.has_group('odex_takaful.group_sponsorship_coordinator') - - @api.onchange('record_type') - def _onchange_record_type(self): - """ - Clears the One2many field when record_type is changed and data exists in the other field. - """ - if self.record_type == 'sponsorship': - self.donation_mechanism = False - elif self.record_type == 'donation': - self.donation_mechanism = 'without_conditions' - - if self.donations_details_lines_mechanism_ids: - self.donations_details_lines_mechanism_ids = [(5, 0, 0)] # Clears the field - elif self.donations_details_lines: - self.donations_details_lines = [(5, 0, 0)] # Clears the field - - - @api.model - def default_get(self, fields): - res = super(TakafulSponsorship, self).default_get(fields) - if self.env.user.has_group('odex_takaful.group_donations_coordinator'): - res.update({ - 'record_type': 'donation', - }) - elif self.env.user.has_group('odex_takaful.group_sponsorship_coordinator'): - res.update({ - 'record_type': 'sponsorship', - }) - return res - - # payment_ids = fields.One2many('account.payment','sponsorship_id',string='Payments', copy=False) - - # @api.depends('contribution_value', 'benefit_ids', 'sponsorship_type') - # def _compute_load_amount(self): - # """ Calculate load amount of sponsorship for a person """ - # for rec in self: - # if rec.benefit_ids and rec.contribution_value > 0 and rec.sponsorship_type == 'group': - # rec.load_amount = float( - # rec.contribution_value / len(rec.benefit_ids)) - # else: - # rec.load_amount = rec.contribution_value - @api.depends('benefit_ids') - def _get_benefits_count(self): - for rec in self: - rec.benefit_count = len(rec.benefit_ids) - - def voucher_total_paid(self): - self.total_voucher = len(self.voucher_ids) - - def calculate_total_paid(self): - """ Calculate Total Paid Invoices based on sponsorship """ - for rec in self: - paid_invoices = self.env['account.move'].sudo().search_count([ - ('sponsorship_id', '=', rec.id), - ('state', 'not in', ['draft','proforma']), - ]) - rec.total_contribution = paid_invoices - - def _compute_invoice_count(self): - """ Calculate Invoice count based on sponsorship """ - invoice_count = self.env['account.move'].search_count( - [('operation_id', '=', self.id), ('operation_type', '=', 'sponsorship')]) - if invoice_count > 0: - self.invoice_count = invoice_count - else: - self.invoice_count = 0 - - def create_next_invoice(self, next_date=None): - if not next_date: - next_date = get_first_day_of_next_month(datetime.datetime.today()) - - # Get journal from config - sudoConf = self.env['ir.config_parameter'].sudo() - journal_id = sudoConf.get_param( - 'odex_takaful_base.kafala_journal_id', default=False) - - if not journal_id: - # Raise an error - raise ValidationError( - _(u'No Journal for Sponsorships, Please configure it')) - - journal = self.env['account.journal'].search([('id', '=', journal_id)]) - # Create the Invoice staff - customer = self.sponsor_id - # account_receivable = self.env['account.account'].search([('user_type_id', '=', self.env.ref('account.data_account_type_receivable').id)], limit=1) - - company_id = self.env.user.company_id - - if self.benefit_type == 'orphan': - account_revenue = company_id.orphan_account_id - elif self.benefit_type == 'widow': - account_revenue = company_id.widow_account_id - - if not account_revenue: - # Raise an error - raise ValidationError( - _(u'Invalid Orphans or Widows account, Please configure it')) - - account_receivable = company_id.kafala_benefit_account_id - if not account_receivable: - # Raise an error - raise ValidationError( - _(u'Invalid From Account of Benefit Payments (Recievable Account), Please configure it')) - - Invoice = self.env["account.move"].sudo() - - currency_id = self.env.ref('base.main_company').currency_id - - invoice_id = Invoice.create({ - 'operation_id': self.id, - 'operation_type': 'sponsorship', - 'partner_id': customer.id, - 'reference_type': 'none', - 'journal_id': journal.id, - 'currency_id': journal.currency_id.id or company_id.currency_id.id or currency_id.id, - # journal.currency_id.id - 'name': u'إستحقاق كفالة' + ' - ' + self.code, - 'account_id': account_receivable.id, # account_id or - 'type': 'out_invoice', - 'comment': u'بغرض إستحقاق كفالة', - 'date_invoice': next_date, - }) - - product_id = self.env['product.product'].sudo().search( - [('default_code', '=', "sponsorship")], limit=1) - partner_id = self.sponsor_id - - # Update product: - product_id.sudo().write({ - "list_price": self.contribution_value, - "name": u'كفالة' + ' ' + self.code, - 'description_sale': u'كفالة رقم ' + self.code, - }) - - # Create line - InvoiceLine = self.env["account.move.line"] - InvoiceLine.create({ - 'product_id': product_id.id, - 'quantity': 1, - 'price_unit': self.contribution_value, - 'invoice_id': invoice_id.id, - 'name': u'كفالة رقم ' + self.code, - 'account_id': account_revenue.id, - # "invoice_line_tax_ids": [], - }) - - invoice_id.action_invoice_open() - - if invoice_id: - self.state = "wait_pay" - - return invoice_id - - def button_invoice_count(self): - """ It displays invoice based on sponsorship """ - return { - 'name': _('Invoices'), - 'domain': [('operation_id', '=', self.id), ('operation_type', '=', 'sponsorship')], - 'view_type': 'form', - 'res_model': 'account.move', - 'view_mode': 'tree,form', - 'type': 'ir.actions.act_window', - 'context': { - "create": False - } - } - - def button_payment(self): - """ Button to create invoice for sponsorship """ - out_invoice = self.create_next_invoice() - - return { - 'name': _('The Sponsorship Invoices'), - 'type': 'ir.actions.act_window', - 'res_model': 'account.move', - 'view_mode': 'form', - 'res_id': out_invoice.id if out_invoice else False - } - - # EE - def _compute_overdue_total_amount(self): - """ Calculate Total Overdue Amount""" - for rec in self: - overdue_kafala = 0 - # if rec.has_delay and rec.state in ['wait_pay', 'progress', 'to_cancel']: - if rec.has_delay and rec.state in ['wait_pay', 'to_cancel']: - # Get open invoices - open_invoices = self.env['account.move'].sudo().search( - [('state', '=', 'open'), ('operation_id', '=', rec.id), ('operation_type', '=', 'sponsorship')]) - for invoice in open_invoices: - if invoice.state == 'open': - overdue_kafala += invoice.residual_company_signed - rec.overdue_amount = overdue_kafala - - @api.depends("paid_month_count", "month_count", "last_invoice_date") - def _compute_next_due_date(self): - """ Find the Next Due Date for Sponsorship Payment""" - for rec in self: - next_due = None - if rec.end_date: - end_date = parse(str(rec.end_date)).date() - else: - end_date = None - - # if rec.state in ['draft', 'wait_pay', 'progress', 'to_cancel']: - if rec.state in ['draft', 'wait_pay', 'to_cancel']: - if rec.end_date and rec.paid_month_count < rec.month_count: - start_date = parse(str(rec.start_date)).date() - next_due = start_date + \ - relativedelta(months=(rec.paid_month_count + 1)) - else: - if rec.last_invoice_date: - last_invoice = parse(str(rec.last_invoice_date)).date() - next_due = last_invoice + relativedelta(months=1) - - if (next_due and end_date and next_due <= end_date) or (next_due and not rec.end_date): - rec.next_due_date = next_due - else: - rec.next_due_date = None - - if rec.state == "confirmed": - rec.next_due_date = parse(str(rec.start_date)).date() - - def _compute_paid_month_count(self): - """ Calculate Total Paid Months for the sponsorship """ - for rec in self: - invoice_count = self.env['account.move'].sudo().search_count([ - ('operation_type', '=', 'sponsorship'), - ('operation_id', '=', rec.id), - ('state', '=', 'paid'), - ]) - - if invoice_count > 0: - rec.paid_month_count = invoice_count - else: - rec.paid_month_count = 0 - - def _compute_month_count(self): - """ Calculate months count """ - for rec in self: - if rec.start_date and rec.end_date: - start = parse(str(rec.start_date)).date() - end = parse(str(rec.end_date)).date() - months = relativedelta(start, end) - rec.month_count = abs(months.months) + abs(months.years*12) - - def is_sponsorship_has_delay(self): - """ Find that if sponsorship package has overdue invoices""" - sudoConf = self.env['ir.config_parameter'].sudo() - allowed_days = int(sudoConf.get_param( - 'odex_takaful_base.allowed_pay_days')) - date_today = datetime.datetime.today().date() - - # Get open invoices - open_invoices = self.env['account.move'].sudo().search( - [('state', '=', 'open'), ('operation_id', '=', self.id), ('operation_type', '=', 'sponsorship')]) - for invoice in open_invoices: - payment_limt_date = parse( - str(invoice.date_due)) + timedelta(days=allowed_days) - if payment_limt_date.date() < date_today: - return payment_limt_date - - return False - - @api.depends('expected_cancel_date') - def _check_if_has_delay(self): - sudoConf = self.env['ir.config_parameter'].sudo() - cancel_kafala = int(sudoConf.get_param( - 'odex_takaful_base.cancel_kafala')) - date_today = datetime.datetime.today().date() - for rec in self: - delay_date = rec.is_sponsorship_has_delay() - if delay_date: - rec.has_delay = True - rec.due_days = (date_today - delay_date.date()).days - rec.expected_cancel_date = delay_date + \ - timedelta(days=(cancel_kafala)) - else: - rec.has_delay = False - rec.expected_cancel_date = None - rec.due_days = 0 - - @api.model - def create(self, vals): - # if vals.get('code', 'New') == 'New': - # vals['code'] = self.env['ir.sequence'].sudo().next_by_code('sponsorship.sequence') - - sponsor_phone = vals.get('sponsor_phone', False) - if sponsor_phone: - self._check_phone_numbers(sponsor_phone) - validated_sponsor_phone = self.phone_format(sponsor_phone) - vals.update({'sponsor_phone': validated_sponsor_phone}) - # Create the record - res = super(TakafulSponsorship, self).create(vals) - - - - return res - - def write(self, vals): - if 'sponsor_phone' in vals: - self._check_phone_numbers(vals['sponsor_phone']) - vals['sponsor_phone'] = self.phone_format(vals['sponsor_phone']) - res = super(TakafulSponsorship, self).write(vals) - return res - - def _check_phone_numbers(self, mobile_number): - for rec in self: - mobile = str(mobile_number).strip().replace(" ", "").replace("-", "") - if not re.fullmatch(SAUDI_MOBILE_PATTERN, mobile): - raise ValidationError(_('Enter a valid Saudi mobile number')) - - # @api.multi - def action_open_sponsorship_payement(self): - """Open Payments for a Sponsorship""" - pay = [] - pay_ids = self.voucher_ids.mapped('payment_id').ids - for line in self.voucher_ids: - pay.append(line.line_ids.filtered(lambda x : x.payment_id != False).mapped('payment_id').id) - domain = [('id','in',pay_ids)] - context = dict(self.env.context or {}) - context['default_sponsor_id'] = self.sponsor_id.id - context['default_sponsorship_id'] = self.id - return { - 'name': _('Sponsorship Payment'), - 'view_type': 'form', - 'view_mode': 'tree,form', - 'type': 'ir.actions.act_window', - 'res_model': 'account.payment', - 'target': 'current', - 'domain': domain, - } - - # @api.multi - def action_set_cancel(self): - """Make Cancellation For Sponsorship""" - domain = [] - context = dict(self.env.context or {}) - context['default_sponsor_id'] = self.sponsor_id.id - context['default_cancel_user_id'] = self.env.uid or SUPERUSER_ID - context['default_sponsorship_id'] = self.id - view = self.env.ref('odex_takaful.sponsorship_cancellation_form') - return { - 'name': _('Sponsorship Cancellation'), - 'view_mode': 'form', - 'view_type': 'form', - 'type': 'ir.actions.act_window', - 'res_model': 'sponsorship.cancellation', - 'view_id': view.id, - 'target': 'new', - 'domain': domain, - 'context': context, - } - - def action_set_close(self): - self.ensure_one() - self.state = 'closed' - - # @api.multi - def action_make_payement(self): - """Create Payment for Sponsorship Beneficiary""" - # Create necessary objects - if self.state == 'draft': - # Raise an error - raise ValidationError( - _(u'This Sponsorship is not confirmed')) - - self.sponsor_id.write({ - 'lang': 'ar_001', - }) - - domain = [] - context = dict(self.env.context or {}) - context['default_sponsor_id'] = self.sponsor_id.id - context['default_sponsorship_id'] = self.id - view = self.env.ref('odex_takaful.takaful_sponsorship_payment_form') - return { - 'name': _('Sponsorship Payment'), - 'view_mode': 'form', - 'view_type': 'form', - 'type': 'ir.actions.act_window', - 'res_model': 'sponsorship.payment', - 'view_id': view.id, - 'target': 'current', - 'domain': domain, - 'context': context, - } - - def action_confirm_data(self): - # In a model method or an automated action: - self.ensure_one() - # Check if donation details is empty - if not len(self.donations_details_lines) and not self.donations_details_lines_mechanism_ids: - raise ValidationError( - _("Please add at least one line in donation details!") - ) - #Check if The Total Amount is not Zero - if self.total_sponsorship_amount == 0: - raise ValidationError( - _("Please Check The Amount in donation Line!") - ) - - if not self.code: - self.code = self.env['ir.sequence'].sudo().next_by_code('sponsorship.sequence') - - if self.record_type == 'sponsorship': - for line in self.donations_details_lines_mechanism_ids: - if line.benefit_ids: - if len(line.benefit_ids) > 1: - for count, bf in enumerate(line.benefit_ids): - if count == 0: - line.benefit_id = bf.id - line.benefit_ids = bf.ids - line.benefits_count = 1 - else: - new_vals = { - 'benefit_ids': [(6, 0, [bf.id])], - 'benefit_id': bf.id, - 'record_type': line.record_type, - 'sponsorship_duration': line.sponsorship_duration, - 'product_template_id': line.product_template_id.id, - 'direct_debit': line.direct_debit, - 'payment_month_count': line.payment_month_count, - 'start_date': line.start_date, - 'donation_amount': line.donation_amount, - 'payment_option': line.payment_option, - 'donation_mechanism': 'with_conditions', - } - self.write({'donations_details_lines_mechanism_ids': [(0, 0, new_vals)]}) - - elif len(line.benefit_ids) == 1: - line.benefit_id = line.benefit_ids[0].id - - all_donation_lines = (self.donations_details_lines + self.donations_details_lines_mechanism_ids).filtered( - lambda r: r.display_type == False) - - - - for line in all_donation_lines.filtered(lambda r: r.record_type == 'sponsorship'): - for benefit in (line.benefit_id | line.benefit_ids): - if benefit.sponsor_related_id: - raise ValidationError(_("Cannot proceed with payment!\n\n" - "The following sponsorship lines contain beneficiaries that are already sponsored by other sponsors:\n" - "Lines: %s\n\n" - "Please choose different beneficiaries for these lines before proceeding with the payment." % line.sequence_no)) - - - if not all(all_donation_lines.mapped("sponsorships_computed")): - (self.donations_details_lines + self.donations_details_lines_mechanism_ids).compute_sponsorships_lines() - - if self.state == 'draft': - # Send SMS Notification - msg_template = self.env['takaful.message.template'].search( - [('template_name', '=', 'sponsorship_creation')], limit=1) - if self.start_date: - start_date = parse(str(self.start_date)).date() - start_by = _('Start Date') - start_text = start_by + ' ' + start_date.strftime('%d, %b %Y') - - subject = msg_template.title - message = msg_template.body + '\n' + _('Sponsorship Number') + ' %s' % self.code + '\n' + _( - 'Contribution Value') + ' %s' % str(self.contribution_value) + '\n' + start_text - user_id = self.sponsor_id.user_id - push = self.env['takaful.push.notification'].sudo().create({ - 'user_id': user_id.id, - 'title': subject, - 'body': message, - }) - - push.sudo().send_sms_notification() - - self.state = "confirmed" - for line_state in all_donation_lines: - line_state.state = 'confirmed' - faal_kheer_partner_id = self.env.company.faal_kheer_partner_id - # if self.sponsor_or_donor_type != 'registered': - # return - if self.sponsor_or_donor_type in ["registered", "new_sponsor"]: - partner_id = self.sponsor_id - elif self.sponsor_or_donor_type == "unknown": - partner_id = faal_kheer_partner_id - else: - partner_id = faal_kheer_partner_id - - sudoConf = self.env['ir.config_parameter'].sudo() - kafala_journal_id = sudoConf.get_param('odex_takaful_base.kafala_journal_id', default=False) - if not kafala_journal_id: - raise ValidationError( - _(''' Please set income journal in settings (kafala_journal_id Payment Journal)''')) - Invoice = self.env["account.move"].sudo() - invoice_values = { - 'takaful_sponsorship_id': self.id, - 'move_type': 'out_invoice', - 'journal_id': int(kafala_journal_id), - 'date': fields.Date.today(), - 'partner_id': partner_id.id, - 'invoice_origin': self.code, - } - invoice_line_vals = [(0, 0, { - 'product_id': line.product_id.id, - 'price_unit': line.total_donation_amount, - 'quantity': 1, - 'name': _("Sponsorship Entitlement Number %s") % line.sequence_no, - 'analytic_account_id': line.sponsorship_id.branch_custom_id.branch.analytic_account_id.id, - }) for line in all_donation_lines] - - current_invoice = self.journal_entry_ids.filtered(lambda r: r.move_type == 'out_invoice' and r.state == 'draft') - if current_invoice: - invoice_values['invoice_line_ids'] = [(5, 0, 0)] + invoice_line_vals - current_invoice.sudo().write(invoice_values) - invoice_id = current_invoice - else: - invoice_values.update({'invoice_line_ids': invoice_line_vals, 'name': self.env['ir.sequence'].next_by_code('account.move.accrsp')}) - invoice_id = Invoice.create(invoice_values) - - for line in invoice_id.invoice_line_ids: - line.account_id = line._get_computed_account() - taxes = line._get_computed_taxes() - if taxes and line.move_id.fiscal_position_id: - taxes = line.move_id.fiscal_position_id.map_tax(taxes, partner=line.partner_id) - line.tax_ids = taxes - line.product_uom_id = line._get_computed_uom() - - invoice_id.sudo().action_post() - - # Search for the notification message for 'create_kafala' - notification = self.env['takaful.notification'].sudo().search( - [('notification_type', '=', 'create_kafala'), ('message_type_ids.tool_type', '=', 'app')], - limit=1 - ) - - if not notification: - raise ValidationError(_("No Whatsapp notification of type 'Create Kafala' found.")) - else: - pass - #self.action_send_whatsapp() - - - def action_send_whatsapp(self): - config = self.env['ir.config_parameter'].sudo() - account_sid = config.get_param('odex_takaful.twilio_account_sid') - auth_token = config.get_param('odex_takaful.twilio_auth_token') - from_whatsapp = config.get_param('odex_takaful.twilio_from_whatsapp') - - if not account_sid or not auth_token or not from_whatsapp: - raise ValidationError(_("Twilio configuration is missing. Please configure Twilio SID, Auth Token, and WhatsApp number in General Configurations.")) - - from_cleaned_mobile = re.sub(r'[^\d+]', '', from_whatsapp) - from_whatsapp_number = f'whatsapp:{from_cleaned_mobile}' - # Search for the notification message for 'create_kafala' - notification = self.env['takaful.notification'].sudo().search( - [('notification_type', '=', 'create_kafala'), ('message_type_ids.tool_type', '=', 'app')], - limit=1 - ) - - if not notification: - raise ValidationError(_("No notification of type 'Create Kafala' found.")) - - # Use the message from the notification - amount = self.total_sponsorship_amount if hasattr(self, 'total_sponsorship_amount') else 0.0 - message = notification.message or _("No message found in 'Create Kafala' notification.") - message = notification.message.replace('[Amount]', f"{amount:.2f}") - message = re.sub(r'<[^>]+>', '', message).strip() - - for partner in self: - mobile = partner.sponsor_id.mobile if partner.sponsor_id else partner.member_id.mobile - - if mobile: - # Clean the number (keep + and digits only) - cleaned_mobile = re.sub(r'[^\d+]', '', mobile) - to_whatsapp_number = f'whatsapp:{cleaned_mobile}' - url = f"https://api.twilio.com/2010-04-01/Accounts/{account_sid}/Messages.json" - - payload = { - 'From': from_whatsapp_number, - 'To': to_whatsapp_number, - 'Body': message, - } - - response = requests.post( - url, - data=payload, - auth=(account_sid, auth_token) - ) - - if response.status_code != 201: - raise ValidationError(_("Failed to send WhatsApp message: %s") % response.text) - - - # @api.multi - def print_makfuleen_report(self): - """ Method to print Makfuleen report """ - datas = dict(self.env.context) - return self.env.ref('odex_takaful.makfuleen_report_pdf_act').report_action(self, data=datas) - - # @api.multi - def process_sponsor_payments_scheduler(self): - domain = [] - context = dict(self.env.context or {}) - context["create"] = False - context["edit"] = False - flags = {'initial_mode': 'readonly'} # default is 'edit' - return { - 'name': _('Move Entries'), - 'domain': domain, - 'view_type': 'form', - 'res_model': 'account.move', - 'view_mode': 'tree,form', - 'type': 'ir.actions.act_window', - 'flags': flags, - 'context': context, - } - - # """ - # contribute = self.env['takaful.contribution'].sudo().create({ - # 'name': u'مساهمة مالية لكمبيوتر مكتبي', - # 'sponsor_id': self.sponsor_id.id, - # 'benefit_id': self.benefit_id.id or False, - # 'amount': self.contribution_value, - # }) - # - # contribute.sudo().create_entry() - # """ - - # @api.multi - def monthly_create_sponsorship_invoice_scheduler(self): - sponsorships = self.env['takaful.sponsorship'].sudo().search( - [('state', 'in', ['wait_pay', 'to_cancel'])]) - # [('state', 'in', ['wait_pay', 'progress', 'to_cancel'])]) - for rec in sponsorships: - if rec.last_invoice_date: - today = trunc_datetime(datetime.datetime.today()).date() - invoice_date = parse(str(rec.last_invoice_date)) - last_invoice = trunc_datetime(invoice_date).date() - if today != last_invoice: - rec.sudo().create_next_invoice() - - - # @api.multi - def process_sponsorship_workflow_scheduler(self): - # _logger.info("Hi, Manage Sponsorship Workflow Scheduler")s - # Part: Processing state - sudoConf = self.env['ir.config_parameter'].sudo() - notifications = sudoConf.get_param( - 'odex_takaful_base.notification_ids') - - cancel_number = 1 - finish_number = 1 - cancel_message_type_ids = [] - finish_message_type_ids = [] - if notifications: - notification_ids = self.env['takaful.notification'].sudo().search( - [('id', 'in', literal_eval(notifications))]) - for rec in notification_ids: - if rec.notification_type == "before_cancel": - cancel_number = rec.duration - cancel_message_type_ids = rec.message_type_ids - - if rec.notification_type == "before_finish": - finish_number = rec.duration - finish_message_type_ids = rec.message_type_ids - - sponsorships = self.env['takaful.sponsorship'].sudo().search( - [('state', 'in', ['wait_pay', 'to_cancel'])]) - # [('state', 'in', ['wait_pay', 'progress', 'to_cancel'])]) - - date_today = datetime.datetime.today().date() - for rec in sponsorships: - # For colse (Finishing the sponsorships) - partner_id = rec.sponsor_id - if rec.end_date: - end_date = datetime.datetime.strptime( - rec.end_date, '%Y-%m-%d').date() - if end_date == date_today: - rec.sudo().write({"state": "closed", }) - # Send Close Notification - sponsorship_close_template = self.env['takaful.message.template'].sudo().search( - [('template_name', '=', 'sponsorship_close')], limit=1) - - subject = sponsorship_close_template.title - message = sponsorship_close_template.body - user_id = self.env['res.users'].sudo().search( - [('partner_id', '=', partner_id.id)], limit=1) - - push = self.env['takaful.push.notification'].sudo().create({ - 'user_id': user_id.id, - 'title': subject, - 'body': message, - }) - - push.sudo().send_sms_notification() - push.sudo().send_email_notification() - else: - before_close_date = end_date - \ - timedelta(days=finish_number) - if before_close_date == date_today and not rec.to_renew: - rec.to_renew = True - # Send About to Close Notification - sponsorship_to_close_template = self.env['takaful.message.template'].sudo().search( - [('template_name', '=', 'sponsorship_to_close')], limit=1) - - subject = sponsorship_to_close_template.title - message = sponsorship_to_close_template.body - - user_id = self.env['res.users'].sudo().search( - [('partner_id', '=', partner_id.id)], limit=1) - push = self.env['takaful.push.notification'].sudo().create({ - 'user_id': user_id.id, - 'title': subject, - 'body': message, - }) - for msg in finish_message_type_ids: - if msg.tool_type == "sms": - push.sudo().send_sms_notification() - - elif msg.tool_type == "email": - push.sudo().send_email_notification() - - # For Cancel or about to cancel sponsorships - if rec.expected_cancel_date: - cancel_date = datetime.datetime.strptime( - rec.expected_cancel_date, '%Y-%m-%d').date() - if cancel_date == date_today: - # Create Automatic cancellation record - sp_cancel = self.env['sponsorship.cancellation'].sudo().create({ - 'sponsorship_id': self.id, - 'cancel_type': "sys", - 'cancel_user_id': self.env.uid or SUPERUSER_ID, - 'note': _('Overdue in Sponsorships Payment of Total %s') % str(rec.overdue_amount) - }) - # Confirm cancellation and Send Notifications - sp_cancel.sudo().do_cancel_action() - else: - before_cancel_date = cancel_date - \ - timedelta(days=cancel_number) - if rec.state != "to_cancel" and before_cancel_date == date_today: - rec.sudo().write({"state": "to_cancel", }) - rec.close_to_be_canceled_date = before_cancel_date - # Send About to Cancel Notification - sponsorship_to_cancel_template = self.env['takaful.message.template'].sudo().search( - [('template_name', '=', 'sponsorship_to_cancel')], limit=1) - - subject = sponsorship_to_cancel_template.title - message = sponsorship_to_cancel_template.body + '\n' + _('Overdue Amount:') + ' %s' % str( - rec.overdue_amount) - - user_id = self.env['res.users'].sudo().search( - [('partner_id', '=', partner_id.id)], limit=1) - push = self.env['takaful.push.notification'].sudo().create({ - 'user_id': user_id.id, - 'title': subject, - 'body': message, - }) - for msg in cancel_message_type_ids: - if msg.tool_type == "sms": - push.sudo().send_sms_notification() - - elif msg.tool_type == "email": - push.sudo().send_email_notification() - else: - rec.close_to_be_canceled_date = None - - # _logger.info("Bye, Manage Sponsorship Workflow Scheduler") - - # @api.multi - def get_voucher_lines(self): - """ - prepare voucher lines from details lines - for voucher creation - """ - self.ensure_one() - if self.benefit_type == "orphan": - if not self.env.user.company_id.widow_account_id: - raise ValidationError( - _(''' Please set orphan restricted income account in settings ''')) - account_id = self.env.user.company_id.orphan_account_id.id - elif self.benefit_type == "widow": - if not self.env.user.company_id.widow_account_id: - raise ValidationError( - _(''' Please set widow restricted income account in settings ''')) - account_id = self.env.user.company_id.widow_account_id.id - - lines = [ - { - 'name': self.code, - 'account_id': account_id, - 'price_unit': self.contribution_value, - 'quantity': 1, # only one service - 'analytic_account_id': self.branch_custom_id.branch.analytic_account_id.id, - } - ] - lines = [(0, 0, x) for x in lines] - return lines - - # @api.multi - def open_account_voucher(self): - self.ensure_one() - lines = self.get_voucher_lines() - journal_id = False - sudoConf = self.env['ir.config_parameter'].sudo() - journal_id = sudoConf.get_param('odex_takaful_base.kafala_journal_id', default=False) - if not journal_id: - raise ValidationError( - _(''' Please set income journal in settings (kafala_journal_id Payment Journal)''')) - - company_id = self.env.user.company_id.id - p = self.sponsor_id if not company_id else self.sponsor_id.with_company(company_id) - - rec_account = p.property_account_receivable_id - pay_account = p.property_account_payable_id - if not rec_account and not pay_account: - raise ValidationError( - _(''' Please set donor's payable and receivable accounts first ''')) - - periods = self.env['fiscalyears.periods'].search( - [('state', '=', 'open'), - ('date_from', '<=', fields.Datetime.now()), - ('date_to', '>=', fields.Datetime.now())]) - - if not periods: - raise ValidationError( - _('No fiscal year periods in this date.')) - - data = { - # 'name': self.code, - # 'ref': self.code, - # 'move_type': 'out_receipt', - # 'date': fields.Datetime.now(), - 'invoice_date': fields.Datetime.now(), - 'invoice_date_due': fields.Datetime.now(), - 'narration': self.code, - 'company_id': self.env.user.company_id.id, - 'partner_id': self.sponsor_id.id, - 'journal_id': int(journal_id), - # 'account_id': self.sponsor_id.property_account_receivable_id.id, - 'line_ids': lines, - # 'pay_now': 'pay_now', - # 'payment_journal_id':self.payment_journal_id.id, - 'sponsorship_id':self.id, - } - voucher_id = self.env['account.move'].create(data) - self.voucher_ids = [(4,voucher_id.id)] - - def action_open_voucher_payement(self): - """Open Payments for a voucher""" - domain = [('sponsorship_id', '=', self.id or False)] - context = dict(self.env.context or {}) - - return { - 'name': _('voucher Payment'), - 'view_type': 'form', - 'view_mode': 'tree,form', - 'views': [(self.env.ref( - 'account.view_move_tree').id, 'tree'), - (self.env.ref('account.view_move_form').id, 'form')], - 'type': 'ir.actions.act_window', - 'res_model': 'account.move', - 'target': 'current', - 'domain': domain, - 'context': context, - } - def create_new_sponsor(self): - return { - 'name': _('Add New Sponsor'), - 'type': 'ir.actions.act_window', - 'res_model': 'res.partner', - 'view_mode': 'form', - 'view_id': self.env.ref('odex_takaful.view_takaful_sponsor_form').id, - 'target': 'new', - 'context': { - 'default_company_type': 'person', - 'parent_model': self._name, # Pass current model's name - 'parent_id': self.id, # Pass current record's ID # Pass the current record ID - 'default_is_sponsor_portal': True, - 'default_is_donor': True, - 'sponsor_contact': True, - }, - } - - def action_refund(self): - refund_amount = sum(self.sponsorship_scheduling_line_ids.mapped('amount')) - sum(self.sponsorship_scheduling_line_ids.mapped('refunded_amount')) - return { - 'type': 'ir.actions.act_window', - 'name': 'Refund Wizard', - 'res_model': 'refund.wiz', - 'view_mode': 'form', - 'target': 'new', - 'context': { - 'default_refund_amount': refund_amount, - - }, } - - def action_register_payment(self): - invoice_id = self.env['account.move'].sudo().search([ - ('takaful_sponsorship_id', '=', self.id), - ('move_type', '=', 'out_invoice'), - ('state', '=', 'posted'), - ('payment_state', 'in', ['not_paid', 'partial'])], limit=1, order='id') - if not invoice_id: - raise ValidationError(_("No invoice found for this sponsorship.")) - sponsorship_line_ids = (self.donations_details_lines + self.donations_details_lines_mechanism_ids).filtered(lambda l: not l.direct_debit) - amount = sum(sponsorship_line_ids.mapped('total_donation_amount')) - self.with_context(exclude_direct_debit=True).amount_paid - - return { - 'name': _('Register Payment'), - 'res_model': 'account.payment.register', - 'view_mode': 'form', - 'context': { - 'active_model': 'account.move', - 'active_ids': invoice_id.ids, - 'default_amount': amount, - 'dont_redirect_to_payments': True, - 'sponsorship_line_ids': sponsorship_line_ids.ids, - 'sponsorship_payment': True, - 'sponsorship_id': self.id, - 'sponsorship_payment_skip_compute_amount': True, - 'default_sponsorship_payment': True, - 'force_sponsorship_line_partner_id': self.sponsor_id.id, - }, - 'target': 'new', - 'type': 'ir.actions.act_window', - } - show_register_payment = fields.Boolean(string='Show Register Payment', compute='_compute_show_register_payment') - - def _compute_show_register_payment(self): - for rec in self: - sponsorship_line_ids = (rec.donations_details_lines | rec.donations_details_lines_mechanism_ids).filtered(lambda l: not l.direct_debit) - rec.show_register_payment = rec.with_context(exclude_direct_debit=True).amount_paid < sum(sponsorship_line_ids.mapped('total_donation_amount')) - - def action_reset_to_draft(self): - for rec in self: - if rec.state != 'confirmed': - raise ValidationError(_("You can only reset to draft a confirmed sponsorship.")) - move_ids = rec.journal_entry_ids.filtered(lambda l: l.move_type == 'out_invoice') - move_ids.sudo().button_draft() - self.write({'state': 'draft'}) - all_donation_lines = (self.donations_details_lines + self.donations_details_lines_mechanism_ids).filtered( - lambda r: r.display_type == False) - for line in all_donation_lines: - line.state = 'draft' - - -class AnotherSponsors(models.Model): - _name = "donate.for.another.person" - - sponsor_name = fields.Char(string="Sponsor Name") - sponsor_phone = fields.Char(string="Sponsor Phone") - sponsor_id_number = fields.Char(string="Sponsor ID Number") - sponsorship_id = fields.Many2one('takaful.sponsorship') - receive_messages = fields.Boolean(string='Receive messages?') - note = fields.Char(string='Note') - -class RefundDetailsLines(models.TransientModel): - _name = 'refund.details.lines' - _description = "Refund Destails Lines" - - refund_date = fields.Datetime(string='Refund Date') - sponsorship_id = fields.Many2one( - 'takaful.sponsorship', - string='Sponsorship', - ) - sponsorship_scheduling_line = fields.Many2one( - 'sponsorship.scheduling.line', - string='Schedule Details Lines', - ) - sponsorship_scheduling_line_ids = fields.Many2many('sponsorship.scheduling.line','refund_details_scheduling_rel','refund_id','schedule_id') - - sequence_no = fields.Char(related="sponsorship_scheduling_line.sequence_no") - - payment_details_line = fields.Many2one( - 'payment.details.lines', - string='Payment Details Lines', - ) - - sponsor_id = fields.Many2one( - 'res.partner', - string='Sponsor', - related='sponsorship_id.sponsor_id' - ) - refund_amount = fields.Float(string='Refund Amount') - currency_id = fields.Many2one('res.currency', string='Currency', - default=lambda self: self.env.company.currency_id, readonly=True) - refund_reason = fields.Many2one( - 'refund.reasons', - string='Refund Reason', - ) - payment_method_id = fields.Many2one('takaful.payment.method', string="Payment Method") - - payment_method = fields.Selection( - selection=[ - ("cash", "Cash"), - ("card", "Card"), - ("check", "Check"), - ("credit_card", "Credit Card"), - ("bank", "Bank Transfer"), - ("direct_debit", "Direct Debit") - ] - , related="payment_method_id.payment_method" - ) - journal_id = fields.Many2one( - 'account.journal', - string="Refund Account Journal", - ) - - attachment_ids = fields.Many2many('ir.attachment', 'rel_refund_details_attachment', 'refund_details_id', 'attachment_id', - string='Attachments') - - invoiced = fields.Boolean(copy=False, readonly=True) - -class PaymentDetailsLines(models.Model): - _name = "payment.details.lines" - - donation_amount = fields.Float(string='Donation Amount') - remaining_amount = fields.Float(string='Remaining Amount') - currency_id = fields.Many2one('res.currency', string='Currency', - default=lambda self: self.env.company.currency_id, readonly=True) - donation_date = fields.Date(string='Donation Date',default=lambda self: fields.Date.today(), readonly=True) - payment_date = fields.Datetime(string='Payment Date', default=fields.Datetime.now) - note = fields.Char(string='Note') - journal_id = fields.Many2one('account.journal', string="Journal") - points_of_sale = fields.Many2one('points.of.sale.custom', string="Point OF sale") - sponsorship_id = fields.Many2one('takaful.sponsorship') - sponsorship_scheduling_line_id = fields.Many2one('sponsorship.scheduling.line') - sponsorship_scheduling_line_ids = fields.Many2many('sponsorship.scheduling.line') - bank_id = fields.Many2one('res.partner.bank',string="Sponsor Bank Number", domain=lambda self: self._available_banks()) - bank_journal_id = fields.Many2one( - 'account.journal', - string="Sponsor Bank Journal", - readonly=False, - domain="[('type', '=', 'bank')]" - ) - bank_name = fields.Char( - string="Sponsor Bank Name", - related="bank_id.bank_id.name" - ) - charity_journal_id = fields.Many2one('account.journal', string="charity Bank",related = 'points_of_sale.journal_id') - name = fields.Char(string="Ref.",readonly=True) - check_number = fields.Char(string='Check Number') - account_payment_method = fields.Many2one('account.payment.method.line',domain="[('payment_type','=','inbound')]",string='Account Payment Method') - branch_custom_id = fields.Many2one('branch.settings', string="Branch",related='sponsorship_id.branch_custom_id') - sponsor_account_number = fields.Char(string='Sponsor Account Number') - sa_iban = fields.Char('SA',default='SA',readonly=True) - charity_bank_id = fields.Many2one('account.journal', string="charity Bank") - bank_transfer_amount = fields.Float(string='Bank Transfer Amount') - direct_debit_amount = fields.Float(string='Direct Debit Amount') - payment_attachment = fields.Many2many('ir.attachment', 'rel_attachment_payment_details', 'payment_id','attachment_id', string='Payment Attachment') - direct_debit_start_date = fields.Date(string='Direct Debit Start Date') - direct_debit_end_date = fields.Date(string='Direct Debit End Date') - sponsorship_scheduling_ref = fields.Char('Scheduling Sequences', compute='_compute_sponsorship_scheduling_ref') - is_fully_refund = fields.Boolean(string='Is Fully Refund') - is_partial_refund = fields.Boolean(string='Is Partial Refund') - payment_method_id = fields.Many2one('takaful.payment.method', string="Payment Method") - payment_method = fields.Selection(selection=[("cash", "Cash"),("card", "Card"),("check", "Check"),("credit_card", "Credit Card"),("bank", "Bank Transfer"),("direct_debit", "Direct Debit")], related="payment_method_id.payment_method") - - def action_send_whatsapp(self): - notification = self.env['takaful.notification'].sudo().search( - [('notification_type', '=', 'partial_payment'), ('message_type_ids.tool_type', '=', 'app')], - limit=1 - ) - if not notification: - raise ValidationError(_("No notification of type 'Create Kafala' found.")) - - config = self.env['ir.config_parameter'].sudo() - account_sid = config.get_param('odex_takaful.twilio_account_sid') - auth_token = config.get_param('odex_takaful.twilio_auth_token') - from_whatsapp = config.get_param('odex_takaful.twilio_from_whatsapp') - - if not account_sid or not auth_token or not from_whatsapp: - raise ValidationError(_("Twilio configuration is missing. Please configure Twilio SID, Auth Token, and WhatsApp number in General Configurations.")) - - from_cleaned_mobile = re.sub(r'[^\d+]', '', from_whatsapp) - from_whatsapp_number = f'whatsapp:{from_cleaned_mobile}' - # Search for the notification message for 'create_kafala' - - - # Use the message from the notification - amount = self.donation_amount if hasattr(self, 'donation_amount') else 0.0 - message = notification.message.replace('[Amount]', f"{amount:.2f}") - - for partner in self: - mobile = partner.sponsorship_id.sponsor_id.mobile if partner.sponsorship_id.sponsor_id else partner.sponsorship_id.member_id.mobile - if mobile: - # Clean the number (keep + and digits only) - cleaned_mobile = re.sub(r'[^\d+]', '', mobile) - to_whatsapp_number = f'whatsapp:{cleaned_mobile}' - url = f"https://api.twilio.com/2010-04-01/Accounts/{account_sid}/Messages.json" - - payload = { - 'From': from_whatsapp_number, - 'To': to_whatsapp_number, - 'Body': message, - } - - response = requests.post( - url, - data=payload, - auth=(account_sid, auth_token) - ) - - if response.status_code != 201: - raise ValidationError(_("Failed to send WhatsApp message: %s") % response.text) - - - - def _available_banks(self): - active_model = self._context.get('active_model', False) - active_id = self._context.get('active_id', False) - bank_ids = [] - if active_id: - if active_model == "takaful.sponsorship": - bank_ids = self.env[active_model].browse(active_id).sponsor_id.bank_ids.ids - elif active_model == "sponsorship.scheduling.line": - bank_ids = self.env[active_model].browse(active_id).sponsorship_id.sponsor_id.bank_ids.ids - return [('id', 'in', bank_ids)] - - def print_report_name(self): - sponsorship_scheduling_line_id = self.sponsorship_scheduling_line_id or self.sponsorship_scheduling_line_ids - return "%s - %s" % (self.name, sponsorship_scheduling_line_id.beneficiary_id.name) - - @api.depends('sponsorship_scheduling_line_id', 'sponsorship_scheduling_line_ids') - def _compute_sponsorship_scheduling_ref(self): - for rec in self: - sponsorship_scheduling_lines = rec.sponsorship_scheduling_line_id or rec.sponsorship_scheduling_line_ids - rec.sponsorship_scheduling_ref = ', '.join(sponsorship_scheduling_lines.mapped('sequence_no')) - - @api.onchange('sponsor_account_number') - def onchange_sponsor_account_number(self): - if self.sponsor_account_number: - # Check if the value is numeric before anything else - if not self.sponsor_account_number.isdigit(): - raise ValidationError(_("The account number should contain only digits.")) - - # Check if the account number contains exactly 22 digits - if len(self.sponsor_account_number) != 22: - raise ValidationError(_("The IBAN number must contain exactly 22 digits.")) - - @api.onchange('branch_custom_id') - def _onchange_branch_custom_id(self): - domain = [] - for rec in self: - domain = [ - ('branch_custom_ids', 'in', [rec.branch_custom_id.id]) ] - return {'domain': {'points_of_sale': domain}} - - @api.model - def create(self, vals): - res = super(PaymentDetailsLines, self).create(vals) - res.create_journal_entry() - if not res.name or res.name == _('New'): - res.name = self.env['ir.sequence'].sudo().next_by_code('payment.details.sequence') or _('New') - sponsorship_lines = res.sponsorship_scheduling_line_id or res.sponsorship_scheduling_line_ids - sponsorship_lines.sudo().write({ 'status': 'paid' }) # Change the status to 'paid' - if all(res.sponsorship_id.sponsorship_scheduling_line_ids.mapped(lambda r: r.status == 'paid')): - res.sponsorship_id.sudo().write({ 'state': 'paid' }) - else: - res.sponsorship_id.sudo().write({ 'state': 'wait_pay' }) - res.action_send_whatsapp() - return res - - @api.onchange('payment_method') - def onchange_journal_id(self): - for rec in self: - # Build the dynamic domain - domain = [] - if rec.payment_method == 'cash': - cash_payment = self.env['takaful.payment.method'].search([('payment_method', '=', 'cash')], limit=1) - if cash_payment: - rec.journal_id = cash_payment.journal_id if cash_payment.journal_id else False - domain = [ - ('type','=','cash') - ] - if rec.payment_method == 'check': - domain = [ - '|',('type', '=', 'cash'),('type', '=', 'bank') - ] - return {'domain': {'journal_id': domain}} - - def create_journal_entry(self): - self.ensure_one() - payment_method_journal_id = self.journal_id.id - if not payment_method_journal_id: - raise ValidationError( - _(''' Please set Journal in Payment Details ''')) - Invoice = self.env["account.move"].sudo() - invoice_values = { - 'takaful_sponsorship_id': self.sponsorship_id.id, - 'name': self.env['ir.sequence'].next_by_code('account.move.payment.details.sequence'), - 'move_type': 'entry', - 'journal_id': int(payment_method_journal_id), - 'date': fields.Date.today(), - # 'branch_id': TODO there is no res.branch in takaful.sponsorship model - } - lines_name = _("Bail Receipts Number %s") % self.sponsorship_scheduling_ref - account_receivable_id = self.sponsorship_id.sponsor_id.property_account_receivable_id.id - if self.sponsorship_id.sponsor_or_donor_type != 'registered': - sponsorship_lines = self.sponsorship_scheduling_line_id or self.sponsorship_scheduling_line_ids - account_receivable_id = sponsorship_lines.donation_detail_linked_id.product_template_id.property_account_income_id.id - line_ids = [ - (0, 0, { - 'account_id': self.journal_id.default_account_id.id, - 'name': lines_name, - 'debit': self.donation_amount, - 'credit': 0.0, - }), - (0, 0, { - 'account_id': account_receivable_id, - 'partner_id': self.sponsorship_id.sponsor_id.id, - 'name': lines_name, - 'analytic_account_id': self.branch_custom_id.branch.analytic_account_id.id if self.sponsorship_id.sponsor_or_donor_type != 'registered' else False, - 'debit': 0.0, - 'credit': self.donation_amount, - }), - ] - invoice_values['line_ids'] = line_ids - invoice_id = Invoice.create(invoice_values) - invoice_id.action_post() - - def action_confirm(self): - """ - Logic to confirm the payment details. - """ - # Example logic: Validate the fields and mark them as confirmed - for record in self: - if record.payment_method_id.payment_method in ('direct_debit', 'bank') and not record.bank_id: - raise ValidationError("Bank is required for Direct Debit and Bank Transfer methods.") - - # Close the wizard - return {'type': 'ir.actions.act_window_close'} - - def action_refund(self): - return { - 'type': 'ir.actions.act_window', - 'name': 'Refund Wizard', - 'res_model': 'refund.wiz', - 'view_mode': 'form', - 'target': 'new', - } diff --git a/odex25_ensan/odex_takaful/models/takaful_sponsor_operation.py b/odex25_ensan/odex_takaful/models/takaful_sponsor_operation.py deleted file mode 100644 index 431f2e960..000000000 --- a/odex25_ensan/odex_takaful/models/takaful_sponsor_operation.py +++ /dev/null @@ -1,74 +0,0 @@ -# -*- coding: utf-8 -*- - -from odoo import models, fields, _ -from dateutil.parser import parse - - -class TakafulSponsorOperation(models.Model): - _name = 'takaful.sponsor.operation' - # _rec_name = 'sponsor_id' - - name = fields.Char(string="Operation Name") - title = fields.Char(string="Operation Title") - sponsor_id = fields.Many2one( - 'res.partner', - string='The Sponsor', - ondelete='set null' - ) - benefit_ids = fields.Many2many( - 'grant.benefit', - string='Beneficiaries' - ) - benefit_id = fields.Many2one( - 'grant.benefit', - string='Beneficiary', - ondelete='set null' - ) - benefit_type = fields.Selection([ - ('orphan', 'Orphans'), - ('widow', 'Widows'), - ('general', 'General')], - string='Beneficiaries Type', - compute='_compute_benefit_type_value', - related=False, - readonly=True, - ) - operation_type = fields.Selection([ - ('sponsorship', 'Sponsorship'), - ('contribution', 'Needs Contribution'), - ('gift', 'Financial Gift')], - string='Operation Type', - ) - date = fields.Date(string="Date", default=fields.Date.today) - operation_on = fields.Datetime(string="Operation Time", default=fields.Datetime.now) - month = fields.Integer(string="The Month", compute='_compute_period_filter') - origin_id = fields.Integer(readonly=True) - period_code = fields.Char(string="Period Code", compute='_compute_period_filter') - amount = fields.Float(string="Amount") - currency_id = fields.Many2one('res.currency', string='Currency', - default=lambda self: self.env.company.currency_id, readonly=True) - - def _compute_period_filter(self): - """ Extract period code from date """ - for rec in self: - if rec.date: - date = parse(str(rec.date)).date() - rec.period_code = date.strftime("%Y_%m") - rec.month = int(date.strftime("%m")) - - def _compute_benefit_type_value(self): - for rec in self: - b_type = [] - if rec.benefit_ids: - for i in rec.benefit_ids: - b_type.append(i.benefit_type) - if rec.benefit_id: - b_type.append(rec.benefit_id.benefit_type) - if 'orphan' in b_type and 'widow' not in b_type: - rec.benefit_type = 'orphan' - if 'widow' in b_type and 'orphan' not in b_type: - rec.benefit_type = 'widow' - if 'widow' in b_type and 'orphan' in b_type: - rec.benefit_type = 'general' - if b_type == []: - rec.benefit_type = '' diff --git a/odex25_ensan/odex_takaful/models/takaful_sponsorship_cancellation_model.py b/odex25_ensan/odex_takaful/models/takaful_sponsorship_cancellation_model.py deleted file mode 100644 index 643bb81d0..000000000 --- a/odex25_ensan/odex_takaful/models/takaful_sponsorship_cancellation_model.py +++ /dev/null @@ -1,110 +0,0 @@ -# -*- coding: utf-8 -*- -from odoo import models, fields, api, _ -from odoo import SUPERUSER_ID - - -class SponsorshipStopReason(models.Model): - _name = "sponsorship.reason.stop" - _description = "Sponsorship Stop Reason" - _order = 'sequence' - - sequence = fields.Integer(help="Determine the display order", index=True, - string='Sequence') - name = fields.Char(string='Reason', required=True) - -class SponsorshipCancellation(models.Model): - _name = 'sponsorship.cancellation' - _inherit = ['mail.thread', 'mail.activity.mixin'] - _description = "Sponsorship Cancellation" - _rec_name = "code" - - sponsorship_id = fields.Many2one("takaful.sponsorship", string="Sponsorship") - code = fields.Char(string="Sponsorship Number", related="sponsorship_id.code",store=True) - sponsor_id = fields.Many2one(string="The Sponsor", related="sponsorship_id.sponsor_id",store=True) - create_date = fields.Date(string='Create Date', readonly=True, default=fields.Date.today) - confirm_date = fields.Date(string='Confirm Date', readonly=True) - cancel_type = fields.Selection([ - ('user', 'Manually'), - ('sys', 'Automatically'), - ], string='Cancellation Type', default="user", readonly=True) - cancel_user_id = fields.Many2one('res.users', 'Cancelled By', readonly=True) - confirm_user_id = fields.Many2one('res.users', 'Confirmed By', readonly=True) - reason_id = fields.Many2one('sponsorship.reason.stop', string='Cancellation Reason') - note = fields.Text(string='Comment') - - state = fields.Selection([ - ('draft', 'Draft'), - ('cancel', 'Cancelled'), - ], string='state', default="draft") - - - # @api.multi - def do_cancel_action(self): - """Confirm cancellation for Sponsorship""" - for rec in self: - if rec.sponsorship_id: - rec.confirm_user_id = self.env.uid or SUPERUSER_ID - rec.confirm_date = fields.Date.today() - rec.state = "cancel" - - # Send SMS and Email Notifications - canceled_template = self.env['takaful.message.template'].sudo().search( - [('template_name', '=', 'sponsorship_canceled')], limit=1) - - subject = canceled_template.title - message = canceled_template.body - partner_id = rec.sponsor_id - user_id = self.env['res.users'].sudo().search([('partner_id', '=', partner_id.id)], limit=1) - - push = self.env['takaful.push.notification'].sudo().create({ - 'user_id': user_id.id, - 'title': subject, - 'body': message, - }) - - push.sudo().send_sms_notification() - push.sudo().send_email_notification() - - month_count = 0 - residual_amount = 0 - - # Get other open invoices - open_invoices = self.env['account.move'].sudo().search([('state', '=', 'open'), ('operation_id', '=', rec.sponsorship_id.id), ('operation_type', '=', 'sponsorship')]) - for inv in open_invoices: - # Get residual amount - month_count += 1 - residual_amount += inv.residual_company_signed - # Enable Removing for journal_id - if inv.journal_id: - inv.journal_id.sudo().write({"update_posted": True,}) - - inv.sudo().action_cancel() - - rec.sponsorship_id.journal_entry_ids.button_draft() - rec.sponsorship_id.journal_entry_ids.button_cancel() - rec.sponsorship_id.state = "canceled" - rec.sponsorship_id.cancel_reason_id = self.id - - # Moving the arrears - if month_count >0 and rec.sponsorship_id.sponsorship_type =='person': - arrears_id = self.env['sponsorship.benefit.arrears'].sudo().create({ - 'sponsorship_id': rec.sponsorship_id.id, - 'benefit_id': rec.sponsorship_id.benefit_id.id, - 'sponsor_id': rec.sponsorship_id.sponsor_id.id, - 'arrears_month_number': month_count, - 'arrears_total': residual_amount, - }) - elif month_count >0 and rec.sponsorship_id.sponsorship_type =='group': - for ben in rec.sponsorship_id.benefit_ids: - arrears_id = self.env['sponsorship.benefit.arrears'].sudo().create({ - 'sponsorship_id': rec.sponsorship_id.id, - 'benefit_id': ben.id, - 'sponsor_id': rec.sponsorship_id.sponsor_id.id, - 'arrears_month_number': month_count, - 'arrears_total': rec.sponsorship_id.load_amount * month_count, - }) - - - - - diff --git a/odex25_ensan/odex_takaful/models/takaful_sponsorship_payment_model.py b/odex25_ensan/odex_takaful/models/takaful_sponsorship_payment_model.py deleted file mode 100644 index 6fe9d1b9c..000000000 --- a/odex25_ensan/odex_takaful/models/takaful_sponsorship_payment_model.py +++ /dev/null @@ -1,217 +0,0 @@ -# -*- coding: utf-8 -*- -from odoo import models, fields, api, _ -from dateutil.parser import parse -from odoo.exceptions import UserError,ValidationError, Warning - -import logging - -_logger = logging.getLogger(__name__) - - -class SponsorshipPayment(models.Model): - _name = 'sponsorship.payment' - _inherit = ['mail.thread', 'mail.activity.mixin'] - _description = "Payments for Sponsorship system in Takaful project" - _rec_name = 'code' - _order = 'date desc' - - sponsorship_id = fields.Many2one( - 'takaful.sponsorship', - string='Sponsorship' - ) - - sponsor_id = fields.Many2one( - 'res.partner', - string='Sponsor Name' - ) - code = fields.Char(string="Sponsorship Number", related="sponsorship_id.code",store=True) - - payment_month_number = fields.Integer(string="Sponsorships Number To Pay") - month_amount = fields.Float(string="Sponsorship Amount", related="sponsorship_id.contribution_value",store=True, readonly=True) - amount = fields.Float(string="Total Amount", compute="get_amount_month", store=True) - currency_id = fields.Many2one('res.currency', string='Currency', - default=lambda self: self.env.company.currency_id, readonly=True) - iban = fields.Char(string='IBAN / Account Number', tracking=True) - transfer_receipt = fields.Binary(string='Transfer Receipt') - bank_id = fields.Many2one('res.bank', string="Bank Name") - has_bank_account = fields.Boolean(string="Has Another Account?") - payment_method = fields.Char(string='Method Of Payment', store=False) - - user_id = fields.Many2one('res.users',string="Issued By", default=lambda self: self.env.user) - - state = fields.Selection([ - ('draft', 'Draft'), - ('financial', 'Financial'), - ('paid', 'Paid'), - ], string='state', default="draft", tracking=True) - - date = fields.Date('Date', readonly=True,default=fields.Date.today()) - invoice_ids = fields.Many2many('account.move', string="Invoices") - is_invoiced = fields.Boolean(string='Is Invoiced?', compute='check_is_invoiced') - - def check_is_invoiced(self): - for rec in self: - if rec.invoice_ids and rec.state == "financial": - total_paid = 0 - for invoice in rec.invoice_ids: - if invoice.state == 'paid': - payments = self.env['account.payment'].sudo().search([('invoice_ids', 'in', [invoice.id])]) - # if len(payments) > 0: - for payment in payments: - total_paid += payment.amount - - if total_paid >0 and total_paid >= rec.amount: - rec.is_invoiced = True - rec.state = "paid" - else: - rec.is_invoiced = False - - elif rec.invoice_ids and rec.state == "paid": - rec.is_invoiced = True - - else: - rec.is_invoiced = False - - @api.onchange('sponsor_id') - def onchange_sponsor_id(self): - res = {} - sponsorships = self.env['takaful.sponsorship'].sudo().search([('sponsor_id', '=', self.sponsor_id.id)]) - sponsorships_ids = [] - for record in sponsorships: - sponsorships_ids.append(record.id) - - res['domain'] = {'sponsorship_id': [('id', 'in', sponsorships_ids)]} - return res - - @api.onchange('has_bank_account', 'payment_method') - def onchange_bank_account(self): - for rec in self: - if rec.payment_method and rec.payment_method != "cash" and not rec.has_bank_account: - self.bank_id = self.sponsor_id.bank_id.id - self.iban = self.sponsor_id.iban - else: - self.bank_id = None - self.iban = '' - - # @api.constrains('month_amount') - # def check_month_amount(self): - # if int(self.month_amount) <= 0: - # raise ValidationError( - # _(u'Month Amount Is Invalid')) - - @api.constrains('payment_month_number') - def check_payment_month_number(self): - if int(self.month_amount) <= 0: - raise ValidationError( - _(u'Payment Month Number should be at least for one month')) - - @api.depends('month_amount', 'payment_month_number') - def get_amount_month(self): - for rec in self: - rec.amount = rec.month_amount * rec.payment_month_number - - def action_pay(self): - # Check for already sponsored beneficiaries only for sponsorship records - - count = 0 - invoices = [] - if self.sponsorship_id.state in ['confirmed','wait_pay','progress' , 'to_cancel']: - if self.sponsorship_id.next_due_date: - next_date = parse(str(self.sponsorship_id.next_due_date)).date() - while (count < self.payment_month_number): - count +=1 - invoice_id = self.sponsorship_id.sudo().create_next_invoice(next_date) - invoices.append(invoice_id.id) - try: - next_date = next_date.replace(month=(next_date.month +1)) - except Exception as e: - next_date = next_date.replace(year=(next_date.year +1), month=1) - - # Update invoices Ids - for _id in invoices: - self.write({'invoice_ids': [(4, _id)]}) - - self.state = 'financial' - self.sponsorship_id.sudo().donations_details_lines_mechanism_ids.filtered(lambda line: line.benefit_id).write({'state': 'active'}) - self.sponsorship_id.sudo().donations_details_lines_mechanism_ids.filtered(lambda line: not line.benefit_id).write({'state': 'waiting'}) - all_lines = self.sponsorship_id.sudo().donations_details_lines_mechanism_ids + self.sponsorship_id.sudo().donations_details_lines_ids - payment_method_ids = all_lines.mapped('payment_method_id') - invoice_id = self.env['account.move'].search([('takaful_sponsorship_id', '=', self.sponsorship_id.id)], limit=1) - if invoice_id and payment_method_ids and invoice_id.state == 'posted': - receivable_lines = invoice_id.line_ids.filtered( - lambda l: l.account_id.account_type == 'asset_receivable' and not l.reconciled - ) - - if not receivable_lines: - _logger.warning(f"No receivable lines found for invoice {invoice_id.name}") - return - - for payment_method_id in payment_method_ids: - - if not payment_method_id.journal_id: - continue - - lines_with_method = all_lines.filtered(lambda l: l.payment_method_id == payment_method_id) - payment_amount = sum(lines_with_method.mapped('donation_amount')) - - if payment_amount <= 0: - continue - - payment_method_line = self.env['account.payment.method.line'].search([ - ('journal_id', '=', payment_method_id.journal_id.id), - ('payment_type', '=', 'inbound') - ], limit=1) - - if not payment_method_line: - _logger.warning( - f"No inbound payment method found for journal {payment_method_id.journal_id.name}. " - f"Skipping payment creation for payment method {payment_method_id.name}" - ) - continue - - payment_register_vals = { - 'payment_date': fields.Date.today(), - 'amount': payment_amount, - 'journal_id': payment_method_id.journal_id.id, - 'payment_method_line_id': payment_method_line.id, - 'communication': f"{self.sponsorship_id.code} - {payment_method_id.name}", - } - - if payment_method_id.bank_id: - payment_register_vals['partner_bank_id'] = payment_method_id.bank_id.id - - payment_register = self.env['account.payment.register'].with_context( - active_model='account.move', - active_ids=[invoice_id.id] - ).create(payment_register_vals) - - payment_register.action_create_payments() - - - # @api.multi - def open_account_invoice_action(self): - """Open Sponsorship Payments Entries""" - domain = [] - if self.invoice_ids: - domain = [('id', 'in', self.invoice_ids.ids)] - - if self.is_invoiced is True: - self.state ="paid" - - context = dict(self.env.context or {}) - context["create"] = False - context["edit"] = False - flags = {'initial_mode': 'readonly'} # default is 'edit' - return { - 'name': _('Financial'), - 'domain': domain, - 'view_type': 'form', - 'res_model': 'account.move', - 'view_mode': 'tree,form', - 'type': 'ir.actions.act_window', - 'flags': flags, - 'context': context, - } - - - diff --git a/odex25_ensan/odex_takaful/reports/__init__.py b/odex25_ensan/odex_takaful/reports/__init__.py deleted file mode 100644 index 1e17cf25d..000000000 --- a/odex25_ensan/odex_takaful/reports/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -# -*- coding: utf-8 -*- -from . import takaful_reports -from . import month_payment_report \ No newline at end of file diff --git a/odex25_ensan/odex_takaful/reports/month_payment_report.py b/odex25_ensan/odex_takaful/reports/month_payment_report.py deleted file mode 100644 index 2fa9396a5..000000000 --- a/odex25_ensan/odex_takaful/reports/month_payment_report.py +++ /dev/null @@ -1,177 +0,0 @@ -# -*- coding: utf-8 -*- - -from odoo import api, fields, models, tools, _ -from odoo.exceptions import ValidationError, UserError - -from datetime import datetime, timedelta, date -from odoo.tools import DEFAULT_SERVER_DATE_FORMAT -from dateutil.parser import parse - -class BenefitREP(models.AbstractModel): - _name = 'report.odex_takaful.benefit_payment_report_pdf' - - def get_result(self, data=None): - form = data - domain = [] - if form['benefit_ids']: - domain += [('benefit_id', 'in', form['benefit_ids'])] - if form['date_from'] and form['date_to']: - domain = [('month_id.date', '>=', form['date_from']), ('month_id.date', '<=', form['date_to'])] - payment = self.env['month.payment.line'].sudo().search(domain) - return payment - - @api.model - def get_report_values(self, docids, data=None): - record = self.get_result(data) - date_to, date_from = '', '' - if data['date_from'] and data['date_to']: - date_from = data['date_from'] - date_to = data['date_to'] - if not record: - raise ValidationError(_("Sorry, there are no results for this selection !")) - return { - 'date_from': date_from, - 'date_to': date_to, - 'docs': record, - } - - -class BenefitMonth(models.AbstractModel): - _name = 'report.odex_takaful.benefit_month_payment_report_pdf' - - def get_result(self, data=None): - form = data - domain = [] - if form['benefit_ids']: - domain += [('benefit_id', 'in', form['benefit_ids'])] - if form['date_from'] and form['date_to']: - domain += [('month_id.date', '>=', form['date_from']), ('month_id.date', '<=', form['date_to'])] - - payment = self.env['month.payment.line'].sudo().search(domain) - month_payment = payment.mapped('month_id') - li = [] - for y in month_payment: - date = parse(str(y.date)) - li.append({'name': y.name , 'code': y.code, 'month_payment': date.strftime("%m-%Y"), 'payment': payment.filtered(lambda r: r.month_id == y)}) - return li - - @api.model - def get_report_values(self, docids, data=None): - record = self.get_result(data) - # if record.get('data'): - # gender = record.get('gender').title() - # record.update({'gender': _(gender)}) - date_to, date_from = '', '' - if data['date_from'] and data['date_to']: - date_from = data['date_from'] - date_to = data['date_to'] - if not record: - raise ValidationError(_("Sorry, there are no results for this selection !")) - return { - 'date_from': date_from, - 'date_to': date_to, - 'docs': record, - } - - -class MonthReportXlsx(models.AbstractModel): - _name = "report.odex_takaful.benefit_month_payment_report_xlsx" - _inherit = 'report.report_xlsx.abstract' - - @api.model - def generate_xlsx_report(self, workbook, data, objs): - docs = objs - sheet = workbook.add_worksheet(_('Bank Sheet')) - if self.env.user.lang != 'en_US': - sheet.right_to_left() - format0 = workbook.add_format( - {'bottom': True, 'bg_color': '#b8bcbf', 'right': True, 'left': True, 'top': True, 'align': 'center', }) - format1 = workbook.add_format({'bottom': True, 'right': True, 'left': True, 'top': True, 'align': 'center', }) - format2 = workbook.add_format( - {'font_size': 14, 'bottom': True, 'right': True, 'left': True, 'top': True, 'align': 'center', - 'bold': True, 'bg_color': '#0f80d6', 'font_color': 'white'}) - for doc in docs: - - format2.set_align('center') - sheet.merge_range('A9:L9', - (_("Month Payment Sheet")) + " - " + doc.name + " / " + doc.code, format2) - sheet.set_column('B:D', 15) - sheet.set_column('E:F', 10) - row = 10 - clm = 0 - labels = [(_("#")), (_("Benefit Name")), (_("Benefit Type")), (_("Benefit ID Number")), (_("Birth Date")), - (_("Sponsorship Number")), (_("The Sponsor")), - (_("Amount")), (_("Iban")), (_("Bank Name")), (_("Responsible Name")), (_("Responsible ID Number"))] - - for res in labels: - sheet.write(row, clm, res, format0) - clm += 1 - row = 11 - seq = 0 - for rec in doc.line_ids: - seq += 1 - clm = 0 - sheet.write(row, clm, seq, format1) - sheet.write(row, clm + 1, rec.benefit_id.name, format1) - sheet.write(row, clm + 2, rec.benefit_id.benefit_type, format1) - sheet.write(row, clm + 3, rec.benefit_id.id_number, format1) - sheet.write(row, clm + 4, rec.benefit_id.birth_date, format1) - sheet.write(row, clm + 5, rec.s_code, format1) - sheet.write(row, clm + 6, rec.sponsor_id.name, format1) - sheet.write(row, clm + 7, rec.amount, format1) - sheet.write(row, clm + 8, rec.benefit_id.iban, format1) - sheet.write(row, clm + 9, rec.benefit_id.bank_id.name, format1) - sheet.write(row, clm + 10, rec.responsible_id.name, format1) - sheet.write(row, clm + 11, rec.responsible_id.id_number, format1) - - row += 1 - row += 3 - - -class BankSheetReportXlsx(models.AbstractModel): - _name = "report.odex_takaful.benefit_month_payment_bank_sheet" - _inherit = 'report.report_xlsx.abstract' - - @api.model - def generate_xlsx_report(self, workbook, data, objs): - docs = objs - sheet = workbook.add_worksheet('Bank Sheet') - if self.env.user.lang != 'en_US': - sheet.right_to_left() - format0 = workbook.add_format( - {'bottom': True, 'bg_color': '#b8bcbf', 'right': True, 'left': True, 'top': True, 'align': 'center', }) - format1 = workbook.add_format({'bottom': True, 'right': True, 'left': True, 'top': True, 'align': 'center', }) - format2 = workbook.add_format( - {'font_size': 14, 'bottom': True, 'right': True, 'left': True, 'top': True, 'align': 'center', - 'bold': True, 'bg_color': '#0f80d6', 'font_color': 'white'}) - for doc in docs: - - format2.set_align('center') - sheet.merge_range('A9:F9', - (_("Bank Sheet")) + " - " + doc.name + " / " + doc.code, format2) - sheet.set_column('B:D', 15) - sheet.set_column('E:F', 10) - row = 9 - clm = 0 - labels = [(_("#")), (_("Bank Name")), (_("Account Number")), (_("Amount")), - (_("Benefit Name")), (_("Benefit ID Number")), (_("Responsible Name")), (_("Responsible ID Number"))] - - for res in labels: - sheet.write(row, clm, res, format0) - clm += 1 - row = 10 - seq = 0 - for rec in doc.line_ids: - seq += 1 - clm = 0 - sheet.write(row, clm, seq, format1) - sheet.write(row, clm + 1, rec.benefit_id.bank_id.name, format1) - sheet.write(row, clm + 2, rec.benefit_id.iban, format1) - sheet.write(row, clm + 3, rec.amount, format1) - sheet.write(row, clm + 4, rec.benefit_id.name, format1) - sheet.write(row, clm + 5, rec.benefit_id.id_number, format1) - sheet.write(row, clm + 6, rec.responsible_id.name, format1) - sheet.write(row, clm + 7, rec.responsible_id.id_number, format1) - - row += 1 - row += 3 diff --git a/odex25_ensan/odex_takaful/reports/month_payment_template.xml b/odex25_ensan/odex_takaful/reports/month_payment_template.xml deleted file mode 100644 index ccbdf7bcb..000000000 --- a/odex25_ensan/odex_takaful/reports/month_payment_template.xml +++ /dev/null @@ -1,369 +0,0 @@ - -| # | -Benefit Name | -Benefit Type | -Benefit ID Number | -Sponsorship Number | -Month Payment | -Payment Code | -Amount | -Date | -Status | -
|---|---|---|---|---|---|---|---|---|---|
|
- |
- - - | -
-
- |
-
- - - | -- - | -- - | -- - | -- - | -- - | -
-
- |
-
| # | -Benefit Name | -Benefit Type | -Sponsorship Number | -The Sponsor | -Amount | - -Benefit ID Number | -IBAN | -Bank | -Responsible Name | -Responsible ID Number | -Status | -
|---|---|---|---|---|---|---|---|---|---|---|---|
|
- |
- - - - | -
-
- |
- - - | -- - | - -- - | - -- - | -- - - | -- - - | -- - | -- - | -
-
- |
-
| # | -Benefit Name | -Benefit Type | -Benefit ID Number | -Birth Date | -Sponsorship Number | -The Sponsor | -Amount | -IBAN | -Bank | -Responsible Name | -Responsible ID Number | -Status | -
|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
- |
- - - | -
-
- |
- - - - | -- - - | -- - - | -- - | - -- - | -- - - | -- - - | -- - | -- - | -
-
- |
-
| Start Date | -- | Payment Method | -- |
| End Date | -- | Branches | -- |
| Sponsors | -- | Benefit Members | -- |
| Sponsor | -Sponsor Mobile | -Sponsorship Creator | -Sponsorship Creator Branch | -Sponsorship Branch | -Beneficiary | -Sponsorship Creation Date | -Sponsorship Number | -Sponsor Bank | -Charity Bank | -Sponsor Account Number | -Payment Method | -Donation Type | -Donation Name | -Direct Debit Start | -Direct Debit End | -Donation Date | -Amount | -Total Amount | -
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - - | -- - | -
Total lines found:
-No sponsorship scheduling lines found for the selected criteria.
-- No extension history found -
-- Extension history will appear here when donations are extended. -
-- No extension history found -
-- Replacement Log will appear here when Benefit donations are replaced. -
-- Create your first Replacement Process -
-| # | -Sponsorship | -Start Date | -End Date | -Sponsorship Type | -Sponsorship Value | -Sponsorship State | -Makfool Name/Makfuleen Names | -Total Payment | -
|---|---|---|---|---|---|---|---|---|
|
- |
- - - | -- - | -- - | - -
-
- |
-
- - - | - -
-
- |
-
-
- - - - |
-
- - - | - -
| Kafalat Overdue Count | -Total Overdues | -
|---|---|
| - - | -- - | -
| # | -Sponsorship | -Contribution Value | -Sponsorship Duration | -Sponsorship Type | -Benefit Type | -Start Date | -End Date | -Overdue Amount | -Expected Cancel Date | -Status | - -
|---|---|---|---|---|---|---|---|---|---|---|
|
- |
-
- - - | - -- - | - -
-
- |
-
-
-
- |
-
-
-
- |
-
- - - | - -- - | - -- - | - -- - | - -
-
- |
-
-
| Canceled Kafalat Count | -From Date | -To Date | -
|---|---|---|
| - - | -- - | -- - | -
| # | -Sponsorship | -The Sponsor | -Cancel Date | -Cancel Type | -Cancel Reason | -Notes | -
|---|---|---|---|---|---|---|
|
- |
- - - | -- - | - -- - | - -
-
- |
-
- - - | - -- - | - -
Create the Sponsorship Cancellation -
-Create the Sponsorship Payment -
-- Create a new Sponsorship Scheduling Line -
-- Track and manage sponsorship payment schedules for beneficiaries. -
-- Create a Sponsorship States -
-- Create a Donation Item -
-- Create a points of sale -
-No Any Financial Contribution! -
-No Due Payments for Beneficiaries -
-No Any Sponsorships Arrears -
-Create a Month Payment -
-Create the Month Payment Line -
-No Notification Messege -
-No Message Template -
-No Any Sponsor Operations -
-|
- |
-
").css({position:"fixed",top:0,left:-1*l(y).scrollLeft(),height:1, -width:1,overflow:"hidden"}).append(l("").css({position:"absolute",top:1,left:1,width:100,overflow:"scroll"}).append(l("").css({width:"100%",height:10}))).appendTo("body"),d=c.children(),e=d.children();b.barWidth=d[0].offsetWidth-d[0].clientWidth;b.bScrollOversize=100===e[0].offsetWidth&&100!==d[0].clientWidth;b.bScrollbarLeft=1!==Math.round(e.offset().left);b.bBounding=c[0].getBoundingClientRect().width?!0:!1;c.remove()}l.extend(a.oBrowser,u.__browser);a.oScroll.iBarWidth=u.__browser.barWidth} -function Gb(a,b,c,d,e,h){var f=!1;if(c!==q){var g=c;f=!0}for(;d!==e;)a.hasOwnProperty(d)&&(g=f?b(g,a[d],d,a):a[d],f=!0,d+=h);return g}function cb(a,b){var c=u.defaults.column,d=a.aoColumns.length;c=l.extend({},u.models.oColumn,c,{nTh:b?b:A.createElement("th"),sTitle:c.sTitle?c.sTitle:b?b.innerHTML:"",aDataSort:c.aDataSort?c.aDataSort:[d],mData:c.mData?c.mData:d,idx:d});a.aoColumns.push(c);c=a.aoPreSearchCols;c[d]=l.extend({},u.models.oSearch,c[d]);Ia(a,d,l(b).data())}function Ia(a,b,c){b=a.aoColumns[b]; -var d=a.oClasses,e=l(b.nTh);if(!b.sWidthOrig){b.sWidthOrig=e.attr("width")||null;var h=(e.attr("style")||"").match(/width:\s*(\d+[pxem%]+)/);h&&(b.sWidthOrig=h[1])}c!==q&&null!==c&&(Eb(c),P(u.defaults.column,c,!0),c.mDataProp===q||c.mData||(c.mData=c.mDataProp),c.sType&&(b._sManualType=c.sType),c.className&&!c.sClass&&(c.sClass=c.className),c.sClass&&e.addClass(c.sClass),h=b.sClass,l.extend(b,c),Y(b,c,"sWidth","sWidthOrig"),h!==b.sClass&&(b.sClass=h+" "+b.sClass),c.iDataSort!==q&&(b.aDataSort=[c.iDataSort]), -Y(b,c,"aDataSort"));var f=b.mData,g=ma(f),k=b.mRender?ma(b.mRender):null;c=function(m){return"string"===typeof m&&-1!==m.indexOf("@")};b._bAttrSrc=l.isPlainObject(f)&&(c(f.sort)||c(f.type)||c(f.filter));b._setter=null;b.fnGetData=function(m,n,p){var t=g(m,n,q,p);return k&&n?k(t,n,m,p):t};b.fnSetData=function(m,n,p){return ha(f)(m,n,p)};"number"!==typeof f&&(a._rowReadObject=!0);a.oFeatures.bSort||(b.bSortable=!1,e.addClass(d.sSortableNone));a=-1!==l.inArray("asc",b.asSorting);c=-1!==l.inArray("desc", -b.asSorting);b.bSortable&&(a||c)?a&&!c?(b.sSortingClass=d.sSortableAsc,b.sSortingClassJUI=d.sSortJUIAscAllowed):!a&&c?(b.sSortingClass=d.sSortableDesc,b.sSortingClassJUI=d.sSortJUIDescAllowed):(b.sSortingClass=d.sSortable,b.sSortingClassJUI=d.sSortJUI):(b.sSortingClass=d.sSortableNone,b.sSortingClassJUI="")}function sa(a){if(!1!==a.oFeatures.bAutoWidth){var b=a.aoColumns;db(a);for(var c=0,d=b.length;cm[n])d(g.length+m[n],k);else if("string"===typeof m[n]){var p=0;for(f=g.length;p b&&a[e]--; -1!=d&&c===q&&a.splice(d,1)}function va(a,b,c,d){var e=a.aoData[b],h,f=function(k,m){for(;k.childNodes.length;)k.removeChild(k.firstChild);k.innerHTML=T(a,b,m,"display")};if("dom"!==c&&(c&&"auto"!==c||"dom"!==e.src)){var g=e.anCells;if(g)if(d!==q)f(g[d],d);else for(c=0,h=g.length;c ").appendTo(d));var k=0;for(b=g.length;k=a.fnRecordsDisplay()?0:d,a.iInitDisplayStart=-1);c=F(a,"aoPreDrawCallback","preDraw",[a]);if(-1!==l.inArray(!1,c))V(a,!1);else{c=[];var e=0;d=a.asStripeClasses;var h=d.length,f=a.oLanguage,g="ssp"==Q(a),k=a.aiDisplay,m=a._iDisplayStart,n=a.fnDisplayEnd();a.bDrawing=!0;if(a.bDeferLoading)a.bDeferLoading=!1,a.iDraw++,V(a,!1);else if(!g)a.iDraw++;else if(!a.bDestroying&&!b){Kb(a);return}if(0!==k.length)for(b=g?a.aoData.length:n,f=g?0:m;f",{"class":h?d[0]:""}).append(l(" ",{valign:"top",colSpan:na(a),"class":a.oClasses.sRowEmpty}).html(e))[0];F(a,"aoHeaderCallback","header",[l(a.nTHead).children("tr")[0], -ib(a),m,n,k]);F(a,"aoFooterCallback","footer",[l(a.nTFoot).children("tr")[0],ib(a),m,n,k]);d=l(a.nTBody);d.children().detach();d.append(l(c));F(a,"aoDrawCallback","draw",[a]);a.bSorted=!1;a.bFiltered=!1;a.bDrawing=!1}}function ka(a,b){var c=a.oFeatures,d=c.bFilter;c.bSort&&Lb(a);d?ya(a,a.oPreviousSearch):a.aiDisplay=a.aiDisplayMaster.slice();!0!==b&&(a._iDisplayStart=0);a._drawHold=b;ja(a);a._drawHold=!1}function Mb(a){var b=a.oClasses,c=l(a.nTable);c=l("").insertBefore(c);var d=a.oFeatures, -e=l("",{id:a.sTableId+"_wrapper","class":b.sWrapper+(a.nTFoot?"":" "+b.sNoFooter)});a.nHolding=c[0];a.nTableWrapper=e[0];a.nTableReinsertBefore=a.nTable.nextSibling;for(var h=a.sDom.split(""),f,g,k,m,n,p,t=0;t ")[0];m=h[t+1];if("'"==m||'"'==m){n="";for(p=2;h[t+p]!=m;)n+=h[t+p],p++;"H"==n?n=b.sJUIHeader:"F"==n&&(n=b.sJUIFooter);-1!=n.indexOf(".")?(m=n.split("."),k.id=m[0].substr(1,m[0].length-1),k.className=m[1]):"#"==n.charAt(0)?k.id=n.substr(1, -n.length-1):k.className=n;t+=p}e.append(k);e=l(k)}else if(">"==g)e=e.parent();else if("l"==g&&d.bPaginate&&d.bLengthChange)f=Nb(a);else if("f"==g&&d.bFilter)f=Ob(a);else if("r"==g&&d.bProcessing)f=Pb(a);else if("t"==g)f=Qb(a);else if("i"==g&&d.bInfo)f=Rb(a);else if("p"==g&&d.bPaginate)f=Sb(a);else if(0!==u.ext.feature.length)for(k=u.ext.feature,p=0,m=k.length;p ',g=d.sSearch;g=g.match(/_INPUT_/)?g.replace("_INPUT_",f):g+f;b=l("",{id:h.f?null:c+"_filter","class":b.sFilter}).append(l("").append(g));var k=function(n){var p=this.value?this.value:"";e.return&&"Enter"!==n.key||p==e.sSearch||(ya(a,{sSearch:p,bRegex:e.bRegex,bSmart:e.bSmart,bCaseInsensitive:e.bCaseInsensitive,"return":e.return}), -a._iDisplayStart=0,ja(a))};h=null!==a.searchDelay?a.searchDelay:"ssp"===Q(a)?400:0;var m=l("input",b).val(e.sSearch).attr("placeholder",d.sSearchPlaceholder).on("keyup.DT search.DT input.DT paste.DT cut.DT",h?mb(k,h):k).on("mouseup",function(n){setTimeout(function(){k.call(m[0],n)},10)}).on("keypress.DT",function(n){if(13==n.keyCode)return!1}).attr("aria-controls",c);l(a.nTable).on("search.dt.DT",function(n,p){if(a===p)try{m[0]!==A.activeElement&&m.val(e.sSearch)}catch(t){}});return b[0]}function ya(a, -b,c){var d=a.oPreviousSearch,e=a.aoPreSearchCols,h=function(g){d.sSearch=g.sSearch;d.bRegex=g.bRegex;d.bSmart=g.bSmart;d.bCaseInsensitive=g.bCaseInsensitive;d.return=g.return},f=function(g){return g.bEscapeRegex!==q?!g.bEscapeRegex:g.bRegex};eb(a);if("ssp"!=Q(a)){Vb(a,b.sSearch,c,f(b),b.bSmart,b.bCaseInsensitive,b.return);h(b);for(b=0;b =b.length)a.aiDisplay= -g.slice();else{if(k||c||d||f.length>b.length||0!==b.indexOf(f)||a.bSorted)a.aiDisplay=g.slice();b=a.aiDisplay;for(c=0;c ",{"class":a.oClasses.sInfo,id:c?null:b+"_info"});c||(a.aoDrawCallback.push({fn:ac,sName:"information"}),d.attr("role","status").attr("aria-live","polite"),l(a.nTable).attr("aria-describedby",b+"_info"));return d[0]}function ac(a){var b=a.aanFeatures.i;if(0!==b.length){var c=a.oLanguage,d=a._iDisplayStart+1,e=a.fnDisplayEnd(),h=a.fnRecordsTotal(), -f=a.fnRecordsDisplay(),g=f?c.sInfo:c.sInfoEmpty;f!==h&&(g+=" "+c.sInfoFiltered);g+=c.sInfoPostFix;g=bc(a,g);c=c.fnInfoCallback;null!==c&&(g=c.call(a.oInstance,a,d,e,h,f,g));l(b).html(g)}}function bc(a,b){var c=a.fnFormatNumber,d=a._iDisplayStart+1,e=a._iDisplayLength,h=a.fnRecordsDisplay(),f=-1===e;return b.replace(/_START_/g,c.call(a,d)).replace(/_END_/g,c.call(a,a.fnDisplayEnd())).replace(/_MAX_/g,c.call(a,a.fnRecordsTotal())).replace(/_TOTAL_/g,c.call(a,h)).replace(/_PAGE_/g,c.call(a,f?1:Math.ceil(d/ -e))).replace(/_PAGES_/g,c.call(a,f?1:Math.ceil(h/e)))}function Aa(a){var b=a.iInitDisplayStart,c=a.aoColumns;var d=a.oFeatures;var e=a.bDeferLoading;if(a.bInitialised){Mb(a);Jb(a);xa(a,a.aoHeader);xa(a,a.aoFooter);V(a,!0);d.bAutoWidth&&db(a);var h=0;for(d=c.length;h ",{name:c+"_length","aria-controls":c,"class":b.sLengthSelect});for(var f=0,g=h.length;f ").addClass(b.sLength);a.aanFeatures.l||(k[0].id=c+"_length");k.children().append(a.oLanguage.sLengthMenu.replace("_MENU_",e[0].outerHTML));l("select",k).val(a._iDisplayLength).on("change.DT",function(m){pb(a,l(this).val());ja(a)});l(a.nTable).on("length.dt.DT",function(m,n,p){a===n&&l("select",k).val(p)});return k[0]}function Sb(a){var b=a.sPaginationType,c=u.ext.pager[b],d="function"===typeof c,e=function(f){ja(f)};b=l("").addClass(a.oClasses.sPaging+ -b)[0];var h=a.aanFeatures;d||c.fnInit(a,b,e);h.p||(b.id=a.sTableId+"_paginate",a.aoDrawCallback.push({fn:function(f){if(d){var g=f._iDisplayStart,k=f._iDisplayLength,m=f.fnRecordsDisplay(),n=-1===k;g=n?0:Math.ceil(g/k);k=n?1:Math.ceil(m/k);m=c(g,k);var p;n=0;for(p=h.p.length;n h&&(d=0)):"first"==b?d=0:"previous"==b?(d=0<=e?d-e:0,0>d&&(d=0)):"next"==b?d+e
",{id:a.aanFeatures.r?null:a.sTableId+"_processing","class":a.oClasses.sProcessing}).html(a.oLanguage.sProcessing).append(" ").insertBefore(a.nTable)[0]}function V(a, -b){a.oFeatures.bProcessing&&l(a.aanFeatures.r).css("display",b?"block":"none");F(a,null,"processing",[a,b])}function Qb(a){var b=l(a.nTable),c=a.oScroll;if(""===c.sX&&""===c.sY)return a.nTable;var d=c.sX,e=c.sY,h=a.oClasses,f=b.children("caption"),g=f.length?f[0]._captionSide:null,k=l(b[0].cloneNode(!1)),m=l(b[0].cloneNode(!1)),n=b.children("tfoot");n.length||(n=null);k=l("",{"class":h.sScrollWrapper}).append(l("",{"class":h.sScrollHead}).css({overflow:"hidden",position:"relative",border:0, -width:d?d?K(d):null:"100%"}).append(l("",{"class":h.sScrollHeadInner}).css({"box-sizing":"content-box",width:c.sXInner||"100%"}).append(k.removeAttr("id").css("margin-left",0).append("top"===g?f:null).append(b.children("thead"))))).append(l("",{"class":h.sScrollBody}).css({position:"relative",overflow:"auto",width:d?K(d):null}).append(b));n&&k.append(l("",{"class":h.sScrollFoot}).css({overflow:"hidden",border:0,width:d?d?K(d):null:"100%"}).append(l("",{"class":h.sScrollFootInner}).append(m.removeAttr("id").css("margin-left", -0).append("bottom"===g?f:null).append(b.children("tfoot")))));b=k.children();var p=b[0];h=b[1];var t=n?b[2]:null;if(d)l(h).on("scroll.DT",function(v){v=this.scrollLeft;p.scrollLeft=v;n&&(t.scrollLeft=v)});l(h).css("max-height",e);c.bCollapse||l(h).css("height",e);a.nScrollHead=p;a.nScrollBody=h;a.nScrollFoot=t;a.aoDrawCallback.push({fn:Ja,sName:"scrolling"});return k[0]}function Ja(a){var b=a.oScroll,c=b.sX,d=b.sXInner,e=b.sY;b=b.iBarWidth;var h=l(a.nScrollHead),f=h[0].style,g=h.children("div"),k= -g[0].style,m=g.children("table");g=a.nScrollBody;var n=l(g),p=g.style,t=l(a.nScrollFoot).children("div"),v=t.children("table"),x=l(a.nTHead),w=l(a.nTable),r=w[0],C=r.style,G=a.nTFoot?l(a.nTFoot):null,ba=a.oBrowser,L=ba.bScrollOversize;U(a.aoColumns,"nTh");var O=[],I=[],H=[],fa=[],Z,Ba=function(D){D=D.style;D.paddingTop="0";D.paddingBottom="0";D.borderTopWidth="0";D.borderBottomWidth="0";D.height=0};var X=g.scrollHeight>g.clientHeight;if(a.scrollBarVis!==X&&a.scrollBarVis!==q)a.scrollBarVis=X,sa(a); -else{a.scrollBarVis=X;w.children("thead, tfoot").remove();if(G){X=G.clone().prependTo(w);var ca=G.find("tr");var Ca=X.find("tr");X.find("[id]").removeAttr("id")}var Ua=x.clone().prependTo(w);x=x.find("tr");X=Ua.find("tr");Ua.find("th, td").removeAttr("tabindex");Ua.find("[id]").removeAttr("id");c||(p.width="100%",h[0].style.width="100%");l.each(Pa(a,Ua),function(D,W){Z=ta(a,D);W.style.width=a.aoColumns[Z].sWidth});G&&da(function(D){D.style.width=""},Ca);h=w.outerWidth();""===c?(C.width="100%",L&& -(w.find("tbody").height()>g.offsetHeight||"scroll"==n.css("overflow-y"))&&(C.width=K(w.outerWidth()-b)),h=w.outerWidth()):""!==d&&(C.width=K(d),h=w.outerWidth());da(Ba,X);da(function(D){var W=y.getComputedStyle?y.getComputedStyle(D).width:K(l(D).width());H.push(D.innerHTML);O.push(W)},X);da(function(D,W){D.style.width=O[W]},x);l(X).css("height",0);G&&(da(Ba,Ca),da(function(D){fa.push(D.innerHTML);I.push(K(l(D).css("width")))},Ca),da(function(D,W){D.style.width=I[W]},ca),l(Ca).height(0));da(function(D, -W){D.innerHTML=''+H[W]+"";D.childNodes[0].style.height="0";D.childNodes[0].style.overflow="hidden";D.style.width=O[W]},X);G&&da(function(D,W){D.innerHTML=''+fa[W]+"";D.childNodes[0].style.height="0";D.childNodes[0].style.overflow="hidden";D.style.width=I[W]},Ca);Math.round(w.outerWidth())g.offsetHeight||"scroll"==n.css("overflow-y")?h+b:h,L&&(g.scrollHeight>g.offsetHeight||"scroll"==n.css("overflow-y"))&& -(C.width=K(ca-b)),""!==c&&""===d||ea(a,1,"Possible column misalignment",6)):ca="100%";p.width=K(ca);f.width=K(ca);G&&(a.nScrollFoot.style.width=K(ca));!e&&L&&(p.height=K(r.offsetHeight+b));c=w.outerWidth();m[0].style.width=K(c);k.width=K(c);d=w.height()>g.clientHeight||"scroll"==n.css("overflow-y");e="padding"+(ba.bScrollbarLeft?"Left":"Right");k[e]=d?b+"px":"0px";G&&(v[0].style.width=K(c),t[0].style.width=K(c),t[0].style[e]=d?b+"px":"0px");w.children("colgroup").insertBefore(w.children("thead")); -n.trigger("scroll");!a.bSorted&&!a.bFiltered||a._drawHold||(g.scrollTop=0)}}function da(a,b,c){for(var d=0,e=0,h=b.length,f,g;e ").appendTo(g.find("tbody"));g.find("thead, tfoot").remove();g.append(l(a.nTHead).clone()).append(l(a.nTFoot).clone());g.find("tfoot th, tfoot td").css("width","");m=Pa(a,g.find("thead")[0]); -for(v=0;v ").css({width:w.sWidthOrig,margin:0,padding:0,border:0,height:1}));if(a.aoData.length)for(v=0;v ").css(h||e?{position:"absolute",top:0,left:0,height:1,right:0,overflow:"hidden"}:{}).append(g).appendTo(p);h&&f?g.width(f):h? -(g.css("width","auto"),g.removeAttr("width"),g.width() ").css("width",K(a)).appendTo(b||A.body);b=a[0].offsetWidth;a.remove();return b}function dc(a,b){var c=ec(a,b);if(0>c)return null;var d=a.aoData[c];return d.nTr?d.anCells[b]:l(" ").html(T(a,c,b,"display"))[0]}function ec(a,b){for(var c,d=-1,e=-1,h=0,f=a.aoData.length;h d&&(d=c.length,e=h);return e}function K(a){return null===a?"0px":"number"==typeof a?0>a?"0px":a+"px":a.match(/\d$/)?a+"px":a}function oa(a){var b= -[],c=a.aoColumns;var d=a.aaSortingFixed;var e=l.isPlainObject(d);var h=[];var f=function(n){n.length&&!Array.isArray(n[0])?h.push(n):l.merge(h,n)};Array.isArray(d)&&f(d);e&&d.pre&&f(d.pre);f(a.aaSorting);e&&d.post&&f(d.post);for(a=0;a G?1:0;if(0!==C)return"asc"===r.dir?C:-C}C=c[n];G=c[p];return C G?1:0}):f.sort(function(n,p){var t,v=g.length, -x=e[n]._aSortData,w=e[p]._aSortData;for(t=0;t G?1:0})}a.bSorted=!0}function gc(a){var b=a.aoColumns,c=oa(a);a=a.oLanguage.oAria;for(var d=0,e=b.length;d /g,"");var k=h.nTh;k.removeAttribute("aria-sort");h.bSortable&&(0 e?e+1:3))}e=0;for(h=d.length;e e?e+1:3))}a.aLastSort=d}function fc(a,b){var c=a.aoColumns[b],d=u.ext.order[c.sSortDataType],e;d&&(e=d.call(a.oInstance,a,b,ua(a,b)));for(var h,f=u.ext.type.order[c.sType+"-pre"],g=0,k=a.aoData.length;g =e.length?[0,m[1]]:m)}));b.search!==q&&l.extend(a.oPreviousSearch,$b(b.search));if(b.columns){f=0;for(d=b.columns.length;f =c&&(b=c-d);b-=b%d;if(-1===d||0>b)b=0;a._iDisplayStart=b}function lb(a,b){a=a.renderer;var c=u.ext.renderer[b]; -return l.isPlainObject(a)&&a[b]?c[a[b]]||c._:"string"===typeof a?c[a]||c._:c._}function Q(a){return a.oFeatures.bServerSide?"ssp":a.ajax||a.sAjaxSource?"ajax":"dom"}function Ea(a,b){var c=ic.numbers_length,d=Math.floor(c/2);b<=c?a=pa(0,b):a<=d?(a=pa(0,c-2),a.push("ellipsis"),a.push(b-1)):(a>=b-1-d?a=pa(b-(c-2),b):(a=pa(a-d+2,a+d-1),a.push("ellipsis"),a.push(b-1)),a.splice(0,0,"ellipsis"),a.splice(0,0,0));a.DT_el="span";return a}function bb(a){l.each({num:function(b){return Xa(b,a)},"num-fmt":function(b){return Xa(b, -a,vb)},"html-num":function(b){return Xa(b,a,Ya)},"html-num-fmt":function(b){return Xa(b,a,Ya,vb)}},function(b,c){M.type.order[b+a+"-pre"]=c;b.match(/^html\-/)&&(M.type.search[b+a]=M.type.search.html)})}function jc(a,b,c,d,e){return y.moment?a[b](e):y.luxon?a[c](e):d?a[d](e):a}function Za(a,b,c){if(y.moment){var d=y.moment.utc(a,b,c,!0);if(!d.isValid())return null}else if(y.luxon){d=b?y.luxon.DateTime.fromFormat(a,b):y.luxon.DateTime.fromISO(a);if(!d.isValid)return null;d.setLocale(c)}else b?(kc|| -alert("DataTables warning: Formatted date without Moment.js or Luxon - https://datatables.net/tn/17"),kc=!0):d=new Date(a);return d}function wb(a){return function(b,c,d,e){0===arguments.length?(d="en",b=c=null):1===arguments.length?(d="en",c=b,b=null):2===arguments.length&&(d=c,c=b,b=null);var h="datetime-"+c;u.ext.type.order[h]||(u.ext.type.detect.unshift(function(f){return f===h?h:!1}),u.ext.type.order[h+"-asc"]=function(f,g){f=f.valueOf();g=g.valueOf();return f===g?0:f g?-1:1});return function(f,g){if(null===f||f===q)"--now"===e?(f=new Date,f=new Date(Date.UTC(f.getFullYear(),f.getMonth(),f.getDate(),f.getHours(),f.getMinutes(),f.getSeconds()))):f="";if("type"===g)return h;if(""===f)return"sort"!==g?"":Za("0000-01-01 00:00:00",null,d);if(null!==c&&b===c&&"sort"!==g&&"type"!==g&&!(f instanceof Date))return f;var k=Za(f,b,d);if(null===k)return f;if("sort"===g)return k;f=null===c?jc(k,"toDate","toJSDate", -"")[a]():jc(k,"format","toFormat","toISOString",c);return"display"===g?$a(f):f}}}function lc(a){return function(){var b=[Wa(this[u.ext.iApiIndex])].concat(Array.prototype.slice.call(arguments));return u.ext.internal[a].apply(this,b)}}var u=function(a,b){if(this instanceof u)return l(a).DataTable(b);b=a;this.$=function(f,g){return this.api(!0).$(f,g)};this._=function(f,g){return this.api(!0).rows(f,g).data()};this.api=function(f){return f?new B(Wa(this[M.iApiIndex])):new B(this)};this.fnAddData=function(f, -g){var k=this.api(!0);f=Array.isArray(f)&&(Array.isArray(f[0])||l.isPlainObject(f[0]))?k.rows.add(f):k.row.add(f);(g===q||g)&&k.draw();return f.flatten().toArray()};this.fnAdjustColumnSizing=function(f){var g=this.api(!0).columns.adjust(),k=g.settings()[0],m=k.oScroll;f===q||f?g.draw(!1):(""!==m.sX||""!==m.sY)&&Ja(k)};this.fnClearTable=function(f){var g=this.api(!0).clear();(f===q||f)&&g.draw()};this.fnClose=function(f){this.api(!0).row(f).child.hide()};this.fnDeleteRow=function(f,g,k){var m=this.api(!0); -f=m.rows(f);var n=f.settings()[0],p=n.aoData[f[0][0]];f.remove();g&&g.call(this,n,p);(k===q||k)&&m.draw();return p};this.fnDestroy=function(f){this.api(!0).destroy(f)};this.fnDraw=function(f){this.api(!0).draw(f)};this.fnFilter=function(f,g,k,m,n,p){n=this.api(!0);null===g||g===q?n.search(f,k,m,p):n.column(g).search(f,k,m,p);n.draw()};this.fnGetData=function(f,g){var k=this.api(!0);if(f!==q){var m=f.nodeName?f.nodeName.toLowerCase():"";return g!==q||"td"==m||"th"==m?k.cell(f,g).data():k.row(f).data()|| -null}return k.data().toArray()};this.fnGetNodes=function(f){var g=this.api(!0);return f!==q?g.row(f).node():g.rows().nodes().flatten().toArray()};this.fnGetPosition=function(f){var g=this.api(!0),k=f.nodeName.toUpperCase();return"TR"==k?g.row(f).index():"TD"==k||"TH"==k?(f=g.cell(f).index(),[f.row,f.columnVisible,f.column]):null};this.fnIsOpen=function(f){return this.api(!0).row(f).child.isShown()};this.fnOpen=function(f,g,k){return this.api(!0).row(f).child(g,k).show().child()[0]};this.fnPageChange= -function(f,g){f=this.api(!0).page(f);(g===q||g)&&f.draw(!1)};this.fnSetColumnVis=function(f,g,k){f=this.api(!0).column(f).visible(g);(k===q||k)&&f.columns.adjust().draw()};this.fnSettings=function(){return Wa(this[M.iApiIndex])};this.fnSort=function(f){this.api(!0).order(f).draw()};this.fnSortListener=function(f,g,k){this.api(!0).order.listener(f,g,k)};this.fnUpdate=function(f,g,k,m,n){var p=this.api(!0);k===q||null===k?p.row(g).data(f):p.cell(g,k).data(f);(n===q||n)&&p.columns.adjust();(m===q||m)&& -p.draw();return 0};this.fnVersionCheck=M.fnVersionCheck;var c=this,d=b===q,e=this.length;d&&(b={});this.oApi=this.internal=M.internal;for(var h in u.ext.internal)h&&(this[h]=lc(h));this.each(function(){var f={},g=1 /g,">").replace(/"/g, -"""):a},kc=!1,zc=",",Ac=".";if(Intl)try{for(var Ha=(new Intl.NumberFormat).formatToParts(100000.1),ra=0;ra").appendTo(t));r.nTHead=H[0];var fa=t.children("tbody");0===fa.length&&(fa=l("").insertAfter(H));r.nTBody=fa[0];H=t.children("tfoot");0===H.length&&0 ").appendTo(t));0===H.length||0===H.children().length?t.addClass(C.sNoFooter):0 /g,Dc=/^\d{2,4}[\.\/\-]\d{1,2}[\.\/\-]\d{1,2}([T ]{1}\d{1,2}[:\.]\d{2}([\.:]\d{2})?)?$/,Ec=/(\/|\.|\*|\+|\?|\||\(|\)|\[|\]|\{|\}|\\|\$|\^|\-)/g,vb=/['\u00A0,$£€¥%\u2009\u202F\u20BD\u20a9\u20BArfkɃΞ]/gi,aa=function(a){return a&&!0!==a&&"-"!== -a?!1:!0},nc=function(a){var b=parseInt(a,10);return!isNaN(b)&&isFinite(a)?b:null},oc=function(a,b){xb[b]||(xb[b]=new RegExp(ob(b),"g"));return"string"===typeof a&&"."!==b?a.replace(/\./g,"").replace(xb[b],"."):a},yb=function(a,b,c){var d="string"===typeof a;if(aa(a))return!0;b&&d&&(a=oc(a,b));c&&d&&(a=a.replace(vb,""));return!isNaN(parseFloat(a))&&isFinite(a)},pc=function(a,b,c){return aa(a)?!0:aa(a)||"string"===typeof a?yb(a.replace(Ya,""),b,c)?!0:null:null},U=function(a,b,c){var d=[],e=0,h=a.length; -if(c!==q)for(;e a.length)){var b=a.slice().sort();for(var c=b[0], -d=1,e=b.length;d ")[0],Bc=Sa.textContent!==q,Cc=/<.*?>/g,mb=u.util.throttle,tc=[],N=Array.prototype,Fc=function(a){var b,c=u.settings,d=l.map(c,function(h,f){return h.nTable});if(a){if(a.nTable&&a.oApi)return[a];if(a.nodeName&&"table"===a.nodeName.toLowerCase()){var e= -l.inArray(a,d);return-1!==e?[c[e]]:null}if(a&&"function"===typeof a.settings)return a.settings().toArray();"string"===typeof a?b=l(a):a instanceof l&&(b=a)}else return[];if(b)return b.map(function(h){e=l.inArray(this,d);return-1!==e?c[e]:null}).toArray()};var B=function(a,b){if(!(this instanceof B))return new B(a,b);var c=[],d=function(f){(f=Fc(f))&&c.push.apply(c,f)};if(Array.isArray(a))for(var e=0,h=a.length;e a?new B(b[a],this[a]):null},filter:function(a){var b=[];if(N.filter)b=N.filter.call(this,a,this);else for(var c=0,d=this.length;c ").addClass(g),l("td",k).addClass(g).html(f)[0].colSpan=na(a),e.push(k[0]))};h(c,d);b._details&&b._details.detach();b._details=l(e);b._detailsShow&&b._details.insertAfter(b.nTr)},wc=u.util.throttle(function(a){Da(a[0])}, -500),Cb=function(a,b){var c=a.context;c.length&&(a=c[0].aoData[b!==q?b:a[0]])&&a._details&&(a._details.remove(),a._detailsShow=q,a._details=q,l(a.nTr).removeClass("dt-hasChild"),wc(c))},xc=function(a,b){var c=a.context;if(c.length&&a.length){var d=c[0].aoData[a[0]];d._details&&((d._detailsShow=b)?(d._details.insertAfter(d.nTr),l(d.nTr).addClass("dt-hasChild")):(d._details.detach(),l(d.nTr).removeClass("dt-hasChild")),F(c[0],null,"childRow",[b,a.row(a[0])]),Ic(c[0]),wc(c))}},Ic=function(a){var b=new B(a), -c=a.aoData;b.off("draw.dt.DT_details column-sizing.dt.DT_details destroy.dt.DT_details");0g){var n=l.map(d,function(p,t){return p.bVisible?t:null});return[n[n.length+g]]}return[ta(a,g)];case "name":return l.map(e,function(p,t){return p===m[1]?t:null});default:return[]}if(f.nodeName&&f._DT_CellIndex)return[f._DT_CellIndex.column];g=l(h).filter(f).map(function(){return l.inArray(this,h)}).toArray();if(g.length||!f.nodeName)return g; -g=l(f).closest("*[data-dt-column]");return g.length?[g.data("dt-column")]:[]},a,c)};z("columns()",function(a,b){a===q?a="":l.isPlainObject(a)&&(b=a,a="");b=Ab(b);var c=this.iterator("table",function(d){return Kc(d,a,b)},1);c.selector.cols=a;c.selector.opts=b;return c});J("columns().header()","column().header()",function(a,b){return this.iterator("column",function(c,d){return c.aoColumns[d].nTh},1)});J("columns().footer()","column().footer()",function(a,b){return this.iterator("column",function(c, -d){return c.aoColumns[d].nTf},1)});J("columns().data()","column().data()",function(){return this.iterator("column-rows",yc,1)});J("columns().dataSrc()","column().dataSrc()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].mData},1)});J("columns().cache()","column().cache()",function(a){return this.iterator("column-rows",function(b,c,d,e,h){return Fa(b.aoData,h,"search"===a?"_aFilterData":"_aSortData",c)},1)});J("columns().nodes()","column().nodes()",function(){return this.iterator("column-rows", -function(a,b,c,d,e){return Fa(a.aoData,e,"anCells",b)},1)});J("columns().visible()","column().visible()",function(a,b){var c=this,d=this.iterator("column",function(e,h){if(a===q)return e.aoColumns[h].bVisible;var f=e.aoColumns,g=f[h],k=e.aoData,m;if(a!==q&&g.bVisible!==a){if(a){var n=l.inArray(!0,U(f,"bVisible"),h+1);f=0;for(m=k.length;f d;return!0};u.isDataTable=u.fnIsDataTable=function(a){var b=l(a).get(0),c=!1;if(a instanceof u.Api)return!0;l.each(u.settings,function(d,e){d=e.nScrollHead?l("table",e.nScrollHead)[0]:null;var h=e.nScrollFoot? -l("table",e.nScrollFoot)[0]:null;if(e.nTable===b||d===b||h===b)c=!0});return c};u.tables=u.fnTables=function(a){var b=!1;l.isPlainObject(a)&&(b=a.api,a=a.visible);var c=l.map(u.settings,function(d){if(!a||a&&l(d.nTable).is(":visible"))return d.nTable});return b?new B(c):c};u.camelToHungarian=P;z("$()",function(a,b){b=this.rows(b).nodes();b=l(b);return l([].concat(b.filter(a).toArray(),b.find(a).toArray()))});l.each(["on","one","off"],function(a,b){z(b+"()",function(){var c=Array.prototype.slice.call(arguments); -c[0]=l.map(c[0].split(/\s/),function(e){return e.match(/\.dt\b/)?e:e+".dt"}).join(" ");var d=l(this.tables().nodes());d[b].apply(d,c);return this})});z("clear()",function(){return this.iterator("table",function(a){Ma(a)})});z("settings()",function(){return new B(this.context,this.context)});z("init()",function(){var a=this.context;return a.length?a[0].oInit:null});z("data()",function(){return this.iterator("table",function(a){return U(a.aoData,"_aData")}).flatten()});z("destroy()",function(a){a=a|| -!1;return this.iterator("table",function(b){var c=b.oClasses,d=b.nTable,e=b.nTBody,h=b.nTHead,f=b.nTFoot,g=l(d);e=l(e);var k=l(b.nTableWrapper),m=l.map(b.aoData,function(p){return p.nTr}),n;b.bDestroying=!0;F(b,"aoDestroyCallback","destroy",[b]);a||(new B(b)).columns().visible(!0);k.off(".DT").find(":not(tbody *)").off(".DT");l(y).off(".DT-"+b.sInstance);d!=h.parentNode&&(g.children("thead").detach(),g.append(h));f&&d!=f.parentNode&&(g.children("tfoot").detach(),g.append(f));b.aaSorting=[];b.aaSortingFixed= -[];Va(b);l(m).removeClass(b.asStripeClasses.join(" "));l("th, td",h).removeClass(c.sSortable+" "+c.sSortableAsc+" "+c.sSortableDesc+" "+c.sSortableNone);e.children().detach();e.append(m);h=b.nTableWrapper.parentNode;f=a?"remove":"detach";g[f]();k[f]();!a&&h&&(h.insertBefore(d,b.nTableReinsertBefore),g.css("width",b.sDestroyWidth).removeClass(c.sTable),(n=b.asDestroyStripes.length)&&e.children().each(function(p){l(this).addClass(b.asDestroyStripes[p%n])}));c=l.inArray(b,u.settings);-1!==c&&u.settings.splice(c, -1)})});l.each(["column","row","cell"],function(a,b){z(b+"s().every()",function(c){var d=this.selector.opts,e=this;return this.iterator(b,function(h,f,g,k,m){c.call(e[b](f,"cell"===b?g:d,"cell"===b?d:q),f,g,k,m)})})});z("i18n()",function(a,b,c){var d=this.context[0];a=ma(a)(d.oLanguage);a===q&&(a=b);c!==q&&l.isPlainObject(a)&&(a=a[c]!==q?a[c]:a._);return a.replace("%d",c)});u.version="1.12.1";u.settings=[];u.models={};u.models.oSearch={bCaseInsensitive:!0,sSearch:"",bRegex:!1,bSmart:!0,"return":!1}; -u.models.oRow={nTr:null,anCells:null,_aData:[],_aSortData:null,_aFilterData:null,_sFilterRow:null,_sRowStripe:"",src:null,idx:-1};u.models.oColumn={idx:null,aDataSort:null,asSorting:null,bSearchable:null,bSortable:null,bVisible:null,_sManualType:null,_bAttrSrc:!1,fnCreatedCell:null,fnGetData:null,fnSetData:null,mData:null,mRender:null,nTh:null,nTf:null,sClass:null,sContentPadding:null,sDefaultContent:null,sName:null,sSortDataType:"std",sSortingClass:null,sSortingClassJUI:null,sTitle:null,sType:null, -sWidth:null,sWidthOrig:null};u.defaults={aaData:null,aaSorting:[[0,"asc"]],aaSortingFixed:[],ajax:null,aLengthMenu:[10,25,50,100],aoColumns:null,aoColumnDefs:null,aoSearchCols:[],asStripeClasses:null,bAutoWidth:!0,bDeferRender:!1,bDestroy:!1,bFilter:!0,bInfo:!0,bLengthChange:!0,bPaginate:!0,bProcessing:!1,bRetrieve:!1,bScrollCollapse:!1,bServerSide:!1,bSort:!0,bSortMulti:!0,bSortCellsTop:!1,bSortClasses:!0,bStateSave:!1,fnCreatedRow:null,fnDrawCallback:null,fnFooterCallback:null,fnFormatNumber:function(a){return a.toString().replace(/\B(?=(\d{3})+(?!\d))/g, -this.oLanguage.sThousands)},fnHeaderCallback:null,fnInfoCallback:null,fnInitComplete:null,fnPreDrawCallback:null,fnRowCallback:null,fnServerData:null,fnServerParams:null,fnStateLoadCallback:function(a){try{return JSON.parse((-1===a.iStateDuration?sessionStorage:localStorage).getItem("DataTables_"+a.sInstance+"_"+location.pathname))}catch(b){return{}}},fnStateLoadParams:null,fnStateLoaded:null,fnStateSaveCallback:function(a,b){try{(-1===a.iStateDuration?sessionStorage:localStorage).setItem("DataTables_"+ -a.sInstance+"_"+location.pathname,JSON.stringify(b))}catch(c){}},fnStateSaveParams:null,iStateDuration:7200,iDeferLoading:null,iDisplayLength:10,iDisplayStart:0,iTabIndex:0,oClasses:{},oLanguage:{oAria:{sSortAscending:": activate to sort column ascending",sSortDescending:": activate to sort column descending"},oPaginate:{sFirst:"First",sLast:"Last",sNext:"Next",sPrevious:"Previous"},sEmptyTable:"No data available in table",sInfo:"Showing _START_ to _END_ of _TOTAL_ entries",sInfoEmpty:"Showing 0 to 0 of 0 entries", -sInfoFiltered:"(filtered from _MAX_ total entries)",sInfoPostFix:"",sDecimal:"",sThousands:",",sLengthMenu:"Show _MENU_ entries",sLoadingRecords:"Loading...",sProcessing:"",sSearch:"Search:",sSearchPlaceholder:"",sUrl:"",sZeroRecords:"No matching records found"},oSearch:l.extend({},u.models.oSearch),sAjaxDataProp:"data",sAjaxSource:null,sDom:"lfrtip",searchDelay:null,sPaginationType:"simple_numbers",sScrollX:"",sScrollXInner:"",sScrollY:"",sServerMethod:"GET",renderer:null,rowId:"DT_RowId"};E(u.defaults); -u.defaults.column={aDataSort:null,iDataSort:-1,asSorting:["asc","desc"],bSearchable:!0,bSortable:!0,bVisible:!0,fnCreatedCell:null,mData:null,mRender:null,sCellType:"td",sClass:"",sContentPadding:"",sDefaultContent:null,sName:"",sSortDataType:"std",sTitle:null,sType:null,sWidth:null};E(u.defaults.column);u.models.oSettings={oFeatures:{bAutoWidth:null,bDeferRender:null,bFilter:null,bInfo:null,bLengthChange:null,bPaginate:null,bProcessing:null,bServerSide:null,bSort:null,bSortMulti:null,bSortClasses:null, -bStateSave:null},oScroll:{bCollapse:null,iBarWidth:0,sX:null,sXInner:null,sY:null},oLanguage:{fnInfoCallback:null},oBrowser:{bScrollOversize:!1,bScrollbarLeft:!1,bBounding:!1,barWidth:0},ajax:null,aanFeatures:[],aoData:[],aiDisplay:[],aiDisplayMaster:[],aIds:{},aoColumns:[],aoHeader:[],aoFooter:[],oPreviousSearch:{},aoPreSearchCols:[],aaSorting:null,aaSortingFixed:[],asStripeClasses:null,asDestroyStripes:[],sDestroyWidth:0,aoRowCallback:[],aoHeaderCallback:[],aoFooterCallback:[],aoDrawCallback:[], -aoRowCreatedCallback:[],aoPreDrawCallback:[],aoInitComplete:[],aoStateSaveParams:[],aoStateLoadParams:[],aoStateLoaded:[],sTableId:"",nTable:null,nTHead:null,nTFoot:null,nTBody:null,nTableWrapper:null,bDeferLoading:!1,bInitialised:!1,aoOpenRows:[],sDom:null,searchDelay:null,sPaginationType:"two_button",iStateDuration:0,aoStateSave:[],aoStateLoad:[],oSavedState:null,oLoadedState:null,sAjaxSource:null,sAjaxDataProp:null,jqXHR:null,json:q,oAjaxData:q,fnServerData:null,aoServerParams:[],sServerMethod:null, -fnFormatNumber:null,aLengthMenu:null,iDraw:0,bDrawing:!1,iDrawError:-1,_iDisplayLength:10,_iDisplayStart:0,_iRecordsTotal:0,_iRecordsDisplay:0,oClasses:{},bFiltered:!1,bSorted:!1,bSortCellsTop:null,oInit:null,aoDestroyCallback:[],fnRecordsTotal:function(){return"ssp"==Q(this)?1*this._iRecordsTotal:this.aiDisplayMaster.length},fnRecordsDisplay:function(){return"ssp"==Q(this)?1*this._iRecordsDisplay:this.aiDisplay.length},fnDisplayEnd:function(){var a=this._iDisplayLength,b=this._iDisplayStart,c=b+ -a,d=this.aiDisplay.length,e=this.oFeatures,h=e.bPaginate;return e.bServerSide?!1===h||-1===a?b+d:Math.min(b+a,this._iRecordsDisplay):!h||c>d||-1===a?d:c},oInstance:null,sInstance:null,iTabIndex:0,nScrollHead:null,nScrollFoot:null,aLastSort:[],oPlugins:{},rowIdFn:null,rowId:null};u.ext=M={buttons:{},classes:{},build:"bs4/dt-1.12.1/r-2.3.0",errMode:"alert",feature:[],search:[],selector:{cell:[],column:[],row:[]},internal:{},legacy:{ajax:null},pager:{},renderer:{pageButton:{},header:{}},order:{},type:{detect:[], -search:{},order:{}},_unique:0,fnVersionCheck:u.fnVersionCheck,iApiIndex:0,oJUIClasses:{},sVersion:u.version};l.extend(M,{afnFiltering:M.search,aTypes:M.type.detect,ofnSearch:M.type.search,oSort:M.type.order,afnSortData:M.order,aoFeatures:M.feature,oApi:M.internal,oStdClasses:M.classes,oPagination:M.pager});l.extend(u.ext.classes,{sTable:"dataTable",sNoFooter:"no-footer",sPageButton:"paginate_button",sPageButtonActive:"current",sPageButtonDisabled:"disabled",sStripeOdd:"odd",sStripeEven:"even",sRowEmpty:"dataTables_empty", -sWrapper:"dataTables_wrapper",sFilter:"dataTables_filter",sInfo:"dataTables_info",sPaging:"dataTables_paginate paging_",sLength:"dataTables_length",sProcessing:"dataTables_processing",sSortAsc:"sorting_asc",sSortDesc:"sorting_desc",sSortable:"sorting",sSortableAsc:"sorting_desc_disabled",sSortableDesc:"sorting_asc_disabled",sSortableNone:"sorting_disabled",sSortColumn:"sorting_",sFilterInput:"",sLengthSelect:"",sScrollWrapper:"dataTables_scroll",sScrollHead:"dataTables_scrollHead",sScrollHeadInner:"dataTables_scrollHeadInner", -sScrollBody:"dataTables_scrollBody",sScrollFoot:"dataTables_scrollFoot",sScrollFootInner:"dataTables_scrollFootInner",sHeaderTH:"",sFooterTH:"",sSortJUIAsc:"",sSortJUIDesc:"",sSortJUI:"",sSortJUIAscAllowed:"",sSortJUIDescAllowed:"",sSortJUIWrapper:"",sSortIcon:"",sJUIHeader:"",sJUIFooter:""});var ic=u.ext.pager;l.extend(ic,{simple:function(a,b){return["previous","next"]},full:function(a,b){return["first","previous","next","last"]},numbers:function(a,b){return[Ea(a,b)]},simple_numbers:function(a,b){return["previous", -Ea(a,b),"next"]},full_numbers:function(a,b){return["first","previous",Ea(a,b),"next","last"]},first_last_numbers:function(a,b){return["first",Ea(a,b),"last"]},_numbers:Ea,numbers_length:7});l.extend(!0,u.ext.renderer,{pageButton:{_:function(a,b,c,d,e,h){var f=a.oClasses,g=a.oLanguage.oPaginate,k=a.oLanguage.oAria.paginate||{},m,n,p=0,t=function(x,w){var r,C=f.sPageButtonDisabled,G=function(I){Ta(a,I.data.action,!0)};var ba=0;for(r=w.length;ba ").appendTo(x);t(O,L)}else{m=null;n=L;O=a.iTabIndex;switch(L){case "ellipsis":x.append('…');break;case "first":m=g.sFirst;0===e&&(O=-1,n+=" "+C);break;case "previous":m=g.sPrevious;0===e&&(O=-1,n+=" "+C);break;case "next":m=g.sNext;if(0===h||e===h-1)O=-1,n+=" "+C;break;case "last":m=g.sLast;if(0===h||e===h-1)O=-1,n+=" "+C;break;default:m=a.fnFormatNumber(L+1),n=e===L?f.sPageButtonActive:""}null!==m&&(O=l("",{"class":f.sPageButton+" "+n,"aria-controls":a.sTableId, -"aria-label":k[L],"data-dt-idx":p,tabindex:O,id:0===c&&"string"===typeof L?a.sTableId+"_"+L:null}).html(m).appendTo(x),sb(O,{action:L},G),p++)}}};try{var v=l(b).find(A.activeElement).data("dt-idx")}catch(x){}t(l(b).empty(),d);v!==q&&l(b).find("[data-dt-idx="+v+"]").trigger("focus")}}});l.extend(u.ext.type.detect,[function(a,b){b=b.oLanguage.sDecimal;return yb(a,b)?"num"+b:null},function(a,b){if(a&&!(a instanceof Date)&&!Dc.test(a))return null;b=Date.parse(a);return null!==b&&!isNaN(b)||aa(a)?"date": -null},function(a,b){b=b.oLanguage.sDecimal;return yb(a,b,!0)?"num-fmt"+b:null},function(a,b){b=b.oLanguage.sDecimal;return pc(a,b)?"html-num"+b:null},function(a,b){b=b.oLanguage.sDecimal;return pc(a,b,!0)?"html-num-fmt"+b:null},function(a,b){return aa(a)||"string"===typeof a&&-1!==a.indexOf("<")?"html":null}]);l.extend(u.ext.type.search,{html:function(a){return aa(a)?a:"string"===typeof a?a.replace(mc," ").replace(Ya,""):""},string:function(a){return aa(a)?a:"string"===typeof a?a.replace(mc," "): -a}});var Xa=function(a,b,c,d){if(0!==a&&(!a||"-"===a))return-Infinity;b&&(a=oc(a,b));a.replace&&(c&&(a=a.replace(c,"")),d&&(a=a.replace(d,"")));return 1*a};l.extend(M.type.order,{"date-pre":function(a){a=Date.parse(a);return isNaN(a)?-Infinity:a},"html-pre":function(a){return aa(a)?"":a.replace?a.replace(/<.*?>/g,"").toLowerCase():a+""},"string-pre":function(a){return aa(a)?"":"string"===typeof a?a.toLowerCase():a.toString?a.toString():""},"string-asc":function(a,b){return ab?1:0},"string-desc":function(a, -b){return ab?-1:0}});bb("");l.extend(!0,u.ext.renderer,{header:{_:function(a,b,c,d){l(a.nTable).on("order.dt.DT",function(e,h,f,g){a===h&&(e=c.idx,b.removeClass(d.sSortAsc+" "+d.sSortDesc).addClass("asc"==g[e]?d.sSortAsc:"desc"==g[e]?d.sSortDesc:c.sSortingClass))})},jqueryui:function(a,b,c,d){l("").addClass(d.sSortJUIWrapper).append(b.contents()).append(l("").addClass(d.sSortIcon+" "+c.sSortingClassJUI)).appendTo(b);l(a.nTable).on("order.dt.DT",function(e,h,f,g){a===h&&(e=c.idx, -b.removeClass(d.sSortAsc+" "+d.sSortDesc).addClass("asc"==g[e]?d.sSortAsc:"desc"==g[e]?d.sSortDesc:c.sSortingClass),b.find("span."+d.sSortIcon).removeClass(d.sSortJUIAsc+" "+d.sSortJUIDesc+" "+d.sSortJUI+" "+d.sSortJUIAscAllowed+" "+d.sSortJUIDescAllowed).addClass("asc"==g[e]?d.sSortJUIAsc:"desc"==g[e]?d.sSortJUIDesc:c.sSortingClassJUI))})}}});var $a=function(a){Array.isArray(a)&&(a=a.join(","));return"string"===typeof a?a.replace(/&/g,"&").replace(/ h?"-":"",g=parseFloat(h);if(isNaN(g))return $a(h);g=g.toFixed(c);h=Math.abs(g);g=parseInt(h,10);h=c?b+(h-g).toFixed(c).substring(2):"";0===g&&0===parseFloat(h)&&(f="");return f+(d||"")+g.toString().replace(/\B(?=(\d{3})+(?!\d))/g,a)+h+(e||"")}}},text:function(){return{display:$a,filter:$a}}}; -l.extend(u.ext.internal,{_fnExternApiFunc:lc,_fnBuildAjax:Qa,_fnAjaxUpdate:Kb,_fnAjaxParameters:Tb,_fnAjaxUpdateDraw:Ub,_fnAjaxDataSrc:za,_fnAddColumn:cb,_fnColumnOptions:Ia,_fnAdjustColumnSizing:sa,_fnVisibleToColumnIndex:ta,_fnColumnIndexToVisible:ua,_fnVisbleColumns:na,_fnGetColumns:Ka,_fnColumnTypes:eb,_fnApplyColumnDefs:Hb,_fnHungarianMap:E,_fnCamelToHungarian:P,_fnLanguageCompat:la,_fnBrowserDetect:Fb,_fnAddData:ia,_fnAddTr:La,_fnNodeToDataIndex:function(a,b){return b._DT_RowIndex!==q?b._DT_RowIndex: -null},_fnNodeToColumnIndex:function(a,b,c){return l.inArray(c,a.aoData[b].anCells)},_fnGetCellData:T,_fnSetCellData:Ib,_fnSplitObjNotation:hb,_fnGetObjectDataFn:ma,_fnSetObjectDataFn:ha,_fnGetDataMaster:ib,_fnClearTable:Ma,_fnDeleteIndex:Na,_fnInvalidate:va,_fnGetRowElements:gb,_fnCreateTr:fb,_fnBuildHead:Jb,_fnDrawHead:xa,_fnDraw:ja,_fnReDraw:ka,_fnAddOptionsHtml:Mb,_fnDetectHeader:wa,_fnGetUniqueThs:Pa,_fnFeatureHtmlFilter:Ob,_fnFilterComplete:ya,_fnFilterCustom:Xb,_fnFilterColumn:Wb,_fnFilter:Vb, -_fnFilterCreateSearch:nb,_fnEscapeRegex:ob,_fnFilterData:Yb,_fnFeatureHtmlInfo:Rb,_fnUpdateInfo:ac,_fnInfoMacros:bc,_fnInitialise:Aa,_fnInitComplete:Ra,_fnLengthChange:pb,_fnFeatureHtmlLength:Nb,_fnFeatureHtmlPaginate:Sb,_fnPageChange:Ta,_fnFeatureHtmlProcessing:Pb,_fnProcessingDisplay:V,_fnFeatureHtmlTable:Qb,_fnScrollDraw:Ja,_fnApplyToChildren:da,_fnCalculateColumnWidths:db,_fnThrottle:mb,_fnConvertToWidth:cc,_fnGetWidestNode:dc,_fnGetMaxLenString:ec,_fnStringToCss:K,_fnSortFlatten:oa,_fnSort:Lb, -_fnSortAria:gc,_fnSortListener:rb,_fnSortAttachListener:kb,_fnSortingClasses:Va,_fnSortData:fc,_fnSaveState:Da,_fnLoadState:hc,_fnImplementState:tb,_fnSettingsFromNode:Wa,_fnLog:ea,_fnMap:Y,_fnBindAction:sb,_fnCallbackReg:R,_fnCallbackFire:F,_fnLengthOverflow:qb,_fnRenderer:lb,_fnDataSource:Q,_fnRowAttributes:jb,_fnExtend:ub,_fnCalculateEnd:function(){}});l.fn.dataTable=u;u.$=l;l.fn.dataTableSettings=u.settings;l.fn.dataTableExt=u.ext;l.fn.DataTable=function(a){return l(this).dataTable(a).api()}; -l.each(u,function(a,b){l.fn.DataTable[a]=b});return u}); - - -/*! - DataTables Bootstrap 4 integration - ©2011-2017 SpryMedia Ltd - datatables.net/license -*/ -var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.findInternal=function(a,b,c){a instanceof String&&(a=String(a));for(var e=a.length,d=0;d <'col-sm-12 col-md-6'f>><'row'<'col-sm-12'tr>><'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-12'p>>", -renderer:"bootstrap"});a.extend(d.ext.classes,{sWrapper:"dataTables_wrapper dt-bootstrap4",sFilterInput:"form-control form-control-sm",sLengthSelect:"custom-select custom-select-sm form-control form-control-sm",sProcessing:"dataTables_processing card",sPageButton:"paginate_button page-item"});d.ext.renderer.pageButton.bootstrap=function(f,l,A,B,m,t){var u=new d.Api(f),C=f.oClasses,n=f.oLanguage.oPaginate,D=f.oLanguage.oAria.paginate||{},h,k,v=0,y=function(q,w){var x,E=function(p){p.preventDefault(); -a(p.currentTarget).hasClass("disabled")||u.page()==p.data.action||u.page(p.data.action).draw("page")};var r=0;for(x=w.length;r ",{"class":C.sPageButton+" "+k,id:0===A&&"string"===typeof g?f.sTableId+"_"+g:null}).append(a("",{href:"#","aria-controls":f.sTableId,"aria-label":D[g],"data-dt-idx":v,tabindex:f.iTabIndex,"class":"page-link"}).html(h)).appendTo(q);f.oApi._fnBindAction(F,{action:g},E);v++}}}};try{var z=a(l).find(c.activeElement).data("dt-idx")}catch(q){}y(a(l).empty().html(' ').children("ul"),B);z!==e&&a(l).find("[data-dt-idx="+z+"]").trigger("focus")};return d}); - - -/*! - SpryMedia Ltd. - - This source file is free software, available under the following license: - MIT license - http://datatables.net/license/mit - - This source file is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details. - - For details please refer to: http://www.datatables.net - Responsive 2.3.0 - 2014-2022 SpryMedia Ltd - datatables.net/license -*/ -var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.findInternal=function(b,k,m){b instanceof String&&(b=String(b));for(var n=b.length,p=0;p
td, >th", -f).each(function(e){e=c.column.index("toData",e);!1===a.s.current[e]&&b(this).css("display","none")})});c.on("destroy.dtr",function(){c.off(".dtr");b(c.table().body()).off(".dtr");b(k).off("resize.dtr orientationchange.dtr");c.cells(".dtr-control").nodes().to$().removeClass("dtr-control");b.each(a.s.current,function(f,l){!1===l&&a._setColumnVis(f,!0)})});this.c.breakpoints.sort(function(f,l){return f.width l.width?-1:0});this._classLogic();this._resizeAuto();d=this.c.details;!1!== -d.type&&(a._detailsInit(),c.on("column-visibility.dtr",function(){a._timer&&clearTimeout(a._timer);a._timer=setTimeout(function(){a._timer=null;a._classLogic();a._resizeAuto();a._resize(!0);a._redrawChildren()},100)}),c.on("draw.dtr",function(){a._redrawChildren()}),b(c.table().node()).addClass("dtr-"+d.type));c.on("column-reorder.dtr",function(f,l,h){a._classLogic();a._resizeAuto();a._resize(!0)});c.on("column-sizing.dtr",function(){a._resizeAuto();a._resize()});c.on("column-calc.dt",function(f, -l){f=a.s.current;for(var h=0;h h-d[q].minWidth?(r=!0,l[q]=!1):l[q]=!0,h-=d[q].minWidth)}f=!1;e=0;for(g=d.length;e =q&&f(h,c[e].name);else if("not-"===r)for(e=0,r=c.length;e g?c.columns().eq(0).length+ -g:g;if(c.cell(this).index().column!==l)return}l=c.row(b(this).closest("tr"));"click"===f.type?a._detailsDisplay(l,!1):"mousedown"===f.type?b(this).css("outline","none"):"mouseup"===f.type&&b(this).trigger("blur").css("outline","")}})},_detailsObj:function(a){var c=this,d=this.s.dt;return b.map(this.s.columns,function(g,f){if(!g.never&&!g.control)return g=d.settings()[0].aoColumns[f],{className:g.sClass,columnIndex:f,data:d.cell(a,f).render(c.c.orthogonal),hidden:d.column(f).visible()&&!c.s.current[f], -rowIndex:a,title:null!==g.sTitle?g.sTitle:b(d.column(f).header()).text()}})},_find:function(a){for(var c=this.c.breakpoints,d=0,g=c.length;d ").append(h).appendTo(f)}b(" ").append(l).appendTo(g);"inline"===this.c.details.type&&b(d).addClass("dtr-inline collapsed");b(d).find("[name]").removeAttr("name");b(d).css("position", -"relative");d=b("").css({width:1,height:1,overflow:"hidden",clear:"both"}).append(d);d.insertBefore(a.table().node());l.each(function(e){e=a.column.index("fromVisible",e);c[e].minWidth=this.offsetWidth||0});d.remove()}},_responsiveOnlyHidden:function(){var a=this.s.dt;return b.map(this.s.current,function(c,d){return!1===a.column(d).visible()?!0:c})},_setColumnVis:function(a,c){var d=this.s.dt,g=c?"":"none";b(d.column(a).header()).css("display",g).toggleClass("dtr-hidden",!c);b(d.column(a).footer()).css("display", -g).toggleClass("dtr-hidden",!c);d.column(a).nodes().to$().css("display",g).toggleClass("dtr-hidden",!c);b.isEmptyObject(A)||d.cells(null,a).indexes().each(function(f){y(d,f.row,f.column)})},_tabIndexes:function(){var a=this.s.dt,c=a.cells({page:"current"}).nodes().to$(),d=a.settings()[0],g=this.c.details.target;c.filter("[data-dtr-keyboard]").removeData("[data-dtr-keyboard]");"number"===typeof g?a.cells(null,g,{page:"current"}).nodes().to$().attr("tabIndex",d.iTabIndex).data("dtr-keyboard",1):("td:first-child, th:first-child"=== -g&&(g=">td:first-child, >th:first-child"),b(g,a.rows({page:"current"}).nodes()).attr("tabIndex",d.iTabIndex).data("dtr-keyboard",1))}});u.breakpoints=[{name:"desktop",width:Infinity},{name:"tablet-l",width:1024},{name:"tablet-p",width:768},{name:"mobile-l",width:480},{name:"mobile-p",width:320}];u.display={childRow:function(a,c,d){if(c){if(b(a.node()).hasClass("parent"))return a.child(d(),"child").show(),!0}else{if(a.child.isShown())return a.child(!1),b(a.node()).removeClass("parent"),!1;a.child(d(), -"child").show();b(a.node()).addClass("parent");return!0}},childRowImmediate:function(a,c,d){if(!c&&a.child.isShown()||!a.responsive.hasHidden())return a.child(!1),b(a.node()).removeClass("parent"),!1;a.child(d(),"child").show();b(a.node()).addClass("parent");return!0},modal:function(a){return function(c,d,g){if(d)b("div.dtr-modal-content").empty().append(g());else{var f=function(){l.remove();b(m).off("keypress.dtr")},l=b('').append(b('').append(b('').append(g())).append(b(' ×').click(function(){f()}))).append(b('').click(function(){f()})).appendTo("body"); -b(m).on("keyup.dtr",function(h){27===h.keyCode&&(h.stopPropagation(),f())})}a&&a.header&&b("div.dtr-modal-content").prepend(""+a.header(c)+"
")}}};var A={};u.renderer={listHiddenNodes:function(){return function(a,c,d){var g=b(''),f=!1;b.each(d,function(l,h){h.hidden&&(b("
'+ -h.title+" ").append(b('').append(p(a,h.rowIndex,h.columnIndex))).appendTo(g),f=!0)});return f?g:!1}},listHidden:function(){return function(a,c,d){return(a=b.map(d,function(g){var f=g.className?'class="'+g.className+'"':"";return g.hidden?"'+g.title+' '+g.data+" ":""}).join(""))?b('').append(a):!1}},tableAll:function(a){a=b.extend({tableClass:""},a);return function(c,d,g){c=b.map(g,function(f){return"
"}).join("");return b(' '+f.title+": "+f.data+" ').append(c)}}};u.defaults={breakpoints:u.breakpoints,auto:!0,details:{display:u.display.childRow,renderer:u.renderer.listHidden(), -target:0,type:"inline"},orthogonal:"display"};var C=b.fn.dataTable.Api;C.register("responsive()",function(){return this});C.register("responsive.index()",function(a){a=b(a);return{column:a.data("dtr-index"),row:a.parent().data("dtr-index")}});C.register("responsive.rebuild()",function(){return this.iterator("table",function(a){a._responsive&&a._responsive._classLogic()})});C.register("responsive.recalc()",function(){return this.iterator("table",function(a){a._responsive&&(a._responsive._resizeAuto(), -a._responsive._resize())})});C.register("responsive.hasHidden()",function(){var a=this.context[0];return a._responsive?-1!==b.inArray(!1,a._responsive._responsiveOnlyHidden()):!1});C.registerPlural("columns().responsiveHidden()","column().responsiveHidden()",function(){return this.iterator("column",function(a,c){return a._responsive?a._responsive._responsiveOnlyHidden()[c]:!1},1)});u.version="2.3.0";b.fn.dataTable.Responsive=u;b.fn.DataTable.Responsive=u;b(m).on("preInit.dt.dtr",function(a,c,d){"dt"=== -a.namespace&&(b(c.nTable).hasClass("responsive")||b(c.nTable).hasClass("dt-responsive")||c.oInit.responsive||z.defaults.responsive)&&(a=c.oInit.responsive,!1!==a&&new u(c,b.isPlainObject(a)?a:{}))});return u}); - - -/*! Bootstrap 4 integration for DataTables' Responsive - * ©2016 SpryMedia Ltd - datatables.net/license - */ - -(function( factory ){ - if ( typeof define === 'function' && define.amd ) { - // AMD - define( ['jquery', 'datatables.net-bs4', 'datatables.net-responsive'], function ( $ ) { - return factory( $, window, document ); - } ); - } - else if ( typeof exports === 'object' ) { - // CommonJS - module.exports = function (root, $) { - if ( ! root ) { - root = window; - } - - if ( ! $ || ! $.fn.dataTable ) { - $ = require('datatables.net-bs4')(root, $).$; - } - - if ( ! $.fn.dataTable.Responsive ) { - require('datatables.net-responsive')(root, $); - } - - return factory( $, root, root.document ); - }; - } - else { - // Browser - factory( jQuery, window, document ); - } -}(function( $, window, document, undefined ) { -'use strict'; -var DataTable = $.fn.dataTable; - - -var _display = DataTable.Responsive.display; -var _original = _display.modal; -var _modal = $( - '
'+ - '' -); - -_display.modal = function ( options ) { - return function ( row, update, render ) { - if ( ! $.fn.modal ) { - _original( row, update, render ); - } - else { - if ( ! update ) { - if ( options && options.header ) { - var header = _modal.find('div.modal-header'); - var button = header.find('button').detach(); - - header - .empty() - .append( ''+ - ''+ - ''+ - ''+options.header( row )+'
' ) - .append( button ); - } - - _modal.find( 'div.modal-body' ) - .empty() - .append( render() ); - - _modal - .appendTo( 'body' ) - .modal(); - } - } - }; -}; - - -return DataTable.Responsive; -})); - - diff --git a/odex25_ensan/takaful_portal_benefit/static/js/families_loan.js b/odex25_ensan/takaful_portal_benefit/static/js/families_loan.js deleted file mode 100644 index f4459f69a..000000000 --- a/odex25_ensan/takaful_portal_benefit/static/js/families_loan.js +++ /dev/null @@ -1,174 +0,0 @@ -$(document).ready(function () { - // get all food food surplus - $.ajax({ - url: '/services/loans', - type: 'GET', - dataType: 'json', - processData: false, - success: function (response) { - if (response.status && response.data.length > 0) { - loans = response.data[0].loans; - console.log(loans); - loans.forEach((element, i) => { - $('.families_loans_row').append(` --- - `) - }); - } - else { - $('.families_loans_row').append(`--- ${element.name} -
--
- - تبرع بقرض للاسرة - -- -
-- - ${element.description} - -
- -
-- - ${element.benefits_total} أفراد - -
- -
-- - ${element.project_name} - -
- -
-- - بحاجة ل ${element.loan_amount} - -
لايوجد أسر لعرضها
`) - - } - }, - error: function (error) { - $(".families_feedback").text(error.msg).addClass('alert alert-danger') - } - }); - - $("#good_loan_form").on("submit", function (event) { - event.preventDefault(); - - var amount = $("#loan_amount").val(); - - var name_op = zakat_sacrifices_text; - - var encodedAmount = encodeURIComponent(loan_amount); - var encodedNameOp = encodeURIComponent(name_op); - - var redirectURL = "/dashboard/payment/paycard?name_op=" + encodedNameOp + "&required_amount=" + encodedAmount; - - window.location.href = redirectURL; - }); - - - - - //set the family id - $('.families_loans_row').on('click', '.families_loan_link', function () { - $('.loans_modal').modal('show'); - $("#family_id").val($(this).data('id')); - $("#loan_amount").val($(this).data('amount')); - console.log($("#family_id").val()); - }); - - $('.new_donor').hide(); //hide the feedback div - $('form#good_loan_form').on('submit', function (evt) { - evt.preventDefault(); - var form_data = $(this).serialize(); - var id = $("#family_id").val(); - var food_surplus_api = `/services/create_loan?id=${id}`; - console.log(food_surplus_api); - $.ajax({ - url: food_surplus_api, - type: "POST", - data: form_data, - dataType: 'json', - success: function (response) { - if (response.status) { - $('.new_donor').show(); - $(".new_donor").text(response.msg).addClass('alert alert-success') - setTimeout(function () { - $('.new_donor').hide(); - location.reload(); - // $('.zakat_modal').modal('hide'); - }, 3000); - } else { - $('.new_donor').show(); - $(".new_donor").text(response.msg).addClass('alert alert-danger form_error') - // setTimeout(function () { - // $('.new_donor').hide(); - // // location.reload(); - // }, 3000); - } - }, - error: function (err) { - $('.new_donor').show(); - $(".new_donor").text(err.msg).addClass('alert alert-danger server_error') - // setTimeout(function () { - // $('.new_donor').hide(); - // // location.reload(); - // }, 3000); - } - }); - }); - - // installment_number - - var loan_amount = $('#loan_amount'); - var installment_value = $('#installment_value'); - var installment_number = $('#installment_number'); - - function calculateResult() { - var value1 = loan_amount.val(); - var value2 = installment_value.val(); - - // Perform division only if both values are provided and not zero - if (value1 !== '' && value2 !== '' && parseFloat(value2) !== 0) { - var divisionResult = parseFloat(value1) / parseFloat(value2); - - // Set the result value - installment_number.val(divisionResult.toFixed(2)); - } else { - installment_number.val(''); - } - } - - loan_amount.on('input', calculateResult); - installment_value.on('input', calculateResult); - - $('.user_name').hide() - - var userId = $('#userId').val(); - if(userId > 4){ - $('.user_name').hide() - } else { - $('.user_name').show() - } - -}) - diff --git a/odex25_ensan/takaful_portal_benefit/static/js/food_basket.js b/odex25_ensan/takaful_portal_benefit/static/js/food_basket.js deleted file mode 100644 index c4fb18b54..000000000 --- a/odex25_ensan/takaful_portal_benefit/static/js/food_basket.js +++ /dev/null @@ -1,348 +0,0 @@ -// $(document).ready(function () { - - -// // get all food basket in reciving mood - -// $.ajax({ -// url: '/services/food_basket', -// type: 'GET', -// dataType: 'json', -// processData: false, -// success: function (response) { -// food_basket = response.data[0].basket; -// console.log(food_basket); -// if (response.status) { -// food_basket.forEach((element, i) => { -// $('.food_basket_row').append(` -//-//-// `) -// }); -// } -// else { -// $('.food_basket_row').append(`-//-//-// ${element.name} -//
-//-// ${element.description ? - -// ` -//
-// تبرع الان -// -//- -//
-// ` -// : - -// '' -// } - -//-// ${element.description} -//
- -//
-//-// ${element.date_start} حتى ${element.date_end} -//
لايوجد زكاة لعرضها
`) - -// } -// }, -// error: function (error) { -// $(".zakat_fitr_feedback").text(error.msg).addClass('alert alert-danger') -// } -// }); - - -// var zakat_sacrifices_text = ""; - -// $(".food_basket_row").on('click','.food_basket_link', function(){ -// console.log("hello"); -// var data_id = $(this).data("id") -// console.log(data_id); -// const targetDiv = $('#' + data_id); -// console.log(targetDiv); -// if (targetDiv.length > 0) { -// const h5Element = targetDiv.find('h5'); -// console.log(h5Element); - -// if (h5Element.length > 0) { -// zakat_sacrifices_text = h5Element.text(); -// } -// } -// }) - -// $("#food_basket_form").on("submit", function (event) { -// event.preventDefault(); - -// var amount = $("#amount").val(); - -// var name_op = zakat_sacrifices_text; - -// var encodedAmount = encodeURIComponent(amount); -// var encodedNameOp = encodeURIComponent(name_op); - -// var redirectURL = "/dashboard/payment/paycard?name_op=" + encodedNameOp + "&required_amount=" + encodedAmount; - -// window.location.href = redirectURL; -// }); - - - -// //set the zakat id -// $('.food_basket_row').on('click', '.food_basket_link', function () { -// $('.food_basket_modal').modal('show'); -// $("#basket_id_holder_input").val($(this).data('id')) -// console.log($("#basket_id_holder_input").val()); -// }); -// // send zakat fitr handler - -// $('.new_donor').hide(); //hie the feedback div - -// $('form#food_basket_form').on('submit', function (evt) { -// evt.preventDefault(); -// var form_data = $(this).serialize(); -// var id = $("#basket_id_holder_input").val(); -// var food_basket_api = `/services/add_food_basket?id=${id}`; -// console.log(food_basket_api); -// $.ajax({ -// url: food_basket_api, -// type: "POST", -// data: form_data, -// dataType: 'json', -// success: function (response) { -// if (response.status) { -// $('.new_donor').show(); -// $(".new_donor").text(response.msg).addClass('alert alert-success') -// setTimeout(function () { -// $('.new_donor').hide(); -// location.reload(); -// // $('.zakat_modal').modal('hide'); -// }, 3000); -// } else { -// $('.new_donor').show(); -// $(".new_donor").text(response.msg).addClass('alert alert-danger') -// setTimeout(function () { -// $('.new_donor').hide(); -// // location.reload(); -// }, 3000); -// } -// }, -// error: function (err) { -// $('.new_donor').show(); -// $(".new_donor").text(err.msg).addClass('alert alert-danger') -// setTimeout(function () { -// $('.new_donor').hide(); -// // location.reload(); -// }, 3000); -// } -// }); -// }); - - -// $('.material_btn').hide(); -// $('.price_quantity').hide(); - -// $("#donation_type").change(function () { -// if ($(this).val() === 'cash') { -// $('.material_btn').hide(); -// $('.cash_btn').show(); -// $('.price_amount').show(); -// $('.payment_method').show(); -// $('.price_quantity').hide(); - -// } else if ($(this).val() === 'material') { -// $('.material_btn').show(); -// $('.cash_btn').hide(); -// $('.price_amount').hide(); -// $('.payment_method').hide(); -// $('.price_quantity').show(); - -// } else { -// $('.material_btn').show(); -// $('.cash_btn').hide(); -// $('.price_amount').show(); -// $('.payment_method').show(); -// $('.price_quantity').show(); -// } -// }) -// }) - - -$(document).ready(function () { - - // get all food basket in reciving mood - - $.ajax({ - url: '/services/food_basket', - type: 'GET', - dataType: 'json', - processData: false, - success: function (response) { - // console.log(response); - if (response && response.data && response.data.length > 0) { - food_basket = response.data[0].basket; - // console.log(food_basket); - if (response.status) { - food_basket.forEach((element, i) => { - $('.food_basket_row').append(` --- `) - }); - } - else { - $('.food_basket_row').append(`--- ${element.name} -
-- ${element.description ? - - ` -
- تبرع الان - -- -
- ` - : - - '' - } - -- ${element.description} -
- -
-- ${element.date_start} حتى ${element.date_end} -
لايوجد زكاة لعرضها
`) - - } - } - }, - error: function (error) { - $(".zakat_fitr_feedback").text(error.msg).addClass('alert alert-danger') - } - }); - - - var zakat_sacrifices_text = ""; - - $(".food_basket_row").on('click','.food_basket_link', function(){ - console.log("hello"); - var data_id = $(this).data("id") - console.log(data_id); - const targetDiv = $('#' + data_id); - console.log(targetDiv); - if (targetDiv.length > 0) { - const h5Element = targetDiv.find('h5'); - console.log(h5Element); - - if (h5Element.length > 0) { - zakat_sacrifices_text = h5Element.text(); - } - } - }) - - $("#food_basket_form").on("submit", function (event) { - event.preventDefault(); - - var amount = $("#amount").val(); - - var name_op = zakat_sacrifices_text; - - var encodedAmount = encodeURIComponent(amount); - var encodedNameOp = encodeURIComponent(name_op); - - var redirectURL = "/dashboard/payment/paycard?name_op=" + encodedNameOp + "&required_amount=" + encodedAmount; - - window.location.href = redirectURL; - }); - - - - //set the zakat id - $('.food_basket_row').on('click', '.food_basket_link', function () { - $('.food_basket_modal').modal('show'); - $("#basket_id_holder_input").val($(this).data('id')) - console.log($("#basket_id_holder_input").val()); - }); - // send zakat fitr handler - - $('.new_donor').hide(); //hie the feedback div - - $('form#food_basket_form').on('submit', function (evt) { - evt.preventDefault(); - var form_data = $(this).serialize(); - var id = $("#basket_id_holder_input").val(); - var food_basket_api = `/services/add_food_basket?id=${id}`; - console.log(food_basket_api); - $.ajax({ - url: food_basket_api, - type: "POST", - data: form_data, - dataType: 'json', - success: function (response) { - if (response.status) { - $('.new_donor').show(); - $(".new_donor").text(response.msg).addClass('alert alert-success') - setTimeout(function () { - $('.new_donor').hide(); - location.reload(); - // $('.zakat_modal').modal('hide'); - }, 3000); - } else { - $('.new_donor').show(); - $(".new_donor").text(response.msg).addClass('alert alert-danger') - setTimeout(function () { - $('.new_donor').hide(); - // location.reload(); - }, 3000); - } - }, - error: function (err) { - $('.new_donor').show(); - $(".new_donor").text(err.msg).addClass('alert alert-danger') - setTimeout(function () { - $('.new_donor').hide(); - // location.reload(); - }, 3000); - } - }); - }); - - - $('.material_btn').hide(); - $('.price_quantity').hide(); - - $("#donation_type").change(function () { - if ($(this).val() === 'cash') { - $('.material_btn').hide(); - $('.cash_btn').show(); - $('.price_amount').show(); - $('.payment_method').show(); - $('.price_quantity').hide(); - - } else if ($(this).val() === 'material') { - $('.material_btn').show(); - $('.cash_btn').hide(); - $('.price_amount').hide(); - $('.payment_method').hide(); - $('.price_quantity').show(); - - } else { - $('.material_btn').show(); - $('.cash_btn').hide(); - $('.price_amount').show(); - $('.payment_method').show(); - $('.price_quantity').show(); - } - }) -}) \ No newline at end of file diff --git a/odex25_ensan/takaful_portal_benefit/static/js/food_surplus.js b/odex25_ensan/takaful_portal_benefit/static/js/food_surplus.js deleted file mode 100644 index 5602cbf22..000000000 --- a/odex25_ensan/takaful_portal_benefit/static/js/food_surplus.js +++ /dev/null @@ -1,239 +0,0 @@ - -// $(document).ready(function () { - -// // get all food food surplus -// $.ajax({ -// url: '/services/food', -// type: 'GET', -// dataType: 'json', -// processData: false, -// success: function (response) { -// food_surplus = response.data[0].foods; -// console.log(food_surplus); -// if (response.status) { -// food_surplus.forEach((element, i) => { -// $('.food_surplus_row').append(` -//-//-// `) -// }); -// } -// else { -// $('.food_surplus_row').append(`-//-//-// ${element.name} : ${element.name_food} -//
-//-// ${element.description ? - -// ` -//
-// تقديم طلب -// -//- -//
-// ` -// : - -// '' -// } - -//-// ${element.description} -//
- -//
-//-// المستفيدين : ${element.surplus_count} -//
- -//
-//-// الكمية : ${element.quantity} -//
- -//
-//-// ${element.address} -//
- -//
-//-// ${element.date_start} حتى ${element.date_end} -//
لايوجد فائض طعام لعرضها
`) - -// } -// }, -// error: function (error) { -// $(".food_surplus_feedback").text(error.msg).addClass('alert alert-danger') -// } -// }); - - - -// //set the zakat id -// $('.food_surplus_row').on('click', '.food_surplus_link', function () { -// $('.food_surplus_modal').modal('show'); -// $("#food_id").val($(this).data('id')) -// console.log($("#food_id").val()); -// }); -// // send zakat fitr handler - -// $('.new_donor').hide(); //hie the feedback div -// $('form#food_surplus_form').on('submit', function (evt) { -// evt.preventDefault(); -// var form_data = $(this).serialize(); -// var id = $("#surplus_id_holder_input").val(); -// var food_surplus_api = `/services/restaurant/request_food`; -// console.log(food_surplus_api); -// $.ajax({ -// url: food_surplus_api, -// type: "POST", -// data: form_data, -// dataType: 'json', -// success: function (response) { -// if (response.status) { -// $('.new_donor').show(); -// $(".new_donor").text(response.msg).addClass('alert alert-success') -// setTimeout(function () { -// $('.new_donor').hide(); -// // location.reload(); -// $('.food_surplus_modal').modal('hide'); -// }, 3000); -// } else { -// $('.new_donor').show(); -// $(".new_donor").text(response.msg).addClass('alert alert-danger form_error') -// // setTimeout(function () { -// // $('.new_donor').hide(); -// // // location.reload(); -// // }, 3000); -// } -// }, -// error: function (err) { -// $('.new_donor').show(); -// $(".new_donor").text(err.msg).addClass('alert alert-danger server_error') -// // setTimeout(function () { -// // $('.new_donor').hide(); -// // // location.reload(); -// // }, 3000); -// } -// }); -// }); -// }) - - -$(document).ready(function () { - - // get all food food surplus - $.ajax({ - url: '/services/food', - type: 'GET', - dataType: 'json', - processData: false, - success: function (response) { - if (response.data && response.data.length > 0) { - food_surplus = response.data[0].foods; - console.log(food_surplus); - food_surplus.forEach((element, i) => { - $('.food_surplus_row').append(` --- `) - }); - } else { - $('.food_surplus_row').append(`--- ${element.name} : ${element.name_food} -
-- ${element.description ? - - ` -
- تقديم طلب - -- -
- ` - : - - '' - } - -- ${element.description} -
- -
-- المستفيدين : ${element.surplus_count} -
- -
-- الكمية : ${element.quantity} -
- -
-- ${element.address} -
- -
-- ${element.date_start} حتى ${element.date_end} -
لايوجد فائض طعام لعرضها
`); - } - }, - error: function (error) { - $(".food_surplus_feedback").text(error.msg).addClass('alert alert-danger') - } - }); - - - - //set the zakat id - $('.food_surplus_row').on('click', '.food_surplus_link', function () { - $('.food_surplus_modal').modal('show'); - $("#food_id").val($(this).data('id')) - console.log($("#food_id").val()); - }); - // send zakat fitr handler - - $('.new_donor').hide(); //hie the feedback div - $('form#food_surplus_form').on('submit', function (evt) { - evt.preventDefault(); - var form_data = $(this).serialize(); - var id = $("#surplus_id_holder_input").val(); - var food_surplus_api = `/services/restaurant/request_food`; - console.log(food_surplus_api); - $.ajax({ - url: food_surplus_api, - type: "POST", - data: form_data, - dataType: 'json', - success: function (response) { - if (response.status) { - $('.new_donor').show(); - $(".new_donor").text(response.msg).addClass('alert alert-success') - setTimeout(function () { - $('.new_donor').hide(); - // location.reload(); - $('.food_surplus_modal').modal('hide'); - }, 3000); - } else { - $('.new_donor').show(); - $(".new_donor").text(response.msg).addClass('alert alert-danger form_error') - // setTimeout(function () { - // $('.new_donor').hide(); - // // location.reload(); - // }, 3000); - } - }, - error: function (err) { - $('.new_donor').show(); - $(".new_donor").text(err.msg).addClass('alert alert-danger server_error') - // setTimeout(function () { - // $('.new_donor').hide(); - // // location.reload(); - // }, 3000); - } - }); - }); -}) \ No newline at end of file diff --git a/odex25_ensan/takaful_portal_benefit/static/js/home.js b/odex25_ensan/takaful_portal_benefit/static/js/home.js deleted file mode 100644 index 1ec20e340..000000000 --- a/odex25_ensan/takaful_portal_benefit/static/js/home.js +++ /dev/null @@ -1,87 +0,0 @@ -$(document).ready(function () { - $('.main-slider').owlCarousel({ - loop: true, - margin: 0, - nav: true, - dots: true, - rtl: true, - navText: ['', ''], - responsive: { - 0: { - items: 1 - }, - 600: { - items: 1 - }, - 1000: { - items: 1 - } - } - }); - - $('.news-slider').owlCarousel({ - loop: true, - nav: false, - items: 1, - lazyLoad: true, - rtl: true, - nav: true, - center: true, - navText: ['', ''], - responsive: { - 0: { - items: 1, - stagePadding: 60 - }, - 600: { - items: 1, - stagePadding: 100 - }, - 1000: { - items: 1, - stagePadding: 200 - }, - 1200: { - items: 1, - stagePadding: 150 - }, - 1400: { - items: 1, - stagePadding: 300 - }, - 1600: { - items: 1, - stagePadding: 350 - }, - 1800: { - items: 1, - stagePadding: 400 - } - } - }); - - - - $('.parteners-logo-slider').owlCarousel({ - loop: true, - nav: false, - dots: true, - autoplay: true, - items: 1, - margin: 50, - lazyLoad: true, - rtl: true, - center: true, - responsive: { - 0: { - items: 1, - }, - 600: { - items: 3, - }, - 1000: { - items: 6, - }, - } - }); -}); \ No newline at end of file diff --git a/odex25_ensan/takaful_portal_benefit/static/js/jquery-3.2.1.min.js b/odex25_ensan/takaful_portal_benefit/static/js/jquery-3.2.1.min.js deleted file mode 100644 index a755acb9a..000000000 --- a/odex25_ensan/takaful_portal_benefit/static/js/jquery-3.2.1.min.js +++ /dev/null @@ -1,6 +0,0 @@ -// @ts-nocheck -// @ts-ignore -/*! jQuery v3.2.1 | (c) JS Foundation and other contributors | jquery.org/license */ -!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.2.1",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d -1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i 1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i 0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext;function B(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()}var C=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,D=/^.[^:#\[\.,]*$/;function E(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):D.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b 1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(E(this,a||[],!1))},not:function(a){return this.pushStack(E(this,a||[],!0))},is:function(a){return!!E(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var F,G=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,H=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||F,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:G.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),C.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};H.prototype=r.fn,F=r(d);var I=/^(?:parents|prev(?:Until|All))/,J={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a -1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function K(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return K(a,"nextSibling")},prev:function(a){return K(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return B(a,"iframe")?a.contentDocument:(B(a,"template")&&(a=a.content||a),r.merge([],a.childNodes))}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(J[a]||r.uniqueSort(e),I.test(a)&&e.reverse()),this.pushStack(e)}});var L=/[^\x20\t\r\n\f]+/g;function M(a){var b={};return r.each(a.match(L)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?M(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=e||a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h -1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function N(a){return a}function O(a){throw a}function P(a,b,c,d){var e;try{a&&r.isFunction(e=a.promise)?e.call(a).done(b).fail(c):a&&r.isFunction(e=a.then)?e.call(a,b,c):b.apply(void 0,[a].slice(d))}catch(a){c.apply(void 0,[a])}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b =f&&(d!==O&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:N,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:N)),c[2][3].add(g(0,a,r.isFunction(d)?d:O))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(P(a,g.done(h(c)).resolve,g.reject,!b),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)P(e[c],h(c),g.reject);return g.promise()}});var Q=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&Q.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var R=r.Deferred();r.fn.ready=function(a){return R.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||R.resolveWith(d,[r]))}}),r.ready.then=R.then;function S(){d.removeEventListener("DOMContentLoaded",S), -a.removeEventListener("load",S),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",S),a.addEventListener("load",S));var T=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)T(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h1,null,!0)},removeData:function(a){return this.each(function(){X.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=W.get(a,b),c&&(!d||Array.isArray(c)?d=W.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return W.get(a,c)||W.access(a,c,{empty:r.Callbacks("once memory").add(function(){W.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length \x20\t\r\n\f]+)/i,la=/^$|\/(?:java|ecma)script/i,ma={option:[1,""],thead:[1," ","
"],col:[2,""],tr:[2,"
"," ","
"],td:[3,""],_default:[0,"",""]};ma.optgroup=ma.option,ma.tbody=ma.tfoot=ma.colgroup=ma.caption=ma.thead,ma.th=ma.td;function na(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&B(a,b)?r.merge([a],c):c}function oa(a,b){for(var c=0,d=a.length;c
"," -1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=na(l.appendChild(f),"script"),j&&oa(g),c){k=0;while(f=g[k++])la.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var ra=d.documentElement,sa=/^key/,ta=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ua=/^([^.]*)(?:\.(.+)|)/;function va(){return!0}function wa(){return!1}function xa(){try{return d.activeElement}catch(a){}}function ya(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ya(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=wa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(ra,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(L)||[""],j=b.length;while(j--)h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.hasData(a)&&W.get(a);if(q&&(i=q.events)){b=(b||"").match(L)||[""],j=b.length;while(j--)if(h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&W.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(W.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c =1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i \x20\t\r\n\f]*)[^>]*)\/>/gi,Aa=/ - - - - \ No newline at end of file diff --git a/odex25_ensan/takaful_portal_benefit/views/applications_furnatures.xml b/odex25_ensan/takaful_portal_benefit/views/applications_furnatures.xml deleted file mode 100644 index 3564231ca..000000000 --- a/odex25_ensan/takaful_portal_benefit/views/applications_furnatures.xml +++ /dev/null @@ -1,222 +0,0 @@ - - - - \ No newline at end of file diff --git a/odex25_ensan/takaful_portal_benefit/views/assets.xml b/odex25_ensan/takaful_portal_benefit/views/assets.xml deleted file mode 100644 index 4ccb84250..000000000 --- a/odex25_ensan/takaful_portal_benefit/views/assets.xml +++ /dev/null @@ -1,26 +0,0 @@ -الأثاث و الاجهزة -- - - --- - - - ---الأثاث و الاجهزة
------ ---- --- --- --- --- --- --- --- --- --- - تحديد --- --- - تحديد --- --- --- --- --- --- --- --- --- --- --- --- ---
- ---
- ---
- ---
- -- -- - - \ No newline at end of file diff --git a/odex25_ensan/takaful_portal_benefit/views/clubs.xml b/odex25_ensan/takaful_portal_benefit/views/clubs.xml deleted file mode 100644 index 3490ac652..000000000 --- a/odex25_ensan/takaful_portal_benefit/views/clubs.xml +++ /dev/null @@ -1,117 +0,0 @@ -- - - - - - - - - - - - - - - - - - - - - -- - - \ No newline at end of file diff --git a/odex25_ensan/takaful_portal_benefit/views/families_loan.xml b/odex25_ensan/takaful_portal_benefit/views/families_loan.xml deleted file mode 100644 index 0cade72e3..000000000 --- a/odex25_ensan/takaful_portal_benefit/views/families_loan.xml +++ /dev/null @@ -1,97 +0,0 @@ -النوادي -- - - --- - - - ---النوادي
---- --- - - \ No newline at end of file diff --git a/odex25_ensan/takaful_portal_benefit/views/food_basket.xml b/odex25_ensan/takaful_portal_benefit/views/food_basket.xml deleted file mode 100644 index fecf9fc5f..000000000 --- a/odex25_ensan/takaful_portal_benefit/views/food_basket.xml +++ /dev/null @@ -1,107 +0,0 @@ -الاسر المنتجة -- - - --- - - - ---الاسر المنتجة
---- - -- -- - - \ No newline at end of file diff --git a/odex25_ensan/takaful_portal_benefit/views/food_surplus.xml b/odex25_ensan/takaful_portal_benefit/views/food_surplus.xml deleted file mode 100644 index 668fb9098..000000000 --- a/odex25_ensan/takaful_portal_benefit/views/food_surplus.xml +++ /dev/null @@ -1,251 +0,0 @@ -زكاة الاضاحي -- - - --- - - ---زكاة الاضاحي
---- -- -- - - - \ No newline at end of file diff --git a/odex25_ensan/takaful_portal_benefit/views/good_loan.xml b/odex25_ensan/takaful_portal_benefit/views/good_loan.xml deleted file mode 100644 index 4d8e4997e..000000000 --- a/odex25_ensan/takaful_portal_benefit/views/good_loan.xml +++ /dev/null @@ -1,55 +0,0 @@ -فائض الطعام -- - - - - - --- - - ---فائض الطعام
-- --أضف فائض طعام - -
أضف مطعم -
- - --فائض الطعام -- - - --- - - ---فائض الطعام
---- -- -- - - \ No newline at end of file diff --git a/odex25_ensan/takaful_portal_benefit/views/profile.xml b/odex25_ensan/takaful_portal_benefit/views/profile.xml deleted file mode 100644 index 2162f549b..000000000 --- a/odex25_ensan/takaful_portal_benefit/views/profile.xml +++ /dev/null @@ -1,724 +0,0 @@ -القرض الحسن -- - - -----القرض الحسن
------ ---- --- --- --- --- --- --- - -- -- --- - - \ No newline at end of file diff --git a/odex25_ensan/takaful_portal_benefit/views/urgent_needs.xml b/odex25_ensan/takaful_portal_benefit/views/urgent_needs.xml deleted file mode 100644 index f27e8aa43..000000000 --- a/odex25_ensan/takaful_portal_benefit/views/urgent_needs.xml +++ /dev/null @@ -1,86 +0,0 @@ -الملف الشخصي -- - - --- - - - - - ---الملف الشخصي
- - ------ - تعديل --- ---- --- --- --- --- --- ---- -- ----- - --- - --- --- --- --- --- --- --- --- - --- --- ---- ----- - تعديل --- ---- --- --- --- --- --- --- --- --- --- --- --- --- ----- -- - تعديل ----- --- - ---
- -- -- - ---
- --- --أضف معال جديد -
- -- -
-- - - - -الرقم -اسم المعال -الجنس -العلاقة -تاريخ الميلاد -رقم الهوية -ملف اثبات الهوية -حذف ---- -- -
-- - - - - -الاسم -القيمة -الحالة -التاريخ -- -- -أضف مصروف جديد -
- -- -
-- - - - -الرقم -الاسم -المصروفات -نوع الرسوم -المبلغ -الدواء -المرض -المواصلات -الدين -سبب الدين -شرح الجائحة -الحالة -المرفقات -- - - \ No newline at end of file diff --git a/odex25_ensan/takaful_portal_benefit/views/zakat.xml b/odex25_ensan/takaful_portal_benefit/views/zakat.xml deleted file mode 100644 index 9b4f003c5..000000000 --- a/odex25_ensan/takaful_portal_benefit/views/zakat.xml +++ /dev/null @@ -1,154 +0,0 @@ -الاحتياجات الطارئة -- - - --- - ---الاحتياجات الطارئة
------ - ---- - --- - --- - --- --- --- --- - ---
- --- --- --- - - \ No newline at end of file diff --git a/odex25_ensan/takaful_portal_sponsor/__init__.py b/odex25_ensan/takaful_portal_sponsor/__init__.py deleted file mode 100644 index 457bae27e..000000000 --- a/odex25_ensan/takaful_portal_sponsor/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -# -*- coding: utf-8 -*- - -from . import controllers \ No newline at end of file diff --git a/odex25_ensan/takaful_portal_sponsor/__manifest__.py b/odex25_ensan/takaful_portal_sponsor/__manifest__.py deleted file mode 100644 index ccdbd961a..000000000 --- a/odex25_ensan/takaful_portal_sponsor/__manifest__.py +++ /dev/null @@ -1,37 +0,0 @@ -# -*- coding: utf-8 -*- -{ - 'name': "Takaful Sponsor Portal", - - 'summary': """ - Web portal fo takafaul sponsor """, - - 'description': """ - Long description of module's purpose - """, - - 'author': "Expert Ltd.", - 'website': "https://www.exp-sa.com", - 'category': 'Odex25-Takaful/Odex25-Takaful', - 'version': '0.1', - - # any module necessary for this one to work correctly - 'depends': ['base','website'], - - # always loaded - 'data': [ - 'views/kafel_header.xml', - 'views/kafel.xml', - 'views/makfoul_details.xml', - 'views/need_kafala_details.xml', - 'views/financial_record.xml', - 'views/notifications.xml', - 'views/notifications_settings.xml', - 'views/certificates_settings.xml', - 'views/profile.xml', - 'views/assets.xml', - ], - # only loaded in demonstration mode - 'installable': True, - 'auto_install': False, - 'application': True, -} \ No newline at end of file diff --git a/odex25_ensan/takaful_portal_sponsor/controllers/__init__.py b/odex25_ensan/takaful_portal_sponsor/controllers/__init__.py deleted file mode 100644 index 457bae27e..000000000 --- a/odex25_ensan/takaful_portal_sponsor/controllers/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -# -*- coding: utf-8 -*- - -from . import controllers \ No newline at end of file diff --git a/odex25_ensan/takaful_portal_sponsor/controllers/controllers.py b/odex25_ensan/takaful_portal_sponsor/controllers/controllers.py deleted file mode 100644 index dcc45b57f..000000000 --- a/odex25_ensan/takaful_portal_sponsor/controllers/controllers.py +++ /dev/null @@ -1,88 +0,0 @@ -# -*- coding: utf-8 -*- -from odoo import http -import json -import requests -# from odoo.addons.takaful_rest_api.controllers.sponsor_web_controller import ControllerPortalREST - -class TakafulSponsorPortal(http.Controller): - - # kafel routes - @http.route('/guarantees', type='http', auth='public', website=True) - def my_guarantees(self, page=1, **kw): - return http.request.render("takaful_portal_sponsor.my_guarantees") - - @http.route('/sadad', type='http', auth='public', website=True) - def sadad(self, **kw): - return http.request.render("takaful_portal_sponsor.sadad") - - @http.route('/need_kafala', type='http', auth='public', website=True) - def need_kafala(self, **kw): - return http.request.render("takaful_portal_sponsor.need_kafala") - - @http.route('/orphan_needs', type='http', auth='public', website=True) - def orphan_needs(self, **kw): - return http.request.render("takaful_portal_sponsor.orphan_needs") - - @http.route('/kafala_gift', type='http', auth='public', website=True) - def kafala_gift(self, **kw): - return http.request.render("takaful_portal_sponsor.kafala_gift") - - @http.route('/general_needs', type='http', auth='public', website=True) - def general_needs(self, **kw): - return http.request.render("takaful_portal_sponsor.general_needs") - - @http.route('/cancel_kafala', type='http', auth='public', website=True) - def cancel_kafala(self, **kw): - return http.request.render("takaful_portal_sponsor.cancel_kafala") - - @http.route('/makfoul_details', type='http', auth='public', website=True) - def my_page(self, **kwargs): - my_id = kwargs.get('benefit_type', 'default_value') - user_type = kwargs.get('benefit_id', 'default_value') - return http.request.render('takaful_portal_sponsor.makfoul_details', { - 'my_id': my_id, - 'user_type': user_type, - }) - - @http.route('/need_kafala_details', type='http', auth='public', website=True) - def need_kafala_details(self, **kwargs): - my_id = kwargs.get('benefit_type', 'default_value') - user_type = kwargs.get('benefit_id', 'default_value') - return http.request.render('takaful_portal_sponsor.need_kafala_details', { - 'my_id': my_id, - 'user_type': user_type, - }) - - @http.route('/paied_record', type='http', auth='public', website=True) - def paied_record(self, **kw): - return http.request.render("takaful_portal_sponsor.paied_record") - - @http.route('/delayed_record', type='http', auth='public', website=True) - def delayed_record(self, **kw): - return http.request.render("takaful_portal_sponsor.delayed_record") - - @http.route('/notifications', type='http', auth='public', website=True) - def get_notifications(self, **kwargs): - is_read = kwargs.get('is_read', 'default_value') - return http.request.render('takaful_portal_sponsor.all_notifications', { - 'is_read': is_read - }) - - @http.route('/notifications_details', type='http', auth='public', website=True) - def notifications_details(self, **kwargs): - notify_id = kwargs.get('id', 'default_value') - return http.request.render('takaful_portal_sponsor.notifications_details', { - 'id': notify_id - }) - - @http.route('/certificates_settings', type='http', auth='public', website=True) - def certificates_settings(self, **kw): - return http.request.render("takaful_portal_sponsor.certificates_settings") - - @http.route('/notifications_settings', type='http', auth='public', website=True) - def notifications_settings(self, **kw): - return http.request.render("takaful_portal_sponsor.notifications_settings") - - @http.route('/sponsor_profile', type='http', auth='public', website=True) - def sponsor_profile(self, **kw): - return http.request.render("takaful_portal_sponsor.sponsor_profile") diff --git a/odex25_ensan/takaful_portal_sponsor/static/css/main.css b/odex25_ensan/takaful_portal_sponsor/static/css/main.css deleted file mode 100644 index dd22d790d..000000000 --- a/odex25_ensan/takaful_portal_sponsor/static/css/main.css +++ /dev/null @@ -1,114 +0,0 @@ -.attach_img { - width: 100%; - display: flex; - align-items: center; - justify-content: center; - position: relative; - margin-bottom: 40px; -} -.attach_img #user_profile_img { - width: 112px; - height: 112px; -} -.attach_img .wraper { - position: absolute; - width: 130px; - right: 45%; - transform: translate(95%, -50%); - top: 50%; -} -.attach_img .wraper input { - position: absolute; - width: 100%; - height: 100%; - opacity: 0; - z-index: 10; -} -.attach_img .wraper .img_upload { - display: flex; - align-items: center; - justify-content: center; - flex-direction: row-reverse; -} - -.input-group-text { - z-index: 10; -} - -/* kafalaty */ -#benefits-type, -#benefit-type { - background: transparent; - border: none; - outline: none !important; - color: #355692; -} - -#sponsorship_cancelation .modal-body p { - font-weight: 600; - font-size: 18px; - margin-bottom: 24px; -} -@media (max-width: 575px) { - #sponsorship_cancelation .modal-body p { - font-size: 15px; - } -} -#sponsorship_cancelation .modal-footer { - display: flex; - align-items: center; - gap: 18px; -} -#sponsorship_cancelation .modal-footer .btn-outline-danger { - margin: 0 !important; - background-color: transparent !important; - border: 1px solid #DC3A08 !important; - color: #DC3A08 !important; -} - -.success_res, -.error_res { - display: none; -} - -.notification_wrapper { - font-family: "Changa-Regular"; -} - -/* Hide the default dropdown arrow */ -select#benefit_ids { - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - padding-right: 25px; - /* Add space for the custom arrow */ - background: transparent; - border: 1px solid #ccc; - border-radius: 4px; - font-size: 14px; - line-height: 1.5; - padding: 8px; - width: 200px; -} - -/* Custom dropdown arrow */ -select#benefit_ids::after { - content: ""; - width: 0; - height: 0; - border-style: solid; - border-width: 6px 5px 0 5px; - border-color: #999 transparent transparent transparent; - position: absolute; - right: 10px; - top: 50%; - transform: translateY(-50%); - pointer-events: none; -} - -/* Style when the select element is focused */ -select#benefit_ids:focus { - outline: none; - border-color: #999; - box-shadow: 0 0 0 1px #999; -}/*# sourceMappingURL=main.css.map */ \ No newline at end of file diff --git a/odex25_ensan/takaful_portal_sponsor/static/css/main.css.map b/odex25_ensan/takaful_portal_sponsor/static/css/main.css.map deleted file mode 100644 index 7089d74b9..000000000 --- a/odex25_ensan/takaful_portal_sponsor/static/css/main.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["main.scss","main.css"],"names":[],"mappings":"AAQA;EACI,WAAA;EACA,aAAA;EACA,mBAAA;EACA,uBAAA;EACA,kBAAA;EACA,mBAAA;ACPJ;ADSI;EACI,YAAA;EACA,aAAA;ACPR;ADUI;EACI,kBAAA;EACA,YAAA;EACA,UAAA;EACA,+BAAA;EACA,QAAA;ACRR;ADUQ;EACI,kBAAA;EACA,WAAA;EACA,YAAA;EACA,UAAA;EACA,WAAA;ACRZ;ADYQ;EACI,aAAA;EACA,mBAAA;EACA,uBAAA;EACA,2BAAA;ACVZ;;ADeA;EACI,WAAA;ACZJ;;ADkBA,aAAA;AAEA;;EAEI,uBAAA;EACA,YAAA;EACA,wBAAA;EACA,cAxDQ;ACwCZ;;ADuBQ;EACI,gBAAA;EACA,eAAA;EACA,mBAAA;ACpBZ;ADsBY;EALJ;IAMQ,eAAA;ECnBd;AACF;ADuBI;EACI,aAAA;EACA,mBAAA;EACA,SAAA;ACrBR;ADuBQ;EACI,oBAAA;EACA,wCAAA;EACA,oCAAA;EACA,yBAAA;ACrBZ;;AD0BA;;EAEI,aAAA;ACvBJ;;AD0BA;EACI,6BAlGE;AC2EN;;AD4BA,oCAAA;AACA;EACI,wBAAA;EACA,qBAAA;EACA,gBAAA;EACA,mBAAA;EACA,mCAAA;EACA,uBAAA;EACA,sBAAA;EACA,kBAAA;EACA,eAAA;EACA,gBAAA;EACA,YAAA;EACA,YAAA;ACzBJ;;AD4BA,0BAAA;AACA;EACI,WAAA;EACA,QAAA;EACA,SAAA;EACA,mBAAA;EACA,2BAAA;EACA,sDAAA;EACA,kBAAA;EACA,WAAA;EACA,QAAA;EACA,2BAAA;EACA,oBAAA;ACzBJ;;AD4BA,6CAAA;AACA;EACI,aAAA;EACA,kBAAA;EACA,0BAAA;ACzBJ","file":"main.css"} \ No newline at end of file diff --git a/odex25_ensan/takaful_portal_sponsor/static/css/main.scss b/odex25_ensan/takaful_portal_sponsor/static/css/main.scss deleted file mode 100644 index 496af686c..000000000 --- a/odex25_ensan/takaful_portal_sponsor/static/css/main.scss +++ /dev/null @@ -1,140 +0,0 @@ -$reg: "Changa-Regular"; -$medium: "Changa-Medium"; -$semiBold: "Changa-SemiBold"; -$bold: "Changa-Bold"; -$mainColor: #355692; -$darkBlue: #091C3F; - - -.attach_img { - width: 100%; - display: flex; - align-items: center; - justify-content: center; - position: relative; - margin-bottom: 40px; - - #user_profile_img { - width: 112px; - height: 112px; - } - - .wraper { - position: absolute; - width: 130px; - right: 45%; - transform: translate(95%, -50%); - top: 50%; - - input { - position: absolute; - width: 100%; - height: 100%; - opacity: 0; - z-index: 10; - - } - - .img_upload { - display: flex; - align-items: center; - justify-content: center; - flex-direction: row-reverse; - } - } -} - -.input-group-text { - z-index: 10; -} - - - - -/* kafalaty */ - -#benefits-type, -#benefit-type { - background: transparent; - border: none; - outline: none !important; - color: $mainColor; -} - -//cancel kafala modal - -#sponsorship_cancelation { - .modal-body { - p { - font-weight: 600; - font-size: 18px; - margin-bottom: 24px; - - @media(max-width:575px) { - font-size: 15px; - } - } - } - - .modal-footer { - display: flex; - align-items: center; - gap: 18px; - - .btn-outline-danger { - margin: 0 !important; - background-color: transparent !important; - border: 1px solid #DC3A08 !important; - color: #DC3A08 !important; - } - } -} - -.success_res, -.error_res { - display: none; -} - -.notification_wrapper { - font-family: $reg; -} - -#benefit_ids {} - -/* Hide the default dropdown arrow */ -select#benefit_ids { - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - padding-right: 25px; - /* Add space for the custom arrow */ - background: transparent; - border: 1px solid #ccc; - border-radius: 4px; - font-size: 14px; - line-height: 1.5; - padding: 8px; - width: 200px; -} - -/* Custom dropdown arrow */ -select#benefit_ids::after { - content: ''; - width: 0; - height: 0; - border-style: solid; - border-width: 6px 5px 0 5px; - border-color: #999 transparent transparent transparent; - position: absolute; - right: 10px; - top: 50%; - transform: translateY(-50%); - pointer-events: none; -} - -/* Style when the select element is focused */ -select#benefit_ids:focus { - outline: none; - border-color: #999; - box-shadow: 0 0 0 1px #999; -} \ No newline at end of file diff --git a/odex25_ensan/takaful_portal_sponsor/static/css/notifications.css b/odex25_ensan/takaful_portal_sponsor/static/css/notifications.css deleted file mode 100644 index b5e1e879e..000000000 --- a/odex25_ensan/takaful_portal_sponsor/static/css/notifications.css +++ /dev/null @@ -1,32 +0,0 @@ -.noti_content { - margin-bottom: 24px; -} - -.single_notification .dropdown { - width: -moz-fit-content; - width: fit-content; - position: absolute; - top: 16px; - left: 16px; -} -.single_notification .dropdown .dropdown-toggle { - border: none; - background: transparent; - outline: none; - margin: 0; -} -.single_notification .dropdown .dropdown-menu .delete_noti { - display: block; - text-align: center; - margin: 0; - padding: 4px 12px; - color: #f00; - text-align: center; - font-weight: bold; -} - -.certificate_setting_feedback, .notifications_update_feedback { - display: none; - font-weight: bold; - text-align: center; -}/*# sourceMappingURL=notifications.css.map */ \ No newline at end of file diff --git a/odex25_ensan/takaful_portal_sponsor/static/css/notifications.css.map b/odex25_ensan/takaful_portal_sponsor/static/css/notifications.css.map deleted file mode 100644 index 7ce4cd4d2..000000000 --- a/odex25_ensan/takaful_portal_sponsor/static/css/notifications.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["notifications.scss","notifications.css"],"names":[],"mappings":"AAAA;EACI,mBAAA;ACCJ;;ADGI;EACI,uBAAA;EAAA,kBAAA;EACA,kBAAA;EACA,SAAA;EACA,UAAA;ACAR;ADCQ;EACI,YAAA;EACA,uBAAA;EACA,aAAA;EACA,SAAA;ACCZ;ADEY;EACI,cAAA;EACA,kBAAA;EACA,SAAA;EACA,iBAAA;EACA,WAAA;EACA,kBAAA;EACA,iBAAA;ACAhB;;ADMA;EACI,aAAA;EACA,iBAAA;EACA,kBAAA;ACHJ","file":"notifications.css"} \ No newline at end of file diff --git a/odex25_ensan/takaful_portal_sponsor/static/css/notifications.scss b/odex25_ensan/takaful_portal_sponsor/static/css/notifications.scss deleted file mode 100644 index f758f28e9..000000000 --- a/odex25_ensan/takaful_portal_sponsor/static/css/notifications.scss +++ /dev/null @@ -1,35 +0,0 @@ -.noti_content { - margin-bottom: 24px; -} - -.single_notification { - .dropdown { - width: fit-content; - position: absolute; - top: 16px; - left: 16px; - .dropdown-toggle{ - border: none; - background: transparent; - outline: none; - margin: 0; - } - .dropdown-menu{ - .delete_noti{ - display: block; - text-align: center; - margin: 0; - padding: 4px 12px; - color: #f00; - text-align: center; - font-weight: bold; - } - } - } -} - -.certificate_setting_feedback, .notifications_update_feedback{ - display: none; - font-weight: bold; - text-align: center; -} \ No newline at end of file diff --git a/odex25_ensan/takaful_portal_sponsor/static/css/select2.min.css b/odex25_ensan/takaful_portal_sponsor/static/css/select2.min.css deleted file mode 100644 index 7c18ad59d..000000000 --- a/odex25_ensan/takaful_portal_sponsor/static/css/select2.min.css +++ /dev/null @@ -1 +0,0 @@ -.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:white;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-hidden-accessible{border:0 !important;clip:rect(0 0 0 0) !important;-webkit-clip-path:inset(50%) !important;clip-path:inset(50%) !important;height:1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important;white-space:nowrap !important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-top:5px;margin-right:10px;padding:1px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline{float:right}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid black 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:white}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top, #fff 50%, #eee 100%);background-image:-o-linear-gradient(top, #fff 50%, #eee 100%);background-image:linear-gradient(to bottom, #fff 50%, #eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top, #eee 50%, #ccc 100%);background-image:-o-linear-gradient(top, #eee 50%, #ccc 100%);background-image:linear-gradient(to bottom, #eee 50%, #ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top, #fff 0%, #eee 50%);background-image:-o-linear-gradient(top, #fff 0%, #eee 50%);background-image:linear-gradient(to bottom, #fff 0%, #eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top, #eee 50%, #fff 100%);background-image:-o-linear-gradient(top, #eee 50%, #fff 100%);background-image:linear-gradient(to bottom, #eee 50%, #fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{float:right;margin-left:5px;margin-right:auto}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb} diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/1-172.png b/odex25_ensan/takaful_portal_sponsor/static/img/1-172.png deleted file mode 100644 index 54ebdfad7..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/1-172.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/Ellipse 1376.png b/odex25_ensan/takaful_portal_sponsor/static/img/Ellipse 1376.png deleted file mode 100644 index 7f926ce7f..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/Ellipse 1376.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/Group 18199.png b/odex25_ensan/takaful_portal_sponsor/static/img/Group 18199.png deleted file mode 100644 index 6ad019681..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/Group 18199.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/Group 18200.png b/odex25_ensan/takaful_portal_sponsor/static/img/Group 18200.png deleted file mode 100644 index 3e75f468f..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/Group 18200.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/Group 18201.png b/odex25_ensan/takaful_portal_sponsor/static/img/Group 18201.png deleted file mode 100644 index 04edf0c5b..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/Group 18201.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/Group 18202.png b/odex25_ensan/takaful_portal_sponsor/static/img/Group 18202.png deleted file mode 100644 index 18c4055cf..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/Group 18202.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/Group 18203.png b/odex25_ensan/takaful_portal_sponsor/static/img/Group 18203.png deleted file mode 100644 index 275404f68..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/Group 18203.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/Gurantees/cancel.png b/odex25_ensan/takaful_portal_sponsor/static/img/Gurantees/cancel.png deleted file mode 100644 index e8fe40a39..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/Gurantees/cancel.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/Gurantees/cash1.png b/odex25_ensan/takaful_portal_sponsor/static/img/Gurantees/cash1.png deleted file mode 100644 index c9c586a45..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/Gurantees/cash1.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/Gurantees/cashback.png b/odex25_ensan/takaful_portal_sponsor/static/img/Gurantees/cashback.png deleted file mode 100644 index 865d142ec..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/Gurantees/cashback.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/Gurantees/gift.png b/odex25_ensan/takaful_portal_sponsor/static/img/Gurantees/gift.png deleted file mode 100644 index c4d4f51c4..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/Gurantees/gift.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/Gurantees/kafala_gama3ya.png b/odex25_ensan/takaful_portal_sponsor/static/img/Gurantees/kafala_gama3ya.png deleted file mode 100644 index bb8d87e84..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/Gurantees/kafala_gama3ya.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/Gurantees/kafalaty.png b/odex25_ensan/takaful_portal_sponsor/static/img/Gurantees/kafalaty.png deleted file mode 100644 index 6ce00db0b..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/Gurantees/kafalaty.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/Gurantees/trend.png b/odex25_ensan/takaful_portal_sponsor/static/img/Gurantees/trend.png deleted file mode 100644 index 53a9f8051..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/Gurantees/trend.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/Gurantees/yateem.png b/odex25_ensan/takaful_portal_sponsor/static/img/Gurantees/yateem.png deleted file mode 100644 index 8b55181de..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/Gurantees/yateem.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/Icon awesome-plus.png b/odex25_ensan/takaful_portal_sponsor/static/img/Icon awesome-plus.png deleted file mode 100644 index 647557373..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/Icon awesome-plus.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/Icon material-notifications-active.png b/odex25_ensan/takaful_portal_sponsor/static/img/Icon material-notifications-active.png deleted file mode 100644 index ab3530031..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/Icon material-notifications-active.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/Rectangle 4056.png b/odex25_ensan/takaful_portal_sponsor/static/img/Rectangle 4056.png deleted file mode 100644 index 898e01072..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/Rectangle 4056.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/Rectangle 4061.png b/odex25_ensan/takaful_portal_sponsor/static/img/Rectangle 4061.png deleted file mode 100644 index 7d1f41de4..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/Rectangle 4061.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/XMLID_1571_.png b/odex25_ensan/takaful_portal_sponsor/static/img/XMLID_1571_.png deleted file mode 100644 index e75f110c7..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/XMLID_1571_.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/XMLID_857_.png b/odex25_ensan/takaful_portal_sponsor/static/img/XMLID_857_.png deleted file mode 100644 index 2d293488a..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/XMLID_857_.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/arrow_down.png b/odex25_ensan/takaful_portal_sponsor/static/img/arrow_down.png deleted file mode 100644 index 5da163c77..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/arrow_down.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/arrow_left.png b/odex25_ensan/takaful_portal_sponsor/static/img/arrow_left.png deleted file mode 100644 index 9d35d8e91..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/arrow_left.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/arrow_right.png b/odex25_ensan/takaful_portal_sponsor/static/img/arrow_right.png deleted file mode 100644 index f2869ec29..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/arrow_right.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/attach_img.png b/odex25_ensan/takaful_portal_sponsor/static/img/attach_img.png deleted file mode 100644 index a05ae94ae..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/attach_img.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/attatch.png b/odex25_ensan/takaful_portal_sponsor/static/img/attatch.png deleted file mode 100644 index 71951ce2f..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/attatch.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/avatar.png b/odex25_ensan/takaful_portal_sponsor/static/img/avatar.png deleted file mode 100644 index c1c9445fd..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/avatar.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/banner.png b/odex25_ensan/takaful_portal_sponsor/static/img/banner.png deleted file mode 100644 index dad69e67c..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/banner.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/bread_arrow.png b/odex25_ensan/takaful_portal_sponsor/static/img/bread_arrow.png deleted file mode 100644 index 68cd6e538..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/bread_arrow.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/close.png b/odex25_ensan/takaful_portal_sponsor/static/img/close.png deleted file mode 100644 index 21924878c..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/close.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/credit.png b/odex25_ensan/takaful_portal_sponsor/static/img/credit.png deleted file mode 100644 index 0c59d55a6..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/credit.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/document.png b/odex25_ensan/takaful_portal_sponsor/static/img/document.png deleted file mode 100644 index 7ab336f93..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/document.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/dropdown.png b/odex25_ensan/takaful_portal_sponsor/static/img/dropdown.png deleted file mode 100644 index 369963467..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/dropdown.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/employee.png b/odex25_ensan/takaful_portal_sponsor/static/img/employee.png deleted file mode 100644 index 3e75f468f..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/employee.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/file.png b/odex25_ensan/takaful_portal_sponsor/static/img/file.png deleted file mode 100644 index 73fd1de12..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/file.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/footer-logo.png b/odex25_ensan/takaful_portal_sponsor/static/img/footer-logo.png deleted file mode 100644 index dced3506f..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/footer-logo.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/gift_1.png b/odex25_ensan/takaful_portal_sponsor/static/img/gift_1.png deleted file mode 100644 index 4fceaebad..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/gift_1.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/helping.png b/odex25_ensan/takaful_portal_sponsor/static/img/helping.png deleted file mode 100644 index 4b079f085..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/helping.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/late_payments.png b/odex25_ensan/takaful_portal_sponsor/static/img/late_payments.png deleted file mode 100644 index f49bd1a95..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/late_payments.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/logged_user.png b/odex25_ensan/takaful_portal_sponsor/static/img/logged_user.png deleted file mode 100644 index 7f926ce7f..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/logged_user.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/logo.png b/odex25_ensan/takaful_portal_sponsor/static/img/logo.png deleted file mode 100644 index 0a465cc11..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/logo.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/logout-svgrepo-com.png b/odex25_ensan/takaful_portal_sponsor/static/img/logout-svgrepo-com.png deleted file mode 100644 index 5ab571cd9..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/logout-svgrepo-com.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/mastercard.png b/odex25_ensan/takaful_portal_sponsor/static/img/mastercard.png deleted file mode 100644 index 59fe75cfd..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/mastercard.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/member.png b/odex25_ensan/takaful_portal_sponsor/static/img/member.png deleted file mode 100644 index 04edf0c5b..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/member.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/money-report-svgrepo-com.png b/odex25_ensan/takaful_portal_sponsor/static/img/money-report-svgrepo-com.png deleted file mode 100644 index 0e326fbaa..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/money-report-svgrepo-com.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/money.png b/odex25_ensan/takaful_portal_sponsor/static/img/money.png deleted file mode 100644 index 9b7c239ea..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/money.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/needs.png b/odex25_ensan/takaful_portal_sponsor/static/img/needs.png deleted file mode 100644 index cef88b5e4..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/needs.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/next.png b/odex25_ensan/takaful_portal_sponsor/static/img/next.png deleted file mode 100644 index ce6d4a802..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/next.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/noti_options.png b/odex25_ensan/takaful_portal_sponsor/static/img/noti_options.png deleted file mode 100644 index 90a17b79d..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/noti_options.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/payments.png b/odex25_ensan/takaful_portal_sponsor/static/img/payments.png deleted file mode 100644 index 5cb5ec3c1..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/payments.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/paypal.png b/odex25_ensan/takaful_portal_sponsor/static/img/paypal.png deleted file mode 100644 index 916b4c989..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/paypal.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/prev.png b/odex25_ensan/takaful_portal_sponsor/static/img/prev.png deleted file mode 100644 index 643d0ca2b..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/prev.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/red_cancel.png b/odex25_ensan/takaful_portal_sponsor/static/img/red_cancel.png deleted file mode 100644 index 72de171ed..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/red_cancel.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/resturant_owner.png b/odex25_ensan/takaful_portal_sponsor/static/img/resturant_owner.png deleted file mode 100644 index 18c4055cf..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/resturant_owner.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/search.png b/odex25_ensan/takaful_portal_sponsor/static/img/search.png deleted file mode 100644 index ac446e22e..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/search.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/separator.png b/odex25_ensan/takaful_portal_sponsor/static/img/separator.png deleted file mode 100644 index 9a1ccdc8e..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/separator.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/service-1.png b/odex25_ensan/takaful_portal_sponsor/static/img/service-1.png deleted file mode 100644 index 54ebdfad7..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/service-1.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/settings-svgrepo-com.png b/odex25_ensan/takaful_portal_sponsor/static/img/settings-svgrepo-com.png deleted file mode 100644 index fddabdfef..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/settings-svgrepo-com.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/shopping-cart.png b/odex25_ensan/takaful_portal_sponsor/static/img/shopping-cart.png deleted file mode 100644 index e279a9bc2..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/shopping-cart.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/step_1_act.png b/odex25_ensan/takaful_portal_sponsor/static/img/step_1_act.png deleted file mode 100644 index b03d33c59..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/step_1_act.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/step_2_act.png b/odex25_ensan/takaful_portal_sponsor/static/img/step_2_act.png deleted file mode 100644 index a242e2004..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/step_2_act.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/step_2_inact.png b/odex25_ensan/takaful_portal_sponsor/static/img/step_2_inact.png deleted file mode 100644 index 716489bef..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/step_2_inact.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/step_3_act.png b/odex25_ensan/takaful_portal_sponsor/static/img/step_3_act.png deleted file mode 100644 index 762abcb4d..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/step_3_act.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/step_3_inact.png b/odex25_ensan/takaful_portal_sponsor/static/img/step_3_inact.png deleted file mode 100644 index a54fc3bfb..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/step_3_inact.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/step_4_act.png b/odex25_ensan/takaful_portal_sponsor/static/img/step_4_act.png deleted file mode 100644 index 28bbb2213..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/step_4_act.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/step_4_inact.png b/odex25_ensan/takaful_portal_sponsor/static/img/step_4_inact.png deleted file mode 100644 index a8d7631df..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/step_4_inact.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/step_5_inact.png b/odex25_ensan/takaful_portal_sponsor/static/img/step_5_inact.png deleted file mode 100644 index a1fce35db..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/step_5_inact.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/trash.png b/odex25_ensan/takaful_portal_sponsor/static/img/trash.png deleted file mode 100644 index 26c7d9a0c..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/trash.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/user.png b/odex25_ensan/takaful_portal_sponsor/static/img/user.png deleted file mode 100644 index e33d11ed6..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/user.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/visa.png b/odex25_ensan/takaful_portal_sponsor/static/img/visa.png deleted file mode 100644 index e8e92c426..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/visa.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/img/volanteere.png b/odex25_ensan/takaful_portal_sponsor/static/img/volanteere.png deleted file mode 100644 index cb6e36b95..000000000 Binary files a/odex25_ensan/takaful_portal_sponsor/static/img/volanteere.png and /dev/null differ diff --git a/odex25_ensan/takaful_portal_sponsor/static/js/certification_settings.js b/odex25_ensan/takaful_portal_sponsor/static/js/certification_settings.js deleted file mode 100644 index 79e0c4f2f..000000000 --- a/odex25_ensan/takaful_portal_sponsor/static/js/certification_settings.js +++ /dev/null @@ -1,61 +0,0 @@ -$(document).ready(function () { - $.ajax({ - url: '/portal/sponsor/certificate_setting', - type: 'GET', - dataType: 'json', - processData: false, - success: function (data) { - settings = data.certificate_setting; - console.log(settings); - if (data.status) { - $('input[name="name_in_certificate"]').prop('checked', settings.name_in_certificate); - $('input[name="type_in_certificate"]').prop('checked', settings.type_in_certificate); - $('input[name="duration_in_certificate"]').prop('checked', settings.duration_in_certificate); - $(".certificate_setting_feedback").text(settings.msg).addClass('alert alert-success') - } - else { - $(".certificate_setting_feedback").text(data.msg).addClass('alert alert-danger') - } - }, - error: function (error) { - $(".certificate_setting_feedback").text(error.msg).addClass('alert alert-danger') - } - }); - - var settings_data = {} - - // Add event listener to input fields to detect changes - $('input[type="checkbox"]').change(function () { - settings_data = { - name_in_certificate: $('input[name="name_in_certificate"]').prop('checked'), - type_in_certificate: $('input[name="type_in_certificate"]').prop('checked'), - duration_in_certificate: $('input[name="duration_in_certificate"]').prop('checked'), - } - }); - - // Add event listener to save button to trigger AJAX request - $('#certificate_settings_form').on("submit", (e) => { - e.preventDefault(); - $.ajax({ - url: '/portal/sponsor/certificate_setting/update', - type: 'POST', - data: settings_data, - dataType: 'json', - success: function (response) { - if (response.status) { - console.log(response); - $(".certificate_setting_feedback").show() - $(".certificate_setting_feedback").text(response.msg) - } else { - $(".certificate_setting_feedback").show() - $(".certificate_setting_feedback").text(response.msg) - } - }, - error: function (error) { - $(".certificate_setting_feedback").show() - $(".certificate_setting_feedback").text(error.msg) - } - }); - - }); -}) \ No newline at end of file diff --git a/odex25_ensan/takaful_portal_sponsor/static/js/create_group_sponsorships.js b/odex25_ensan/takaful_portal_sponsor/static/js/create_group_sponsorships.js deleted file mode 100644 index f0e09ff6c..000000000 --- a/odex25_ensan/takaful_portal_sponsor/static/js/create_group_sponsorships.js +++ /dev/null @@ -1,46 +0,0 @@ -$(document).ready(function () { - - let sponsorships_group_api = "/portal/sponsor/sponsorships/create/"; - $('form#group_sponsorship').on('submit', function (evt) { - evt.preventDefault(); - var formData = new FormData(this); - var selectedValues = $('#benefit_ids').val() || []; - var selectedValuesJSON = JSON.stringify(selectedValues); - formData.append('benefit_ids', selectedValuesJSON); - console.log(formData); - $.ajax({ - type: "POST", - url: sponsorships_group_api, - data: formData, - processData: false, - contentType: false, - dataType: 'json', - success: function (response) { - console.log(response); - if (response.status === true) { - $('.sponsorship_creation_feedback').show(); - $('.sponsorship_creation_feedback').html(`زكاة الفطر -- - - --- - - ---زكاة المال
---- -- -${response.msg}
`); - setTimeout(function () { - $('.sponsorship_creation_feedback').hide(); - location.reload(); - }, 3000); - } else { - $('.sponsorship_creation_feedback').show(); - $('.sponsorship_creation_feedback').html(`${response.msg}
`); - // setTimeout(function () { - // $('.sponsorship_creation_feedback').hide(); - // // location.reload(); - // }, 3000); - } - }, - error: function (err) { - $('.sponsorship_creation_feedback').show(); - $('.sponsorship_creation_feedback').html(`${err.msg}
`) - } - }); - }); - - - -}); - diff --git a/odex25_ensan/takaful_portal_sponsor/static/js/financial_donation.js b/odex25_ensan/takaful_portal_sponsor/static/js/financial_donation.js deleted file mode 100644 index a462fbd93..000000000 --- a/odex25_ensan/takaful_portal_sponsor/static/js/financial_donation.js +++ /dev/null @@ -1,74 +0,0 @@ -$(document).ready(function () { - var currentPage = 1; - var benefitType = 'orphan'; // Default value - var prev - var next - - function financial_donation(page) { - $.ajax({ - url: '/portal/sys/benefits/page/' + page, - type: 'GET', - data: { benefit_type: benefitType }, - dataType: 'json', - success: function (data) { - results = data.results; - console.log(results); - var html = ''; - if (data.status) { - results.forEach((element, i) => { - console.log(element); - html += - ` -- - ` - }); - $('.financial_donation tbody').html(html); - next = data.next_page; - prev = (currentPage > 1) ? currentPage - 1 : null; - currentPage = page; - } - else { - console.log(data.msg); - } - }, - error: function (err) { - console.log(err.msg); - } - }); - } - financial_donation(1); - function updateButtons(next, prev) { - $('#benefits-next').attr('disabled', (next == null)); - $('#benefits-prev').attr('disabled', (prev == null)); - } - - $('#benefit-type').change(function () { - benefitType = $(this).val(); - $('.financial_donation tbody tr').data("type", benefitType) - financial_donation(1); - }); - $('#benefits-prev').click(function () { - financial_donation(currentPage - 1); - updateButtons(next, prev) - - }); - $('#benefits-next').click(function () { - financial_donation(currentPage + 1); - updateButtons(next, prev) - }); -}) \ No newline at end of file diff --git a/odex25_ensan/takaful_portal_sponsor/static/js/financial_record.js b/odex25_ensan/takaful_portal_sponsor/static/js/financial_record.js deleted file mode 100644 index 2fcb8661c..000000000 --- a/odex25_ensan/takaful_portal_sponsor/static/js/financial_record.js +++ /dev/null @@ -1,130 +0,0 @@ -$(document).ready(function () { - var currentPage = 1; - var prev - var next - - - function paymentsHandler(page) { - $.ajax({ - url: '/portal/sponsor/payments/page/' + page, - type: 'GET', - dataType: 'json', - success: function (data) { - results = data.results; - nextPage = data.next_page; - console.log(nextPage); - console.log(data); - var html = ''; - if (data.status) { - results.forEach((element, i) => { - html += - ` -${i + 1} -${element.first_name} -${element.gender} -${element.age} -${element.city_id} -${element.benefit_type} -${element.benefit_needs_percent} % -${element.benefit_available_need} -${element.benefit_arrears_value} -- -- ساهم الان --- - ` - }); - $('.payments_table tbody').html(html); - - currentPage = page; - next = data.next_page; - prev = (currentPage > 1) ? currentPage - 1 : null; - updateButtons(next, prev); - } - else { - $('.payments_table').hide(); - $('.empty_payments').text('لايوجد مدفوعات لعرضها ') - } - }, - error: function (err) { - $('.empty_payments').text(err.msg) - } - }); - } - - - function arreasHandler(page) { - $.ajax({ - url: '/portal/sponsor/arrears/page/' + page, - type: 'GET', - dataType: 'json', - success: function (data) { - results = data.results; - nextPage = data.next_page; - console.log(nextPage); - console.log(data); - var html = ''; - if (data.status) { - results.forEach((element, i) => { - html += - ` -${i + 1} -${element.name} -${element.title} -${element.date} -${element.amount} -- -- تم السداد --- - ` - }); - $('.arreas_table tbody').html(html); - currentPage = page; - console.log(currentPage); - next = data.next_page; - console.log('next is' + next); - prev = (currentPage > 1) ? currentPage - 1 : null; - updateButtons(next, prev); - } - else { - $('.arreas_table').hide(); - $('.empty_arreas').text('لايوجد مدفوعات لعرضها ') - } - }, - error: function (err) { - $('.empty_arreas').text(err.msg) - } - }); - } - - paymentsHandler(currentPage); - arreasHandler(currentPage); - - function updateButtons(next, prev) { - $('#payments_next').prop('disabled', (next === null)); - $('#payments_prev').prop('disabled', (currentPage === 1)); - } - - // Button click event handlers - $('#payments_next').click(function () { - if (next) { - paymentsHandler(currentPage + 1); - arreasHandler(currentPage + 1); - } - }); - $('#payments_prev').click(function () { - paymentsHandler(currentPage - 1); - arreasHandler(currentPage - 1); - - }); - -}) \ No newline at end of file diff --git a/odex25_ensan/takaful_portal_sponsor/static/js/general_needs.js b/odex25_ensan/takaful_portal_sponsor/static/js/general_needs.js deleted file mode 100644 index 82dccd574..000000000 --- a/odex25_ensan/takaful_portal_sponsor/static/js/general_needs.js +++ /dev/null @@ -1,65 +0,0 @@ - -$(document).ready(function () { - var currentPage = 1; - var prev - var next - function generalNeeds(page) { - $.ajax({ - url: '/portal/sys/need_types/page/' + page, - type: 'GET', - dataType: 'json', - success: function (data) { - results = data.results; - console.log(results); - var html = ''; - if (data.status) { - results.forEach((element, i) => { - console.log(element); - html += - ` -${i + 1} -${element.code} -${element.next_due_date} -${element.contribution_value} -${element.due_days} -- - -- - ` - }); - $('.general_needs tbody').html(html); - next = data.next_page; - prev = (currentPage > 1) ? currentPage - 1 : null; - currentPage = page; - } - else { - console.log(data.msg); - } - }, - error: function (err) { - console.log(err.msg); - } - }); - } - generalNeeds(1); - function updateButtons(next, prev) { - $('#benefits-next').attr('disabled', (next == null)); - $('#benefits-prev').attr('disabled', (prev == null)); - } - - $('#benefits-prev').click(function () { - generalNeeds(currentPage - 1); - updateButtons(next, prev) - - }); - $('#benefits-next').click(function () { - generalNeeds(currentPage + 1); - updateButtons(next, prev) - }); -}) \ No newline at end of file diff --git a/odex25_ensan/takaful_portal_sponsor/static/js/kafel.js b/odex25_ensan/takaful_portal_sponsor/static/js/kafel.js deleted file mode 100644 index cbe26566f..000000000 --- a/odex25_ensan/takaful_portal_sponsor/static/js/kafel.js +++ /dev/null @@ -1,231 +0,0 @@ -$(document).ready(function () { - console.log('this is kafel js'); - //Get list of cities - let allCities = "/portal/sys/city_list"; - fetch(allCities).then(res => res.json()).then(cities => { - console.log(cities); - data = cities.results; - data.forEach((city, i) => { - $('#city_id').append(``) - }); - }); - -}) - - -var currentPage = 1; -var benefitType = 'orphan'; // Default value -var next -var prev - - -function loadData(page) { - $.ajax({ - url: '/portal/sponsor/sponsorships/page/' + page, - type: 'GET', - data: { benefit_type: benefitType }, - dataType: 'json', - success: function (data) { - results = data.results; - console.log(results); - var html = ''; - if (data.status) { - results.forEach((element, i) => { - html += - ` -${i + 1} -${element.name} -${element.city_name} -${element.benefit_count} -${element.target_amount} -${element.completion_ratio} % -${element.remaining_amount} -- -- ساهم الان --= 1 ? " class = 'active' " : " class= 'expired' "}> - - ` - }); - $('.kafalaty_table tbody').html(html); - next = data.next_page; - prev = (currentPage > 1) ? currentPage - 1 : null; - currentPage = page; - console.log(next, prev); - } - else { - console.log(data.msg); - } - }, - error: function (jqXHR, textStatus, errorThrown) { - console.log(textStatus + ': ' + errorThrown); - } - }); -} - -//cancelation resons list api - -$(document).ready(function () { - let reasons = "/portal/sys/reason_list"; - fetch(reasons).then(res => res.json()).then(reasons => { - data = reasons.results; - console.log(data); - data.forEach((reason, i) => { - $('#reason_id').append(``) - }); - }); -}) - -//load benefits data - -function sponsorshipsCancelation(page) { - $.ajax({ - url: '/portal/sponsor/sponsorships/page/' + page, - type: 'GET', - data: { benefit_type: benefitType }, - dataType: 'json', - success: function (data) { - results = data.results; - console.log(results); - var html = ''; - if (data.status) { - results.forEach((element, i) => { - html += - ` -${i + 1} -${element.benefit_id.name} -${element.benefit_id.gender} -${element.benefit_id.age} -${element.benefit_id.city_id} -${element.benefit_id.benefit_type} -${element.benefit_id.benefit_needs_percent} % -${element.benefit_id.benefit_arrears_value} -${element.start_date} -${element.month_count >= 1 ? ` سارية ` : ` منتهية `} -= 1 ? " class = 'active' " : " class= 'expired' "}> - - ` - }); - $('.sponsorship_cancelation tbody').html(html); - next = data.next_page; - prev = (currentPage > 1) ? currentPage - 1 : null; - currentPage = page; - } - else { - console.log(data.msg); - } - }, - error: function (jqXHR, textStatus, errorThrown) { - console.log(textStatus + ': ' + errorThrown); - } - }); -} - - -//cancelation request - -$(document).ready(function () { - $('form#cancelation_form').on('submit', function (evt) { - evt.preventDefault(); - var sponsorshipId = $('#sponsorship_id').val(); - var reasonId = $('#reason_id').val(); - var data = { - sponsorship_id: sponsorshipId, - reason_id: reasonId, - }; - $.ajax({ - type: 'POST', - url: '/portal/sponsor/sponsorships/cancel', - data:data, - dataType: 'json', - success: function (data) { - if (data.status) { - console.log(data); - $('.cancelation_feedback').show(); - $('.cancelation_feedback').html(`${i + 1} -${element.benefit_id.name} -${element.benefit_id.gender} -${element.benefit_id.age} -${element.benefit_id.city_id} -${element.benefit_id.benefit_type} -${element.benefit_id.benefit_needs_percent} % -${element.benefit_id.benefit_arrears_value} -${element.start_date} -${element.month_count >= 1 ? - ` - سارية - - -الغاء - - ` - : - - ` - منتهية - -
الغاء - < /a> - ` } -
${data.msg}`); - setTimeout(function () { - $('.cancelation_feedback').hide(); - // location.reload(); - }, 3000); - } - - else { - $('.cancelation_feedback').show(); - $('.cancelation_feedback').html(`${data.msg}`); - } - }, - error: function (error) { - console.log(error); - $('.cancelation_feedback').show(); - $('.cancelation_feedback').html(`${error.msg}`); - setTimeout(function () { - $('.cancelation_feedback').hide(); - }, 3000); - } - }); - } - ); -}) - - -$(document).ready(function () { - $('.need_sponsorship tbody').on('click', '#benefit_dtls', function (evt) { - const userId = $(this).data("id"); - const userType = $(this).data("type") - console.log(userId, userType); - window.location.href = `/need_kafala_details?benefit_type=${userType}&benefit_id=${userId}`; - }) -}) - -$(document).ready(function () { - loadData(1); - sponsorshipsCancelation(1) - function updateButtons(next, prev) { - $('#benefits-next').attr('disabled', (next == null)); - $('#benefits-prev').attr('disabled', (prev == null)); - } - - $('#benefits-type').on('change', function () { - loadData(1); - sponsorshipsCancelation(1) - let type = $(this).val(); - benefitType = type - $('.kafalaty_table tbody tr').data("type", type) - }); - $('#benefits-prev').click(function () { - loadData(currentPage - 1); - sponsorshipsCancelation(currentPage - 1); - updateButtons(next, prev) - - }); - $('#benefits-next').click(function () { - loadData(currentPage + 1); - sponsorshipsCancelation(currentPage + 1); - updateButtons(next, prev) - }); - - - $('.sponsorship_cancelation tbody').on('click', '.cancel_link', function (e) { - e.preventDefault(); - $('.cancelation_feedback').html('') - $('#sponsorship_cancelation').modal('show'); - let sponsorship_id = $(this).data('id'); - console.log(sponsorship_id); - $('#sponsorship_id').val(sponsorship_id) - }); -}); \ No newline at end of file diff --git a/odex25_ensan/takaful_portal_sponsor/static/js/main.js b/odex25_ensan/takaful_portal_sponsor/static/js/main.js deleted file mode 100644 index 0375c60e8..000000000 --- a/odex25_ensan/takaful_portal_sponsor/static/js/main.js +++ /dev/null @@ -1,2 +0,0 @@ -$(document).ready(function(){ -}) \ No newline at end of file diff --git a/odex25_ensan/takaful_portal_sponsor/static/js/makfoul_details.js b/odex25_ensan/takaful_portal_sponsor/static/js/makfoul_details.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/odex25_ensan/takaful_portal_sponsor/static/js/multiselect-dropdown.js b/odex25_ensan/takaful_portal_sponsor/static/js/multiselect-dropdown.js deleted file mode 100644 index e2d4cf85f..000000000 --- a/odex25_ensan/takaful_portal_sponsor/static/js/multiselect-dropdown.js +++ /dev/null @@ -1,225 +0,0 @@ -var style = document.createElement('style'); -style.setAttribute("id","multiselect_dropdown_styles"); -style.innerHTML = ` -.multiselect-dropdown{ - display: inline-block; - padding: 2px 5px 0px 5px; - border-radius: 4px; - border: solid 1px #ced4da; - background-color: white; - position: relative; - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"); - background-repeat: no-repeat; - background-position: right .75rem center; - background-size: 16px 12px; -} -.multiselect-dropdown span.optext, .multiselect-dropdown span.placeholder{ - margin-right:0.5em; - margin-bottom:2px; - padding:1px 0; - border-radius: 4px; - display:inline-block; -} -.multiselect-dropdown span.optext{ - background-color:lightgray; - padding:1px 0.75em; -} -.multiselect-dropdown span.optext .optdel { - float: right; - margin: 0 -6px 1px 5px; - font-size: 0.7em; - margin-top: 2px; - cursor: pointer; - color: #666; -} -.multiselect-dropdown span.optext .optdel:hover { color: #c66;} -.multiselect-dropdown span.placeholder{ - color:#ced4da; -} -.multiselect-dropdown-list-wrapper{ - box-shadow: gray 0 3px 8px; - z-index: 100; - padding:2px; - border-radius: 4px; - border: solid 1px #ced4da; - display: none; - margin: -1px; - position: absolute; - top:0; - left: 0; - right: 0; - background: white; -} -.multiselect-dropdown-list-wrapper .multiselect-dropdown-search{ - margin-bottom:5px; -} -.multiselect-dropdown-list{ - padding:2px; - height: 15rem; - overflow-y:auto; - overflow-x: hidden; -} -.multiselect-dropdown-list::-webkit-scrollbar { - width: 6px; -} -.multiselect-dropdown-list::-webkit-scrollbar-thumb { - background-color: #bec4ca; - border-radius:3px; -} - -.multiselect-dropdown-list div{ - padding: 5px; -} -.multiselect-dropdown-list input{ - height: 1.15em; - width: 1.15em; - margin-right: 0.35em; -} -.multiselect-dropdown-list div.checked{ -} -.multiselect-dropdown-list div:hover{ - background-color: #ced4da; -} -.multiselect-dropdown span.maxselected {width:100%;} -.multiselect-dropdown-all-selector {border-bottom:solid 1px #999;} -`; -document.head.appendChild(style); - -function MultiselectDropdown(options){ - var config={ - search:true, - height:'15rem', - placeholder:'select', - txtSelected:'selected', - txtAll:'All', - txtRemove: 'Remove', - txtSearch:'search', - ...options - }; - function newEl(tag,attrs){ - var e=document.createElement(tag); - if(attrs!==undefined) Object.keys(attrs).forEach(k=>{ - if(k==='class') { Array.isArray(attrs[k]) ? attrs[k].forEach(o=>o!==''?e.classList.add(o):0) : (attrs[k]!==''?e.classList.add(attrs[k]):0)} - else if(k==='style'){ - Object.keys(attrs[k]).forEach(ks=>{ - e.style[ks]=attrs[k][ks]; - }); - } - else if(k==='text'){attrs[k]===''?e.innerHTML=' ':e.innerText=attrs[k]} - else e[k]=attrs[k]; - }); - return e; - } - - console.log('this is multiselect js '); - - document.querySelectorAll("select[multiple]").forEach((el,k)=>{ - - var div=newEl('div',{class:'multiselect-dropdown',style:{width:config.style?.width??el.clientWidth+'px',padding:config.style?.padding??''}}); - el.style.display='none'; - el.parentNode.insertBefore(div,el.nextSibling); - var listWrap=newEl('div',{class:'multiselect-dropdown-list-wrapper'}); - var list=newEl('div',{class:'multiselect-dropdown-list',style:{height:config.height}}); - var search=newEl('input',{class:['multiselect-dropdown-search'].concat([config.searchInput?.class??'form-control']),style:{width:'100%',display:el.attributes['multiselect-search']?.value==='true'?'block':'none'},placeholder:config.txtSearch}); - listWrap.appendChild(search); - div.appendChild(listWrap); - listWrap.appendChild(list); - - el.loadOptions=()=>{ - list.innerHTML=''; - - if(el.attributes['multiselect-select-all']?.value=='true'){ - var op=newEl('div',{class:'multiselect-dropdown-all-selector'}) - var ic=newEl('input',{type:'checkbox'}); - op.appendChild(ic); - op.appendChild(newEl('label',{text:config.txtAll})); - - op.addEventListener('click',()=>{ - op.classList.toggle('checked'); - op.querySelector("input").checked=!op.querySelector("input").checked; - - var ch=op.querySelector("input").checked; - list.querySelectorAll(":scope > div:not(.multiselect-dropdown-all-selector)") - .forEach(i=>{if(i.style.display!=='none'){i.querySelector("input").checked=ch; i.optEl.selected=ch}}); - - el.dispatchEvent(new Event('change')); - }); - ic.addEventListener('click',(ev)=>{ - ic.checked=!ic.checked; - }); - el.addEventListener('change', (ev)=>{ - let itms=Array.from(list.querySelectorAll(":scope > div:not(.multiselect-dropdown-all-selector)")).filter(e=>e.style.display!=='none') - let existsNotSelected=itms.find(i=>!i.querySelector("input").checked); - if(ic.checked && existsNotSelected) ic.checked=false; - else if(ic.checked==false && existsNotSelected===undefined) ic.checked=true; - }); - - list.appendChild(op); - } - - Array.from(el.options).map(o=>{ - var op=newEl('div',{class:o.selected?'checked':'',optEl:o}) - var ic=newEl('input',{type:'checkbox',checked:o.selected}); - op.appendChild(ic); - op.appendChild(newEl('label',{text:o.text})); - - op.addEventListener('click',()=>{ - op.classList.toggle('checked'); - op.querySelector("input").checked=!op.querySelector("input").checked; - op.optEl.selected=!!!op.optEl.selected; - el.dispatchEvent(new Event('change')); - }); - ic.addEventListener('click',(ev)=>{ - ic.checked=!ic.checked; - }); - o.listitemEl=op; - list.appendChild(op); - }); - div.listEl=listWrap; - - div.refresh=()=>{ - div.querySelectorAll('span.optext, span.placeholder').forEach(t=>div.removeChild(t)); - var sels=Array.from(el.selectedOptions); - if(sels.length>(el.attributes['multiselect-max-items']?.value??5)){ - div.appendChild(newEl('span',{class:['optext','maxselected'],text:sels.length+' '+config.txtSelected})); - } - else{ - sels.map(x=>{ - var c=newEl('span',{class:'optext',text:x.text, srcOption: x}); - if((el.attributes['multiselect-hide-x']?.value !== 'true')) - c.appendChild(newEl('span',{class:'optdel',text:'🗙',title:config.txtRemove, onclick:(ev)=>{c.srcOption.listitemEl.dispatchEvent(new Event('click'));div.refresh();ev.stopPropagation();}})); - - div.appendChild(c); - }); - } - if(0==el.selectedOptions.length) div.appendChild(newEl('span',{class:'placeholder',text:el.attributes['placeholder']?.value??config.placeholder})); - }; - div.refresh(); - } - el.loadOptions(); - - search.addEventListener('input',()=>{ - list.querySelectorAll(":scope div:not(.multiselect-dropdown-all-selector)").forEach(d=>{ - var txt=d.querySelector("label").innerText.toUpperCase(); - d.style.display=txt.includes(search.value.toUpperCase())?'block':'none'; - }); - }); - - div.addEventListener('click',()=>{ - div.listEl.style.display='block'; - search.focus(); - search.select(); - }); - - document.addEventListener('click', function(event) { - if (!div.contains(event.target)) { - listWrap.style.display='none'; - div.refresh(); - } - }); - }); -} - -window.addEventListener('load',()=>{ - MultiselectDropdown(window.MultiselectDropdownOptions); -}); diff --git a/odex25_ensan/takaful_portal_sponsor/static/js/notifiactions_details.js b/odex25_ensan/takaful_portal_sponsor/static/js/notifiactions_details.js deleted file mode 100644 index df80cd805..000000000 --- a/odex25_ensan/takaful_portal_sponsor/static/js/notifiactions_details.js +++ /dev/null @@ -1,73 +0,0 @@ -const urlSearchParams = new URLSearchParams(window.location.search); -var myId = urlSearchParams.get("id"); - -$.ajax({ - url: `/portal/sponsor/notify/read/${myId}`, - type: 'GET', - dataType: 'json', - success: function (data) { - console.log(data); - notif_details = data.notification; - var html = ''; - if (data.status) { - html += - ` --- - ` - $('.notifications.details .wrapper').html(html); - } - else { - console.log(data.msg); - } - }, - error: function (jqXHR, textStatus, errorThrown) { - console.log(textStatus + ': ' + errorThrown); - } -}); - -$(".notifications.details").on("click", ".delete_noti", () => { - $.ajax({ - url: `/portal/sponsor/notify/delete/${myId}`, - type: 'GET', - dataType: 'json', - success: function (data) { - console.log(data); - var message = data.msg ; - if (data.status) { - $('.delete_feedback').append(` ${message} `); - setTimeout(function () { - window.location.href = `/notifications`; - }, 3000); - } - else { - $('.delete_feedback').append(` ${message} `); - } - }, - error: function (err) { - $('.delete_feedback').append(` ${err.msg} `); - } - }); -}) \ No newline at end of file diff --git a/odex25_ensan/takaful_portal_sponsor/static/js/notifications.js b/odex25_ensan/takaful_portal_sponsor/static/js/notifications.js deleted file mode 100644 index 281d13dce..000000000 --- a/odex25_ensan/takaful_portal_sponsor/static/js/notifications.js +++ /dev/null @@ -1,179 +0,0 @@ -var currentPage = 1; -var next -var prev - - -const urlSearchParams = new URLSearchParams(window.location.search); -var is_read = urlSearchParams.get("is_read"); - -if(is_read =='no'){ - $("#unread_toggler").prop('checked', true); -} - -function updateButtons(nxt, prv) { - $('#benefits-next').attr('disabled', (nxt == null)); - $('#benefits-prev').attr('disabled', (prv == null)); -} - -//load read notifiacrions -if (is_read == 'yes') { - function loadNotifications(page) { - $.ajax({ - url: `/portal/sponsor/notifications/page/${page}?is_read=yes`, - type: 'GET', - dataType: 'json', - success: function (data) { - console.log(data); - notif = data.results; - let myPage = data.next_page; - console.log(myPage); - var html = ''; - if (data.status) { - notif.forEach((element, i) => { - html += - ` - -- ${notif_details.sent_on} ----${notif_details.title}
-- ${notif_details.body} -
-- - --- ${element.title} -
-- ${element.body} -
- - ${element.sent_on} - - - ` - }); - $('.all_notifs').html(html); - - next = data.next_page; - prev = (currentPage > 1) ? currentPage - 1 : null; - currentPage = page; - console.log(next, prev); - $('#notif-next').attr('disabled', (next == null)); - $('#notif-prev').attr('disabled', (prev == null)); - } - else { - console.log(data.msg); - } - }, - error: function (jqXHR, textStatus, errorThrown) { - console.log(textStatus + ': ' + errorThrown); - } - }); - } -} -//load all notifications -else if (is_read == 'no') { - - function loadNotifications(page) { - $.ajax({ - url: `/portal/sponsor/notifications/page/${page}?is_read=no`, - type: 'GET', - dataType: 'json', - success: function (data) { - console.log(data); - notif = data.results; - let myPage = data.next_page; - console.log(myPage); - var html = ''; - if (data.status) { - notif.forEach((element, i) => { - html += - ` - -- ${element.title} -
-- ${element.body} -
- - ${element.sent_on} - - - ` - }); - $('.all_notifs').html(html); - - next = data.next_page; - prev = (currentPage > 1) ? currentPage - 1 : null; - currentPage = page; - console.log(next, prev); - $('#notif-next').attr('disabled', (next == null)); - $('#notif-prev').attr('disabled', (prev == null)); - } - else { - console.log(data.msg); - } - }, - error: function (jqXHR, textStatus, errorThrown) { - console.log(textStatus + ': ' + errorThrown); - } - }); - } - -} else { - function loadNotifications(page) { - $.ajax({ - url: `/portal/sponsor/notifications/page/${page}`, - type: 'GET', - dataType: 'json', - success: function (data) { - console.log(data); - notif = data.results; - let myPage = data.next_page; - console.log(myPage); - var html = ''; - if (data.status) { - notif.forEach((element, i) => { - html += - ` - -- ${element.title} -
-- ${element.body} -
- - ${element.sent_on} - - - ` - }); - $('.all_notifs').html(html); - - next = data.next_page; - prev = (currentPage > 1) ? currentPage - 1 : null; - currentPage = page; - console.log(next, prev); - $('#notif-next').attr('disabled', (next == null)); - $('#notif-prev').attr('disabled', (prev == null)); - } - else { - console.log(data.msg); - } - }, - error: function (jqXHR, textStatus, errorThrown) { - console.log(textStatus + ': ' + errorThrown); - } - }); - } -} - - - - -$(document).ready(function () { - loadNotifications(1); - $('#notif-prev').click(function () { - loadNotifications(currentPage - 1); - updateButtons(next, prev) - }); - $('#notif-next').click(function () { - loadNotifications(currentPage + 1); - updateButtons(next, prev) - }); -}); \ No newline at end of file diff --git a/odex25_ensan/takaful_portal_sponsor/static/js/notifications_settings.js b/odex25_ensan/takaful_portal_sponsor/static/js/notifications_settings.js deleted file mode 100644 index 397a74dac..000000000 --- a/odex25_ensan/takaful_portal_sponsor/static/js/notifications_settings.js +++ /dev/null @@ -1,69 +0,0 @@ -$(document).ready(function () { - $.ajax({ - url: '/portal/sponsor/notify_setting', - type: 'GET', - dataType: 'json', - processData: false, - success: function (data) { - settings = data.notify_setting; - console.log(settings); - if (data.status) { - $('input[name="notify_by_app"]').prop('checked', settings.notify_by_app); - $('input[name="notify_by_sms"]').prop('checked', settings.notify_by_sms); - $('input[name="notify_month_day"]').val(settings.notify_month_day); - $('input[name="notify_pay_by_app"]').prop('checked', settings.notify_pay_by_app); - $('input[name="notify_pay_by_sms"]').prop('checked', settings.notify_pay_by_sms); - $(".notifications_update_feedback").text(data.msg).addClass('alert alert-success') - - } - else { - console.log(data.msg); - $(".notifications_update_feedback").text(data.msg).addClass('alert alert-danger') - } - }, - error: function (error) { - $(".notifications_update_feedback").text(error.msg).addClass('alert alert-danger') - } - }); - - var settings_data = {} - - // Add event listener to input fields to detect changes - $('input[type="checkbox"]').change(function () { - settings_data = { - notify_by_app: $('input[name="notify_by_app"]').prop('checked'), - notify_by_sms: $('input[name="notify_by_sms"]').prop('checked'), - notify_month_day: $('input[name="notify_month_day"]').val(), - notify_pay_by_app: $('input[name="notify_pay_by_app"]').prop('checked'), - notify_pay_by_sms: $('input[name="notify_pay_by_sms"]').prop('checked'), - } - }); - - // Add event listener to save button to trigger AJAX request - $('#notifications_update_form').on("submit", (e) => { - e.preventDefault(); - $.ajax({ - url: '/portal/sponsor/notify_setting/update', - type: 'POST', - data: settings_data, - dataType: 'json', - success: function (response) { - if (response.status) { - console.log(response); - $(".notifications_update_feedback").show() - $(".notifications_update_feedback").text(response.msg) - } else { - $(".notifications_update_feedback").show() - $(".notifications_update_feedback").text(response.msg) - } - }, - error: function (error) { - $(".notifications_update_feedback").show() - $(".notifications_update_feedback").text(error.msg) - } - }); - - }); -}) - - diff --git a/odex25_ensan/takaful_portal_sponsor/static/js/orphan_widows_needs.js b/odex25_ensan/takaful_portal_sponsor/static/js/orphan_widows_needs.js deleted file mode 100644 index 3df142e6f..000000000 --- a/odex25_ensan/takaful_portal_sponsor/static/js/orphan_widows_needs.js +++ /dev/null @@ -1,74 +0,0 @@ -$(document).ready(function () { - var currentPage = 1; - var benefitType = 'orphan'; // Default value - var nextorphan - var prev - var next - - function orphan_widows_needs(page) { - $.ajax({ - url: '/portal/sys/benefits/page/' + page, - type: 'GET', - data: { benefit_type: benefitType }, - dataType: 'json', - success: function (data) { - results = data.results; - console.log(results); - var html = ''; - if (data.status) { - results.forEach((element, i) => { - console.log(element); - html += - ` -- - ` - }); - $('.orphan_widows_needs tbody').html(html); - next = data.next_page; - prev = (currentPage > 1) ? currentPage - 1 : null; - currentPage = page; - } - else { - console.log(data.msg); - } - }, - error: function (jqXHR, textStatus, errorThrown) { - console.log(textStatus + ': ' + errorThrown); - } - }); - } - orphan_widows_needs(1); - function updateButtons(next, prev) { - $('#benefits-next').attr('disabled', (next == null)); - $('#benefits-prev').attr('disabled', (prev == null)); - } - - $('#benefit-type').change(function () { - benefitType = $(this).val(); - $('.financial_donation tbody tr').data("type", benefitType) - orphan_widows_needs(1); - - }); - $('#benefits-prev').click(function () { - orphan_widows_needs(currentPage - 1); - updateButtons(next, prev) - - }); - $('#benefits-next').click(function () { - orphan_widows_needs(currentPage + 1); - updateButtons(next, prev) - }); -}) \ No newline at end of file diff --git a/odex25_ensan/takaful_portal_sponsor/static/js/profile.js b/odex25_ensan/takaful_portal_sponsor/static/js/profile.js deleted file mode 100644 index d00a8adb5..000000000 --- a/odex25_ensan/takaful_portal_sponsor/static/js/profile.js +++ /dev/null @@ -1,101 +0,0 @@ -$(document).ready(function () { - - - - const getProfileData = () => { - let url = "/portal/sponsor/profile"; - fetch(url) - .then(response => response.json()) - .then(res => { - data = res.sponsor; - console.log(data); - const dataObject = { - name: data.name, - gender: data.gender, - id_number: data.id_number, - mobile: data.mobile, - email: data.email, - city_id: data.city_id, - company_type: data.company_type, - bank_entity_name: data.bank_entity_name, - account_number: data.account_number, - iban: data.iban, - bank_name: data.bank_id, - } - //general information inputs values - $("input[name=name]").val(dataObject.name); - $("input[name=id_number]").val(dataObject.id_number); - $("input[name=mobile]").val(dataObject.mobile); - $("input[name=email]").val(dataObject.email); - $('#city_id option[value="' + dataObject.city_id + '"]').prop('selected', true); - $("input[name=company_type]").val(dataObject.company_type); - if (dataObject.gender == 'male') { - $('#gender-male').prop('checked', true) - $('#gender-female').prop('checked', false) - } else { - $('#gender-female').prop('checked', true) - $('#gender-male').prop('checked', false) - } - $("input[name=bank_entity_name]").val(dataObject.bank_entity_name); - $("input[name=account_number]").val(dataObject.account_number); - $("input[name=iban]").val(dataObject.iban); - $('#bank_id option[value="' + dataObject.bank_id + '"]').prop('selected', true); - }) - .catch(err => { - console.log(err); - }) - } - getProfileData(); - - //profile update values - let update_profile = "/portal/sponsor/profile/update"; - const form = $('.sponsor_profile_form') - const updateHandler = () => { - form.on('submit', function (e) { - var formData = $(this).serialize(); - console.log(formData); - e.preventDefault(); - $.ajax({ - method: 'PUT', - url: update_profile, - data: { - mobile: $("input[name=mobile]").val(), - city_id: $("#city_id").val(), - account_number: $("input[name=account_number]").val(), - iban: $("input[name=iban]").val(), - bank_id: $("#bank_id").val(), - bank_entity_name: $("input[name=bank_entity_name]").val(), - }, - dataType: "json", - success: function (response) { - if (response !== undefined && response !== null) { - if (response.status) { - console.log(response.data); - $('.success_res').show(); - $('.error_res').hide(); - $('.success_res').html(` ${response.msg} `); - setTimeout(function () { - $('.success_res').hide(); - }, 3000); - } else { - $('.error_res').show(); - $('.success_res').hide(); - $('.error_res').html(` ${response.msg} `); - setTimeout(function () { - $('.success_res').hide(); - }, 6000); - } - } - }, - error: function (error) { - $('.success_res').hide(); - $('.error_res').show(); - $('.error_res').html(` ${error.msg} `); - } - }); - return false; - } - ); - } - updateHandler(); -}) \ No newline at end of file diff --git a/odex25_ensan/takaful_portal_sponsor/static/js/select2.min.js b/odex25_ensan/takaful_portal_sponsor/static/js/select2.min.js deleted file mode 100644 index e42142643..000000000 --- a/odex25_ensan/takaful_portal_sponsor/static/js/select2.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ -!function(n){"function"==typeof define&&define.amd?define(["jquery"],n):"object"==typeof module&&module.exports?module.exports=function(e,t){return void 0===t&&(t="undefined"!=typeof window?require("jquery"):require("jquery")(e)),n(t),t}:n(jQuery)}(function(u){var e=function(){if(u&&u.fn&&u.fn.select2&&u.fn.select2.amd)var e=u.fn.select2.amd;var t,n,r,h,o,s,f,g,m,v,y,_,i,a,b;function w(e,t){return i.call(e,t)}function l(e,t){var n,r,i,o,s,a,l,c,u,d,p,h=t&&t.split("/"),f=y.map,g=f&&f["*"]||{};if(e){for(s=(e=e.split("/")).length-1,y.nodeIdCompat&&b.test(e[s])&&(e[s]=e[s].replace(b,"")),"."===e[0].charAt(0)&&h&&(e=h.slice(0,h.length-1).concat(e)),u=0;u${i + 1} -${element.first_name} -${element.gender} -${element.age} -${element.city_id} -${element.benefit_type} -${element.benefit_needs_percent} % -- -- ساهم الان --":">",'"':""","'":"'","/":"/"};return"string"!=typeof e?e:String(e).replace(/[&<>"'\/\\]/g,function(e){return t[e]})},i.appendMany=function(e,t){if("1.7"===o.fn.jquery.substr(0,3)){var n=o();o.map(t,function(e){n=n.add(e)}),t=n}e.append(t)},i.__cache={};var n=0;return i.GetUniqueElementId=function(e){var t=e.getAttribute("data-select2-id");return null==t&&(e.id?(t=e.id,e.setAttribute("data-select2-id",t)):(e.setAttribute("data-select2-id",++n),t=n.toString())),t},i.StoreData=function(e,t,n){var r=i.GetUniqueElementId(e);i.__cache[r]||(i.__cache[r]={}),i.__cache[r][t]=n},i.GetData=function(e,t){var n=i.GetUniqueElementId(e);return t?i.__cache[n]&&null!=i.__cache[n][t]?i.__cache[n][t]:o(e).data(t):i.__cache[n]},i.RemoveData=function(e){var t=i.GetUniqueElementId(e);null!=i.__cache[t]&&delete i.__cache[t],e.removeAttribute("data-select2-id")},i}),e.define("select2/results",["jquery","./utils"],function(h,f){function r(e,t,n){this.$element=e,this.data=n,this.options=t,r.__super__.constructor.call(this)}return f.Extend(r,f.Observable),r.prototype.render=function(){var e=h('');return this.options.get("multiple")&&e.attr("aria-multiselectable","true"),this.$results=e},r.prototype.clear=function(){this.$results.empty()},r.prototype.displayMessage=function(e){var t=this.options.get("escapeMarkup");this.clear(),this.hideLoading();var n=h(''),r=this.options.get("translations").get(e.message);n.append(t(r(e.args))),n[0].className+=" select2-results__message",this.$results.append(n)},r.prototype.hideMessages=function(){this.$results.find(".select2-results__message").remove()},r.prototype.append=function(e){this.hideLoading();var t=[];if(null!=e.results&&0!==e.results.length){e.results=this.sort(e.results);for(var n=0;n ",{class:"select2-results__options select2-results__options--nested"});p.append(l),s.append(a),s.append(p)}else this.template(e,t);return f.StoreData(t,"data",e),t},r.prototype.bind=function(t,e){var l=this,n=t.id+"-results";this.$results.attr("id",n),t.on("results:all",function(e){l.clear(),l.append(e.data),t.isOpen()&&(l.setClasses(),l.highlightFirstItem())}),t.on("results:append",function(e){l.append(e.data),t.isOpen()&&l.setClasses()}),t.on("query",function(e){l.hideMessages(),l.showLoading(e)}),t.on("select",function(){t.isOpen()&&(l.setClasses(),l.options.get("scrollAfterSelect")&&l.highlightFirstItem())}),t.on("unselect",function(){t.isOpen()&&(l.setClasses(),l.options.get("scrollAfterSelect")&&l.highlightFirstItem())}),t.on("open",function(){l.$results.attr("aria-expanded","true"),l.$results.attr("aria-hidden","false"),l.setClasses(),l.ensureHighlightVisible()}),t.on("close",function(){l.$results.attr("aria-expanded","false"),l.$results.attr("aria-hidden","true"),l.$results.removeAttr("aria-activedescendant")}),t.on("results:toggle",function(){var e=l.getHighlightedResults();0!==e.length&&e.trigger("mouseup")}),t.on("results:select",function(){var e=l.getHighlightedResults();if(0!==e.length){var t=f.GetData(e[0],"data");"true"==e.attr("aria-selected")?l.trigger("close",{}):l.trigger("select",{data:t})}}),t.on("results:previous",function(){var e=l.getHighlightedResults(),t=l.$results.find("[aria-selected]"),n=t.index(e);if(!(n<=0)){var r=n-1;0===e.length&&(r=0);var i=t.eq(r);i.trigger("mouseenter");var o=l.$results.offset().top,s=i.offset().top,a=l.$results.scrollTop()+(s-o);0===r?l.$results.scrollTop(0):s-o<0&&l.$results.scrollTop(a)}}),t.on("results:next",function(){var e=l.getHighlightedResults(),t=l.$results.find("[aria-selected]"),n=t.index(e)+1;if(!(n>=t.length)){var r=t.eq(n);r.trigger("mouseenter");var i=l.$results.offset().top+l.$results.outerHeight(!1),o=r.offset().top+r.outerHeight(!1),s=l.$results.scrollTop()+o-i;0===n?l.$results.scrollTop(0):i this.$results.outerHeight()||o<0)&&this.$results.scrollTop(i)}},r.prototype.template=function(e,t){var n=this.options.get("templateResult"),r=this.options.get("escapeMarkup"),i=n(e,t);null==i?t.style.display="none":"string"==typeof i?t.innerHTML=r(i):h(t).append(i)},r}),e.define("select2/keys",[],function(){return{BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46}}),e.define("select2/selection/base",["jquery","../utils","../keys"],function(n,r,i){function o(e,t){this.$element=e,this.options=t,o.__super__.constructor.call(this)}return r.Extend(o,r.Observable),o.prototype.render=function(){var e=n('');return this._tabindex=0,null!=r.GetData(this.$element[0],"old-tabindex")?this._tabindex=r.GetData(this.$element[0],"old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),e.attr("title",this.$element.attr("title")),e.attr("tabindex",this._tabindex),e.attr("aria-disabled","false"),this.$selection=e},o.prototype.bind=function(e,t){var n=this,r=e.id+"-results";this.container=e,this.$selection.on("focus",function(e){n.trigger("focus",e)}),this.$selection.on("blur",function(e){n._handleBlur(e)}),this.$selection.on("keydown",function(e){n.trigger("keypress",e),e.which===i.SPACE&&e.preventDefault()}),e.on("results:focus",function(e){n.$selection.attr("aria-activedescendant",e.data._resultId)}),e.on("selection:update",function(e){n.update(e.data)}),e.on("open",function(){n.$selection.attr("aria-expanded","true"),n.$selection.attr("aria-owns",r),n._attachCloseHandler(e)}),e.on("close",function(){n.$selection.attr("aria-expanded","false"),n.$selection.removeAttr("aria-activedescendant"),n.$selection.removeAttr("aria-owns"),n.$selection.trigger("focus"),n._detachCloseHandler(e)}),e.on("enable",function(){n.$selection.attr("tabindex",n._tabindex),n.$selection.attr("aria-disabled","false")}),e.on("disable",function(){n.$selection.attr("tabindex","-1"),n.$selection.attr("aria-disabled","true")})},o.prototype._handleBlur=function(e){var t=this;window.setTimeout(function(){document.activeElement==t.$selection[0]||n.contains(t.$selection[0],document.activeElement)||t.trigger("blur",e)},1)},o.prototype._attachCloseHandler=function(e){n(document.body).on("mousedown.select2."+e.id,function(e){var t=n(e.target).closest(".select2");n(".select2.select2-container--open").each(function(){this!=t[0]&&r.GetData(this,"element").select2("close")})})},o.prototype._detachCloseHandler=function(e){n(document.body).off("mousedown.select2."+e.id)},o.prototype.position=function(e,t){t.find(".selection").append(e)},o.prototype.destroy=function(){this._detachCloseHandler(this.container)},o.prototype.update=function(e){throw new Error("The `update` method must be defined in child classes.")},o.prototype.isEnabled=function(){return!this.isDisabled()},o.prototype.isDisabled=function(){return this.options.get("disabled")},o}),e.define("select2/selection/single",["jquery","./base","../utils","../keys"],function(e,t,n,r){function i(){i.__super__.constructor.apply(this,arguments)}return n.Extend(i,t),i.prototype.render=function(){var e=i.__super__.render.call(this);return e.addClass("select2-selection--single"),e.html(''),e},i.prototype.bind=function(t,e){var n=this;i.__super__.bind.apply(this,arguments);var r=t.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",r).attr("role","textbox").attr("aria-readonly","true"),this.$selection.attr("aria-labelledby",r),this.$selection.on("mousedown",function(e){1===e.which&&n.trigger("toggle",{originalEvent:e})}),this.$selection.on("focus",function(e){}),this.$selection.on("blur",function(e){}),t.on("focus",function(e){t.isOpen()||n.$selection.trigger("focus")})},i.prototype.clear=function(){var e=this.$selection.find(".select2-selection__rendered");e.empty(),e.removeAttr("title")},i.prototype.display=function(e,t){var n=this.options.get("templateSelection");return this.options.get("escapeMarkup")(n(e,t))},i.prototype.selectionContainer=function(){return e("")},i.prototype.update=function(e){if(0!==e.length){var t=e[0],n=this.$selection.find(".select2-selection__rendered"),r=this.display(t,n);n.empty().append(r);var i=t.title||t.text;i?n.attr("title",i):n.removeAttr("title")}else this.clear()},i}),e.define("select2/selection/multiple",["jquery","./base","../utils"],function(i,e,l){function n(e,t){n.__super__.constructor.apply(this,arguments)}return l.Extend(n,e),n.prototype.render=function(){var e=n.__super__.render.call(this);return e.addClass("select2-selection--multiple"),e.html(' '),e},n.prototype.bind=function(e,t){var r=this;n.__super__.bind.apply(this,arguments),this.$selection.on("click",function(e){r.trigger("toggle",{originalEvent:e})}),this.$selection.on("click",".select2-selection__choice__remove",function(e){if(!r.isDisabled()){var t=i(this).parent(),n=l.GetData(t[0],"data");r.trigger("unselect",{originalEvent:e,data:n})}})},n.prototype.clear=function(){var e=this.$selection.find(".select2-selection__rendered");e.empty(),e.removeAttr("title")},n.prototype.display=function(e,t){var n=this.options.get("templateSelection");return this.options.get("escapeMarkup")(n(e,t))},n.prototype.selectionContainer=function(){return i('
× ')},n.prototype.update=function(e){if(this.clear(),0!==e.length){for(var t=[],n=0;n×');a.StoreData(r[0],"data",t),this.$selection.find(".select2-selection__rendered").prepend(r)}},e}),e.define("select2/selection/search",["jquery","../utils","../keys"],function(r,a,l){function e(e,t,n){e.call(this,t,n)}return e.prototype.render=function(e){var t=r('');this.$searchContainer=t,this.$search=t.find("input");var n=e.call(this);return this._transferTabIndex(),n},e.prototype.bind=function(e,t,n){var r=this,i=t.id+"-results";e.call(this,t,n),t.on("open",function(){r.$search.attr("aria-controls",i),r.$search.trigger("focus")}),t.on("close",function(){r.$search.val(""),r.$search.removeAttr("aria-controls"),r.$search.removeAttr("aria-activedescendant"),r.$search.trigger("focus")}),t.on("enable",function(){r.$search.prop("disabled",!1),r._transferTabIndex()}),t.on("disable",function(){r.$search.prop("disabled",!0)}),t.on("focus",function(e){r.$search.trigger("focus")}),t.on("results:focus",function(e){e.data._resultId?r.$search.attr("aria-activedescendant",e.data._resultId):r.$search.removeAttr("aria-activedescendant")}),this.$selection.on("focusin",".select2-search--inline",function(e){r.trigger("focus",e)}),this.$selection.on("focusout",".select2-search--inline",function(e){r._handleBlur(e)}),this.$selection.on("keydown",".select2-search--inline",function(e){if(e.stopPropagation(),r.trigger("keypress",e),r._keyUpPrevented=e.isDefaultPrevented(),e.which===l.BACKSPACE&&""===r.$search.val()){var t=r.$searchContainer.prev(".select2-selection__choice");if(0 this.maximumInputLength?this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:t.term,params:t}}):e.call(this,t,n)},e}),e.define("select2/data/maximumSelectionLength",[],function(){function e(e,t,n){this.maximumSelectionLength=n.get("maximumSelectionLength"),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){var r=this;e.call(this,t,n),t.on("select",function(){r._checkIfMaximumSelected()})},e.prototype.query=function(e,t,n){var r=this;this._checkIfMaximumSelected(function(){e.call(r,t,n)})},e.prototype._checkIfMaximumSelected=function(e,n){var r=this;this.current(function(e){var t=null!=e?e.length:0;0 =r.maximumSelectionLength?r.trigger("results:message",{message:"maximumSelected",args:{maximum:r.maximumSelectionLength}}):n&&n()})},e}),e.define("select2/dropdown",["jquery","./utils"],function(t,e){function n(e,t){this.$element=e,this.options=t,n.__super__.constructor.call(this)}return e.Extend(n,e.Observable),n.prototype.render=function(){var e=t('');return e.attr("dir",this.options.get("dir")),this.$dropdown=e},n.prototype.bind=function(){},n.prototype.position=function(e,t){},n.prototype.destroy=function(){this.$dropdown.remove()},n}),e.define("select2/dropdown/search",["jquery","../utils"],function(o,e){function t(){}return t.prototype.render=function(e){var t=e.call(this),n=o('');return this.$searchContainer=n,this.$search=n.find("input"),t.prepend(n),t},t.prototype.bind=function(e,t,n){var r=this,i=t.id+"-results";e.call(this,t,n),this.$search.on("keydown",function(e){r.trigger("keypress",e),r._keyUpPrevented=e.isDefaultPrevented()}),this.$search.on("input",function(e){o(this).off("keyup")}),this.$search.on("keyup input",function(e){r.handleSearch(e)}),t.on("open",function(){r.$search.attr("tabindex",0),r.$search.attr("aria-controls",i),r.$search.trigger("focus"),window.setTimeout(function(){r.$search.trigger("focus")},0)}),t.on("close",function(){r.$search.attr("tabindex",-1),r.$search.removeAttr("aria-controls"),r.$search.removeAttr("aria-activedescendant"),r.$search.val(""),r.$search.trigger("blur")}),t.on("focus",function(){t.isOpen()||r.$search.trigger("focus")}),t.on("results:all",function(e){null!=e.query.term&&""!==e.query.term||(r.showSearch(e)?r.$searchContainer.removeClass("select2-search--hide"):r.$searchContainer.addClass("select2-search--hide"))}),t.on("results:focus",function(e){e.data._resultId?r.$search.attr("aria-activedescendant",e.data._resultId):r.$search.removeAttr("aria-activedescendant")})},t.prototype.handleSearch=function(e){if(!this._keyUpPrevented){var t=this.$search.val();this.trigger("query",{term:t})}this._keyUpPrevented=!1},t.prototype.showSearch=function(e,t){return!0},t}),e.define("select2/dropdown/hidePlaceholder",[],function(){function e(e,t,n,r){this.placeholder=this.normalizePlaceholder(n.get("placeholder")),e.call(this,t,n,r)}return e.prototype.append=function(e,t){t.results=this.removePlaceholder(t.results),e.call(this,t)},e.prototype.normalizePlaceholder=function(e,t){return"string"==typeof t&&(t={id:"",text:t}),t},e.prototype.removePlaceholder=function(e,t){for(var n=t.slice(0),r=t.length-1;0<=r;r--){var i=t[r];this.placeholder.id===i.id&&n.splice(r,1)}return n},e}),e.define("select2/dropdown/infiniteScroll",["jquery"],function(n){function e(e,t,n,r){this.lastParams={},e.call(this,t,n,r),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return e.prototype.append=function(e,t){this.$loadingMore.remove(),this.loading=!1,e.call(this,t),this.showLoadingMore(t)&&(this.$results.append(this.$loadingMore),this.loadMoreIfNeeded())},e.prototype.bind=function(e,t,n){var r=this;e.call(this,t,n),t.on("query",function(e){r.lastParams=e,r.loading=!0}),t.on("query:append",function(e){r.lastParams=e,r.loading=!0}),this.$results.on("scroll",this.loadMoreIfNeeded.bind(this))},e.prototype.loadMoreIfNeeded=function(){var e=n.contains(document.documentElement,this.$loadingMore[0]);if(!this.loading&&e){var t=this.$results.offset().top+this.$results.outerHeight(!1);this.$loadingMore.offset().top+this.$loadingMore.outerHeight(!1)<=t+50&&this.loadMore()}},e.prototype.loadMore=function(){this.loading=!0;var e=n.extend({},{page:1},this.lastParams);e.page++,this.trigger("query:append",e)},e.prototype.showLoadingMore=function(e,t){return t.pagination&&t.pagination.more},e.prototype.createLoadingMore=function(){var e=n(''),t=this.options.get("translations").get("loadingMore");return e.html(t(this.lastParams)),e},e}),e.define("select2/dropdown/attachBody",["jquery","../utils"],function(f,a){function e(e,t,n){this.$dropdownParent=f(n.get("dropdownParent")||document.body),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){var r=this;e.call(this,t,n),t.on("open",function(){r._showDropdown(),r._attachPositioningHandler(t),r._bindContainerResultHandlers(t)}),t.on("close",function(){r._hideDropdown(),r._detachPositioningHandler(t)}),this.$dropdownContainer.on("mousedown",function(e){e.stopPropagation()})},e.prototype.destroy=function(e){e.call(this),this.$dropdownContainer.remove()},e.prototype.position=function(e,t,n){t.attr("class",n.attr("class")),t.removeClass("select2"),t.addClass("select2-container--open"),t.css({position:"absolute",top:-999999}),this.$container=n},e.prototype.render=function(e){var t=f(""),n=e.call(this);return t.append(n),this.$dropdownContainer=t},e.prototype._hideDropdown=function(e){this.$dropdownContainer.detach()},e.prototype._bindContainerResultHandlers=function(e,t){if(!this._containerResultsHandlersBound){var n=this;t.on("results:all",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("results:append",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("results:message",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("select",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("unselect",function(){n._positionDropdown(),n._resizeDropdown()}),this._containerResultsHandlersBound=!0}},e.prototype._attachPositioningHandler=function(e,t){var n=this,r="scroll.select2."+t.id,i="resize.select2."+t.id,o="orientationchange.select2."+t.id,s=this.$container.parents().filter(a.hasScroll);s.each(function(){a.StoreData(this,"select2-scroll-position",{x:f(this).scrollLeft(),y:f(this).scrollTop()})}),s.on(r,function(e){var t=a.GetData(this,"select2-scroll-position");f(this).scrollTop(t.y)}),f(window).on(r+" "+i+" "+o,function(e){n._positionDropdown(),n._resizeDropdown()})},e.prototype._detachPositioningHandler=function(e,t){var n="scroll.select2."+t.id,r="resize.select2."+t.id,i="orientationchange.select2."+t.id;this.$container.parents().filter(a.hasScroll).off(n),f(window).off(n+" "+r+" "+i)},e.prototype._positionDropdown=function(){var e=f(window),t=this.$dropdown.hasClass("select2-dropdown--above"),n=this.$dropdown.hasClass("select2-dropdown--below"),r=null,i=this.$container.offset();i.bottom=i.top+this.$container.outerHeight(!1);var o={height:this.$container.outerHeight(!1)};o.top=i.top,o.bottom=i.top+o.height;var s=this.$dropdown.outerHeight(!1),a=e.scrollTop(),l=e.scrollTop()+e.height(),c=a i.bottom+s,d={left:i.left,top:o.bottom},p=this.$dropdownParent;"static"===p.css("position")&&(p=p.offsetParent());var h={top:0,left:0};(f.contains(document.body,p[0])||p[0].isConnected)&&(h=p.offset()),d.top-=h.top,d.left-=h.left,t||n||(r="below"),u||!c||t?!c&&u&&t&&(r="below"):r="above",("above"==r||t&&"below"!==r)&&(d.top=o.top-h.top-s),null!=r&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+r),this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+r)),this.$dropdownContainer.css(d)},e.prototype._resizeDropdown=function(){var e={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(e.minWidth=e.width,e.position="relative",e.width="auto"),this.$dropdown.css(e)},e.prototype._showDropdown=function(e){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},e}),e.define("select2/dropdown/minimumResultsForSearch",[],function(){function e(e,t,n,r){this.minimumResultsForSearch=n.get("minimumResultsForSearch"),this.minimumResultsForSearch<0&&(this.minimumResultsForSearch=1/0),e.call(this,t,n,r)}return e.prototype.showSearch=function(e,t){return!(function e(t){for(var n=0,r=0;r ');return e.attr("dir",this.options.get("dir")),this.$container=e,this.$container.addClass("select2-container--"+this.options.get("theme")),u.StoreData(e[0],"element",this.$element),e},d}),e.define("jquery-mousewheel",["jquery"],function(e){return e}),e.define("jquery.select2",["jquery","jquery-mousewheel","./select2/core","./select2/defaults","./select2/utils"],function(i,e,o,t,s){if(null==i.fn.select2){var a=["open","close","destroy"];i.fn.select2=function(t){if("object"==typeof(t=t||{}))return this.each(function(){var e=i.extend(!0,{},t);new o(i(this),e)}),this;if("string"!=typeof t)throw new Error("Invalid arguments for Select2: "+t);var n,r=Array.prototype.slice.call(arguments,1);return this.each(function(){var e=s.GetData(this,"select2");null==e&&window.console&&console.error&&console.error("The select2('"+t+"') method was called on an element that is not using Select2."),n=e[t].apply(e,r)}),-1 ${response.msg} `); - setTimeout(function () { - $('.gitf_feedback').hide(); - location.reload(); - }, 3000); - } else { - $('.gitf_feedback').show(); - $('.gitf_feedback').html(` ${response.msg}
`); - setTimeout(function () { - $('.gitf_feedback').hide(); - // location.reload(); - }, 3000); - } - }, - error: function (err) { - $('.new_app').append(`يوجد مشكلة !!
`) - } - }); - }); -}) \ No newline at end of file diff --git a/odex25_ensan/takaful_portal_sponsor/static/js/sponsorship_creation.js b/odex25_ensan/takaful_portal_sponsor/static/js/sponsorship_creation.js deleted file mode 100644 index 4dba7344b..000000000 --- a/odex25_ensan/takaful_portal_sponsor/static/js/sponsorship_creation.js +++ /dev/null @@ -1,102 +0,0 @@ -$(document).ready(function () { - $(".widow_type").hide() - const urlSearchParams = new URLSearchParams(window.location.search); - const benefit_type = urlSearchParams.get("benefit_type"); - console.log(benefit_type); - const benefit_id = urlSearchParams.get("benefit_id"); - let benefit_type_input = $("#benefit_type_sponsorship") - let benefit_id_input = $("#benefit_id_sponsorship") - benefit_type_input.val(benefit_type); - benefit_id_input.val(benefit_id); - if (benefit_type_input.val() == 'orphan') { - $(".widow_type").hide() - } - else { - $(".widow_type").show() - } - - - $('#orphan_ids').on('change', function () { - var selectedOptions = $('#orphan_ids option:selected'); - $('#selected_options').empty(); // Clear the previous content - selectedOptions.each(function () { - var fullName = $(this).text().trim(); - var firstName = fullName.split(' ')[0]; - var spanElement = ` ${firstName} ` - $('#selected_options').append(spanElement); - }); - }); - - $(document).on('click', '.remove_btn', function () { - $(this).parent('span').remove(); - }); - - //show and hide gifter data depend on is_gift input - $('.gifter_data').hide(); - $('input[name="is_gift"]').change(function () { - if ($(this).val() === 'yes') { - $('.gifter_data').show(); - } else if ($(this).val() === 'no') { - - $('.gifter_data').hide(); - } - }); - $('.months_num').hide(); - $('#sponsorship_duration').change(function () { - if ($(this).val() === 'permanent') { - $('.months_num').hide(); - } else { - $('.months_num').show(); - } - }); - $('#months_number').on('input', function () { - var input1 = $(this).val(); - var input2 = $('#month_amount').val(); - $('#kafala_total').val(input1 * input2) - }); - - $('input[name="with_orphan"]').change(function () { - if ($(this).val() === 'yes') { - $('.isOrphan').show(); - } else if ($(this).val() === 'no') { - $('.isOrphan').hide(); - } - }); - - - let sponsorships_api = "/portal/sponsor/sponsorships/create/"; - $('form#single_sponsorship_form').on('submit', function (evt) { - evt.preventDefault(); - var form_data = $(this).serialize(); - $.ajax({ - type: "POST", - url: sponsorships_api, - data: form_data, - dataType: 'json', - processData: false, - success: function (response) { - console.log(response); - if (response.status === true) { - $('.sponsorship_creation_feedback').show(); - $('.sponsorship_creation_feedback').html(`${response.msg}
`); - setTimeout(function () { - $('.sponsorship_creation_feedback').hide(); - // location.reload(); - $('#SingleKafala').modal('hide'); - - }, 3000); - } else { - $('.sponsorship_creation_feedback').show(); - $('.sponsorship_creation_feedback').html(`${response.msg}
`); - setTimeout(function () { - // $('.sponsorship_creation_feedback').hide(); - // location.reload(); - }, 3000); - } - }, - error: function (err) { - $('.sponsorship_creation_feedback').append(`يوجد مشكلة !!
`) - } - }); - }); -}); diff --git a/odex25_ensan/takaful_portal_sponsor/static/js/sponsorship_gift.js b/odex25_ensan/takaful_portal_sponsor/static/js/sponsorship_gift.js deleted file mode 100644 index 7baa0e15d..000000000 --- a/odex25_ensan/takaful_portal_sponsor/static/js/sponsorship_gift.js +++ /dev/null @@ -1,40 +0,0 @@ -$(document).ready(function () { - const urlSearchParams = new URLSearchParams(window.location.search); - const benefit_id = urlSearchParams.get("benefit_id"); - $("#benefit_id").val(benefit_id); - let payment = "/portal/sponsor/paying_demo/save"; - $('form#gifter_form').on('submit', function (evt) { - evt.preventDefault(); - var form_data = $(this).serialize(); - $.ajax({ - type: "POST", - url: payment, - data: form_data, - dataType:'json', - processData: false, - success: function (response) { - console.log(response); - console.log(response.status); - console.log(response.msg); - if (response.status === true) { - $('.gitf_feedback').show(); - $('.gitf_feedback').html(`${response.msg}
`); - setTimeout(function () { - $('.gitf_feedback').hide(); - // location.reload(); - }, 3000); - } else { - $('.gitf_feedback').show(); - $('.gitf_feedback').html(`${response.msg}
`); - setTimeout(function () { - $('.gitf_feedback').hide(); - // location.reload(); - }, 3000); - } - }, - error: function (err) { - $('.new_app').html(`${err.msg}
`) - } - }); - }); -}) \ No newline at end of file diff --git a/odex25_ensan/takaful_portal_sponsor/static/js/sponsorship_needs_details.js b/odex25_ensan/takaful_portal_sponsor/static/js/sponsorship_needs_details.js deleted file mode 100644 index 97faffbdd..000000000 --- a/odex25_ensan/takaful_portal_sponsor/static/js/sponsorship_needs_details.js +++ /dev/null @@ -1,155 +0,0 @@ -$(document).ready(function () { - const urlSearchParams = new URLSearchParams(window.location.search); - const benefit_type = urlSearchParams.get("benefit_type"); - const benefit_id = urlSearchParams.get("benefit_id"); - // benefit details - $.ajax({ - url: `/portal/sponsor/benefit/info?benefit_type=${benefit_type}&benefit_id=${benefit_id}`, - type: 'GET', - dataType: 'json', - success: function (data) { - result = data.benefit; - if(benefit_type == 'widow'){ - windowOrphans = result.orphan_ids - } - console.log(result); - var html = ''; - if (data.status) { - console.log(result); - html += - ` -------- بيانات اليتيم -
---
-- -
-الاسم
- ${result.name} -- -
-الجنس
- ${result.gender} -- -
-السن
- ${result.age} -- -
-المدينة
- ${result.city_id} -- -
-رقم اليتيم
- ${result.number} -- -
-نوع الحالة
- ${result.benefit_type} ------ بيانات شخصية و إجتماعية -
---
-- -
-العائل الحالي
- ${result.responsible} -- -
-حالة السكن
- ${result.housing_status} -- -
-التعليم
- ${result.education_status} -- -
-المرحلة الدراسية
- ${result.education_level} -- -
-الصف الدراسي
- ${result.class_room} -- -
-الحالة الصحية
- ${result.health_status} -- -
-كم يحفظ من القران
- ${result.quran_parts} --- ` - $('.makfoul_data .need_sponsorship_details').html(html); - $("#gift_modal #name, #contribution_modal #name, #SingleKafala #name").val(result.name) - $("#gift_modal #number, #contribution_modal #number, #SingleKafala #number").val(result.number) - $("#gift_modal #benefit_type, #contribution_modal #benefit_type, #SingleKafala #benefit_type").val(result.benefit_type) - $(".need_sponsorship_name").append( ` اليتيم ${result.name} ` ) - $('#SingleKafala #month_amount').val(result.benefit_total_need) - - windowOrphans.forEach((element, i) => { - $('#orphan_ids').append( - - ` - - ` - ) - - }); - } - else { - console.log(data.msg); - } - }, - error: function (error) { - console.log(error); - } - }); -}) \ No newline at end of file diff --git a/odex25_ensan/takaful_portal_sponsor/static/js/sponsorships_needs.js b/odex25_ensan/takaful_portal_sponsor/static/js/sponsorships_needs.js deleted file mode 100644 index 3d36650ca..000000000 --- a/odex25_ensan/takaful_portal_sponsor/static/js/sponsorships_needs.js +++ /dev/null @@ -1,74 +0,0 @@ - -$(document).ready(function () { - var currentPage = 1; - var benefitType = 'orphan'; // Default value - var prev - var next - function loadNeedSponsorships(page) { - $.ajax({ - url: '/portal/sys/benefits/page/' + page, - type: 'GET', - data: { benefit_type: benefitType }, - dataType: 'json', - success: function (data) { - results = data.results; - console.log(results); - var html = ''; - if (data.status) { - results.forEach((element, i) => { - html += - ` ------ احتياجات اليتيم -
---
-- -
-نسبة الإحتياج
- ${result.benefit_needs_percent} % -- -
-احتياجات طارئة
- ${result.benefit_available_need} -- -
-متأخرات مالية
- ${result.benefit_arrears_value} -- -
-الاحتياج الشهري
- ${result.benefit_total_need} -- - ` - $('#benefit_ids').append(``) - }); - $('.need_sponsorship tbody').html(html); - next = data.next_page; - prev = (currentPage > 1) ? currentPage - 1 : null; - currentPage = page; - - } - else { - console.log(data.msg); - } - }, - error: function (error) { - console.log(error); - } - }); - } - loadNeedSponsorships(1); - function updateButtons(next, prev) { - $('#benefits-next').attr('disabled', (next == null)); - $('#benefits-prev').attr('disabled', (prev == null)); - } - - $('#benefit-type').change(function () { - benefitType = $(this).val(); - $('.financial_donation tbody tr #benefit_dtls').data("type", benefitType) - loadNeedSponsorships(1); - }); - $('#benefits-prev').click(function () { - loadNeedSponsorships(currentPage - 1); - updateButtons(next, prev) - - }); - $('#benefits-next').click(function () { - loadNeedSponsorships(currentPage + 1); - updateButtons(next, prev) - }); - -}) \ No newline at end of file diff --git a/odex25_ensan/takaful_portal_sponsor/static/js/sponsorships_pay.js b/odex25_ensan/takaful_portal_sponsor/static/js/sponsorships_pay.js deleted file mode 100644 index bb07849d5..000000000 --- a/odex25_ensan/takaful_portal_sponsor/static/js/sponsorships_pay.js +++ /dev/null @@ -1,75 +0,0 @@ -$(document).ready(function () { - var currentPage = 1; - var benefitType = 'orphan'; // Default value - var prev - function sponsorshipPay(page) { - $.ajax({ - url: '/portal/sponsor/sponsorships/page/' + page, - type: 'GET', - data: { benefit_type: benefitType }, - dataType: 'json', - success: function (data) { - results = data.results; - const filteredData = results.filter(item => item.month_count == 0); - console.log(filteredData); - var html = ''; - if (data.status) { - filteredData.forEach((element, i) => { - html += - ` -${i + 1} -${element.first_name} -${element.gender} -${element.age} -${element.city_id} -${element.benefit_type} -${element.benefit_needs_percent} % -- -- اكفلني الان --- - - ` - }); - $('.sponsorships_pay tbody').html(html); - next = data.next_page; - prev = (currentPage > 1) ? currentPage - 1 : null; - currentPage = page; - } - else { - console.log(data.msg); - } - }, - error: function (jqXHR, textStatus, errorThrown) { - console.log(textStatus + ': ' + errorThrown); - } - }); - } - sponsorshipPay(1); - sponsorshipsCancelation(1) - function updateButtons(next, prev) { - $('#benefits-next').attr('disabled', (next == null)); - $('#benefits-prev').attr('disabled', (prev == null)); - } - $('#benefit-type').change(function () { - benefitType = $(this).val(); - $('.financial_donation tbody tr').data("type", benefitType) - sponsorshipPay(1); - }); - $('#benefits-prev').click(function () { - sponsorshipPay(currentPage - 1); - updateButtons(next, prev) - - }); - $('#benefits-next').click(function () { - sponsorshipPay(currentPage + 1); - updateButtons(next, prev) - }); - -}); \ No newline at end of file diff --git a/odex25_ensan/takaful_portal_sponsor/static/libs/bootstrap3/bootstrap-theme.min.css b/odex25_ensan/takaful_portal_sponsor/static/libs/bootstrap3/bootstrap-theme.min.css deleted file mode 100644 index 69cc8f2ae..000000000 --- a/odex25_ensan/takaful_portal_sponsor/static/libs/bootstrap3/bootstrap-theme.min.css +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Bootstrap v3.3.7 (http://getbootstrap.com) - * Copyright 2011-2016 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:100% -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:100% -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:100% -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:100% -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:100% -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:100% -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-color:#2e6da4;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(-45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(-45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-webkit-linear-gradient(135deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(135deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(-45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} -/*# sourceMappingURL=bootstrap-theme.min.css.map */ \ No newline at end of file diff --git a/odex25_ensan/takaful_portal_sponsor/static/libs/bootstrap3/bootstrap.js b/odex25_ensan/takaful_portal_sponsor/static/libs/bootstrap3/bootstrap.js deleted file mode 100644 index 01fbbcbaa..000000000 --- a/odex25_ensan/takaful_portal_sponsor/static/libs/bootstrap3/bootstrap.js +++ /dev/null @@ -1,2363 +0,0 @@ -/*! - * Bootstrap v3.3.6 (http://getbootstrap.com) - * Copyright 2011-2015 Twitter, Inc. - * Licensed under the MIT license - */ - -if (typeof jQuery === 'undefined') { - throw new Error('Bootstrap\'s JavaScript requires jQuery') -} - -+function ($) { - 'use strict'; - var version = $.fn.jquery.split(' ')[0].split('.') - if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 2)) { - throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 3') - } -}(jQuery); - -/* ======================================================================== - * Bootstrap: transition.js v3.3.6 - * http://getbootstrap.com/javascript/#transitions - * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) - // ============================================================ - - function transitionEnd() { - var el = document.createElement('bootstrap') - - var transEndEventNames = { - WebkitTransition : 'webkitTransitionEnd', - MozTransition : 'transitionend', - OTransition : 'oTransitionEnd otransitionend', - transition : 'transitionend' - } - - for (var name in transEndEventNames) { - if (el.style[name] !== undefined) { - return { end: transEndEventNames[name] } - } - } - - return false // explicit for ie8 ( ._.) - } - - // http://blog.alexmaccaw.com/css-transitions - $.fn.emulateTransitionEnd = function (duration) { - var called = false - var $el = this - $(this).one('bsTransitionEnd', function () { called = true }) - var callback = function () { if (!called) $($el).trigger($.support.transition.end) } - setTimeout(callback, duration) - return this - } - - $(function () { - $.support.transition = transitionEnd() - - if (!$.support.transition) return - - $.event.special.bsTransitionEnd = { - bindType: $.support.transition.end, - delegateType: $.support.transition.end, - handle: function (e) { - if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments) - } - } - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: alert.js v3.3.6 - * http://getbootstrap.com/javascript/#alerts - * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // ALERT CLASS DEFINITION - // ====================== - - var dismiss = '[data-dismiss="alert"]' - var Alert = function (el) { - $(el).on('click', dismiss, this.close) - } - - Alert.VERSION = '3.3.6' - - Alert.TRANSITION_DURATION = 150 - - Alert.prototype.close = function (e) { - var $this = $(this) - var selector = $this.attr('data-target') - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 - } - - var $parent = $(selector) - - if (e) e.preventDefault() - - if (!$parent.length) { - $parent = $this.closest('.alert') - } - - $parent.trigger(e = $.Event('close.bs.alert')) - - if (e.isDefaultPrevented()) return - - $parent.removeClass('in') - - function removeElement() { - // detach from parent, fire event then clean up data - $parent.detach().trigger('closed.bs.alert').remove() - } - - $.support.transition && $parent.hasClass('fade') ? - $parent - .one('bsTransitionEnd', removeElement) - .emulateTransitionEnd(Alert.TRANSITION_DURATION) : - removeElement() - } - - - // ALERT PLUGIN DEFINITION - // ======================= - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.alert') - - if (!data) $this.data('bs.alert', (data = new Alert(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - var old = $.fn.alert - - $.fn.alert = Plugin - $.fn.alert.Constructor = Alert - - - // ALERT NO CONFLICT - // ================= - - $.fn.alert.noConflict = function () { - $.fn.alert = old - return this - } - - - // ALERT DATA-API - // ============== - - $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: button.js v3.3.6 - * http://getbootstrap.com/javascript/#buttons - * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // BUTTON PUBLIC CLASS DEFINITION - // ============================== - - var Button = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, Button.DEFAULTS, options) - this.isLoading = false - } - - Button.VERSION = '3.3.6' - - Button.DEFAULTS = { - loadingText: 'loading...' - } - - Button.prototype.setState = function (state) { - var d = 'disabled' - var $el = this.$element - var val = $el.is('input') ? 'val' : 'html' - var data = $el.data() - - state += 'Text' - - if (data.resetText == null) $el.data('resetText', $el[val]()) - - // push to event loop to allow forms to submit - setTimeout($.proxy(function () { - $el[val](data[state] == null ? this.options[state] : data[state]) - - if (state == 'loadingText') { - this.isLoading = true - $el.addClass(d).attr(d, d) - } else if (this.isLoading) { - this.isLoading = false - $el.removeClass(d).removeAttr(d) - } - }, this), 0) - } - - Button.prototype.toggle = function () { - var changed = true - var $parent = this.$element.closest('[data-toggle="buttons"]') - - if ($parent.length) { - var $input = this.$element.find('input') - if ($input.prop('type') == 'radio') { - if ($input.prop('checked')) changed = false - $parent.find('.active').removeClass('active') - this.$element.addClass('active') - } else if ($input.prop('type') == 'checkbox') { - if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false - this.$element.toggleClass('active') - } - $input.prop('checked', this.$element.hasClass('active')) - if (changed) $input.trigger('change') - } else { - this.$element.attr('aria-pressed', !this.$element.hasClass('active')) - this.$element.toggleClass('active') - } - } - - - // BUTTON PLUGIN DEFINITION - // ======================== - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.button') - var options = typeof option == 'object' && option - - if (!data) $this.data('bs.button', (data = new Button(this, options))) - - if (option == 'toggle') data.toggle() - else if (option) data.setState(option) - }) - } - - var old = $.fn.button - - $.fn.button = Plugin - $.fn.button.Constructor = Button - - - // BUTTON NO CONFLICT - // ================== - - $.fn.button.noConflict = function () { - $.fn.button = old - return this - } - - - // BUTTON DATA-API - // =============== - - $(document) - .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) { - var $btn = $(e.target) - if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') - Plugin.call($btn, 'toggle') - if (!($(e.target).is('input[type="radio"]') || $(e.target).is('input[type="checkbox"]'))) e.preventDefault() - }) - .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) { - $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type)) - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: carousel.js v3.3.6 - * http://getbootstrap.com/javascript/#carousel - * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // CAROUSEL CLASS DEFINITION - // ========================= - - var Carousel = function (element, options) { - this.$element = $(element) - this.$indicators = this.$element.find('.carousel-indicators') - this.options = options - this.paused = null - this.sliding = null - this.interval = null - this.$active = null - this.$items = null - - this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this)) - - this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element - .on('mouseenter.bs.carousel', $.proxy(this.pause, this)) - .on('mouseleave.bs.carousel', $.proxy(this.cycle, this)) - } - - Carousel.VERSION = '3.3.6' - - Carousel.TRANSITION_DURATION = 600 - - Carousel.DEFAULTS = { - interval: 5000, - pause: 'hover', - wrap: true, - keyboard: true - } - - Carousel.prototype.keydown = function (e) { - if (/input|textarea/i.test(e.target.tagName)) return - switch (e.which) { - case 37: this.prev(); break - case 39: this.next(); break - default: return - } - - e.preventDefault() - } - - Carousel.prototype.cycle = function (e) { - e || (this.paused = false) - - this.interval && clearInterval(this.interval) - - this.options.interval - && !this.paused - && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) - - return this - } - - Carousel.prototype.getItemIndex = function (item) { - this.$items = item.parent().children('.item') - return this.$items.index(item || this.$active) - } - - Carousel.prototype.getItemForDirection = function (direction, active) { - var activeIndex = this.getItemIndex(active) - var willWrap = (direction == 'prev' && activeIndex === 0) - || (direction == 'next' && activeIndex == (this.$items.length - 1)) - if (willWrap && !this.options.wrap) return active - var delta = direction == 'prev' ? -1 : 1 - var itemIndex = (activeIndex + delta) % this.$items.length - return this.$items.eq(itemIndex) - } - - Carousel.prototype.to = function (pos) { - var that = this - var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active')) - - if (pos > (this.$items.length - 1) || pos < 0) return - - if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid" - if (activeIndex == pos) return this.pause().cycle() - - return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos)) - } - - Carousel.prototype.pause = function (e) { - e || (this.paused = true) - - if (this.$element.find('.next, .prev').length && $.support.transition) { - this.$element.trigger($.support.transition.end) - this.cycle(true) - } - - this.interval = clearInterval(this.interval) - - return this - } - - Carousel.prototype.next = function () { - if (this.sliding) return - return this.slide('next') - } - - Carousel.prototype.prev = function () { - if (this.sliding) return - return this.slide('prev') - } - - Carousel.prototype.slide = function (type, next) { - var $active = this.$element.find('.item.active') - var $next = next || this.getItemForDirection(type, $active) - var isCycling = this.interval - var direction = type == 'next' ? 'left' : 'right' - var that = this - - if ($next.hasClass('active')) return (this.sliding = false) - - var relatedTarget = $next[0] - var slideEvent = $.Event('slide.bs.carousel', { - relatedTarget: relatedTarget, - direction: direction - }) - this.$element.trigger(slideEvent) - if (slideEvent.isDefaultPrevented()) return - - this.sliding = true - - isCycling && this.pause() - - if (this.$indicators.length) { - this.$indicators.find('.active').removeClass('active') - var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)]) - $nextIndicator && $nextIndicator.addClass('active') - } - - var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid" - if ($.support.transition && this.$element.hasClass('slide')) { - $next.addClass(type) - $next[0].offsetWidth // force reflow - $active.addClass(direction) - $next.addClass(direction) - $active - .one('bsTransitionEnd', function () { - $next.removeClass([type, direction].join(' ')).addClass('active') - $active.removeClass(['active', direction].join(' ')) - that.sliding = false - setTimeout(function () { - that.$element.trigger(slidEvent) - }, 0) - }) - .emulateTransitionEnd(Carousel.TRANSITION_DURATION) - } else { - $active.removeClass('active') - $next.addClass('active') - this.sliding = false - this.$element.trigger(slidEvent) - } - - isCycling && this.cycle() - - return this - } - - - // CAROUSEL PLUGIN DEFINITION - // ========================== - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.carousel') - var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) - var action = typeof option == 'string' ? option : options.slide - - if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) - if (typeof option == 'number') data.to(option) - else if (action) data[action]() - else if (options.interval) data.pause().cycle() - }) - } - - var old = $.fn.carousel - - $.fn.carousel = Plugin - $.fn.carousel.Constructor = Carousel - - - // CAROUSEL NO CONFLICT - // ==================== - - $.fn.carousel.noConflict = function () { - $.fn.carousel = old - return this - } - - - // CAROUSEL DATA-API - // ================= - - var clickHandler = function (e) { - var href - var $this = $(this) - var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7 - if (!$target.hasClass('carousel')) return - var options = $.extend({}, $target.data(), $this.data()) - var slideIndex = $this.attr('data-slide-to') - if (slideIndex) options.interval = false - - Plugin.call($target, options) - - if (slideIndex) { - $target.data('bs.carousel').to(slideIndex) - } - - e.preventDefault() - } - - $(document) - .on('click.bs.carousel.data-api', '[data-slide]', clickHandler) - .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler) - - $(window).on('load', function () { - $('[data-ride="carousel"]').each(function () { - var $carousel = $(this) - Plugin.call($carousel, $carousel.data()) - }) - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: collapse.js v3.3.6 - * http://getbootstrap.com/javascript/#collapse - * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // COLLAPSE PUBLIC CLASS DEFINITION - // ================================ - - var Collapse = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, Collapse.DEFAULTS, options) - this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' + - '[data-toggle="collapse"][data-target="#' + element.id + '"]') - this.transitioning = null - - if (this.options.parent) { - this.$parent = this.getParent() - } else { - this.addAriaAndCollapsedClass(this.$element, this.$trigger) - } - - if (this.options.toggle) this.toggle() - } - - Collapse.VERSION = '3.3.6' - - Collapse.TRANSITION_DURATION = 350 - - Collapse.DEFAULTS = { - toggle: true - } - - Collapse.prototype.dimension = function () { - var hasWidth = this.$element.hasClass('width') - return hasWidth ? 'width' : 'height' - } - - Collapse.prototype.show = function () { - if (this.transitioning || this.$element.hasClass('in')) return - - var activesData - var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing') - - if (actives && actives.length) { - activesData = actives.data('bs.collapse') - if (activesData && activesData.transitioning) return - } - - var startEvent = $.Event('show.bs.collapse') - this.$element.trigger(startEvent) - if (startEvent.isDefaultPrevented()) return - - if (actives && actives.length) { - Plugin.call(actives, 'hide') - activesData || actives.data('bs.collapse', null) - } - - var dimension = this.dimension() - - this.$element - .removeClass('collapse') - .addClass('collapsing')[dimension](0) - .attr('aria-expanded', true) - - this.$trigger - .removeClass('collapsed') - .attr('aria-expanded', true) - - this.transitioning = 1 - - var complete = function () { - this.$element - .removeClass('collapsing') - .addClass('collapse in')[dimension]('') - this.transitioning = 0 - this.$element - .trigger('shown.bs.collapse') - } - - if (!$.support.transition) return complete.call(this) - - var scrollSize = $.camelCase(['scroll', dimension].join('-')) - - this.$element - .one('bsTransitionEnd', $.proxy(complete, this)) - .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize]) - } - - Collapse.prototype.hide = function () { - if (this.transitioning || !this.$element.hasClass('in')) return - - var startEvent = $.Event('hide.bs.collapse') - this.$element.trigger(startEvent) - if (startEvent.isDefaultPrevented()) return - - var dimension = this.dimension() - - this.$element[dimension](this.$element[dimension]())[0].offsetHeight - - this.$element - .addClass('collapsing') - .removeClass('collapse in') - .attr('aria-expanded', false) - - this.$trigger - .addClass('collapsed') - .attr('aria-expanded', false) - - this.transitioning = 1 - - var complete = function () { - this.transitioning = 0 - this.$element - .removeClass('collapsing') - .addClass('collapse') - .trigger('hidden.bs.collapse') - } - - if (!$.support.transition) return complete.call(this) - - this.$element - [dimension](0) - .one('bsTransitionEnd', $.proxy(complete, this)) - .emulateTransitionEnd(Collapse.TRANSITION_DURATION) - } - - Collapse.prototype.toggle = function () { - this[this.$element.hasClass('in') ? 'hide' : 'show']() - } - - Collapse.prototype.getParent = function () { - return $(this.options.parent) - .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]') - .each($.proxy(function (i, element) { - var $element = $(element) - this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element) - }, this)) - .end() - } - - Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) { - var isOpen = $element.hasClass('in') - - $element.attr('aria-expanded', isOpen) - $trigger - .toggleClass('collapsed', !isOpen) - .attr('aria-expanded', isOpen) - } - - function getTargetFromTrigger($trigger) { - var href - var target = $trigger.attr('data-target') - || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7 - - return $(target) - } - - - // COLLAPSE PLUGIN DEFINITION - // ========================== - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.collapse') - var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) - - if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false - if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - var old = $.fn.collapse - - $.fn.collapse = Plugin - $.fn.collapse.Constructor = Collapse - - - // COLLAPSE NO CONFLICT - // ==================== - - $.fn.collapse.noConflict = function () { - $.fn.collapse = old - return this - } - - - // COLLAPSE DATA-API - // ================= - - $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) { - var $this = $(this) - - if (!$this.attr('data-target')) e.preventDefault() - - var $target = getTargetFromTrigger($this) - var data = $target.data('bs.collapse') - var option = data ? 'toggle' : $this.data() - - Plugin.call($target, option) - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: dropdown.js v3.3.6 - * http://getbootstrap.com/javascript/#dropdowns - * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // DROPDOWN CLASS DEFINITION - // ========================= - - var backdrop = '.dropdown-backdrop' - var toggle = '[data-toggle="dropdown"]' - var Dropdown = function (element) { - $(element).on('click.bs.dropdown', this.toggle) - } - - Dropdown.VERSION = '3.3.6' - - function getParent($this) { - var selector = $this.attr('data-target') - - if (!selector) { - selector = $this.attr('href') - selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 - } - - var $parent = selector && $(selector) - - return $parent && $parent.length ? $parent : $this.parent() - } - - function clearMenus(e) { - if (e && e.which === 3) return - $(backdrop).remove() - $(toggle).each(function () { - var $this = $(this) - var $parent = getParent($this) - var relatedTarget = { relatedTarget: this } - - if (!$parent.hasClass('open')) return - - if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return - - $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget)) - - if (e.isDefaultPrevented()) return - - $this.attr('aria-expanded', 'false') - $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget)) - }) - } - - Dropdown.prototype.toggle = function (e) { - var $this = $(this) - - if ($this.is('.disabled, :disabled')) return - - var $parent = getParent($this) - var isActive = $parent.hasClass('open') - - clearMenus() - - if (!isActive) { - if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { - // if mobile we use a backdrop because click events don't delegate - $(document.createElement('div')) - .addClass('dropdown-backdrop') - .insertAfter($(this)) - .on('click', clearMenus) - } - - var relatedTarget = { relatedTarget: this } - $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget)) - - if (e.isDefaultPrevented()) return - - $this - .trigger('focus') - .attr('aria-expanded', 'true') - - $parent - .toggleClass('open') - .trigger($.Event('shown.bs.dropdown', relatedTarget)) - } - - return false - } - - Dropdown.prototype.keydown = function (e) { - if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return - - var $this = $(this) - - e.preventDefault() - e.stopPropagation() - - if ($this.is('.disabled, :disabled')) return - - var $parent = getParent($this) - var isActive = $parent.hasClass('open') - - if (!isActive && e.which != 27 || isActive && e.which == 27) { - if (e.which == 27) $parent.find(toggle).trigger('focus') - return $this.trigger('click') - } - - var desc = ' li:not(.disabled):visible a' - var $items = $parent.find('.dropdown-menu' + desc) - - if (!$items.length) return - - var index = $items.index(e.target) - - if (e.which == 38 && index > 0) index-- // up - if (e.which == 40 && index < $items.length - 1) index++ // down - if (!~index) index = 0 - - $items.eq(index).trigger('focus') - } - - - // DROPDOWN PLUGIN DEFINITION - // ========================== - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.dropdown') - - if (!data) $this.data('bs.dropdown', (data = new Dropdown(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - var old = $.fn.dropdown - - $.fn.dropdown = Plugin - $.fn.dropdown.Constructor = Dropdown - - - // DROPDOWN NO CONFLICT - // ==================== - - $.fn.dropdown.noConflict = function () { - $.fn.dropdown = old - return this - } - - - // APPLY TO STANDARD DROPDOWN ELEMENTS - // =================================== - - $(document) - .on('click.bs.dropdown.data-api', clearMenus) - .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) - .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle) - .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown) - .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: modal.js v3.3.6 - * http://getbootstrap.com/javascript/#modals - * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // MODAL CLASS DEFINITION - // ====================== - - var Modal = function (element, options) { - this.options = options - this.$body = $(document.body) - this.$element = $(element) - this.$dialog = this.$element.find('.modal-dialog') - this.$backdrop = null - this.isShown = null - this.originalBodyPad = null - this.scrollbarWidth = 0 - this.ignoreBackdropClick = false - - if (this.options.remote) { - this.$element - .find('.modal-content') - .load(this.options.remote, $.proxy(function () { - this.$element.trigger('loaded.bs.modal') - }, this)) - } - } - - Modal.VERSION = '3.3.6' - - Modal.TRANSITION_DURATION = 300 - Modal.BACKDROP_TRANSITION_DURATION = 150 - - Modal.DEFAULTS = { - backdrop: true, - keyboard: true, - show: true - } - - Modal.prototype.toggle = function (_relatedTarget) { - return this.isShown ? this.hide() : this.show(_relatedTarget) - } - - Modal.prototype.show = function (_relatedTarget) { - var that = this - var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget }) - - this.$element.trigger(e) - - if (this.isShown || e.isDefaultPrevented()) return - - this.isShown = true - - this.checkScrollbar() - this.setScrollbar() - this.$body.addClass('modal-open') - - this.escape() - this.resize() - - this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this)) - - this.$dialog.on('mousedown.dismiss.bs.modal', function () { - that.$element.one('mouseup.dismiss.bs.modal', function (e) { - if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true - }) - }) - - this.backdrop(function () { - var transition = $.support.transition && that.$element.hasClass('fade') - - if (!that.$element.parent().length) { - that.$element.appendTo(that.$body) // don't move modals dom position - } - - that.$element - .show() - .scrollTop(0) - - that.adjustDialog() - - if (transition) { - that.$element[0].offsetWidth // force reflow - } - - that.$element.addClass('in') - - that.enforceFocus() - - var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget }) - - transition ? - that.$dialog // wait for modal to slide in - .one('bsTransitionEnd', function () { - that.$element.trigger('focus').trigger(e) - }) - .emulateTransitionEnd(Modal.TRANSITION_DURATION) : - that.$element.trigger('focus').trigger(e) - }) - } - - Modal.prototype.hide = function (e) { - if (e) e.preventDefault() - - e = $.Event('hide.bs.modal') - - this.$element.trigger(e) - - if (!this.isShown || e.isDefaultPrevented()) return - - this.isShown = false - - this.escape() - this.resize() - - $(document).off('focusin.bs.modal') - - this.$element - .removeClass('in') - .off('click.dismiss.bs.modal') - .off('mouseup.dismiss.bs.modal') - - this.$dialog.off('mousedown.dismiss.bs.modal') - - $.support.transition && this.$element.hasClass('fade') ? - this.$element - .one('bsTransitionEnd', $.proxy(this.hideModal, this)) - .emulateTransitionEnd(Modal.TRANSITION_DURATION) : - this.hideModal() - } - - Modal.prototype.enforceFocus = function () { - $(document) - .off('focusin.bs.modal') // guard against infinite focus loop - .on('focusin.bs.modal', $.proxy(function (e) { - if (this.$element[0] !== e.target && !this.$element.has(e.target).length) { - this.$element.trigger('focus') - } - }, this)) - } - - Modal.prototype.escape = function () { - if (this.isShown && this.options.keyboard) { - this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) { - e.which == 27 && this.hide() - }, this)) - } else if (!this.isShown) { - this.$element.off('keydown.dismiss.bs.modal') - } - } - - Modal.prototype.resize = function () { - if (this.isShown) { - $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this)) - } else { - $(window).off('resize.bs.modal') - } - } - - Modal.prototype.hideModal = function () { - var that = this - this.$element.hide() - this.backdrop(function () { - that.$body.removeClass('modal-open') - that.resetAdjustments() - that.resetScrollbar() - that.$element.trigger('hidden.bs.modal') - }) - } - - Modal.prototype.removeBackdrop = function () { - this.$backdrop && this.$backdrop.remove() - this.$backdrop = null - } - - Modal.prototype.backdrop = function (callback) { - var that = this - var animate = this.$element.hasClass('fade') ? 'fade' : '' - - if (this.isShown && this.options.backdrop) { - var doAnimate = $.support.transition && animate - - this.$backdrop = $(document.createElement('div')) - .addClass('modal-backdrop ' + animate) - .appendTo(this.$body) - - this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) { - if (this.ignoreBackdropClick) { - this.ignoreBackdropClick = false - return - } - if (e.target !== e.currentTarget) return - this.options.backdrop == 'static' - ? this.$element[0].focus() - : this.hide() - }, this)) - - if (doAnimate) this.$backdrop[0].offsetWidth // force reflow - - this.$backdrop.addClass('in') - - if (!callback) return - - doAnimate ? - this.$backdrop - .one('bsTransitionEnd', callback) - .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : - callback() - - } else if (!this.isShown && this.$backdrop) { - this.$backdrop.removeClass('in') - - var callbackRemove = function () { - that.removeBackdrop() - callback && callback() - } - $.support.transition && this.$element.hasClass('fade') ? - this.$backdrop - .one('bsTransitionEnd', callbackRemove) - .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : - callbackRemove() - - } else if (callback) { - callback() - } - } - - // these following methods are used to handle overflowing modals - - Modal.prototype.handleUpdate = function () { - this.adjustDialog() - } - - Modal.prototype.adjustDialog = function () { - var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight - - this.$element.css({ - paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '', - paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : '' - }) - } - - Modal.prototype.resetAdjustments = function () { - this.$element.css({ - paddingLeft: '', - paddingRight: '' - }) - } - - Modal.prototype.checkScrollbar = function () { - var fullWindowWidth = window.innerWidth - if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8 - var documentElementRect = document.documentElement.getBoundingClientRect() - fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left) - } - this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth - this.scrollbarWidth = this.measureScrollbar() - } - - Modal.prototype.setScrollbar = function () { - var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10) - this.originalBodyPad = document.body.style.paddingRight || '' - if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth) - } - - Modal.prototype.resetScrollbar = function () { - this.$body.css('padding-right', this.originalBodyPad) - } - - Modal.prototype.measureScrollbar = function () { // thx walsh - var scrollDiv = document.createElement('div') - scrollDiv.className = 'modal-scrollbar-measure' - this.$body.append(scrollDiv) - var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth - this.$body[0].removeChild(scrollDiv) - return scrollbarWidth - } - - - // MODAL PLUGIN DEFINITION - // ======================= - - function Plugin(option, _relatedTarget) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.modal') - var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option) - - if (!data) $this.data('bs.modal', (data = new Modal(this, options))) - if (typeof option == 'string') data[option](_relatedTarget) - else if (options.show) data.show(_relatedTarget) - }) - } - - var old = $.fn.modal - - $.fn.modal = Plugin - $.fn.modal.Constructor = Modal - - - // MODAL NO CONFLICT - // ================= - - $.fn.modal.noConflict = function () { - $.fn.modal = old - return this - } - - - // MODAL DATA-API - // ============== - - $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) { - var $this = $(this) - var href = $this.attr('href') - var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7 - var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data()) - - if ($this.is('a')) e.preventDefault() - - $target.one('show.bs.modal', function (showEvent) { - if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown - $target.one('hidden.bs.modal', function () { - $this.is(':visible') && $this.trigger('focus') - }) - }) - Plugin.call($target, option, this) - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: tooltip.js v3.3.6 - * http://getbootstrap.com/javascript/#tooltip - * Inspired by the original jQuery.tipsy by Jason Frame - * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // TOOLTIP PUBLIC CLASS DEFINITION - // =============================== - - var Tooltip = function (element, options) { - this.type = null - this.options = null - this.enabled = null - this.timeout = null - this.hoverState = null - this.$element = null - this.inState = null - - this.init('tooltip', element, options) - } - - Tooltip.VERSION = '3.3.6' - - Tooltip.TRANSITION_DURATION = 150 - - Tooltip.DEFAULTS = { - animation: true, - placement: 'top', - selector: false, - template: '${i + 1} -${element.benefit_id.name} -${element.benefit_id.gender} -${element.benefit_id.age} -${element.benefit_id.city_id} -${element.benefit_id.benefit_type} -${element.benefit_id.benefit_needs_percent} % -${element.benefit_id.benefit_arrears_value} -${element.start_date} -- -- بحاجة للتجديد - سداد --', - trigger: 'hover focus', - title: '', - delay: 0, - html: false, - container: false, - viewport: { - selector: 'body', - padding: 0 - } - } - - Tooltip.prototype.init = function (type, element, options) { - this.enabled = true - this.type = type - this.$element = $(element) - this.options = this.getOptions(options) - this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport)) - this.inState = { click: false, hover: false, focus: false } - - if (this.$element[0] instanceof document.constructor && !this.options.selector) { - throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!') - } - - var triggers = this.options.trigger.split(' ') - - for (var i = triggers.length; i--;) { - var trigger = triggers[i] - - if (trigger == 'click') { - this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) - } else if (trigger != 'manual') { - var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin' - var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout' - - this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) - this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) - } - } - - this.options.selector ? - (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : - this.fixTitle() - } - - Tooltip.prototype.getDefaults = function () { - return Tooltip.DEFAULTS - } - - Tooltip.prototype.getOptions = function (options) { - options = $.extend({}, this.getDefaults(), this.$element.data(), options) - - if (options.delay && typeof options.delay == 'number') { - options.delay = { - show: options.delay, - hide: options.delay - } - } - - return options - } - - Tooltip.prototype.getDelegateOptions = function () { - var options = {} - var defaults = this.getDefaults() - - this._options && $.each(this._options, function (key, value) { - if (defaults[key] != value) options[key] = value - }) - - return options - } - - Tooltip.prototype.enter = function (obj) { - var self = obj instanceof this.constructor ? - obj : $(obj.currentTarget).data('bs.' + this.type) - - if (!self) { - self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) - $(obj.currentTarget).data('bs.' + this.type, self) - } - - if (obj instanceof $.Event) { - self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true - } - - if (self.tip().hasClass('in') || self.hoverState == 'in') { - self.hoverState = 'in' - return - } - - clearTimeout(self.timeout) - - self.hoverState = 'in' - - if (!self.options.delay || !self.options.delay.show) return self.show() - - self.timeout = setTimeout(function () { - if (self.hoverState == 'in') self.show() - }, self.options.delay.show) - } - - Tooltip.prototype.isInStateTrue = function () { - for (var key in this.inState) { - if (this.inState[key]) return true - } - - return false - } - - Tooltip.prototype.leave = function (obj) { - var self = obj instanceof this.constructor ? - obj : $(obj.currentTarget).data('bs.' + this.type) - - if (!self) { - self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) - $(obj.currentTarget).data('bs.' + this.type, self) - } - - if (obj instanceof $.Event) { - self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false - } - - if (self.isInStateTrue()) return - - clearTimeout(self.timeout) - - self.hoverState = 'out' - - if (!self.options.delay || !self.options.delay.hide) return self.hide() - - self.timeout = setTimeout(function () { - if (self.hoverState == 'out') self.hide() - }, self.options.delay.hide) - } - - Tooltip.prototype.show = function () { - var e = $.Event('show.bs.' + this.type) - - if (this.hasContent() && this.enabled) { - this.$element.trigger(e) - - var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0]) - if (e.isDefaultPrevented() || !inDom) return - var that = this - - var $tip = this.tip() - - var tipId = this.getUID(this.type) - - this.setContent() - $tip.attr('id', tipId) - this.$element.attr('aria-describedby', tipId) - - if (this.options.animation) $tip.addClass('fade') - - var placement = typeof this.options.placement == 'function' ? - this.options.placement.call(this, $tip[0], this.$element[0]) : - this.options.placement - - var autoToken = /\s?auto?\s?/i - var autoPlace = autoToken.test(placement) - if (autoPlace) placement = placement.replace(autoToken, '') || 'top' - - $tip - .detach() - .css({ top: 0, left: 0, display: 'block' }) - .addClass(placement) - .data('bs.' + this.type, this) - - this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element) - this.$element.trigger('inserted.bs.' + this.type) - - var pos = this.getPosition() - var actualWidth = $tip[0].offsetWidth - var actualHeight = $tip[0].offsetHeight - - if (autoPlace) { - var orgPlacement = placement - var viewportDim = this.getPosition(this.$viewport) - - placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top' : - placement == 'top' && pos.top - actualHeight < viewportDim.top ? 'bottom' : - placement == 'right' && pos.right + actualWidth > viewportDim.width ? 'left' : - placement == 'left' && pos.left - actualWidth < viewportDim.left ? 'right' : - placement - - $tip - .removeClass(orgPlacement) - .addClass(placement) - } - - var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight) - - this.applyPlacement(calculatedOffset, placement) - - var complete = function () { - var prevHoverState = that.hoverState - that.$element.trigger('shown.bs.' + that.type) - that.hoverState = null - - if (prevHoverState == 'out') that.leave(that) - } - - $.support.transition && this.$tip.hasClass('fade') ? - $tip - .one('bsTransitionEnd', complete) - .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : - complete() - } - } - - Tooltip.prototype.applyPlacement = function (offset, placement) { - var $tip = this.tip() - var width = $tip[0].offsetWidth - var height = $tip[0].offsetHeight - - // manually read margins because getBoundingClientRect includes difference - var marginTop = parseInt($tip.css('margin-top'), 10) - var marginLeft = parseInt($tip.css('margin-left'), 10) - - // we must check for NaN for ie 8/9 - if (isNaN(marginTop)) marginTop = 0 - if (isNaN(marginLeft)) marginLeft = 0 - - offset.top += marginTop - offset.left += marginLeft - - // $.fn.offset doesn't round pixel values - // so we use setOffset directly with our own function B-0 - $.offset.setOffset($tip[0], $.extend({ - using: function (props) { - $tip.css({ - top: Math.round(props.top), - left: Math.round(props.left) - }) - } - }, offset), 0) - - $tip.addClass('in') - - // check to see if placing tip in new offset caused the tip to resize itself - var actualWidth = $tip[0].offsetWidth - var actualHeight = $tip[0].offsetHeight - - if (placement == 'top' && actualHeight != height) { - offset.top = offset.top + height - actualHeight - } - - var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight) - - if (delta.left) offset.left += delta.left - else offset.top += delta.top - - var isVertical = /top|bottom/.test(placement) - var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight - var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight' - - $tip.offset(offset) - this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical) - } - - Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) { - this.arrow() - .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%') - .css(isVertical ? 'top' : 'left', '') - } - - Tooltip.prototype.setContent = function () { - var $tip = this.tip() - var title = this.getTitle() - - $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title) - $tip.removeClass('fade in top bottom left right') - } - - Tooltip.prototype.hide = function (callback) { - var that = this - var $tip = $(this.$tip) - var e = $.Event('hide.bs.' + this.type) - - function complete() { - if (that.hoverState != 'in') $tip.detach() - that.$element - .removeAttr('aria-describedby') - .trigger('hidden.bs.' + that.type) - callback && callback() - } - - this.$element.trigger(e) - - if (e.isDefaultPrevented()) return - - $tip.removeClass('in') - - $.support.transition && $tip.hasClass('fade') ? - $tip - .one('bsTransitionEnd', complete) - .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : - complete() - - this.hoverState = null - - return this - } - - Tooltip.prototype.fixTitle = function () { - var $e = this.$element - if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') { - $e.attr('data-original-title', $e.attr('title') || '').attr('title', '') - } - } - - Tooltip.prototype.hasContent = function () { - return this.getTitle() - } - - Tooltip.prototype.getPosition = function ($element) { - $element = $element || this.$element - - var el = $element[0] - var isBody = el.tagName == 'BODY' - - var elRect = el.getBoundingClientRect() - if (elRect.width == null) { - // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093 - elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top }) - } - var elOffset = isBody ? { top: 0, left: 0 } : $element.offset() - var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() } - var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null - - return $.extend({}, elRect, scroll, outerDims, elOffset) - } - - Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) { - return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } : - placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } : - placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } : - /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width } - - } - - Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) { - var delta = { top: 0, left: 0 } - if (!this.$viewport) return delta - - var viewportPadding = this.options.viewport && this.options.viewport.padding || 0 - var viewportDimensions = this.getPosition(this.$viewport) - - if (/right|left/.test(placement)) { - var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll - var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight - if (topEdgeOffset < viewportDimensions.top) { // top overflow - delta.top = viewportDimensions.top - topEdgeOffset - } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow - delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset - } - } else { - var leftEdgeOffset = pos.left - viewportPadding - var rightEdgeOffset = pos.left + viewportPadding + actualWidth - if (leftEdgeOffset < viewportDimensions.left) { // left overflow - delta.left = viewportDimensions.left - leftEdgeOffset - } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow - delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset - } - } - - return delta - } - - Tooltip.prototype.getTitle = function () { - var title - var $e = this.$element - var o = this.options - - title = $e.attr('data-original-title') - || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) - - return title - } - - Tooltip.prototype.getUID = function (prefix) { - do prefix += ~~(Math.random() * 1000000) - while (document.getElementById(prefix)) - return prefix - } - - Tooltip.prototype.tip = function () { - if (!this.$tip) { - this.$tip = $(this.options.template) - if (this.$tip.length != 1) { - throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!') - } - } - return this.$tip - } - - Tooltip.prototype.arrow = function () { - return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')) - } - - Tooltip.prototype.enable = function () { - this.enabled = true - } - - Tooltip.prototype.disable = function () { - this.enabled = false - } - - Tooltip.prototype.toggleEnabled = function () { - this.enabled = !this.enabled - } - - Tooltip.prototype.toggle = function (e) { - var self = this - if (e) { - self = $(e.currentTarget).data('bs.' + this.type) - if (!self) { - self = new this.constructor(e.currentTarget, this.getDelegateOptions()) - $(e.currentTarget).data('bs.' + this.type, self) - } - } - - if (e) { - self.inState.click = !self.inState.click - if (self.isInStateTrue()) self.enter(self) - else self.leave(self) - } else { - self.tip().hasClass('in') ? self.leave(self) : self.enter(self) - } - } - - Tooltip.prototype.destroy = function () { - var that = this - clearTimeout(this.timeout) - this.hide(function () { - that.$element.off('.' + that.type).removeData('bs.' + that.type) - if (that.$tip) { - that.$tip.detach() - } - that.$tip = null - that.$arrow = null - that.$viewport = null - }) - } - - - // TOOLTIP PLUGIN DEFINITION - // ========================= - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.tooltip') - var options = typeof option == 'object' && option - - if (!data && /destroy|hide/.test(option)) return - if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - var old = $.fn.tooltip - - $.fn.tooltip = Plugin - $.fn.tooltip.Constructor = Tooltip - - - // TOOLTIP NO CONFLICT - // =================== - - $.fn.tooltip.noConflict = function () { - $.fn.tooltip = old - return this - } - -}(jQuery); - -/* ======================================================================== - * Bootstrap: popover.js v3.3.6 - * http://getbootstrap.com/javascript/#popovers - * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // POPOVER PUBLIC CLASS DEFINITION - // =============================== - - var Popover = function (element, options) { - this.init('popover', element, options) - } - - if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js') - - Popover.VERSION = '3.3.6' - - Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, { - placement: 'right', - trigger: 'click', - content: '', - template: '' - }) - - - // NOTE: POPOVER EXTENDS tooltip.js - // ================================ - - Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype) - - Popover.prototype.constructor = Popover - - Popover.prototype.getDefaults = function () { - return Popover.DEFAULTS - } - - Popover.prototype.setContent = function () { - var $tip = this.tip() - var title = this.getTitle() - var content = this.getContent() - - $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title) - $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events - this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text' - ](content) - - $tip.removeClass('fade top bottom left right in') - - // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do - // this manually by checking the contents. - if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide() - } - - Popover.prototype.hasContent = function () { - return this.getTitle() || this.getContent() - } - - Popover.prototype.getContent = function () { - var $e = this.$element - var o = this.options - - return $e.attr('data-content') - || (typeof o.content == 'function' ? - o.content.call($e[0]) : - o.content) - } - - Popover.prototype.arrow = function () { - return (this.$arrow = this.$arrow || this.tip().find('.arrow')) - } - - - // POPOVER PLUGIN DEFINITION - // ========================= - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.popover') - var options = typeof option == 'object' && option - - if (!data && /destroy|hide/.test(option)) return - if (!data) $this.data('bs.popover', (data = new Popover(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - var old = $.fn.popover - - $.fn.popover = Plugin - $.fn.popover.Constructor = Popover - - - // POPOVER NO CONFLICT - // =================== - - $.fn.popover.noConflict = function () { - $.fn.popover = old - return this - } - -}(jQuery); - -/* ======================================================================== - * Bootstrap: scrollspy.js v3.3.6 - * http://getbootstrap.com/javascript/#scrollspy - * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // SCROLLSPY CLASS DEFINITION - // ========================== - - function ScrollSpy(element, options) { - this.$body = $(document.body) - this.$scrollElement = $(element).is(document.body) ? $(window) : $(element) - this.options = $.extend({}, ScrollSpy.DEFAULTS, options) - this.selector = (this.options.target || '') + ' .nav li > a' - this.offsets = [] - this.targets = [] - this.activeTarget = null - this.scrollHeight = 0 - - this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this)) - this.refresh() - this.process() - } - - ScrollSpy.VERSION = '3.3.6' - - ScrollSpy.DEFAULTS = { - offset: 10 - } - - ScrollSpy.prototype.getScrollHeight = function () { - return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight) - } - - ScrollSpy.prototype.refresh = function () { - var that = this - var offsetMethod = 'offset' - var offsetBase = 0 - - this.offsets = [] - this.targets = [] - this.scrollHeight = this.getScrollHeight() - - if (!$.isWindow(this.$scrollElement[0])) { - offsetMethod = 'position' - offsetBase = this.$scrollElement.scrollTop() - } - - this.$body - .find(this.selector) - .map(function () { - var $el = $(this) - var href = $el.data('target') || $el.attr('href') - var $href = /^#./.test(href) && $(href) - - return ($href - && $href.length - && $href.is(':visible') - && [[$href[offsetMethod]().top + offsetBase, href]]) || null - }) - .sort(function (a, b) { return a[0] - b[0] }) - .each(function () { - that.offsets.push(this[0]) - that.targets.push(this[1]) - }) - } - - ScrollSpy.prototype.process = function () { - var scrollTop = this.$scrollElement.scrollTop() + this.options.offset - var scrollHeight = this.getScrollHeight() - var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height() - var offsets = this.offsets - var targets = this.targets - var activeTarget = this.activeTarget - var i - - if (this.scrollHeight != scrollHeight) { - this.refresh() - } - - if (scrollTop >= maxScroll) { - return activeTarget != (i = targets[targets.length - 1]) && this.activate(i) - } - - if (activeTarget && scrollTop < offsets[0]) { - this.activeTarget = null - return this.clear() - } - - for (i = offsets.length; i--;) { - activeTarget != targets[i] - && scrollTop >= offsets[i] - && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1]) - && this.activate(targets[i]) - } - } - - ScrollSpy.prototype.activate = function (target) { - this.activeTarget = target - - this.clear() - - var selector = this.selector + - '[data-target="' + target + '"],' + - this.selector + '[href="' + target + '"]' - - var active = $(selector) - .parents('li') - .addClass('active') - - if (active.parent('.dropdown-menu').length) { - active = active - .closest('li.dropdown') - .addClass('active') - } - - active.trigger('activate.bs.scrollspy') - } - - ScrollSpy.prototype.clear = function () { - $(this.selector) - .parentsUntil(this.options.target, '.active') - .removeClass('active') - } - - - // SCROLLSPY PLUGIN DEFINITION - // =========================== - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.scrollspy') - var options = typeof option == 'object' && option - - if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - var old = $.fn.scrollspy - - $.fn.scrollspy = Plugin - $.fn.scrollspy.Constructor = ScrollSpy - - - // SCROLLSPY NO CONFLICT - // ===================== - - $.fn.scrollspy.noConflict = function () { - $.fn.scrollspy = old - return this - } - - - // SCROLLSPY DATA-API - // ================== - - $(window).on('load.bs.scrollspy.data-api', function () { - $('[data-spy="scroll"]').each(function () { - var $spy = $(this) - Plugin.call($spy, $spy.data()) - }) - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: tab.js v3.3.6 - * http://getbootstrap.com/javascript/#tabs - * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // TAB CLASS DEFINITION - // ==================== - - var Tab = function (element) { - // jscs:disable requireDollarBeforejQueryAssignment - this.element = $(element) - // jscs:enable requireDollarBeforejQueryAssignment - } - - Tab.VERSION = '3.3.6' - - Tab.TRANSITION_DURATION = 150 - - Tab.prototype.show = function () { - var $this = this.element - var $ul = $this.closest('ul:not(.dropdown-menu)') - var selector = $this.data('target') - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 - } - - if ($this.parent('li').hasClass('active')) return - - var $previous = $ul.find('.active:last a') - var hideEvent = $.Event('hide.bs.tab', { - relatedTarget: $this[0] - }) - var showEvent = $.Event('show.bs.tab', { - relatedTarget: $previous[0] - }) - - $previous.trigger(hideEvent) - $this.trigger(showEvent) - - if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return - - var $target = $(selector) - - this.activate($this.closest('li'), $ul) - this.activate($target, $target.parent(), function () { - $previous.trigger({ - type: 'hidden.bs.tab', - relatedTarget: $this[0] - }) - $this.trigger({ - type: 'shown.bs.tab', - relatedTarget: $previous[0] - }) - }) - } - - Tab.prototype.activate = function (element, container, callback) { - var $active = container.find('> .active') - var transition = callback - && $.support.transition - && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length) - - function next() { - $active - .removeClass('active') - .find('> .dropdown-menu > .active') - .removeClass('active') - .end() - .find('[data-toggle="tab"]') - .attr('aria-expanded', false) - - element - .addClass('active') - .find('[data-toggle="tab"]') - .attr('aria-expanded', true) - - if (transition) { - element[0].offsetWidth // reflow for transition - element.addClass('in') - } else { - element.removeClass('fade') - } - - if (element.parent('.dropdown-menu').length) { - element - .closest('li.dropdown') - .addClass('active') - .end() - .find('[data-toggle="tab"]') - .attr('aria-expanded', true) - } - - callback && callback() - } - - $active.length && transition ? - $active - .one('bsTransitionEnd', next) - .emulateTransitionEnd(Tab.TRANSITION_DURATION) : - next() - - $active.removeClass('in') - } - - - // TAB PLUGIN DEFINITION - // ===================== - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.tab') - - if (!data) $this.data('bs.tab', (data = new Tab(this))) - if (typeof option == 'string') data[option]() - }) - } - - var old = $.fn.tab - - $.fn.tab = Plugin - $.fn.tab.Constructor = Tab - - - // TAB NO CONFLICT - // =============== - - $.fn.tab.noConflict = function () { - $.fn.tab = old - return this - } - - - // TAB DATA-API - // ============ - - var clickHandler = function (e) { - e.preventDefault() - Plugin.call($(this), 'show') - } - - $(document) - .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler) - .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: affix.js v3.3.6 - * http://getbootstrap.com/javascript/#affix - * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // AFFIX CLASS DEFINITION - // ====================== - - var Affix = function (element, options) { - this.options = $.extend({}, Affix.DEFAULTS, options) - - this.$target = $(this.options.target) - .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this)) - .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this)) - - this.$element = $(element) - this.affixed = null - this.unpin = null - this.pinnedOffset = null - - this.checkPosition() - } - - Affix.VERSION = '3.3.6' - - Affix.RESET = 'affix affix-top affix-bottom' - - Affix.DEFAULTS = { - offset: 0, - target: window - } - - Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) { - var scrollTop = this.$target.scrollTop() - var position = this.$element.offset() - var targetHeight = this.$target.height() - - if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false - - if (this.affixed == 'bottom') { - if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom' - return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom' - } - - var initializing = this.affixed == null - var colliderTop = initializing ? scrollTop : position.top - var colliderHeight = initializing ? targetHeight : height - - if (offsetTop != null && scrollTop <= offsetTop) return 'top' - if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom' - - return false - } - - Affix.prototype.getPinnedOffset = function () { - if (this.pinnedOffset) return this.pinnedOffset - this.$element.removeClass(Affix.RESET).addClass('affix') - var scrollTop = this.$target.scrollTop() - var position = this.$element.offset() - return (this.pinnedOffset = position.top - scrollTop) - } - - Affix.prototype.checkPositionWithEventLoop = function () { - setTimeout($.proxy(this.checkPosition, this), 1) - } - - Affix.prototype.checkPosition = function () { - if (!this.$element.is(':visible')) return - - var height = this.$element.height() - var offset = this.options.offset - var offsetTop = offset.top - var offsetBottom = offset.bottom - var scrollHeight = Math.max($(document).height(), $(document.body).height()) - - if (typeof offset != 'object') offsetBottom = offsetTop = offset - if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element) - if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element) - - var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom) - - if (this.affixed != affix) { - if (this.unpin != null) this.$element.css('top', '') - - var affixType = 'affix' + (affix ? '-' + affix : '') - var e = $.Event(affixType + '.bs.affix') - - this.$element.trigger(e) - - if (e.isDefaultPrevented()) return - - this.affixed = affix - this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null - - this.$element - .removeClass(Affix.RESET) - .addClass(affixType) - .trigger(affixType.replace('affix', 'affixed') + '.bs.affix') - } - - if (affix == 'bottom') { - this.$element.offset({ - top: scrollHeight - height - offsetBottom - }) - } - } - - - // AFFIX PLUGIN DEFINITION - // ======================= - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.affix') - var options = typeof option == 'object' && option - - if (!data) $this.data('bs.affix', (data = new Affix(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - var old = $.fn.affix - - $.fn.affix = Plugin - $.fn.affix.Constructor = Affix - - - // AFFIX NO CONFLICT - // ================= - - $.fn.affix.noConflict = function () { - $.fn.affix = old - return this - } - - - // AFFIX DATA-API - // ============== - - $(window).on('load', function () { - $('[data-spy="affix"]').each(function () { - var $spy = $(this) - var data = $spy.data() - - data.offset = data.offset || {} - - if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom - if (data.offsetTop != null) data.offset.top = data.offsetTop - - Plugin.call($spy, data) - }) - }) - -}(jQuery); diff --git a/odex25_ensan/takaful_portal_sponsor/static/libs/bootstrap3/bootstrap.min.css b/odex25_ensan/takaful_portal_sponsor/static/libs/bootstrap3/bootstrap.min.css deleted file mode 100644 index 6a8dab392..000000000 --- a/odex25_ensan/takaful_portal_sponsor/static/libs/bootstrap3/bootstrap.min.css +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Bootstrap v3.3.7 (http://getbootstrap.com) - * Copyright 2011-2016 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e054"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e052"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e058"}.glyphicon-indent-right:before{content:"\e057"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e080"}.glyphicon-chevron-right:before{content:"\e079"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e092"}.glyphicon-arrow-right:before{content:"\e091"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e128"}.glyphicon-hand-left:before{content:"\e127"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e132"}.glyphicon-circle-arrow-left:before{content:"\e131"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e249"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e247"}.glyphicon-triangle-right:before{content:"\e251"}.glyphicon-triangle-left:before{content:"\e250"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e258"}.glyphicon-menu-right:before{content:"\e257"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:right}.text-right{text-align:left}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-right:0;list-style:none}.list-inline{padding-right:0;margin-right:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-right:0}@media (min-width:768px){.dl-horizontal dt{float:right;width:160px;overflow:hidden;clear:right;text-align:left;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-right:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-right:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:0;padding-left:15px;text-align:left;border-right:0;border-left:5px solid #eee}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:right}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{left:100%}.col-xs-pull-11{left:91.66666667%}.col-xs-pull-10{left:83.33333333%}.col-xs-pull-9{left:75%}.col-xs-pull-8{left:66.66666667%}.col-xs-pull-7{left:58.33333333%}.col-xs-pull-6{left:50%}.col-xs-pull-5{left:41.66666667%}.col-xs-pull-4{left:33.33333333%}.col-xs-pull-3{left:25%}.col-xs-pull-2{left:16.66666667%}.col-xs-pull-1{left:8.33333333%}.col-xs-pull-0{left:auto}.col-xs-push-12{right:100%}.col-xs-push-11{right:91.66666667%}.col-xs-push-10{right:83.33333333%}.col-xs-push-9{right:75%}.col-xs-push-8{right:66.66666667%}.col-xs-push-7{right:58.33333333%}.col-xs-push-6{right:50%}.col-xs-push-5{right:41.66666667%}.col-xs-push-4{right:33.33333333%}.col-xs-push-3{right:25%}.col-xs-push-2{right:16.66666667%}.col-xs-push-1{right:8.33333333%}.col-xs-push-0{right:auto}.col-xs-offset-12{margin-right:100%}.col-xs-offset-11{margin-right:91.66666667%}.col-xs-offset-10{margin-right:83.33333333%}.col-xs-offset-9{margin-right:75%}.col-xs-offset-8{margin-right:66.66666667%}.col-xs-offset-7{margin-right:58.33333333%}.col-xs-offset-6{margin-right:50%}.col-xs-offset-5{margin-right:41.66666667%}.col-xs-offset-4{margin-right:33.33333333%}.col-xs-offset-3{margin-right:25%}.col-xs-offset-2{margin-right:16.66666667%}.col-xs-offset-1{margin-right:8.33333333%}.col-xs-offset-0{margin-right:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:right}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{left:100%}.col-sm-pull-11{left:91.66666667%}.col-sm-pull-10{left:83.33333333%}.col-sm-pull-9{left:75%}.col-sm-pull-8{left:66.66666667%}.col-sm-pull-7{left:58.33333333%}.col-sm-pull-6{left:50%}.col-sm-pull-5{left:41.66666667%}.col-sm-pull-4{left:33.33333333%}.col-sm-pull-3{left:25%}.col-sm-pull-2{left:16.66666667%}.col-sm-pull-1{left:8.33333333%}.col-sm-pull-0{left:auto}.col-sm-push-12{right:100%}.col-sm-push-11{right:91.66666667%}.col-sm-push-10{right:83.33333333%}.col-sm-push-9{right:75%}.col-sm-push-8{right:66.66666667%}.col-sm-push-7{right:58.33333333%}.col-sm-push-6{right:50%}.col-sm-push-5{right:41.66666667%}.col-sm-push-4{right:33.33333333%}.col-sm-push-3{right:25%}.col-sm-push-2{right:16.66666667%}.col-sm-push-1{right:8.33333333%}.col-sm-push-0{right:auto}.col-sm-offset-12{margin-right:100%}.col-sm-offset-11{margin-right:91.66666667%}.col-sm-offset-10{margin-right:83.33333333%}.col-sm-offset-9{margin-right:75%}.col-sm-offset-8{margin-right:66.66666667%}.col-sm-offset-7{margin-right:58.33333333%}.col-sm-offset-6{margin-right:50%}.col-sm-offset-5{margin-right:41.66666667%}.col-sm-offset-4{margin-right:33.33333333%}.col-sm-offset-3{margin-right:25%}.col-sm-offset-2{margin-right:16.66666667%}.col-sm-offset-1{margin-right:8.33333333%}.col-sm-offset-0{margin-right:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:right}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{left:100%}.col-md-pull-11{left:91.66666667%}.col-md-pull-10{left:83.33333333%}.col-md-pull-9{left:75%}.col-md-pull-8{left:66.66666667%}.col-md-pull-7{left:58.33333333%}.col-md-pull-6{left:50%}.col-md-pull-5{left:41.66666667%}.col-md-pull-4{left:33.33333333%}.col-md-pull-3{left:25%}.col-md-pull-2{left:16.66666667%}.col-md-pull-1{left:8.33333333%}.col-md-pull-0{left:auto}.col-md-push-12{right:100%}.col-md-push-11{right:91.66666667%}.col-md-push-10{right:83.33333333%}.col-md-push-9{right:75%}.col-md-push-8{right:66.66666667%}.col-md-push-7{right:58.33333333%}.col-md-push-6{right:50%}.col-md-push-5{right:41.66666667%}.col-md-push-4{right:33.33333333%}.col-md-push-3{right:25%}.col-md-push-2{right:16.66666667%}.col-md-push-1{right:8.33333333%}.col-md-push-0{right:auto}.col-md-offset-12{margin-right:100%}.col-md-offset-11{margin-right:91.66666667%}.col-md-offset-10{margin-right:83.33333333%}.col-md-offset-9{margin-right:75%}.col-md-offset-8{margin-right:66.66666667%}.col-md-offset-7{margin-right:58.33333333%}.col-md-offset-6{margin-right:50%}.col-md-offset-5{margin-right:41.66666667%}.col-md-offset-4{margin-right:33.33333333%}.col-md-offset-3{margin-right:25%}.col-md-offset-2{margin-right:16.66666667%}.col-md-offset-1{margin-right:8.33333333%}.col-md-offset-0{margin-right:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:right}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{left:100%}.col-lg-pull-11{left:91.66666667%}.col-lg-pull-10{left:83.33333333%}.col-lg-pull-9{left:75%}.col-lg-pull-8{left:66.66666667%}.col-lg-pull-7{left:58.33333333%}.col-lg-pull-6{left:50%}.col-lg-pull-5{left:41.66666667%}.col-lg-pull-4{left:33.33333333%}.col-lg-pull-3{left:25%}.col-lg-pull-2{left:16.66666667%}.col-lg-pull-1{left:8.33333333%}.col-lg-pull-0{left:auto}.col-lg-push-12{right:100%}.col-lg-push-11{right:91.66666667%}.col-lg-push-10{right:83.33333333%}.col-lg-push-9{right:75%}.col-lg-push-8{right:66.66666667%}.col-lg-push-7{right:58.33333333%}.col-lg-push-6{right:50%}.col-lg-push-5{right:41.66666667%}.col-lg-push-4{right:33.33333333%}.col-lg-push-3{right:25%}.col-lg-push-2{right:16.66666667%}.col-lg-push-1{right:8.33333333%}.col-lg-push-0{right:auto}.col-lg-offset-12{margin-right:100%}.col-lg-offset-11{margin-right:91.66666667%}.col-lg-offset-10{margin-right:83.33333333%}.col-lg-offset-9{margin-right:75%}.col-lg-offset-8{margin-right:66.66666667%}.col-lg-offset-7{margin-right:58.33333333%}.col-lg-offset-6{margin-right:50%}.col-lg-offset-5{margin-right:41.66666667%}.col-lg-offset-4{margin-right:33.33333333%}.col-lg-offset-3{margin-right:25%}.col-lg-offset-2{margin-right:16.66666667%}.col-lg-offset-1{margin-right:8.33333333%}.col-lg-offset-0{margin-right:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:right}th{text-align:right}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-right:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-left:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-right:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-right:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-right:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-right:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-left:42.5px}.form-control-feedback{position:absolute;top:0;left:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-right:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-right:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:left}}.form-horizontal .has-feedback .form-control-feedback{left:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-right:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;right:0;z-index:1000;display:none;float:right;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:right;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:auto;left:0}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:auto;left:0}.dropdown-menu-left{right:0;left:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:auto;left:0}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:auto;left:0}.navbar-right .dropdown-menu-left{right:0;left:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:right}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-right:-1px}.btn-toolbar{margin-right:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:right}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-right:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-right:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group{float:right}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-right:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-right:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{right:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:right;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:first-child{border-left:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:last-child{border-right:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-right:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-left:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-right:-1px}.nav{padding-right:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:right;margin-bottom:-1px}.nav-tabs>li>a{margin-left:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;right:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-left:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:right}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-right:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-right:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;right:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-left:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:right}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:right;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-right:-15px}}.navbar-toggle{position:relative;float:left;padding:9px 10px;margin-top:8px;margin-bottom:8px;margin-left:15px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 25px 5px 15px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:right;margin:0}.navbar-nav>li{float:right}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-right:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-right:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:right;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:right!important}.navbar-right{float:left!important;margin-left:-15px}.navbar-right~.navbar-right{margin-left:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-right:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:right;padding:6px 12px;margin-right:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-right:0;border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pager{padding-right:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:left}.pager .previous>a,.pager .previous>span{float:right}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:left}.list-group-item>.badge+.badge{margin-left:5px}.nav-pills>li>a>.badge{margin-right:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-left:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;left:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:100% 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:100% 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:100% 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:right;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(-45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(-45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-webkit-linear-gradient(135deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(135deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(-45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(-45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(-45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-webkit-linear-gradient(135deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(135deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(-45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(-45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(-45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-webkit-linear-gradient(135deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(135deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(-45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(-45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(-45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-webkit-linear-gradient(135deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(135deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(-45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(-45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(-45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-webkit-linear-gradient(135deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(135deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(-45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-right:10px}.media-left,.media>.pull-left{padding-left:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-right:0;list-style:none}.list-group{padding-right:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:right}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-left-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-right:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-left:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;right:0;bottom:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:left;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:left;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-right:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-right:-1px}.modal-footer .btn-block+.btn-block{margin-right:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:right;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-right:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-right:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{right:50%;bottom:0;margin-right:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.left .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.bottom .tooltip-arrow{top:0;right:50%;margin-right:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;right:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:right;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-right:10px}.popover.bottom{margin-top:10px}.popover.left{margin-right:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{right:50%;bottom:-11px;margin-right:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-right:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.right>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.popover.bottom>.arrow{top:-11px;right:50%;margin-right:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-right:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.left>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out right;-o-transition:.6s ease-in-out right;transition:.6s ease-in-out right}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{right:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{right:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{right:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{right:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{right:100%}.carousel-inner>.prev{right:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{right:0}.carousel-inner>.active.left{right:-100%}.carousel-inner>.active.right{right:100%}.carousel-control{position:absolute;top:0;right:0;bottom:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,right top,left top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:auto;left:0;background-image:-webkit-linear-gradient(right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,right top,left top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{right:50%;margin-right:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;right:50%;bottom:10px;z-index:15;width:60%;padding-right:0;margin-right:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-right:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-left:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:left!important}.pull-left{float:right!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} -/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/odex25_ensan/takaful_portal_sponsor/static/libs/bootstrap3/bootstrap.min.js b/odex25_ensan/takaful_portal_sponsor/static/libs/bootstrap3/bootstrap.min.js deleted file mode 100644 index e79c06513..000000000 --- a/odex25_ensan/takaful_portal_sponsor/static/libs/bootstrap3/bootstrap.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v3.3.6 (http://getbootstrap.com) - * Copyright 2011-2015 Twitter, Inc. - * Licensed under the MIT license - */ -if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1||b[0]>2)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 3")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.6",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.6",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),a(c.target).is('input[type="radio"]')||a(c.target).is('input[type="checkbox"]')||c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.6",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.6",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",f)))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.6",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger(a.Event("shown.bs.dropdown",h))}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&jdocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),c.isInStateTrue()?void 0:(clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide())},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-m o.width?"left":"left"==h&&k.left-l g.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j g.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.6",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:' '}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.6",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b=e[a]&&(void 0===e[a+1]||b .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.6",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); \ No newline at end of file diff --git a/odex25_ensan/takaful_portal_sponsor/static/libs/bootstrap3/jquery.min.js b/odex25_ensan/takaful_portal_sponsor/static/libs/bootstrap3/jquery.min.js deleted file mode 100644 index b0ecaddee..000000000 --- a/odex25_ensan/takaful_portal_sponsor/static/libs/bootstrap3/jquery.min.js +++ /dev/null @@ -1,5 +0,0 @@ -/*! jQuery v1.12.4 | (c) jQuery Foundation | jquery.org/license */ -!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="1.12.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!k.call(a,"constructor")&&!k.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(!l.ownFirst)for(b in a)return k.call(a,b);for(b in a);return void 0===b||k.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(h)return h.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=e.call(arguments,2),d=function(){return a.apply(b||this,c.concat(e.call(arguments)))},d.guid=a.guid=a.guid||n.guid++,d):void 0},now:function(){return+new Date},support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;e>b;b++)if(n.contains(d[b],this))return!0}));for(b=0;e>b;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}if(f=d.getElementById(e[2]),f&&f.parentNode){if(f.id!==e[2])return A.find(a);this.length=1,this[0]=f}return this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||(e=n.uniqueSort(e)),D.test(a)&&(e=e.reverse())),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h -1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=!0,c||j.disable(),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.addEventListener?(d.removeEventListener("DOMContentLoaded",K),a.removeEventListener("load",K)):(d.detachEvent("onreadystatechange",K),a.detachEvent("onload",K))}function K(){(d.addEventListener||"load"===a.event.type||"complete"===d.readyState)&&(J(),n.ready())}n.ready.promise=function(b){if(!I)if(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll)a.setTimeout(n.ready);else if(d.addEventListener)d.addEventListener("DOMContentLoaded",K),a.addEventListener("load",K);else{d.attachEvent("onreadystatechange",K),a.attachEvent("onload",K);var c=!1;try{c=null==a.frameElement&&d.documentElement}catch(e){}c&&c.doScroll&&!function f(){if(!n.isReady){try{c.doScroll("left")}catch(b){return a.setTimeout(f,50)}J(),n.ready()}}()}return I.promise(b)},n.ready.promise();var L;for(L in n(l))break;l.ownFirst="0"===L,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c,e;c=d.getElementsByTagName("body")[0],c&&c.style&&(b=d.createElement("div"),e=d.createElement("div"),e.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(e).appendChild(b),"undefined"!=typeof b.style.zoom&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",l.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(e))}),function(){var a=d.createElement("div");l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}a=null}();var M=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b},N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(O,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}n.data(a,b,c)}else c=void 0; -}return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(M(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),"object"!=typeof b&&"function"!=typeof b||(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f}}function S(a,b,c){if(M(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=void 0)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},Z=/^(?:checkbox|radio)$/i,$=/<([\w:-]+)/,_=/^$|\/(?:java|ecma)script/i,aa=/^\s+/,ba="abbr|article|aside|audio|bdi|canvas|data|datalist|details|dialog|figcaption|figure|footer|header|hgroup|main|mark|meter|nav|output|picture|progress|section|summary|template|time|video";function ca(a){var b=ba.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}!function(){var a=d.createElement("div"),b=d.createDocumentFragment(),c=d.createElement("input");a.innerHTML=" a",l.leadingWhitespace=3===a.firstChild.nodeType,l.tbody=!a.getElementsByTagName("tbody").length,l.htmlSerialize=!!a.getElementsByTagName("link").length,l.html5Clone="<:nav>"!==d.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,b.appendChild(c),l.appendChecked=c.checked,a.innerHTML="",l.noCloneChecked=!!a.cloneNode(!0).lastChild.defaultValue,b.appendChild(a),c=d.createElement("input"),c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),a.appendChild(c),l.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!!a.addEventListener,a[n.expando]=1,l.attributes=!a.getAttribute(n.expando)}();var da={option:[1,""],legend:[1,""],area:[1,""],param:[1,""],thead:[1,"
","
"],tr:[2,"","
"],col:[2,""],td:[3,"
"," "],_default:l.htmlSerialize?[0,"",""]:[1,"X
"," ",""]};da.optgroup=da.option,da.tbody=da.tfoot=da.colgroup=da.caption=da.thead,da.th=da.td;function ea(a,b){var c,d,e=0,f="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,ea(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function fa(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}var ga=/<|?\w+;/,ha=/r;r++)if(g=a[r],g||0===g)if("object"===n.type(g))n.merge(q,g.nodeType?[g]:g);else if(ga.test(g)){i=i||p.appendChild(b.createElement("div")),j=($.exec(g)||["",""])[1].toLowerCase(),m=da[j]||da._default,i.innerHTML=m[1]+n.htmlPrefilter(g)+m[2],f=m[0];while(f--)i=i.lastChild;if(!l.leadingWhitespace&&aa.test(g)&&q.push(b.createTextNode(aa.exec(g)[0])),!l.tbody){g="table"!==j||ha.test(g)?"