From 8a2b0c4bd2c3820ea25b988c7ef19b53c480acad Mon Sep 17 00:00:00 2001 From: Nossibaelhadi Date: Wed, 26 Nov 2025 14:08:19 +0300 Subject: [PATCH 1/3] [FIX] partial payment in extend process --- .../wizards/account_payment_register.py | 14 +- .../wizards/donation_extension_wizard.py | 155 ++++++++++-------- 2 files changed, 103 insertions(+), 66 deletions(-) diff --git a/odex25_takaful/odex_takaful/wizards/account_payment_register.py b/odex25_takaful/odex_takaful/wizards/account_payment_register.py index f3dab7a0f..548d8d1b4 100644 --- a/odex25_takaful/odex_takaful/wizards/account_payment_register.py +++ b/odex25_takaful/odex_takaful/wizards/account_payment_register.py @@ -197,7 +197,19 @@ class AccountRegisterPayment(models.TransientModel): def action_create_payments(self): res = super(AccountRegisterPayment, self).action_create_payments() - if self.env.context.get('dont_redirect_to_payments'): + if self.env.context.get('dont_redirect_to_payments') and self.env.context.get('wiz_id'): + if self.amount < self.env.context.get('default_amount'): + return { + 'type': 'ir.actions.act_window', + 'name': _('Extend Donation'), + 'res_model': 'donation.extension.wizard', + 'view_mode': 'form', + 'target': 'new', + 'res_id': self.env.context.get('wiz_id'), + 'context': { + 'paid_amount': self.amount, + }, + } return { 'type': 'ir.actions.client', 'tag': 'display_notification', diff --git a/odex25_takaful/odex_takaful/wizards/donation_extension_wizard.py b/odex25_takaful/odex_takaful/wizards/donation_extension_wizard.py index cccd3ac65..eaaacd5d7 100644 --- a/odex25_takaful/odex_takaful/wizards/donation_extension_wizard.py +++ b/odex25_takaful/odex_takaful/wizards/donation_extension_wizard.py @@ -39,6 +39,7 @@ class DonationExtensionWizard(models.TransientModel): compute='_compute_total_extension_amount', store=True, ) + paid_amount = fields.Float(string="Paid Amount", readonly=True) @@ -47,14 +48,14 @@ class DonationExtensionWizard(models.TransientModel): 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 not 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)) + # @api.constrains('is_different_payment', 'payment_line_ids') + # def _check_payment_sum_when_different(self): + # for rec in self: + # if not 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,)] @@ -97,73 +98,96 @@ class DonationExtensionWizard(models.TransientModel): """ invoice_ids = self.env['account.move'] donation_line_ids = self.env['donations.details.lines'] + self.paid_amount += self.env.context.get('paid_amount', 0.0) + amount = self.total_extension_amount - self.paid_amount + print(self.env.context.get('paid_amount'),'-------------------------------------',self.paid_amount) + print(self.total_extension_amount,'=================',amount) + for line in self.line_ids: result = line._extend() if result: invoice_ids += result[0] donation_line_ids += result[1] - if invoice_ids and not self.is_different_payment: - invoices = invoice_ids.filtered( - lambda inv: inv.state == 'posted' and inv.move_type in ('out_invoice', 'out_refund')) - if not invoices: - return + if invoice_ids: + return { + 'name': _('Register Payment'), + 'res_model': 'account.payment.register', + 'view_mode': 'form', + 'context': { + 'active_model': 'account.move', + 'active_ids': invoice_ids.ids, + 'default_amount': amount, + 'dont_redirect_to_payments': True, + 'sponsorship_line_ids': self.line_ids.donation_line_id.ids, + 'sponsorship_payment': True, + 'default_sponsorship_payment': True, + 'wiz_id': self.id + # 'force_sponsorship_line_partner_id': self.donation_detail_id.sponsor_id.id, + }, + 'target': 'new', + 'type': 'ir.actions.act_window', + } + # invoices = invoice_ids.filtered( + # lambda inv: inv.state == 'posted' and inv.move_type in ('out_invoice', 'out_refund')) + # if not invoices: + # return - residual_map = {inv.id: float(inv.amount_residual) for inv in invoices} + # residual_map = {inv.id: float(inv.amount_residual) for inv in invoices} + # + # invoices = invoices.sorted(key=lambda r: r.invoice_date or r.date or fields.Date.context_today(self)) - invoices = invoices.sorted(key=lambda r: r.invoice_date or r.date or fields.Date.context_today(self)) + # for pay_line in self.payment_line_ids: + # remaining = float(pay_line.payment_amount or 0.0) + # if float_compare(remaining, 0.0, precision_digits=2) <= 0: + # continue + # + # candidate_invoices = invoices.filtered(lambda inv: inv.partner_id == pay_line.partner_id) + # + # if not candidate_invoices: + # candidate_invoices = invoices + # + # for inv in candidate_invoices: + # if float_compare(remaining, 0.0, precision_digits=2) <= 0: + # break + # + # inv_res = residual_map.get(inv.id, 0.0) + # if float_compare(inv_res, 0.0, precision_digits=2) <= 0: + # continue + # + # pay_amount = min(remaining, inv_res) + # + # payment_register_vals = { + # 'payment_type': 'inbound', + # 'partner_type': 'customer', + # 'partner_id': inv.partner_id.id, + # 'amount': pay_amount, + # 'journal_id': pay_line.journal_id.id, + # # 'payment_method_id': pay_line.payment_method.id, + # 'communication': _("Extension Payment for %s") % inv.name, + # 'transaction_file_attachment': pay_line.payment_file_attachment, + # + # } - for pay_line in self.payment_line_ids: - remaining = float(pay_line.payment_amount or 0.0) - if float_compare(remaining, 0.0, precision_digits=2) <= 0: - continue + # ctx = { + # 'active_model': 'account.move', + # 'active_ids': [inv.id], + # 'dont_redirect_to_payments': True, + # 'sponsorship_line_ids': donation_line_ids.ids, + # 'sponsorship_payment': True, + # 'default_sponsorship_payment': True, + # } - candidate_invoices = invoices.filtered(lambda inv: inv.partner_id == pay_line.partner_id) - - if not candidate_invoices: - candidate_invoices = invoices - - for inv in candidate_invoices: - if float_compare(remaining, 0.0, precision_digits=2) <= 0: - break - - inv_res = residual_map.get(inv.id, 0.0) - if float_compare(inv_res, 0.0, precision_digits=2) <= 0: - continue - - pay_amount = min(remaining, inv_res) - - payment_register_vals = { - 'payment_type': 'inbound', - 'partner_type': 'customer', - 'partner_id': inv.partner_id.id, - 'amount': pay_amount, - 'journal_id': pay_line.journal_id.id, - # 'payment_method_id': pay_line.payment_method.id, - 'communication': _("Extension Payment for %s") % inv.name, - 'transaction_file_attachment': pay_line.payment_file_attachment, - - } - - ctx = { - 'active_model': 'account.move', - 'active_ids': [inv.id], - 'dont_redirect_to_payments': True, - 'sponsorship_line_ids': donation_line_ids.ids, - 'sponsorship_payment': True, - 'default_sponsorship_payment': True, - } - - payment_register = self.env['account.payment.register'].sudo().with_context(ctx).new( - payment_register_vals) - payments = payment_register.action_create_payments() - - inv_sudo = inv.sudo() - inv_sudo.invalidate_cache(['amount_residual']) - new_residual = float(inv_sudo.amount_residual or 0.0) - residual_map[inv.id] = new_residual - - remaining = remaining - pay_amount + # payment_register = self.env['account.payment.register'].sudo().with_context(ctx).new( + # payment_register_vals) + # payments = payment_register.action_create_payments() + # + # inv_sudo = inv.sudo() + # inv_sudo.invalidate_cache(['amount_residual']) + # new_residual = float(inv_sudo.amount_residual or 0.0) + # residual_map[inv.id] = new_residual + # + # remaining = remaining - pay_amount @@ -455,6 +479,7 @@ class DonationExtensionWizardLine(models.TransientModel): 'journal_id': int(kafala_journal_id), 'date': fields.Date.today(), 'partner_id': sponsorship.sponsor_id.id, + 'invoice_origin': sponsorship.code, 'invoice_line_ids': [(0, 0, { 'product_id': donation_line.product_id.id, 'price_unit': self.total_donation_amount, From 26ada1bddc9a18caa8f2324cca456821f8fbb78c Mon Sep 17 00:00:00 2001 From: Nossibaelhadi Date: Wed, 26 Nov 2025 14:23:58 +0300 Subject: [PATCH 2/3] [FIX] test payment --- odex25_takaful/odex_takaful/wizards/donation_extension_wizard.py | 1 - 1 file changed, 1 deletion(-) diff --git a/odex25_takaful/odex_takaful/wizards/donation_extension_wizard.py b/odex25_takaful/odex_takaful/wizards/donation_extension_wizard.py index eaaacd5d7..ce345ddd9 100644 --- a/odex25_takaful/odex_takaful/wizards/donation_extension_wizard.py +++ b/odex25_takaful/odex_takaful/wizards/donation_extension_wizard.py @@ -100,7 +100,6 @@ class DonationExtensionWizard(models.TransientModel): donation_line_ids = self.env['donations.details.lines'] self.paid_amount += self.env.context.get('paid_amount', 0.0) amount = self.total_extension_amount - self.paid_amount - print(self.env.context.get('paid_amount'),'-------------------------------------',self.paid_amount) print(self.total_extension_amount,'=================',amount) for line in self.line_ids: From 192952e8cf1607bba121b8bff84bebe3db7be314 Mon Sep 17 00:00:00 2001 From: Nossibaelhadi Date: Thu, 27 Nov 2025 17:22:54 +0300 Subject: [PATCH 3/3] [FIX] extend donation with payment --- odex25_takaful/odex_takaful/i18n/ar_001.po | 57 +++--------- .../models/donation_details_lines.py | 1 + .../odex_takaful/security/security_data.xml | 11 ++- .../static/src/js/hide_close_button.js | 47 ++++++++++ odex25_takaful/odex_takaful/views/assets.xml | 1 + .../views/donations_details_lines.xml | 16 ++-- .../wizards/account_payment_register.py | 34 +++++++ .../wizards/account_payment_register.xml | 12 +++ .../wizards/donation_extension_wizard.py | 75 +++------------- .../wizards/donation_extension_wizard.xml | 90 +++++-------------- 10 files changed, 158 insertions(+), 186 deletions(-) create mode 100644 odex25_takaful/odex_takaful/static/src/js/hide_close_button.js diff --git a/odex25_takaful/odex_takaful/i18n/ar_001.po b/odex25_takaful/odex_takaful/i18n/ar_001.po index 3582cee76..d971b1bf8 100644 --- a/odex25_takaful/odex_takaful/i18n/ar_001.po +++ b/odex25_takaful/odex_takaful/i18n/ar_001.po @@ -2229,7 +2229,6 @@ msgid "Expire Membership" msgstr "انتهاء العضوية" #. module: odex_takaful -#: model_terms:ir.ui.view,arch_db:odex_takaful.donation_extension_wizard_form #: model_terms:ir.ui.view,arch_db:odex_takaful.takaful_sponsorship_form msgid "Extend" msgstr "تمديد" @@ -7048,7 +7047,6 @@ msgstr "" #. module: odex_takaful #: model_terms:ir.ui.view,arch_db:odex_takaful.add_details_wizard_form -#: model_terms:ir.ui.view,arch_db:odex_takaful.donation_extension_wizard_form #: model_terms:ir.ui.view,arch_db:odex_takaful.refund_wizard_form msgid "or" msgstr "أو" @@ -7509,46 +7507,6 @@ msgstr "سجل الإستبدال" msgid "Paid" msgstr "منتهي" -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_extension_payment_wizard_line__check_number -msgid "Check Number" -msgstr "رقم الشيك" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_extension_payment_wizard_line__journal_id -msgid "Journal" -msgstr "حساب الجمعية" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_extension_payment_wizard_line__partner_bank_id -msgid "Partner Bank" -msgstr "بنك المتبرع" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_extension_payment_wizard_line__payment_amount -msgid "Payment Amount" -msgstr "المبلغ" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_extension_payment_wizard_line__payment_file_attachment -msgid "Payment Attachment" -msgstr "مرفق الدفع" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_extension_payment_wizard_line__payment_method -msgid "Payment Method" -msgstr "طريقة الدفع" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_extension_payment_wizard_line__check_due_date -msgid "Check Due Date" -msgstr "تاريخ الإستحقاق" - -#. module: odex_takaful -#: model:ir.model.fields,field_description:odex_takaful.field_extension_payment_wizard_line__check_number -msgid "Check Number" -msgstr "رقم الشيك" - #. module: odex_takaful #: model:ir.model.fields,field_description:odex_takaful.field_donation_extension_wizard__is_different_payment msgid "Is Different Payment" @@ -7561,5 +7519,16 @@ msgstr "حساب الجمعية" #. module: odex_takaful #: model_terms:ir.ui.view,arch_db:odex_takaful.donation_extension_wizard_form -msgid "Sub Payments" -msgstr "دفع متعدد" \ No newline at end of file +msgid "Extend" +msgstr "تمديد/دفع" + +#. module: odex_takaful +#: model:ir.model.fields,field_description:odex_takaful.field_donation_extension_wizard__total_extension_amount +#: model:ir.model.fields,field_description:odex_takaful.field_donation_extension_wizard_line__total_donation_amount +msgid "Total Extension Amount" +msgstr "إجمالي مبلغ الدفع" + +#. module: odex_takaful +#: model:ir.model.fields,field_description:odex_takaful.field_donation_extension_wizard__remaining_amount +msgid "Remaining Amount" +msgstr "المبلغ المتبقى" diff --git a/odex25_takaful/odex_takaful/models/donation_details_lines.py b/odex25_takaful/odex_takaful/models/donation_details_lines.py index ee84a3f7b..cc33b2c35 100644 --- a/odex25_takaful/odex_takaful/models/donation_details_lines.py +++ b/odex25_takaful/odex_takaful/models/donation_details_lines.py @@ -1137,6 +1137,7 @@ class DonationsDetailsLines(models.Model): 'target': 'new', 'context': { 'donation_detail_ids': self.ids, + 'no_quick_close': True }, } diff --git a/odex25_takaful/odex_takaful/security/security_data.xml b/odex25_takaful/odex_takaful/security/security_data.xml index d53169341..6cd9e1484 100644 --- a/odex25_takaful/odex_takaful/security/security_data.xml +++ b/odex25_takaful/odex_takaful/security/security_data.xml @@ -196,7 +196,16 @@ - + + Branch Manager can only see all his branch sponsorships and donations Lines + + + [('branch_custom_id.branch.manager_id.user_id', 'in', [user.id, False])] + + + + + Sponsorship System Manager diff --git a/odex25_takaful/odex_takaful/static/src/js/hide_close_button.js b/odex25_takaful/odex_takaful/static/src/js/hide_close_button.js new file mode 100644 index 000000000..a06b47186 --- /dev/null +++ b/odex25_takaful/odex_takaful/static/src/js/hide_close_button.js @@ -0,0 +1,47 @@ +odoo.define('odex_takaful.hide_close_button', function (require) { + "use strict"; + + const Dialog = require('web.Dialog'); + const ActionManager = require('web.ActionManager'); + + Dialog.include({ + /** + * @override + */ + open: function () { + var self = this; + this.opened(function () { + setTimeout(function () { + var parent = self.getParent(); + + if (parent instanceof ActionManager) { + + var action = parent.getCurrentActionInDialog(); + console.log(action); + if (action) { + + if (action.context) { + let model = action.res_model; + if (model === 'donation.extension.wizard' || model === 'account.payment.register') { + if (self.$modal) { + self.$modal.find('.modal-header button.close').hide(); + self.$modal.find('.modal-header .modal-title').css("width", "100%"); + } + + if (self.$el) { + self.$el.find('.o_cp_top_left').hide(); + self.$el.find('.o_cp_bottom_left').hide(); + self.$el.find('.o_cp_top_right').css("width", "100%"); + self.$el.find('.o_cp_bottom_right').css("width", "100%"); + } + } + } + } + } + }, 0); + }); + + return this._super.apply(this, arguments); + }, + }); +}); diff --git a/odex25_takaful/odex_takaful/views/assets.xml b/odex25_takaful/odex_takaful/views/assets.xml index 8b0a40f23..9c3de7b04 100644 --- a/odex25_takaful/odex_takaful/views/assets.xml +++ b/odex25_takaful/odex_takaful/views/assets.xml @@ -8,6 +8,7 @@