From 8b1ed8e510f1324f1c3579b844c19ccceaf05d57 Mon Sep 17 00:00:00 2001 From: Laurent Smet Date: Thu, 25 Aug 2022 15:08:58 +0000 Subject: [PATCH] [REV] account: cash discount improvements Current task is not covered the whole cash discount feature. For now, we decided to revert the current feature and make a new more complete one later. This reverts commit 7482aff6d719722f93f71d169d27d1c3e156ebd7. closes odoo/odoo#98986 Related: odoo/enterprise#30783 Signed-off-by: Quentin De Paoli --- addons/account/models/account_move.py | 51 --- addons/account/models/account_payment_term.py | 38 --- .../account/models/account_reconcile_model.py | 126 ++----- addons/account/models/account_tax.py | 43 +-- addons/account/models/chart_template.py | 30 -- addons/account/models/company.py | 7 +- addons/account/models/res_config_settings.py | 15 - addons/account/tests/__init__.py | 1 - .../tests/test_early_payment_discount.py | 316 ------------------ .../test_reconciliation_matching_rules.py | 13 +- .../views/account_payment_term_views.xml | 42 --- addons/account/views/report_invoice.xml | 24 +- .../views/res_config_settings_views.xml | 8 - .../wizard/account_payment_register.py | 139 +------- .../wizard/account_payment_register_views.xml | 5 - 15 files changed, 68 insertions(+), 790 deletions(-) delete mode 100644 addons/account/tests/test_early_payment_discount.py diff --git a/addons/account/models/account_move.py b/addons/account/models/account_move.py index 7beb1b297b4..e05946459d5 100644 --- a/addons/account/models/account_move.py +++ b/addons/account/models/account_move.py @@ -444,12 +444,6 @@ class AccountMove(models.Model): tracking=True, ) - # ==== Early payment cash discount field ==== - invoice_early_pay_amount_after_discount = fields.Monetary( - compute='_compute_early_pay_amount_after_discount', - help="Total amount left to pay after the discount was applied", - ) - # === Reverse feature fields === # reversed_entry_id = fields.Many2one( comodel_name='account.move', @@ -1162,21 +1156,6 @@ class AccountMove(models.Model): # Non-invoice moves don't support that field (because of multicurrency: all lines of the invoice share the same currency) move.tax_totals = None - def _get_report_early_payment_totals_values(self): - self.ensure_one() - - if self.move_type not in ['out_invoice', 'out_receipt', 'in_invoice', 'in_receipt'] or \ - not self.payment_state == 'not_paid' or \ - not self.invoice_payment_term_id.has_early_payment: - return - - base_lines = self.line_ids.filtered(lambda x: x.display_type == 'product') - return self.env['account.tax']._prepare_tax_totals( - [x._convert_to_tax_base_line_dict() for x in base_lines], - self.currency_id, - early_payment_term=self.invoice_payment_term_id, - ) - @api.depends('partner_id', 'invoice_source_email', 'partner_id.name') def _compute_invoice_partner_display_info(self): for move in self: @@ -1295,36 +1274,6 @@ class AccountMove(models.Model): updated_credit = move.partner_id.credit + move.amount_total_signed move.partner_credit_warning = self._build_credit_warning_message(move, updated_credit) - @api.depends('invoice_payment_term_id', 'amount_residual_signed', 'currency_id') - def _compute_early_pay_amount_after_discount(self): - for record in self: - if record.invoice_payment_term_id.has_early_payment: - percentage_to_discount = record.invoice_payment_term_id.percentage_to_discount - discount_computation = self.invoice_payment_term_id.discount_computation - - discounted_amount_untaxed = (100 - percentage_to_discount) * record.amount_untaxed / 100 - if discount_computation == 'included': - discounted_amount_tax = (100 - percentage_to_discount) * record.amount_tax / 100 - else: - discounted_amount_tax = record.amount_tax - record.invoice_early_pay_amount_after_discount = discounted_amount_untaxed + discounted_amount_tax - if record.currency_id.compare_amounts(record.invoice_early_pay_amount_after_discount, 0.0) <= 0.0: - record.invoice_early_pay_amount_after_discount = 0 - else: - record.invoice_early_pay_amount_after_discount = 0 - - def _is_eligible_for_early_discount(self, payment_date): - ''' - An early payment discount is possible if the option has been activated, - no partial payment was registered, - and the payment date is before the last early_payment_date possible. - ''' - self.ensure_one() - return self.move_type in ['out_invoice', 'out_receipt', 'in_invoice', 'in_receipt'] and \ - self.invoice_payment_term_id.has_early_payment and \ - self.payment_state == 'not_paid' and \ - payment_date <= self.invoice_payment_term_id._get_last_date_for_discount(self.invoice_date) - def _build_credit_warning_message(self, record, updated_credit): ''' Build the warning message that will be displayed in a yellow banner on top of the current record if the partner exceeds a credit limit (set on the company or the partner itself). diff --git a/addons/account/models/account_payment_term.py b/addons/account/models/account_payment_term.py index 48adc657fc0..c7d526c5b06 100644 --- a/addons/account/models/account_payment_term.py +++ b/addons/account/models/account_payment_term.py @@ -4,7 +4,6 @@ from odoo import api, exceptions, fields, models, _ from odoo.exceptions import UserError, ValidationError from dateutil.relativedelta import relativedelta -from datetime import timedelta class AccountPaymentTerm(models.Model): @@ -22,17 +21,6 @@ class AccountPaymentTerm(models.Model): company_id = fields.Many2one('res.company', string='Company') sequence = fields.Integer(required=True, default=10) - # -------Early payment discount fields------- - early_payment_applicable = fields.Boolean(string="True if the conditions required to offer an EPD are fulfilled.", compute="_compute_early_payment_applicable") - has_early_payment = fields.Boolean(string="Apply Early Payment Discount", compute="_compute_has_early_payment", readonly=False, store=True) - percentage_to_discount = fields.Float("Discount", digits='Discount', default=2) - discount_computation = fields.Selection([ - ('included', 'Tax included'), - ('excluded', 'Tax excluded'), - ], string='Computation', default='included') - discount_days = fields.Integer(string='Availability', required=True, default=7) - discount_account_id = fields.Many2one(comodel_name='account.account', string='Counterpart Account') - @api.constrains('line_ids') def _check_lines(self): for terms in self: @@ -107,32 +95,6 @@ class AccountPaymentTerm(models.Model): ).unlink() return super(AccountPaymentTerm, self).unlink() - @api.depends('line_ids') - def _compute_early_payment_applicable(self): - for term in self: - term.early_payment_applicable = not any(line.value != 'balance' for line in term.line_ids) - - @api.depends('early_payment_applicable') - def _compute_has_early_payment(self): - for term in self: - if not term.early_payment_applicable: - term.has_early_payment = False - - @api.onchange('discount_days') - def _onchange_discount_days(self): - if self.discount_days <= 0: - raise ValidationError(_("The discount availability must be strictly positive.")) - - @api.onchange('percentage_to_discount') - def _onchange_percentage_to_discount(self): - if self.percentage_to_discount <= 0: - raise ValidationError(_("The discount percentage must be strictly positive.")) - if self.percentage_to_discount > 100: - raise ValidationError(_("The discount percentage cannot exceed 100.")) - - def _get_last_date_for_discount(self, move_date): - return move_date + timedelta(days=self.discount_days) - class AccountPaymentTermLine(models.Model): _name = "account.payment.term.line" diff --git a/addons/account/models/account_reconcile_model.py b/addons/account/models/account_reconcile_model.py index 9c7dff3f4ae..0d2d67f8e39 100644 --- a/addons/account/models/account_reconcile_model.py +++ b/addons/account/models/account_reconcile_model.py @@ -809,126 +809,74 @@ class AccountReconcileModel(models.Model): return self.env['res.partner'] def _get_invoice_matching_amls_result(self, st_line, partner, candidate_vals): - def _create_result_dict(amls_values_list, status): - if 'rejected' in status: - return - - result = { - 'amls': self.env['account.move.line'], - 'amls_values_list': amls_values_list, - } - for aml_values in amls_values_list: - result['amls'] |= aml_values['aml'] - - if 'allow_write_off' in status and self.line_ids: - result['status'] = 'write_off' - - if 'allow_auto_reconcile' in status and candidate_vals['allow_auto_reconcile'] and self.auto_reconcile: - result['auto_reconcile'] = True - - return result - st_line_currency = st_line.foreign_currency_id or st_line.currency_id - st_line_amount = st_line._prepare_move_line_default_vals()[1]['amount_currency'] - sign = 1 if st_line_amount > 0.0 else -1 amls = candidate_vals['amls'] - amls_values_list = [] - same_currency_mode = amls.currency_id == st_line_currency - for aml in amls: - extra_aml_values = {} + if amls.currency_id == st_line_currency: + st_line_amount = st_line._prepare_move_line_default_vals()[1]['amount_currency'] + sign = 1 if st_line_amount > 0.0 else -1 - amount_residual = aml.amount_residual - amount_residual_currency = aml.amount_residual_currency + kepts_amls = self.env['account.move.line'] + sum_aml_residual = 0.0 + for aml in amls: - # Manage the early payment discount. - if same_currency_mode and aml.move_id._is_eligible_for_early_discount(st_line.date): - amount_residual = aml.move_id.amount_total_signed - amount_residual_currency = -aml.move_id.invoice_early_pay_amount_after_discount * sign - discounted_balance = aml.amount_residual_currency - amount_residual_currency - - if aml.move_id.move_type == 'out_invoice': - account = aml.company_id.account_journal_cash_discount_expense_id - else: - account = aml.company_id.account_journal_cash_discount_income_id - - extra_aml_values['early_payment_vals'] = { - 'name': _("%s - Early Payment Discount", aml.display_name), - 'account': account, - 'balance': discounted_balance, - } - - amls_values_list.append({ - 'aml': aml, - 'amount_residual': amount_residual, - 'amount_residual_currency': amount_residual_currency, - **extra_aml_values, - }) - - kepts_amls_values_list = [] - sum_amount_residual_currency = 0.0 - if same_currency_mode: - for aml_values in amls_values_list: - - if st_line_currency.compare_amounts(st_line_amount, -aml_values['amount_residual_currency']) == 0: + if st_line_currency.compare_amounts(st_line_amount, -aml.amount_residual_currency) == 0: # Special case: the amounts are the same, submit the line directly. - kepts_amls_values_list = [aml_values] + kepts_amls = aml break - if st_line_currency.compare_amounts(sign * (st_line_amount + sum_amount_residual_currency), 0.0) > 0: + elif st_line_currency.compare_amounts(sign * (st_line_amount + sum_aml_residual), 0.0) > 0: # Here, we still have room for other candidates ; so we add the current one to the list we keep. # Then, we continue iterating, even if there is no room anymore, just in case one of the following candidates # is an exact match, which would then be preferred on the current candidates. - kepts_amls_values_list.append(aml_values) - sum_amount_residual_currency += aml_values['amount_residual_currency'] + kepts_amls |= aml + sum_aml_residual += aml.amount_residual_currency + else: + kepts_amls = amls - # Try to match the amls having the same currency as the statement line. - if kepts_amls_values_list: - status = self._check_rule_propositions(st_line, kepts_amls_values_list) - result = _create_result_dict(kepts_amls_values_list, status) - if result: - return result + # We check the amount criteria of the reconciliation model, and select the + # kept_candidates if they pass the verification. + status = self._check_rule_propositions(st_line, kepts_amls) + if 'rejected' in status: + return None - # Try to match the whole candidates. - if amls: - status = self._check_rule_propositions(st_line, amls_values_list) - result = _create_result_dict(amls_values_list, status) - if result: - return result + rslt = {'amls': kepts_amls} - def _check_rule_propositions(self, st_line, amls_values_list): + if 'allow_write_off' in status and self.line_ids: + rslt['status'] = 'write_off' + + if 'allow_auto_reconcile' in status and candidate_vals['allow_auto_reconcile'] and self.auto_reconcile: + rslt['auto_reconcile'] = True + + return rslt + + def _check_rule_propositions(self, st_line, amls): """ Check restrictions that can't be handled for each move.line separately. Note: Only used by models having a type equals to 'invoice_matching'. - :param st_line: The statement line. - :param amls_values_list: The candidates account.move.line as a list of dict: - * aml: The record. - * amount_residual: The amount residual to consider. - * amount_residual_currency: The amount residual in foreign currency to consider. + + :param st_line: The statement line. + :param amls: The candidates account.move.line. :return: A string representing what to do with the candidates: * rejected: Reject candidates. * allow_write_off: Allow to generate the write-off from the reconcile model lines if specified. * allow_auto_reconcile: Allow to automatically reconcile entries if 'auto_validate' is enabled. """ - self.ensure_one() - if not self.allow_payment_tolerance: return {'allow_write_off', 'allow_auto_reconcile'} + if not amls: + return {'rejected'} - st_line_currency = st_line.foreign_currency_id or st_line.currency_id + currency = st_line.foreign_currency_id or st_line.currency_id st_line_amount_curr = st_line._prepare_move_line_default_vals()[1]['amount_currency'] amls_amount_curr = sum( - st_line._prepare_counterpart_amounts_using_st_line_rate( - aml_values['aml'].currency_id, - aml_values['amount_residual'], - aml_values['amount_residual_currency'], - )['amount_currency'] - for aml_values in amls_values_list + st_line._prepare_counterpart_amounts_using_st_line_rate(aml.currency_id, aml.amount_residual, aml.amount_residual_currency)['amount_currency'] + for aml in amls ) sign = 1 if st_line_amount_curr > 0.0 else -1 amount_curr_after_rec = sign * (amls_amount_curr + st_line_amount_curr) # The statement line will be fully reconciled. - if st_line_currency.is_zero(amount_curr_after_rec): + if currency.is_zero(amount_curr_after_rec): return {'allow_auto_reconcile'} # The payment amount is higher than the sum of invoices. diff --git a/addons/account/models/account_tax.py b/addons/account/models/account_tax.py index 05de92965bb..508f49e933f 100644 --- a/addons/account/models/account_tax.py +++ b/addons/account/models/account_tax.py @@ -807,7 +807,8 @@ class AccountTax(models.Model): 'analytic_account_id': line_vals['analytic_account'].id if tax.analytic else False, } - def _compute_taxes(self, base_lines, tax_lines=None, handle_price_include=True, include_caba_tags=False, early_payment_term=None): + def _compute_taxes(self, base_lines, tax_lines=None, + handle_price_include=True, include_caba_tags=False): """ Generic method to compute the taxes for different business models. :param base_lines: A list of python dictionaries created using the '_convert_to_tax_base_line_dict' method. @@ -815,7 +816,6 @@ class AccountTax(models.Model): :param handle_price_include: Manage the price-included taxes. If None, use the 'handle_price_include' key set on base lines. :param include_caba_tags: Manage tags for taxes being exigible on_payment. - :param early_payment_term: The payment term to consider for the early payment discount. :return: A python dictionary containing: The complete diff on tax lines if 'tax_lines' is passed as parameter: @@ -852,15 +852,10 @@ class AccountTax(models.Model): base_line_map = {} for line_vals in base_lines: - orig_price_unit_after_discount = line_vals['price_unit'] * (1 - (line_vals['discount'] / 100.0)) - price_unit_after_discount = orig_price_unit_after_discount + price_unit_after_discount = line_vals['price_unit'] * (1 - (line_vals['discount'] / 100.0)) taxes = line_vals['taxes']._origin currency = line_vals['currency'] or self.env.company.currency_id - if early_payment_term and early_payment_term.has_early_payment: - remaining_part_to_consider = (100 - early_payment_term.percentage_to_discount) / 100.0 - price_unit_after_discount = remaining_part_to_consider * price_unit_after_discount - if taxes: if handle_price_include is None: @@ -885,24 +880,6 @@ class AccountTax(models.Model): 'price_total': taxes_res['total_included'], } - if early_payment_term \ - and early_payment_term.has_early_payment \ - and early_payment_term.discount_computation == 'excluded': - new_taxes_res = taxes.with_context(**line_vals['extra_context']).compute_all( - orig_price_unit_after_discount, - currency=currency, - quantity=line_vals['quantity'], - product=line_vals['product'], - partner=line_vals['partner'], - is_refund=line_vals['is_refund'], - handle_price_include=manage_price_include, - include_caba_tags=include_caba_tags, - ) - for tax_res, new_taxes_res in zip(taxes_res['taxes'], new_taxes_res['taxes']): - delta_tax = new_taxes_res['amount'] - tax_res['amount'] - tax_res['amount'] += delta_tax - to_update_vals['price_total'] += delta_tax - for tax_res in taxes_res['taxes']: grouping_dict = self._get_generation_dict_from_base_line(line_vals, tax_res) tax_res['grouping_dict'] = grouping_dict @@ -1029,14 +1006,13 @@ class AccountTax(models.Model): }) return tax_group_vals_list - def _prepare_tax_totals(self, base_lines, currency, tax_lines=None, early_payment_term=None): + def _prepare_tax_totals(self, base_lines, currency, tax_lines=None): """ Compute the tax totals details for the business documents. - :param base_lines: A list of python dictionaries created using the '_convert_to_tax_base_line_dict' method. - :param currency: The currency set on the business document. - :param tax_lines: Optional list of python dictionaries created using the '_convert_to_tax_line_dict' method. - If specified, the taxes will be recomputed using them instead of recomputing the taxes on - the provided base lines. - :param early_payment_term: The payment term to consider for the early payment discount. + :param base_lines: A list of python dictionaries created using the '_convert_to_tax_base_line_dict' method. + :param currency: The currency set on the business document. + :param tax_lines: Optional list of python dictionaries created using the '_convert_to_tax_line_dict' method. + If specified, the taxes will be recomputed using them instead of recomputing the taxes on + the provided base lines. :return: A dictionary in the following form: { 'amount_total': The total amount to be displayed on the document, including every total @@ -1086,7 +1062,6 @@ class AccountTax(models.Model): tax_results = self._compute_taxes( base_lines, tax_lines=tax_lines, - early_payment_term=early_payment_term, ) for base_line_vals, to_update in tax_results['base_lines_to_update']: diff --git a/addons/account/models/chart_template.py b/addons/account/models/chart_template.py index 03a4f7bfe0d..79f7a31fe1e 100644 --- a/addons/account/models/chart_template.py +++ b/addons/account/models/chart_template.py @@ -136,9 +136,6 @@ class AccountChartTemplate(models.Model): default_cash_difference_expense_account_id = fields.Many2one('account.account.template', string="Cash Difference Expense Account") default_pos_receivable_account_id = fields.Many2one('account.account.template', string="PoS receivable account") - account_journal_cash_discount_expense_id = fields.Many2one(comodel_name='account.account.template', string='Cash Discount Write-Off Expense Account',) - account_journal_cash_discount_income_id = fields.Many2one(comodel_name='account.account.template', string='Cash Discount Write-Off Income Account',) - property_account_receivable_id = fields.Many2one('account.account.template', string='Receivable Account') property_account_payable_id = fields.Many2one('account.account.template', string='Payable Account') property_account_expense_categ_id = fields.Many2one('account.account.template', string='Category of Expense Account') @@ -200,24 +197,6 @@ class AccountChartTemplate(models.Model): 'company_id': company.id, }) - @api.model - def _create_cash_discount_expense_account(self, company, code_digits): - return self.env['account.account'].create({ - 'name': _("Cash Discount Expense Account"), - 'code': 999997, - 'account_type': 'expense', - 'company_id': company.id, - }) - - @api.model - def _create_cash_discount_income_account(self, company, code_digits): - return self.env['account.account'].create({ - 'name': _("Cash Discount Income Account"), - 'code': 999998, - 'account_type': 'income_other', - 'company_id': company.id, - }) - def try_loading(self, company=False, install_demo=True): """ Installs this chart of accounts for the current company if not chart of accounts had been created for it yet. @@ -332,13 +311,6 @@ class AccountChartTemplate(models.Model): if not company.account_journal_suspense_account_id: company.account_journal_suspense_account_id = self._create_liquidity_journal_suspense_account(company, self.code_digits) - # Set default cash discount write-off accounts - if not company.account_journal_cash_discount_expense_id: - company.account_journal_cash_discount_expense_id = self._create_cash_discount_expense_account(company, self.code_digits) - - if not company.account_journal_cash_discount_income_id: - company.account_journal_cash_discount_income_id = self._create_cash_discount_income_account(company, self.code_digits) - if not company.account_journal_payment_debit_account_id: company.account_journal_payment_debit_account_id = self.env['account.account'].create({ 'name': _("Outstanding Receipts"), @@ -645,8 +617,6 @@ class AccountChartTemplate(models.Model): 'account_default_pos_receivable_account_id': self.default_pos_receivable_account_id, 'income_currency_exchange_account_id': self.income_currency_exchange_account_id, 'expense_currency_exchange_account_id': self.expense_currency_exchange_account_id, - 'account_journal_cash_discount_expense_id': self.account_journal_cash_discount_expense_id, - 'account_journal_cash_discount_income_id': self.account_journal_cash_discount_income_id, } values = {} diff --git a/addons/account/models/company.py b/addons/account/models/company.py index 7bf66d19c62..94b969edb26 100644 --- a/addons/account/models/company.py +++ b/addons/account/models/company.py @@ -1,11 +1,10 @@ # -*- coding: utf-8 -*- -import calendar from datetime import timedelta, datetime, date +import calendar from odoo import fields, models, api, _ from odoo.exceptions import ValidationError, UserError, RedirectWarning -from odoo.tools.float_utils import float_round, float_is_zero from odoo.tools.mail import is_html_empty from odoo.tools.misc import format_date from odoo.tools.float_utils import float_round, float_is_zero @@ -66,10 +65,6 @@ class ResCompany(models.Model): account_journal_suspense_account_id = fields.Many2one('account.account', string='Journal Suspense Account') account_journal_payment_debit_account_id = fields.Many2one('account.account', string='Journal Outstanding Receipts Account') account_journal_payment_credit_account_id = fields.Many2one('account.account', string='Journal Outstanding Payments Account') - - account_journal_cash_discount_income_id = fields.Many2one(comodel_name='account.account', string='Cash Discount Write-Off Income Account') - account_journal_cash_discount_expense_id = fields.Many2one(comodel_name='account.account', string='Cash Discount Write-Off Expense Account') - transfer_account_code_prefix = fields.Char(string='Prefix of the transfer accounts') account_sale_tax_id = fields.Many2one('account.tax', string="Default Sale Tax") account_purchase_tax_id = fields.Many2one('account.tax', string="Default Purchase Tax") diff --git a/addons/account/models/res_config_settings.py b/addons/account/models/res_config_settings.py index c4bb9c35922..4c6b482a591 100644 --- a/addons/account/models/res_config_settings.py +++ b/addons/account/models/res_config_settings.py @@ -159,21 +159,6 @@ class ResConfigSettings(models.TransientModel): # Quick encoding (fiduciary mode) quick_edit_mode = fields.Selection(string="Quick encoding", readonly=False, related='company_id.quick_edit_mode') - account_journal_cash_discount_income_id = fields.Many2one( - comodel_name='account.account', - string='Cash Discount Write-Off Income Account', - readonly=False, - related='company_id.account_journal_cash_discount_income_id', - domain="[('deprecated', '=', False), ('company_id', '=', company_id), \ - ('account_type', 'in', ('income', 'income_other'))]") - account_journal_cash_discount_expense_id = fields.Many2one( - comodel_name='account.account', - string='Cash Discount Write-Off Expense Account', - readonly=False, - related='company_id.account_journal_cash_discount_expense_id', - domain="[('deprecated', '=', False), ('company_id', '=', company_id), \ - ('account_type', '=', 'expense')]") - def set_values(self): super().set_values() # install a chart of accounts for the given company (if required) diff --git a/addons/account/tests/__init__.py b/addons/account/tests/__init__.py index 57420cd1bd1..e0ed8e78a1d 100644 --- a/addons/account/tests/__init__.py +++ b/addons/account/tests/__init__.py @@ -36,4 +36,3 @@ from . import test_account_incoming_supplier_invoice from . import test_payment_term from . import test_account_payment_register from . import test_tour -from . import test_early_payment_discount diff --git a/addons/account/tests/test_early_payment_discount.py b/addons/account/tests/test_early_payment_discount.py deleted file mode 100644 index 1d8878e1381..00000000000 --- a/addons/account/tests/test_early_payment_discount.py +++ /dev/null @@ -1,316 +0,0 @@ -# -*- coding: utf-8 -*- -from odoo.addons.account.tests.common import AccountTestInvoicingCommon -from odoo.tests import tagged -from odoo import fields, Command - - -@tagged('post_install', '-at_install') -class TestAccountEarlyPaymentDiscount(AccountTestInvoicingCommon): - - @classmethod - def setUpClass(cls, chart_template_ref=None): - super().setUpClass(chart_template_ref=chart_template_ref) - # Payment Terms - cls.default_pay_term_cash_discount = cls.env['account.payment.term'].create({ - 'name': 'Default Early Payment Cash Discount Payment Term', - 'has_early_payment': True, - 'line_ids': [ - (0, 0, { - 'value': 'balance', - 'days': 0, - 'option': 'day_after_invoice_date', - }), - ], - }) - - cls.pay_term_cash_discount_10_percent_10_days_tax_inc = cls.env['account.payment.term'].create({ - 'name': '10% reduction if payment within 10 days, tax included', - 'has_early_payment': True, - 'discount_days': 10, - 'percentage_to_discount': 10, - 'line_ids': [ - (0, 0, { - 'value': 'balance', - 'days': 0, - 'option': 'day_after_invoice_date', - }), - ], - }) - cls.pay_term_cash_discount_10_percent_10_days_tax_excl = cls.env['account.payment.term'].create({ - 'name': '10% reduction if payment within 10 days, tax excluded', - 'has_early_payment': True, - 'discount_days': 10, - 'percentage_to_discount': 10, - 'discount_computation': 'excluded', - 'line_ids': [ - (0, 0, { - 'value': 'balance', - 'days': 0, - 'option': 'day_after_invoice_date', - }), - ], - }) - # Invoices (account move tests) - cls.inv_1200_10_percents_discount_no_tax = cls.env['account.move'].create({ - 'move_type': 'in_invoice', - 'partner_id': cls.partner_a.id, - 'invoice_date': '2019-01-01', - 'date': '2019-01-01', - 'invoice_line_ids': [(0, 0, { - 'name': 'line', - 'price_unit': 1200.0, - 'tax_ids': [] - })], - 'invoice_payment_term_id': cls.pay_term_cash_discount_10_percent_10_days_tax_inc.id, - }) - cls.inv_1500_10_percents_discount_tax_incl_15_percents_tax = cls.env['account.move'].create({ - 'move_type': 'in_invoice', - 'partner_id': cls.partner_a.id, - 'invoice_date': '2019-01-01', - 'date': '2019-01-01', - 'invoice_line_ids': [(0, 0, { - 'name': 'line', - 'price_unit': 1500.0, - 'tax_ids': [Command.set(cls.product_a.taxes_id.ids)],# 15% - })], - 'invoice_payment_term_id': cls.pay_term_cash_discount_10_percent_10_days_tax_inc.id, - }) - cls.inv_1500_10_percents_discount_tax_excl_15_percents_tax = cls.env['account.move'].create({ - 'move_type': 'in_invoice', - 'partner_id': cls.partner_a.id, - 'invoice_date': '2019-01-01', - 'date': '2019-01-01', - 'invoice_line_ids': [(0, 0, { - 'name': 'line', - 'price_unit': 1500.0, - 'tax_ids': [Command.set(cls.product_a.taxes_id.ids)],# 15% - })], - 'invoice_payment_term_id': cls.pay_term_cash_discount_10_percent_10_days_tax_excl.id, - }) - # Invoices (Payment Register & reconciliation tests) - # -- Customer invoices sharing the same batch - cls.out_invoice_1 = cls.env['account.move'].create({ - 'move_type': 'out_invoice', - 'date': '2017-01-01', - 'invoice_date': '2017-01-01', - 'partner_id': cls.partner_a.id, - 'currency_id': cls.currency_data['currency'].id, - 'invoice_line_ids': [(0, 0, {'product_id': cls.product_a.id, 'price_unit': 1000.0, 'tax_ids': []})], - 'invoice_payment_term_id': cls.default_pay_term_cash_discount.id, - }) - cls.out_invoice_2 = cls.env['account.move'].create({ - 'move_type': 'out_invoice', - 'date': '2017-01-01', - 'invoice_date': '2017-01-01', - 'partner_id': cls.partner_a.id, - 'currency_id': cls.currency_data['currency'].id, - 'invoice_line_ids': [(0, 0, {'product_id': cls.product_a.id, 'price_unit': 2000.0, 'tax_ids': []})], - 'invoice_payment_term_id': cls.default_pay_term_cash_discount.id, - }) - #--Customer invoices from a different batch - cls.out_invoice_3 = cls.env['account.move'].create({ - 'move_type': 'out_invoice', - 'date': '2017-01-01', - 'invoice_date': '2017-01-01', - 'partner_id': cls.partner_b.id, - 'currency_id': cls.currency_data['currency'].id, - 'invoice_line_ids': [(0, 0, {'product_id': cls.product_a.id, 'price_unit': 3000.0, 'tax_ids': []})], - 'invoice_payment_term_id': cls.default_pay_term_cash_discount.id, - }) - cls.out_invoice_4_no_discount = cls.env['account.move'].create({ - 'move_type': 'out_invoice', - 'date': '2017-01-01', - 'invoice_date': '2017-01-01', - 'partner_id': cls.partner_b.id, - 'currency_id': cls.currency_data['currency'].id, - 'invoice_line_ids': [(0, 0, {'product_id': cls.product_a.id, 'price_unit': 5000.0, 'tax_ids': []})], - 'invoice_payment_term_id': None, - }) - - (cls.out_invoice_1 + cls.out_invoice_2 + cls.out_invoice_3 + cls.out_invoice_4_no_discount).action_post() - - # Taxes - cls.tax_10 = cls.env['account.tax'].create({ - 'name': "tax_10", - 'amount_type': 'percent', - 'amount': 10.0, - }) - - cls.tax_20 = cls.env['account.tax'].create({ - 'name': "tax_20", - 'amount_type': 'percent', - 'amount': 20.0, - }) - lines_data = [ - (1100, cls.tax_10 + cls.tax_20), - (1100, cls.tax_10), - (1000, cls.tax_20), - ] - invoice_lines_vals = [ - (0, 0, { - 'name': 'line', - 'account_id': cls.company_data['default_account_revenue'].id, - 'price_unit': amount, - 'tax_ids': [(6, 0, taxes.ids)], - }) - for amount, taxes in lines_data] - cls.taxed_invoice = cls.env['account.move'].create({ - 'move_type': 'out_invoice', - 'partner_id': cls.partner_a.id, - 'invoice_line_ids': invoice_lines_vals, - 'invoice_payment_term_id': cls.pay_term_cash_discount_10_percent_10_days_tax_inc.id, - }) - - # ========================== Tests Payment Terms ========================== - def test_early_payment_assert_default_values(self): - # Check that the early discount payment term is correctly set by default - self.assertRecordValues(self.default_pay_term_cash_discount, [{ - 'discount_computation': 'included', - 'discount_days': 7, - 'percentage_to_discount': 2.0 - }]) - - def test_early_payment_end_date(self): - # Check that the last date of the cash discount availability is correctly computed. - # The default time delay is 7 days after the invoice. - def assertEarlyDiscountPaymentTermDate(pay_term, move_date, expected_date): - self.assertEqual( - pay_term._get_last_date_for_discount(fields.Date.from_string(move_date)), - fields.Date.from_string(expected_date) - ) - assertEarlyDiscountPaymentTermDate(self.default_pay_term_cash_discount, '2022-01-01', '2022-01-08') - assertEarlyDiscountPaymentTermDate(self.default_pay_term_cash_discount, '2022-01-31', '2022-02-07') - assertEarlyDiscountPaymentTermDate(self.default_pay_term_cash_discount, '2022-02-25', '2022-03-04') - - # ========================== Tests Account Move ========================== - def test_early_pay_reduced_amounts(self): - # Check that the monetary amounts after the discount are correct. - # 1200 invoice, no tax, 10% discount - self.assertRecordValues(self.inv_1200_10_percents_discount_no_tax, [{ - 'invoice_early_pay_amount_after_discount': 1080.00, - }]) - # 1500 invoice, 15% tax, 10% discount including taxes - self.assertRecordValues(self.inv_1500_10_percents_discount_tax_incl_15_percents_tax, [{ - 'invoice_early_pay_amount_after_discount': 1552.50, - }]) - # 1500 invoice, 15% tax, 10% discount excluding taxes - self.assertRecordValues(self.inv_1500_10_percents_discount_tax_excl_15_percents_tax, [{ - 'invoice_early_pay_amount_after_discount': 1575.0, - }]) - - # ========================== Tests Payment Register ========================== - def test_register_discounted_payment_on_single_invoice(self): - active_ids = self.out_invoice_1.ids - payments = self.env['account.payment.register'].with_context(active_model='account.move', active_ids=active_ids).create({ - 'payment_date': '2017-01-01', - 'early_pay_discount_toggle_button': True, - })._create_payments() - - self.assertTrue(payments.is_reconciled) - self.assertRecordValues(payments.line_ids.sorted('balance'), [ - {'amount_currency': -1000.0}, - { - 'account_id': self.env.company['account_journal_cash_discount_expense_id'].id, - 'amount_currency': 20.0, - }, - {'amount_currency': 980.0}, - ]) - - def test_register_discounted_payment_on_batched_invoice(self): - active_ids = (self.out_invoice_1 + self.out_invoice_2).ids - payment_register = self.env['account.payment.register']\ - .with_context(active_model='account.move', active_ids=active_ids)\ - .create({ - 'payment_date': '2017-01-01', - 'early_pay_discount_toggle_button': True, - }) - payments = payment_register._create_payments() - self.assertRecordValues(payments.line_ids.sorted('balance'), [ - {'amount_currency': -2000.0}, - {'amount_currency': -1000.0}, - { - 'account_id': self.env.company['account_journal_cash_discount_expense_id'].id, - 'amount_currency': 20.0, - }, - { - 'account_id': self.env.company['account_journal_cash_discount_expense_id'].id, - 'amount_currency': 40.0, - }, - {'amount_currency': 980.0}, - {'amount_currency': 1960.0}, - ]) - - self.assertTrue(all(p.is_reconciled for p in payments)) - - def test_register_discounted_payment_on_non_batched_invoice(self): - active_ids = (self.out_invoice_1 + self.out_invoice_2 + self.out_invoice_3).ids - payment_register = self.env['account.payment.register'] \ - .with_context(active_model='account.move', active_ids=active_ids) \ - .create({ - 'payment_date': '2017-01-01', - 'early_pay_discount_toggle_button': True, - }) - payments = payment_register._create_payments() - self.assertRecordValues(payments.line_ids.sorted('balance'), [ - {'amount_currency': -3000.0}, - {'amount_currency': -2000.0}, - {'amount_currency': -1000.0}, - { - 'account_id': self.env.company['account_journal_cash_discount_expense_id'].id, - 'amount_currency': 20.0, - }, - { - 'account_id': self.env.company['account_journal_cash_discount_expense_id'].id, - 'amount_currency': 40.0, - }, - { - 'account_id': self.env.company['account_journal_cash_discount_expense_id'].id, - 'amount_currency': 60.0, - }, - {'amount_currency': 980.0}, - {'amount_currency': 1960.0}, - {'amount_currency': 2940.0}, - ]) - self.assertTrue(all(p.is_reconciled for p in payments)) - - def test_register_discounted_payment_on_non_batched_invoice_one_no_discount(self): - active_ids = (self.out_invoice_3 + self.out_invoice_4_no_discount).ids - payment_register = self.env['account.payment.register'] \ - .with_context(active_model='account.move', active_ids=active_ids) \ - .create({ - 'payment_date': '2017-01-01', - 'early_pay_discount_toggle_button': True, - }) - payments = payment_register._create_payments() - self.assertRecordValues(payments.line_ids.sorted('balance'), [ - {'amount_currency': -5000.0}, - {'amount_currency': -3000.0}, - { - 'account_id': self.env.company['account_journal_cash_discount_expense_id'].id, - 'amount_currency': 60.0, - }, - {'amount_currency': 2940.0}, - {'amount_currency': 5000.0}, - ]) - self.assertTrue(all(p.is_reconciled for p in payments)) - - def test_register_payment_deactivate_discount(self): - active_ids = self.out_invoice_3.ids - payment_register = self.env['account.payment.register'] \ - .with_context(active_model='account.move', active_ids=active_ids) \ - .create({ - 'payment_date': '2017-01-01', - 'early_pay_discount_toggle_button': False, - }) - payments = payment_register._create_payments() - self.assertRecordValues(payments.line_ids.sorted('balance'), [ - {'amount_currency': -3000.0}, - {'amount_currency': 3000.0}, - ]) - self.assertTrue(payments.is_reconciled) - - def test_early_payment_taxes_computation(self): - result = self.taxed_invoice._get_report_early_payment_totals_values() - self.assertEqual(result['amount_total'], 3456) - self.assertEqual(result['amount_untaxed'], 2880) - self.assertEqual(result['groups_by_subtotal']['Untaxed Amount'][0]['tax_group_amount'], 576) diff --git a/addons/account/tests/test_reconciliation_matching_rules.py b/addons/account/tests/test_reconciliation_matching_rules.py index 125420fdede..e29fc59043e 100644 --- a/addons/account/tests/test_reconciliation_matching_rules.py +++ b/addons/account/tests/test_reconciliation_matching_rules.py @@ -234,7 +234,6 @@ class TestReconciliationMatchingRules(AccountTestInvoicingCommon): def _check_statement_matching(self, rules, expected_values_list): for statement_line, expected_values in expected_values_list.items(): res = rules._apply_rules(statement_line, statement_line._retrieve_partner()) - res.pop('amls_values_list', None) self.assertDictEqual(res, expected_values) def test_matching_fields(self): @@ -259,26 +258,20 @@ class TestReconciliationMatchingRules(AccountTestInvoicingCommon): match_text_location_reference=False, match_text_location_note=False, ) - rslt = rule._apply_rules(st_line, st_line._retrieve_partner()) - rslt.pop('amls_values_list') self.assertDictEqual( - rslt, + rule._apply_rules(st_line, st_line._retrieve_partner()), {'amls': inv1, 'model': rule}, ) rule.match_text_location_reference = True - rslt = rule._apply_rules(st_line, st_line._retrieve_partner()) - rslt.pop('amls_values_list') self.assertDictEqual( - rslt, + rule._apply_rules(st_line, st_line._retrieve_partner()), {'amls': inv2, 'model': rule}, ) rule.match_text_location_note = True - rslt = rule._apply_rules(st_line, st_line._retrieve_partner()) - rslt.pop('amls_values_list') self.assertDictEqual( - rslt, + rule._apply_rules(st_line, st_line._retrieve_partner()), {'amls': inv3, 'model': rule}, ) diff --git a/addons/account/views/account_payment_term_views.xml b/addons/account/views/account_payment_term_views.xml index e865a5d400d..e88df582e41 100644 --- a/addons/account/views/account_payment_term_views.xml +++ b/addons/account/views/account_payment_term_views.xml @@ -102,48 +102,6 @@ The last line's computation type should be "Balance" to ensure that the whole amount will be allocated.

