Skip to content

Commit

Permalink
Implementação de campos para o documento relacionado da NFe
Browse files Browse the repository at this point in the history
  • Loading branch information
danimaribeiro committed Jan 6, 2017
1 parent 51b731a commit 6a77682
Show file tree
Hide file tree
Showing 9 changed files with 234 additions and 5 deletions.
8 changes: 7 additions & 1 deletion br_account/models/account_invoice.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,13 @@ def _default_fiscal_document_serie(self):
is_eletronic = fields.Boolean(
related='fiscal_document_id.electronic', type='boolean',
store=True, string=u'Electrônico')
fiscal_comment = fields.Text(u'Observação Fiscal')
fiscal_document_related_ids = fields.One2many(
'br_account.document.related', 'invoice_id',
'Documento Fiscal Relacionado', readonly=True,
states={'draft': [('readonly', False)]})
fiscal_comment = fields.Text(
u'Observação Fiscal', readonly=True,
states={'draft': [('readonly', False)]})

total_bruto = fields.Float(
string='Total Bruto ( = )', store=True,
Expand Down
95 changes: 93 additions & 2 deletions br_account/models/br_account.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@

from odoo import api, fields, models
from odoo.addons import decimal_precision as dp
from odoo.exceptions import UserError

from odoo.addons.br_base.tools import fiscal


class BrAccountCFOP(models.Model):
Expand Down Expand Up @@ -186,7 +189,7 @@ class ImportDeclaration(models.Model):
('8', u'8 - Conduto / Rede Transmissão'),
('9', u'9 - Meios Próprios'),
('10', u'10 - Entrada / Saída ficta'),
], u'Transporte Inter.', required=True, default="1")
], u'Transporte Internacional', required=True, default="1")
afrmm_value = fields.Float(
'Valor da AFRMM', digits=dp.get_precision('Account'), default=0.00)
type_import = fields.Selection([
Expand All @@ -199,7 +202,7 @@ class ImportDeclaration(models.Model):
'res.country.state', u'Estado',
domain="[('country_id.code', '=', 'BR')]")
exporting_code = fields.Char(
u'Cód. do Exportador', required=True, size=60)
u'Código do Exportador', required=True, size=60)
line_ids = fields.One2many(
'br_account.import.declaration.line',
'import_declaration_id', 'Linhas da DI')
Expand All @@ -217,3 +220,91 @@ class ImportDeclarationLine(models.Model):
amount_discount = fields.Float(
string=u'Valor', digits=dp.get_precision('Account'), default=0.00)
drawback_number = fields.Char(u'Número Drawback', size=11)


class AccountDocumentRelated(models.Model):
_name = 'br_account.document.related'

invoice_id = fields.Many2one('account.invoice', 'Documento Fiscal',
ondelete='cascade')
invoice_related_id = fields.Many2one(
'account.invoice', 'Documento Fiscal', ondelete='cascade')
document_type = fields.Selection(
[('nf', 'NF'), ('nfe', 'NF-e'), ('cte', 'CT-e'),
('nfrural', 'NF Produtor'), ('cf', 'Cupom Fiscal')],
'Tipo Documento', required=True)
access_key = fields.Char('Chave de Acesso', size=44)
serie = fields.Char(u'Série', size=12)
internal_number = fields.Char(u'Número', size=32)
state_id = fields.Many2one('res.country.state', 'Estado',
domain="[('country_id.code', '=', 'BR')]")
cnpj_cpf = fields.Char('CNPJ/CPF', size=18)
cpfcnpj_type = fields.Selection(
[('cpf', 'CPF'), ('cnpj', 'CNPJ')], 'Tipo Doc.',
default='cnpj')
inscr_est = fields.Char('Inscr. Estadual/RG', size=16)
date = fields.Date('Data')
fiscal_document_id = fields.Many2one(
'br_account.fiscal.document', 'Documento')

@api.one
@api.constrains('cnpj_cpf')
def _check_cnpj_cpf(self):
check_cnpj_cpf = True
if self.cnpj_cpf:
if self.cpfcnpj_type == 'cnpj':
if not fiscal.validate_cnpj(self.cnpj_cpf):
check_cnpj_cpf = False
elif not fiscal.validate_cpf(self.cnpj_cpf):
check_cnpj_cpf = False
if not check_cnpj_cpf:
raise UserError(u'CNPJ/CPF do documento relacionado é invalido!')

