Example #1
0
class IBPTaxNBS(models.Model):
    _description = 'IBPTax por NBS'
    _name = 'sped.ibptax.nbs'

    ibptax_id = fields.Many2one('sped.ibptax', 'IBPTax', ondelete='cascade')
    estado_id = fields.Many2one('sped.estado',
                                'Estado',
                                related='ibptax_id.estado_id',
                                store=True)
    nbs_id = fields.Many2one('sped.nbs', 'NBS')
    al_ibpt_nacional = fields.Porcentagem('Nacional')
    al_ibpt_internacional = fields.Porcentagem('Internacional')
    al_ibpt_municipal = fields.Porcentagem('Municipal')
Example #2
0
class IBPTaxServico(models.Model):
    _description = 'IBPTax por Serviço'
    _name = 'sped.ibptax.servico'

    ibptax_id = fields.Many2one('sped.ibptax', 'IBPTax', ondelete='cascade')
    estado_id = fields.Many2one('sped.estado',
                                'Estado',
                                related='ibptax_id.estado_id',
                                store=True)
    servico_id = fields.Many2one('sped.servico', 'Serviço')
    al_ibpt_nacional = fields.Porcentagem('Nacional')
    al_ibpt_internacional = fields.Porcentagem('Internacional')
    al_ibpt_municipal = fields.Porcentagem('Municipal')
Example #3
0
class IBPTaxNCM(models.Model):
    _description = 'IBPTax por NCM'
    _name = 'sped.ibptax.ncm'

    ibptax_id = fields.Many2one('sped.ibptax', 'IBPTax', ondelete='cascade')
    estado_id = fields.Many2one('sped.estado',
                                'Estado',
                                related='ibptax_id.estado_id',
                                store=True)
    ncm_id = fields.Many2one('sped.ncm', 'NCM')
    al_ibpt_nacional = fields.Porcentagem('Nacional')
    al_ibpt_internacional = fields.Porcentagem('Internacional')
    al_ibpt_estadual = fields.Porcentagem('Estadual')
    al_icms_id = fields.Many2one('sped.aliquota.icms.proprio', 'Estadual')
Example #4
0
class ProtocoloICMSNCM(models.Model):
    _description = 'Protocolo ICMS - NCM e MVA'
    _name = 'sped.protocolo.icms.ncm'
    #_rec_name = 'descricao'
    _order = 'protocolo_id, ncm_id'

    protocolo_id = fields.Many2one('sped.protocolo.icms', 'Protocolo', require=True, ondelete='cascade')
    ncm_id = fields.Many2one('sped.ncm', 'NCM', required=True)
    mva = fields.Porcentagem('MVA original')
Example #5
0
class AliquotaSIMPLESAliquota(models.Model):
    _description = 'Alíquota do SIMPLES Nacional'
    _name = 'sped.aliquota.simples.aliquota'
    _rec_name = 'al_simples'
    _order = 'anexo_id, teto_id'

    anexo_id = fields.Many2one('sped.aliquota.simples.anexo', 'Anexo', required=True, ondelete='cascade')
    teto_id = fields.Many2one('sped.aliquota.simples.teto', 'Teto', required=True, ondelete='cascade')
    al_simples = fields.Porcentagem('SIMPLES')
    al_irpj = fields.Porcentagem('IRPJ')
    al_csll = fields.Porcentagem('CSLL')
    al_cofins = fields.Porcentagem('COFINS')
    al_pis = fields.Porcentagem('PIS')
    al_cpp = fields.Porcentagem('CPP')
    al_icms = fields.Porcentagem('ICMS')
    al_iss = fields.Porcentagem('ISS')
Example #6
0
class AliquotaISS(models.Model):
    _description = 'Alíquota do ISS'
    _name = 'sped.aliquota.iss'
    _rec_name = 'al_iss'
    _order = 'servico_id, municipio_id, al_iss'

    servico_id = fields.Many2one('sped.servico',
                                 'Serviço',
                                 ondelete='cascade',
                                 required=True)
    municipio_id = fields.Many2one('sped.municipio',
                                   'Município',
                                   ondelete='restrict',
                                   required=True)
    al_iss = fields.Porcentagem('Alíquota', required=True)
