From ffa930c8d1fffeaa414996e66a0b5315b8abacca Mon Sep 17 00:00:00 2001 From: Nossibaelhadi Date: Wed, 24 Dec 2025 11:46:38 +0300 Subject: [PATCH] [FIX] replacment benefit action --- odex25_takaful/odex_takaful/__manifest__.py | 1 + odex25_takaful/odex_takaful/i18n/ar_001.po | 36 ++++++ .../models/donation_details_lines.py | 16 ++- .../odex_takaful/security/ir.model.access.csv | 2 +- .../odex_takaful/wizards/__init__.py | 1 + .../wizards/replace_benefit_wizard.py | 108 ++++++++++++++++++ .../wizards/replace_benefit_wizard.xml | 31 +++++ 7 files changed, 185 insertions(+), 10 deletions(-) create mode 100644 odex25_takaful/odex_takaful/wizards/replace_benefit_wizard.py create mode 100644 odex25_takaful/odex_takaful/wizards/replace_benefit_wizard.xml diff --git a/odex25_takaful/odex_takaful/__manifest__.py b/odex25_takaful/odex_takaful/__manifest__.py index 596931012..5e95e8170 100644 --- a/odex25_takaful/odex_takaful/__manifest__.py +++ b/odex25_takaful/odex_takaful/__manifest__.py @@ -63,6 +63,7 @@ 'wizards/donation_extension_wizard.xml', 'wizards/replace_sponsor_wizard.xml', 'wizards/add_benefit_wizard.xml', + 'wizards/replace_benefit_wizard.xml', 'wizards/esterdad.xml', 'wizards/otp_confirm.xml', 'views/donations_details_lines.xml', diff --git a/odex25_takaful/odex_takaful/i18n/ar_001.po b/odex25_takaful/odex_takaful/i18n/ar_001.po index 5885cd1ec..6df49b854 100644 --- a/odex25_takaful/odex_takaful/i18n/ar_001.po +++ b/odex25_takaful/odex_takaful/i18n/ar_001.po @@ -7634,3 +7634,39 @@ msgstr "تبرعات" msgid "Target" msgstr "حملات" +#. module: odex_takaful +#: model_terms:ir.ui.view,arch_db:odex_takaful.replace_benefit_wizard_form +msgid "Replacement Information" +msgstr "بيانات الاستبدال" + +#. module: odex_takaful +#: model:ir.model.fields,field_description:odex_takaful.field_replace_benefit_wizard__old_members_id +msgid "Old Benefit" +msgstr "المستفيد الحالي" + +#. module: odex_takaful +#: model:ir.model.fields,field_description:odex_takaful.field_replace_benefit_wizard__new_members_id +msgid "New Benefit" +msgstr "المستفيد الجديد" + +#. module: odex_takaful +#: model:ir.model.fields,field_description:odex_takaful.field_replace_benefit_wizard__replacement_reason_id +#: model_terms:ir.ui.view,arch_db:odex_takaful.replace_benefit_wizard_form +msgid "Replacement Reason" +msgstr "سبب الإستبدال" + +#. module: odex_takaful +#: model_terms:ir.ui.view,arch_db:odex_takaful.replace_benefit_wizard_form +msgid "Replace" +msgstr "إستبدال" + +#. module: odex_takaful +#: model:ir.model,name:odex_takaful.model_replace_benefit_wizard +msgid "Replace Benefit" +msgstr "إستبدال مستفيد" + +#. module: odex_takaful +#: model_terms:ir.ui.view,arch_db:odex_takaful.replace_benefit_wizard_form +msgid "Cancel" +msgstr "إلغاء" + diff --git a/odex25_takaful/odex_takaful/models/donation_details_lines.py b/odex25_takaful/odex_takaful/models/donation_details_lines.py index 62905ce04..4ca012fef 100644 --- a/odex25_takaful/odex_takaful/models/donation_details_lines.py +++ b/odex25_takaful/odex_takaful/models/donation_details_lines.py @@ -1049,19 +1049,17 @@ class DonationsDetailsLines(models.Model): def action_view_replacement_wizard(self): self.ensure_one() - wizard = self.env['replacement.wiz'].create({ - 'old_members_id': self.benefit_ids[0].id if self.benefit_ids else False, - 'record_type': self.record_type, - 'sponsorship_id': self.id, - }) - return { - 'name': 'Replacement Wizard', + 'name': 'Benefit Replacement', 'type': 'ir.actions.act_window', - 'res_model': 'replacement.wiz', + 'res_model': 'replace.benefit.wizard', 'view_mode': 'form', - 'res_id': wizard.id, 'target': 'new', + 'context': { + 'default_old_members_id': self.benefit_ids[:1].id or False, + 'default_record_type': self.record_type, + 'default_sponsorship_id': self.id, + } } def action_view_scheduling_lines(self): diff --git a/odex25_takaful/odex_takaful/security/ir.model.access.csv b/odex25_takaful/odex_takaful/security/ir.model.access.csv index 957a061f2..35e6632f1 100644 --- a/odex25_takaful/odex_takaful/security/ir.model.access.csv +++ b/odex25_takaful/odex_takaful/security/ir.model.access.csv @@ -55,7 +55,7 @@ access_group_kufula_user_account_move,access_group_kufula_user_account_move,acco access_group_kufula_user_sale_order,access_group_kufula_user_sale_order,sale.model_sale_order,odex_takaful.group_kufula_user,1,1,1,0 access_group_kufula_user_grant_benefit,access_group_kufula_user_grant_benefit,odex_benefit.model_grant_benefit,odex_takaful.group_kufula_user,1,1,1,0 access_group_kufula_user_res_partner,access_group_kufula_user_res_partner,base.model_res_partner,odex_takaful.group_kufula_user,1,1,1,0 - +access_replace_benefit_wizard,replace.benefit.wizard.access,model_replace_benefit_wizard,odex_takaful.group_kufula_user,1,1,1,1 access_group_esterdad_wizard,access_group_esterdad_wizard,model_esterdad_wizard,,1,1,1,0 access_group_otp_confirmation_wizard,access_group_otp_confirmation_wizard,model_otp_confirmation_wizard,,1,1,1,0 diff --git a/odex25_takaful/odex_takaful/wizards/__init__.py b/odex25_takaful/odex_takaful/wizards/__init__.py index 845092189..2b250a3b5 100644 --- a/odex25_takaful/odex_takaful/wizards/__init__.py +++ b/odex25_takaful/odex_takaful/wizards/__init__.py @@ -9,5 +9,6 @@ from . import transfer_deduction_wizard from . import donation_extension_wizard from . import replace_sponsor_wizard from . import add_benefit_wizard +from . import replace_benefit_wizard from . import account_payment_register from . import esterdad diff --git a/odex25_takaful/odex_takaful/wizards/replace_benefit_wizard.py b/odex25_takaful/odex_takaful/wizards/replace_benefit_wizard.py new file mode 100644 index 000000000..fea63a4d6 --- /dev/null +++ b/odex25_takaful/odex_takaful/wizards/replace_benefit_wizard.py @@ -0,0 +1,108 @@ +# -*- coding: utf-8 -*- +from odoo import models, fields, api, _ +from odoo.exceptions import ValidationError, UserError +from odoo.osv import expression +import logging + +_logger = logging.getLogger(__name__) + +class ReplaceBenefitWizard(models.TransientModel): + _name = 'replace.benefit.wizard' + _description = "Replace Benefit" + + old_members_id = fields.Many2one('family.member', string="Old Benefit", readonly=True) + members_domain_ids = fields.Many2many('family.member', compute='_compute_members_domain_ids') + new_members_id = fields.Many2one('family.member', string="New Benefit", domain="[('id', 'in', members_domain_ids)]") + record_type = fields.Selection([('sponsorship', 'Sponsorship'), ('donation', 'Donation')]) + sponsorship_id = fields.Many2one('donations.details.lines', string="Sponsorship") + replacement_reason_id = fields.Many2one('replacement.reasons', string="Replacement Reason") + + @api.depends('old_members_id') + def _compute_members_domain_ids(self): + for rec in self: + domain = [] + + if rec.record_type == 'sponsorship': + domain = [ + '|', + ('state', '=', 'second_approve'), + '&', + ('state', 'in', ('waiting_approve', 'first_approve')), + ('action_type', '=', 'suspended'), + ('id', '!=', rec.old_members_id.id), ] + + domain = expression.AND([domain, [ + ('member_status', '=', 'benefit'), + ('sponsor_related_id', '=', False), + ('general_restriction', '=', False) + ]]) + + if rec.sponsorship_id.sponsorship_duration == 'temporary': + benefit_age_limit = None + if rec.sponsorship_id.direct_debit: + benefit_age_limit = 16 + elif rec.sponsorship_id.payment_month_count < 6: + benefit_age_limit = 18 + if benefit_age_limit: + domain = expression.AND([domain, [ + ('age', '>=', benefit_age_limit) + ]]) + + members = self.env['family.member'].sudo().search(domain) + + rec.members_domain_ids = members if members else self.env['family.member'].sudo().browse() + + def replacement_benefit_action(self): + + self.ensure_one() + + if not self.sponsorship_id: + raise UserError(_("Please determine sponsorship.")) + + donation_line = self.sponsorship_id + sponsorship_id = donation_line.sponsorship_mechanism_id if donation_line.sponsorship_mechanism_id else donation_line.sponsorship_id + try: + if self.record_type == "sponsorship": + state = donation_line.state + if donation_line.state == 'replace': + state = 'active' + + donation_line.sudo().write({ + 'state': state, + 'benefit_id': self.new_members_id.id, + 'benefit_ids': [(6, 0, [self.new_members_id.id])] + }) + self.old_members_id.sudo().write({ + 'sponsor_related_id': False, + 'kafala_status': 'have_not_kafala' + }) + self.new_members_id.sudo().write({ + 'sponsor_related_id': donation_line.sponsor_id.id, + 'kafala_status': 'have_kafala' + }) + + old_benefit = self.old_members_id.name + new_benefit = self.new_members_id.name + + else: + raise UserError(_("type of record not determine.")) + + self.env['donation.replacement.log'].create({ + 'user_id': self.env.user.id, + 'donation_detail_id': donation_line.id, + 'sponsorship_id': sponsorship_id.id, + 'old_benefit': old_benefit or '', + 'new_benefit': new_benefit or '', + 'record_type': donation_line.record_type, + 'replacement_reason_id': self.replacement_reason_id.id, + }) + + except Exception as e: + raise UserError(_("Error in replacement:\n%s") % str(e)) + + def action_cancel(self): + """ + Cancel the wizard + """ + return {'type': 'ir.actions.act_window_close'} + diff --git a/odex25_takaful/odex_takaful/wizards/replace_benefit_wizard.xml b/odex25_takaful/odex_takaful/wizards/replace_benefit_wizard.xml new file mode 100644 index 000000000..95a0c21c5 --- /dev/null +++ b/odex25_takaful/odex_takaful/wizards/replace_benefit_wizard.xml @@ -0,0 +1,31 @@ + + + + + replace.benefit.wizard.form + replace.benefit.wizard + +
+ + + + + + + + + + + + + + + +
+
+
+
+