# -*- coding: utf-8 -*-
# Copyright (C) 2013 Renato Lima - Akretion
# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
import re
from openerp import models, fields, api, _
from openerp.exceptions import Warning as UserError
from openerp.addons import decimal_precision as dp
from openerp.addons.l10n_br_base.tools import fiscal
from openerp.addons.l10n_br_account.models.l10n_br_account import TYPE
PRODUCT_FISCAL_TYPE = [
('product', 'Produto')
]
PRODUCT_FISCAL_TYPE_DEFAULT = PRODUCT_FISCAL_TYPE[0][0]
NFE_IND_IE_DEST = [
('1', '1 - Contribuinte do ICMS'),
('2', '2 - Contribuinte Isento do ICMS'),
('9', '9 - Não Contribuinte')
]
NFE_IND_IE_DEST_DEFAULT = NFE_IND_IE_DEST[0][0]
[documentos]class L10nbrAccountCFOP(models.Model):
"""CFOP - Código Fiscal de Operações e Prestações"""
_name = 'l10n_br_account_product.cfop'
_description = 'CFOP'
code = fields.Char(u'Código', size=4, required=True)
name = fields.Char('Nome', size=256, required=True)
small_name = fields.Char('Nome Reduzido', size=32, required=True)
description = fields.Text(u'Descrição')
type = fields.Selection(TYPE, 'Tipo', required=True)
parent_id = fields.Many2one(
'l10n_br_account_product.cfop', 'CFOP Pai')
child_ids = fields.One2many(
'l10n_br_account_product.cfop', 'parent_id', 'CFOP Filhos')
internal_type = fields.Selection(
[('view', u'Visualização'), ('normal', 'Normal')],
'Tipo Interno', required=True, default='normal')
id_dest = fields.Selection(
[('1', u'Operação interna'),
('2', u'Operação interestadual'),
('3', u'Operação com exterior')],
u'Local de destino da operação',
help=u'Identificador de local de destino da operação.')
_sql_constraints = [
('l10n_br_account_cfop_code_uniq', 'unique (code)',
u'Já existe um CFOP com esse código !')
]
@api.model
[documentos] def name_search(self, name, args=None, operator='ilike', limit=100):
args = args or []
recs = self.browse()
if name:
recs = self.search([('code', operator, name)] + args, limit=limit)
if not recs:
recs = self.search([('name', operator, name)] + args, limit=limit)
return recs.name_get()
# TODO migrate
[documentos] def name_get(self, cr, uid, ids, context=None):
if not len(ids):
return []
if isinstance(ids, (int, long)):
ids = [ids]
reads = self.read(cr, uid, ids, ['name', 'code'], context,
load='_classic_write')
return [(x['id'], (x['code'] and x['code'] or '') +
(x['name'] and ' - ' + x['name'] or '')) for x in reads]
[documentos]class L10nBrAccountServiceType(models.Model):
_name = 'l10n_br_account.service.type'
_description = u'Cadastro de Operações Fiscais de Serviço'
code = fields.Char(u'Código', size=16, required=True)
name = fields.Char(u'Descrição', size=256, required=True)
parent_id = fields.Many2one(
'l10n_br_account.service.type', 'Tipo de Serviço Pai')
child_ids = fields.One2many(
'l10n_br_account.service.type', 'parent_id',
u'Tipo de Serviço Filhos')
internal_type = fields.Selection(
[('view', u'Visualização'), ('normal', 'Normal')], 'Tipo Interno',
required=True, default='normal')
@api.multi
[documentos] def name_get(self):
result = []
for record in self:
name = record['name']
if record['code']:
name = record['code'] + ' - ' + name
result.append((record['id'], name))
return result
[documentos]class ImportDeclaration(models.Model):
_name = 'l10n_br_account_product.import.declaration'
invoice_line_id = fields.Many2one(
'account.invoice.line', u'Linha de Documento Fiscal',
ondelete='cascade', select=True)
name = fields.Char(u'Número da DI', size=10, required=True)
date_registration = fields.Date(u'Data de Registro', required=True)
exporting_code = fields.Char(
u'Código do Exportador', required=True, size=60)
state_id = fields.Many2one(
'res.country.state', u'Estado',
domain="[('country_id.code', '=', 'BR')]")
location = fields.Char(u'Local', required=True, size=60)
date_release = fields.Date(u'Data de Liberação', required=True)
type_transportation = fields.Selection([
('1', u'1 - Marítima'),
('2', u'2 - Fluvial'),
('3', u'3 - Lacustre'),
('4', u'4 - Aérea'),
('5', u'5 - Postal'),
('6', u'6 - Ferroviária'),
('7', u'7 - Rodoviária'),
('8', u'8 - Conduto / Rede Transmissão'),
('9', u'9 - Meios Próprios'),
('10', u'10 - Entrada / Saída ficta'),
], u'Transporte Internacional')
afrmm_value = fields.Float(
'Valor da AFRMM', digits=dp.get_precision('Account'), default=0.00)
type_import = fields.Selection([
('1', u'1 - Importação por conta própria'),
('2', u'2 - Importação por conta e ordem'),
('3', u'3 - Importação por encomenda'),
], u'Tipo de Importação', default='1')
thirdparty_cnpj = fields.Char('CNPJ', size=18)
thirdparty_state_id = fields.Many2one(
'res.country.state', u'Estado',
domain="[('country_id.code', '=', 'BR')]")
line_ids = fields.One2many(
'l10n_br_account_product.import.declaration.line',
'import_declaration_id', 'Linhas da DI')
@api.multi
[documentos] def onchange_mask_cnpj_cpf(self, thirdparty_cnpj):
result = {'value': {}}
if thirdparty_cnpj:
val = re.sub('[^0-9]', '', thirdparty_cnpj)
if len(val) == 14:
thirdparty_cnpj = "%s.%s.%s/%s-%s"\
% (val[0:2], val[2:5], val[5:8], val[8:12], val[12:14])
result['value'].update({'thirdparty_cnpj': thirdparty_cnpj})
return result
[documentos]class ImportDeclarationLine(models.Model):
_name = 'l10n_br_account_product.import.declaration.line'
import_declaration_id = fields.Many2one(
'l10n_br_account_product.import.declaration', u'DI',
ondelete='cascade', select=True)
sequence = fields.Integer(u'Sequência', default=1, required=True)
name = fields.Char(u'Adição', size=3, required=True)
manufacturer_code = fields.Char(
u'Código do Fabricante', size=60, required=True)
amount_discount = fields.Float(u'Valor',
digits=dp.get_precision('Account'),
default=0.00)
[documentos]class L10nBrIcmsRelief(models.Model):
_name = 'l10n_br_account_product.icms_relief'
_description = 'Icms Relief'
code = fields.Char(u'Código', size=2, required=True)
name = fields.Char('Nome', size=256, required=True)
active = fields.Boolean('Ativo', default=True)
[documentos]class L10nBrIPIGuideline(models.Model):
_name = 'l10n_br_account_product.ipi_guideline'
_description = 'IPI Guidelines'
code = fields.Char(u'Código', size=3, required=True)
name = fields.Text(u'Descrição Enquadramento Legal do IPI', required=True)
cst_group = fields.Selection([('imunidade', u'Imunidade'),
('suspensao', u'Suspensão'),
('isencao', u'Isenção'),
('reducao', u'Redução'),
('outros', u'Outros'),
], string='Grupo CST', required=True)
tax_code_in_id = fields.Many2one(
'account.tax.code.template', string=u'CST Entrada')
tax_code_out_id = fields.Many2one(
'account.tax.code.template', string=u'CST Saída')
[documentos]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
)