Example #7
0
class Documento(models.Model):
    _description = 'Documento Fiscal'
    _name = 'sped.documento'
    _order = 'emissao, modelo, data_emissao desc, serie, numero'
    _rec_name = 'numero'

    empresa_id = fields.Many2one('sped.empresa',
                                 'Empresa',
                                 ondelete='restrict',
                                 default=lambda self: self.env['sped.empresa'].
                                 _empresa_ativa('sped.documento'))
    empresa_cnpj_cpf = fields.Char('CNPJ/CPF',
                                   size=18,
                                   related='empresa_id.cnpj_cpf',
                                   readonly=True)
    #company_id = fields.Many2one('res.company', 'Empresa', ondelete='restrict', store=True, related='empresa_id.original_company_id')
    #company_id = fields.Many2one('res.company', 'Empresa', ondelete='restrict', default=lambda self: self.env['res.company']._company_default_get('sped.documento'))
    emissao = fields.Selection(TIPO_EMISSAO, 'Tipo de emissão', index=True)
    modelo = fields.Selection(MODELO_FISCAL, 'Modelo', index=True)

    data_hora_emissao = fields.Datetime('Data de emissão',
                                        index=True,
                                        default=fields.Datetime.now)
    data_hora_entrada_saida = fields.Datetime('Data de entrada/saída',
                                              index=True,
                                              default=fields.Datetime.now)

    @api.one
    @api.depends('data_hora_emissao', 'data_hora_entrada_saida')
    def _data_hora_separadas(self):
        data_hora_emissao = data_hora_horario_brasilia(
            parse_datetime(self.data_hora_emissao))
        self.data_emissao = str(data_hora_emissao)[:10]
        self.hora_emissao = str(data_hora_emissao)[11:19]

        data_hora_entrada_saida = data_hora_horario_brasilia(
            parse_datetime(self.data_hora_entrada_saida))
        self.data_entrada_saida = str(data_hora_entrada_saida)[:10]
        self.hora_entrada_saida = str(data_hora_entrada_saida)[11:19]

    data_emissao = fields.Date('Data de emissão',
                               compute=_data_hora_separadas,
                               store=True,
                               index=True)
    hora_emissao = fields.Char('Hora de emissão',
                               size=8,
                               compute=_data_hora_separadas,
                               store=True)
    data_entrada_saida = fields.Date('Data de entrada/saída',
                                     compute=_data_hora_separadas,
                                     store=True,
                                     index=True)
    hora_entrada_saida = fields.Char('Hora de entrada/saída',
                                     size=8,
                                     compute=_data_hora_separadas,
                                     store=True)

    serie = fields.Char('Série', index=True)
    numero = fields.Numero('Número', index=True)
    entrada_saida = fields.Selection(ENTRADA_SAIDA,
                                     'Entrada/Saída',
                                     index=True,
                                     default=ENTRADA_SAIDA_SAIDA)
    situacao_fiscal = fields.Selection(SITUACAO_FISCAL,
                                       'Situação fiscal',
                                       index=True,
                                       default=SITUACAO_FISCAL_REGULAR)

    ambiente_nfe = fields.Selection(AMBIENTE_NFE,
                                    'Ambiente da NF-e',
                                    index=True,
                                    default=AMBIENTE_NFE_HOMOLOGACAO)
    tipo_emissao_nfe = fields.Selection(TIPO_EMISSAO_NFE,
                                        'Tipo de emissão da NF-e',
                                        default=TIPO_EMISSAO_NFE_NORMAL)
    ie_st = fields.Char('IE do substituto tributário', size=14)
    municipio_fato_gerador_id = fields.Many2one('sped.municipio',
                                                'Município do fato gerador')

    operacao_id = fields.Many2one('sped.operacao',
                                  'Operação',
                                  ondelete='restrict')
    #
    # Campos da operação
    #
    regime_tributario = fields.Selection(REGIME_TRIBUTARIO,
                                         'Regime tributário',
                                         default=REGIME_TRIBUTARIO_SIMPLES)
    forma_pagamento = fields.Selection(FORMA_PAGAMENTO,
                                       'Forma de pagamento',
                                       default=FORMA_PAGAMENTO_A_VISTA)
    finalidade_nfe = fields.Selection(FINALIDADE_NFE,
                                      'Finalidade da NF-e',
                                      default=FINALIDADE_NFE_NORMAL)
    consumidor_final = fields.Selection(TIPO_CONSUMIDOR_FINAL,
                                        'Tipo do consumidor',
                                        default=TIPO_CONSUMIDOR_FINAL_NORMAL)
    presenca_comprador = fields.Selection(
        INDICADOR_PRESENCA_COMPRADOR,
        'Presença do comprador',
        default=INDICADOR_PRESENCA_COMPRADOR_NAO_SE_APLICA)
    modalidade_frete = fields.Selection(MODALIDADE_FRETE,
                                        'Modalidade do frete',
                                        default=MODALIDADE_FRETE_DESTINATARIO)
    natureza_operacao_id = fields.Many2one('sped.natureza.operacao',
                                           'Natureza da operação',
                                           ondelete='restrict')
    infadfisco = fields.Text('Informações adicionais de interesse do fisco')
    infcomplementar = fields.Text('Informações complementares')
    deduz_retencao = fields.Boolean('Deduz retenção do total da NF?',
                                    default=True)
    pis_cofins_retido = fields.Boolean('PIS-COFINS retidos?')
    al_pis_retido = fields.Porcentagem('Alíquota do PIS', default=0.65)
    al_cofins_retido = fields.Porcentagem('Alíquota da COFINS', default=3)
    csll_retido = fields.Boolean('CSLL retido?')
    al_csll = fields.Porcentagem('Alíquota da CSLL', default=1)
    limite_retencao_pis_cofins_csll = fields.Dinheiro(
        'Obedecer limite de faturamento para retenção de', default=5000)
    irrf_retido = fields.Boolean('IR retido?')
    irrf_retido_ignora_limite = fields.Boolean(
        'IR retido ignora limite de R$ 10,00?')
    al_irrf = fields.Porcentagem('Alíquota do IR', default=1)
    previdencia_retido = fields.Boolean('INSS retido?')
    cnae_id = fields.Many2one('sped.cnae', 'CNAE')
    natureza_tributacao_nfse = fields.Selection(NATUREZA_TRIBUTACAO_NFSE,
                                                'Natureza da tributação')
    servico_id = fields.Many2one('sped.servico', 'Serviço')
    cst_iss = fields.Selection(ST_ISS, 'CST ISS')

    #
    # Destinatário/Remetente
    #
    participante_id = fields.Many2one('sped.participante',
                                      'Destinatário/Remetente',
                                      ondelete='restrict')
    participante_cnpj_cpf = fields.Char('CNPJ/CPF',
                                        size=18,
                                        related='participante_id.cnpj_cpf',
                                        readonly=True)
    participante_tipo_pessoa = fields.Char(
        'Tipo pessoa',
        size=1,
        related='participante_id.tipo_pessoa',
        readonly=True)
    participante_razao_social = fields.NameChar(
        'Razão Social',
        size=60,
        related='participante_id.razao_social',
        readonly=True)
    participante_fantasia = fields.NameChar('Fantasia',
                                            size=60,
                                            related='participante_id.fantasia',
                                            readonly=True)
    participante_endereco = fields.NameChar('Endereço',
                                            size=60,
                                            related='participante_id.endereco',
                                            readonly=True)
    participante_numero = fields.Char('Número',
                                      size=60,
                                      related='participante_id.numero',
                                      readonly=True)
    participante_complemento = fields.Char(
        'Complemento',
        size=60,
        related='participante_id.complemento',
        readonly=True)
    participante_bairro = fields.NameChar('Bairro',
                                          size=60,
                                          related='participante_id.bairro',
                                          readonly=True)
    participante_municipio_id = fields.Many2one(
        'sped.municipio',
        string='Município',
        related='participante_id.municipio_id',
        readonly=True)
    participante_cidade = fields.NameChar('Município',
                                          related='participante_id.cidade',
                                          readonly=True)
    participante_estado = fields.UpperChar('Estado',
                                           related='participante_id.estado',
                                           readonly=True)
    participante_cep = fields.Char('CEP',
                                   size=9,
                                   related='participante_id.cep',
                                   readonly=True)
    #
    # Telefone e email para a emissão da NF-e
    #
    participante_fone = fields.Char('Fone',
                                    size=18,
                                    related='participante_id.fone',
                                    readonly=True)
    participante_fone_comercial = fields.Char(
        'Fone Comercial',
        size=18,
        related='participante_id.fone_comercial',
        readonly=True)
    participante_celular = fields.Char('Celular',
                                       size=18,
                                       related='participante_id.celular',
                                       readonly=True)
    participante_email = fields.Email('Email',
                                      size=60,
                                      related='participante_id.email',
                                      readonly=True)
    #
    # Inscrições e registros
    #
    participante_contribuinte = fields.Selection(
        IE_DESTINATARIO,
        string='Contribuinte',
        default='2',
        related='participante_id.contribuinte',
        readonly=True)
    participante_ie = fields.Char('Inscrição estadual',
                                  size=18,
                                  related='participante_id.ie',
                                  readonly=True)

    #
    # Chave e validação da chave
    #
    chave = fields.Char('Chave', size=44)

    #
    # Transporte
    #
    transportadora_id = fields.Many2one('res.partner',
                                        'Transportadora',
                                        ondelete='restrict',
                                        domain=[('cnpj_cpf', '!=', False)])
    veiculo_id = fields.Many2one('sped.veiculo',
                                 'Veículo',
                                 ondelete='restrict')
    reboque_1_id = fields.Many2one('sped.veiculo',
                                   'Reboque 1',
                                   ondelete='restrict')
    reboque_2_id = fields.Many2one('sped.veiculo',
                                   'Reboque 2',
                                   ondelete='restrict')
    reboque_3_id = fields.Many2one('sped.veiculo',
                                   'Reboque 3',
                                   ondelete='restrict')
    reboque_4_id = fields.Many2one('sped.veiculo',
                                   'Reboque 4',
                                   ondelete='restrict')
    reboque_5_id = fields.Many2one('sped.veiculo',
                                   'Reboque 5',
                                   ondelete='restrict')

    #
    # Totais dos itens
    #

    # Valor total dos produtos
    vr_produtos = fields.Dinheiro('Valor dos produtos/serviços')
    vr_produtos_tributacao = fields.Dinheiro(
        'Valor dos produtos para tributação')
    vr_frete = fields.Dinheiro('Valor do frete')
    vr_seguro = fields.Dinheiro('Valor do seguro')
    vr_desconto = fields.Dinheiro('Valor do desconto')
    vr_outras = fields.Dinheiro('Outras despesas acessórias')
    vr_operacao = fields.Dinheiro('Valor da operação')
    vr_operacao_tributacao = fields.Dinheiro(
        'Valor da operação para tributação')

    # ICMS próprio
    bc_icms_proprio = fields.Dinheiro('Base do ICMS próprio')
    vr_icms_proprio = fields.Dinheiro('Valor do ICMS próprio')
    # ICMS SIMPLES
    vr_icms_sn = fields.Dinheiro('Valor do crédito de ICMS - SIMPLES Nacional')
    vr_simples = fields.Dinheiro('Valor do SIMPLES Nacional')
    # ICMS ST
    bc_icms_st = fields.Dinheiro('Base do ICMS ST')
    vr_icms_st = fields.Dinheiro('Valor do ICMS ST')
    # ICMS ST retido
    bc_icms_st_retido = fields.Dinheiro(
        'Base do ICMS retido anteriormente por substituição tributária')
    vr_icms_st_retido = fields.Dinheiro(
        'Valor do ICMS retido anteriormente por substituição tributária')

    # IPI
    bc_ipi = fields.Dinheiro('Base do IPI')
    vr_ipi = fields.Dinheiro('Valor do IPI')

    # Imposto de importação
    bc_ii = fields.Dinheiro('Base do imposto de importação')
    vr_ii = fields.Dinheiro('Valor do imposto de importação')

    # PIS e COFINS
    bc_pis_proprio = fields.Dinheiro('Base do PIS próprio')
    vr_pis_proprio = fields.Dinheiro('Valor do PIS próprio')
    bc_cofins_proprio = fields.Dinheiro('Base da COFINS própria')
    vr_cofins_proprio = fields.Dinheiro('Valor do COFINS própria')
    bc_pis_st = fields.Dinheiro('Base do PIS ST')
    vr_pis_st = fields.Dinheiro('Valor do PIS ST')
    bc_cofins_st = fields.Dinheiro('Base da COFINS ST')
    vr_cofins_st = fields.Dinheiro('Valor do COFINS ST')

    #
    # Totais dos itens (grupo ISS)
    #

    # Valor total dos serviços
    vr_servicos = fields.Dinheiro('Valor dos serviços')

    # ISS
    bc_iss = fields.Dinheiro('Base do ISS')
    vr_iss = fields.Dinheiro('Valor do ISS')

    ### PIS e COFINS
    ###'vr_pis_servico = CampoDinheiro(u'PIS sobre serviços'),
    ##'vr_pis_servico = fields.Dinheiro('PIS sobre serviços'),
    ###'vr_cofins_servico = CampoDinheiro(u'COFINS sobre serviços'),
    ##'vr_cofins_servico = fields.Dinheiro('COFINS sobre serviços'),

    ###
    ### Retenções de tributos (órgãos públicos, substitutos tributários etc.)
    ###
    ###'vr_operacao_pis_cofins_csll = CampoDinheiro(u'Base da retenção do PIS-COFINS e CSLL'),

    ### PIS e COFINS
    ##'pis_cofins_retido = fields.boolean(u'PIS-COFINS retidos?'),
    ##'al_pis_retido = CampoPorcentagem(u'Alíquota do PIS retido'),
    ##'vr_pis_retido = CampoDinheiro(u'PIS retido'),
    ##'al_cofins_retido = CampoPorcentagem(u'Alíquota da COFINS retida'),
    ##'vr_cofins_retido = CampoDinheiro(u'COFINS retida'),

    ### Contribuição social sobre lucro líquido
    ##'csll_retido = fields.boolean(u'CSLL retida?'),
    ##'al_csll = CampoPorcentagem('Alíquota da CSLL'),
    ##'vr_csll = CampoDinheiro(u'CSLL retida'),
    ##'bc_csll_propria = CampoDinheiro(u'Base da CSLL própria'),
    ##'al_csll_propria = CampoPorcentagem('Alíquota da CSLL própria'),
    ##'vr_csll_propria = CampoDinheiro(u'CSLL própria'),

    ### IRRF
    ##'irrf_retido = fields.boolean(u'IR retido?'),
    ##'bc_irrf = CampoDinheiro(u'Base do IRRF'),
    ##'al_irrf = CampoPorcentagem(u'Alíquota do IRRF'),
    ##'vr_irrf = CampoDinheiro(u'Valor do IRRF'),
    ##'bc_irpj_proprio = CampoDinheiro(u'Valor do IRPJ próprio'),
    ##'al_irpj_proprio = CampoPorcentagem(u'Alíquota do IRPJ próprio'),
    ##'vr_irpj_proprio = CampoDinheiro(u'Valor do IRPJ próprio'),

    ### Previdência social
    ##'previdencia_retido = fields.boolean(u'INSS retido?'),
    ##'bc_previdencia = fields.Dinheiro('Base do INSS'),
    ##'al_previdencia = CampoPorcentagem(u'Alíquota do INSS'),
    ##'vr_previdencia = fields.Dinheiro('Valor do INSS'),

    ### ISS
    ##'iss_retido = fields.boolean(u'ISS retido?'),
    ##'bc_iss_retido = CampoDinheiro(u'Base do ISS'),
    ##'vr_iss_retido = CampoDinheiro(u'Valor do ISS'),

    ###
    ### Total da NF e da fatura (podem ser diferentes no caso de operação triangular)
    ###
    ###'vr_nf = CampoDinheiro(u'Valor total da NF'),
    ##'vr_nf = fields.Dinheiro('Valor total da NF'),
    ###'vr_fatura = CampoDinheiro(u'valor total da fatura'),
    ##'vr_fatura = fields.Dinheiro('Valor total da fatura'),

    ##'vr_ibpt = fields.Dinheiro('Valor IBPT'),

    item_ids = fields.One2many('sped.documento.item', 'documento_id', 'Itens')

    @api.onchange('empresa_id', 'modelo', 'emissao')
    def onchange_empresa_id(self):
        res = {}
        valores = {}
        res['value'] = valores

        if not self.empresa_id:
            return res

        if self.emissao != TIPO_EMISSAO_PROPRIA:
            return res

        if self.modelo not in (MODELO_FISCAL_NFE, MODELO_FISCAL_NFCE,
                               MODELO_FISCAL_NFSE):
            return res

        if self.modelo == MODELO_FISCAL_NFE:
            valores['ambiente_nfe'] = self.empresa_id.ambiente_nfe
            valores['tipo_emissao_nfe'] = self.empresa_id.tipo_emissao_nfe

            if self.empresa_id.tipo_emissao_nfe == TIPO_EMISSAO_NFE_NORMAL:
                if self.empresa_id.ambiente_nfe == AMBIENTE_NFE_PRODUCAO:
                    valores['serie'] = self.empresa_id.serie_nfe_producao
                else:
                    valores['serie'] = self.empresa_id.serie_nfe_homologacao

            else:
                if self.empresa_id.ambiente_nfe == AMBIENTE_NFE_PRODUCAO:
                    valores[
                        'serie'] = self.empresa_id.serie_nfe_contingencia_producao
                else:
                    valores[
                        'serie'] = self.empresa_id.serie_nfe_contingencia_homologacao

        elif self.modelo == MODELO_FISCAL_NFCE:
            valores['ambiente_nfe'] = self.empresa_id.ambiente_nfce
            valores['tipo_emissao_nfe'] = self.empresa_id.tipo_emissao_nfce

            if self.empresa_id.tipo_emissao_nfce == TIPO_EMISSAO_NFE_NORMAL:
                if self.empresa_id.ambiente_nfce == AMBIENTE_NFE_PRODUCAO:
                    valores['serie'] = self.empresa_id.serie_nfce_producao
                else:
                    valores['serie'] = self.empresa_id.serie_nfce_homologacao

            else:
                if self.empresa_id.ambiente_nfce == AMBIENTE_NFE_PRODUCAO:
                    valores[
                        'serie'] = self.empresa_id.serie_nfce_contingencia_producao
                else:
                    valores[
                        'serie'] = self.empresa_id.serie_nfce_contingencia_homologacao

        elif self.modelo == MODELO_FISCAL_NFSE:
            valores['ambiente_nfe'] = self.empresa_id.ambiente_nfse
            valores['tipo_emissao_nfe'] = TIPO_EMISSAO_NFE_NORMAL

            if self.empresa_id.ambiente_nfse == AMBIENTE_NFE_PRODUCAO:
                valores['serie_rps'] = self.empresa_id.serie_rps_producao
            else:
                valores['serie_rps'] = self.empresa_id.serie_rps_homologacao

        return res

    @api.onchange('operacao_id', 'emissao', 'natureza_operacao_id')
    def onchange_operacao_id(self):
        res = {}
        valores = {}
        res['value'] = valores

        if not self.operacao_id:
            return res

        valores['modelo'] = self.operacao_id.modelo
        valores['emissao'] = self.operacao_id.emissao
        valores['entrada_saida'] = self.operacao_id.entrada_saida

        if self.emissao == TIPO_EMISSAO_PROPRIA:
            if self.operacao_id.natureza_operacao_id:
                valores[
                    'natureza_operacao_id'] = self.operacao_id.natureza_operacao_id.id

            if self.operacao_id.serie:
                valores['serie'] = self.operacao_id.serie

            valores['regime_tributario'] = self.operacao_id.regime_tributario
            valores['forma_pagamento'] = self.operacao_id.forma_pagamento
            valores['finalidade_nfe'] = self.operacao_id.finalidade_nfe
            valores['modalidade_frete'] = self.operacao_id.modalidade_frete
            valores['infadfisco'] = self.operacao_id.infadfisco
            valores['infcomplementar'] = self.operacao_id.infcomplementar

        valores['deduz_retencao'] = self.operacao_id.deduz_retencao
        valores['pis_cofins_retido'] = self.operacao_id.pis_cofins_retido
        valores['al_pis_retido'] = self.operacao_id.al_pis_retido
        valores['al_cofins_retido'] = self.operacao_id.al_cofins_retido
        valores['csll_retido'] = self.operacao_id.csll_retido
        valores['al_csll'] = self.operacao_id.al_csll
        valores[
            'limite_retencao_pis_cofins_csll'] = self.operacao_id.limite_retencao_pis_cofins_csll
        valores['irrf_retido'] = self.operacao_id.irrf_retido
        valores[
            'irrf_retido_ignora_limite'] = self.operacao_id.irrf_retido_ignora_limite
        valores['al_irrf'] = self.operacao_id.al_irrf
        valores['previdencia_retido'] = self.operacao_id.previdencia_retido
        valores['consumidor_final'] = self.operacao_id.consumidor_final
        valores['presenca_comprador'] = self.operacao_id.presenca_comprador

        if self.operacao_id.cnae_id:
            valores['cnae_id'] = self.operacao_id.cnae_id.id

        valores[
            'natureza_tributacao_nfse'] = self.operacao_id.natureza_tributacao_nfse

        if self.operacao_id.servico_id:
            valores['servico_id'] = self.operacao_id.servico_id.id

        valores['cst_iss'] = self.operacao_id.cst_iss

        return res

    @api.onchange('empresa_id', 'modelo', 'emissao', 'serie', 'ambiente_nfe')
    def onchange_serie(self):
        res = {}
        valores = {}
        res['value'] = valores

        if not self.empresa_id:
            return res

        if self.emissao != TIPO_EMISSAO_PROPRIA:
            return res

        if self.modelo not in (MODELO_FISCAL_NFE, MODELO_FISCAL_NFCE):
            return res

        ultimo_numero = self.search([
            ('empresa_id.cnpj_cpf', '=', self.empresa_id.cnpj_cpf),
            ('ambiente_nfe', '=', self.ambiente_nfe),
            ('emissao', '=', self.emissao),
            ('modelo', '=', self.modelo),
            ('serie', '=', self.serie.strip()),
        ],
                                    limit=1,
                                    order='numero desc')

        valores['serie'] = self.serie.strip()

        if len(ultimo_numero) == 0:
            valores['numero'] = 1
        else:
            valores['numero'] = ultimo_numero[0].numero + 1

        return res

    @api.depends('consumidor_final')
    @api.onchange('participante_id')
    def onchange_participante_id(self):
        res = {}
        valores = {}
        res['value'] = valores

        #
        # Quando o tipo da nota for para consumidor normal, mas o participante não é
        # contribuinte, define que ele é consumidor final, exceto em caso de operação
        # com estrangeiros
        #
        if self.consumidor_final == TIPO_CONSUMIDOR_FINAL_NORMAL:
            if self.participante_id.estado != 'EX':
                if self.participante_id.contribuinte != INDICADOR_IE_DESTINATARIO:
                    valores[
                        'consumidor_final'] = TIPO_CONSUMIDOR_FINAL_CONSUMIDOR_FINAL

        return res