@api.one
@api.constrains('inscr_est')
def _check_ie(self):
check_ie = True
if self.inscr_est:
uf = self.state_id and self.state_id.code.lower() or ''
try:
mod = __import__('odoo.addons.br_base.tools.fiscal',
globals(), locals(), 'fiscal')

validate = getattr(mod, 'validate_ie_%s' % uf)
if not validate(self.inscr_est):
check_ie = False
except AttributeError:
if not fiscal.validate_ie_param(uf, self.inscr_est):
check_ie = False
if not check_ie:
raise UserError(
u'Inscrição Estadual do documento fiscal inválida!')

@api.onchange('invoice_related_id')
def onchange_invoice_related_id(self):
if not self.invoice_related_id:
return
inv_id = self.invoice_related_id
if not inv_id.fiscal_document_id:
return

if inv_id.fiscal_document_id.code == '55':
self.document_type = 'nfe'
elif inv_id.fiscal_document_id.code == '04':
self.document_type = 'nfrural'
elif inv_id.fiscal_document_id.code == '57':
self.document_type = 'cte'
elif inv_id.fiscal_document_id.code in ('2B', '2C', '2D'):
self.document_type = 'cf'
else:
self.document_type = 'nf'

if inv_id.fiscal_document_id.code in ('55', '57'):
self.serie = False
self.internal_number = False
self.state_id = False
self.cnpj_cpf = False
self.cpfcnpj_type = False
self.date = False
self.fiscal_document_id = False
self.inscr_est = False
3 changes: 3 additions & 0 deletions br_account/security/ir.model.access.csv
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
"access_account_fiscal_position_tax_rule","access_account_fiscal_position_tax_rule","model_account_fiscal_position_tax_rule","account.group_account_manager",1,1,1,1
"access_br_account_import_declaration_line","access_br_account_import_declaration_line","model_br_account_import_declaration_line","account.group_account_manager",1,1,1,1
"access_br_account_import_declaration","access_br_account_import_declaration","model_br_account_import_declaration","account.group_account_manager",1,1,1,1
"access_br_account_document_related","access_br_account_document_related","model_br_account_document_related","account.group_account_manager",1,1,1,1
"br_account_fiscal_document_user","br_account.fiscal.document","model_br_account_fiscal_document","account.group_account_user",1,0,0,0
"br_account_document_serie_user","br_account.document.serie","model_br_account_document_serie","account.group_account_user",1,0,0,0
"br_account_cnae_user","br_account.cnae","model_br_account_cnae","account.group_account_user",1,0,0,0
Expand All @@ -17,6 +18,7 @@
"access_account_fiscal_position_tax_rule_user","access_account_fiscal_position_tax_rule","model_account_fiscal_position_tax_rule","account.group_account_user",1,0,0,0
"access_br_account_import_declaration_line_user","access_br_account_import_declaration_line","model_br_account_import_declaration_line","account.group_account_user",1,0,0,0
"access_br_account_import_declaration_user","access_br_account_import_declaration","model_br_account_import_declaration","account.group_account_user",1,0,0,0
"access_br_account_document_related_user","access_br_account_document_related","model_br_account_document_related","account.group_account_user",1,0,0,0
"br_account_fiscal_document_invoice","br_account.fiscal.document","model_br_account_fiscal_document","account.group_account_invoice",1,0,0,0
"br_account_document_serie_invoice","br_account.document.serie","model_br_account_document_serie","account.group_account_invoice",1,0,0,0
"br_account_cnae_invoice","br_account.cnae","model_br_account_cnae","account.group_account_invoice",1,0,0,0
Expand All @@ -26,3 +28,4 @@
"access_account_fiscal_position_tax_rule_invoice","access_account_fiscal_position_tax_rule","model_account_fiscal_position_tax_rule","account.group_account_invoice",1,0,0,0
"access_br_account_import_declaration_line_invoice","access_br_account_import_declaration_line","model_br_account_import_declaration_line","account.group_account_invoice",1,0,0,0
"access_br_account_import_declaration_invoice","access_br_account_import_declaration","model_br_account_import_declaration","account.group_account_invoice",1,0,0,0
"access_br_account_document_related_user_invoice","access_br_account_document_related","model_br_account_document_related","account.group_account_invoice",1,0,0,0
31 changes: 31 additions & 0 deletions br_account/views/account_invoice_view.xml
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,37 @@
</page>
</page>
<field name="tax_line_ids" position="after">
<group name="documentos_relacionados" string="Documentos Relacionados">
<field colspan="4" nolabel="1" name="fiscal_document_related_ids">
<tree>
<field name="document_type"/>
<field name="access_key"/>
<field name="serie"/>
<field name="internal_number"/>
</tree>
<form string="Documentos Fiscais">
<group>
<field name="invoice_related_id" />
</group>
<group>
<field name="document_type"/>
</group>
<group string="NF-e/CT-e" attrs="{'invisible': [('document_type','in', ('nf', 'nfrural', 'cf', False))]}">
<field name="access_key"/>
</group>
<group string="Nota Fiscal/Produtor/Cupom Fiscal" attrs="{'invisible': [('document_type', 'in', ('nfe','cte', False))]}">
<field name="serie" attrs="{'required': [('document_type', 'in', ('nf', 'nfrural', 'cf'))]}"/>
<field name="internal_number" attrs="{'required': [('document_type', 'in', ('nf', 'nfrural', 'cf'))]}"/>
<field name="fiscal_document_id" attrs="{'required': [('document_type', 'in', ('nf', 'nfrural', 'cf'))]}"/>
<field name="state_id" attrs="{'required': [('document_type', 'in', ('nf', 'nfrural'))], 'invisible': [('document_type', '=', 'cf')]}"/>
<field name="date" attrs="{'required': [('document_type', 'in', ('nf', 'nfrural'))], 'invisible': [('document_type', '=', 'cf')]}"/>
<field name="cpfcnpj_type" attrs="{'required': [('document_type', 'in', ('nfrural'))], 'invisible': [('document_type', '!=', 'nfrural')]}"/>
<field name="cnpj_cpf" attrs="{'required': [('document_type', 'in', ('nf', 'nfrural'))], 'invisible': [('document_type', '=', 'cf')]}"/>
<field name="inscr_est" attrs="{'invisible': [('document_type', '!=', 'nfrural')]}"/>
</group>
</form>
</field>
</group>
<group string="Observações">
<field name="comment" nolabel="1"/>
</group>
Expand Down
3 changes: 3 additions & 0 deletions br_account_einvoice/models/account_invoice.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ def _compute_total_edocs(self):
item.total_edocs = self.env['invoice.eletronic'].search_count(
[('invoice_id', '=', item.id)])

