From ed911e033d0ea85844d0a3517b1943b4cf0384ef Mon Sep 17 00:00:00 2001 From: leogregianin Date: Wed, 7 Oct 2020 12:52:50 -0400 Subject: [PATCH 01/13] =?UTF-8?q?Corre=C3=A7=C3=A3o=20na=20serializa=C3=A7?= =?UTF-8?q?=C3=A3o=20do=20vAliqProd=20no=20Pis=20e=20Cofins?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pynfe/processamento/serializacao.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pynfe/processamento/serializacao.py b/pynfe/processamento/serializacao.py index 3c3fd73..affa19c 100644 --- a/pynfe/processamento/serializacao.py +++ b/pynfe/processamento/serializacao.py @@ -381,7 +381,7 @@ class SerializacaoXML(Serializacao): 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 = produto_servico.pis_aliquota_percentual + etree.SubElement(pis_item, 'vAliqProd').text = '{:.4f}'.format(produto_servico.pis_aliquota_percentual or 0) etree.SubElement(pis_item, 'vPIS').text = '{:.2f}'.format(produto_servico.pis_valor_base_calculo or 0) else: pis_item = etree.SubElement(pis, 'PISOutr') @@ -390,7 +390,7 @@ class SerializacaoXML(Serializacao): etree.SubElement(pis_item, 'pPIS').text = '{:.2f}'.format(produto_servico.pis_aliquota_percentual or 0) if produto_servico.pis_modalidade is not '99': etree.SubElement(pis_item, 'qBCProd').text = '{:.4f}'.format(produto_servico.quantidade_comercial) - etree.SubElement(pis_item, 'vAliqProd').text = produto_servico.pis_aliquota_percentual + etree.SubElement(pis_item, 'vAliqProd').text = '{:.4f}'.format(produto_servico.pis_aliquota_percentual or 0) etree.SubElement(pis_item, 'vPIS').text = '{:.2f}'.format(produto_servico.pis_valor_base_calculo or 0) ## PISST @@ -425,7 +425,7 @@ class SerializacaoXML(Serializacao): 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) if produto_servico.cofins_modalidade is not '99': - etree.SubElement(cofins_item, 'vAliqProd').text = '{:.2f}'.format(produto_servico.cofins_aliquota_percentual or 0) + etree.SubElement(cofins_item, 'vAliqProd').text = '{:.4f}'.format(produto_servico.cofins_aliquota_percentual or 0) etree.SubElement(cofins_item, 'vCOFINS').text = '{:.2f}'.format(produto_servico.cofins_valor or 0) ## COFINSST From 51ec40f92e4106ad6c0d39a7d71a11226a89a71b Mon Sep 17 00:00:00 2001 From: leogregianin Date: Wed, 7 Oct 2020 12:57:20 -0400 Subject: [PATCH 02/13] Adiciona .vscode/ no .gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index cf2be46..11179d1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,9 @@ # Pycharm .idea/* +# VsCode +.vscode/* + # Apple OS X .DS_Store From 8ce55069bcfbb36fe5e666eb8712e547d1d0bcaf Mon Sep 17 00:00:00 2001 From: leogregianin Date: Wed, 7 Oct 2020 13:16:43 -0400 Subject: [PATCH 03/13] Adiciona grupo do ICMS com CST 40 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Grupo Tributação do ICMS 40, 41. 50. Página 196 do Manual de Orientação do Contribuinte --- pynfe/processamento/serializacao.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pynfe/processamento/serializacao.py b/pynfe/processamento/serializacao.py index 3c3fd73..ec0bddf 100644 --- a/pynfe/processamento/serializacao.py +++ b/pynfe/processamento/serializacao.py @@ -303,6 +303,10 @@ class SerializacaoXML(Serializacao): icms_item = etree.SubElement(icms, 'ICMSSN'+produto_servico.icms_modalidade) etree.SubElement(icms_item, 'orig').text = str(produto_servico.icms_origem) etree.SubElement(icms_item, 'CSOSN').text = produto_servico.icms_csosn + elif produto_servico.icms_modalidade in ['40', '41', '50']: + icms_item = etree.SubElement(icms, 'ICMS40') + etree.SubElement(icms_item, 'orig').text = str(produto_servico.icms_origem) + etree.SubElement(icms_item, 'CST').text = str(produto_servico.icms_modalidade) elif produto_servico.icms_modalidade == '51': icms_item = etree.SubElement(icms, 'ICMS'+produto_servico.icms_modalidade) etree.SubElement(icms_item, 'orig').text = str(produto_servico.icms_origem) From afc36ce601da0b2e41e4103ae7124708dccd9251 Mon Sep 17 00:00:00 2001 From: Erogue Lord Date: Sat, 17 Oct 2020 10:20:02 -0300 Subject: [PATCH 04/13] =?UTF-8?q?excluir=20pasta=20de=20testes=20da=20inst?= =?UTF-8?q?ala=C3=A7=C3=A3o=20cria=C3=A7=C3=A3o=20do=20arquivo=20MANIFEST.?= =?UTF-8?q?in=20inclus=C3=A3o=20de=20um=20extras=5Frequire=20no=20setup.py?= =?UTF-8?q?=20para=20instala=C3=A7=C3=A3o=20de=20dependencias=20do=20nfse?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MANIFEST.in | 2 ++ requirements-nfse.txt | 2 +- setup.py | 8 +++++++- 3 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 MANIFEST.in diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..4894d86 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,2 @@ +graft tests +include AUTHORS PLANEJAMENTO LICENCE *.py *.sh diff --git a/requirements-nfse.txt b/requirements-nfse.txt index 582da17..15f3243 100644 --- a/requirements-nfse.txt +++ b/requirements-nfse.txt @@ -1,3 +1,3 @@ # Opcional para NFS-e suds-jurko -pyxb=1.2.4 +pyxb==1.2.4 diff --git a/setup.py b/setup.py index 4a8f870..f8a3b9b 100644 --- a/setup.py +++ b/setup.py @@ -7,7 +7,7 @@ setuptools.setup( author='TadaSoftware', author_email='tadasoftware@gmail.com', url='https://github.com/TadaSoftware', - packages=setuptools.find_packages(), + packages=setuptools.find_packages(exclude=['tests', 'tests.*']), package_data={ 'pynfe': ['data/**/*.txt'], }, @@ -17,6 +17,12 @@ setuptools.setup( 'lxml', 'signxml', ], + extras_require={ + 'nfse': [ + 'suds-jurko', + 'pyxb==1.2.4', + ], + }, zip_safe=False, python_requires='>=3.6', ) From f0ca867a6c13f09cf3ad64252cff0f7ad73464bc Mon Sep 17 00:00:00 2001 From: leogregianin Date: Mon, 26 Oct 2020 10:49:43 -0400 Subject: [PATCH 05/13] [feat] Grupo de pessoas autorizadas a baixar XML --- pynfe/entidades/notafiscal.py | 12 ++++++++++++ pynfe/processamento/serializacao.py | 17 +++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/pynfe/entidades/notafiscal.py b/pynfe/entidades/notafiscal.py index 0036160..4c204ed 100644 --- a/pynfe/entidades/notafiscal.py +++ b/pynfe/entidades/notafiscal.py @@ -145,6 +145,9 @@ class NotaFiscal(Entidade): # - Local de entrega diferente do destinatario (Sim/Nao) local_entrega_diferente_destinatario = False + # - Autorizados a baixar XML (lista 1 para * / ManyToManyField) + autorizados_baixar_xml = None + # - Produtos e Servicos (lista 1 para * / ManyToManyField) produtos_e_servicos = None @@ -349,6 +352,7 @@ class NotaFiscal(Entidade): processos_referenciados = None def __init__(self, *args, **kwargs): + self.autorizados_baixar_xml = [] self.notas_fiscais_referenciadas = [] self.produtos_e_servicos = [] self.transporte_volumes = [] @@ -362,6 +366,11 @@ class NotaFiscal(Entidade): def __str__(self): return ' '.join([str(self.modelo), self.serie, self.numero_nf]) + def adicionar_autorizados_baixar_xml(self, **kwargs): + obj = AutorizadosBaixarXML(**kwargs) + self.autorizados_baixar_xml.append(obj) + return obj + def adicionar_nota_fiscal_referenciada(self, **kwargs): u"""Adiciona uma instancia de Nota Fisca referenciada""" obj = NotaFiscalReferenciada(**kwargs) @@ -1026,3 +1035,6 @@ class NotaFiscalResponsavelTecnico(Entidade): email = str() fone = str() csrt = str() + +class AutorizadosBaixarXML(Entidade): + CPFCNPJ = str() diff --git a/pynfe/processamento/serializacao.py b/pynfe/processamento/serializacao.py index 3c3fd73..19b0bce 100644 --- a/pynfe/processamento/serializacao.py +++ b/pynfe/processamento/serializacao.py @@ -214,6 +214,19 @@ class SerializacaoXML(Serializacao): else: return raiz + def _serializar_autorizados_baixar_xml(self, autorizados_baixar_xml, tag_raiz='autXML', retorna_string=True): + raiz = etree.Element(tag_raiz) + + if len(so_numeros(autorizados_baixar_xml.CPFCNPJ)) == 11: + etree.SubElement(raiz, 'CPF').text = so_numeros(autorizados_baixar_xml.CPFCNPJ) + else: + etree.SubElement(raiz, 'CNPJ').text = so_numeros(autorizados_baixar_xml.CPFCNPJ) + + if retorna_string: + return etree.tostring(raiz, encoding="unicode", pretty_print=True) + else: + return raiz + def _serializar_produto_servico(self, produto_servico, modelo, tag_raiz='det', retorna_string=True): raiz = etree.Element(tag_raiz) @@ -555,6 +568,10 @@ class SerializacaoXML(Serializacao): tag_raiz='entrega', )) + # Autorizados a baixar o XML + for num, item in enumerate(nota_fiscal.autorizados_baixar_xml): + raiz.append(self._serializar_autorizados_baixar_xml(item, retorna_string=False)) + # Itens for num, item in enumerate(nota_fiscal.produtos_e_servicos): det = self._serializar_produto_servico(item, modelo=nota_fiscal.modelo, retorna_string=False) From d9bac91547668a50392d161305f6fd02bf66090e Mon Sep 17 00:00:00 2001 From: juniortada Date: Thu, 5 Nov 2020 20:02:33 -0300 Subject: [PATCH 06/13] [fix] update url consulta cadastro mg --- pynfe/utils/webservices.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pynfe/utils/webservices.py b/pynfe/utils/webservices.py index 37d350c..aa2ce29 100644 --- a/pynfe/utils/webservices.py +++ b/pynfe/utils/webservices.py @@ -355,7 +355,7 @@ NFE = { 'CHAVE': 'nfe.fazenda.mg.gov.br/nfe2/services/NFeConsultaProtocolo4', 'INUTILIZACAO': 'nfe.fazenda.mg.gov.br/nfe2/services/NFeInutilizacao4', 'EVENTOS': 'nfe.fazenda.mg.gov.br/nfe2/services/NFeRecepcaoEvento4', - 'CADASTRO': 'nfe.fazenda.mg.gov.br/nfe2/services/cadconsultacadastro2', + 'CADASTRO': 'nfe.fazenda.mg.gov.br/nfe2/services/CadConsultaCadastro4', 'HTTPS': 'https://', 'HOMOLOGACAO': 'https://h' }, From 02ca977a1dcad087f5d408b916bdd9ab3ae2efbe Mon Sep 17 00:00:00 2001 From: Sergio Oliveira Date: Sun, 6 Dec 2020 08:33:31 -0300 Subject: [PATCH 07/13] =?UTF-8?q?Melhoria=20no=20tratamento=20de=20excess?= =?UTF-8?q?=C3=B5es=20na=20abertura=20do=20arquivo=20do=20certificado?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Essa mudança também evita que o arquivo permaneça aberto após a leitura de seu conteúdo. --- pynfe/entidades/certificado.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/pynfe/entidades/certificado.py b/pynfe/entidades/certificado.py index f2a560c..dc430b4 100644 --- a/pynfe/entidades/certificado.py +++ b/pynfe/entidades/certificado.py @@ -35,11 +35,21 @@ class CertificadoA1(Certificado): e retorna a string. Se caminho for True grava na pasta temporaria e retorna o caminho dos arquivos, senao retorna o objeto. Apos o uso devem ser excluidos com o metodo excluir.""" + try: + with open(self.caminho_arquivo, "rb") as cert_arquivo: + cert_conteudo = cert_arquivo.read() + except (PermissionError, FileNotFoundError) as exc: + raise Exception('Falha ao abrir arquivo do certificado digital A1. Verifique local e permissoes do arquivo.') from exc + except Exception as exc: + raise Exception('Falha ao abrir arquivo do certificado digital A1. Causa desconhecida.') from exc + # Carrega o arquivo .pfx, erro pode ocorrer se a senha estiver errada ou formato invalido. try: - pkcs12 = crypto.load_pkcs12(open(self.caminho_arquivo, "rb").read(), senha) - except Exception as e: - raise Exception('Falha ao carregar certificado digital A1. Verifique local e senha.') + pkcs12 = crypto.load_pkcs12(cert_conteudo, senha) + except crypto.Error as exc: + raise Exception('Falha ao carregar certificado digital A1. Verifique a senha do certificado.') from exc + except Exception as exc: + raise Exception('Falha ao carregar certificado digital A1. Causa desconhecida.') from exc if caminho: cert = crypto.dump_certificate(crypto.FILETYPE_PEM, pkcs12.get_certificate()) From c036af426b5a102876035ba59f575db752aab74c Mon Sep 17 00:00:00 2001 From: leogregianin Date: Wed, 24 Feb 2021 21:24:01 -0400 Subject: [PATCH 08/13] =?UTF-8?q?Altera=C3=A7=C3=A3o=20para=2010=20casas?= =?UTF-8?q?=20decimais=20vUnCom=20e=20vUnTrib?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pynfe/processamento/serializacao.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pynfe/processamento/serializacao.py b/pynfe/processamento/serializacao.py index 2afb8d9..4a4a280 100644 --- a/pynfe/processamento/serializacao.py +++ b/pynfe/processamento/serializacao.py @@ -245,7 +245,7 @@ class SerializacaoXML(Serializacao): etree.SubElement(prod, 'CFOP').text = produto_servico.cfop etree.SubElement(prod, 'uCom').text = produto_servico.unidade_comercial etree.SubElement(prod, 'qCom').text = str(produto_servico.quantidade_comercial or 0) - etree.SubElement(prod, 'vUnCom').text = str('{:.4f}').format(produto_servico.valor_unitario_comercial or 0) + etree.SubElement(prod, 'vUnCom').text = str('{:.10f}').format(produto_servico.valor_unitario_comercial or 0) """ Código Especificador da Substituição Tributária – CEST, que estabelece a sistemática de uniformização e identificação das mercadorias e bens passíveis de sujeição aos regimes de substituição tributária e de antecipação de recolhimento do ICMS. """ #if produto_servico.cest: @@ -254,7 +254,7 @@ class SerializacaoXML(Serializacao): etree.SubElement(prod, 'cEANTrib').text = produto_servico.ean_tributavel etree.SubElement(prod, 'uTrib').text = produto_servico.unidade_tributavel etree.SubElement(prod, 'qTrib').text = str(produto_servico.quantidade_tributavel) - etree.SubElement(prod, 'vUnTrib').text = '{:.4f}'.format(produto_servico.valor_unitario_tributavel or 0) + etree.SubElement(prod, 'vUnTrib').text = '{:.10f}'.format(produto_servico.valor_unitario_tributavel or 0) # frete if produto_servico.total_frete: From 016a8dfbf23d60020a99dcbf5bba3a234818c06e Mon Sep 17 00:00:00 2001 From: leogregianin Date: Wed, 24 Feb 2021 21:49:37 -0400 Subject: [PATCH 09/13] =?UTF-8?q?Cria=C3=A7=C3=A3o=20do=20grupo=20de=20com?= =?UTF-8?q?bust=C3=ADvel=20dentro=20do=20produto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pynfe/entidades/notafiscal.py | 22 ++++++++++++++++++++++ pynfe/processamento/serializacao.py | 11 +++++++++++ 2 files changed, 33 insertions(+) diff --git a/pynfe/entidades/notafiscal.py b/pynfe/entidades/notafiscal.py index 4c204ed..4edd2e2 100644 --- a/pynfe/entidades/notafiscal.py +++ b/pynfe/entidades/notafiscal.py @@ -598,6 +598,28 @@ class NotaFiscalProduto(Entidade): # - Produto especifico (seleciona de lista) - NF_PRODUTOS_ESPECIFICOS produto_especifico = str() + # Grupo de informações de Combustível + # Código de produto da ANP + cProdANP = str() + + # Descrição do produto conforme ANP + descANP = str() + + # Percentual de Gás derivado do Petróleo + pGLP = Decimal() + + # Percentual de gás natural nacional + pGNn = Decimal() + + # Percentual do gás natural importado + pGNi = Decimal() + + # Valor de Partida (apenas para GLP) + vPart = Decimal() + + # Sigla da UF de consumo – (OBS: Deve ser a Sigla e não o Código da UF) + UFCons = str() + # - Tributos # - ICMS # - Situacao tributaria (obrigatorio - seleciona de lista) - ICMS_TIPOS_TRIBUTACAO diff --git a/pynfe/processamento/serializacao.py b/pynfe/processamento/serializacao.py index 2afb8d9..3a16c7b 100644 --- a/pynfe/processamento/serializacao.py +++ b/pynfe/processamento/serializacao.py @@ -283,6 +283,17 @@ class SerializacaoXML(Serializacao): if produto_servico.numero_item: etree.SubElement(prod, 'nItemPed').text = str(produto_servico.numero_item) + # Combustível + if produto_servico.cProdANP: + combustivel = etree.SubElement(prod, 'comb') + etree.SubElement(combustivel, 'cProdANP').text = str(produto_servico.cProdANP) + etree.SubElement(combustivel, 'descANP').text = str(produto_servico.descANP) + etree.SubElement(combustivel, 'pGLP').text = '{:.4f}'.format(produto_servico.pGLP or 0) + etree.SubElement(combustivel, 'pGNn').text = '{:.4f}'.format(produto_servico.pGNn or 0) + etree.SubElement(combustivel, 'pGNi').text = '{:.4f}'.format(produto_servico.pGNi or 0) + etree.SubElement(combustivel, 'vPart').text = '{:.2f}'.format(produto_servico.vPart or 0) + etree.SubElement(combustivel, 'UFCons').text = str(produto_servico.UFCons) + # Imposto imposto = etree.SubElement(raiz, 'imposto') From a66c1a0d55c12f9edc54a841252690d20d18fbd8 Mon Sep 17 00:00:00 2001 From: leogregianin Date: Wed, 24 Feb 2021 22:01:23 -0400 Subject: [PATCH 10/13] Adiciona grupo do ICMS com CST 30, 70 e 90 --- pynfe/processamento/serializacao.py | 44 +++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/pynfe/processamento/serializacao.py b/pynfe/processamento/serializacao.py index 2afb8d9..3bcd4a4 100644 --- a/pynfe/processamento/serializacao.py +++ b/pynfe/processamento/serializacao.py @@ -359,6 +359,50 @@ class SerializacaoXML(Serializacao): etree.SubElement(icms_item, 'vBCFCP').text = '{:.2f}'.format(produto_servico.fcp_base_calculo or 0) # Base de calculo FCP etree.SubElement(icms_item, 'pFCP').text = '{:.2f}'.format(produto_servico.fcp_percentual or 0) # Percentual FCP etree.SubElement(icms_item, 'vFCP').text = '{:.2f}'.format(produto_servico.fcp_valor or 0) # Valor Fundo Combate a Pobreza + # 30=Isenta / não tributada e com cobrança do ICMS por substituição tributária + elif produto_servico.icms_modalidade == '30': + etree.SubElement(icms_item, 'modBCST').text = str(produto_servico.icms_st_modalidade_determinacao_bc) + etree.SubElement(icms_item, 'pMVAST').text = '{:.2f}'.format(produto_servico.icms_st_percentual_adicional or 0) # Percentual da margem de valor Adicionado do ICMS ST + etree.SubElement(icms_item, 'pRedBCST').text = '{:.2f}'.format(produto_servico.icms_st_percentual_reducao_bc or 0) # APercentual da Redução de BC do ICMS ST + etree.SubElement(icms_item, 'vBCST').text = '{:.2f}'.format(produto_servico.icms_st_valor_base_calculo or 0) + etree.SubElement(icms_item, 'pICMSST').text = '{:.2f}'.format(produto_servico.icms_st_aliquota or 0) + etree.SubElement(icms_item, 'vICMSST').text = '{:.2f}'.format(produto_servico.icms_st_valor or 0) + if produto_servico.icms_desonerado > 0: + etree.SubElement(icms_item, 'vICMSDeson').text = '{:.2f}'.format(produto_servico.icms_desonerado or 0) # Valor do ICMS Desonerado + etree.SubElement(icms_item, 'motDesICMS').text = str(produto_servico.icms_motivo_desoneracao) + # 70=Com redução da BC e cobrança do ICMS por substituição tributária + elif produto_servico.icms_modalidade == '70': + etree.SubElement(icms_item, 'modBC').text = str(produto_servico.icms_modalidade_determinacao_bc) + etree.SubElement(icms_item, 'pRedBC').text = '{:.2f}'.format(produto_servico.icms_percentual_reducao_bc or 0) # Percentual da Redução de BC + etree.SubElement(icms_item, 'vBC').text = '{:.2f}'.format(produto_servico.icms_valor_base_calculo or 0) # Valor da BC do ICMS + etree.SubElement(icms_item, 'pICMS').text = '{:.2f}'.format(produto_servico.icms_aliquota or 0) # Alíquota do imposto + etree.SubElement(icms_item, 'vICMS').text = '{:.2f}'.format(produto_servico.icms_valor or 0) # Valor do ICMS + + etree.SubElement(icms_item, 'modBCST').text = str(produto_servico.icms_st_modalidade_determinacao_bc) + etree.SubElement(icms_item, 'pMVAST').text = '{:.2f}'.format(produto_servico.icms_st_percentual_adicional or 0) # Percentual da margem de valor Adicionado do ICMS ST + etree.SubElement(icms_item, 'pRedBCST').text = '{:.2f}'.format(produto_servico.icms_st_percentual_reducao_bc or 0) # APercentual da Redução de BC do ICMS ST + etree.SubElement(icms_item, 'vBCST').text = '{:.2f}'.format(produto_servico.icms_st_valor_base_calculo or 0) + etree.SubElement(icms_item, 'pICMSST').text = '{:.2f}'.format(produto_servico.icms_st_aliquota or 0) + etree.SubElement(icms_item, 'vICMSST').text = '{:.2f}'.format(produto_servico.icms_st_valor or 0) + + if produto_servico.icms_desonerado > 0: + etree.SubElement(icms_item, 'vICMSDeson').text = '{:.2f}'.format(produto_servico.icms_desonerado or 0) # Valor do ICMS Desonerado + etree.SubElement(icms_item, 'motDesICMS').text = str(produto_servico.icms_motivo_desoneracao) + # 90=Outras + elif produto_servico.icms_modalidade == '90': + etree.SubElement(icms_item, 'vBC').text = '{:.2f}'.format(produto_servico.icms_valor_base_calculo or 0) # Valor da BC do ICMS + etree.SubElement(icms_item, 'pRedBC').text = '{:.2f}'.format(produto_servico.icms_percentual_reducao_bc or 0) # Percentual da Redução de BC + etree.SubElement(icms_item, 'pICMS').text = '{:.2f}'.format(produto_servico.icms_aliquota or 0) # Alíquota do imposto + etree.SubElement(icms_item, 'vICMS').text = '{:.2f}'.format(produto_servico.icms_valor or 0) # Valor do ICMS + + if (produto_servico.icms_st_valor_base_calculo > 0) and (produto_servico.icms_st_valor > 0): + etree.SubElement(icms_item, 'modBCST').text = str(produto_servico.icms_st_modalidade_determinacao_bc) + etree.SubElement(icms_item, 'pMVAST').text = '{:.2f}'.format(produto_servico.icms_st_percentual_adicional or 0) # Percentual da margem de valor Adicionado do ICMS ST + etree.SubElement(icms_item, 'pRedBCST').text = '{:.2f}'.format(produto_servico.icms_st_percentual_reducao_bc or 0) # APercentual da Redução de BC do ICMS ST + etree.SubElement(icms_item, 'vBCST').text = '{:.2f}'.format(produto_servico.icms_st_valor_base_calculo or 0) + etree.SubElement(icms_item, 'pICMSST').text = '{:.2f}'.format(produto_servico.icms_st_aliquota or 0) + etree.SubElement(icms_item, 'vICMSST').text = '{:.2f}'.format(produto_servico.icms_st_valor or 0) + # Impostos não implementados else: raise NotImplementedError From 47b773a511864cd6d0eed1a649195d3defb2f0f2 Mon Sep 17 00:00:00 2001 From: leogregianin Date: Mon, 29 Mar 2021 09:47:27 -0400 Subject: [PATCH 11/13] =?UTF-8?q?Atualiza=C3=A7=C3=A3o=20das=20URLS=20do?= =?UTF-8?q?=20Mato=20Grosso=20do=20Sul?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pynfe/utils/webservices.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/pynfe/utils/webservices.py b/pynfe/utils/webservices.py index aa2ce29..538534f 100644 --- a/pynfe/utils/webservices.py +++ b/pynfe/utils/webservices.py @@ -245,13 +245,16 @@ NFCE = { 'HOMOLOGACAO': 'https://nfce-homologacao.' }, 'MS': { - 'STATUS': '', - 'AUTORIZACAO': '', - 'RECIBO': '', - 'CHAVE': '', - 'INUTILIZACAO': '', - 'EVENTOS': '', - 'QR': '' + 'STATUS': 'sefaz.ms.gov.br/ws/NFeStatusServico4?wsdl', + 'AUTORIZACAO': 'sefaz.ms.gov.br/ws/NFeAutorizacao4?wsdl', + 'RECIBO': 'sefaz.ms.gov.br/ws/NFeRetAutorizacao4?wsdl', + 'CHAVE': 'sefaz.ms.gov.br/ws/NFeConsultaProtocolo4?wsdl', + 'INUTILIZACAO': 'sefaz.ms.gov.br/ws/NFeInutilizacao4?wsdl', + 'EVENTOS': 'sefaz.ms.gov.br/ws/NFeRetAutorizacao4', + 'QR': 'http://www.dfe.ms.gov.br/nfce/qrcode', + 'URL': 'http://www.dfe.ms.gov.br/nfce/consulta', + 'HTTPS': 'https://nfce.', + 'HOMOLOGACAO': 'https://hom.nfce.' }, 'MT': { 'QR': 'sefaz.mt.gov.br/nfce/consultanfce?', From 4d58607115ccfac263f25523c257062b27886b1e Mon Sep 17 00:00:00 2001 From: leogregianin Date: Mon, 29 Mar 2021 09:57:25 -0400 Subject: [PATCH 12/13] =?UTF-8?q?Atualiza=C3=A7=C3=A3o=20das=20URLS=20da?= =?UTF-8?q?=20NFCe=20de=20Santa=20Catarina?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pynfe/utils/webservices.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pynfe/utils/webservices.py b/pynfe/utils/webservices.py index aa2ce29..b07642d 100644 --- a/pynfe/utils/webservices.py +++ b/pynfe/utils/webservices.py @@ -230,7 +230,10 @@ NFCE = { 'CHAVE': '', 'INUTILIZACAO': '', 'EVENTOS': '', - 'QR': '' + 'QR': 'sat.sef.sc.gov.br/nfce/consulta?p=', + 'HTTPS': 'https://', + 'HOMOLOGACAO': 'https://hom.', + 'URL': 'sat.sef.sc.gov.br/nfce/consulta' }, 'RS': { 'STATUS': 'sefazrs.rs.gov.br/ws/NfeStatusServico/NfeStatusServico4.asmx', From 8e395fab91d83003f3e29d8f928e71a4d6969600 Mon Sep 17 00:00:00 2001 From: Miguel Vellasco Date: Mon, 29 Mar 2021 11:59:01 -0300 Subject: [PATCH 13/13] Atualiza URL de NFCe do Rio de Janeiro --- pynfe/utils/webservices.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pynfe/utils/webservices.py b/pynfe/utils/webservices.py index 2aaeefa..f1d85fb 100644 --- a/pynfe/utils/webservices.py +++ b/pynfe/utils/webservices.py @@ -189,7 +189,7 @@ NFCE = { 'INUTILIZACAO': '', 'EVENTOS': '', 'QR': 'http://www4.fazenda.rj.gov.br/consultaNFCe/QRCode?', - 'URL': 'www.nfce.fazenda.rj.gov.br/consulta' + 'URL': 'www.fazenda.rj.gov.br/nfce/consulta' }, # Os Web Services de homologação da NFC-e 4.00 são: # https://homologacao.nfce.fazenda.sp.gov.br/ws/NFeAutorizacao4.asmx