bmya/odoo-bmya-cl

View on GitHub
l10n_cl_invoice/models/invoice_line.py

Summary

Maintainability
A
1 hr
Test Coverage
# -*- coding: utf-8 -*-
from openerp import osv, models, fields, api, _
from openerp.osv import fields as old_fields
from openerp.exceptions import except_orm, Warning
import openerp.addons.decimal_precision as dp
# from inspect import currentframe, getframeinfo
# estas 2 lineas son para imprimir el numero de linea del script
# (solo para debug)
# frameinfo = getframeinfo(currentframe())
# print(frameinfo.filename, frameinfo.lineno)


class account_invoice_line(models.Model):

    """
    En Chile como no se discriminan los impuestos en las facturas, excepto el IVA,
    agrego campos que ignoran el iva solamente a la hora de imprimir los valores.
    (excepción: liquidación factura)
    """

    _inherit = "account.invoice.line"

    def _printed_prices(self, cr, uid, ids, name, args, context=None):
        res = {}
        tax_obj = self.pool['account.tax']
        cur_obj = self.pool.get('res.currency')

        for line in self.browse(cr, uid, ids, context=context):
            _round = (lambda x: cur_obj.round(
                cr, uid, line.invoice_id.currency_id, x)) if line.invoice_id else (lambda x: x)
            quantity = line.quantity
            discount = line.discount
            printed_price_unit = line.price_unit
            printed_price_net = line.price_unit * \
                (1 - (discount or 0.0) / 100.0)
            printed_price_subtotal = printed_price_net * quantity

            not_vat_taxes = [
                x for x in line.invoice_line_tax_id if x.tax_code_id.parent_id.name != 'IVA']
            taxes = tax_obj.compute_all(cr, uid,
                                        not_vat_taxes, printed_price_net, 1,
                                        product=line.product_id,
                                        partner=line.invoice_id.partner_id)
            other_taxes_amount = _round(
                taxes['total_included']) - _round(taxes['total'])

            # TODO: tal vez mejorar esto de que se buscan los iva por el que tiene padre llamado "IVA"
            # Antes habiamos agregado un vampo vat_tax en los code pero el tema
            # es que tambien hay que agregarlo en el template de los tax code y
            # en los planes de cuenta, resulta medio engorroso
            # Daniel Blanco: esto me gusta más con el campo "vat tax" en los impuestos
            # queda para arreglarlo.
            vat_taxes = [
                x for x in line.invoice_line_tax_id if x.tax_code_id.parent_id.name == 'IVA']
            taxes = tax_obj.compute_all(cr, uid,
                                        vat_taxes, printed_price_net, 1,
                                        product=line.product_id,
                                        partner=line.invoice_id.partner_id)
            vat_amount = _round(
                taxes['total_included']) - _round(taxes['total'])

            exempt_amount = 0.0
            if not vat_taxes:
                exempt_amount = _round(taxes['total_included'])

            # For document that not discriminate we include the prices
            if not line.invoice_id.vat_discriminated:
                printed_price_unit = _round(
                    taxes['total_included'] * (1 + (discount or 0.0) / 100.0))
                printed_price_net = _round(taxes['total_included'])
                printed_price_subtotal = _round(
                    taxes['total_included'] * quantity)

            res[line.id] = {
                'printed_price_unit': printed_price_unit,
                'printed_price_net': printed_price_net,
                'printed_price_subtotal': printed_price_subtotal,
                'vat_amount': vat_amount * quantity,
                'other_taxes_amount': other_taxes_amount * quantity,
                'exempt_amount': exempt_amount * quantity,
            }
        return res

    _columns = {
        'printed_price_unit': old_fields.function(
            _printed_prices, type='float',
            digits_compute=dp.get_precision('Account'),
            string='Unit Price', multi='printed',),
        'printed_price_net': old_fields.function(
            _printed_prices, type='float',
            digits_compute=dp.get_precision('Account'),
            string='Net Price', multi='printed'),
        'printed_price_subtotal': old_fields.function(
            _printed_prices, type='float',
            digits_compute=dp.get_precision('Account'),
            string='Subtotal', multi='printed'),
        'vat_amount': old_fields.function(
            _printed_prices, type='float',
            digits_compute=dp.get_precision('Account'),
            string='Vat Amount', multi='printed'),
        'other_taxes_amount': old_fields.function(
            _printed_prices, type='float',
            digits_compute=dp.get_precision('Account'),
            string='Other Taxes Amount', multi='printed'),
        'exempt_amount': old_fields.function(
            _printed_prices, type='float',
            digits_compute=dp.get_precision('Account'),
            string='Exempt Amount', multi='printed'),
    }