71 lines
2.4 KiB
Python
71 lines
2.4 KiB
Python
from trytond.model import fields
|
|
from trytond.pool import PoolMeta
|
|
from trytond.pyson import Eval
|
|
from trytond.transaction import Transaction
|
|
from trytond.rpc import RPC
|
|
from trytond.exceptions import UserError
|
|
from facho.fe import form
|
|
|
|
class Invoice(metaclass=PoolMeta):
|
|
__name__ = 'account.invoice'
|
|
|
|
_states = {'invisible': ~Eval('is_fe_colombia', False),
|
|
'required': Eval('is_fe_colombia', False)}
|
|
_depends = ['is_fe_colombia']
|
|
|
|
is_fe_colombia = fields.Boolean('FE Colombia?',
|
|
states={'invisible': False})
|
|
del _states
|
|
del _depends
|
|
|
|
|
|
@staticmethod
|
|
def default_is_fe_colombia():
|
|
return Transaction().context.get('is_fe_colombia', False)
|
|
|
|
@classmethod
|
|
def validate(cls, invoices):
|
|
super().validate(invoices)
|
|
|
|
for invoice in invoices:
|
|
for line in invoice.lines:
|
|
tax_subtotals = []
|
|
for taxes, unit_price, quantity in line.taxable_lines:
|
|
for tax in taxes:
|
|
if tax.type != 'percentage':
|
|
raise UserError('Solo se soporta impuesto tipo porcentaje para producto')
|
|
|
|
facho_invoice = invoice.tofacho()
|
|
validator = form.DianResolucion0001Validator()
|
|
validator.validate(facho_invoice)
|
|
for (model, field, error) in validator.errors:
|
|
raise UserError('model %s in field %s has %s' % (model, field, error))
|
|
|
|
|
|
def tofacho(self):
|
|
inv = form.Invoice()
|
|
inv.set_period(self.invoice_date, self.invoice_date)
|
|
inv.set_issue(self.invoice_date)
|
|
inv.set_ident(self.number)
|
|
inv.set_customer(self.party.tofacho())
|
|
inv.set_supplier(self.company.party.tofacho())
|
|
|
|
for line in self.lines:
|
|
tax_subtotals = []
|
|
for taxes, unit_price, quantity in line.taxable_lines:
|
|
for tax in taxes:
|
|
tax_subtotals.append(form.TaxSubTotal(
|
|
percent = tax.rate
|
|
))
|
|
inv.add_invoice_line(form.InvoiceLine(
|
|
quantity = line.quantity,
|
|
description = line.description,
|
|
price_amount = float(line.unit_price),
|
|
item_ident = line.product.code,
|
|
tax = form.TaxTotal(
|
|
subtotals = tax_subtotals
|
|
)
|
|
))
|
|
inv.calculate()
|
|
return inv
|