From e720913d997af2ea414a51a9431b42125b35793c Mon Sep 17 00:00:00 2001 From: cbeddies Date: Fri, 26 Apr 2024 17:03:10 -0400 Subject: [PATCH] [17.0][UPD] advance_check_void: correct check numbers when multiple check pages are used --- advance_check_void/models/__init__.py | 1 + advance_check_void/models/account_payment.py | 48 +++++++++++++++++-- .../models/print_prenumbered_checks.py | 21 ++++++++ 3 files changed, 67 insertions(+), 3 deletions(-) create mode 100644 advance_check_void/models/print_prenumbered_checks.py diff --git a/advance_check_void/models/__init__.py b/advance_check_void/models/__init__.py index 734980fd1..d1772efd3 100644 --- a/advance_check_void/models/__init__.py +++ b/advance_check_void/models/__init__.py @@ -4,3 +4,4 @@ from . import account_payment from . import payment_check_void from . import payment_check_history +from . import print_prenumbered_checks diff --git a/advance_check_void/models/account_payment.py b/advance_check_void/models/account_payment.py index b179afa4a..fdd2b838e 100644 --- a/advance_check_void/models/account_payment.py +++ b/advance_check_void/models/account_payment.py @@ -1,8 +1,9 @@ # Copyright (C) 2019 - TODAY, Open Source Integrators # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +import math from odoo import _, api, fields, models -from odoo.exceptions import ValidationError +from odoo.exceptions import ValidationError, UserError class AccountPayment(models.Model): @@ -108,9 +109,50 @@ def print_checks(self): ) ) rec.message_post(body=message) - result = super().print_checks() - return result + # Since this method can be called via a client_action_multi, we need to make sure the received records are what we expect + self = self.filtered(lambda r: r.payment_method_line_id.code == 'check_printing' and r.state != 'reconciled') + + if len(self) == 0: + raise UserError(_("Payments to print as a checks must have 'Check' selected as payment method and " + "not have already been reconciled")) + if any(payment.journal_id != self[0].journal_id for payment in self): + raise UserError(_("In order to print multiple checks at once, they must belong to the same bank journal.")) + + if not self[0].journal_id.check_manual_sequencing: + # The wizard asks for the number printed on the first pre-printed check + # so payments are attributed the number of the check the'll be printed on. + self.env.cr.execute(""" + SELECT payment.id + FROM account_payment payment + JOIN account_move move ON movE.id = payment.move_id + WHERE journal_id = %(journal_id)s + AND payment.check_number IS NOT NULL + ORDER BY payment.check_number::BIGINT DESC + LIMIT 1 + """, { + 'journal_id': self.journal_id.id, + }) + last_printed_check = self.browse(self.env.cr.fetchone()) + bills_per_check = self.env['ir.config_parameter'].sudo().get_param('advance_check_void.bills_per_check') or 9 + number_len = len(last_printed_check.check_number or "") + next_check_number = '%0{}d'.format(number_len) % (int(last_printed_check.check_number) + (math.ceil(len(last_printed_check.reconciled_bill_ids) / bills_per_check) or 1)) + + return { + 'name': _('Print Pre-numbered Checks'), + 'type': 'ir.actions.act_window', + 'res_model': 'print.prenumbered.checks', + 'view_mode': 'form', + 'target': 'new', + 'context': { + 'payment_ids': self.ids, + 'default_next_check_number': next_check_number, + } + } + else: + self.filtered(lambda r: r.state == 'draft').action_post() + return self.do_print_checks() + def void_check_button(self): return { "name": _("Void Check"), diff --git a/advance_check_void/models/print_prenumbered_checks.py b/advance_check_void/models/print_prenumbered_checks.py new file mode 100644 index 000000000..4d1d10397 --- /dev/null +++ b/advance_check_void/models/print_prenumbered_checks.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +import math +from odoo import models, _ + + +class PrintPreNumberedChecks(models.TransientModel): + _inherit = 'print.prenumbered.checks' + + def print_checks(self): + check_number = int(self.next_check_number) + number_len = len(self.next_check_number or "") + payments = self.env['account.payment'].browse(self.env.context['payment_ids']) + payments.filtered(lambda r: r.state == 'draft').action_post() + payments.filtered(lambda r: r.state == 'posted' and not r.is_move_sent).write({'is_move_sent': True}) + for payment in payments: + bills_per_check = self.env['ir.config_parameter'].sudo().get_param('advance_check_void.bills_per_check') or 9 + payment.check_number = '%0{}d'.format(number_len) % check_number + check_number += (math.ceil(len(payment.reconciled_bill_ids) / bills_per_check) or 1) + return payments.do_print_checks()