class AliquotaICMSProprio(models.Model):
    _description = 'Alíquota do ICMS próprio'
    _name = 'sped.aliquota.icms.proprio'
    #_table = 'sped_aliquotaicmsproprio'
    _rec_name = 'descricao'
    _order = 'al_icms'

    al_icms = fields.Porcentagem('Alíquota', required=True)
    md_icms = fields.Selection(
        MODALIDADE_BASE_ICMS_PROPRIO,
        'Modalidade da base de cálculo',
        required=True,
        default=MODALIDADE_BASE_ICMS_PROPRIO_VALOR_OPERACAO)
    pr_icms = fields.Quantidade(
        'Parâmetro da base de cálculo',
        help=
        'A margem de valor agregado, ou o valor da pauta/preço tabelado máximo, de acordo com o definido na modalidade da base de cálculo.'
    )
    rd_icms = fields.Porcentagem('Percentual de redução da alíquota')
    importado = fields.Boolean('Padrão para produtos importados?')

    @api.one
    @api.depends('al_icms', 'md_icms', 'pr_icms', 'rd_icms', 'importado')
    def _descricao(self):
        if self.al_icms == -1:
            self.descricao = 'Não tributado'
        else:
            self.descricao = formata_valor(self.al_icms or 0) + '%'

            if self.md_icms != MODALIDADE_BASE_ICMS_PROPRIO_VALOR_OPERACAO:
                if self.md_icms == MODALIDADE_BASE_ICMS_PROPRIO_MARGEM_VALOR_AGREGADO:
                    self.descricao += ', por MVA de ' + formata_valor(
                        self.pr_icms, casas_decimais=4) + '%'
                elif self.md_icms == MODALIDADE_BASE_ICMS_PROPRIO_PAUTA:
                    self.descricao += ', por pauta de R$ ' + formata_valor(
                        self.pr_icms, casas_decimais=4)
                elif self.md_icms == MODALIDADE_BASE_ICMS_PROPRIO_PRECO_TABELADO_MAXIMO:
                    self.descricao += ', por preço máximo de R$ ' + formata_valor(
                        self.pr_icms, casas_decimais=4)

            if self.rd_icms != 0:
                self.descricao += ', com redução de ' + formata_valor(
                    self.rd_icms) + '%'

            if self.importado:
                self.descricao += ' (padrão para importados)'

    descricao = fields.Char(string='Alíquota do ICMS próprio',
                            compute=_descricao,
                            store=True)

    def _valida_al_icms(self):
        valores = {}
        res = {'value': valores}

        if self.al_icms or self.md_icms or self.rd_icms:
            sql = u"""
            select
                a.id
            from
                sped_aliquota_icms_proprio a
            where
                a.al_icms = {al_icms}
                and a.md_icms = '{md_icms}'
                and a.rd_icms = {rd_icms}
            """
            sql = sql.format(al_icms=self.al_icms,
                             md_icms=self.md_icms,
                             rd_icms=self.rd_icms)

            if self.id or self._origin.id:
                sql += u"""
                    and a.id != {id}
                """
                sql = sql.format(id=self.id or self._origin.id)

            self.env.cr.execute(sql)
            jah_existe = self.env.cr.fetchall()

            if jah_existe:
                raise ValidationError('Alíquota já existe!')

        return res

    @api.one
    @api.constrains('al_icms', 'md_icms', 'rd_icms')
    def constrains_nome(self):
        self._valida_al_icms()

    @api.onchange('al_icms', 'md_icms', 'rd_icms')
    def onchange_al_icms(self):
        return self._valida_al_icms()
Example #9
0
class AliquotaPISCOFINS(models.Model):
    _description = 'Alíquota do PIS-COFINS'
    _name = 'sped.aliquota.pis.cofins'
    #_table = 'sped_aliquotapiscofins'
    _rec_name = 'descricao'
    _order = 'al_pis, al_cofins'

    al_pis = fields.Porcentagem('Alíquota do PIS', required=True)
    al_cofins = fields.Porcentagem('Alíquota da COFINS', required=True)
    md_pis_cofins = fields.Selection(MODALIDADE_BASE_PIS,
                                     'Modalidade da base de cálculo',
                                     required=True,
                                     default=MODALIDADE_BASE_PIS_ALIQUOTA)
    cst_pis_cofins_entrada = fields.Selection(
        ST_PIS_ENTRADA,
        'Situação tributária nas entradas',
        required=True,
        default=ST_PIS_CRED_EXCL_TRIB_MERC_INTERNO)
    cst_pis_cofins_saida = fields.Selection(ST_PIS_SAIDA,
                                            'Situação tributária nas saída',
                                            required=True,
                                            default=ST_PIS_TRIB_NORMAL)
    codigo_justificativa = fields.Char('Código da justificativa', size=10)

    @api.one
    @api.depends('al_pis', 'al_cofins', 'md_pis_cofins',
                 'cst_pis_cofins_entrada', 'cst_pis_cofins_saida',
                 'codigo_justificativa')
    def _descricao(self):
        if self.al_pis == -1:
            self.descricao = 'Não tributado'
        else:
            if self.md_pis_cofins == MODALIDADE_BASE_PIS_ALIQUOTA:
                self.descricao = 'PIS ' + formata_valor(self.al_pis or 0) + '%'
                self.descricao += '; COFINS ' + formata_valor(self.al_cofins
                                                              or 0) + '%'

            elif self.md_pis_cofins == MODALIDADE_BASE_PIS_QUANTIDADE:
                self.descricao = 'por quantidade, PIS a R$ ' + formata_valor(
                    self.al_pis)
                self.descricao += '; COFINS a R$ ' + formata_valor(
                    self.al_cofins)

            self.descricao += ' - CST ' + self.cst_pis_cofins_entrada
            self.descricao += ' entrada, ' + self.cst_pis_cofins_saida
            self.descricao += ' saída'

            if self.codigo_justificativa:
                self.descricao += ' - justificativa '
                self.descricao += self.codigo_justificativa

    descricao = fields.Char(string='Alíquota do PIS-COFINS',
                            compute=_descricao,
                            store=True)

    def _valida_al_pis(self):
        valores = {}
        res = {'value': valores}

        if self.al_pis or self.al_cofins or self.md_pis_cofins or self.cst_pis_cofins_entrada or self.cst_pis_cofins_saida or self.codigo_justificativa:
            sql = u"""
            select
                a.id
            from
                sped_aliquota_pis_cofins a
            where
                a.al_pis = {al_pis}
                and a.al_cofins = {al_cofins}
                and a.md_pis_cofins = '{md_pis_cofins}'
                and a.cst_pis_cofins_entrada = '{cst_pis_cofins_entrada}'
                and a.cst_pis_cofins_saida = '{cst_pis_cofins_saida}'
                and a.codigo_justificativa = '{codigo_justificativa}'
            """
            sql = sql.format(
                al_pis=self.al_pis,
                al_cofins=self.al_cofins,
                md_pis_cofins=self.md_pis_cofins,
                cst_pis_cofins_entrada=self.cst_pis_cofins_entrada,
                cst_pis_cofins_saida=self.cst_pis_cofins_saida,
                codigo_justificativa=self.codigo_justificativa)

            if self.id or self._origin.id:
                sql += u"""
                    and a.id != {id}
                """
                sql = sql.format(id=self.id or self._origin.id)

            self.env.cr.execute(sql)
            jah_existe = self.env.cr.fetchall()

            if jah_existe:
                raise ValidationError('Alíquotas já existem!')

        return res

    @api.one
    @api.constrains('al_pis', 'al_cofins', 'md_pis_cofins',
                    'cst_pis_cofins_entrada', 'cst_pis_cofins_saida',
                    'codigo_justificativa')
    def constrains_nome(self):
        self._valida_al_pis()

    @api.onchange('al_pis', 'al_cofins', 'md_pis_cofins',
                  'cst_pis_cofins_entrada', 'cst_pis_cofins_saida',
                  'codigo_justificativa')
    def onchange_al_pis(self):
        return self._valida_al_pis()
Example #10
0
class OperacaoFiscal(models.Model):
    _description = 'Operações Fiscais'
    _name = 'sped.operacao'
    _order = 'emissao, modelo, nome'
    _rec_name = 'nome'

    empresa_id = fields.Many2one('sped.empresa',
                                 'Empresa',
                                 ondelete='restrict')
    #company_id = fields.Many2one('res.company', 'Empresa', ondelete='restrict')
    modelo = fields.Selection(MODELO_FISCAL,
                              'Modelo',
                              required=True,
                              index=True,
                              default=MODELO_FISCAL_NFE)
    emissao = fields.Selection(TIPO_EMISSAO,
                               'Tipo de emissão',
                               index=True,
                               default=TIPO_EMISSAO_PROPRIA)
    entrada_saida = fields.Selection(ENTRADA_SAIDA,
                                     'Entrada/saída',
                                     index=True,
                                     default=ENTRADA_SAIDA_SAIDA)

    nome = fields.NameChar(string='Nome', size=120, index=True)
    codigo = fields.Char(string='Código', size=60, index=True)

    serie = fields.Char('Série', size=3)
    regime_tributario = fields.Selection(REGIME_TRIBUTARIO,
                                         'Regime tributário',
                                         default=REGIME_TRIBUTARIO_SIMPLES)
    forma_pagamento = fields.Selection(FORMA_PAGAMENTO,
                                       'Forma de pagamento',
                                       default=FORMA_PAGAMENTO_A_VISTA)
    finalidade_nfe = fields.Selection(FINALIDADE_NFE,
                                      'Finalidade da NF-e',
                                      default=FINALIDADE_NFE_NORMAL)
    modalidade_frete = fields.Selection(MODALIDADE_FRETE,
                                        'Modalidade do frete',
                                        default=MODALIDADE_FRETE_DESTINATARIO)
    natureza_operacao_id = fields.Many2one('sped.natureza.operacao',
                                           'Natureza da operação',
                                           ondelete='restrict')
    infadfisco = fields.Text('Informações adicionais de interesse do fisco')
    infcomplementar = fields.Text('Informações complementares')

    #
    # Retenção de impostos
    #
    deduz_retencao = fields.Boolean('Deduz retenção do total da NF?',
                                    default=True)
    pis_cofins_retido = fields.Boolean('PIS-COFINS retidos?')
    al_pis_retido = fields.Porcentagem('Alíquota do PIS', default=0.65)
    al_cofins_retido = fields.Porcentagem('Alíquota da COFINS', default=3)
    csll_retido = fields.Boolean('CSLL retido?')
    al_csll = fields.Porcentagem('Alíquota da CSLL', default=1)
    limite_retencao_pis_cofins_csll = fields.Dinheiro(
        'Obedecer limite de faturamento para retenção de', default=5000)

    irrf_retido = fields.Boolean('IR retido?')
    irrf_retido_ignora_limite = fields.Boolean(
        'IR retido ignora limite de R$ 10,00?')
    al_irrf = fields.Porcentagem('Alíquota do IR', default=1)

    #
    # Notas de serviço
    #
    previdencia_retido = fields.Boolean('INSS retido?')

    cnae_id = fields.Many2one('sped.cnae', 'CNAE')
    natureza_tributacao_nfse = fields.Selection(NATUREZA_TRIBUTACAO_NFSE,
                                                'Natureza da tributação')
    servico_id = fields.Many2one('sped.servico', 'Serviço')
    cst_iss = fields.Selection(ST_ISS, 'CST ISS')

    #'prioriza_familia_ncm': fields.boolean('Prioriza família tributária por NCM?'),
    #'user_ids': fields.many2many('res.users', 'sped_operacao_usuario', 'sped_operacao_id', 'res_user_id', 'Usuários permitidos'),
    #'company_ids': fields.many2many('res.company', 'sped_operacao_company', 'sped_operacao_id', 'company_id', 'Empresas permitidas'),
    #'forca_recalculo_st_compra': fields.boolean('Força recálculo do ST na compra?'),
    #'operacao_entrada_id': fields.many2one('sped.operacao', 'Operação de entrada equivalente'),

    consumidor_final = fields.Selection(TIPO_CONSUMIDOR_FINAL,
                                        'Tipo do consumidor',
                                        default=TIPO_CONSUMIDOR_FINAL_NORMAL)
    presenca_comprador = fields.Selection(
        INDICADOR_PRESENCA_COMPRADOR,
        'Presença do comprador',
        default=INDICADOR_PRESENCA_COMPRADOR_NAO_SE_APLICA)