- - - -
- -
diff --git a/addons/account/views/report_invoice.xml b/addons/account/views/report_invoice.xml index ab28c665970..343c88d6b65 100644 --- a/addons/account/views/report_invoice.xml +++ b/addons/account/views/report_invoice.xml @@ -197,29 +197,7 @@ - - -
-

- - Early Payment (before ): - - ( % discount) - -

-
-
-
- - - - -
-
-
-
- -

+

Please use the following communication for your payment :

diff --git a/addons/account/views/res_config_settings_views.xml b/addons/account/views/res_config_settings_views.xml index 35f9f978741..c7ed5bcaf16 100644 --- a/addons/account/views/res_config_settings_views.xml +++ b/addons/account/views/res_config_settings_views.xml @@ -527,14 +527,6 @@
-
-
-
-
diff --git a/addons/account/wizard/account_payment_register.py b/addons/account/wizard/account_payment_register.py index ed6c74e3da4..162264ad9e5 100644 --- a/addons/account/wizard/account_payment_register.py +++ b/addons/account/wizard/account_payment_register.py @@ -81,12 +81,6 @@ class AccountPaymentRegister(models.TransientModel): partner_id = fields.Many2one('res.partner', string="Customer/Vendor", store=True, copy=False, ondelete='restrict', compute='_compute_from_lines') - discounted_amount = fields.Monetary( - store=True, - copy=False, - currency_field='source_currency_id', - compute='_compute_from_lines', - ) # == Payment methods fields == payment_method_line_id = fields.Many2one('account.payment.method.line', string='Payment Method', @@ -104,29 +98,15 @@ class AccountPaymentRegister(models.TransientModel): # == Payment difference fields == payment_difference = fields.Monetary( compute='_compute_payment_difference') - payment_difference_handling = fields.Selection( - string="Payment Difference Handling", - selection=[('open', 'Keep open'), ('reconcile', 'Mark as fully paid')], - compute='_compute_payment_difference_handling', - store=True, - readonly=False, - ) - writeoff_account_id = fields.Many2one( - comodel_name='account.account', - string="Difference Account", - copy=False, - domain="[('deprecated', '=', False), ('company_id', '=', company_id)]", - compute='_compute_writeoff_account_id', - store=True, - readonly=False, - ) - writeoff_label = fields.Char( - string='Journal Item Label', - compute='_compute_writeoff_label', - store=True, - readonly=False, - help='Change label of the counterpart that will hold the payment difference', - ) + payment_difference_handling = fields.Selection([ + ('open', 'Keep open'), + ('reconcile', 'Mark as fully paid'), + ], default='open', string="Payment Difference Handling") + writeoff_account_id = fields.Many2one('account.account', string="Difference Account", copy=False, + domain="[('deprecated', '=', False), ('company_id', '=', company_id)]") + writeoff_label = fields.Char(string='Journal Item Label', default='Write-Off', + help='Change label of the counterpart that will hold the payment difference') + # == Display purpose fields == show_partner_bank_account = fields.Boolean( compute='_compute_show_require_partner_bank') # Used to know whether the field `partner_bank_id` should be displayed @@ -134,18 +114,10 @@ class AccountPaymentRegister(models.TransientModel): compute='_compute_show_require_partner_bank') # used to know whether the field `partner_bank_id` should be required country_code = fields.Char(related='company_id.account_fiscal_country_id.code', readonly=True) - # == Early Payment Discount == - show_early_pay_discount_button = fields.Boolean(compute="_compute_show_early_pay_discount_button") - early_pay_discount_toggle_button = fields.Boolean( - string="Early Payment Discounts", - compute='_compute_early_pay_discount_toggle_button', - readonly=False, - store=True, - ) - # ------------------------------------------------------------------------- # HELPERS # ------------------------------------------------------------------------- + @api.model def _get_batch_communication(self, batch_result): ''' Helper to compute the communication based on the batch. @@ -233,7 +205,6 @@ class AccountPaymentRegister(models.TransientModel): partner_bank_account = self.env['res.partner.bank'] if move.is_invoice(include_receipts=True): partner_bank_account = move.partner_bank_id._origin - early_discount_pay_term = move.invoice_payment_term_id if move._is_eligible_for_early_discount(self.payment_date) else False return { 'partner_id': line.partner_id.id, @@ -241,7 +212,6 @@ class AccountPaymentRegister(models.TransientModel): 'currency_id': line.currency_id.id, 'partner_bank_id': partner_bank_account.id, 'partner_type': 'customer' if line.account_type == 'asset_receivable' else 'supplier', - 'early_discount_pay_term': early_discount_pay_term, } def _get_batches(self): @@ -320,15 +290,13 @@ class AccountPaymentRegister(models.TransientModel): payment_values = batch_result['payment_values'] lines = batch_result['lines'] company = lines[0].company_id + source_amount = abs(sum(lines.mapped('amount_residual'))) if payment_values['currency_id'] == company.currency_id.id: source_amount_currency = source_amount else: source_amount_currency = abs(sum(lines.mapped('amount_residual_currency'))) - if payment_values['early_discount_pay_term']: - early_pay_discounted_amount = abs(sum(lines.move_id.mapped('invoice_early_pay_amount_after_discount'))) - else: - early_pay_discounted_amount = False + return { 'company_id': company.id, 'partner_id': payment_values['partner_id'], @@ -337,14 +305,13 @@ class AccountPaymentRegister(models.TransientModel): 'source_currency_id': payment_values['currency_id'], 'source_amount': source_amount, 'source_amount_currency': source_amount_currency, - 'discounted_amount': early_pay_discounted_amount } # ------------------------------------------------------------------------- # COMPUTE METHODS # ------------------------------------------------------------------------- - @api.depends('line_ids', 'payment_date') + @api.depends('line_ids') def _compute_from_lines(self): ''' Load initial values from the account.moves passed through the context. ''' for wizard in self: @@ -368,7 +335,6 @@ class AccountPaymentRegister(models.TransientModel): 'source_currency_id': False, 'source_amount': False, 'source_amount_currency': False, - 'discounted_amount': False }) wizard.can_edit_wizard = False @@ -394,51 +360,6 @@ class AccountPaymentRegister(models.TransientModel): else: wizard.group_payment = False - @api.depends('can_edit_wizard', 'payment_date', 'currency_id', 'amount') - def _compute_payment_difference_handling(self): - for wizard in self: - if not wizard.payment_difference_handling: - wizard.payment_difference_handling = 'open' - if wizard.can_edit_wizard: - batch_result = wizard._get_batches()[0] - if batch_result['payment_values']['early_discount_pay_term']: - wizard.payment_difference_handling = 'reconcile' - else: - wizard.payment_difference_handling = 'open' - - @api.depends('payment_difference_handling', 'can_edit_wizard', 'amount', 'discounted_amount') - def _compute_writeoff_account_id(self): - for wizard in self: - wizard.writeoff_account_id = None - if wizard.can_edit_wizard: - batch_result = wizard._get_batches()[0] - cash_discount_accounts = wizard.company_id.account_journal_cash_discount_income_id +\ - wizard.company_id.account_journal_cash_discount_expense_id - if wizard.writeoff_account_id and wizard.writeoff_account_id not in cash_discount_accounts: - continue - if batch_result['payment_values']['early_discount_pay_term'] and wizard.amount == wizard.discounted_amount: - wizard.writeoff_account_id = self._get_early_pay_cash_discount_account(batch_result['payment_values']) - - def _get_early_pay_cash_discount_account(self, payment_values): - self.ensure_one() - if payment_values['payment_type'] == 'inbound': - writeoff_account_id = self.company_id.account_journal_cash_discount_income_id - else: - writeoff_account_id = self.company_id.account_journal_cash_discount_expense_id - return writeoff_account_id - - @api.depends('payment_difference_handling', 'can_edit_wizard', 'amount', 'discounted_amount') - def _compute_writeoff_label(self): - for wizard in self: - if wizard.writeoff_label and wizard.writeoff_label not in [_('Write-Off'), _('Early Payment Discount')]: - continue - if wizard.can_edit_wizard: - batch_result = wizard._get_batches()[0] - if batch_result['payment_values']['early_discount_pay_term'] and wizard.amount == wizard.discounted_amount: - wizard.writeoff_label = _("Early Payment Discount") - else: - wizard.writeoff_label = _('Write-Off') - @api.depends('journal_id') def _compute_currency_id(self): for wizard in self: @@ -564,25 +485,16 @@ class AccountPaymentRegister(models.TransientModel): self.payment_date, ) - @api.depends('early_pay_discount_toggle_button', 'discounted_amount', 'can_edit_wizard', 'source_amount', 'source_amount_currency', 'source_currency_id', 'company_id', 'currency_id', 'payment_date') + @api.depends('can_edit_wizard', 'source_amount', 'source_amount_currency', 'source_currency_id', 'company_id', 'currency_id', 'payment_date') def _compute_amount(self): for wizard in self: if wizard.source_currency_id and wizard.can_edit_wizard: batch_result = wizard._get_batches()[0] wizard.amount = wizard._get_total_amount_in_wizard_currency_to_full_reconcile(batch_result) - if not wizard.currency_id.is_zero(wizard.discounted_amount) and wizard.early_pay_discount_toggle_button: - wizard.amount = wizard.discounted_amount else: # The wizard is not editable so no partial payment allowed and then, 'amount' is not used. wizard.amount = None - @api.depends('can_edit_wizard') - def _compute_early_pay_discount_toggle_button(self): - for wizard in self: - batches = wizard._get_batches() - for batch in batches: - wizard.early_pay_discount_toggle_button = batch['payment_values']['payment_type'] == 'outbound' - @api.depends('can_edit_wizard', 'amount') def _compute_payment_difference(self): for wizard in self: @@ -593,14 +505,6 @@ class AccountPaymentRegister(models.TransientModel): else: wizard.payment_difference = 0.0 - @api.depends('can_edit_wizard') - def _compute_show_early_pay_discount_button(self): - for wizard in self: - wizard.show_early_pay_discount_button = False - for wizard in self: - batches = wizard._get_batches() - wizard.show_early_pay_discount_button = any(batch['payment_values']['early_discount_pay_term'] for batch in batches) - # ------------------------------------------------------------------------- # LOW-LEVEL METHODS # ------------------------------------------------------------------------- @@ -685,6 +589,7 @@ class AccountPaymentRegister(models.TransientModel): def _create_payment_vals_from_batch(self, batch_result): batch_values = self._get_wizard_values_from_batch(batch_result) + if batch_values['payment_type'] == 'inbound': partner_bank_id = self.journal_id.bank_account_id.id else: @@ -695,12 +600,9 @@ class AccountPaymentRegister(models.TransientModel): if batch_values['payment_type'] != payment_method_line.payment_type: payment_method_line = self.journal_id._get_available_payment_method_lines(batch_values['payment_type'])[:1] - early_pay_applicable = not self.currency_id.is_zero( - batch_values['discounted_amount']) and self.early_pay_discount_toggle_button - payment_vals = { + return { 'date': self.payment_date, - 'amount': batch_values['source_amount_currency'] if not early_pay_applicable else batch_values[ - 'discounted_amount'], + 'amount': batch_values['source_amount_currency'], 'payment_type': batch_values['payment_type'], 'partner_type': batch_values['partner_type'], 'ref': self._get_batch_communication(batch_result), @@ -711,13 +613,6 @@ class AccountPaymentRegister(models.TransientModel): 'payment_method_line_id': payment_method_line.id, 'destination_account_id': batch_result['lines'][0].account_id.id } - if early_pay_applicable: - payment_vals['write_off_line_vals'] = { - 'name': _("Early payment discount"), - 'amount': batch_values['source_amount_currency'] - batch_values['discounted_amount'], - 'account_id': self._get_early_pay_cash_discount_account(payment_vals).id, - } - return payment_vals def _init_payments(self, to_process, edit_mode=False): """ Create the payments. diff --git a/addons/account/wizard/account_payment_register_views.xml b/addons/account/wizard/account_payment_register_views.xml index 5584305c5b4..c59bc8bed74 100644 --- a/addons/account/wizard/account_payment_register_views.xml +++ b/addons/account/wizard/account_payment_register_views.xml @@ -26,8 +26,6 @@ - - @@ -50,10 +48,7 @@ required="1" options="{'no_create': True, 'no_open': True}" groups="base.group_multi_currency"/> - -