invoice_eletronic_ids = fields.One2many(
'invoice.eletronic', 'invoice_id',
'Documentos Eletrônicos', readonly=True)
invoice_model = fields.Char(
string="Modelo de Fatura", related="fiscal_document_id.code")
total_edocs = fields.Integer(string="Total NFe",
Expand Down
18 changes: 18 additions & 0 deletions br_nfe/models/account_invoice.py
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,24 @@ def _prepare_edoc_vals(self, inv):
}))
res['duplicata_ids'] = duplicatas

# Documentos Relacionados
documentos = []
for doc in inv.fiscal_document_related_ids:
documentos.append((0, None, {
'invoice_related_id': doc.invoice_related_id.id,
'document_type': doc.document_type,
'access_key': doc.access_key,
'serie': doc.serie,
'internal_number': doc.internal_number,
'state_id': doc.state_id.id,
'cnpj_cpf': doc.cnpj_cpf,
'cpfcnpj_type': doc.cpfcnpj_type,
'inscr_est': doc.inscr_est,
'date': doc.date,
'fiscal_document_id': doc.fiscal_document_id.id,
}))

res['fiscal_document_related_ids'] = documentos
return res

def _prepare_edoc_item_vals(self, invoice_line):
Expand Down
53 changes: 53 additions & 0 deletions br_nfe/models/invoice_eletronic.py
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,11 @@ def generate_correction_letter(self):
help=u'Total total do ICMS relativo Fundo de Combate à Pobreza (FCP) \
da UF de destino')

