Skip to content

Commit

Permalink
Merge 8e08f04 into fd191de
Browse files Browse the repository at this point in the history
  • Loading branch information
renatonlima committed Aug 3, 2016
2 parents fd191de + 8e08f04 commit 035a31e
Show file tree
Hide file tree
Showing 20 changed files with 457 additions and 47 deletions.
4 changes: 2 additions & 2 deletions l10n_br_account/data/l10n_br_account_data.xml
Expand Up @@ -36,7 +36,7 @@

<record id="partner_fiscal_type_2" model="l10n_br_account.partner.fiscal.type">
<field name="code">Não Contribuinte</field>
<field name="name">Não Contribuinte</field>
<field name="name">Não Contribuinte PJ</field>
<field name="is_company" eval="True"/>
<field name="default" eval="False"/>
<field name="ipi" eval="False"/>
Expand All @@ -54,7 +54,7 @@

<record id="partner_fiscal_type_4" model="l10n_br_account.partner.fiscal.type">
<field name="code">Não Contribuinte</field>
<field name="name">Não Contribuinte</field>
<field name="name">Não Contribuinte PF</field>
<field name="is_company" eval="False"/>
<field name="default" eval="False"/>
<field name="ipi" eval="False"/>
Expand Down
10 changes: 10 additions & 0 deletions l10n_br_account/demo/base_demo.xml
Expand Up @@ -300,5 +300,15 @@
<field name="partner_fiscal_type_id" ref="l10n_br_account.partner_fiscal_type_3" />
</record>

<!-- Cliente 9 MG Não Contribuinte -->
<record id="l10n_br_base.res_partner_cliente9_mg" model="res.partner">
<field name="partner_fiscal_type_id" ref="l10n_br_account.partner_fiscal_type_2" />
</record>

<!-- Cliente 10 MG Não Contribuinte -->
<record id="l10n_br_base.res_partner_cliente10_mg" model="res.partner">
<field name="partner_fiscal_type_id" ref="l10n_br_account.partner_fiscal_type_4" />
</record>

</data>
</openerp>
1 change: 1 addition & 0 deletions l10n_br_account_product/__openerp__.py
Expand Up @@ -46,6 +46,7 @@
'views/res_company_view.xml',
'views/account_product_fiscal_classification_view.xml',
'views/product_view.xml',
'views/res_country_view.xml',
'wizard/l10n_br_account_nfe_export_invoice_view.xml',
'wizard/l10n_br_account_nfe_export_view.xml',
'wizard/l10n_br_account_document_status_sefaz_view.xml',
Expand Down
1 change: 1 addition & 0 deletions l10n_br_account_product/models/__init__.py
Expand Up @@ -25,3 +25,4 @@
from . import account_invoice
from . import account
from . import product
from . import res_country
91 changes: 81 additions & 10 deletions l10n_br_account_product/models/account.py
Expand Up @@ -17,9 +17,11 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. #
###############################################################################

import time
from datetime import datetime

from openerp import models, fields, api
from openerp.tools import DEFAULT_SERVER_DATE_FORMAT