Example #11
0
class ProtocoloICMS(models.Model):
    _description = 'Protocolos ICMS'
    _name = 'sped.protocolo.icms'
    _rec_name = 'descricao'
    _order = 'descricao'

    tipo = fields.Selection([('P', 'Próprio'), ('S', 'ST')], 'Tipo', required=True, default='P', index=True)
    descricao = fields.Char('Protocolo', size=60, index=True, required=True)
    #ncm_ids = fields.Many2many('sped.ncm', 'sped_protocolo_icms_ncm', 'protocolo_id', 'ncm_id', 'NCMs')
    #produto_ids = fields.Many2many('cadastro.produto', 'sped_protocolo_icms_produto', 'protocolo_id', 'produto_id', 'Produtos')
    estado_ids = fields.Many2many('sped.estado', 'sped_protocolo_icms_estado', 'protocolo_id', 'estado_id', string='Estados')

    aliquota_ids = fields.One2many('sped.protocolo.icms.aliquota', 'protocolo_id', 'Alíquotas')
    aliquota_interna_ids = fields.One2many('sped.protocolo.icms.aliquota', 'protocolo_id', 'Alíquotas internas', domain=[('interna', '=', True)])
    aliquota_AC_ids = fields.One2many('sped.protocolo.icms.aliquota', 'protocolo_id', 'Alíquotas do Acre', domain=[('estado_origem_id.uf', '=', 'AC')])
    aliquota_AL_ids = fields.One2many('sped.protocolo.icms.aliquota', 'protocolo_id', 'Alíquotas de Alagoas', domain=[('estado_origem_id.uf', '=', 'AL')])
    aliquota_AP_ids = fields.One2many('sped.protocolo.icms.aliquota', 'protocolo_id', 'Alíquotas do Amapá', domain=[('estado_origem_id.uf', '=', 'AP')])
    aliquota_AM_ids = fields.One2many('sped.protocolo.icms.aliquota', 'protocolo_id', 'Alíquotas do Amazonas', domain=[('estado_origem_id.uf', '=', 'AM')])
    aliquota_BA_ids = fields.One2many('sped.protocolo.icms.aliquota', 'protocolo_id', 'Alíquotas da Bahia', domain=[('estado_origem_id.uf', '=', 'BA')])
    aliquota_CE_ids = fields.One2many('sped.protocolo.icms.aliquota', 'protocolo_id', 'Alíquotas do Ceará', domain=[('estado_origem_id.uf', '=', 'CE')])
    aliquota_DF_ids = fields.One2many('sped.protocolo.icms.aliquota', 'protocolo_id', 'Alíquotas do Distrito Federal', domain=[('estado_origem_id.uf', '=', 'DF')])
    aliquota_ES_ids = fields.One2many('sped.protocolo.icms.aliquota', 'protocolo_id', 'Alíquotas do Espírito Santo', domain=[('estado_origem_id.uf', '=', 'ES')])
    #aliquota_EX_ids = fields.One2many('sped.protocolo.icms.aliquota', 'protocolo_id', 'Alíquotas do Exterior', domain=[('estado_origem_id.uf', '=', 'EX')])
    aliquota_GO_ids = fields.One2many('sped.protocolo.icms.aliquota', 'protocolo_id', 'Alíquotas de Goiás', domain=[('estado_origem_id.uf', '=', 'GO')])
    aliquota_MA_ids = fields.One2many('sped.protocolo.icms.aliquota', 'protocolo_id', 'Alíquotas do Maranhão', domain=[('estado_origem_id.uf', '=', 'MA')])
    aliquota_MT_ids = fields.One2many('sped.protocolo.icms.aliquota', 'protocolo_id', 'Alíquotas do Mato Grosso', domain=[('estado_origem_id.uf', '=', 'MT')])
    aliquota_MS_ids = fields.One2many('sped.protocolo.icms.aliquota', 'protocolo_id', 'Alíquotas do Mato Grosso do Sul', domain=[('estado_origem_id.uf', '=', 'MS')])
    aliquota_MG_ids = fields.One2many('sped.protocolo.icms.aliquota', 'protocolo_id', 'Alíquotas de Minas Gerais', domain=[('estado_origem_id.uf', '=', 'MG')])
    aliquota_PA_ids = fields.One2many('sped.protocolo.icms.aliquota', 'protocolo_id', 'Alíquotas do Pará', domain=[('estado_origem_id.uf', '=', 'PA')])
    aliquota_PB_ids = fields.One2many('sped.protocolo.icms.aliquota', 'protocolo_id', 'Alíquotas da Paraíba', domain=[('estado_origem_id.uf', '=', 'PB')])
    aliquota_PR_ids = fields.One2many('sped.protocolo.icms.aliquota', 'protocolo_id', 'Alíquotas do Paraná', domain=[('estado_origem_id.uf', '=', 'PR')])
    aliquota_PE_ids = fields.One2many('sped.protocolo.icms.aliquota', 'protocolo_id', 'Alíquotas de Pernambuco', domain=[('estado_origem_id.uf', '=', 'PE')])
    aliquota_PI_ids = fields.One2many('sped.protocolo.icms.aliquota', 'protocolo_id', 'Alíquotas do Piauí', domain=[('estado_origem_id.uf', '=', 'PI')])
    aliquota_RJ_ids = fields.One2many('sped.protocolo.icms.aliquota', 'protocolo_id', 'Alíquotas do Rio de Janeiro', domain=[('estado_origem_id.uf', '=', 'RJ')])
    aliquota_RN_ids = fields.One2many('sped.protocolo.icms.aliquota', 'protocolo_id', 'Alíquotas do Rio Grande do Norte', domain=[('estado_origem_id.uf', '=', 'RN')])
    aliquota_RS_ids = fields.One2many('sped.protocolo.icms.aliquota', 'protocolo_id', 'Alíquotas do Rio Grande do Sul', domain=[('estado_origem_id.uf', '=', 'RS')])
    aliquota_RO_ids = fields.One2many('sped.protocolo.icms.aliquota', 'protocolo_id', 'Alíquotas de Rondônia', domain=[('estado_origem_id.uf', '=', 'RO')])
    aliquota_RR_ids = fields.One2many('sped.protocolo.icms.aliquota', 'protocolo_id', 'Alíquotas de Roraima', domain=[('estado_origem_id.uf', '=', 'RR')])
    aliquota_SC_ids = fields.One2many('sped.protocolo.icms.aliquota', 'protocolo_id', 'Alíquotas de Santa Catarina', domain=[('estado_origem_id.uf', '=', 'SC')])
    aliquota_SP_ids = fields.One2many('sped.protocolo.icms.aliquota', 'protocolo_id', 'Alíquotas de São Paulo', domain=[('estado_origem_id.uf', '=', 'SP')])
    aliquota_SE_ids = fields.One2many('sped.protocolo.icms.aliquota', 'protocolo_id', 'Alíquotas de Sergipe', domain=[('estado_origem_id.uf', '=', 'SE')])
    aliquota_TO_ids = fields.One2many('sped.protocolo.icms.aliquota', 'protocolo_id', 'Alíquotas do Tocantins', domain=[('estado_origem_id.uf', '=', 'TO')])

    def _valida_descricao(self):
        valores = {}
        res = {'value': valores}

        if self.descricao:
            sql = u"""
            select
                a.id
            from
                sped_protocolo_icms a
            where
                a.descricao = '{descricao}'
            """
            sql = sql.format(descricao=self.descricao)

            if self.id or self._origin.id:
                sql += u"""
                    and a.id != {id}
                """
                sql = sql.format(id=self.id or self._origin.id)

            self.env.cr.execute(sql)
            jah_existe = self.env.cr.fetchall()

            if jah_existe:
                raise ValidationError('Protocolo já existe!')

        return res

    @api.one
    @api.constrains('descricao')
    def constrains_descricao(self):
        self._valida_descricao()

    @api.onchange('descricao')
    def onchange_descricao(self):
        return self._valida_descricao()

    @api.one
    def atualizar_tabela(self):
        if self.descricao != 'Padrão':
            return

        sped_estado = self.env['sped.estado']
        sped_aliquota_icms = self.env['sped.aliquota.icms.proprio']
        sped_protocolo_icms_aliquota = self.env['sped.protocolo.icms.aliquota']

        self._cr.execute('delete from sped_protocolo_icms_aliquota where protocolo_id = ' + str(self.id) + ';')

        for estado_origem in ALIQUOTAS_ICMS:
            estado_origem_ids = sped_estado.search([('uf', '=', estado_origem)])

            for estado_destino in ALIQUOTAS_ICMS[estado_origem]:
                estado_destino_ids = sped_estado.search([('uf', '=', estado_destino)])
                al_icms_ids = sped_aliquota_icms.search([('al_icms', '=', ALIQUOTAS_ICMS[estado_origem][estado_destino]), ('md_icms', '=', '3'), ('rd_icms', '=', 0)])

                dados = {
                    'protocolo_id': self.id,
                    'data_inicio': '2016-01-01',
                    'estado_origem_id': estado_origem_ids[0].id,
                    'estado_destino_id': estado_destino_ids[0].id,
                    'al_icms_proprio_id': al_icms_ids[0].id,
                }

                sped_protocolo_icms_aliquota.create(dados)

    @api.one
    def atualizar_sped_st(self):
        sped_estado = self.env['sped.estado']
        sped_aliquota_icms = self.env['sped.aliquota.icms.proprio']
        sped_aliquota_st = self.env['sped.aliquota.icms.st']
        sped_protocolo_icms_aliquota = self.env['sped.protocolo.icms.aliquota']

        self._cr.execute('delete from sped_protocolo_icms_aliquota where protocolo_id = ' + str(self.id) + ';')

        for estado_origem in ALIQUOTAS_ICMS:
            estado_origem_ids = sped_estado.search([('uf', '=', estado_origem)])

            for estado_destino in ALIQUOTAS_ICMS[estado_origem]:
                estado_destino_ids = sped_estado.search([('uf', '=', estado_destino)])
                al_icms_ids = sped_aliquota_icms.search([('al_icms', '=', ALIQUOTAS_ICMS[estado_origem][estado_destino]), ('md_icms', '=', '3'), ('rd_icms', '=', 0)])
                al_icms_st_ids = sped_aliquota_st.search([('al_icms', '=', ALIQUOTAS_ICMS[estado_destino][estado_destino]), ('md_icms', '=', '4'), ('rd_icms', '=', 0),  ('rd_mva', '=', 0)])

                dados = {
                    'protocolo_id': self.id,
                    'data_inicio': '2016-01-01',
                    'estado_origem_id': estado_origem_ids[0].id,
                    'estado_destino_id': estado_destino_ids[0].id,
                    'al_icms_proprio_id': al_icms_ids[0].id,
                    'al_icms_st_id': al_icms_st_ids[0].id,
                }

                sped_protocolo_icms_aliquota.create(dados)

    ncm = fields.Char('NCM', size=8)
    ex = fields.Char('EX', size=2)
    mva = fields.Porcentagem('MVA original')
    ncm_ids = fields.One2many('sped.protocolo.icms.ncm', 'protocolo_id', 'NCMs')

    @api.one
    @api.depends('tipo', 'ncm', 'ex', 'mva')
    def exclui_ncm(self):
        #
        # Excluímos os anteriores
        #
        if not self.ncm:
            return

        protocolo_ncm = self.env['sped.protocolo.icms.ncm']

        if self.ex:
            protocolo_ncm_ids = protocolo_ncm.search([('protocolo_id', '=', self.id), ('ncm_id.codigo', '=ilike', self.ncm), ('ncm_id.ex', '=', self.ex)])

        else:
            protocolo_ncm_ids = protocolo_ncm.search([('protocolo_id', '=', self.id), ('ncm_id.codigo', '=ilike', self.ncm)])

        protocolo_ncm_ids.unlink()

    @api.one
    @api.depends('tipo', 'ncm', 'ex', 'mva')
    def insere_ncm(self):
        if (self.tipo == 'P' and (not self.ncm)) or (self.tipo == 'S' and (not (self.ncm and self.mva))):
            return

        #
        # Excluímos os anteriores
        #
        self.exclui_ncm()

        sped_ncm = self.env['sped.ncm']

        if self.ex:
            ncm_ids = sped_ncm.search([('codigo', 'ilike', self.ncm), ('ex', '=', self.ex)])
        else:
            ncm_ids = sped_ncm.search([('codigo', 'ilike', self.ncm)])

        protocolo_ncm = self.env['sped.protocolo.icms.ncm']

        for ncm_obj in ncm_ids:
            dados = {
                'protocolo_id': self.id,
                'ncm_id': ncm_obj.id,
                'mva': self.mva,
            }
            protocolo_ncm.create(dados)

        self.ncm = ''
        self.ex = ''
        self.mva = 0