# Documentos Relacionados
fiscal_document_related_ids = fields.One2many(
'br_account.document.related', 'invoice_eletronic_id',
'Documentos Fiscais Relacionados', readonly=True, states=STATE)

# CARTA DE CORRECAO
cartas_correcao_ids = fields.One2many(
'carta.correcao.eletronica.evento', 'eletronic_doc_id',
Expand Down Expand Up @@ -357,6 +362,54 @@ def _prepare_eletronic_invoice_values(self):
'indPres': self.ind_pres or '1',
'procEmi': 0
}
# Documentos Relacionados
documentos = []
for doc in self.fiscal_document_related_ids:
data = fields.Datetime.from_string(doc.date)
if doc.document_type == 'nfe':
documentos.append({
'refNFe': doc.access_key
})
elif doc.document_type == 'nf':
documentos.append({
'refNF': {
'cUF': doc.state_id.ibge_code,
'AAMM': data.strftime("%y%m"),
'CNPJ': re.sub('[^0-9]', '', doc.cnpj_cpf),
'mod': doc.fiscal_document_id.code,
'serie': doc.serie,
'nNF': doc.internal_number,
}
})

elif doc.document_type == 'cte':
documentos.append({
'refCTe': doc.access_key
})
elif doc.document_type == 'nfrural':
cnpj_cpf = re.sub('[^0-9]', '', doc.cnpj_cpf)
documentos.append({
'refNFP': {
'cUF': doc.state_id.ibge_code,
'AAMM': data.strftime("%y%m"),
'CNPJ': cnpj_cpf if len(cnpj_cpf) == 14 else '',
'CPF': cnpj_cpf if len(cnpj_cpf) == 11 else '',
'IE': doc.inscr_est,
'mod': doc.fiscal_document_id.code,
'serie': doc.serie,
'nNF': doc.internal_number,
}
})
elif doc.document_type == 'cf':
documentos.append({
'refECF': {
'mod': doc.fiscal_document_id.code,
'nECF': doc.serie,
'nCOO': doc.internal_number,
}
})

ide['NFref'] = documentos
emit = {
'tipo': self.company_id.partner_id.company_type,
'cnpj_cpf': re.sub('[^0-9]', '', self.company_id.cnpj_cpf),
Expand Down
17 changes: 15 additions & 2 deletions br_nfe/models/nfe.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,30 @@
# © 2016 Danimar Ribeiro <danimaribeiro@gmail.com>, Trustcode
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).

from odoo import fields, models
from odoo import api, fields, models


class ImportDeclaration(models.Model):
_inherit = 'br_account.import.declaration'

invoice_eletronic_line_id = fields.Many2one(
'invoice.eletronic', u'Linha de Documento Eletrônico',
'invoice.eletronic.item', u'Linha de Documento Eletrônico',
ondelete='cascade', index=True)


class AccountDocumentRelated(models.Model):
_inherit = 'br_account.document.related'

invoice_eletronic_id = fields.Many2one(
'invoice.eletronic', 'Documento Eletrônico', ondelete='cascade')

@api.onchange('invoice_related_id')
def onchange_br_nfe_invoice_related_id(self):
if len(self.invoice_related_id.invoice_eletronic_ids) > 0:
self.access_key = \
self.invoice_related_id.invoice_eletronic_ids[0].chave_nfe


class NfeReboque(models.Model):
_name = 'nfe.reboque'

Expand Down
11 changes: 11 additions & 0 deletions br_nfe/views/invoice_eletronic.xml
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,17 @@
</group>
</group>
</page>
<page name="documentos_relacionados" string="Doc. Relacionados" >
<field name="fiscal_document_related_ids" >
<tree>
<field name="invoice_related_id" />
<field name="document_type" />
<field name="access_key" />
<field name="serie" />
<field name="internal_number" />
</tree>
</field>
</page>
<page name="carta_correcao" string="Cartas de Correção" >
<field name="cartas_correcao_ids" >
<tree>
Expand Down

0 comments on commit 6a77682

Please sign in to comment.