class AccountPaymentTerm(models.Model):
Expand Down Expand Up @@ -108,17 +110,14 @@ def compute_all(self, cr, uid, taxes, price_unit, quantity,
fiscal_position=False, insurance_value=0.0,
freight_value=0.0, other_costs_value=0.0, base_tax=0.0):
"""Compute taxes
Returns a dict of the form::
{
'total': Total without taxes,
'total_included': Total with taxes,
'total_tax_discount': Total Tax Discounts,
'taxes': <list of taxes, objects>,
'total_base': Total Base by tax,
}
:Parameters:
- 'cr': Database cursor.
- 'uid': Current user.
Expand Down Expand Up @@ -159,7 +158,8 @@ def compute_all(self, cr, uid, taxes, price_unit, quantity,
tax['icms_st_base_type'] = tax_brw.icms_st_base_type

common_taxes = [tx for tx in result['taxes'] if tx[
'domain'] not in ['icms', 'icmsst', 'ipi']]
'domain'] not in ['icms', 'icmsst', 'ipi', 'icmsinter',
'icmsfcp']]
result_tax = self._compute_tax(cr, uid, common_taxes, result['total'],
product, quantity, precision, base_tax)
totaldc += result_tax['tax_discount']
Expand All @@ -177,12 +177,14 @@ def compute_all(self, cr, uid, taxes, price_unit, quantity,
# Calcula ICMS
specific_icms = [tx for tx in result['taxes']
if tx['domain'] == 'icms']

# Adiciona frete seguro e outras despesas na base do ICMS
total_base = (result['total'] + insurance_value +
freight_value + other_costs_value)

# Em caso de operação de ativo adiciona o IPI na base de ICMS
if fiscal_position and fiscal_position.asset_operation:
total_base = result['total'] + insurance_value + \
freight_value + other_costs_value + ipi_value
else:
total_base = result['total'] + insurance_value + \
freight_value + other_costs_value
total_base += ipi_value

result_icms = self._compute_tax(
cr,
Expand All @@ -198,6 +200,75 @@ def compute_all(self, cr, uid, taxes, price_unit, quantity,
if result_icms['taxes']:
icms_value = result_icms['taxes'][0]['amount']

# Calcula a FCP
specific_fcp = [tx for tx in result['taxes']
if tx['domain'] == 'icmsfcp']
result_fcp = self._compute_tax(cr, uid, specific_fcp, total_base,
product, quantity, precision, base_tax)
totaldc += result_fcp['tax_discount']
calculed_taxes += result_fcp['taxes']

# Calcula ICMS Interestadual (DIFAL)
specific_icms_inter = [tx for tx in result['taxes']
if tx['domain'] == 'icmsinter']
result_icms_inter = self._compute_tax(
cr,
uid,
specific_icms_inter,
total_base,
product,
quantity,
precision,
base_tax)

if (specific_icms_inter and fiscal_position and
partner.partner_fiscal_type_id.ind_ie_dest == '9'):
if fiscal_position.cfop_id.id_dest == '2':

# Calcula o DIFAL total
result_icms_inter['taxes'][0]['amount'] = round(
abs(specific_icms_inter[0]['amount'] -
icms_value, precision)
)

# Cria uma chave com o ICMS de intraestadual
result_icms_inter['taxes'][0]['icms_origin_percent'] = \
specific_icms[0]['percent']

# Procura o percentual de partilha vigente
icms_partition_ids = self.pool.get(
'l10n_br_tax.icms_partition').search(
cr, uid,
[('date_start', '<=',
time.strftime(DEFAULT_SERVER_DATE_FORMAT)),
('date_end', '>=',
time.strftime(DEFAULT_SERVER_DATE_FORMAT))])

# Calcula o difal de origin e destino
if icms_partition_ids:
icms_partition = self.pool.get(
'l10n_br_tax.icms_partition').browse(
cr, uid, icms_partition_ids[0])
result_icms_inter['taxes'][0]['icms_part_percent'] = \
icms_partition.rate / 100

result_icms_inter['taxes'][0]['icms_dest_value'] = \
round(
result_icms_inter['taxes'][0]['amount'] *
(icms_partition.rate / 100),
precision)
result_icms_inter['taxes'][0]['icms_origin_value'] = \
round(
result_icms_inter['taxes'][0]['amount'] *
((100 - icms_partition.rate) / 100),
precision)

# Atualiza o imposto icmsinter
result_icms_inter['tax_discount'] = \
result_icms_inter['taxes'][0]['amount']
totaldc += result_icms_inter['tax_discount']
calculed_taxes += result_icms_inter['taxes']

# Calcula ICMS ST
specific_icmsst = [tx for tx in result['taxes']
if tx['domain'] == 'icmsst']
Expand Down Expand Up @@ -230,7 +301,7 @@ def compute_all(self, cr, uid, taxes, price_unit, quantity,
calculed_taxes += result_icmsst['taxes']

# Estimate Taxes
if fiscal_position and fiscal_position.asset_operation:
if fiscal_position and fiscal_position.ind_final == '1':
obj_tax_estimate = self.pool.get('l10n_br_tax.estimate')
date = datetime.now().strftime('%Y-%m-%d')
tax_estimate_ids = obj_tax_estimate.search(
Expand Down
108 changes: 85 additions & 23 deletions l10n_br_account_product/models/account_invoice.py
Expand Up @@ -57,6 +57,12 @@ def _compute_amount(self):
self.cofins_value = sum(
line.cofins_value for line in self.invoice_line)
self.ii_value = sum(line.ii_value for line in self.invoice_line)
self.icms_fcp_value = sum(
line.icms_fcp_value for line in self.invoice_line)
self.icms_dest_value = sum(
line.icms_dest_value for line in self.invoice_line)
self.icms_origin_value = sum(
line.icms_origin_value for line in self.invoice_line)
self.amount_discount = sum(
line.discount_value for line in self.invoice_line)
self.amount_insurance = sum(
Expand Down Expand Up @@ -155,12 +161,13 @@ def _compute_cfops(self):
u'Data e hora de emissão', readonly=True,
states={'draft': [('readonly', False)]},
select=True, help="Deixe em branco para usar a data atual")
ind_final = fields.Selection([
('0', u'Não'),
('1', u'Consumidor final')
], u'Operação com Consumidor final', readonly=True,
ind_final = fields.Selection(
[('0', u'Não'),
('1', u'Sim')],
u'Consumidor final', readonly=True,
related='fiscal_position.ind_final',
states={'draft': [('readonly', False)]}, required=False,
help=u'Indica operação com Consumidor final.', default='0')
help=u'Indica operação com Consumidor final.')
ind_pres = fields.Selection([
('0', u'Não se aplica'),
('1', u'Operação presencial'),
Expand Down Expand Up @@ -332,6 +339,20 @@ def _compute_cfops(self):
string='Valor II', store=True,
digits=dp.get_precision('Account'), compute='_compute_amount',
readonly=True)
icms_fcp_value = fields.Float(
string='Valor total do Fundo de Combate à Pobreza (FCP)', store=True,
digits=dp.get_precision('Account'), compute='_compute_amount',
readonly=True)
icms_dest_value = fields.Float(
string='Valor total do ICMS Interestadual para a UF de destino',
store=True,
digits=dp.get_precision('Account'), compute='_compute_amount',
readonly=True)
icms_origin_value = fields.Float(
string='Valor total do ICMS Interestadual para a UF do remetente',
store=True,
digits=dp.get_precision('Account'), compute='_compute_amount',
readonly=True)
weight = fields.Float(
string='Gross weight', states={'draft': [('readonly', False)]},
help="The gross weight in Kg.", readonly=True)
Expand Down Expand Up @@ -776,6 +797,39 @@ def _compute_price(self):
freight_value = fields.Float(
'Frete', digits=dp.get_precision('Account'), default=0.00)
fiscal_comment = fields.Text(u'Observação Fiscal')
icms_dest_base = fields.Float(
string=u'Valor da BC do ICMS na UF de destino',
digits=dp.get_precision('Account'),
default=0.00)
icms_fcp_percent = fields.Float(
string=u'% Fundo de Combate à Pobreza (FCP)',
digits=dp.get_precision('Account'),
default=0.00)
icms_origin_percent = fields.Float(
string=u'Alíquota interna da UF de destino',
digits=dp.get_precision('Account'),
default=0.00)
icms_dest_percent = fields.Float(
string=u'Alíquota interestadual das UF envolvidas',
digits=dp.get_precision('Account'),
default=0.00)
icms_part_percent = fields.Float(
string=u'Percentual provisório de partilha do ICMS Interestadual',
digits=dp.get_precision('Account'),
default=0.00)
icms_fcp_value = fields.Float(
string=(u'Valor do ICMS relativo ao Fundo de Combate à Pobreza (FCP)'
u' da UF de destino'),
digits=dp.get_precision('Account'),
default=0.00)
icms_dest_value = fields.Float(
string=u'Valor do ICMS Interestadual para a UF de destino',
digits=dp.get_precision('Account'),
default=0.00)
icms_origin_value = fields.Float(
string=u'Valor do ICMS Interno para a UF do remetente',
digits=dp.get_precision('Account'),
default=0.00)

def _amount_tax_icms(self, tax=None):
result = {
Expand All @@ -788,29 +842,36 @@ def _amount_tax_icms(self, tax=None):
}
return result

def _amount_tax_icmsinter(self, tax=None):
result = {
'icms_dest_base': tax.get('total_base', 0.0),
'icms_dest_percent': tax.get('percent', 0.0) * 100,
'icms_origin_percent': tax.get('icms_origin_percent', 0.0) * 100,
'icms_part_percent': tax.get('icms_part_percent', 0.0) * 100,
'icms_dest_value': tax.get('icms_dest_value', 0.0),
'icms_origin_value': tax.get('icms_origin_value', 0.0),
}
return result

def _amount_tax_icmsfcp(self, tax=None):
result = {
'icms_fcp_percent': tax.get('percent', 0.0) * 100,
'icms_fcp_value': tax.get('amount', 0.0),
}
return result

def _amount_tax_icmsst(self, tax=None):
result = {
'icms_st_value': tax.get(
'amount',
0.0),
'icms_st_base': tax.get(
'total_base',
0.0),
'icms_st_percent': tax.get(
'icms_st_percent',
0.0) * 100,
'icms_st_value': tax.get('amount', 0.0),
'icms_st_base': tax.get('total_base', 0.0),
'icms_st_percent': tax.get('icms_st_percent', 0.0) * 100,
'icms_st_percent_reduction': tax.get(
'icms_st_percent_reduction',
0.0) * 100,
'icms_st_mva': tax.get(
'amount_mva',
0.0) * 100,
'icms_st_base_other': tax.get(
'icms_st_base_other',
0.0),
'icms_st_base_type': tax.get(
'icms_st_base_type',
'4')}
'icms_st_mva': tax.get('amount_mva', 0.0) * 100,
'icms_st_base_other': tax.get('icms_st_base_other', 0.0),
'icms_st_base_type': tax.get('icms_st_base_type', '4')
}
return result

def _amount_tax_ipi(self, tax=None):
Expand Down Expand Up @@ -1002,6 +1063,7 @@ def _validate_taxes(self, values):
def _fiscal_position_map(self, result, **kwargs):
ctx = dict(self.env.context)
ctx.update({'use_domain': ('use_invoice', '=', True)})
ctx.update({'partner_id': kwargs.get('partner_id')})
ctx.update({'product_id': kwargs.get('product_id')})
account_obj = self.env['account.account']
obj_fp_rule = self.env['account.fiscal.position.rule']
Expand Down
Expand Up @@ -232,6 +232,7 @@ def _compute_taxes(self):
string='CEST',
size=9,
help=u"Código Especificador da Substituição Tributária ")

_sql_constraints = [
('account_fiscal_classfication_code_uniq', 'unique (code)',
u'Já existe um classificação fiscal com esse código!')]
Expand Down
19 changes: 19 additions & 0 deletions l10n_br_account_product/models/l10n_br_account_product.py
Expand Up @@ -372,3 +372,22 @@ class L10nBrIPIGuideline(models.Model):
'account.tax.code.template', string=u'CST Entrada')
tax_code_out_id = fields.Many2one(
'account.tax.code.template', string=u'CST Saída')


class L10nBrTaxIcmsPartition(models.Model):

_name = 'l10n_br_tax.icms_partition'
_description = 'Icms Partition'

date_start = fields.Date(
u'Data Inicial',
required=True
)
date_end = fields.Date(
u'Data Final',
required=True
)
rate = fields.Float(
u'Percentual Interestadual de Rateio',
required=True
)

0 comments on commit 035a31e

Please sign in to comment.