From 2d7e39397862da4411ce317eca18a37817b268da Mon Sep 17 00:00:00 2001 From: Nossibaelhadi Date: Mon, 17 Nov 2025 17:35:16 +0300 Subject: [PATCH 01/23] FIX view benefit in same record --- .../models/donation_details_lines.py | 17 +++++++++++++++++ .../wizards/account_payment_register.py | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/odex25_ensan/odex_takaful/models/donation_details_lines.py b/odex25_ensan/odex_takaful/models/donation_details_lines.py index 01343c648..bc6d92a29 100644 --- a/odex25_ensan/odex_takaful/models/donation_details_lines.py +++ b/odex25_ensan/odex_takaful/models/donation_details_lines.py @@ -216,6 +216,12 @@ class DonationsDetailsLines(models.Model): for rec in self: rec.total_months_amount = rec.donation_amount * rec.payment_month_count + @api.onchange('sponsorship_duration') + def _onchange_sponsorship_duration(self): + for rec in self: + if rec.sponsorship_duration == "permanent": + rec.direct_debit = False + @api.onchange('product_template_id') def _onchange_product_template_id(self): for rec in self: @@ -479,6 +485,7 @@ class DonationsDetailsLines(models.Model): self._onchange_sponsorship_type() return res + @api.onchange('donation_types', 'donation_type') def _onchange_sponsorship_type(self): for rec in self: @@ -632,6 +639,16 @@ class DonationsDetailsLines(models.Model): domain = expression.AND([domain, [ ('age', '>=', benefit_age_limit) ]]) + if rec.sponsorship_id or rec.sponsorship_mechanism_id: + all_benefit_ids = ( + + ( + rec.sponsorship_mechanism_id.donations_details_lines_mechanism_ids if rec.sponsorship_mechanism_id else + self.env['donations.details.lines']) + ) + selected_benefit_ids = all_benefit_ids.mapped('benefit_ids').ids + domain = expression.AND([domain, [('id', 'not in', selected_benefit_ids)]]) + elif rec.record_type == 'donation' and rec.donation_mechanism == "with_conditions" and rec.family_id: domain = [("benefit_id", "=", rec.family_id.id)] members = self.env['family.member'].sudo().search(domain) diff --git a/odex25_ensan/odex_takaful/wizards/account_payment_register.py b/odex25_ensan/odex_takaful/wizards/account_payment_register.py index dd0e0bbb5..ec09ec848 100644 --- a/odex25_ensan/odex_takaful/wizards/account_payment_register.py +++ b/odex25_ensan/odex_takaful/wizards/account_payment_register.py @@ -44,7 +44,7 @@ class AccountRegisterPayment(models.TransientModel): j_type = "" if payment_method == "cash": j_type = "cash" - elif payment_method in ("bank", "check"): + elif payment_method in ("bank", "check","network"): j_type = "bank" if j_type: return {"domain": {"journal_id": [("type", "=", j_type)]}} From 09f06c82f79d005e77f9e3cc48f025f2557dcd8f Mon Sep 17 00:00:00 2001 From: Nossibaelhadi Date: Tue, 18 Nov 2025 04:19:18 +0300 Subject: [PATCH 02/23] FIX partial payment in extend --- .../odex_takaful/security/ir.model.access.csv | 2 +- .../wizards/account_payment_register.xml | 65 ---------- .../wizards/donation_extension_wizard.py | 117 +++++++++++++++++- .../wizards/donation_extension_wizard.xml | 63 ++++++++++ .../wizards/orphan_replacement_wizard.py | 72 +++++------ 5 files changed, 215 insertions(+), 104 deletions(-) diff --git a/odex25_ensan/odex_takaful/security/ir.model.access.csv b/odex25_ensan/odex_takaful/security/ir.model.access.csv index 9f7dfee61..2c2d827b1 100644 --- a/odex25_ensan/odex_takaful/security/ir.model.access.csv +++ b/odex25_ensan/odex_takaful/security/ir.model.access.csv @@ -49,7 +49,7 @@ access_donation_extension_wizard_line,donation.extension.wizard.line.access,mode access_donation_replacement_log,donation.replacement.log.access,model_donation_replacement_log,odex_takaful.group_kufula_user,1,1,1,0 access_replace_sponsor_wizard,replace.sponsor.wizard.access,model_replace_sponsor_wizard,odex_takaful.group_replace_sponsor,1,1,1,1 access_add_benefit_wizard,add.benefit.wizard.access,model_add_benefit_wizard,odex_takaful.group_kufula_user,1,1,1,1 - +access_extension_payment_wizard_line,extension.payment.wizard.line.access,model_extension_payment_wizard_line,odex_takaful.group_kufula_user,1,1,1,1 access_group_kufula_user_product_template,access_group_kufula_user_product_template,product.model_product_template,odex_takaful.group_kufula_user,1,1,0,0 access_group_kufula_user_account_move,access_group_kufula_user_account_move,account.model_account_move,odex_takaful.group_kufula_user,1,1,1,0 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 diff --git a/odex25_ensan/odex_takaful/wizards/account_payment_register.xml b/odex25_ensan/odex_takaful/wizards/account_payment_register.xml index 1c8d4870a..8b838ea26 100644 --- a/odex25_ensan/odex_takaful/wizards/account_payment_register.xml +++ b/odex25_ensan/odex_takaful/wizards/account_payment_register.xml @@ -51,71 +51,6 @@ attrs="{'invisible': ['|', ('sponsorship_payment', '=', False), ('takaful_payment_method','not in',['bank', 'check'])], 'required': [('sponsorship_payment', '=', True), ('takaful_payment_method','=','bank')]}"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/odex25_ensan/odex_takaful/wizards/donation_extension_wizard.py b/odex25_ensan/odex_takaful/wizards/donation_extension_wizard.py index 9bd061fd6..eceab07a5 100644 --- a/odex25_ensan/odex_takaful/wizards/donation_extension_wizard.py +++ b/odex25_ensan/odex_takaful/wizards/donation_extension_wizard.py @@ -3,6 +3,8 @@ from odoo import models, fields, api, _ from odoo.exceptions import ValidationError from dateutil.relativedelta import relativedelta import logging +from odoo.tools import float_compare + _logger = logging.getLogger(__name__) @@ -17,6 +19,12 @@ class DonationExtensionWizard(models.TransientModel): required=True, default=lambda self: self._compute_line_ids(), ) + + payment_line_ids = fields.One2many( + 'extension.payment.wizard.line', + 'wizard_id', + string='Payments', + ) months = fields.Integer( string='Extension Months', @@ -25,6 +33,27 @@ class DonationExtensionWizard(models.TransientModel): help='Number of months to extend' ) + is_different_payment = fields.Boolean(string='Is Different Payment') + total_extension_amount = fields.Float( + string='Total Extension Amount', + compute='_compute_total_extension_amount', + store=True, + ) + + @api.depends('line_ids.total_donation_amount') + def _compute_total_extension_amount(self): + for rec in self: + rec.total_extension_amount = sum(line.total_donation_amount for line in rec.line_ids if line.direct_debit == False) + + @api.constrains('is_different_payment', 'payment_line_ids') + def _check_payment_sum_when_different(self): + for rec in self: + if rec.is_different_payment: + sum_payments = sum(line.payment_amount for line in rec.payment_line_ids) + if float_compare(sum_payments, rec.total_extension_amount, precision_digits=2) != 0: + raise ValidationError(_("Total payment amounts (%s) must equal total extension amount (%s).") % + (sum_payments, rec.total_extension_amount)) + def _compute_line_ids(self): extension_line_ids = [(5,)] donation_detail_ids = self.env['donations.details.lines'].browse(self.env.context.get('donation_detail_ids')) @@ -58,8 +87,28 @@ class DonationExtensionWizard(models.TransientModel): if result: invoice_ids += result[0] donation_line_ids += result[1] - - if invoice_ids: + + if invoice_ids and self.is_different_payment: + for pay_line in self.payment_line_ids: + payment_register_vals = { + 'payment_type': 'inbound', + 'partner_type': 'customer', + 'partner_id': pay_line.partner_id.id, + 'amount': pay_line.payment_amount, + 'journal_id': pay_line.journal_id.id, + 'payment_method_id': pay_line.payment_method.id, + 'communication': _("Extension Payment"), + } + + payment_register = self.env['account.payment.register'].sudo().with_context( + active_model='account.move', + active_ids=invoice_ids.ids, + ).create(payment_register_vals) + print('.................',payment_register) + payment_register.action_create_payments() + + + elif invoice_ids and not self.is_different_payment: return { 'name': _('Register Payment'), 'res_model': 'account.payment.register', @@ -96,6 +145,70 @@ class DonationExtensionWizard(models.TransientModel): """ return {'type': 'ir.actions.act_window_close'} +class ExtensionPaymentWizardLine(models.TransientModel): + _name = 'extension.payment.wizard.line' + _description = "Extension Payment Wizard Line" + + @api.model + def _default_journal_id(self): + journal_id = self.env.company.sponsorship_direct_debit_journal_id.id + return journal_id if journal_id else False + @api.model + def _default_payment_method_id(self): + payment_method = self.env['takaful.payment.method'].sudo().search( + [('payment_method', '=', 'cash')], + limit=1 + ) + return payment_method.id if payment_method else False + + + wizard_id = fields.Many2one('donation.extension.wizard', string='Wizard', required=True) + donation_line_ids = fields.Many2many('donations.details.lines') + payment_method = fields.Many2one('takaful.payment.method', string="Payment Method", required=True, default=_default_payment_method_id) + partner_bank_id = fields.Many2one("res.partner.bank", string="Partner Bank", domain="[('partner_id', '=', partner_id)]") + payment_file_attachment = fields.Binary(string='Payment Attachment', attachment=True) + journal_id = fields.Many2one('account.journal', string="Journal", domain="[('type','=','bank')]", + default=_default_journal_id) + check_number = fields.Char(string='Check Number') + check_due_date = fields.Date(string='Check Due Date') + payment_amount = fields.Float(string='Payment Amount', + help="Amount to be paid for this line (when different payments used).", + default=0.0) + currency_id = fields.Many2one('res.currency', string='Currency', + default=lambda self: self.env.company.currency_id, readonly=True) + payment_method_type= fields.Selection(related='payment_method.payment_method') + partner_id = fields.Many2one( + 'res.partner', + compute='_compute_partner_id', + store=True + ) + + @api.onchange('payment_method') + def _onchange_payment_method(self): + if self.wizard_id and not self.donation_line_ids: + self.donation_line_ids = self.wizard_id.line_ids.mapped('donation_line_id').ids + + @api.depends('donation_line_ids') + def _compute_partner_id(self): + for rec in self: + first_line = rec.donation_line_ids[:1] + rec.partner_id = first_line.sponsor_id.id if first_line else False + + @api.onchange("payment_method") + def onchange_payment_method(self): + for rec in self: + if rec.payment_method and rec.payment_method.journal_id: + rec.journal_id = rec.payment_method.journal_id.id + payment_method = rec.payment_method.payment_method + j_type = "" + if payment_method == "cash": + j_type = "cash" + elif payment_method in ("bank", "check", "network"): + j_type = "bank" + if j_type: + return {"domain": {"journal_id": [("type", "=", j_type)]}} + + class DonationExtensionWizardLine(models.TransientModel): _name = 'donation.extension.wizard.line' _description = "Donation Extension Wizard Line" diff --git a/odex25_ensan/odex_takaful/wizards/donation_extension_wizard.xml b/odex25_ensan/odex_takaful/wizards/donation_extension_wizard.xml index 637892772..51bea1b4c 100644 --- a/odex25_ensan/odex_takaful/wizards/donation_extension_wizard.xml +++ b/odex25_ensan/odex_takaful/wizards/donation_extension_wizard.xml @@ -10,6 +10,7 @@ + @@ -77,6 +78,68 @@ + + + + + + + + + + + + + + + + +