first commit
This commit is contained in:
101
modules/account_tax_non_deductible/account.py
Normal file
101
modules/account_tax_non_deductible/account.py
Normal file
@@ -0,0 +1,101 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user