Files
2026-03-14 09:42:12 +00:00

102 lines
3.5 KiB
Python

# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from trytond.model import fields
from trytond.pool import Pool, PoolMeta
from trytond.transaction import Transaction
class TaxTemplate(metaclass=PoolMeta):
__name__ = 'account.tax.template'
non_deductible = fields.Boolean(
"Non-Deductible",
help="Check to always include the tax amount as expense.")
@classmethod
def default_non_deductible(cls):
return False
def _get_tax_value(self, tax=None):
value = super()._get_tax_value(tax=tax)
if not tax or tax.non_deductible != self.non_deductible:
value['non_deductible'] = self.non_deductible
return value
class Tax(metaclass=PoolMeta):
__name__ = 'account.tax'
non_deductible = fields.Boolean("Non-Deductible")
@classmethod
def default_non_deductible(cls):
return False
class InvoiceLine(metaclass=PoolMeta):
__name__ = 'account.invoice.line'
@fields.depends(
'type', 'invoice', '_parent_invoice.type', methods=['_get_taxes'])
def on_change_with_amount(self):
amount = super().on_change_with_amount()
if self.type == 'line':
invoice_type = (
self.invoice.type if self.invoice else self.invoice_type)
if invoice_type == 'in':
with Transaction().set_context(
_non_deductible=True, _deductible_rate=1):
tax_amount = sum(
t.amount for t in self._get_taxes().values())
amount += tax_amount
return amount
@property
def taxable_lines(self):
context = Transaction().context
lines = super().taxable_lines
if (getattr(self, 'invoice', None)
and getattr(self.invoice, 'type', None)):
invoice_type = self.invoice.type
else:
invoice_type = getattr(self, 'invoice_type', None)
if invoice_type == 'in':
if context.get('_non_deductible'):
for line in lines:
taxes = line[0]
for tax in list(taxes):
if not tax.non_deductible:
taxes.remove(tax)
else:
for line in lines:
taxes = line[0]
for tax in list(taxes):
if tax.non_deductible:
taxes.remove(tax)
return lines
def _compute_taxes(self):
pool = Pool()
Currency = pool.get('currency.currency')
TaxLine = pool.get('account.tax.line')
tax_lines = super()._compute_taxes()
with Transaction().set_context(
_non_deductible=True, _deductible_rate=1):
taxes = self._get_taxes().values()
for tax in taxes:
for type_, amount in [('base', 'base'), ('tax', 'amount')]:
amount = getattr(tax, amount)
with Transaction().set_context(
date=self.invoice.currency_date):
amount = Currency.compute(
self.invoice.currency, amount,
self.invoice.company.currency)
tax_line = TaxLine()
tax_line.amount = amount
tax_line.type = type_
tax_line.tax = tax.tax
tax_lines.append(tax_line)
return tax_lines