Change datev codes in l10n_de_skr03 and 04 for some lines and allow 4 digit codes. closes odoo/odoo#103533 Doc: https://apps.datev.de/help-center/documents/0907043 Task-id: 2977383 X-original-commit: 32931d0efdff5245d71d633682615ba1bdc74326 Signed-off-by: William André (wan) <wan@odoo.com> Signed-off-by: Maximilien La Barre (malb) <malb@odoo.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=4)
|
|
|
|
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=4, help="4 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
|