# -*- 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
    )