Before, account_fiscal_country_id was only use for tax operations; and country_id was used for all the other accounting stuff. Now, with the new ability to use foreign tax reports (with foreign VAT fiscal positions), we can generalize the fiscal country, sot that it is the one that needs to be used for the whole accounting. Since foreign tax reports were not supported before, account_fiscal_country_id is already set on existing database as the country for the "main" accounting, so the impact of this change is small. closes odoo/odoo#68349 Related: odoo/upgrade#2322 Related: odoo/enterprise#17299 Signed-off-by: Laurent Smet <smetl@users.noreply.github.com>
58 lines
3.0 KiB
Python
58 lines
3.0 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.account_fiscal_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.account_fiscal_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
|