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')
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')
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')
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')
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')
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)
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()
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()
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)
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
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()
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()
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