Skip to content

Commit

Permalink
Merge f07df26 into 409c924
Browse files Browse the repository at this point in the history
  • Loading branch information
marinaGD committed Aug 21, 2018
2 parents 409c924 + f07df26 commit 83eddca
Show file tree
Hide file tree
Showing 8 changed files with 132 additions and 46 deletions.
3 changes: 2 additions & 1 deletion br_account/models/account_fiscal_position.py
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,8 @@ class AccountFiscalPosition(models.Model):
'account.fiscal.position.tax.rule', 'fiscal_position_id',
string=u"Regras INSS", domain=[('domain', '=', 'inss')])
fiscal_type = fields.Selection([('saida', 'Saída'),
('entrada', 'Entrada')],
('entrada', 'Entrada'),
('import', 'Saída Importação')],
string=u"Tipo da posição")

@api.model
Expand Down
1 change: 1 addition & 0 deletions br_account/models/account_invoice_line.py
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,7 @@ def _compute_price(self):
'cofins_valor': sum([x['amount'] for x in cofins]),
'issqn_base_calculo': sum([x['base'] for x in issqn]),
'issqn_valor': sum([x['amount'] for x in issqn]),
'ii_base_calculo': sum([x['base'] for x in ii]),
'ii_valor': sum([x['amount'] for x in ii]),
'csll_base_calculo': sum([x['base'] for x in csll]),
'csll_valor': sum([x['amount'] for x in csll]),
Expand Down
80 changes: 46 additions & 34 deletions br_account/models/account_tax.py
Original file line number Diff line number Diff line change
Expand Up @@ -118,10 +118,21 @@ def _compute_ipi(self, price_base):
if not ipi_tax:
return []
vals = self._tax_vals(ipi_tax)

base_tax = self.calc_ipi_base(price_base)

vals['amount'] = ipi_tax._compute_amount(base_tax, 1.0)
if 'ipi_base_calculo_manual' in self.env.context and\
self.env.context['ipi_base_calculo_manual'] > 0:
vals['base'] = self.env.context['ipi_base_calculo_manual']
else:
vals['base'] = base_tax
return [vals]

def calc_ipi_base(self, price_base):
reducao_ipi = 0.0
if "ipi_reducao_bc" in self.env.context:
reducao_ipi = self.env.context['ipi_reducao_bc']

base_ipi = price_base
if "valor_frete" in self.env.context:
base_ipi += self.env.context["valor_frete"]
Expand All @@ -130,20 +141,25 @@ def _compute_ipi(self, price_base):
if "outras_despesas" in self.env.context:
base_ipi += self.env.context["outras_despesas"]

base_tax = base_ipi * (1 - (reducao_ipi / 100.0))
vals['amount'] = ipi_tax._compute_amount(base_tax, 1.0)
if 'ipi_base_calculo_manual' in self.env.context and\
self.env.context['ipi_base_calculo_manual'] > 0:
vals['base'] = self.env.context['ipi_base_calculo_manual']
else:
vals['base'] = base_tax
return [vals]
return base_ipi * (1 - (reducao_ipi / 100.0))

def _compute_icms(self, price_base, ipi_value):
icms_tax = self.filtered(lambda x: x.domain == 'icms')
if not icms_tax:
return []
vals = self._tax_vals(icms_tax)
base_icms = self.calc_icms_base(price_base, ipi_value)
if 'icms_base_calculo_manual' in self.env.context and\
self.env.context['icms_base_calculo_manual'] > 0:
vals['amount'] = icms_tax._compute_amount(
self.env.context['icms_base_calculo_manual'], 1.0)
vals['base'] = self.env.context['icms_base_calculo_manual']
else:
vals['amount'] = icms_tax._compute_amount(base_icms, 1.0)
vals['base'] = base_icms
return [vals]

def calc_icms_base(self, price_base, ipi_value):
base_icms = price_base
incluir_ipi = False
reducao_icms = 0.0
Expand All @@ -161,17 +177,7 @@ def _compute_icms(self, price_base, ipi_value):
if "outras_despesas" in self.env.context:
base_icms += self.env.context["outras_despesas"]

base_icms *= 1 - (reducao_icms / 100.0)

if 'icms_base_calculo_manual' in self.env.context and\
self.env.context['icms_base_calculo_manual'] > 0:
vals['amount'] = icms_tax._compute_amount(
self.env.context['icms_base_calculo_manual'], 1.0)
vals['base'] = self.env.context['icms_base_calculo_manual']
else:
vals['amount'] = icms_tax._compute_amount(base_icms, 1.0)
vals['base'] = base_icms
return [vals]
return base_icms * (1 - (reducao_icms / 100.0))