Example #12
0
class AliquotaIPI(models.Model):
    _description = 'Alíquota do IPI'
    _name = 'sped.aliquota.ipi'
    #_table = 'sped_aliquotaipi'
    _rec_name = 'descricao'
    _order = 'al_ipi'

    al_ipi = fields.Porcentagem('Alíquota', required=True)
    md_ipi = fields.Selection(MODALIDADE_BASE_IPI,
                              'Modalidade da base de cálculo',
                              required=True,
                              default=MODALIDADE_BASE_IPI_ALIQUOTA)
    cst_ipi_entrada = fields.Selection(
        ST_IPI_ENTRADA,
        'Situação tributária nas entradas',
        required=True,
        default=ST_IPI_ENTRADA_RECUPERACAO_CREDITO)
    cst_ipi_saida = fields.Selection(ST_IPI_SAIDA,
                                     'Situação tributária do nas saídas',
                                     required=True,
                                     default=ST_IPI_SAIDA_TRIBUTADA)

    @api.one
    @api.depends('al_ipi', 'md_ipi', 'cst_ipi_entrada', 'cst_ipi_saida')
    def _descricao(self):
        if self.al_ipi == -1:
            self.descricao = 'Não tributado'
        else:
            if self.md_ipi == MODALIDADE_BASE_IPI_ALIQUOTA:
                self.descricao = formata_valor(self.al_ipi or 0) + '%'
            elif self.md_ipi == MODALIDADE_BASE_IPI_QUANTIDADE:
                self.descricao = 'por quantidade, a R$ ' + formata_valor(
                    self.pr_ipi)

            self.descricao += ' - CST ' + self.cst_ipi_entrada
            self.descricao += ' entrada, ' + self.cst_ipi_saida
            self.descricao += ' saída'

    descricao = fields.Char(string='Alíquota do IPI',
                            compute=_descricao,
                            store=True)

    def _valida_al_ipi(self):
        valores = {}
        res = {'value': valores}

        if self.al_ipi or self.md_ipi:
            sql = u"""
            select
                a.id
            from
                sped_aliquota_ipi a
            where
                a.al_ipi = {al_ipi}
                and a.md_ipi = '{md_ipi}'
            """
            sql = sql.format(al_ipi=self.al_ipi, md_ipi=self.md_ipi)

            if self.id or self._origin.id:
                sql += u"""
                    and a.id != {id}
                """
                sql = sql.format(id=self.id or self._origin.id)

            self.env.cr.execute(sql)
            jah_existe = self.env.cr.fetchall()

            if jah_existe:
                raise ValidationError('Alíquota já existe!')

        return res

    @api.one
    @api.constrains('al_ipi', 'md_ipi')
    def constrains_nome(self):
        self._valida_al_ipi()

    @api.onchange('al_ipi', 'md_ipi')
    def onchange_al_ipi(self):
        return self._valida_al_ipi()
Example #13
0
class AliquotaICMSST(models.Model):
    _description = 'Alíquota do ICMS ST'
    _name = 'sped.aliquota.icms.st'
    #_table = 'sped_aliquotaicmsst'
    _rec_name = 'descricao'
    _order = 'al_icms, md_icms, pr_icms, rd_icms, rd_mva'

    al_icms = fields.Porcentagem('Alíquota', required=True)
    md_icms = fields.Selection(MODALIDADE_BASE_ICMS_ST, 'Modalidade da base de cálculo', required=True, default=MODALIDADE_BASE_ICMS_ST_MARGEM_VALOR_AGREGADO)
    pr_icms = fields.Quantidade('Parâmetro da base de cálculo', required=True,
            help='A margem de valor agregado, ou o valor da pauta/preço tabelado máximo/lista, de acordo com o definido na modalidade da base de cálculo.')
    rd_icms = fields.Porcentagem('Percentual de redução da alíquota')
    rd_mva = fields.Porcentagem('Percentual de redução do MVA para o SIMPLES')

    @api.one
    @api.depends('al_icms', 'md_icms', 'pr_icms', 'rd_icms')
    def _descricao(self):
        if self.al_icms == -1:
            self.descricao = 'Não tributado'
        else:
            self.descricao = formata_valor(self.al_icms or 0) + '%'

            if self.md_icms == MODALIDADE_BASE_ICMS_ST_PRECO_TABELADO_MAXIMO:
                self.descricao += ', por preço máximo'
            elif self.md_icms == MODALIDADE_BASE_ICMS_ST_LISTA_NEGATIVA:
                self.descricao += ', por lista negativa'
            elif self.md_icms == MODALIDADE_BASE_ICMS_ST_LISTA_POSITIVA:
                self.descricao += ', por lista positiva'
            elif self.md_icms == MODALIDADE_BASE_ICMS_ST_LISTA_NEUTRA:
                self.descricao += ', por lista neutra'
            elif self.md_icms == MODALIDADE_BASE_ICMS_ST_MARGEM_VALOR_AGREGADO:
                self.descricao += ', por MVA'
            elif self.md_icms == MODALIDADE_BASE_ICMS_ST_PAUTA:
                self.descricao += ', por pauta'

            if self.pr_icms:
                if self.md_icms == MODALIDADE_BASE_ICMS_ST_MARGEM_VALOR_AGREGADO:
                    self.descricao += ' de ' + formata_valor(self.pr_icms, casas_decimais=4) + '%'
                else:
                    self.descricao += ' de R$ ' + formata_valor(self.pr_icms, casas_decimais=4)

            if self.rd_icms != 0:
                self.descricao += ', com redução de ' + formata_valor(self.rd_icms) + '%'

            if self.rd_mva != 0:
                self.descricao += ', com MVA reduzido em ' + formata_valor(self.rd_mva) + '% para o SIMPLES'

    descricao = fields.Char(string='Alíquota do ICMS ST', compute=_descricao, store=False)

    def _valida_al_icms(self):
        valores = {}
        res = {'value': valores}

        if self.al_icms or self.md_icms or self.pr_icms or self.rd_icms or self.rd_mva:
            sql = u"""
            select
                a.id
            from
                sped_aliquota_icms_st a
            where
                a.al_icms = {al_icms}
                and a.md_icms = '{md_icms}'
                and a.pr_icms = {pr_icms}
                and a.rd_icms = {rd_icms}
                and a.rd_mva = {rd_mva}
            """
            sql = sql.format(al_icms=self.al_icms, md_icms=self.md_icms, pr_icms=self.pr_icms, rd_icms=self.rd_icms, rd_mva=self.rd_mva)

            if self.id or self._origin.id:
                sql += u"""
                    and a.id != {id}
                """
                sql = sql.format(id=self.id or self._origin.id)

            self.env.cr.execute(sql)
            jah_existe = self.env.cr.fetchall()

            if jah_existe:
                raise ValidationError('Alíquota já existe!')

        return res

    @api.one
    @api.constrains('al_icms', 'md_icms', 'pr_icms', 'rd_icms', 'rd_mva')
    def constrains_nome(self):
        self._valida_al_icms()

    @api.onchange('al_icms', 'md_icms', 'pr_icms', 'rd_icms', 'rd_mva')
    def onchange_al_icms(self):
        return self._valida_al_icms()
