From 424303fd8b29cfc670dbffbc16345a2a71b3d4ff Mon Sep 17 00:00:00 2001 From: younes Date: Sun, 14 Dec 2025 19:35:35 +0100 Subject: [PATCH 1/2] [IMP] odex_benefit: IMP benefit --- odex25_benefit/odex_benefit/i18n/ar_001.po | 6 -- .../odex_benefit/models/service_request.py | 87 ++++++++++++++----- .../odex_benefit/views/service_request.xml | 10 ++- 3 files changed, 73 insertions(+), 30 deletions(-) diff --git a/odex25_benefit/odex_benefit/i18n/ar_001.po b/odex25_benefit/odex_benefit/i18n/ar_001.po index 49820f1f4..01c8bf847 100644 --- a/odex25_benefit/odex_benefit/i18n/ar_001.po +++ b/odex25_benefit/odex_benefit/i18n/ar_001.po @@ -16572,12 +16572,6 @@ msgid "" "service between %s and %s." msgstr "يتداخل هذا الطلب مع طلبات أخرى لنفس الخدمة [%s] خلال الفترة من %s إلى %s." -#. module: odex_benefit -#: code:addons/odex_benefit/models/service_request.py:0 -#, python-format -msgid "This service is not eligible because the son is not working." -msgstr "هذه الخدمة غير مستحقة لأن الفرد لا يعمل." - #. module: odex_benefit #: code:addons/odex_benefit/models/benefit.py:0 #: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__total_father_families diff --git a/odex25_benefit/odex_benefit/models/service_request.py b/odex25_benefit/odex_benefit/models/service_request.py index 2eb81a2c3..b542fc7ec 100644 --- a/odex25_benefit/odex_benefit/models/service_request.py +++ b/odex25_benefit/odex_benefit/models/service_request.py @@ -46,6 +46,11 @@ class ServiceRequest(models.Model): compute="_get_estimated_rent_amount_payment") 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') + payment_method = fields.Selection([ + ('none', 'None'), + ('payment_order', 'Payment Order'), + ('invoice', 'Invoice'), + ], string='Payment Method', default="payment_order") # 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) @@ -95,8 +100,7 @@ class ServiceRequest(models.Model): 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') + service_producer_id = fields.Many2one('res.partner', string='Service Producer', ) 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', @@ -180,6 +184,9 @@ class ServiceRequest(models.Model): 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') + car_price = fields.Float(string='Car Price') + car_remaining_amount = fields.Float(string='Remaining Amount',compute='_compute_remaining_amount',store=True,) + show_car_remaining_amount = fields.Boolean(string='Show Car Remaining Amount',compute='_compute_remaining_amount') 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', @@ -227,6 +234,20 @@ class ServiceRequest(models.Model): payment_order_state = "waiting" rec.payment_order_state = payment_order_state + @api.depends('car_price', 'requested_service_amount', 'service_cat.service_type') + def _compute_remaining_amount(self): + for rec in self: + if rec.service_cat and rec.service_cat.service_type == 'buy_car': + if rec.car_price and rec.requested_service_amount: + rec.car_remaining_amount = rec.car_price - rec.requested_service_amount + rec.show_car_remaining_amount = rec.car_price > rec.requested_service_amount + else: + rec.car_remaining_amount = 0.0 + rec.show_car_remaining_amount = False + else: + rec.car_remaining_amount = 0.0 + rec.show_car_remaining_amount = False + def action_return_bank(self): self.ensure_one() return { @@ -523,7 +544,15 @@ class ServiceRequest(models.Model): @api.onchange('family_id', 'service_cat') def _onchange_member(self): for rec in self: - rec.benefit_type = rec.service_cat.benefit_type + if rec.service_cat: + rec.benefit_type = rec.service_cat.benefit_type + rec.service_producer_id = rec.service_cat.service_producer_id + rec.payment_method = rec.service_cat.payment_method + else: + rec.benefit_type = False + rec.service_producer_id = False + rec.payment_method = 'payment_order' + if not rec.family_id: rec.member_id = False rec.service_cat = False @@ -610,24 +639,35 @@ class ServiceRequest(models.Model): 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: + #son_members_above_age = rec.family_id.member_ids.filtered( + # lambda x: x.relationn.relation_type == 'son' and x.age > 18) + #daughter_members_above_age = rec.family_id.member_ids.filtered( + # lambda x: x.relationn.relation_type == 'daughter' and x.age > 18) + + children_above_18_living_with_family = rec.family_id.member_ids.filtered( + lambda m: m.relationn.relation_type in ('son', 'daughter') + and m.age > 18 + and not m.member_location_conf.is_far_from_family + ) + + if children_above_18_living_with_family: raise ValidationError( - _("You cannot request this service because children above 18 years")) + _("You cannot request this service because there is at least one child over 18 years old living with the family.") + ) + + disable_mother = rec.family_id.member_ids.filtered( + lambda x: x.relationn.relation_type == 'mother' and bool(x.disabilities_attachment_ids)) + work_mother = rec.family_id.member_ids.filtered( + lambda x: x.relationn.relation_type == 'mother' and x.is_work) + disable_replacement_mother = rec.family_id.member_ids.filtered( + lambda x: x.relationn.relation_type == 'replacement_mother' and bool(x.disabilities_attachment_ids)) + work_replacement_mother = rec.family_id.member_ids.filtered( + lambda x: x.relationn.relation_type == 'replacement_mother' and x.is_work) + #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")) @@ -807,9 +847,6 @@ class ServiceRequest(models.Model): remaining = 0 rec.service_max_amount = remaining 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 @@ -823,7 +860,7 @@ class ServiceRequest(models.Model): 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: + if rec.member_id.is_work and 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: @@ -908,6 +945,12 @@ class ServiceRequest(models.Model): }) elif service_cats.payment_method == "invoice": + missing_producer = self.filtered(lambda r: not r.service_producer_id) + if missing_producer: + names = ", ".join(missing_producer.mapped('name')) + raise UserError(_( + "The following service requests do not have a Service Producer defined:\n%s" + ) % names) invalid_records = self.filtered( lambda r: r.state != 'accounting_approve' or r.payment_order_state != 'none' diff --git a/odex25_benefit/odex_benefit/views/service_request.xml b/odex25_benefit/odex_benefit/views/service_request.xml index 178937f96..1ce29bc02 100644 --- a/odex25_benefit/odex_benefit/views/service_request.xml +++ b/odex25_benefit/odex_benefit/views/service_request.xml @@ -224,14 +224,15 @@ groups="odex_benefit.group_benefit_accounting_accept"/> - + + @@ -265,6 +266,9 @@ + + + From 3a742a049666cb1a87160024389655853a45fd74 Mon Sep 17 00:00:00 2001 From: younes Date: Sun, 14 Dec 2025 19:49:30 +0100 Subject: [PATCH 2/2] [IMP] odex_benefit: IMP benefit --- odex25_benefit/odex_benefit/i18n/ar_001.po | 40 +++++++++++++++---- .../odex_benefit/models/service_request.py | 2 +- 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/odex25_benefit/odex_benefit/i18n/ar_001.po b/odex25_benefit/odex_benefit/i18n/ar_001.po index 01c8bf847..01210a718 100644 --- a/odex25_benefit/odex_benefit/i18n/ar_001.po +++ b/odex25_benefit/odex_benefit/i18n/ar_001.po @@ -6681,6 +6681,7 @@ msgstr "تاريخ الانقطاع" #: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__invoice_warn #: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__invoice_warn #: model:ir.model.fields,field_description:odex_benefit.field_needs_payment_line__invoice_id +#: model:ir.model.fields.selection,name:odex_benefit.selection__service_request__payment_method__invoice #: model:ir.model.fields.selection,name:odex_benefit.selection__services_settings__payment_method__invoice msgid "Invoice" msgstr "فاتورة" @@ -9792,6 +9793,7 @@ msgstr "صلة القرابة" #. module: odex_benefit #: model:ir.model.fields,field_description:odex_benefit.field_benefits_needs__remaining_amount +#: model:ir.model.fields,field_description:odex_benefit.field_service_request__car_remaining_amount msgid "Remaining Amount" msgstr "المبلغ المتبقي" @@ -10493,7 +10495,7 @@ msgstr "اسم الخدمة" #: model:ir.model.fields,field_description:odex_benefit.field_service_request__service_producer_id #: model:ir.model.fields,field_description:odex_benefit.field_services_settings__service_producer_id msgid "Service Producer" -msgstr "" +msgstr "جهة الدفع" #. module: odex_benefit #: model:ir.model.fields,field_description:odex_benefit.field_home_furnishing_items__service_request_id @@ -14331,6 +14333,7 @@ msgstr "حساب المصروف" #: model:ir.model.fields,field_description:odex_benefit.field_confirm_benefit_expense__payment_order_id #: model:ir.model.fields,field_description:odex_benefit.field_seasonal_service__payment_order_id #: model:ir.model.fields,field_description:odex_benefit.field_service_request__payment_order_id +#: model:ir.model.fields.selection,name:odex_benefit.selection__service_request__payment_method__payment_order #: model:ir.model.fields.selection,name:odex_benefit.selection__services_settings__payment_method__payment_order msgid "Payment Order" msgstr "أمر الصرف" @@ -16150,12 +16153,6 @@ msgstr "لا يمكنك طلب هذه الخدمة لأنك أقل من الحد msgid "You cannot request this service because you do not have a car" msgstr "لا يمكنك طلب هذه الخدمة لأنك لا تملك سيارة" -#. module: odex_benefit -#: code:addons/odex_benefit/models/service_request.py:0 -#, python-format -msgid "You cannot request this service because children above 18 years" -msgstr "لا يمكنك طلب هذه الخدمة لأن الأطفال أكبر من 18 عامًا" - #. module: odex_benefit #: code:addons/odex_benefit/models/service_request.py:0 #: code:addons/odex_benefit/models/service_request.py:0 @@ -16777,6 +16774,7 @@ msgstr "حالة أمر الدفع" #: model:ir.model.fields.selection,name:odex_benefit.selection__confirm_benefit_expense__move_state__none #: model:ir.model.fields.selection,name:odex_benefit.selection__confirm_benefit_expense__payment_state__none #: model:ir.model.fields.selection,name:odex_benefit.selection__seasonal_service__payment_order_state__none +#: model:ir.model.fields.selection,name:odex_benefit.selection__service_request__payment_method__none #: model:ir.model.fields.selection,name:odex_benefit.selection__service_request__payment_order_state__none #: model:ir.model.fields.selection,name:odex_benefit.selection__services_settings__payment_method__none msgid "None" @@ -16912,6 +16910,7 @@ msgid "Waiting for Deposit" msgstr "بانتظار الايداع" #. module: odex_benefit +#: model:ir.model.fields,field_description:odex_benefit.field_service_request__payment_method #: model:ir.model.fields,field_description:odex_benefit.field_services_settings__payment_method msgid "Payment Method" msgstr "طريقة الدفع" @@ -17515,3 +17514,30 @@ msgstr "الجهة الداعمة" msgid "Supporter Entities" msgstr "الجهات الداعمة" +#. module: odex_benefit +#: model:ir.model.fields,field_description:odex_benefit.field_service_request__car_price +msgid "Car Price" +msgstr "قيمة السيارة" + +#. module: odex_benefit +#: model:ir.model.fields,field_description:odex_benefit.field_service_request__show_car_remaining_amount +msgid "Show Car Remaining Amount" +msgstr "إظهار المبلغ المتبقي للسيارة" + +#. module: odex_benefit +#: code:addons/odex_benefit/models/service_request.py:0 +#, python-format +msgid "" +"You cannot request this service because there is at least one child over 18 " +"years old living with the family." +msgstr "لا يمكنك طلب هذه الخدمة لأنه يوجد طفل واحد على الأقل يزيد عمره عن 18 عامًا يعيش مع الأسرة." + +#. module: odex_benefit +#: code:addons/odex_benefit/models/service_request.py:0 +#, python-format +msgid "" +"The following service requests do not have a Service Producer defined:\n" +"%s" +msgstr "" +"طلبات الخدمة التالية ليس لديها جهة الدفع محددة:\n" +"%s" \ No newline at end of file diff --git a/odex25_benefit/odex_benefit/models/service_request.py b/odex25_benefit/odex_benefit/models/service_request.py index b542fc7ec..7692988b8 100644 --- a/odex25_benefit/odex_benefit/models/service_request.py +++ b/odex25_benefit/odex_benefit/models/service_request.py @@ -234,7 +234,7 @@ class ServiceRequest(models.Model): payment_order_state = "waiting" rec.payment_order_state = payment_order_state - @api.depends('car_price', 'requested_service_amount', 'service_cat.service_type') + @api.depends('car_price', 'requested_service_amount', 'service_cat') def _compute_remaining_amount(self): for rec in self: if rec.service_cat and rec.service_cat.service_type == 'buy_car':