def _compute_icms_st(self, price_base, ipi_value, icms_value):
icmsst_tax = self.filtered(lambda x: x.domain == 'icmsst')
Expand Down Expand Up @@ -302,7 +308,8 @@ def _compute_ii(self, price_base):
if not ii_tax:
return []
vals = self._tax_vals(ii_tax)
if "ii_base_calculo" in self.env.context:
if "ii_base_calculo" in self.env.context and \
self.env.context['ii_base_calculo'] > 0:
price_base = self.env.context["ii_base_calculo"]
vals['amount'] = ii_tax._compute_amount(price_base, 1.0)
vals['base'] = price_base
Expand Down Expand Up @@ -344,6 +351,23 @@ def compute_all(self, price_unit, currency=None, quantity=1.0,
return res

price_base = price_unit * quantity

taxes = self.set_taxes(price_base)

total_included = total_excluded = price_base
for tax in taxes:
tax_id = self.filtered(lambda x: x.id == tax['id'])
if not tax_id.price_include:
total_included += tax['amount']

return {
'taxes': sorted(taxes, key=lambda k: k['sequence']),
'total_excluded': total_excluded,
'total_included': total_included,
'base': price_base,
}

def set_taxes(self, price_base):
ipi = self._compute_ipi(price_base)
icms = self._compute_icms(
price_base,
Expand All @@ -360,16 +384,4 @@ def compute_all(self, price_unit, currency=None, quantity=1.0,
taxes += self._compute_issqn(price_base)
taxes += self._compute_ii(price_base)
taxes += self._compute_retention(price_base)

total_included = total_excluded = price_base
for tax in taxes:
tax_id = self.filtered(lambda x: x.id == tax['id'])
if not tax_id.price_include:
total_included += tax['amount']

return {
'taxes': sorted(taxes, key=lambda k: k['sequence']),
'total_excluded': total_excluded,
'total_included': total_included,
'base': price_base,
}
return taxes
2 changes: 1 addition & 1 deletion br_account/views/account_invoice_view.xml
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@
</xpath>
<field name="fiscal_position_id" position="replace"></field>
<field name="reference" position="after">
<field name="fiscal_position_id" domain="['|', ('fiscal_type', '=', None), ('fiscal_type', '=', 'entrada')]" /></field>
<field name="fiscal_position_id" domain="['|', ('fiscal_type', '=', 'import'), '|', ('fiscal_type', '=', 'entrada'), ('fiscal_type', '=', None)]"/></field>
<field name="partner_bank_id" position="after">
<field name="product_document_id" />
<field name="product_serie_id" />
Expand Down
2 changes: 1 addition & 1 deletion br_purchase/views/purchase_view.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<field name="inherit_id" ref="purchase.purchase_order_form" />
<field name="arch" type="xml">
<field name="fiscal_position_id" position="attributes">
<attribute name="domain">['|', ('fiscal_type', '=', None), ('fiscal_type', '=', 'entrada')]</attribute>
<attribute name="domain">['|', ('fiscal_type', '=', 'import'), '|', ('fiscal_type', '=', 'entrada'), ('fiscal_type', '=', None)]</attribute>
</field>
<xpath expr="//field[@name='order_line']/tree/field[@name='taxes_id']" position="before">
<field name="valor_bruto" widget="monetary" />
Expand Down
1 change: 1 addition & 0 deletions br_stock_account/models/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@


from . import account_invoice
from . import account_tax
20 changes: 11 additions & 9 deletions br_stock_account/models/account_invoice.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
class AccountInvoice(models.Model):
_inherit = 'account.invoice'

pos_fiscal = fields.Selection(related='fiscal_position_id.fiscal_type')

@api.one
@api.depends('invoice_line_ids.price_subtotal',
'invoice_line_ids.price_total',
Expand Down Expand Up @@ -77,7 +79,6 @@ def _prepare_edoc_vals(self, inv, inv_lines, serie_id):
res['valor_frete'] = inv.total_frete
res['valor_despesas'] = inv.total_despesas
res['valor_seguro'] = inv.total_seguro

res['modalidade_frete'] = inv.freight_responsibility
res['transportadora_id'] = inv.shipping_supplier_id.id
res['placa_veiculo'] = (inv.vehicle_plate or '').upper()
Expand Down Expand Up @@ -117,27 +118,28 @@ def _prepare_edoc_item_vals(self, invoice_line):
class AccountInvoiceLine(models.Model):
_inherit = 'account.invoice.line'

valor_frete = fields.Float(
'(+) Frete', digits=dp.get_precision('Account'), default=0.00)
valor_seguro = fields.Float(
'(+) Seguro', digits=dp.get_precision('Account'), default=0.00)
outras_despesas = fields.Float(
'(+) Despesas', digits=dp.get_precision('Account'), default=0.00)

def _prepare_tax_context(self):
res = super(AccountInvoiceLine, self)._prepare_tax_context()
res.update({
'valor_frete': self.valor_frete,
'valor_seguro': self.valor_seguro,
'outras_despesas': self.outras_despesas,
'fiscal_type': self.invoice_id.fiscal_position_id.fiscal_type,
'ii_despesas': self.ii_valor_despesas,
})
return res

@api.one
@api.depends('valor_frete', 'valor_seguro', 'outras_despesas')
def _compute_price(self):
super(AccountInvoiceLine, self)._compute_price()

total = self.valor_bruto - self.valor_desconto + self.valor_frete + \
self.valor_seguro + self.outras_despesas
self.update({'price_total': total})

valor_frete = fields.Float(
'(+) Frete', digits=dp.get_precision('Account'), default=0.00)
valor_seguro = fields.Float(
'(+) Seguro', digits=dp.get_precision('Account'), default=0.00)
outras_despesas = fields.Float(
'(+) Despesas', digits=dp.get_precision('Account'), default=0.00)
69 changes: 69 additions & 0 deletions br_stock_account/models/account_tax.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
# -*- coding: utf-8 -*-
# © 2018 Trustcode
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).

from odoo import models


class AccountTax(models.Model):
_inherit = 'account.tax'

def calc_ipi_base(self, price_base):
if ('fiscal_type' in self.env.context) and (
self.env.context['fiscal_type'] == 'import'):
reducao_ipi = 0.0
base_ipi = price_base
if "valor_frete" in self.env.context:
base_ipi += self.env.context["valor_frete"]
if "valor_seguro" in self.env.context:
base_ipi += self.env.context["valor_seguro"]
ii = self._compute_ii(price_base)
base_ipi += ii[0]['amount']

if "ipi_reducao_bc" in self.env.context:
reducao_ipi = self.env.context['ipi_reducao_bc']
return base_ipi * (1 - (reducao_ipi / 100.0))
else:
return super(AccountTax, self).calc_ipi_base(price_base)

def calc_icms_base(self, price_base, ipi_value):
if ('fiscal_type' in self.env.context) and (
self.env.context['fiscal_type'] == 'import'):
icms_tax = self.filtered(lambda x: x.domain == 'icms')
ii = self._compute_ii(price_base)
pis_cofins = self._compute_pis_cofins(price_base)
base_icms = price_base
reducao_icms = 0.0
if "valor_frete" in self.env.context:
base_icms += self.env.context["valor_frete"]
if "valor_seguro" in self.env.context:
base_icms += self.env.context["valor_seguro"]
if "icms_aliquota_reducao_base" in self.env.context:
reducao_icms = self.env.context['icms_aliquota_reducao_base']
base_icms += ii[0]['amount']
base_icms += ipi_value
base_icms += sum([tax['amount'] for tax in pis_cofins])
base_icms += self.env.context["ii_despesas"]
base_icms = base_icms / (1 - icms_tax.amount/100)
return base_icms * (1 - (reducao_icms / 100.0))
else:
return super(
AccountTax, self).calc_icms_base(price_base, ipi_value)

def _compute_pis_cofins(self, price_base):
if ('fiscal_type' in self.env.context) and (
self.env.context['fiscal_type'] == 'import'):
if "valor_frete" in self.env.context:
price_base += self.env.context["valor_frete"]
if "valor_seguro" in self.env.context:
price_base += self.env.context["valor_seguro"]
return super(AccountTax, self)._compute_pis_cofins(price_base)

def _compute_ii(self, price_base):
if ('fiscal_type' in self.env.context) and (
self.env.context['fiscal_type'] == 'import'):
if "valor_frete" in self.env.context:
price_base += self.env.context["valor_frete"]
if "valor_seguro" in self.env.context:
price_base += self.env.context["valor_seguro"]
return super(AccountTax, self)._compute_ii(price_base)

0 comments on commit 83eddca

Please sign in to comment.