Example #14
0
class DocumentoItem(models.Model):
    _description = 'Item do Documento Fiscal'
    _name = 'sped.documento.item'
    #_order = 'emissao, modelo, data_emissao desc, serie, numero'
    #_rec_name = 'numero'

    documento_id = fields.Many2one('sped.documento',
                                   'Documento',
                                   ondelete='cascade',
                                   required=True)
    regime_tributario = fields.Selection(
        REGIME_TRIBUTARIO,
        'Regime tributário',
        related='documento_id.regime_tributario',
        readonly=True)
    modelo = fields.Selection(MODELO_FISCAL,
                              'Modelo',
                              related='documento_id.modelo',
                              readonly=True)
    empresa_id = fields.Many2one('sped.empresa',
                                 'Empresa',
                                 related='documento_id.empresa_id',
                                 readonly=True)
    participante_id = fields.Many2one('sped.participante',
                                      'Destinatário/Remetente',
                                      related='documento_id.participante_id',
                                      readonly=True)
    operacao_id = fields.Many2one('sped.operacao',
                                  'Operação Fiscal',
                                  related='documento_id.operacao_id',
                                  readonly=True)
    contribuinte = fields.Selection(IE_DESTINATARIO,
                                    string='Contribuinte',
                                    related='participante_id.contribuinte',
                                    readonly=True)
    emissao = fields.Selection(TIPO_EMISSAO,
                               'Tipo de emissão',
                               related='documento_id.emissao',
                               readonly=True)
    entrada_saida = fields.Selection(ENTRADA_SAIDA,
                                     'Entrada/saída',
                                     related='documento_id.entrada_saida',
                                     readonly=True)
    consumidor_final = fields.Selection(
        TIPO_CONSUMIDOR_FINAL,
        'Tipo do consumidor',
        related='documento_id.consumidor_final',
        readonly=True)

    #empresa_id = fields.Many2one('res.empresa', 'Empresa', ondelete='restrict', related='documento_id.empresa_id')
    #emissao = fields.Selection(TIPO_EMISSAO, 'Tipo de emissão', related='documento_id.emissao')
    #modelo = fields.Selection(MODELO_FISCAL, 'Modelo', related='documento_id.modelo')
    #data_hora_emissao = fields.Datetime('Data de emissão', related='documento_id.data_hora_emissao')
    #data_hora_entrada_saida = fields.Datetime('Data de entrada/saída', related='documento_id.data_hora_entrada_saida')
    #data_emissao = fields.Date('Data de emissão', related='documento_id.data_emissao')
    #hora_emissao = fields.Char('Hora de emissão', size=8, related='documento_id.hora_emissao')
    #data_entrada_saida = fields.Date('Data de entrada/saída', related='documento_id.data_entrada_saida')
    #hora_entrada_saida = fields.Char('Hora de entrada/saída', size=8, related='documento_id.hora_entrada_saida')
    ##serie = fields.Char('Série', index=True)
    ##numero = fields.Numero('Número', index=True)
    ##entrada_saida = fields.Selection(ENTRADA_SAIDA, 'Entrada/Saída', index=True, default=ENTRADA_SAIDA_SAIDA)
    ##situacao_fiscal = fields.Selection(SITUACAO_FISCAL, 'Situação fiscal', index=True, default=SITUACAO_FISCAL_REGULAR)

    ##ambiente_nfe =  fields.Selection(AMBIENTE_NFE, 'Ambiente da NF-e', index=True, default=AMBIENTE_NFE_HOMOLOGACAO)
    ##tipo_emissao_nfe = fields.Selection(TIPO_EMISSAO_NFE, 'Tipo de emissão da NF-e', default=TIPO_EMISSAO_NFE_NORMAL)
    ##ie_st = fields.Char('IE do substituto tributário', size=14)
    ##municipio_fato_gerador_id = fields.Many2one('sped.municipio', 'Município do fato gerador')

    ##operacao_id = fields.Many2one('sped.operacao', 'Operação', ondelete='restrict')
    ###
    ### Campos da operação
    ###
    ##regime_tributario = fields.Selection(REGIME_TRIBUTARIO, 'Regime tributário', default=REGIME_TRIBUTARIO_SIMPLES)
    ##forma_pagamento = fields.Selection(FORMA_PAGAMENTO, 'Forma de pagamento', default=FORMA_PAGAMENTO_A_VISTA)
    ##finalidade_nfe = fields.Selection(FINALIDADE_NFE, 'Finalidade da NF-e', default=FINALIDADE_NFE_NORMAL)
    ##modalidade_frete = fields.Selection(MODALIDADE_FRETE, 'Modalidade do frete', default=MODALIDADE_FRETE_DESTINATARIO)
    ##natureza_operacao_id = fields.Many2one('sped.natureza.operacao', 'Natureza da operação', ondelete='restrict')
    ##infadfisco =  fields.Text('Informações adicionais de interesse do fisco')
    ##infcomplementar = fields.Text('Informações complementares')
    ##deduz_retencao = fields.Boolean('Deduz retenção do total da NF?', default=True)
    ##pis_cofins_retido = fields.Boolean('PIS-COFINS retidos?')
    ##al_pis_retido = fields.Porcentagem('Alíquota do PIS', default=0.65)
    ##al_cofins_retido = fields.Porcentagem('Alíquota da COFINS', default=3)
    ##csll_retido = fields.Boolean('CSLL retido?')
    ##al_csll =  fields.Porcentagem('Alíquota da CSLL', default=1)
    ##limite_retencao_pis_cofins_csll = fields.Dinheiro('Obedecer limite de faturamento para retenção de', default=5000)
    ##irrf_retido = fields.Boolean('IR retido?')
    ##irrf_retido_ignora_limite = fields.Boolean('IR retido ignora limite de R$ 10,00?')
    ##al_irrf =  fields.Porcentagem('Alíquota do IR', default=1)
    ##previdencia_retido = fields.Boolean('INSS retido?')
    ##cnae_id = fields.Many2one('sped.cnae', 'CNAE')
    ##natureza_tributacao_nfse = fields.Selection(NATUREZA_TRIBUTACAO_NFSE, 'Natureza da tributação')
    ##servico_id = fields.Many2one('sped.servico', 'Serviço')
    ##cst_iss = fields.Selection(ST_ISS, 'CST ISS')

    cfop_id = fields.Many2one('sped.cfop',
                              'CFOP',
                              ondelete='restrict',
                              index=True)
    cfop_posicao = fields.Selection(POSICAO_CFOP,
                                    'Posição da CFOP',
                                    related='cfop_id.posicao',
                                    readonly=True)
    cfop_eh_venda = fields.Boolean('CFOP é venda?',
                                   related='cfop_id.eh_venda',
                                   readonly=True)
    compoe_total = fields.Boolean('Compõe o valor total da NF-e?',
                                  index=True,
                                  default=True)
    movimentacao_fisica = fields.Boolean('Há movimentação física do produto?',
                                         default=True)

    # Dados do produto/serviço
    #produto_id = fields.Many2one('produto.produto', 'Produto/Serviço', ondelete='restrict', index=True)
    #uom_id = fields.related('produto_id', 'uom_id', type='Many2one', relation='produto.uom', string=u'Unidade', index=True)
    produto_id = fields.Many2one('sped.produto',
                                 'Produto/Serviço',
                                 ondelete='restrict',
                                 index=True)
    unidade_id = fields.Many2one('sped.unidade',
                                 'Unidade',
                                 related='produto_id.unidade_id',
                                 readonly=True)

    protocolo_id = fields.Many2one('sped.protocolo.icms',
                                   'Protocolo ICMS',
                                   ondelete='restrict')
    operacao_item_id = fields.Many2one('sped.operacao.item',
                                       'Item da operação fiscal',
                                       ondelete='restrict')

    quantidade = fields.Quantidade('Quantidade', default=1)
    # 'unidade' = models.ForeignKey('cadastro.Unidade', verbose_name=_('unidade'), related_name=u'fis_notafiscalitem_unidade', null=True, blank=True)
    vr_unitario = fields.Unitario('Valor unitário')

    # Quantidade de tributação
    quantidade_tributacao = fields.Quantidade('Quantidade para tributação')
    # 'unidade_tributacao' = models.ForeignKey('cadastro.Unidade', verbose_name=_('unidade para tributação'), related_name=u'fis_notafiscalitem_unidade_tributacao', blank=True, null=True)
    vr_unitario_tributacao = fields.Unitario('Valor unitário para tributação')

    # Valor total dos produtos
    vr_produtos = fields.Dinheiro('Valor do produto/serviço')
    vr_produtos_tributacao = fields.Dinheiro(
        'Valor do produto/serviço para tributação')

    # Outros valores acessórios
    vr_frete = fields.Dinheiro('Valor do frete')
    vr_seguro = fields.Dinheiro('Valor do seguro')
    vr_desconto = fields.Dinheiro('Valor do desconto')
    vr_outras = fields.Dinheiro('Outras despesas acessórias')
    vr_operacao = fields.Dinheiro('Valor da operação')
    vr_operacao_tributacao = fields.Dinheiro(
        'Valor da operação para tributação')

    #
    # ICMS próprio
    #
    #contribuinte = fields.related('participante_id', 'contribuinte', type='char', string=u'Contribuinte', store=False, index=True)
    org_icms = fields.Selection(ORIGEM_MERCADORIA,
                                'Origem da mercadoria',
                                index=True,
                                default=ORIGEM_MERCADORIA_NACIONAL)
    cst_icms = fields.Selection(ST_ICMS,
                                'CST ICMS',
                                index=True,
                                default=ST_ICMS_ISENTA)
    partilha = fields.Boolean('Partilha de ICMS entre estados (CST 10 ou 90)?')
    al_bc_icms_proprio_partilha = fields.Porcentagem(
        '% da base de cálculo da operação própria')
    estado_partilha_id = fields.Many2one(
        'sped.estado', 'Estado para o qual é devido o ICMS ST', index=True)
    repasse = fields.Boolean(
        'Repasse de ICMS retido anteriosvente entre estados (CST 41)?',
        index=True)
    md_icms_proprio = fields.Selection(
        MODALIDADE_BASE_ICMS_PROPRIO,
        'Modalidade da base de cálculo do ICMS próprio',
        default=MODALIDADE_BASE_ICMS_PROPRIO_VALOR_OPERACAO)
    pr_icms_proprio = fields.Quantidade('Parâmetro do ICMS próprio')
    rd_icms_proprio = fields.Porcentagem(
        '% de redução da base de cálculo do ICMS próprio')
    bc_icms_proprio_com_ipi = fields.Boolean(
        'IPI integra a base do ICMS próprio?')
    bc_icms_proprio = fields.Dinheiro('Base do ICMS próprio')
    al_icms_proprio = fields.Porcentagem('alíquota do ICMS próprio')
    vr_icms_proprio = fields.Dinheiro('valor do ICMS próprio')

    #
    # Parâmetros relativos ao ICMS Simples Nacional
    #
    cst_icms_sn = fields.Selection(ST_ICMS_SN,
                                   'CST ICMS - SIMPLES',
                                   index=True,
                                   default=ST_ICMS_SN_NAO_TRIBUTADA)
    al_icms_sn = fields.Porcentagem('Alíquota do crédito de ICMS')
    rd_icms_sn = fields.Porcentagem(
        '% estadual de redução da alíquota de ICMS')
    vr_icms_sn = fields.Dinheiro('valor do crédito de ICMS - SIMPLES')
    al_simples = fields.Dinheiro('Alíquota do SIMPLES')
    vr_simples = fields.Dinheiro('Valor do SIMPLES')

    #
    # ICMS ST
    #
    md_icms_st = fields.Selection(
        MODALIDADE_BASE_ICMS_ST,
        'Modalidade da base de cálculo do ICMS ST',
        default=MODALIDADE_BASE_ICMS_ST_MARGEM_VALOR_AGREGADO)
    pr_icms_st = fields.Quantidade('Parâmetro do ICMS ST')
    rd_icms_st = fields.Porcentagem(
        '% de redução da base de cálculo do ICMS ST')
    bc_icms_st_com_ipi = fields.Boolean('IPI integra a base do ICMS ST?')
    bc_icms_st = fields.Dinheiro('Base do ICMS ST')
    al_icms_st = fields.Porcentagem('Alíquota do ICMS ST')
    vr_icms_st = fields.Dinheiro('Valor do ICMS ST')

    #
    # Parâmetros relativos ao ICMS retido anteriormente por substituição tributária
    # na origem
    #
    md_icms_st_retido = fields.Selection(
        MODALIDADE_BASE_ICMS_ST,
        'Modalidade da base de cálculo',
        default=MODALIDADE_BASE_ICMS_ST_MARGEM_VALOR_AGREGADO)
    pr_icms_st_retido = fields.Quantidade('Parâmetro da base de cáculo')
    rd_icms_st_retido = fields.Porcentagem(
        '% de redução da base de cálculo do ICMS retido')
    bc_icms_st_retido = fields.Dinheiro('Base do ICMS ST retido na origem')
    al_icms_st_retido = fields.Porcentagem(
        'Alíquota do ICMS ST retido na origem')
    vr_icms_st_retido = fields.Dinheiro('Valor do ICMS ST retido na origem')

    #
    # IPI padrão
    #
    apuracao_ipi = fields.Selection(APURACAO_IPI,
                                    'Período de apuração do IPI',
                                    index=True,
                                    default=APURACAO_IPI_MENSAL)
    cst_ipi = fields.Selection(ST_IPI, 'CST IPI', index=True)
    md_ipi = fields.Selection(MODALIDADE_BASE_IPI,
                              'Modalidade BC do IPI',
                              default=MODALIDADE_BASE_IPI_ALIQUOTA)
    bc_ipi = fields.Dinheiro('Base do IPI')
    al_ipi = fields.Quantidade('Alíquota do IPI')
    vr_ipi = fields.Dinheiro('Valor do IPI')

    #
    # Imposto de importação
    #
    bc_ii = fields.Dinheiro('Base do imposto de importação')
    vr_despesas_aduaneiras = fields.Dinheiro('Despesas aduaneiras')
    vr_ii = fields.Dinheiro('Valor do imposto de importação')
    vr_iof = fields.Dinheiro('Valor do IOF')
    numero_fci = fields.Char('Nº controle FCI', size=36)

    #
    # PIS próprio
    #
    al_pis_cofins_id = fields.Many2one('sped.aliquota.pis.cofins',
                                       'Alíquota e CST do PIS-COFINS',
                                       index=True)
    cst_pis = fields.Selection(ST_PIS, 'CST PIS', index=True)
    md_pis_proprio = fields.Selection(MODALIDADE_BASE_PIS,
                                      'Modalidade BC do PIS próprio',
                                      default=MODALIDADE_BASE_PIS_ALIQUOTA)
    bc_pis_proprio = fields.Dinheiro('Base do PIS próprio')
    al_pis_proprio = fields.Quantidade('Alíquota do PIS próprio')
    vr_pis_proprio = fields.Dinheiro('Valor do PIS próprio')

    #
    # COFINS própria
    #
    cst_cofins = fields.Selection(ST_COFINS, 'CST COFINS', index=True)
    md_cofins_proprio = fields.Selection(
        MODALIDADE_BASE_COFINS,
        'Modalidade BC da COFINS própria',
        default=MODALIDADE_BASE_COFINS_ALIQUOTA)
    bc_cofins_proprio = fields.Dinheiro('Base do COFINS próprio')
    al_cofins_proprio = fields.Quantidade('Alíquota da COFINS própria')
    vr_cofins_proprio = fields.Dinheiro('Valor do COFINS próprio')

    ##
    ## PIS ST
    ##
    #md_pis_st = fields.Selection(MODALIDADE_BASE_PIS, 'Modalidade BC do PIS ST', default=MODALIDADE_BASE_PIS_ALIQUOTA)
    #bc_pis_st = fields.Dinheiro('Base do PIS ST')
    #al_pis_st = fields.Quantidade('Alíquota do PIS ST')
    #vr_pis_st = fields.Dinheiro('Valor do PIS ST')

    ##
    ## COFINS ST
    ##
    #md_cofins_st = fields.Selection(MODALIDADE_BASE_COFINS, 'Modalidade BC da COFINS ST', default=MODALIDADE_BASE_COFINS_ALIQUOTA)
    #bc_cofins_st = fields.Dinheiro('Base do COFINS ST')
    #al_cofins_st = fields.Quantidade('Alíquota da COFINS ST')
    #vr_cofins_st = fields.Dinheiro('Valor do COFINS ST')

    #
    # Grupo ISS
    #

    # ISS
    #cst_iss = fields.Selection(ST_ISS, 'CST ISS', index=True)
    bc_iss = fields.Dinheiro('Base do ISS')
    al_iss = fields.Dinheiro('Alíquota do ISS')
    vr_iss = fields.Dinheiro('Valor do ISS')

    ## PIS e COFINS
    #vr_pis_servico = fields.Dinheiro('PIS sobre serviços')
    #vr_cofins_servico = fields.Dinheiro('COFINS sobre serviços')

    #
    # Total da NF e da fatura (podem ser diferentes no caso de operação triangular)
    #
    vr_nf = fields.Dinheiro('Valor da NF')
    vr_fatura = fields.Dinheiro('Valor da fatura')
    al_ibpt = fields.Porcentagem('Alíquota IBPT')
    vr_ibpt = fields.Dinheiro('Valor IBPT')

    # Previdência social
    previdencia_retido = fields.Boolean('INSS retido?', index=True)
    bc_previdencia = fields.Dinheiro('Base do INSS')
    al_previdencia = fields.Porcentagem('Alíquota do INSS')
    vr_previdencia = fields.Dinheiro('Valor do INSS')

    # Informações adicionais
    infcomplementar = fields.Text('Informações complementares')

    #
    # Dados especiais para troca de informações entre empresas
    #
    numero_pedido = fields.Char('Número do pedido', size=15)
    numero_item_pedido = fields.Integer('Número do item pedido')

    recalculo = fields.Integer('Campo para obrigar o recalculo dos itens')

    #
    # Campos para a validação das entradas
    #
    produto_codigo = fields.Char('Código do produto original',
                                 size=60,
                                 index=True)
    produto_descricao = fields.Char('Descrição do produto original',
                                    size=60,
                                    index=True)
    produto_ncm = fields.Char('NCM do produto original', size=60, index=True)
    produto_codigo_barras = fields.Char('Código de barras do produto original',
                                        size=60,
                                        index=True)
    unidade = fields.Char('Unidade do produto original', size=6, index=True)
    unidade_tributacao = fields.Char(
        'Unidade de tributação do produto original', size=6, index=True)
    fator_quantidade = fields.Float('Fator de conversão da quantidade')
    quantidade_original = fields.Quantidade('Quantidade')
    #quantidade_estoque = fields.function(_get_quantidade_estoque, type='float', string=u'Quantidade', store=False, digits=(18, 4))
    cfop_original_id = fields.Many2one('sped.cfop',
                                       'CFOP original',
                                       index=True)

    credita_icms_proprio = fields.Boolean('Credita ICMS próprio?', index=True)
    credita_icms_st = fields.Boolean('Credita ICMS ST?', index=True)
    informa_icms_st = fields.Boolean('Informa ICMS ST?', index=True)
    credita_ipi = fields.Boolean('Credita IPI?', index=True)
    credita_pis_cofins = fields.Boolean('Credita PIS-COFINS?', index=True)

    ##
    ## Campos para rateio de custo
    ##
    #vr_frete_rateio = fields.function(_get_calcula_custo, type='float', string=u'Valor do frete', store=STORE_CUSTO, digits=(18, 2))
    #vr_seguro_rateio = fields.function(_get_calcula_custo, type='float', string=u'Valor do seguro', store=STORE_CUSTO, digits=(18, 2))
    #vr_outras_rateio = fields.function(_get_calcula_custo, type='float', string=u'Outras despesas acessórias', store=STORE_CUSTO, digits=(18, 2))
    #vr_desconto_rateio = fields.function(_get_calcula_custo, type='float', string=u'Valor do desconto', store=STORE_CUSTO, digits=(18, 2))
    #vr_unitario_custo = fields.function(_get_calcula_custo, type='float', string=u'Custo unitário', store=STORE_CUSTO, digits=(18, 4))
    #vr_custo = fields.function(_get_calcula_custo, type='float', string=u'Custo', store=STORE_CUSTO, digits=(18, 2))

    #
    # Parâmetros relativos ao ICMS ST compra
    # na origem
    #
    forca_recalculo_st_compra = fields.Boolean(
        'Força recálculo do ST na compra?')
    md_icms_st_compra = fields.Selection(
        MODALIDADE_BASE_ICMS_ST,
        'Modalidade da base de cálculo',
        default=MODALIDADE_BASE_ICMS_ST_MARGEM_VALOR_AGREGADO)
    pr_icms_st_compra = fields.Quantidade('Parâmetro da base de cáculo')
    rd_icms_st_compra = fields.Porcentagem(
        '% de redução da base de cálculo do ICMS compra')
    bc_icms_st_compra = fields.Dinheiro('Base do ICMS ST compra')
    al_icms_st_compra = fields.Porcentagem('Alíquota do ICMS ST compra')
    vr_icms_st_compra = fields.Dinheiro('Valor do ICMS ST compra')

    #
    # Diferencial de alíquota
    #
    calcula_diferencial_aliquota = fields.Boolean(
        'Calcula diferencial de alíquota?')
    al_diferencial_aliquota = fields.Porcentagem(
        'Alíquota diferencial ICMS próprio')
    vr_diferencial_aliquota = fields.Dinheiro(
        'Valor do diferencial de alíquota ICMS próprio')
    al_diferencial_aliquota_st = fields.Porcentagem(
        'Alíquota diferencial ICMS ST')
    vr_diferencial_aliquota_st = fields.Dinheiro(
        'Valor do diferencial de alíquota ICMS ST')

    ##
    ## Campos readonly
    ##
    #@api.one
    #@api.depends('cst_pis', 'cst_cofins', 'al_pis_proprio', 'al_cofins_proprio', 'md_pis_proprio', 'md_cofins_proprio')
    #def _readonly(self):
    #self.cst_pis_readonly = self.cst_pis
    #self.cst_cofins_readonly = self.cst_cofins
    #self.md_pis_proprio_readonly = self.md_pis_proprio
    #self.md_cofins_proprio_readonly = self.md_cofins_proprio
    #self.al_pis_proprio_readonly = self.al_pis_proprio
    #self.al_cofins_proprio_readonly = self.al_cofins_proprio
    #print('passou readonly', self.cst_pis, self.cst_cofins, self.al_pis_proprio, self.al_cofins_proprio, self.md_pis_proprio, self.md_cofins_proprio)
    #print('passou readonly', self.cst_pis_readonly, self.cst_cofins_readonly, self.al_pis_proprio_readonly, self.al_cofins_proprio_readonly, self.md_pis_proprio_readonly, self.md_cofins_proprio_readonly)

    #cst_pis_readonly = fields.Selection(ST_PIS, 'CST PIS', compute=_readonly)
    #md_pis_proprio_readonly = fields.Selection(MODALIDADE_BASE_PIS, 'Modalidade BC do PIS próprio', compute=_readonly)
    #al_pis_proprio_readonly = fields.Quantidade('Alíquota do PIS próprio', compute=_readonly)

    #cst_cofins_readonly = fields.Selection(ST_COFINS, 'CST COFINS', compute=_readonly)
    #md_cofins_proprio_readonly = fields.Selection(MODALIDADE_BASE_COFINS, 'Modalidade BC da COFINS própria', compute=_readonly)
    #al_cofins_proprio_readonly = fields.Quantidade('Alíquota da COFINS própria', compute=_readonly)

    @api.depends('produto_descricao')
    @api.onchange('produto_id')
    def onchange_produto_id(self):
        res = {}
        valores = {}
        res['value'] = valores

        if not self.produto_id:
            return res

        #
        # Validamos alguns dos M2O necessários, vindos do documento
        #
        if not self.empresa_id:
            raise ValidationError('A empresa ativa não foi definida!')

        if not self.participante_id:
            raise ValidationError(
                'O destinatário/remetente não foi informado!')

        if not self.operacao_id:
            raise ValidationError('A operação fiscal não foi informada!')

        #
        # Se já ocorreu o preenchimento da descrição, não sobrepõe
        #
        if not self.produto_descricao:
            valores['produto_descricao'] = self.produto_id.nome

        valores[
            'org_icms'] = self.produto_id.org_icms or ORIGEM_MERCADORIA_NACIONAL

        #
        # Determinamos as UFs de origem e destino
        #
        if self.entrada_saida == ENTRADA_SAIDA_SAIDA:
            estado_origem = self.empresa_id.estado
            estado_destino = self.participante_id.estado

        else:
            estado_origem = self.participante_id.estado
            estado_destino = self.empresa_id.estado

        if estado_origem == estado_destino:
            posicao_cfop = POSICAO_CFOP_ESTADUAL
        elif estado_origem == 'EX' or estado_destino == 'EX':
            posicao_cfop = POSICAO_CFOP_ESTRANGEIRO
        else:
            posicao_cfop = POSICAO_CFOP_INTERESTADUAL

        #
        # Determinamos o protocolo que vai ser aplicado à situação
        #
        protocolo = None

        if self.produto_id.protocolo_id:
            protocolo = self.produto_id.protocolo_id

        elif self.produto_id.ncm_id and self.produto_id.ncm_id.protocolo_ids:
            if len(self.produto_id.ncm_id.protocolo_ids):
                protocolo = self.produto_id.ncm_id.protocolo_ids[0]

            else:
                busca_protocolo = [('id', 'in',
                                    self.produto_id.ncm_id.protocolo_ids), '|',
                                   ('estado_ids', '=', False),
                                   ('estado_ids.uf', '=', estado_destino)]
                protocolo_ids = self.env['sped.protocolo.icms'].search(
                    busca_protocolo)
                print('protocolo_ids', protocolo_ids)

        elif self.empresa_id.protocolo_id:
            protocolo = self.empresa_id.protocolo_id

        if (not protocolo) or (protocolo is None):
            raise ValidationError('O protocolo não foi definido!')

        #
        # Tratando protocolos que só valem para determinados estados
        # Caso não seja possível usar o protocolo, por restrição dos
        # estados permitidos, usar a família global da empresa
        #
        if len(protocolo.estado_ids) > 0:
            estado_ids = protocolo.estado_ids.search([('uf', '=',
                                                       estado_destino)])

            #
            # O estado de destino não pertence ao protocolo, usamos então o protocolo
            # padrão da empresa
            #
            if len(estado_ids) == 0 and not self.empresa_id.protocolo_id:
                if self.produto_id.ncm_id:
                    mensagem_erro = 'Não há protocolo padrão para a empresa, e o protocolo “{protocolo}” não pode ser usado para o estado “{estado}” (produto “{produto}”, NCM “{ncm}”)!'.format(
                        protocolo=protocolo.descricao,
                        estado=estado_destino,
                        produto=self.produto_id.nome,
                        ncm=self.produto_id.ncm_id.codigo_formatado)
                else:
                    mensagem_erro = 'Não há protocolo padrão para a empresa, e o protocolo “{protocolo}” não pode ser usado para o estado “{estado}” (produto “{produto}”)!'.format(
                        protocolo=protocolo.descricao,
                        estado=estado_destino,
                        produto=self.produto_id.nome)

                raise ValidationError(mensagem_erro)

            protocolo = self.empresa_id.protocolo_id

        #
        # Determinamos agora qual linha da operação será seguida
        #
        busca_item = [
            ('operacao_id', '=', self.operacao_id.id),
            ('tipo_protocolo', '=', protocolo.tipo),
            ('protocolo_id', '=', protocolo.id),
            ('cfop_id.posicao', '=', posicao_cfop),
            ('contribuinte', '=', self.participante_id.contribuinte),
        ]

        operacao_item_ids = self.operacao_id.item_ids.search(busca_item)

        #
        # Se não houver um item da operação vinculado ao protocolo, tentamos
        # sem o contribuinte
        #
        if len(operacao_item_ids) == 0:
            busca_item = [
                ('operacao_id', '=', self.operacao_id.id),
                ('tipo_protocolo', '=', protocolo.tipo),
                ('protocolo_id', '=', protocolo.id),
                ('cfop_id.posicao', '=', posicao_cfop),
                ('contribuinte', '=', False),
            ]

            operacao_item_ids = self.operacao_id.item_ids.search(busca_item)

        #
        # Não encontrou item da operação específico para o protocolo,
        # buscamos então o item genérico, sem protocolo
        #
        if len(operacao_item_ids) == 0:
            busca_item = [
                ('operacao_id', '=', self.operacao_id.id),
                ('tipo_protocolo', '=', protocolo.tipo),
                ('protocolo_id', '=', False),
                ('cfop_id.posicao', '=', posicao_cfop),
                ('contribuinte', '=', self.participante_id.contribuinte),
            ]

            operacao_item_ids = self.operacao_id.item_ids.search(busca_item)

        #
        # Ainda não encontrou item da operação específico para o contribuinte,
        # buscamos então o item genérico, sem protocolo nem contribuinte
        #
        if len(operacao_item_ids) == 0:
            busca_item = [
                ('operacao_id', '=', self.operacao_id.id),
                ('tipo_protocolo', '=', protocolo.tipo),
                ('protocolo_id', '=', False),
                ('cfop_id.posicao', '=', posicao_cfop),
                ('contribuinte', '=', False),
            ]

            operacao_item_ids = self.operacao_id.item_ids.search(busca_item)

        #
        # Não tem item da operação mesmo, ou encontrou mais de um possível?
        #
        if len(operacao_item_ids) == 0 or len(operacao_item_ids) > 1:
            if len(operacao_item_ids) == 0:
                mensagem_erro = 'Não há nenhum item genério na operação, nem específico para o protocolo “{protocolo}”, configurado para operações {estado}!'
            else:
                mensagem_erro = 'Há mais de um item genério na operação, ou mais de um item específico para o protocolo “{protocolo}”, configurado para operações {estado}!'

            if posicao_cfop == POSICAO_CFOP_ESTADUAL:
                mensagem_erro = mensagem_erro.format(
                    protocolo=protocolo.descricao, estado='dentro do estado')

            elif posicao_cfop == POSICAO_CFOP_INTERESTADUAL:
                mensagem_erro = mensagem_erro.format(
                    protocolo=protocolo.descricao, estado='interestaduais')

            elif posicao_cfop == POSICAO_CFOP_ESTRANGEIRO:
                mensagem_erro = mensagem_erro.format(
                    protocolo=protocolo.descricao, estado='internacionais')

            raise ValidationError(mensagem_erro)

        #
        # Agora que temos o item da operação, definimos os valores do item
        #
        operacao_item = operacao_item_ids[0]

        valores['protocolo_id'] = protocolo.id
        valores['operacao_item_id'] = operacao_item.id

        return res

    @api.depends('emissao', 'modelo')
    @api.onchange('regime_tributario')
    def onchange_regime_tributario(self):
        res = {}
        valores = {}
        res['value'] = valores

        if self.regime_tributario == REGIME_TRIBUTARIO_SIMPLES:
            #
            # Força a CST do PIS, COFINS e IPI para o SIMPLES
            #
            valores['cst_ipi'] = ''  # NF-e do SIMPLES não destaca IPI nunca
            al_pis_cofins = self.env.ref('sped.ALIQUOTA_PIS_COFINS_SIMPLES')
            valores['al_pis_cofins_id'] = al_pis_cofins.id

        else:
            #
            # A nota não é do SIMPLES, zera o SIMPLES e o crédito de ICMS
            #
            valores['al_simples'] = 0
            valores['al_icms_sn'] = 0

        return res

    #@api.depends()
    @api.onchange('protocolo_id')
    def onchange_protocolo_id(self):
        pass

    @api.depends('produto_id', 'empresa_id', 'regime_tributario')
    @api.onchange('operacao_item_id')
    def onchange_operacao_item_id(self):
        res = {}
        valores = {}
        res['value'] = valores

        if not self.operacao_item_id:
            return res

        valores['cfop_id'] = self.operacao_item_id.cfop_id.id
        valores['compoe_total'] = self.operacao_item_id.compoe_total
        valores[
            'movimentacao_fisica'] = self.operacao_item_id.movimentacao_fisica
        valores[
            'bc_icms_proprio_com_ipi'] = self.operacao_item_id.bc_icms_proprio_com_ipi
        valores[
            'bc_icms_st_com_ipi'] = self.operacao_item_id.bc_icms_st_com_ipi
        valores['cst_icms'] = self.operacao_item_id.cst_icms
        valores['cst_icms_sn'] = self.operacao_item_id.cst_icms_sn
        valores['cst_ipi'] = self.operacao_item_id.cst_ipi

        #
        # Busca agora as alíquotas do PIS e COFINS
        #
        if self.regime_tributario != REGIME_TRIBUTARIO_SIMPLES:
            #
            # Determina a alíquota do PIS-COFINS:
            # 1º - se o produto tem uma específica
            # 2º - se o NCM tem uma específica
            # 3º - a geral da empresa
            #
            if self.produto_id.al_pis_cofins_id:
                al_pis_cofins = self.produto_id.al_pis_cofins_id
            #elif self.produto_id.ncm_id.al_pis_cofins_id:
            #al_pis_cofins = self.produto_id.ncm_id.al_pis_cofins_id
            else:
                al_pis_cofins = self.empresa_id.al_pis_cofins_id

            #
            # Se por acaso a CST do PIS-COFINS especificada no item da operação
            # definir que não haverá cobrança de PIS-COFINS, usa a CST da operação
            # caso contrário, usa a definida acima
            #
            if self.operacao_item_id.al_pis_cofins_id and \
                not (self.operacao_item_id.al_pis_cofins_id.cst_pis_cofins_saida in ST_PIS_CALCULA_ALIQUOTA \
                or self.operacao_item_id.al_pis_cofins_id.cst_pis_cofins_saida in ST_PIS_CALCULA_QUANTIDADE):
                al_pis_cofins = self.operacao_item_id.al_pis_cofins_id

            valores['al_pis_cofins_id'] = al_pis_cofins.id

        return res

    @api.depends('regime_tributario', 'consumidor_final')
    @api.onchange('cfop_id')
    def onchange_cfop_id(self):
        res = {}
        valores = {}
        res['value'] = valores

        if not self.cfop_id:
            return res

        if self.regime_tributario == REGIME_TRIBUTARIO_SIMPLES:
            if self.cfop_id.calcula_simples_csll_irpj:
                valores[
                    'al_simples'] = self.empresa_id.simples_aliquota_id.al_simples

            else:
                valores['al_simples'] = 0

            valores['calcula_diferencial_aliquota'] = False

        else:
            valores['al_simples'] = 0
            valores['al_icms_sn'] = 0

            if self.consumidor_final == TIPO_CONSUMIDOR_FINAL_CONSUMIDOR_FINAL and self.cfop_id.eh_venda:
                valores['calcula_diferencial_aliquota'] = True

        return res

    @api.depends('emissao', 'modelo', 'entrada_saida')
    @api.onchange('al_pis_cofins_id')
    def onchange_al_pis_cofins_id(self):
        res = {}
        valores = {}
        res['value'] = valores

        if (self.emissao != TIPO_EMISSAO_PROPRIA):
            if (self.modelo in (MODELO_FISCAL_NFE, MODELO_FISCAL_NFCE)):
                return res

        if not self.al_pis_cofins_id:
            return res

        valores['md_pis_proprio'] = self.al_pis_cofins_id.md_pis_cofins
        valores['al_pis_proprio'] = self.al_pis_cofins_id.al_pis or 0

        valores['md_cofins_proprio'] = self.al_pis_cofins_id.md_pis_cofins
        valores['al_cofins_proprio'] = self.al_pis_cofins_id.al_cofins or 0

        if self.entrada_saida == ENTRADA_SAIDA_ENTRADA:
            valores['cst_pis'] = self.al_pis_cofins_id.cst_pis_cofins_entrada
            valores[
                'cst_cofins'] = self.al_pis_cofins_id.cst_pis_cofins_entrada
        else:
            valores['cst_pis'] = self.al_pis_cofins_id.cst_pis_cofins_saida
            valores['cst_cofins'] = self.al_pis_cofins_id.cst_pis_cofins_saida

        return res

    @api.depends('emissao', 'modelo', 'entrada_saida', 'operacao_item_id',
                 'produto_id')
    @api.onchange('cst_ipi')
    def onchange_cst_ipi(self):
        res = {}
        valores = {}
        res['value'] = valores

        if self.emissao != TIPO_EMISSAO_PROPRIA:
            return res

        if self.regime_tributario == REGIME_TRIBUTARIO_SIMPLES:
            if self.cst_ipi:
                raise ValidationError(
                    'Para o regime tributário do SIMPLES não há destaque de IPI!'
                )

        else:
            if not self.cst_ipi:
                valores['bc_ipi'] = 0
                valores['al_ipi'] = 0
                valores['vr_ipi'] = 0
                valores['bc_icms_proprio_com_ipi'] = False
                valores['bc_icms_st_com_ipi'] = False
                return res

            print('self.cst_ipi, entrada_saida')
            print(self.cst_ipi, self.entrada_saida, self.cst_ipi
                  in ST_IPI_SAIDA_DICT)

            if self.entrada_saida == ENTRADA_SAIDA_ENTRADA and self.cst_ipi not in ST_IPI_ENTRADA_DICT:
                raise ValidationError(
                    'Selecione um código de situação tributária de entrada!')

            elif self.entrada_saida == ENTRADA_SAIDA_SAIDA and self.cst_ipi not in ST_IPI_SAIDA_DICT:
                raise ValidationError(
                    'Selecione um código de situação tributária de saída!')

        #
        # Determina a alíquota do IPI:
        # 1º - se o produto tem uma específica
        # 2º - se o NCM tem uma específica
        #
        if self.produto_id.al_ipi_id:
            al_ipi = self.produto_id.al_ipi_id
        elif self.produto_id.ncm_id.al_ipi_id:
            al_ipi = self.produto_id.ncm_id.al_ipi_id
        else:
            al_ipi = None

        if (self.cst_ipi
                not in ST_IPI_CALCULA) or (not al_ipi) or (al_ipi is None):
            valores['bc_ipi'] = 0
            valores['al_ipi'] = 0
            valores['vr_ipi'] = 0
            valores['bc_icms_proprio_com_ipi'] = False
            valores['bc_icms_st_com_ipi'] = False

        else:
            valores['md_ipi'] = al_ipi.md_ipi
            valores['al_ipi'] = al_ipi.al_ipi
            valores[
                'bc_icms_proprio_com_ipi'] = self.operacao_item_id.bc_icms_proprio_com_ipi
            valores[
                'bc_icms_st_com_ipi'] = self.operacao_item_id.bc_icms_st_com_ipi

        return res

    @api.depends('empresa_id', 'emissao', 'cfop_id')
    @api.onchange('cst_icms_sn')
    def onchange_cst_icms_sn(self):
        res = {}
        valores = {}
        res['value'] = valores

        if self.emissao != TIPO_EMISSAO_PROPRIA or not self.cst_icms_sn:
            return res

        if self.cst_icms_sn in ST_ICMS_SN_CALCULA_CREDITO:
            if not (self.cfop_id.eh_venda_industrializacao
                    or self.cfop_id.eh_venda_comercializacao):
                raise ValidationError(
                    'Você selecionou uma CSOSN que dá direito a crédito, porém a CFOP não indica uma venda!'
                )

            valores['al_icms_sn'] = self.empresa_id.simples_aliquota_id.al_icms
        else:
            valores['al_icms_sn'] = 0

        return res

    @api.depends('protocolo_id', 'emissao', 'cfop_id', 'empresa_id',
                 'participante_id', 'entrada_saida')
    @api.onchange('cst_icms')
    def onchange_cst_icms(self):
        res = {}
        valores = {}
        res['value'] = valores

        if self.emissao != TIPO_EMISSAO_PROPRIA:
            return res

        if not self.cst_icms:
            return res

        if not (self.cst_icms in ST_ICMS_CALCULA_PROPRIO
                or self.cst_icms in ST_ICMS_CALCULA_ST):
            valores[
                'md_icms_proprio'] = MODALIDADE_BASE_ICMS_PROPRIO_VALOR_OPERACAO
            valores['pr_icms_proprio'] = 0
            valores['rd_icms_proprio'] = 0
            valores['bc_icms_proprio'] = 0
            valores['al_icms_proprio'] = 0
            valores['vr_icms_proprio'] = 0
            valores['al_diferencial_aliquota'] = 0
            valores['vr_diferencial_aliquota'] = 0

            valores[
                'md_icms_st'] = MODALIDADE_BASE_ICMS_ST_MARGEM_VALOR_AGREGADO
            valores['pr_icms_st'] = 0
            valores['rd_icms_st'] = 0
            valores['bc_icms_st'] = 0
            valores['al_icms_st'] = 0
            valores['vr_icms_st'] = 0
            valores['al_diferencial_aliquota_st'] = 0
            valores['vr_diferencial_aliquota_st'] = 0

        return res