From c852aac5dabeb5a82b9b271864e5cb1d9b651518 Mon Sep 17 00:00:00 2001 From: younes Date: Sun, 7 Dec 2025 14:41:47 +0100 Subject: [PATCH] [IMP] odex_benefit: IMP benefit --- odex25_benefit/odex_benefit/i18n/ar_001.po | 9 +++++++- .../odex_benefit/models/education_period.py | 5 ++-- .../odex_benefit/models/family_expense.py | 23 +++++++++++++++---- .../odex_benefit/models/seasonal_service.py | 23 +++++++++++++++++-- .../odex_benefit/models/service_request.py | 5 ++-- .../views/seasonal_service_view.xml | 3 ++- 6 files changed, 56 insertions(+), 12 deletions(-) diff --git a/odex25_benefit/odex_benefit/i18n/ar_001.po b/odex25_benefit/odex_benefit/i18n/ar_001.po index bcd589fb8..34a134ad4 100644 --- a/odex25_benefit/odex_benefit/i18n/ar_001.po +++ b/odex25_benefit/odex_benefit/i18n/ar_001.po @@ -4671,6 +4671,7 @@ msgstr "المراحل التعليمية" #: 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 +#: model:ir.model.fields,field_description:odex_benefit.field_res_partner__education_level_ids msgid "Education Levels" msgstr "المرحلة التعليمية" @@ -17289,4 +17290,10 @@ msgstr "يجب أن يكون تاريخ البدء وتاريخ الانتهاء msgid "" "Payment Type requires a period of %s months, but selected period is %s " "months." -msgstr "يتطلب نوع السداد فترة %s أشهر، ولكن الفترة المحددة هي %s أشهر." \ No newline at end of file +msgstr "يتطلب نوع السداد فترة %s أشهر، ولكن الفترة المحددة هي %s أشهر." + +#. module: odex_benefit +#: model:ir.model.fields,field_description:odex_benefit.field_res_partner__is_education_entity +msgid "Is Education Entity" +msgstr "جهة تعليمية" + diff --git a/odex25_benefit/odex_benefit/models/education_period.py b/odex25_benefit/odex_benefit/models/education_period.py index be39b95ec..0bbcd6445 100644 --- a/odex25_benefit/odex_benefit/models/education_period.py +++ b/odex25_benefit/odex_benefit/models/education_period.py @@ -1,4 +1,4 @@ -from odoo import fields, models,api +from odoo import fields, models, api class EducationPeriod(models.Model): @@ -10,4 +10,5 @@ class EducationPeriod(models.Model): 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("res.partner", string='Education Entities') \ No newline at end of file + education_entity_ids = fields.Many2many( + "res.partner", domain="[('is_education_entity','=',True)]", string='Education Entities') diff --git a/odex25_benefit/odex_benefit/models/family_expense.py b/odex25_benefit/odex_benefit/models/family_expense.py index 9dc808119..e998c439e 100644 --- a/odex25_benefit/odex_benefit/models/family_expense.py +++ b/odex25_benefit/odex_benefit/models/family_expense.py @@ -3,6 +3,7 @@ from dateutil.relativedelta import relativedelta from odoo import models, fields, api, _ from odoo.exceptions import UserError from odoo.tools import date_utils +from dateutil.relativedelta import relativedelta class ConfirmBenefitExpense(models.Model): @@ -118,6 +119,19 @@ class ConfirmBenefitExpense(models.Model): if rec.move_state == 'done' and rec.payment_state == 'done': rec.state = 'confirm' + def _get_month_count(self): + self.ensure_one() + if not self.start_date or not self.end_date: + return 1 + + start = fields.Date.from_string(self.start_date) + end = fields.Date.from_string(self.end_date) + + diff = relativedelta(end, start) + months = diff.years * 12 + diff.months + 1 + + return max(1, months) + @api.model def create(self, vals): res = super(ConfirmBenefitExpense, self).create(vals) @@ -129,6 +143,7 @@ class ConfirmBenefitExpense(models.Model): def _update_benefit_expense_lines(self): self.ensure_one() + month_count = self._get_month_count() for line in self.benefit_expense_line_ids: family = line.family_id income, meals, clotting, othaim = 0, 0, 0, 0 @@ -137,12 +152,12 @@ class ConfirmBenefitExpense(models.Model): 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 + income = family.family_monthly_income * month_count if self.meal_expense: - meals = monthly_meals - othaim = othaime + meals = monthly_meals * month_count + othaim = othaime * month_count if self.cloth_expense: - clotting = family.family_monthly_clotting + clotting = family.family_monthly_clotting * month_count vals = { 'branch_id': family.branch_custom_id.id, 'family_category_id': family.benefit_category_id.id, diff --git a/odex25_benefit/odex_benefit/models/seasonal_service.py b/odex25_benefit/odex_benefit/models/seasonal_service.py index f75c14779..c5e531794 100644 --- a/odex25_benefit/odex_benefit/models/seasonal_service.py +++ b/odex25_benefit/odex_benefit/models/seasonal_service.py @@ -60,6 +60,8 @@ class SeasonalService(models.Model): 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") + allowed_member_ids = fields.Many2many('family.member', compute='_compute_allowed_member_ids', + string="Allowed Members", ) service_delivery_method = fields.Selection(selection=[ ('cash', 'Cash'), ('in_kind', 'In kind'), ], string='Service Delivery Method', default='cash') @@ -80,6 +82,25 @@ class SeasonalService(models.Model): payment_order_state = "waiting" rec.payment_order_state = payment_order_state + @api.depends('benefit_ids', 'service_type_id') + def _compute_allowed_member_ids(self): + for rec in self: + domain = [('benefit_id', 'in', rec.benefit_ids.ids), + ('member_status', '=', 'benefit')] + + members = self.env['family.member'].sudo().search(domain) + + if rec.service_type_id.is_this_service_for_student: + members = members.filtered( + lambda m: ( + m.education_status == 'educated' + and any(edu.case_study == 'continuous' + for edu in m.member_education_status_ids) + ) + ) + + rec.allowed_member_ids = members + @api.onchange('service_type_id') def _onchange_service_type_id(self): if self.benefit_ids: @@ -88,7 +109,6 @@ class SeasonalService(models.Model): if self.service_type_id and self.service_type_id.benefit_category_ids: self.family_category_ids = [(6, 0, self.service_type_id.benefit_category_ids.ids)] - @api.depends('branch_ids', 'family_category_ids') def _compute_domain_ids(self): for rec in self: @@ -132,7 +152,6 @@ class SeasonalService(models.Model): if len(members_to_keep) != len(self.member_ids): self.member_ids = [(6, 0, members_to_keep.ids)] - @api.model def create(self, vals): res = super(SeasonalService, self).create(vals) diff --git a/odex25_benefit/odex_benefit/models/service_request.py b/odex25_benefit/odex_benefit/models/service_request.py index 09f6b678b..7841429c7 100644 --- a/odex25_benefit/odex_benefit/models/service_request.py +++ b/odex25_benefit/odex_benefit/models/service_request.py @@ -368,8 +368,6 @@ class ServiceRequest(models.Model): count = len(count_members) - rec.service_benefit_count = count - domain_members = family_members if rec.service_cat: @@ -384,7 +382,10 @@ class ServiceRequest(models.Model): for edu in m.member_education_status_ids) ) ) + if rec.benefit_type == "family": + count = len(domain_members) + rec.service_benefit_count = count rec.member_domain_ids = domain_members def action_send_to_researcher(self): diff --git a/odex25_benefit/odex_benefit/views/seasonal_service_view.xml b/odex25_benefit/odex_benefit/views/seasonal_service_view.xml index aa811bac9..9780ab898 100644 --- a/odex25_benefit/odex_benefit/views/seasonal_service_view.xml +++ b/odex25_benefit/odex_benefit/views/seasonal_service_view.xml @@ -89,6 +89,7 @@ + @@ -190,7 +191,7 @@ + domain="[('id', 'in', allowed_member_ids)]"/>