From 3751379f1e9a4c215fb6eb898b4ccc67659b9ace Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Tue, 10 May 2022 21:51:50 +0700 Subject: initial commit 2 --- addons/l10n_de/models/datev.py | 57 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 addons/l10n_de/models/datev.py (limited to 'addons/l10n_de/models/datev.py') diff --git a/addons/l10n_de/models/datev.py b/addons/l10n_de/models/datev.py new file mode 100644 index 00000000..d2e0f8cb --- /dev/null +++ b/addons/l10n_de/models/datev.py @@ -0,0 +1,57 @@ +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 -- cgit v1.2.3