From 1ebd82c59a457b79c5cb15b18f89f660ed95231d Mon Sep 17 00:00:00 2001 From: younes Date: Thu, 21 Aug 2025 15:58:50 +0100 Subject: [PATCH] [IMP] Benefit --- odex25_ensan/odex_benefit/i18n/ar_001.po | 38 ++++++++++- odex25_ensan/odex_benefit/models/benefit.py | 67 +++++++++++-------- .../odex_benefit/models/family_members.py | 15 ++++- 3 files changed, 91 insertions(+), 29 deletions(-) diff --git a/odex25_ensan/odex_benefit/i18n/ar_001.po b/odex25_ensan/odex_benefit/i18n/ar_001.po index ee044393e..2e0b3bef0 100644 --- a/odex25_ensan/odex_benefit/i18n/ar_001.po +++ b/odex25_ensan/odex_benefit/i18n/ar_001.po @@ -5239,16 +5239,20 @@ 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 "الاسم الاول للأب" @@ -5263,16 +5267,20 @@ 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 "الاسم الثالث للأب" @@ -7891,7 +7899,9 @@ msgid "Member Family Name" msgstr "اسم العائلة" #. module: odex_benefit +#: code:addons/odex_benefit/models/family_members.py:0 #: model:ir.model.fields,field_description:odex_benefit.field_family_member__member_first_name +#, python-format msgid "Member First Name" msgstr "الاسم الأول" @@ -8181,7 +8191,9 @@ msgid "Mother Marital" msgstr "الحالة الاجتماعية" #. module: odex_benefit +#: code:addons/odex_benefit/models/benefit.py:0 #: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__mother_name +#, python-format msgid "Mother Name" msgstr "الاسم الأول للأم" @@ -8201,8 +8213,10 @@ msgid "Mother Relationn" msgstr "الصلة" #. module: odex_benefit +#: code:addons/odex_benefit/models/benefit.py:0 #: model:ir.model.fields,field_description:odex_benefit.field_family_member__mother_second_name #: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__mother_second_name +#, python-format msgid "Mother Second Name" msgstr "الاسم الثاني للأم" @@ -8212,8 +8226,10 @@ msgid "Mother Status" msgstr "حالة الأم" #. module: odex_benefit +#: code:addons/odex_benefit/models/benefit.py:0 #: model:ir.model.fields,field_description:odex_benefit.field_family_member__mother_third_name #: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__mother_third_name +#, python-format msgid "Mother Third Name" msgstr "الاسم الثالث للأم" @@ -8223,8 +8239,10 @@ msgid "Mother-Orphan" msgstr "" #. module: odex_benefit +#: code:addons/odex_benefit/models/benefit.py:0 #: model:ir.model.fields,field_description:odex_benefit.field_family_member__mother_family_name #: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__mother_family_name +#, python-format msgid "MotherFamily Name" msgstr "اسم عائلة الأم" @@ -9843,7 +9861,9 @@ msgid "Replacement Mother Birth Date" msgstr "تاريخ ميلاد الام البديلة" #. module: odex_benefit +#: code:addons/odex_benefit/models/benefit.py:0 #: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__replacement_mother_family_name +#, python-format msgid "Replacement Mother Family Name" msgstr "اسم العائلة" @@ -9868,7 +9888,9 @@ msgid "Replacement Mother Marital" msgstr "الحالة الاجتماعية للأم البديلة" #. module: odex_benefit +#: code:addons/odex_benefit/models/benefit.py:0 #: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__replacement_mother_name +#, python-format msgid "Replacement Mother Name" msgstr "الاسم الاول" @@ -9883,7 +9905,9 @@ msgid "Replacement Mother Relation" msgstr "صلة القرابة" #. module: odex_benefit +#: code:addons/odex_benefit/models/benefit.py:0 #: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__replacement_mother_second_name +#, python-format msgid "Replacement Mother Second Name" msgstr "الاسم الثاني" @@ -9893,7 +9917,9 @@ msgid "Replacement Mother Status" msgstr "حالة الاستفادة" #. module: odex_benefit +#: code:addons/odex_benefit/models/benefit.py:0 #: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__replacement_mother_third_name +#, python-format msgid "Replacement Mother Third Name" msgstr "الاسم الثالث" @@ -14730,4 +14756,14 @@ msgstr "" #. module: odex_benefit #: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form msgid "Documents" -msgstr "المستندات" \ No newline at end of file +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 يجب أن يحتوي فقط على الأحرف الأبجدية والمسافات. الأرقام والرموز الخاصة غير مسموح بها." \ No newline at end of file diff --git a/odex25_ensan/odex_benefit/models/benefit.py b/odex25_ensan/odex_benefit/models/benefit.py index 03b3da34f..bd343864c 100644 --- a/odex25_ensan/odex_benefit/models/benefit.py +++ b/odex25_ensan/odex_benefit/models/benefit.py @@ -421,18 +421,18 @@ class GrantBenefitProfile(models.Model): # housing_name = fields.Char(compute='_compute_get_name') zip = fields.Char('Zip', change_default=True, readonly=False, store=True) short_number = fields.Char( - readonly=False, - required=False, + readonly=False, + required=False, states={ - 'second_approve': [('readonly', True)], + 'second_approve': [('readonly', True)], 'complete_info': [('required', True)] } ) extra_code = fields.Char( - readonly=False, - required=False, + readonly=False, + required=False, states={ - 'second_approve': [('readonly', True)], + 'second_approve': [('readonly', True)], 'complete_info': [('required', True)] } ) @@ -587,20 +587,33 @@ class GrantBenefitProfile(models.Model): ('unique_code', "unique (code) WHERE state NOT IN ('draft', 'new')", 'This code already exists') ] - # @api.constrains('father_name') - # def _check_names_alphabetic(self): - # char_fields = { - # 'father_name': 'father 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( - # f"{field_label} must contain only alphabetic characters and spaces. " - # f"Numbers and special characters are not allowed." - # ) + @api.constrains('father_name', 'father_second_name', 'father_third_name', 'father_family_name', + 'mother_name', 'mother_second_name', 'mother_third_name', 'mother_family_name', + 'replacement_mother_name','replacement_mother_second_name','replacement_mother_third_name','replacement_mother_family_name') + def _check_names_alphabetic(self): + char_fields = { + 'father_name': _('Father First Name'), + 'father_second_name': _('Father Second Name'), + 'father_third_name': _('Father Third Name'), + 'father_family_name': _('Father Family Name'), + 'mother_name': _('Mother Name'), + 'mother_second_name': _('Mother Second Name'), + 'mother_third_name':_('Mother Third Name'), + 'mother_family_name': _('MotherFamily Name'), + 'replacement_mother_name': _('Replacement Mother Name'), + 'replacement_mother_second_name': _('Replacement Mother Second Name'), + 'replacement_mother_third_name': _('Replacement Mother Third Name'), + 'replacement_mother_family_name': _('Replacement Mother Family 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 + ) def assign_sequence_to_all(self): sequence = self.env['ir.sequence'].search([('code', '=', 'benefit.sequence')], limit=1) @@ -614,7 +627,7 @@ class GrantBenefitProfile(models.Model): code = self.env['ir.sequence'].sudo().next_by_code('benefit.sequence') rec.with_context(force_website=True).write({'code':code}) - + def action_set_waiting_if_needed(self): records = self.env['grant.benefit'].browse(self._context.get('active_ids', [])) print("hh") @@ -633,7 +646,7 @@ class GrantBenefitProfile(models.Model): def _compute_request_producer_id(self): for rec in self: rec.request_producer_id = rec.user_id.partner_id if rec.request_producer.id == rec.env.ref('base.public_partner').id else rec.request_producer - + def validate_attachments(self): for rec in self: if not rec.owner_identity_attachment_ids and rec.is_family_member == False and rec.state == 'first_approve': @@ -675,7 +688,7 @@ class GrantBenefitProfile(models.Model): and rec.father_dead_date < rec.father_birth_date ): raise ValidationError("Father's Death Date must be after the Birth Date.") - + # @api.depends('attachment_ids') # def get_required_attach(self): # for rec in self.attachment_ids: @@ -812,7 +825,7 @@ class GrantBenefitProfile(models.Model): def _get_total_service_requests(self): for rec in self: rec.total_service_requests = self.env['service.request'].search_count([('benefit_type', '=', 'family'), ('family_id', '=', rec.id)]) - + def action_open_related_service_requests(self): """ Opens a tree view with related records filtered by a dynamic domain """ service_requests = self.env['service.request'].search([ @@ -829,11 +842,11 @@ class GrantBenefitProfile(models.Model): 'target': 'current', } return action - + def _get_total_seasonal_service_requests(self): for rec in self: rec.total_seasonal_service_requests = len(self.env['seasonal.service'].search([('family_ids', '!=', False)]).filtered(lambda r: rec.id in r.family_ids.family_id.ids)) - + def action_open_related_seasonal_service_requests(self): """ Opens a tree view with related records filtered by a dynamic domain """ seasonal_service_requests = self.env['seasonal.service'].search([('family_ids', '!=', False)]).filtered(lambda r: self.id in r.family_ids.family_id.ids).ids @@ -1117,7 +1130,7 @@ class GrantBenefitProfile(models.Model): 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: diff --git a/odex25_ensan/odex_benefit/models/family_members.py b/odex25_ensan/odex_benefit/models/family_members.py index ed1cc5b64..70b01d879 100644 --- a/odex25_ensan/odex_benefit/models/family_members.py +++ b/odex25_ensan/odex_benefit/models/family_members.py @@ -9,7 +9,7 @@ import qrcode import base64 from io import BytesIO SAUDI_MOBILE_PATTERN = "(^(05|5)(5|0|3|6|4|9|1|8|7)([0-9]{7})$)" -ALPHABETIC_PATTERN = "^[A-Za-z ]+$" +ALPHABETIC_PATTERN = "^[\u0600-\u065F\u066A-\u06EF\u06FA-\u06FFA-Za-z ]+$" import re _logger = logging.getLogger(__name__) @@ -267,6 +267,19 @@ class FamilyMemberProfile(models.Model): is_mother = fields.Boolean('Is Mother?') total_member_service_requests = fields.Integer(compute='_get_total_member_service_requests') + @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: