From acabe33de6bea596edd6bc8bba30ac8de3877e03 Mon Sep 17 00:00:00 2001 From: Leonardo Gregianin Date: Fri, 17 Jan 2025 14:26:02 -0400 Subject: [PATCH 1/4] Corrige pis cofins na NFCe --- pynfe/processamento/serializacao.py | 256 +++++++++++++++------------- 1 file changed, 137 insertions(+), 119 deletions(-) diff --git a/pynfe/processamento/serializacao.py b/pynfe/processamento/serializacao.py index 36d9eec5..12164d87 100644 --- a/pynfe/processamento/serializacao.py +++ b/pynfe/processamento/serializacao.py @@ -1118,145 +1118,163 @@ def _serializar_imposto_ipi( def _serializar_imposto_pis( self, produto_servico, modelo, tag_raiz="imposto", retorna_string=True ): - if modelo == 55: # apenas nfe - pisnt = ("04", "05", "06", "07", "08", "09") - pis = etree.SubElement(tag_raiz, "PIS") - if produto_servico.pis_modalidade in pisnt: - pis_item = etree.SubElement(pis, "PISNT") - etree.SubElement(pis_item, "CST").text = produto_servico.pis_modalidade - elif ( - produto_servico.pis_modalidade == "01" - or produto_servico.pis_modalidade == "02" - ): - pis_item = etree.SubElement(pis, "PISAliq") - etree.SubElement(pis_item, "CST").text = produto_servico.pis_modalidade - etree.SubElement(pis_item, "vBC").text = "{:.2f}".format( - produto_servico.pis_valor_base_calculo or 0 - ) - etree.SubElement(pis_item, "pPIS").text = "{:.2f}".format( - produto_servico.pis_aliquota_percentual or 0 - ) - etree.SubElement(pis_item, "vPIS").text = "{:.2f}".format( - produto_servico.pis_valor or 0 - ) - elif produto_servico.pis_modalidade == "03": - pis_item = etree.SubElement(pis, "PISQtde") - etree.SubElement(pis_item, "CST").text = produto_servico.pis_modalidade + # Para NFC-e (65), o grupo de tributação do PIS/COFINS são opcionais. + if (modelo != 55) and \ + ((produto_servico.pis_valor_base_calculo == 0) and + (produto_servico.pis_aliquota_percentual == 0) and + (produto_servico.pis_valor == 0) and + (produto_servico.quantidade_comercial == 0) and + (produto_servico.pis_aliquota_reais == 0) and + (produto_servico.pis_modalidade not in ["04", "05", "06", "07", "08", "09", "49", "99"])): + return + + pisnt = ("04", "05", "06", "07", "08", "09") + pis = etree.SubElement(tag_raiz, "PIS") + if produto_servico.pis_modalidade in pisnt: + pis_item = etree.SubElement(pis, "PISNT") + etree.SubElement(pis_item, "CST").text = produto_servico.pis_modalidade + elif ( + produto_servico.pis_modalidade == "01" + or produto_servico.pis_modalidade == "02" + ): + pis_item = etree.SubElement(pis, "PISAliq") + etree.SubElement(pis_item, "CST").text = produto_servico.pis_modalidade + etree.SubElement(pis_item, "vBC").text = "{:.2f}".format( + produto_servico.pis_valor_base_calculo or 0 + ) + etree.SubElement(pis_item, "pPIS").text = "{:.2f}".format( + produto_servico.pis_aliquota_percentual or 0 + ) + etree.SubElement(pis_item, "vPIS").text = "{:.2f}".format( + produto_servico.pis_valor or 0 + ) + elif produto_servico.pis_modalidade == "03": + pis_item = etree.SubElement(pis, "PISQtde") + etree.SubElement(pis_item, "CST").text = produto_servico.pis_modalidade + etree.SubElement(pis_item, "qBCProd").text = "{:.4f}".format( + produto_servico.quantidade_comercial + ) + etree.SubElement(pis_item, "vAliqProd").text = "{:.4f}".format( + produto_servico.pis_aliquota_reais or 0 + ) + etree.SubElement(pis_item, "vPIS").text = "{:.2f}".format( + produto_servico.pis_valor or 0 + ) + else: + pis_item = etree.SubElement(pis, "PISOutr") + etree.SubElement(pis_item, "CST").text = produto_servico.pis_modalidade + if produto_servico.pis_aliquota_reais > 0: etree.SubElement(pis_item, "qBCProd").text = "{:.4f}".format( produto_servico.quantidade_comercial ) etree.SubElement(pis_item, "vAliqProd").text = "{:.4f}".format( produto_servico.pis_aliquota_reais or 0 ) - etree.SubElement(pis_item, "vPIS").text = "{:.2f}".format( - produto_servico.pis_valor or 0 - ) else: - pis_item = etree.SubElement(pis, "PISOutr") - etree.SubElement(pis_item, "CST").text = produto_servico.pis_modalidade - if produto_servico.pis_aliquota_reais > 0: - etree.SubElement(pis_item, "qBCProd").text = "{:.4f}".format( - produto_servico.quantidade_comercial - ) - etree.SubElement(pis_item, "vAliqProd").text = "{:.4f}".format( - produto_servico.pis_aliquota_reais or 0 - ) - else: - etree.SubElement(pis_item, "vBC").text = "{:.2f}".format( - produto_servico.pis_valor_base_calculo or 0 - ) - etree.SubElement(pis_item, "pPIS").text = "{:.2f}".format( - produto_servico.pis_aliquota_percentual or 0 - ) - etree.SubElement(pis_item, "vPIS").text = "{:.2f}".format( - produto_servico.pis_valor or 0 + etree.SubElement(pis_item, "vBC").text = "{:.2f}".format( + produto_servico.pis_valor_base_calculo or 0 ) + etree.SubElement(pis_item, "pPIS").text = "{:.2f}".format( + produto_servico.pis_aliquota_percentual or 0 + ) + etree.SubElement(pis_item, "vPIS").text = "{:.2f}".format( + produto_servico.pis_valor or 0 + ) - # PISST - # pis_item = etree.SubElement(pis, 'PISST') - # etree.SubElement(pis_item, 'vBC').text = produto_servico.pis_valor_base_calculo - # etree.SubElement(pis_item, 'pPIS').text = produto_servico.pis_aliquota_percentual - # etree.SubElement(pis_item, 'qBCProd').text = produto_servico.quantidade_comercial - # etree.SubElement(pis_item, 'vAliqProd').text = produto_servico - # .pis_aliquota_percentual - # etree.SubElement(pis_item, 'vPIS').text = produto_servico.pis_valor_base_calculo + # PISST + # pis_item = etree.SubElement(pis, 'PISST') + # etree.SubElement(pis_item, 'vBC').text = produto_servico.pis_valor_base_calculo + # etree.SubElement(pis_item, 'pPIS').text = produto_servico.pis_aliquota_percentual + # etree.SubElement(pis_item, 'qBCProd').text = produto_servico.quantidade_comercial + # etree.SubElement(pis_item, 'vAliqProd').text = produto_servico + # .pis_aliquota_percentual + # etree.SubElement(pis_item, 'vPIS').text = produto_servico.pis_valor_base_calculo def _serializar_imposto_cofins( self, produto_servico, modelo, tag_raiz="imposto", retorna_string=True ): - if modelo == 55: # apenas nfe - cofinsnt = ("04", "05", "06", "07", "08", "09") - cofins = etree.SubElement(tag_raiz, "COFINS") - if produto_servico.cofins_modalidade in cofinsnt: - cofins_item = etree.SubElement(cofins, "COFINSNT") - etree.SubElement( - cofins_item, "CST" - ).text = produto_servico.cofins_modalidade - elif ( - produto_servico.cofins_modalidade == "01" - or produto_servico.cofins_modalidade == "02" - ): - cofins_item = etree.SubElement(cofins, "COFINSAliq") - etree.SubElement( - cofins_item, "CST" - ).text = produto_servico.cofins_modalidade - etree.SubElement(cofins_item, "vBC").text = "{:.2f}".format( - produto_servico.cofins_valor_base_calculo or 0 - ) - etree.SubElement(cofins_item, "pCOFINS").text = "{:.2f}".format( - produto_servico.cofins_aliquota_percentual or 0 - ) - etree.SubElement(cofins_item, "vCOFINS").text = "{:.2f}".format( - produto_servico.cofins_valor - ) - elif produto_servico.cofins_modalidade == "03": - cofins_item = etree.SubElement(cofins, "COFINSQtde") - etree.SubElement( - cofins_item, "CST" - ).text = produto_servico.cofins_modalidade + # Para NFC-e (65), o grupo de tributação do PIS/COFINS são opcionais. + if (modelo != 55) and \ + ((produto_servico.cofins_valor_base_calculo == 0) and + (produto_servico.cofins_aliquota_percentual == 0) and + (produto_servico.cofins_valor == 0) and + (produto_servico.quantidade_comercial == 0) and + (produto_servico.cofins_aliquota_reais == 0) and + (produto_servico.cofins_modalidade not in ["04", "05", "06", "07", "08", "09", "49", "99"])): + return + + cofinsnt = ("04", "05", "06", "07", "08", "09") + cofins = etree.SubElement(tag_raiz, "COFINS") + if produto_servico.cofins_modalidade in cofinsnt: + cofins_item = etree.SubElement(cofins, "COFINSNT") + etree.SubElement( + cofins_item, "CST" + ).text = produto_servico.cofins_modalidade + elif ( + produto_servico.cofins_modalidade == "01" + or produto_servico.cofins_modalidade == "02" + ): + cofins_item = etree.SubElement(cofins, "COFINSAliq") + etree.SubElement( + cofins_item, "CST" + ).text = produto_servico.cofins_modalidade + etree.SubElement(cofins_item, "vBC").text = "{:.2f}".format( + produto_servico.cofins_valor_base_calculo or 0 + ) + etree.SubElement(cofins_item, "pCOFINS").text = "{:.2f}".format( + produto_servico.cofins_aliquota_percentual or 0 + ) + etree.SubElement(cofins_item, "vCOFINS").text = "{:.2f}".format( + produto_servico.cofins_valor + ) + elif produto_servico.cofins_modalidade == "03": + cofins_item = etree.SubElement(cofins, "COFINSQtde") + etree.SubElement( + cofins_item, "CST" + ).text = produto_servico.cofins_modalidade + etree.SubElement(cofins_item, "qBCProd").text = "{:.4f}".format( + produto_servico.quantidade_comercial + ) + etree.SubElement(cofins_item, "vAliqProd").text = "{:.4f}".format( + produto_servico.cofins_aliquota_reais + ) + etree.SubElement(cofins_item, "vCOFINS").text = "{:.2f}".format( + produto_servico.cofins_valor + ) + else: + cofins_item = etree.SubElement(cofins, "COFINSOutr") + etree.SubElement( + cofins_item, "CST" + ).text = produto_servico.cofins_modalidade + if produto_servico.cofins_aliquota_reais > 0: etree.SubElement(cofins_item, "qBCProd").text = "{:.4f}".format( produto_servico.quantidade_comercial ) etree.SubElement(cofins_item, "vAliqProd").text = "{:.4f}".format( - produto_servico.cofins_aliquota_reais - ) - etree.SubElement(cofins_item, "vCOFINS").text = "{:.2f}".format( - produto_servico.cofins_valor + produto_servico.cofins_aliquota_reais or 0 ) else: - cofins_item = etree.SubElement(cofins, "COFINSOutr") - etree.SubElement( - cofins_item, "CST" - ).text = produto_servico.cofins_modalidade - if produto_servico.cofins_aliquota_reais > 0: - etree.SubElement(cofins_item, "qBCProd").text = "{:.4f}".format( - produto_servico.quantidade_comercial - ) - etree.SubElement(cofins_item, "vAliqProd").text = "{:.4f}".format( - produto_servico.cofins_aliquota_reais or 0 - ) - else: - etree.SubElement(cofins_item, "vBC").text = "{:.2f}".format( - produto_servico.cofins_valor_base_calculo or 0 - ) - etree.SubElement(cofins_item, "pCOFINS").text = "{:.2f}".format( - produto_servico.cofins_aliquota_percentual or 0 - ) - etree.SubElement(cofins_item, "vCOFINS").text = "{:.2f}".format( - produto_servico.cofins_valor or 0 + etree.SubElement(cofins_item, "vBC").text = "{:.2f}".format( + produto_servico.cofins_valor_base_calculo or 0 ) - - # COFINSST - # cofins_item = etree.SubElement(cofins, 'COFINSOutr') - # etree.SubElement(cofins_item, 'vBC').text = produto_servico - # .cofins_valor_base_calculo - # etree.SubElement(cofins_item, 'pCOFINS').text = produto_servico - # .cofins_aliquota_percentual - # etree.SubElement(cofins_item, 'qBCProd').text = produto_servico - # .quantidade_comercial - # etree.SubElement(cofins_item, 'vAliqProd').text = produto_servico - # .cofins_aliquota_percentual - # etree.SubElement(cofins_item, 'vCOFINS').text = produto_servico.cofins_valor + etree.SubElement(cofins_item, "pCOFINS").text = "{:.2f}".format( + produto_servico.cofins_aliquota_percentual or 0 + ) + etree.SubElement(cofins_item, "vCOFINS").text = "{:.2f}".format( + produto_servico.cofins_valor or 0 + ) + + # COFINSST + # cofins_item = etree.SubElement(cofins, 'COFINSOutr') + # etree.SubElement(cofins_item, 'vBC').text = produto_servico + # .cofins_valor_base_calculo + # etree.SubElement(cofins_item, 'pCOFINS').text = produto_servico + # .cofins_aliquota_percentual + # etree.SubElement(cofins_item, 'qBCProd').text = produto_servico + # .quantidade_comercial + # etree.SubElement(cofins_item, 'vAliqProd').text = produto_servico + # .cofins_aliquota_percentual + # etree.SubElement(cofins_item, 'vCOFINS').text = produto_servico.cofins_valor def _serializar_imposto_importacao( self, produto_servico, modelo, tag_raiz="imposto", retorna_string=True From 4a1531344fd3d181ceadb68b049895bee0b688cc Mon Sep 17 00:00:00 2001 From: Leonardo Gregianin Date: Fri, 24 Jan 2025 10:25:44 -0400 Subject: [PATCH 2/4] Atualiza arquivos xsd para nfe/nfce --- pynfe/data/XSDs/NF-e/distDFeInt_v1.01.xsd | 83 +- pynfe/data/XSDs/NF-e/eventoEPEC_v1.00.xsd | 54 +- .../XSDs/NF-e/leiauteConsSitNFe_v4.00.xsd | 1005 +++++++++-------- pynfe/data/XSDs/NF-e/leiauteNFe_v4.00.xsd | 324 +++++- pynfe/data/XSDs/NF-e/retDistDFeInt_v1.01.xsd | 82 +- pynfe/data/XSDs/NF-e/tiposBasico_v1.03.xsd | 18 +- pynfe/data/XSDs/NF-e/tiposBasico_v4.00.xsd | 2 +- pynfe/data/XSDs/NF-e/tiposDistDFe_v1.01.xsd | 218 +++- 8 files changed, 1191 insertions(+), 595 deletions(-) diff --git a/pynfe/data/XSDs/NF-e/distDFeInt_v1.01.xsd b/pynfe/data/XSDs/NF-e/distDFeInt_v1.01.xsd index 87262404..d78a3752 100644 --- a/pynfe/data/XSDs/NF-e/distDFeInt_v1.01.xsd +++ b/pynfe/data/XSDs/NF-e/distDFeInt_v1.01.xsd @@ -1,5 +1,84 @@ -Schema de pedido de distribuição de DF-e de interesse + + + + + + Schema de pedido de distribuição de DF-e de interesse + + + + + + Identificação do Ambiente: 1 - Produção 2 - Homologação - Código da UF do AutorCNPJ do interessado no DF-eCPF do interessado no DF-eGrupo para distribuir DF-e de interesseÚltimo NSU recebido pelo ator. Caso seja informado com zero, ou com um NSU muito antigo, a consulta retornará unicamente as informações resumidas e documentos fiscais eletrônicos que tenham sido recepcionados pelo Ambiente Nacional nos últimos 3 meses.Grupo para consultar um DF-e a partir de um NSU específicoNúmero Sequencial Único. Geralmente esta consulta será utilizada quando identificado pelo interessado um NSU faltante. O Web Service retornará o documento ou informará que o NSU não existe no Ambiente Nacional. Assim, esta consulta fechará a lacuna do NSU identificado como faltante.Grupo para consultar uma NF-e a partir da chave de acessoChave de acesso da NF-e a ser consultada \ No newline at end of file + + + + + + Código da UF do Autor + + + + + + CNPJ do interessado no DF-e + + + + + CPF do interessado no DF-e + + + + + + + Grupo para distribuir DF-e de interesse + + + + + + Último NSU recebido pelo ator. Caso seja informado com zero, ou com um NSU muito antigo, a consulta retornará unicamente as informações resumidas e documentos fiscais eletrônicos que tenham sido recepcionados pelo Ambiente Nacional nos últimos 3 meses. + + + + + + + + Grupo para consultar um DF-e a partir de um NSU específico + + + + + + Número Sequencial Único. Geralmente esta consulta será utilizada quando identificado pelo interessado um NSU faltante. O Web Service retornará o documento ou informará que o NSU não existe no Ambiente Nacional. Assim, esta consulta fechará a lacuna do NSU identificado como faltante. + + + + + + + + Grupo para consultar uma NF-e a partir da chave de acesso + + + + + + Chave de acesso da NF-e a ser consultada + + + + + + + + + + + \ No newline at end of file diff --git a/pynfe/data/XSDs/NF-e/eventoEPEC_v1.00.xsd b/pynfe/data/XSDs/NF-e/eventoEPEC_v1.00.xsd index 0d0a987f..7f72bf07 100644 --- a/pynfe/data/XSDs/NF-e/eventoEPEC_v1.00.xsd +++ b/pynfe/data/XSDs/NF-e/eventoEPEC_v1.00.xsd @@ -2,6 +2,15 @@ + + + Versão do Tipo do Evento + + + + + + @@ -219,49 +228,4 @@ - - - Versão do Tipo do Evento - - - - - - - - - Tipo Código de orgão (UF da tabela do IBGE + 91 RFB) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/pynfe/data/XSDs/NF-e/leiauteConsSitNFe_v4.00.xsd b/pynfe/data/XSDs/NF-e/leiauteConsSitNFe_v4.00.xsd index 5330c83d..ec2a9e65 100644 --- a/pynfe/data/XSDs/NF-e/leiauteConsSitNFe_v4.00.xsd +++ b/pynfe/data/XSDs/NF-e/leiauteConsSitNFe_v4.00.xsd @@ -1,502 +1,503 @@ - - - - - - - - - - - - Tipo Pedido de Consulta da Situação Atual da Nota Fiscal Eletrônica - - - - - Identificação do Ambiente: -1 - Produção -2 - Homologação - - - - - Serviço Solicitado - - - - - - - - - - Chaves de acesso da NF-e, compostas por: UF do emitente, AAMM da emissão da NFe, CNPJ do emitente, modelo, série e número da NF-e e código numérico + DV. - - - - - - - - Tipo Retorno de Pedido de Consulta da Situação Atual da Nota Fiscal Eletrônica - - - - - Identificação do Ambiente: -1 - Produção -2 - Homologação - - - - - Versão do Aplicativo que processou a NF-e - - - - - Código do status da mensagem enviada. - - - - - Descrição literal do status do serviço solicitado. - - - - - código da UF de atendimento - - - - - AAAA-MM-DDTHH:MM:SSTZD - - - - - Chaves de acesso da NF-e consultada - - - - - Protocolo de autorização de uso da NF-e - - - - - Protocolo de homologação de cancelamento de uso da NF-e - - - - - Protocolo de registro de evento da NF-e - - - - - - - - Tipo Protocolo de status resultado do processamento da NF-e - - - - - Dados do protocolo de status - - - - - - Identificação do Ambiente: -1 - Produção -2 - Homologação - - - - - Versão do Aplicativo que processou a NF-e - - - - - Chaves de acesso da NF-e, compostas por: UF do emitente, AAMM da emissão da NFe, CNPJ do emitente, modelo, série e número da NF-e e código numérico+DV. - - - - - Data e hora de processamento, no formato AAAA-MM-DDTHH:MM:SS (ou AAAA-MM-DDTHH:MM:SSTZD, de acordo com versão). Deve ser preenchida com data e hora da gravação no Banco em caso de Confirmação. Em caso de Rejeição, com data e hora do recebimento do Lote de NF-e enviado. - - - - - Número do Protocolo de Status da NF-e. 1 posição (1 – Secretaria de Fazenda Estadual 2 – Receita Federal); 2 - códiga da UF - 2 posições ano; 10 seqüencial no ano. - - - - - Digest Value da NF-e processada. Utilizado para conferir a integridade da NF-e original. - - - - - Código do status da mensagem enviada. - - - - - Descrição literal do status do serviço solicitado. - - - - - - - - - - - - - Tipo retorno Pedido de Cancelamento da Nota Fiscal Eletrônica - - - - - Dados do Resultado do Pedido de Cancelamento da Nota Fiscal Eletrônica - - - - - - Identificação do Ambiente: -1 - Produção -2 - Homologação - - - - - Versão do Aplicativo que processou o pedido de cancelamento - - - - - Código do status da mensagem enviada. - - - - - Descrição literal do status do serviço solicitado. - - - - - código da UF de atendimento - - - - - Chaves de acesso da NF-e, compostas por: UF do emitente, AAMM da emissão da NFe, CNPJ do emitente, modelo, série e número da NF-e e código numérico + DV. - - - - - Data e hora de recebimento, no formato AAAA-MM-DDTHH:MM:SS. Deve ser preenchida com data e hora da gravação no Banco em caso de Confirmação. - - - - - Número do Protocolo de Status da NF-e. 1 posição (1 – Secretaria de Fazenda Estadual 2 – Receita Federal); 2 - código da UF - 2 posições ano; 10 seqüencial no ano. - - - - - - - - - - - - - Tipo Evento - - - - - - - - Código do órgão de recepção do Evento. Utilizar a Tabela do IBGE extendida, utilizar 90 para identificar o Ambiente Nacional - - - - - Identificação do Ambiente: -1 - Produção -2 - Homologação - - - - - Identificação do autor do evento - - - - CNPJ - - - - - CPF - - - - - - Chave de Acesso da NF-e vinculada ao evento - - - - - Data e Hora do Evento, formato UTC (AAAA-MM-DDThh:mm:ssTZD, onde TZD = +hh:mm ou -hh:mm) - - - - - Tipo do Evento - - - - - - - - - - - Seqüencial do evento para o mesmo tipo de evento. Para maioria dos eventos será 1, nos casos em que possa existir mais de um evento, como é o caso da carta de correção, o autor do evento deve numerar de forma seqüencial. - - - - - - - - - - - Versão do Tipo do Evento - - - - - - - - - - Detalhe Específico do Evento - - - - - - - - - - - - Identificador da TAG a ser assinada, a regra de formação do Id é: -“ID” + tpEvento + chave da NF-e + nSeqEvento - - - - - - - - - - - - - - - - Tipo retorno do Evento - - - - - - - - Identificação do Ambiente: -1 - Produção -2 - Homologação - - - - - Versão do Aplicativo que recebeu o Evento - - - - - Código do órgão de recepção do Evento. Utilizar a Tabela do IBGE extendida, utilizar 90 para identificar o Ambiente Nacional - - - - - Código do status da registro do Evento - - - - - Descrição literal do status do registro do Evento - - - - - Chave de Acesso NF-e vinculada - - - - - Tipo do Evento vinculado - - - - - - - - - - - Descrição do Evento - - - - - - - - - - - Seqüencial do evento - - - - - - - - - - - Identificação do destinatpario da NF-e - - - - CNPJ Destinatário - - - - - CPF Destiantário - - - - - - email do destinatário - - - - - - - - - - - Data e Hora de registro do evento formato UTC AAAA-MM-DDTHH:MM:SSTZD - - - - - Número do protocolo de registro do evento - - - - - - - - - - - - - - - - - - - Tipo procEvento - - - - - - - - - - Tipo Versão da NF-e - - - - - - - - Tipo Versão do leiaute de Cancelamento de NF-e - 2.00/1.07 - - - - - - - - Tipo Versão do Evento 1.00 - - - - - - - - Tipo Versão do Evento - - - - - - - - Tipo Versão do Leiaute da Cosulta situação NF-e - 4.00 - - - - - - - + + + + + + + + + + + + + Tipo Pedido de Consulta da Situação Atual da Nota Fiscal Eletrônica + + + + + Identificação do Ambiente: +1 - Produção +2 - Homologação + + + + + Serviço Solicitado + + + + + + + + + + Chaves de acesso da NF-e, compostas por: UF do emitente, AAMM da emissão da NFe, CNPJ do emitente, modelo, série e número da NF-e e código numérico + DV. + + + + + + + + Tipo Retorno de Pedido de Consulta da Situação Atual da Nota Fiscal Eletrônica + + + + + Identificação do Ambiente: +1 - Produção +2 - Homologação + + + + + Versão do Aplicativo que processou a NF-e + + + + + Código do status da mensagem enviada. + + + + + Descrição literal do status do serviço solicitado. + + + + + código da UF de atendimento + + + + + AAAA-MM-DDTHH:MM:SSTZD + + + + + Chaves de acesso da NF-e consultada + + + + + Protocolo de autorização de uso da NF-e + + + + + Protocolo de homologação de cancelamento de uso da NF-e + + + + + Protocolo de registro de evento da NF-e + + + + + + + + Tipo Protocolo de status resultado do processamento da NF-e + + + + + Dados do protocolo de status + + + + + + Identificação do Ambiente: +1 - Produção +2 - Homologação + + + + + Versão do Aplicativo que processou a NF-e + + + + + Chaves de acesso da NF-e, compostas por: UF do emitente, AAMM da emissão da NFe, CNPJ do emitente, modelo, série e número da NF-e e código numérico+DV. + + + + + Data e hora de processamento, no formato AAAA-MM-DDTHH:MM:SS (ou AAAA-MM-DDTHH:MM:SSTZD, de acordo com versão). Deve ser preenchida com data e hora da gravação no Banco em caso de Confirmação. Em caso de Rejeição, com data e hora do recebimento do Lote de NF-e enviado. + + + + + Número do Protocolo de Status da NF-e. 1 posição (1 – Secretaria de Fazenda Estadual 2 – Receita Federal); 2 - códiga da UF - 2 posições ano; 10 seqüencial no ano. + + + + + Digest Value da NF-e processada. Utilizado para conferir a integridade da NF-e original. + + + + + Código do status da mensagem enviada. + + + + + Descrição literal do status do serviço solicitado. + + + + + + + + + + + + + Tipo retorno Pedido de Cancelamento da Nota Fiscal Eletrônica + + + + + Dados do Resultado do Pedido de Cancelamento da Nota Fiscal Eletrônica + + + + + + Identificação do Ambiente: +1 - Produção +2 - Homologação + + + + + Versão do Aplicativo que processou o pedido de cancelamento + + + + + Código do status da mensagem enviada. + + + + + Descrição literal do status do serviço solicitado. + + + + + código da UF de atendimento + + + + + Chaves de acesso da NF-e, compostas por: UF do emitente, AAMM da emissão da NFe, CNPJ do emitente, modelo, série e número da NF-e e código numérico + DV. + + + + + Data e hora de recebimento, no formato AAAA-MM-DDTHH:MM:SS. Deve ser preenchida com data e hora da gravação no Banco em caso de Confirmação. + + + + + Número do Protocolo de Status da NF-e. 1 posição (1 – Secretaria de Fazenda Estadual 2 – Receita Federal); 2 - código da UF - 2 posições ano; 10 seqüencial no ano. + + + + + + + + + + + + + Tipo Evento + + + + + + + + Código do órgão de recepção do Evento. Utilizar a Tabela do IBGE extendida, utilizar 90 para identificar o Ambiente Nacional + + + + + Identificação do Ambiente: +1 - Produção +2 - Homologação + + + + + Identificação do autor do evento + + + + CNPJ + + + + + CPF + + + + + + Chave de Acesso da NF-e vinculada ao evento + + + + + Data e Hora do Evento, formato UTC (AAAA-MM-DDThh:mm:ssTZD, onde TZD = +hh:mm ou -hh:mm) + + + + + Tipo do Evento + + + + + + + + + + + Seqüencial do evento para o mesmo tipo de evento. Para maioria dos eventos será 1, nos casos em que possa existir mais de um evento, como é o caso da carta de correção, o autor do evento deve numerar de forma seqüencial. + + + + + + + + + + + Versão do Tipo do Evento + + + + + + + + + + Detalhe Específico do Evento + + + + + + + + + + + + Identificador da TAG a ser assinada, a regra de formação do Id é: +“ID” + tpEvento + chave da NF-e + nSeqEvento + + + + + + + + + + + + + + + + Tipo retorno do Evento + + + + + + + + Identificação do Ambiente: +1 - Produção +2 - Homologação + + + + + Versão do Aplicativo que recebeu o Evento + + + + + Código do órgão de recepção do Evento. Utilizar a Tabela do IBGE extendida, utilizar 90 para identificar o Ambiente Nacional + + + + + Código do status da registro do Evento + + + + + Descrição literal do status do registro do Evento + + + + + Chave de Acesso NF-e vinculada + + + + + Tipo do Evento vinculado + + + + + + + + + + + Descrição do Evento + + + + + + + + + + + Seqüencial do evento + + + + + + + + + + + Identificação do destinatpario da NF-e + + + + CNPJ Destinatário + + + + + CPF Destiantário + + + + + + email do destinatário + + + + + + + + + + + Data e Hora de registro do evento formato UTC AAAA-MM-DDTHH:MM:SSTZD + + + + + Número do protocolo de registro do evento + + + + + + + + + + + + + + + + + + + Tipo procEvento + + + + + + + + + + Tipo Versão da NF-e + + + + + + + + Tipo Versão do leiaute de Cancelamento de NF-e - 2.00/1.07 + + + + + + + + Tipo Versão do Evento 1.00 + + + + + + + + Tipo Versão do Evento + + + + + + + + Tipo Versão do Leiaute da Cosulta situação NF-e - 4.00 + + + + + + + diff --git a/pynfe/data/XSDs/NF-e/leiauteNFe_v4.00.xsd b/pynfe/data/XSDs/NF-e/leiauteNFe_v4.00.xsd index 6d7f42fd..8f0ccd22 100644 --- a/pynfe/data/XSDs/NF-e/leiauteNFe_v4.00.xsd +++ b/pynfe/data/XSDs/NF-e/leiauteNFe_v4.00.xsd @@ -1,5 +1,5 @@ - + @@ -14,6 +14,10 @@ + + + + @@ -553,7 +557,8 @@ Preencher com "2B", quando se tratar de Cupom Fiscal emitido por máqu Este campo será obrigatoriamente preenchido com: 1 – Simples Nacional; 2 – Simples Nacional – excesso de sublimite de receita bruta; -3 – Regime Normal. +3 – Regime Normal. +4 - Simples Nacional - Microempreendedor individual - MEI @@ -561,6 +566,7 @@ Este campo será obrigatoriamente preenchido com: + @@ -913,6 +919,36 @@ Formato ”CFOP9999”. + + + Grupo de informações sobre o CréditoPresumido + + + + + + Código de Benefício Fiscal de Crédito Presumido na UF aplicado ao item + + + + + + + + + + + Percentual do Crédito Presumido + + + + + Valor do Crédito Presumido + + + + + Código EX TIPI (3 posições) @@ -1047,7 +1083,7 @@ Formato ”CFOP9999”. - Numero do Documento de Importação DI/DSI/DA/DRI-E (DI/DSI/DA/DRI-E) (NT2011/004) + Número do Documento de Importação (DI, DSI, DIRE, DUImp) (NT2011/004) @@ -1084,7 +1120,7 @@ Formato ”CFOP9999”. - Via de transporte internacional informada na DI + Via de transporte internacional informada na DI ou na Declaração Única de Importação (DUImp): 1-Maritima;2-Fluvial;3-Lacustre;4-Aerea;5-Postal;6-Ferroviaria;7-Rodoviaria;8-Conduto;9-Meios Proprios;10-Entrada/Saida Ficta; 11-Courier;12-Em maos;13-Por reboque. @@ -1126,11 +1162,18 @@ Formato ”CFOP9999”. - - - CNPJ do adquirente ou do encomendante - - + + + + CNPJ do adquirente ou do encomendante + + + + + CPF do adquirente ou do encomendante + + + Sigla da UF do adquirente ou do encomendante @@ -1166,7 +1209,7 @@ Formato ”CFOP9999”. - Número seqüencial do item dentro da Adição + Número seqüencial do item @@ -1188,7 +1231,7 @@ Formato ”CFOP9999”. - Valor do desconto do item da DI – adição + Valor do desconto do item @@ -1293,7 +1336,7 @@ Formato ”CFOP9999”. Número do lote do produto. - + @@ -1803,7 +1846,7 @@ N-NormalVIN Descrição do Produto conforme ANP. Utilizar a descrição de produtos do Sistema de Informações de Movimentação de Produtos - SIMP (http://www.anp.gov.br/simp/). - + @@ -2465,6 +2508,20 @@ ambiente. + + + Indica se o valor do ICMS desonerado (vICMSDeson) deduz do valor do item (vProd): +0=Valor do ICMS desonerado (vICMSDeson) não deduz do valor do item (vProd) / total da NF-e; +1=Valor do ICMS desonerado (vICMSDeson) deduz do valor do item (vProd) / total da NF-e. + + + + + + + + + @@ -2583,6 +2640,20 @@ ambiente. + + + Indica se o valor do ICMS desonerado (vICMSDeson) deduz do valor do item (vProd): +0=Valor do ICMS desonerado (vICMSDeson) não deduz do valor do item (vProd) / total da NF-e; +1=Valor do ICMS desonerado (vICMSDeson) deduz do valor do item (vProd) / total da NF-e. + + + + + + + + + @@ -2661,29 +2732,40 @@ Informar o motivo da desoneração: + + + Indica se o valor do ICMS desonerado (vICMSDeson) deduz do valor do item (vProd): +0=Valor do ICMS desonerado (vICMSDeson) não deduz do valor do item (vProd) / total da NF-e; +1=Valor do ICMS desonerado (vICMSDeson) deduz do valor do item (vProd) / total da NF-e. + + + + + + + + + - Tributção pelo ICMS -51 - Diferimento -A exigência do preenchimento das informações do ICMS diferido fica à critério de cada UF. + Tributção pelo ICMS 51 - Diferimento. A exigência do preenchimento das informações do ICMS diferido fica à critério de cada UF. origem da mercadoria: 0 - Nacional -1 - Estrangeira - Importação direta -2 - Estrangeira - Adquirida no mercado interno + 1 - Estrangeira - Importação direta + 2 - Estrangeira - Adquirida no mercado interno - Tributção pelo ICMS -20 - Com redução de base de cálculo + Tributação pelo ICMS 51 - Tributação com Diferimento @@ -2695,10 +2777,10 @@ A exigência do preenchimento das informações do ICMS diferido fica à critér Modalidade de determinação da BC do ICMS: -0 - Margem Valor Agregado (%); -1 - Pauta (valor); -2 - Preço Tabelado Máximo (valor); -3 - Valor da Operação. + 0 - Margem Valor Agregado (%); + 1 - Pauta (valor); + 2 - Preço Tabelado Máximo (valor); + 3 - Valor da Operação. @@ -2715,6 +2797,17 @@ A exigência do preenchimento das informações do ICMS diferido fica à critér Percentual de redução da BC + + + Código de Benefício Fiscal na UF aplicado ao item quando houver RBC. + + + + + + + + Valor da BC do ICMS @@ -3151,6 +3244,20 @@ A exigência do preenchimento das informações do ICMS diferido fica à critér + + + Indica se o valor do ICMS desonerado (vICMSDeson) deduz do valor do item (vProd): +0=Valor do ICMS desonerado (vICMSDeson) não deduz do valor do item (vProd) / total da NF-e; +1=Valor do ICMS desonerado (vICMSDeson) deduz do valor do item (vProd) / total da NF-e. + + + + + + + + + @@ -3348,6 +3455,20 @@ A exigência do preenchimento das informações do ICMS diferido fica à critér + + + Indica se o valor do ICMS desonerado (vICMSDeson) deduz do valor do item (vProd): +0=Valor do ICMS desonerado (vICMSDeson) não deduz do valor do item (vProd) / total da NF-e; +1=Valor do ICMS desonerado (vICMSDeson) deduz do valor do item (vProd) / total da NF-e. + + + + + + + + + @@ -3660,7 +3781,7 @@ Operação interestadual para consumidor final com partilha do ICMS devido na o - + origem da mercadoria: 0 - Nacional 1 - Estrangeira - Importação direta @@ -3979,11 +4100,11 @@ Operação interestadual para consumidor final com partilha do ICMS devido na o - Tributação do ICMS pelo SIMPLES NACIONAL, CRT=1 – Simples Nacional e CSOSN=900 (v2.0) + Tributação do ICMS pelo SIMPLES NACIONAL, CRT=1 – Simples Nacional, CRT=4 - MEI e CSOSN=900 (v2.0) - + origem da mercadoria: 0 - Nacional 1 - Estrangeira - Importação direta @@ -4238,7 +4359,7 @@ Operação interestadual para consumidor final com partilha do ICMS devido na o Código do serviço prestado dentro do município - + @@ -4266,7 +4387,7 @@ Operação interestadual para consumidor final com partilha do ICMS devido na o Número do Processo administrativo ou judicial de suspenção do processo - + @@ -5678,17 +5799,34 @@ Substituição Tributaria; Valor do Pagamento. Esta tag poderá ser omitida quando a tag tPag=90 (Sem Pagamento), caso contrário deverá ser preenchida. + + + Data do Pagamento + + + + + + CNPJ transacional do pagamento - Preencher informando o CNPJ do estabelecimento onde o pagamento foi processado/transacionado/recebido quando a emissão do documento fiscal ocorrer em estabelecimento distinto + + + + + UF do CNPJ do estabelecimento onde o pagamento foi processado/transacionado/recebido. + + + - Grupo de Cartões + Grupo de Cartões, PIX, Boletos e outros Pagamentos Eletrônicos - Tipo de Integração do processo de pagamento com o sistema de automação da empresa/ - 1=Pagamento integrado com o sistema de automação da empresa Ex. equipamento TEF , Comercio Eletronico - 2=Pagamento não integrado com o sistema de automação da empresa Ex: equipamento POS + Tipo de Integração do processo de pagamento com o sistema de automação da empresa: +1 - Pagamento integrado com o sistema de automação da empresa (Ex.: equipamento TEF, Comércio Eletrônico, POS Integrado); +2 - Pagamento não integrado com o sistema de automação da empresa (Ex.: equipamento POS Simples). @@ -5716,12 +5854,28 @@ Substituição Tributaria; - Número de autorização da operação cartão de crédito/débito + Número de autorização da operação com cartões, PIX, boletos e outros pagamentos eletrônicos - + + + + + + + CNPJ do beneficiário do pagamento + + + + + Identificador do terminal de pagamento + + + + + @@ -5871,7 +6025,8 @@ concessório 1 - Justiça Federal; 2 - Justiça Estadual; 3 - Secex/RFB; -9 - Outros +4 - CONFAZ; +9 - Outros. @@ -5880,6 +6035,7 @@ concessório + @@ -5889,9 +6045,11 @@ concessório Tipo do ato concessório Para origem do Processo na SEFAZ (indProc=0), informar o tipo de ato concessório: -08=Termo de Acordo; -10=Regime Especial; -12=Autorização específica; +08 - Termo de Acordo; +10 - Regime Especial; +12 - Autorização específica; +14 - Ajuste SINIEF; +15 - Convênio ICMS. @@ -5899,6 +6057,8 @@ tipo de ato concessório: + + @@ -6117,7 +6277,7 @@ tipo de ato concessório: Solicitação do pedido de emissão da NFF - + @@ -6126,6 +6286,88 @@ tipo de ato concessório: + + + Produtos Agropecurários Animais, Vegetais e Florestais + + + + + + Defensivo Agrícola / Agrotóxico + + + + + + Número do Receituário ou Receita do Defensivo / Agrotóxico + + + + + + + + + + + CPF do Responsável Técnico pelo receituário + + + + + + + + Guias De Trânsito de produtos agropecurários animais, vegetais e de origem florestal. + + + + + + Tipo da Guia: 1 - GTA; 2 - TTA; 3 - DTA; 4 - ATV; 5 - PTV; 6 - GTV; 7 - Guia Florestal (DOF, SisFlora - PA e MT, SIAM - MG) + + + + + + + + + + + + + + + + + + Série da Guia + + + + + + + + + + + Número da Guia + + + + + + + + + + + + + @@ -6172,7 +6414,7 @@ tipo de ato concessório: Informar a URL da "Consulta por chave de acesso da NFC-e". A mesma URL que deve estar informada no DANFE NFC-e para consulta por chave de acesso. - + diff --git a/pynfe/data/XSDs/NF-e/retDistDFeInt_v1.01.xsd b/pynfe/data/XSDs/NF-e/retDistDFeInt_v1.01.xsd index d5536748..07fde804 100644 --- a/pynfe/data/XSDs/NF-e/retDistDFeInt_v1.01.xsd +++ b/pynfe/data/XSDs/NF-e/retDistDFeInt_v1.01.xsd @@ -1,5 +1,83 @@ -Schema do resultado do pedido de distribuição de DF-e de interesse + + + + + + Schema do resultado do pedido de distribuição de DF-e de interesse + + + + + + Identificação do Ambiente: 1 - Produção 2 - Homologação - Versão do Web Service NFeDistribuicaoDFeCódigo do status de processamento da requisiçãoDescrição literal do status do processamento da requisiçãoData e Hora de processamento da requisição no formato AAAA-MM-DDTHH:MM:SSTZDÚltimo NSU pesquisado no Ambiente Nacional. Se for o caso, o solicitante pode continuar a consulta a partir deste NSU para obter novos resultados.Maior NSU existente no Ambiente Nacional para o CNPJ/CPF informadoConjunto de informações resumidas e documentos fiscais eletrônicos de interesse da pessoa ou empresa. Informação resumida ou documento fiscal eletrônico de interesse da pessoa ou empresa. O conteúdo desta tag estará compactado no padrão gZip. O tipo do campo é base64Binary.NSU do documento fiscalIdentificação do Schema XML que será utilizado para validar o XML existente no conteúdo da tag docZip. Vai identificar o tipo do documento e sua versão. Exemplos: resNFe_v1.00.xsd, procNFe_v3.10.xsd, resEvento_1.00.xsd, procEventoNFe_v1.00.xsd \ No newline at end of file + + + + + + Versão do Web Service NFeDistribuicaoDFe + + + + + Código do status de processamento da requisição + + + + + Descrição literal do status do processamento da requisição + + + + + Data e Hora de processamento da requisição no formato AAAA-MM-DDTHH:MM:SSTZD + + + + + Último NSU pesquisado no Ambiente Nacional. Se for o caso, o solicitante pode continuar a consulta a partir deste NSU para obter novos resultados. + + + + + Maior NSU existente no Ambiente Nacional para o CNPJ/CPF informado + + + + + Conjunto de informações resumidas e documentos fiscais eletrônicos de interesse da pessoa ou empresa. + + + + + + Informação resumida ou documento fiscal eletrônico de interesse da pessoa ou empresa. O conteúdo desta tag estará compactado no padrão gZip. O tipo do campo é base64Binary. + + + + + + + NSU do documento fiscal + + + + + Identificação do Schema XML que será utilizado para validar o XML existente no conteúdo da tag docZip. Vai identificar o tipo do documento e sua versão. Exemplos: resNFe_v1.00.xsd, procNFe_v3.10.xsd, resEvento_1.00.xsd, procEventoNFe_v1.00.xsd + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pynfe/data/XSDs/NF-e/tiposBasico_v1.03.xsd b/pynfe/data/XSDs/NF-e/tiposBasico_v1.03.xsd index f2610341..7098bced 100644 --- a/pynfe/data/XSDs/NF-e/tiposBasico_v1.03.xsd +++ b/pynfe/data/XSDs/NF-e/tiposBasico_v1.03.xsd @@ -777,7 +777,7 @@ acrescentado: - + @@ -861,4 +861,20 @@ acrescentado: + + + Coordenada geográfica Latitude + + + + + + + + Coordenada geográfica Longitude + + + + + diff --git a/pynfe/data/XSDs/NF-e/tiposBasico_v4.00.xsd b/pynfe/data/XSDs/NF-e/tiposBasico_v4.00.xsd index d51b658e..872801e5 100644 --- a/pynfe/data/XSDs/NF-e/tiposBasico_v4.00.xsd +++ b/pynfe/data/XSDs/NF-e/tiposBasico_v4.00.xsd @@ -521,7 +521,7 @@ - + diff --git a/pynfe/data/XSDs/NF-e/tiposDistDFe_v1.01.xsd b/pynfe/data/XSDs/NF-e/tiposDistDFe_v1.01.xsd index e6b8bd78..5c159089 100644 --- a/pynfe/data/XSDs/NF-e/tiposDistDFe_v1.01.xsd +++ b/pynfe/data/XSDs/NF-e/tiposDistDFe_v1.01.xsd @@ -1 +1,217 @@ -Tipo número sequencial únicoTipo quantidade de NSUTipo Versão dos leiautes do Web Service NFeDistribuicaoDFeTipo AmbienteTipo Código da UF da tabela do IBGETipo Código de orgão (UF da tabela do IBGE + 90 RFB)Tipo Número do CNPJTipo Número do CPFTipo Versão do AplicativoTipo Código da Mensagem enviadaTipo Motivo Tipo string genéricoTipo Chave da Nota Fiscal EletrônicaTipo Número do Protocolo de StatusData e Hora, formato UTC (AAAA-MM-DDThh:mm:ssTZD, onde TZD = +hh:mm ou -hh:mm)Tipo Inscrição Estadual do Emitente // alterado EM 24/10/08 para aceitar ISENTOTipo Decimal com 15 dígitos, sendo 13 de corpo e 2 decimais \ No newline at end of file + + + + + Tipo número sequencial único + + + + + + + + Tipo quantidade de NSU + + + + + + + + + Tipo Versão dos leiautes do Web Service NFeDistribuicaoDFe + + + + + + + + + Tipo Ambiente + + + + + + + + + + Tipo Código da UF da tabela do IBGE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Tipo Código de orgão (UF da tabela do IBGE + 90 RFB) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Tipo Número do CNPJ + + + + + + + + + + Tipo Número do CPF + + + + + + + + + + Tipo Versão do Aplicativo + + + + + + + + + Tipo Código da Mensagem enviada + + + + + + + + + + Tipo Motivo + + + + + + + + + Tipo string genérico + + + + + + + + + Tipo Chave da Nota Fiscal Eletrônica + + + + + + + + + + Tipo Número do Protocolo de Status + + + + + + + + + + Data e Hora, formato UTC (AAAA-MM-DDThh:mm:ssTZD, onde TZD = +hh:mm ou -hh:mm) + + + + + + + + + Tipo Inscrição Estadual do Emitente // alterado EM 24/10/08 para aceitar ISENTO + + + + + + + + + + Tipo Decimal com 15 dígitos, sendo 13 de corpo e 2 decimais + + + + + + + \ No newline at end of file From 9676264438b06138cc0ee59ae2c57d68f21063d3 Mon Sep 17 00:00:00 2001 From: Leonardo Gregianin Date: Fri, 24 Jan 2025 11:22:15 -0400 Subject: [PATCH 3/4] =?UTF-8?q?Cria=C3=A7=C3=A3o=20de=20testes=20para=20pi?= =?UTF-8?q?s=20cofins=20da=20nfce?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pynfe/processamento/serializacao.py | 8 +- tests/test_nfce_serializacao_piscofins.py | 294 ++++++++++++++++++++++ 2 files changed, 296 insertions(+), 6 deletions(-) create mode 100644 tests/test_nfce_serializacao_piscofins.py diff --git a/pynfe/processamento/serializacao.py b/pynfe/processamento/serializacao.py index 12164d87..eb43771f 100644 --- a/pynfe/processamento/serializacao.py +++ b/pynfe/processamento/serializacao.py @@ -1123,9 +1123,7 @@ def _serializar_imposto_pis( ((produto_servico.pis_valor_base_calculo == 0) and (produto_servico.pis_aliquota_percentual == 0) and (produto_servico.pis_valor == 0) and - (produto_servico.quantidade_comercial == 0) and - (produto_servico.pis_aliquota_reais == 0) and - (produto_servico.pis_modalidade not in ["04", "05", "06", "07", "08", "09", "49", "99"])): + (produto_servico.pis_modalidade not in ("04", "05", "06", "07", "08", "09", "49", "99"))): return pisnt = ("04", "05", "06", "07", "08", "09") @@ -1198,9 +1196,7 @@ def _serializar_imposto_cofins( ((produto_servico.cofins_valor_base_calculo == 0) and (produto_servico.cofins_aliquota_percentual == 0) and (produto_servico.cofins_valor == 0) and - (produto_servico.quantidade_comercial == 0) and - (produto_servico.cofins_aliquota_reais == 0) and - (produto_servico.cofins_modalidade not in ["04", "05", "06", "07", "08", "09", "49", "99"])): + (produto_servico.cofins_modalidade not in ("04", "05", "06", "07", "08", "09", "49", "99"))): return cofinsnt = ("04", "05", "06", "07", "08", "09") diff --git a/tests/test_nfce_serializacao_piscofins.py b/tests/test_nfce_serializacao_piscofins.py new file mode 100644 index 00000000..5f4632d1 --- /dev/null +++ b/tests/test_nfce_serializacao_piscofins.py @@ -0,0 +1,294 @@ +#!/usr/bin/env python +# *-* encoding: utf8 *-* + +import datetime +import unittest +from decimal import Decimal + +from pynfe.entidades.emitente import Emitente +from pynfe.entidades.fonte_dados import _fonte_dados +from pynfe.entidades.notafiscal import NotaFiscal +from pynfe.processamento.assinatura import AssinaturaA1 +from pynfe.processamento.serializacao import SerializacaoXML +from pynfe.processamento.validacao import Validacao +from pynfe.utils.flags import ( + CODIGO_BRASIL, + NAMESPACE_NFE, + NAMESPACE_SIG, + XSD_FOLDER_NFE, + XSD_NFE, + XSD_NFE_PROCESSADA, +) +# from pynfe.utils import etree + + +class SerializacaoNFeTestCase(unittest.TestCase): + """ + Imprimir o XML completo: + print(etree.tostring(self.xml_assinado)) + + """ + + def setUp(self): + self.certificado = "./tests/certificado.pfx" + self.senha = bytes("123456", "utf-8") + self.uf = "pr" + self.homologacao = True + + self.ns = {"ns": NAMESPACE_NFE} + self.ns_sig = {"ns": NAMESPACE_SIG} + + self.validacao = Validacao() + self.xsd_procNFe = self.validacao.get_xsd( + xsd_file=XSD_NFE_PROCESSADA, xsd_folder=XSD_FOLDER_NFE + ) + self.xsd_nfe = self.validacao.get_xsd( + xsd_file=XSD_NFE, xsd_folder=XSD_FOLDER_NFE + ) + + def preenche_emitente(self): + self.emitente = Emitente( + razao_social="NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL", + nome_fantasia="Nome Fantasia da Empresa", + cnpj="99999999000199", # cnpj apenas números + codigo_de_regime_tributario="3", # 1 para simples nacional ou 3 para normal + inscricao_estadual="9999999999", # numero de IE da empresa + inscricao_municipal="12345", + cnae_fiscal="9999999", # cnae apenas números + endereco_logradouro="Rua da Paz", + endereco_numero="666", + endereco_bairro="Sossego", + endereco_municipio="Paranavaí", + endereco_uf="PR", + endereco_cep="87704000", + endereco_pais=CODIGO_BRASIL, + ) + return self.emitente + + def preenche_notafiscal_produto_com_piscofins(self): + utc = datetime.timezone.utc + data_emissao = datetime.datetime(2021, 1, 14, 12, 0, 0, tzinfo=utc) + data_saida_entrada = datetime.datetime(2021, 1, 14, 13, 10, 20, tzinfo=utc) + + self.notafiscal = NotaFiscal( + emitente=self.emitente, + cliente=None, + uf="PR", + natureza_operacao="VENDA", # venda, compra, transferência, devolução, etc + forma_pagamento=0, # 0=Pagamento à vista; 1=Pagamento a prazo; 2=Outros. + tipo_pagamento=1, + modelo=65, # 55=NF-e; 65=NFC-e + serie="1", + numero_nf="111", # Número do Documento Fiscal. + data_emissao=data_emissao, + data_saida_entrada=data_saida_entrada, + tipo_documento=1, # 0=entrada; 1=saida + municipio="4118402", # Código IBGE do Município + tipo_impressao_danfe=1, # 1=DANFE normal + forma_emissao="1", # 1=Emissão normal (não em contingência); + cliente_final=1, # 0=Normal;1=Consumidor final; + indicador_destino=1, + indicador_presencial=1, + finalidade_emissao="1", # 1=NF-e normal + processo_emissao="0", # 0=Emissão de NF-e com aplicativo do contribuinte; + transporte_modalidade_frete=1, + informacoes_adicionais_interesse_fisco="Mensagem complementar", + totais_tributos_aproximado=Decimal("1.01"), + valor_troco=Decimal('3.00'), + ) + + self.notafiscal.adicionar_produto_servico( + codigo="000328", # id do produto + descricao="Produto teste", + ncm="99999999", + # cest='0100100', # NT2015/003 + ean="1234567890121", + cfop="5102", + unidade_comercial="UN", + quantidade_comercial=Decimal("12"), + valor_unitario_comercial=Decimal("9.67"), + valor_total_bruto=Decimal("116.03999999999999"), + unidade_tributavel="UN", + quantidade_tributavel=Decimal("12"), + valor_unitario_tributavel=Decimal("9.67"), + ean_tributavel="SEM GTIN", + ind_total=1, + icms_modalidade="00", + icms_origem=0, + icms_csosn="", + pis_modalidade="51", + pis_valor_base_calculo=Decimal("116.03999999999999"), + pis_aliquota_percentual=Decimal("0.65"), + pis_valor=Decimal("0.79"), + cofins_modalidade="51", + cofins_valor_base_calculo=Decimal("116.03999999999999"), + cofins_aliquota_percentual=Decimal("3.00"), + cofins_valor=Decimal("3.48"), + valor_tributos_aprox="1.01", + ) + + def preenche_notafiscal_produto_sem_piscofins(self): + utc = datetime.timezone.utc + data_emissao = datetime.datetime(2021, 1, 14, 12, 0, 0, tzinfo=utc) + data_saida_entrada = datetime.datetime(2021, 1, 14, 13, 10, 20, tzinfo=utc) + + self.notafiscal = NotaFiscal( + emitente=self.emitente, + cliente=None, + uf="PR", + natureza_operacao="VENDA", # venda, compra, transferência, devolução, etc + forma_pagamento=0, # 0=Pagamento à vista; 1=Pagamento a prazo; 2=Outros. + tipo_pagamento=1, + modelo=65, # 55=NF-e; 65=NFC-e + serie="1", + numero_nf="111", # Número do Documento Fiscal. + data_emissao=data_emissao, + data_saida_entrada=data_saida_entrada, + tipo_documento=1, # 0=entrada; 1=saida + municipio="4118402", # Código IBGE do Município + tipo_impressao_danfe=1, # 1=DANFE normal + forma_emissao="1", # 1=Emissão normal (não em contingência); + cliente_final=1, # 0=Normal;1=Consumidor final; + indicador_destino=1, + indicador_presencial=1, + finalidade_emissao="1", # 1=NF-e normal + processo_emissao="0", # 0=Emissão de NF-e com aplicativo do contribuinte; + transporte_modalidade_frete=1, + informacoes_adicionais_interesse_fisco="Mensagem complementar", + totais_tributos_aproximado=Decimal("1.01"), + valor_troco=Decimal('3.00'), + ) + + self.notafiscal.adicionar_produto_servico( + codigo="000328", # id do produto + descricao="Produto teste", + ncm="99999999", + # cest='0100100', # NT2015/003 + ean="1234567890121", + cfop="5102", + unidade_comercial="UN", + quantidade_comercial=Decimal("12"), + valor_unitario_comercial=Decimal("9.67"), + valor_total_bruto=Decimal("116.03999999999999"), + unidade_tributavel="UN", + quantidade_tributavel=Decimal("12"), + valor_unitario_tributavel=Decimal("9.67"), + ean_tributavel="SEM GTIN", + ind_total=1, + icms_modalidade="00", + icms_origem=0, + icms_csosn="", + pis_modalidade="51", + cofins_modalidade="51", + valor_tributos_aprox="1.01", + ) + + def serializa_nfe(self): + serializador = SerializacaoXML( + fonte_dados=_fonte_dados, homologacao=self.homologacao, so_cpf=True + ) + return serializador.exportar() + + def assina_xml(self): + a1 = AssinaturaA1(self.certificado, self.senha) + return a1.assinar(self.xml) + + def validacao_com_xsd_do_xml_gerado_sem_processar(self): + self.validacao.validar_etree( + xml_doc=self.xml_assinado, xsd_file=self.xsd_nfe, use_assert=True + ) + + def validacao_pis_cofins_nao_informado(self): + try: + CST_PIS = self.xml_assinado.xpath( + "//ns:det/ns:imposto/ns:PIS/ns:PISOutr/ns:CST", + namespaces=self.ns + )[0].text + except: + CST_PIS = None + self.assertEqual(CST_PIS, None) + + try: + vPIS = self.xml_assinado.xpath( + "//ns:det/ns:imposto/ns:PIS/ns:PISOutr/ns:vPIS", + namespaces=self.ns + )[0].text + except: + vPIS = None + self.assertEqual(vPIS, None) + + # COFINS + try: + CST_COFINS = self.xml_assinado.xpath( + "//ns:det/ns:imposto/ns:COFINS/ns:COFINSOutr/ns:CST", + namespaces=self.ns + )[0].text + except: + CST_COFINS = None + self.assertEqual(CST_COFINS, None) + + try: + vCOFINS = self.xml_assinado.xpath( + "//ns:det/ns:imposto/ns:COFINS/ns:COFINSOutr/ns:vCOFINS", + namespaces=self.ns + )[0].text + except: + vCOFINS = None + self.assertEqual(vCOFINS, None) + + def validacao_pis_cofins_informado(self): + CST_PIS = self.xml_assinado.xpath( + "//ns:det/ns:imposto/ns:PIS/ns:PISOutr/ns:CST", + namespaces=self.ns + )[0].text + self.assertEqual(CST_PIS, "51") + + vPIS = self.xml_assinado.xpath( + "//ns:det/ns:imposto/ns:PIS/ns:PISOutr/ns:vPIS", + namespaces=self.ns + )[0].text + self.assertEqual(vPIS, "0.79") + + # COFINS + CST_COFINS = self.xml_assinado.xpath( + "//ns:det/ns:imposto/ns:COFINS/ns:COFINSOutr/ns:CST", + namespaces=self.ns + )[0].text + self.assertEqual(CST_COFINS, "51") + + vCOFINS = self.xml_assinado.xpath( + "//ns:det/ns:imposto/ns:COFINS/ns:COFINSOutr/ns:vCOFINS", + namespaces=self.ns + )[0].text + self.assertEqual(vCOFINS, "3.48") + + def test_notafiscal_com_pis_cofins_opcional_sem_informar(self): + + # Preenche as classes do pynfe + self.emitente = self.preenche_emitente() + self.notafiscal = self.preenche_notafiscal_produto_sem_piscofins() + + # Serializa e assina o XML + self.xml = self.serializa_nfe() + self.xml_assinado = self.assina_xml() + # print(etree.tostring(self.xml_assinado)) + + # Validação + self.validacao_pis_cofins_nao_informado() + + def test_notafiscal_com_pis_cofins_informado(self): + + # Preenche as classes do pynfe + self.emitente = self.preenche_emitente() + self.notafiscal = self.preenche_notafiscal_produto_com_piscofins() + + # Serializa e assina o XML + self.xml = self.serializa_nfe() + self.xml_assinado = self.assina_xml() + # print(etree.tostring(self.xml_assinado)) + + self.validacao_pis_cofins_informado() + + +if __name__ == "__main__": + unittest.main() From e610e056034d605d9fbad83acbb7117189f48465 Mon Sep 17 00:00:00 2001 From: Leonardo Gregianin Date: Fri, 24 Jan 2025 11:25:03 -0400 Subject: [PATCH 4/4] =?UTF-8?q?Corre=C3=A7=C3=A3o=20do=20lint?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/test_nfce_serializacao_piscofins.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/test_nfce_serializacao_piscofins.py b/tests/test_nfce_serializacao_piscofins.py index 5f4632d1..bdc46b82 100644 --- a/tests/test_nfce_serializacao_piscofins.py +++ b/tests/test_nfce_serializacao_piscofins.py @@ -204,7 +204,7 @@ def validacao_pis_cofins_nao_informado(self): "//ns:det/ns:imposto/ns:PIS/ns:PISOutr/ns:CST", namespaces=self.ns )[0].text - except: + except BaseException: CST_PIS = None self.assertEqual(CST_PIS, None) @@ -213,7 +213,7 @@ def validacao_pis_cofins_nao_informado(self): "//ns:det/ns:imposto/ns:PIS/ns:PISOutr/ns:vPIS", namespaces=self.ns )[0].text - except: + except BaseException: vPIS = None self.assertEqual(vPIS, None) @@ -223,7 +223,7 @@ def validacao_pis_cofins_nao_informado(self): "//ns:det/ns:imposto/ns:COFINS/ns:COFINSOutr/ns:CST", namespaces=self.ns )[0].text - except: + except BaseException: CST_COFINS = None self.assertEqual(CST_COFINS, None) @@ -232,7 +232,7 @@ def validacao_pis_cofins_nao_informado(self): "//ns:det/ns:imposto/ns:COFINS/ns:COFINSOutr/ns:vCOFINS", namespaces=self.ns )[0].text - except: + except BaseException: vCOFINS = None self.assertEqual(vCOFINS, None)