Merge pull request #5764 from expsa/yout

[IMP] odex_benefit: IMP benefit
This commit is contained in:
kchyounes19 2025-12-18 13:31:20 +01:00 committed by GitHub
commit 2ab2e075a8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 102 additions and 9 deletions

View File

@ -147,6 +147,7 @@ class GrantBenefitProfile(models.Model):
cloth_ids = fields.One2many('benefit.cloth', 'benefit_id') cloth_ids = fields.One2many('benefit.cloth', 'benefit_id')
expenses_request_ids = fields.One2many('benefit.expenses', 'benefit_id') expenses_request_ids = fields.One2many('benefit.expenses', 'benefit_id')
expenses_ids = fields.One2many('expenses.line', 'benefit_id') expenses_ids = fields.One2many('expenses.line', 'benefit_id')
mother_expenses_ids = fields.One2many('expenses.line','mother_benefit_id',string="Mother Commitments / Expenses")
# Father's case and his data # Birth Date # Address # dead data # Father's case and his data # Birth Date # Address # dead data
# Father's case and his data # Father's case and his data
# family_name = fields.Char(string="Family Name", tracking=True) # family_name = fields.Char(string="Family Name", tracking=True)
@ -212,6 +213,8 @@ class GrantBenefitProfile(models.Model):
is_mother_work = fields.Boolean('Is Mother Work?') is_mother_work = fields.Boolean('Is Mother Work?')
mother_has_disabilities = fields.Boolean('Has Disabilities?') mother_has_disabilities = fields.Boolean('Has Disabilities?')
mother_income = fields.Float("Mother Income", digits=(16, 0)) mother_income = fields.Float("Mother Income", digits=(16, 0))
mother_net_income = fields.Float(string="Mother Net Income",compute='_compute_mother_net_income',
store=True,help="Mother gross income minus her deducted expenses and monthly debt installments")
mother_birth_date = fields.Date(string="Birth Date") mother_birth_date = fields.Date(string="Birth Date")
mother_age = fields.Integer(string="Age", compute='_compute_get_mother_age') mother_age = fields.Integer(string="Age", compute='_compute_get_mother_age')
mother_city_id = fields.Many2one('res.country.city', string='City') mother_city_id = fields.Many2one('res.country.city', string='City')
@ -411,6 +414,7 @@ class GrantBenefitProfile(models.Model):
meal_card = fields.Boolean(string="Meal Card",related="district_id.meal_card", store=True,related_sudo=True) meal_card = fields.Boolean(string="Meal Card",related="district_id.meal_card", store=True,related_sudo=True)
attachment_ids = fields.One2many('ir.attachment', 'benefit_id') attachment_ids = fields.One2many('ir.attachment', 'benefit_id')
family_debits_ids = fields.One2many('family.debits', 'benefit_id') family_debits_ids = fields.One2many('family.debits', 'benefit_id')
mother_debits_ids = fields.One2many('family.debits','mother_benefit_id',string="Mother Debts")
researcher_id = fields.Many2one("committees.line", string="Researcher",tracking=True) researcher_id = fields.Many2one("committees.line", string="Researcher",tracking=True)
assigned_researcher_id = fields.Many2one('committees.line',string='Assigned Researcher',tracking=True) assigned_researcher_id = fields.Many2one('committees.line',string='Assigned Researcher',tracking=True)
auto_accept_for_member = fields.Boolean(string="Auto Accept For members", default=True) auto_accept_for_member = fields.Boolean(string="Auto Accept For members", default=True)
@ -627,6 +631,20 @@ class GrantBenefitProfile(models.Model):
('unique_code', "unique (code) WHERE state NOT IN ('draft', 'new')", 'This code already exists') ('unique_code', "unique (code) WHERE state NOT IN ('draft', 'new')", 'This code already exists')
] ]
@api.depends('mother_income', 'is_mother_work','mother_expenses_ids','mother_debits_ids')
def _compute_mother_net_income(self):
for rec in self:
if not rec.is_mother_work:
rec.mother_net_income = 0.0
continue
deductions = (
sum(rec.mother_expenses_ids.filtered('deduct_from_family_income').mapped('amount')) +
sum(rec.mother_debits_ids.filtered('deduct_from_family_income').mapped('monthly_installment'))
)
rec.mother_net_income = max(rec.mother_income - deductions, 0.0)
def _compute_total_families(self): def _compute_total_families(self):
for record in self: for record in self:
record.total_father_families = self.search_count([('father_id_number','=',record.father_id_number),('id','!=',record.id)]) record.total_father_families = self.search_count([('father_id_number','=',record.father_id_number),('id','!=',record.id)])
@ -857,7 +875,7 @@ class GrantBenefitProfile(models.Model):
'&', ('res_model', '=', 'education.status'), '&', ('res_model', '=', 'education.status'),
('res_id', 'in', self.mother_education_status_ids.ids), ('res_id', 'in', self.mother_education_status_ids.ids),
'&', ('res_model', '=', 'family.debits'), '&', ('res_model', '=', 'family.debits'),
('res_id', 'in', self.family_debits_ids.ids), ('res_id', 'in', (self.family_debits_ids + self.mother_debits_ids).ids),
'&', ('res_model', '=', 'salary.line'), '&', ('res_model', '=', 'salary.line'),
('res_id', 'in', self.salary_ids.ids), ('res_id', 'in', self.salary_ids.ids),
'&', ('res_model', '=', 'family.member'), '&', ('res_model', '=', 'family.member'),
@ -1260,12 +1278,12 @@ class GrantBenefitProfile(models.Model):
elif rec.mother_marital_conf.is_benefit : elif rec.mother_marital_conf.is_benefit :
if rec.is_mother_work and rec.mother_country_id.code == 'SA' or ( 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'): 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: if mini_income_for_mother < rec.mother_net_income <= max_income_for_mother:
reasons.append(_("The mother's income is between minimum and maximum thresholds.")) reasons.append(_("The mother's income is between minimum and maximum thresholds."))
status = 'non_benefit' status = 'non_benefit'
elif rec.mother_income <= mini_income_for_mother: elif rec.mother_net_income <= mini_income_for_mother:
status = 'benefit' status = 'benefit'
elif rec.mother_income > max_income_for_mother: elif rec.mother_net_income > max_income_for_mother:
status = 'benefit' status = 'benefit'
elif not rec.is_mother_work and rec.mother_country_id.code == 'SA' or ( 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'): rec.mother_country_id.code != 'SA' and rec.father_country_id.code == 'SA'):
@ -1358,12 +1376,12 @@ class GrantBenefitProfile(models.Model):
mother_fields = [ mother_fields = [
'mother_name', 'mother_second_name', 'mother_third_name', 'mother_family_name', 'mother_id_number', '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_birth_date', 'mother_marital_conf', 'mother_location_conf', 'is_mother_work',
'mother_income', 'mother_age','education_status','mother_diseases_attachment_ids', 'mother_net_income', 'mother_age','education_status','mother_diseases_attachment_ids',
'mother_education_status_ids','mother_disabilities_attachment_ids' 'mother_education_status_ids','mother_disabilities_attachment_ids'
] ]
if any(field in vals for field in mother_fields): if any(field in vals for field in mother_fields):
for rec in self: for rec in self:
rec.calculate_income(rec.mother_income, rec.mother_status, rec.salary_ids) rec.calculate_income(rec.mother_net_income, rec.mother_status, rec.salary_ids)
rec.add_or_replace_mother_as_member() rec.add_or_replace_mother_as_member()
# Handle replacement mother update/create # Handle replacement mother update/create
@ -1398,7 +1416,7 @@ class GrantBenefitProfile(models.Model):
res.code = self.env['ir.sequence'].sudo().next_by_code('benefit.sequence') or _('New') res.code = self.env['ir.sequence'].sudo().next_by_code('benefit.sequence') or _('New')
# Add mother # Add mother
if res.mother_id_number: if res.mother_id_number:
res.calculate_income(res.mother_income, res.mother_status, res.salary_ids) res.calculate_income(res.mother_net_income, res.mother_status, res.salary_ids)
res.add_or_replace_mother_as_member() res.add_or_replace_mother_as_member()
# Add replacement mother # Add replacement mother
if res.add_replacement_mother and res.replacement_mother_id_number: if res.add_replacement_mother and res.replacement_mother_id_number:
@ -2051,7 +2069,7 @@ class GrantBenefitProfile(models.Model):
'member_location_conf': rec.mother_location_conf.id, 'member_location_conf': rec.mother_location_conf.id,
'age': rec.mother_age, 'age': rec.mother_age,
'is_work': rec.is_mother_work, 'is_work': rec.is_mother_work,
'member_income': rec.mother_income, 'member_income': rec.mother_net_income,
'education_status': rec.education_status, 'education_status': rec.education_status,
#'member_status': rec.mother_status, #'member_status': rec.mother_status,
'member_education_status_ids': [(5, 0)] + [(4, edu.id) for edu in rec.mother_education_status_ids], 'member_education_status_ids': [(5, 0)] + [(4, edu.id) for edu in rec.mother_education_status_ids],
@ -2449,7 +2467,7 @@ class GrantBenefitProfile(models.Model):
if partner_exist or benefit_exist: if partner_exist or benefit_exist:
raise ValidationError(_("The account number already exists!")) raise ValidationError(_("The account number already exists!"))
@api.onchange('mother_marital_conf', 'mother_location_conf', 'mother_income') @api.onchange('mother_marital_conf', 'mother_location_conf', 'mother_net_income')
def _onchange_mother_info(self): def _onchange_mother_info(self):
res = {} res = {}
if self.mother_status == 'non_benefit': if self.mother_status == 'non_benefit':

View File

@ -474,6 +474,7 @@ class ExpensesLine(models.Model):
category_id = fields.Many2one( category_id = fields.Many2one(
'benefit.category') 'benefit.category')
benefit_id = fields.Many2one('grant.benefit') benefit_id = fields.Many2one('grant.benefit')
mother_benefit_id = fields.Many2one('grant.benefit',string="Mother Benefit",ondelete='cascade')
currency_id = fields.Many2one('res.currency', related='benefit_id.currency_id') currency_id = fields.Many2one('res.currency', related='benefit_id.currency_id')
expenses_type_custom = fields.Many2one('expenses.type') expenses_type_custom = fields.Many2one('expenses.type')
expenses_type = fields.Selection( expenses_type = fields.Selection(

View File

@ -19,6 +19,7 @@ class FamilyDebits(models.Model):
loan_end_date = fields.Date(string='Loan End Date') loan_end_date = fields.Date(string='Loan End Date')
loan_reason = fields.Many2one("loan.reason",string='Loan Reason') loan_reason = fields.Many2one("loan.reason",string='Loan Reason')
benefit_id = fields.Many2one("grant.benefit") benefit_id = fields.Many2one("grant.benefit")
mother_benefit_id = fields.Many2one('grant.benefit',string="Mother Benefit",ondelete='cascade')
currency_id = fields.Many2one('res.currency', related='benefit_id.currency_id') currency_id = fields.Many2one('res.currency', related='benefit_id.currency_id')
loan_attach = fields.Binary(attachment=True,string='Loan Attach') loan_attach = fields.Binary(attachment=True,string='Loan Attach')
description = fields.Char(string='Description') description = fields.Char(string='Description')

View File

@ -816,6 +816,10 @@
options="{'currency_field': 'currency_id', 'field_digits': False}" options="{'currency_field': 'currency_id', 'field_digits': False}"
digits="[16,0]" digits="[16,0]"
attrs="{'invisible':[('is_mother_work','=',False)],'required':[('is_mother_work','=',True)],'readonly':[('state','not in',['draft','new','complete_info'])]}"/> attrs="{'invisible':[('is_mother_work','=',False)],'required':[('is_mother_work','=',True)],'readonly':[('state','not in',['draft','new','complete_info'])]}"/>
<field name="mother_net_income" widget="monetary" force_save="1"
options="{'currency_field': 'currency_id', 'field_digits': False}"
digits="[16,0]"
attrs="{'invisible':[('is_mother_work','=',False)]}"/>
<field name="mother_salary_certificate" <field name="mother_salary_certificate"
widget="many2many_attachment_preview" widget="many2many_attachment_preview"
attrs="{'invisible':[('is_mother_work','=',False)]}"/> attrs="{'invisible':[('is_mother_work','=',False)]}"/>
@ -864,6 +868,75 @@
</tree> </tree>
</field> </field>
</page> </page>
<page string="Mother Expenses" attrs="{'invisible':[('is_mother_work','=',False)]}">
<field name="mother_expenses_ids" context="{'default_state': 'accepted'}"
attrs="{'readonly':[('state','not in',['draft','new','complete_info'])]}">
<tree editable="top">
<field name="mother_benefit_id" invisible="1"/>
<field name="expenses_type" invisible="1"/>
<field name="expenses_type_custom"
options="{'no_create': True, 'no_create_edit': True,'no_quick_create': True, 'no_open': True}"/>
<field name="amount" widget="monetary"
options="{'currency_field': 'currency_id'}" sum="amount"/>
<field name="expense_attachments"
widget="many2many_attachment_preview"/>
<field name="note"/>
<field name="currency_id" invisible="1"/>
<field name="state" invisible="1"/>
<field name="deduct_from_family_income" string="Deduct from Mother Income" widget="boolean_toggle"/>
</tree>
</field>
</page>
<page string="Mother Debts" attrs="{'invisible':[('is_mother_work','=',False)]}">
<field name="mother_debits_ids" context="{'default_state': 'accepted'}"
attrs="{'readonly':[('state','not in',['draft','new','complete_info'])]}">
<form string="Family Loans">
<sheet>
<group>
<group>
<field name="loan_giver"
options="{'no_create': True, 'no_create_edit': True,'no_quick_create': True, 'no_open': True}"/>
<field name="loan_amount" widget="monetary"
options="{'currency_field': 'currency_id'}"/>
<field name="number_of_installments"/>
<field name="loan_total_paid" widget="monetary"
options="{'currency_field': 'currency_id'}"/>
<field name="loan_remaining" widget="monetary"
options="{'currency_field': 'currency_id'}"/>
<field name="monthly_installment" widget="monetary"
options="{'currency_field': 'currency_id'}"/>
<field name="loan_attach"/>
<field name="currency_id" invisible="1"/>
</group>
<group>
<field name="last_paid_amount" widget="monetary"
options="{'currency_field': 'currency_id'}"/>
<field name="last_paid_amount_date"/>
<field name="loan_reason"
options="{'no_create': True, 'no_create_edit': True,'no_quick_create': True, 'no_open': True}"/>
<field name="description"/>
<field name="benefit_id" invisible="1"/>
<field name="loan_start_date"/>
<field name="loan_end_date"/>
<field name="deduct_from_family_income" string="Deduct from Mother Income"
widget="boolean_toggle"/>
</group>
</group>
</sheet>
</form>
<tree>
<field name="loan_giver"/>
<field name="monthly_installment" widget="monetary"
options="{'currency_field': 'currency_id'}" sum="Total"/>
<field name="loan_amount" widget="monetary"
options="{'currency_field': 'currency_id'}" sum="Total"/>
<field name="currency_id" invisible="1"/>
<field name="state" invisible="1"/>
<field name="loan_attach" widget="binary"/>
<field name="deduct_from_family_income" string="Deduct from Mother Income" widget="boolean_toggle"/>
</tree>
</field>
</page>
</notebook> </notebook>
</page> </page>
<page string="Replacement Mother" <page string="Replacement Mother"