Before, when only invoicing is installed (e.g. in case of the PoS), a not so easy to surpass error would be triggered when using products with a lower tax rate, e.g. drinks are only at 7% instead of 19%. Because there is a constraint, upon validation of the invoice, that the accounts used must correspond with the tax rate and you can not set a specific account in case of only invoicing, an error will be raised when you try to validate the generated invoice. We solve it by inheriting the method searching for the product accounts and when no income/expense account on the product is set, but a tax is, to suggest the account corresponding to the tax and its rate if it would suggest a wrong account. closes odoo/odoo#63201 X-original-commit: 6b6387e88232928e67cb36b74371be72a3b4c441 Signed-off-by: oco-odoo <oco-odoo@users.noreply.github.com>
58 lines
2.9 KiB
Python
58 lines
2.9 KiB
Python
from odoo import api, fields, models
|
|
from odoo.exceptions import UserError
|
|
from odoo.tools.translate import _
|
|
|
|
class AccountTaxTemplate(models.Model):
|
|
_inherit = 'account.tax.template'
|
|
|
|
l10n_de_datev_code = fields.Char(size=2)
|
|
|
|
def _get_tax_vals(self, company, tax_template_to_tax):
|
|
vals = super(AccountTaxTemplate, self)._get_tax_vals(company, tax_template_to_tax)
|
|
vals['l10n_de_datev_code'] = self.l10n_de_datev_code
|
|
return vals
|
|
|
|
class AccountTax(models.Model):
|
|
_inherit = "account.tax"
|
|
|
|
l10n_de_datev_code = fields.Char(size=2, help="2 digits code use by Datev")
|
|
|
|
|
|
class AccountMove(models.Model):
|
|
_inherit = 'account.move'
|
|
|
|
def _post(self, soft=True):
|
|
# OVERRIDE to check the invoice lines taxes.
|
|
for invoice in self.filtered(lambda move: move.is_invoice()):
|
|
for line in invoice.invoice_line_ids:
|
|
account_tax = line.account_id.tax_ids.ids
|
|
if account_tax and invoice.company_id.country_id.code == 'DE':
|
|
account_name = line.account_id.name
|
|
for tax in line.tax_ids:
|
|
if tax.id not in account_tax:
|
|
raise UserError(_('Account %s does not authorize to have tax %s specified on the line. \
|
|
Change the tax used in this invoice or remove all taxes from the account') % (account_name, tax.name))
|
|
return super()._post(soft)
|
|
|
|
|
|
class ProductTemplate(models.Model):
|
|
_inherit = "product.template"
|
|
|
|
def _get_product_accounts(self):
|
|
""" As taxes with a different rate need a different income/expense account, we add this logic in case people only use
|
|
invoicing to not be blocked by the above constraint"""
|
|
result = super(ProductTemplate, self)._get_product_accounts()
|
|
company = self.env.company
|
|
if company.country_id.code == "DE":
|
|
if not self.property_account_income_id:
|
|
taxes = self.taxes_id.filtered(lambda t: t.company_id == company)
|
|
if not result['income'] or (result['income'].tax_ids and taxes and taxes[0] not in result['income'].tax_ids):
|
|
result['income'] = self.env['account.account'].search([('internal_group', '=', 'income'), ('deprecated', '=', False),
|
|
('tax_ids', 'in', taxes.ids)], limit=1)
|
|
if not self.property_account_expense_id:
|
|
supplier_taxes = self.supplier_taxes_id.filtered(lambda t: t.company_id == company)
|
|
if not result['expense'] or (result['expense'].tax_ids and supplier_taxes and supplier_taxes[0] not in result['expense'].tax_ids):
|
|
result['expense'] = self.env['account.account'].search([('internal_group', '=', 'expense'), ('deprecated', '=', False),
|
|
('tax_ids', 'in', supplier_taxes.ids)], limit=1)
|
|
return result
|