Membros Pro MiguelBento Postado 12 Fevereiro Membros Pro Postado 12 Fevereiro Alguma previsão para LIB? estamos com faturamento parado (nosso e dos clientes que usam tb)
Francis Silva Postado 12 Fevereiro Postado 12 Fevereiro 1 hora atrás, Alexandre Felippeto Henzen disse: Pessoal, fiquei com uma duvida, voces sempre estão passando os valores zerados, ou apenas quando os totais dos tributos realmente resultam em 0. Pelo que entendi nos meus testes, o calculo desses campos ainda não está sendo validado, pode ser passado qualquer valor. Então estão realmente realizando a soma: vTotTribFed = Total INSS + IR + CSLL + PIS + COFINS vTotTribMun = Total ISS Eu até mencionei em comentários anteriores sobre a minha preocupação de qual é o calculo correto para essas tags, pois hoje a sefaz nao valida o valor passado. Mas voces estão sempre passando o valor 0? Ou somente quando nao tem valores dos impostos mesmo? Eu sempre passo a soma dos tributos, mas no nosso caso, quase sempre são zerados, só temos retenção de impostos quando o serviço é prestado para um órgão público ou de classe. Citar Eu informo exatamente como você está fazendo: vTotTribFed = Total INSS + IR + CSLL + PIS + COFINS vTotTribMun = Total ISS 1
geovanesilveira Postado 12 Fevereiro Postado 12 Fevereiro (editado) Estou tentando fazer uns testes conforme o novo layout (https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/rtc) e ao tentar enviar a nota (tentei nos 2 ambientes) estou recebendo o seguinte erro: X800 '3' violates enumeration constraint of '1 2'. The element '{http://www.sped.fazenda.gov.br/nfse}tpRetPisCofins' with value '3' failed to parse. no meu caso, estou tentando enviar a tag como todos retidos, que seria a numeração 3, segundo essa lista (encontrada no excel do link acima) Tipo de retenção PIS/COFINS e CSLL: 0 - PIS/COFINS/CSLL Não Retidos; 1* - PIS/COFINS Retido; 2* - PIS/COFINS Não Retido; 3 - PIS/COFINS/CSLL Retidos; 4 - PIS/COFINS Retidos, CSLL Não Retido; 5 - PIS Retido, COFINS/CSLL Não Retido; 6 - COFINS Retido, PIS/CSLL Não Retido; 7 - PIS Não Retido, COFINS/CSLL Retidos; 8 - PIS/COFINS Não Retidos, CSLL Retido; 9 - COFINS Não Retido, PIS/CSLL Retidos; * Os valores 1 e 2 só serão aceitos até os grupos "IBSCBS" se tornarem obrigatórios para a autorização/recepção da NFS-e. Mais esclarecimentos podem ser encontrados na Nota Técnica SE/CGNFS-e nº 007, de 07 de fevereiro de 2026, disponível no portal da NFS-e. na minha aplicacao modifiquei da seguinte forma: if (ValorRetPis.AsFloat > 0) then begin LNFSe.Servico.Valores.tribFed.pAliqPis := AliqRetPis.AsFloat; LNFSe.Servico.Valores.tribFed.vPis := ValorRetPis.AsFloat; end else begin LNFSe.Servico.Valores.tribFed.pAliqPis := AliqPis.AsFloat; LNFSe.Servico.Valores.tribFed.vPis := ValorPis.AsFloat; end; if (ValorRetCofins.AsFloat > 0) then begin LNFSe.Servico.Valores.tribFed.pAliqCofins := AliqRetCofins.AsFloat; LNFSe.Servico.Valores.tribFed.vCofins := ValorRetCofins.AsFloat; end else begin LNFSe.Servico.Valores.tribFed.pAliqCofins := AliqCofins.AsFloat; LNFSe.Servico.Valores.tribFed.vCofins := ValorCofins.AsFloat; end; if (ValorRetCsll.AsFloat > 0) then LNFSe.Servico.Valores.tribFed.vRetCSLL := ValorRetCsll.AsFloat else LNFSe.Servico.Valores.tribFed.vRetCSLL := ValorCsll.AsFloat; if (ValorRetPis.AsFloat > 0) and (ValorRetCofins.AsFloat > 0) and (ValorRetCsll.AsFloat > 0) then LNFSe.Servico.Valores.tribFed.tpRetPisCofins := trpcTodosRetidos else if (ValorRetPis.AsFloat > 0) and (ValorRetCofins.AsFloat > 0) and (ValorRetCsll.AsFloat <= 0) then LNFSe.Servico.Valores.tribFed.tpRetPisCofins := trpcPisCofinsRetCsllNaoRet else if (ValorRetPis.AsFloat > 0) and (ValorRetCofins.AsFloat <= 0) and (ValorRetCsll.AsFloat <= 0) then LNFSe.Servico.Valores.tribFed.tpRetPisCofins := trpcPisRetCofinsCsllNaoRet else if (ValorRetPis.AsFloat <= 0) and (ValorRetCofins.AsFloat > 0) and (ValorRetCsll.AsFloat <= 0) then LNFSe.Servico.Valores.tribFed.tpRetPisCofins := trpcCofinsRetPisCsllNaoRet else if (ValorRetPis.AsFloat <= 0) and (ValorRetCofins.AsFloat > 0) and (ValorRetCsll.AsFloat > 0) then LNFSe.Servico.Valores.tribFed.tpRetPisCofins := trpcCofinsCsllRetPisNaoRet else if (ValorRetPis.AsFloat <= 0) and (ValorRetCofins.AsFloat <= 0) and (ValorRetCsll.AsFloat > 0) then LNFSe.Servico.Valores.tribFed.tpRetPisCofins := trpcCsllRetPisCofinsNaoRet else if (ValorRetPis.AsFloat > 0) and (ValorRetCofins.AsFloat <= 0) and (ValorRetCsll.AsFloat > 0) then LNFSe.Servico.Valores.tribFed.tpRetPisCofins := trpcPisCsllRetCofinsNaoRet else LNFSe.Servico.Valores.tribFed.tpRetPisCofins := trpcTodosNaoRetidos; ACBrNFSeXClass.pas ACBrNFSeXConversao.pas PadraoNacional.LerXml.pas Conam.GravarXml.pas Editado 12 Fevereiro por geovanesilveira
geovanesilveira Postado 12 Fevereiro Postado 12 Fevereiro 3 horas atrás, geovanesilveira disse: Estou tentando fazer uns testes conforme o novo layout (https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/rtc) e ao tentar enviar a nota (tentei nos 2 ambientes) estou recebendo o seguinte erro: X800 '3' violates enumeration constraint of '1 2'. The element '{http://www.sped.fazenda.gov.br/nfse}tpRetPisCofins' with value '3' failed to parse. no meu caso, estou tentando enviar a tag como todos retidos, que seria a numeração 3, segundo essa lista (encontrada no excel do link acima) Tipo de retenção PIS/COFINS e CSLL: 0 - PIS/COFINS/CSLL Não Retidos; 1* - PIS/COFINS Retido; 2* - PIS/COFINS Não Retido; 3 - PIS/COFINS/CSLL Retidos; 4 - PIS/COFINS Retidos, CSLL Não Retido; 5 - PIS Retido, COFINS/CSLL Não Retido; 6 - COFINS Retido, PIS/CSLL Não Retido; 7 - PIS Não Retido, COFINS/CSLL Retidos; 8 - PIS/COFINS Não Retidos, CSLL Retido; 9 - COFINS Não Retido, PIS/CSLL Retidos; * Os valores 1 e 2 só serão aceitos até os grupos "IBSCBS" se tornarem obrigatórios para a autorização/recepção da NFS-e. Mais esclarecimentos podem ser encontrados na Nota Técnica SE/CGNFS-e nº 007, de 07 de fevereiro de 2026, disponível no portal da NFS-e. na minha aplicacao modifiquei da seguinte forma: if (ValorRetPis.AsFloat > 0) then begin LNFSe.Servico.Valores.tribFed.pAliqPis := AliqRetPis.AsFloat; LNFSe.Servico.Valores.tribFed.vPis := ValorRetPis.AsFloat; end else begin LNFSe.Servico.Valores.tribFed.pAliqPis := AliqPis.AsFloat; LNFSe.Servico.Valores.tribFed.vPis := ValorPis.AsFloat; end; if (ValorRetCofins.AsFloat > 0) then begin LNFSe.Servico.Valores.tribFed.pAliqCofins := AliqRetCofins.AsFloat; LNFSe.Servico.Valores.tribFed.vCofins := ValorRetCofins.AsFloat; end else begin LNFSe.Servico.Valores.tribFed.pAliqCofins := AliqCofins.AsFloat; LNFSe.Servico.Valores.tribFed.vCofins := ValorCofins.AsFloat; end; if (ValorRetCsll.AsFloat > 0) then LNFSe.Servico.Valores.tribFed.vRetCSLL := ValorRetCsll.AsFloat else LNFSe.Servico.Valores.tribFed.vRetCSLL := ValorCsll.AsFloat; if (ValorRetPis.AsFloat > 0) and (ValorRetCofins.AsFloat > 0) and (ValorRetCsll.AsFloat > 0) then LNFSe.Servico.Valores.tribFed.tpRetPisCofins := trpcTodosRetidos else if (ValorRetPis.AsFloat > 0) and (ValorRetCofins.AsFloat > 0) and (ValorRetCsll.AsFloat <= 0) then LNFSe.Servico.Valores.tribFed.tpRetPisCofins := trpcPisCofinsRetCsllNaoRet else if (ValorRetPis.AsFloat > 0) and (ValorRetCofins.AsFloat <= 0) and (ValorRetCsll.AsFloat <= 0) then LNFSe.Servico.Valores.tribFed.tpRetPisCofins := trpcPisRetCofinsCsllNaoRet else if (ValorRetPis.AsFloat <= 0) and (ValorRetCofins.AsFloat > 0) and (ValorRetCsll.AsFloat <= 0) then LNFSe.Servico.Valores.tribFed.tpRetPisCofins := trpcCofinsRetPisCsllNaoRet else if (ValorRetPis.AsFloat <= 0) and (ValorRetCofins.AsFloat > 0) and (ValorRetCsll.AsFloat > 0) then LNFSe.Servico.Valores.tribFed.tpRetPisCofins := trpcCofinsCsllRetPisNaoRet else if (ValorRetPis.AsFloat <= 0) and (ValorRetCofins.AsFloat <= 0) and (ValorRetCsll.AsFloat > 0) then LNFSe.Servico.Valores.tribFed.tpRetPisCofins := trpcCsllRetPisCofinsNaoRet else if (ValorRetPis.AsFloat > 0) and (ValorRetCofins.AsFloat <= 0) and (ValorRetCsll.AsFloat > 0) then LNFSe.Servico.Valores.tribFed.tpRetPisCofins := trpcPisCsllRetCofinsNaoRet else LNFSe.Servico.Valores.tribFed.tpRetPisCofins := trpcTodosNaoRetidos; ACBrNFSeXClass.pas 115.66 kB · 0 downloads ACBrNFSeXConversao.pas 680.95 kB · 0 downloads PadraoNacional.LerXml.pas 83.68 kB · 0 downloads Conam.GravarXml.pas 29.4 kB · 0 downloads Ignorando essas alterações, eu modifiquei o meu programa da seguinte forma: LNFSe.Servico.Valores.tribFed.pAliqPis := AliqPis.AsFloat; LNFSe.Servico.Valores.tribFed.vPis := ValorPis.AsFloat; LNFSe.Servico.Valores.tribFed.pAliqCofins := AliqCofins.AsFloat; LNFSe.Servico.Valores.tribFed.vCofins := ValorCofins.AsFloat; LNFSe.Servico.Valores.tribFed.vRetCSLL := ValorRetCsll.AsFloat + ValorRetPis.AsFloat + ValorRetCofins.AsFloat; if (LNFSe.Servico.Valores.tribFed.vRetCSLL > 0) then LNFSe.Servico.Valores.tribFed.tpRetPisCofins := trpcRetido else LNFSe.Servico.Valores.tribFed.tpRetPisCofins := trpcNaoRetido; essa modificação partiu da nota tecnica do novo layout, que diz: Citar “vPis” e “vCofins”. Esses campos dizem respeito aos valores desses tributos devidos na operação, ou seja, valores de débitos de apuração própria. De maneira equivocada, muitos contribuintes utilizavam esses campos para que fossem informados os valores RETIDOS desses tributos. Citar Se houver valores de retenções de PIS, de COFINS e/ou de CSLL, eles deverão ser SOMADOS e informados no campo “vRetCSLL” de acordo com o que foi informado no campo “tpRetPisCofins”. confesso que essa segunda parte que diz "de acordo com o ... "tpRetPisCofins"" não ficou bem claro, pois no teste anterior me retornavam que so aceitavam o valor 1 ou 2 caso eu tentasse usar outra indicação. isso é dito na nota: Citar atualmente no schema só são permitidos os tipos 1 e 2, os quais foram mantidos nessa versão não entendi bem o motivo de ja colocar esses códigos ali sendo que nem serão usados ainda
Membros Pro MiguelBento Postado 13 Fevereiro Membros Pro Postado 13 Fevereiro Fiz o download da LIB ACBrLibNFSe 2.1.0.254 e ainda sim não contempla a NT de sabado. Vamos para uma semana sem conseguir faturar pela biblioteca. Preciso de um retorno URGENTE
Consultores Italo Giurizzato Junior Postado 13 Fevereiro Consultores Postado 13 Fevereiro Bom dia @geovanesilveira, Segundo a NT 007 essa alteração já seriam aplicadas agora em fevereiro, veja: Bom dia @MiguelBento, Vou ver com o pessoal que cuida da Lib para saber se é necessário eles fazerem algo a mais para expor os novos tipos de retenção do PIS e COFINS (tag no XML tpRetPisCofins) que agora temos: Assim que eu tiver uma posição retorno aqui. 1 Italo Giurizzato Junior Ajude o Projeto ACBr crescer - Assine o SAC Analista de Sistemas / Araraquara-SP Araraquara - A era dos Trólebus
Membros Pro MiguelBento Postado 13 Fevereiro Membros Pro Postado 13 Fevereiro O Erro não é esse. Peço que verifique, estamos com erro "Rejeição E0713 - Para não Optante não deve informar totais de tributos"
Consultores Diego Foliene Postado 13 Fevereiro Consultores Postado 13 Fevereiro 1 hora atrás, Italo Giurizzato Junior disse: Vou ver com o pessoal que cuida da Lib para saber se é necessário eles fazerem algo a mais para expor os novos tipos de retenção do PIS e COFINS (tag no XML tpRetPisCofins) que agora temos: A leitura do INI para o padrão nacional faz uso da mesma rotina de conversão equivalente a que é usada para converter o enumerado para seu valor numérico na hora de gerar o XML. Ela já considerada os valores de 0 a 9 para converter para o enumerado correspondente. 14 minutos atrás, MiguelBento disse: O Erro não é esse. Peço que verifique, estamos com erro "Rejeição E0713 - Para não Optante não deve informar totais de tributos" Conforme foi observado, o problema está na geração do grupo totTrib. Vamos verificar o que pode ser feito para sanar isso definitivamente, mas por hora usem as sugestões propostas pelos colegas em postagens anteriores e enviem valores menores como 0.00001 por exemplo. Diego FolieniAjude o Projeto ACBr crescer - Assine o SAC (15) 2105-0750 (15)99790-2976. Discord Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!
Membro Pro Verificado Innovae Brasil Engenharia Postado 13 Fevereiro Membro Pro Verificado Postado 13 Fevereiro Boa tarde! Eu apenas preenchi as tags referentes aos dados referentes aos valores aproximado dos tributos (IBPT) e isso já resolve o problema. Fiz assim: TIBPTax = record Perc_Federal_Nacional: Currency; Perc_Estadual: Currency; Perc_Municipal: Currency; end; faço a alimentação do record acima com os dados da tabela IBPT que sempre atualizo com o ACBr. Nessa tabela, vem os valores tanto para os NCMs como para os NBSs. with NFSe.Servico.Valores.totTrib do begin pTotTribMun := rIBPTax.Perc_Municipal; vTotTribMun := Arredonda(NFSe.Servico.Valores.ValorServicos * (pTotTribMun / 100.00)); // pTotTribEst := rIBPTax.Perc_Estadual; vTotTribEst := Arredonda(NFSe.Servico.Valores.ValorServicos * (pTotTribEst / 100.00)); // pTotTribFed := rIBPTax.Perc_Federal_Nacional; vTotTribFed := Arredonda(NFSe.Servico.Valores.ValorServicos * (pTotTribFed / 100.00)); end;
Membro Pro Verificado Wesley Angelo Postado 14 Fevereiro Membro Pro Verificado Postado 14 Fevereiro Aqui estou com o erro E0713 também, atualizei os fontes mas não resolveu. _____________________________________________________________ Wesley Angelo
Consultores valterpatrick Postado 16 Fevereiro Consultores Postado 16 Fevereiro Em 14/02/2026 at 07:57, Wesley Angelo disse: Aqui estou com o erro E0713 também, atualizei os fontes mas não resolveu. Peço que atualize o seu SVN, instale o ACBr e faça novos testes. Há alterações na revisão 44828 para resolver este problema. Valter Patrick Gerente de Projetos na empresa CTEC Consultor ACBr (33)98400-0936 GitHub: https://github.com/valterpatrick Ajude o Projeto ACBr crescer - Assine o Clube PRO (15) 2105-0750 (15)99790-2976. Discord
repiccinin Postado 16 Fevereiro Postado 16 Fevereiro 45 minutos atrás, valterpatrick disse: Peço que atualize o seu SVN, instale o ACBr e faça novos testes. Há alterações na revisão 44828 para resolver este problema. Acabo de atualizar tudo e reinstalar mas continuo com o mesmo erro... E0713
Consultores Juliomar Marchetti Postado 16 Fevereiro Consultores Postado 16 Fevereiro 2 minutos atrás, repiccinin disse: Acabo de atualizar tudo e reinstalar mas continuo com o mesmo erro... E0713 depurando chegou a omitir as informações que ele pede pra não enviar? Juliomar Marchetti Ajude o Projeto ACBr crescer - Seja Pro discord: juliomar telegram: juliomar e-mail: [email protected] http://www.juliomarmarchetti.com.br Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!
Consultores valterpatrick Postado 16 Fevereiro Consultores Postado 16 Fevereiro 4 minutos atrás, repiccinin disse: Acabo de atualizar tudo e reinstalar mas continuo com o mesmo erro... E0713 Pode enviar os arquivos gerados para avaliarmos? Valter Patrick Gerente de Projetos na empresa CTEC Consultor ACBr (33)98400-0936 GitHub: https://github.com/valterpatrick Ajude o Projeto ACBr crescer - Assine o Clube PRO (15) 2105-0750 (15)99790-2976. Discord
repiccinin Postado 16 Fevereiro Postado 16 Fevereiro 2 minutos atrás, valterpatrick disse: Pode enviar os arquivos gerados para avaliarmos? 3526020340173000019256000000000000109-rps.xml Segue o xml da rps gerado...
Consultores Diego Foliene Postado 16 Fevereiro Consultores Postado 16 Fevereiro 1 minuto atrás, repiccinin disse: 3526020340173000019256000000000000109-rps.xml Segue o xml da rps gerado... Boa tarde! Seu arquivo XML está errado de acordo com a rejeição. Citar Codigo: E0713 Mensagem: Para não Optante o indicador de informação de valor total de tributos e o valor percentual aproximado do total dos tributos da alíquota do Simples Nacional (%) não podem ser informados Para não Optante: o indicador de informação de valor total de tributos => Isso aqui equivale a tag indTotTrib e o valor percentual aproximado do total dos tributos da alíquota do Simples Nacional (%) não podem ser informados => Isso aqui equivale a pTotTribSN. Seu XML tem pTotTribSN. Diego FolieniAjude o Projeto ACBr crescer - Assine o SAC (15) 2105-0750 (15)99790-2976. Discord Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!
repiccinin Postado 16 Fevereiro Postado 16 Fevereiro 3 minutos atrás, Diego Foliene disse: Boa tarde! Seu arquivo XML está errado de acordo com a rejeição. Para não Optante: o indicador de informação de valor total de tributos => Isso aqui equivale a tag indTotTrib e o valor percentual aproximado do total dos tributos da alíquota do Simples Nacional (%) não podem ser informados => Isso aqui equivale a pTotTribSN. Seu XML tem pTotTribSN. Corrigindo: 3526020340173000019256000000000000109-rps.xml
Consultores Diego Foliene Postado 16 Fevereiro Consultores Postado 16 Fevereiro 44 minutos atrás, repiccinin disse: Corrigindo: 3526020340173000019256000000000000109-rps.xml 5.5 kB · 0 downloads Seu arquivo ainda está incorreto. NFSe.Servico.Valores.totTrib.indTotTrib deve ter valor igual a indSim. Diego FolieniAjude o Projeto ACBr crescer - Assine o SAC (15) 2105-0750 (15)99790-2976. Discord Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!
repiccinin Postado 17 Fevereiro Postado 17 Fevereiro 15 horas atrás, Diego Foliene disse: Seu arquivo ainda está incorreto. NFSe.Servico.Valores.totTrib.indTotTrib deve ter valor igual a indSim. Bom dia! Obrigada, Diego! Peço desculpas pelo meu erro. É a mania de querer fazer tudo rápido e fazer a leitura dinâmica das coisas... Deu tudo certo!
Membro Pro Verificado RobertoKrug Postado 17 Fevereiro Membro Pro Verificado Postado 17 Fevereiro Bom dia, acabei de atualizar os Componentes.... e para mim, ainda o erro: "Para Não Optante o indicador de informação de valor total de tributos e o valor percentual aproximado do total dos tributos da alíquota do Simples Nacional (%) não podem ser informados." É uma Empresa FORA do Simples... E estou passando os Campos conforme passado acima... Segue arquivos, para análise 4326023228350400031456000000000000550-rps.xml 550-ger-nfse.json 550-ger-nfse-soap.json 550-lista-nfse-ger.json 550-lista-nfse-ger-soap.json
Membro Pro Verificado Paulo Alexandre Hostert Postado 17 Fevereiro Membro Pro Verificado Postado 17 Fevereiro Boa tarde, Quando a tag indTotTrib for igual a não, não deve constar no XML. Dessa forma consegui emitir.
Membro Pro Verificado RobertoKrug Postado 17 Fevereiro Membro Pro Verificado Postado 17 Fevereiro @Paulo Alexandre Hostert mas chegastes a mudar algo nos Fontes ? e consegues um XML de exemplo, para eu ver...
Membro Pro Verificado RobertoKrug Postado 17 Fevereiro Membro Pro Verificado Postado 17 Fevereiro Testando, coloquei a tag indTotTrib igual a Sim... e passou....
Membro Pro Verificado Paulo Alexandre Hostert Postado 17 Fevereiro Membro Pro Verificado Postado 17 Fevereiro É que no código do ACBr a tag indTotTrib só está sendo gerada quando diferente de sim. Alteramos aqui para = sim para não gerar. 1
Membros Pro Leonardo.Coelho Postado 19 Fevereiro Membros Pro Postado 19 Fevereiro Estou enfrentando o mesmo problema utilizando a lib, mesmo removendo completamente os indicadores desse tributo o xml gerado inclui a tag com o valor zerado causando a rejeição da nfse, mesmo utilizando as versões mais atualizadas disponibilizadas ontem o comportamento permanece. Utilizo a lib via integração com C#; um exemplo do preenchimento das classes. Agradeceria se alguém tivesse alguma recomendação ou sugestão para resolução. using ACBrLib; using ACBrLib.Core; using ACBrLib.Core.DFe; using ACBrLib.Core.Extensions; using ACBrLib.Core.NFSe; using ACBrLib.NFSe; using NFSe.WebServices.Provedores; using NFSe.WebServices.Provedores.PadraoNacional; using OpenAC.Net.Core.Extensions; using OpenAC.Net.DFe.Core.Common; using OpenAC.Net.NFSe; using OpenAC.Net.NFSe.Configuracao; using OpenAC.Net.NFSe.Nota; using OpenAC.Net.NFSe.Providers; using Sigo.NFSe.DAO; using Sigo.NFSe.Models; using Sigo.NFSe.Util; using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Net.Http; using System.Net.Mail; using System.Runtime.InteropServices; using System.Security.Cryptography.X509Certificates; using System.Text; using System.Text.Json; using System.Threading; using System.Threading.Tasks; using System.Web; using System.Xml.Linq; using System.Xml.Serialization; using static System.Net.Mime.MediaTypeNames; namespace Sigo.NFSe.WebServices.Provedores.PadraoNacional { class PadraoNacional : AbsProvedor, IProvedor { private ACBrNFSe ACBrNFSe; public PadraoNacional() { } public object GerarPdfNFSe(Prestador prestador, Sigo.NFSe.Models.NFSe nFSe) { string caminhoNotaFsical = ""; return null; } public object EmitirLoteRPS(Prestador prestador, List<Sigo.NFSe.Models.NFSe> listaRPS, NFSeConfig configNFSe, SigoCFG sigoCFG, PrestadorCerts PessCerts) { string caminhoAplicacao = AppDomain.CurrentDomain.BaseDirectory; try { ACBrNFSe = new ACBrNFSe(caminhoAplicacao + "ACBrLib.ini"); //ACBrNFSe = new ACBrNFSe("[Memory]"); ACBrNFSe.Config.Principal.CodificacaoResposta = CodResposta.ANSI; // ACBrNFSe.CarregarINI("") } catch (Exception) { throw; } ACBrNFSe.Config.DFe.UF = "SP"; ACBrNFSe.Config.SSLType = SSLType.LT_TLSv1_2; ACBrNFSe.Config.Timeout = 5000; ACBrNFSe.Config.Ambiente = configNFSe.Ambiente == 2 ? TipoAmbiente.taProducao : TipoAmbiente.taHomologacao; ACBrNFSe.Config.Visualizar = false; ACBrNFSe.Config.SalvarWS = true; ACBrNFSe.Config.AdicionarLiteral = false; ACBrNFSe.Config.RetirarAcentos = false; ACBrNFSe.Config.PathSalvar = "D:\\Sigo\\arquivos\\" + sigoCFG.NomeDB + "\\NFSeTemp";//configNFSe.Caminhowroot + "\\NFSeTemp"; ACBrNFSe.Config.ExibirErroSchema = true; ACBrNFSe.Config.FormaEmissao = ACBrLib.Core.DFe.TipoEmissao.teNormal; //@"C:\Users\Developer\Documents\NFSe\Schemas"; ACBrNFSe.Config.MontarPathSchema = false; // ACBrNFSe.Config.PathSchemas = "C:\\Users\\Developer\\Documents\\NFSe\\Schemas"; ACBrNFSe.Config.IniServicos = caminhoAplicacao + "ACBrNFSeXServicos.ini"; ACBrNFSe.Config.ConsultaLoteAposEnvio = false; ACBrNFSe.Config.ConsultaAposCancelar = false; ACBrNFSe.Config.LayoutNFSe = LayoutNFSe.lnfsPadraoNacionalv1; // ACBrNFSe.Config. ACBrNFSe.Config.IdentarXML = false; //Proxy ACBrNFSe.Config.Proxy.Servidor = ""; ACBrNFSe.Config.Proxy.Porta = ""; ACBrNFSe.Config.Proxy.Usuario = ""; ACBrNFSe.Config.Proxy.Senha = ""; ACBrNFSe.Config.PathNFSe = "D:\\Sigo\\arquivos\\" + sigoCFG.NomeDB + "\\NFSe";//"C:\\Users\\Developer\\Documents\\NFSe\\Schemas\\XmlRetorno"; ACBrNFSe.Config.PathSchemas = configNFSe.Caminhowroot + "\\Schemas\\NFSe\\PadraoNacional\\1.01"; // ACBrNFSe.Config.PathSchemas = @"C:\Users\Developer\Documents\NFSe\Teste"; ACBrNFSe.Config.DFe.SSLCryptLib = SSLCryptLib.cryWinCrypt; ACBrNFSe.Config.DFe.SSLHttpLib = SSLHttpLib.httpWinHttp; ACBrNFSe.Config.DFe.SSLXmlSignLib = SSLXmlSignLib.xsLibXml2; ACBrNFSe.Config.DFe.Senha = PessCerts.Senha; //ACBrNFSe.Config.DFe.NumeroSerie = txtCertNumero.Text; ACBrNFSe.Config.DFe.DadosPFX = Convert.ToBase64String(PessCerts.Certificado); ACBrNFSe.Config.Sistema.Versao = "1.01"; ACBrNFSe.Config.SalvarArq = true; ACBrNFSe.Config.SepararPorMes = false; ACBrNFSe.Config.AdicionarLiteral = false; ACBrNFSe.Config.EmissaoPathNFSe = false; ACBrNFSe.Config.SepararPorCNPJ = true; //Emitente ACBrNFSe.Config.Emitente.CNPJ = prestador.Nro_Docto; ACBrNFSe.Config.Emitente.InscMun = prestador.CCM_NIT; ACBrNFSe.Config.Emitente.RazSocial = prestador.Nome_Empresa; ACBrNFSe.Config.Emitente.WSUser = ""; ACBrNFSe.Config.Emitente.WSSenha = ""; ACBrNFSe.Config.Emitente.WSFraseSecr = ""; ACBrNFSe.Config.Emitente.WSChaveAcesso = ""; ACBrNFSe.Config.Emitente.WSChaveAutoriz = ""; ACBrNFSe.Config.Emitente.Dados.NomeFantasia = prestador.Fantasia; ACBrNFSe.Config.Emitente.Dados.Telefone = prestador.Fone1; ACBrNFSe.Config.Emitente.Dados.CEP = prestador.Cep; ACBrNFSe.Config.Emitente.Dados.Endereco = prestador.Tipo_End + " " + prestador.Endereco; ACBrNFSe.Config.Emitente.Dados.Numero = prestador.End_Nro; ACBrNFSe.Config.Emitente.Dados.Complemento = prestador.Complemento; ACBrNFSe.Config.Emitente.Dados.Bairro = prestador.Bairro; ACBrNFSe.Config.CodigoMunicipio = (CodigoMunicipio)prestador.Cod_Municipio;//cmbCidadeEmitente.GetSelectedValue<CodigoMunicipio>(); // Pasta para guardar os arquivos enviados (INI) por dia var dirEnvios = Path.Combine(ACBrNFSe.Config.PathNFSe, "Envios", DateTime.Now.ToString("yyyy-MM-dd")); Directory.CreateDirectory(dirEnvios); // Diretório para XML enviados (por dia) var dirXmlEnviados = Path.Combine(ACBrNFSe.Config.PathNFSe, "XmlEnviados", DateTime.Now.ToString("yyyy-MM-dd")); Directory.CreateDirectory(dirXmlEnviados); string strMsgErro = ""; List<EnviarLoteDpsResposta2> LsNumeroProcolo = new List<EnviarLoteDpsResposta2>(); CarregarIni carregarIni = new CarregarIni(); int contadorLoteRps = 0; int NumeroLote = configNFSe.Cod_LoteRPS; int contadorRps = 0; // Emitir um por um na lista (Modo Unitário) foreach (var nfse in listaRPS) { contadorLoteRps++; contadorRps++; if (contadorLoteRps <= configNFSe.Qtde_Max_NFSe) { // Gera INI (arquivo enviado) e salva para auditoria string iniConteudo = carregarIni.CarregarIniAbrasaf(prestador, nfse, configNFSe, sigoCFG, null); var nomeIni = $"RPS_{nfse.Cod_NF}_{DateTime.Now:yyyyMMdd_HHmmssfff}.ini"; var caminhoIni = Path.Combine(dirEnvios, nomeIni); File.WriteAllText(caminhoIni, iniConteudo, Encoding.UTF8); ACBrNFSe.CarregarINI(iniConteudo); } contadorLoteRps = 0; // Retry de emissão em falhas transitórias de comunicação const int maxRetries = 3; Envio envio = null; string resposta = null; Exception lastEx = null; for (int attempt = 1; attempt <= maxRetries; attempt++) { try { resposta = ACBrNFSe.Emitir(NumeroLote.ToString(), 0, false); envio = carregarIni.RetornoIniAcbr(resposta); // Salva o XML enviado para o webservice (envio.XmlEnvio) var xmlEnvioPath = Path.Combine(dirXmlEnviados, $"RPS_{nfse.Cod_NF}_XmlEnvio_{attempt}.xml"); File.WriteAllText(xmlEnvioPath, envio.XmlEnvio ?? string.Empty, Encoding.UTF8); // Opcional: salvar também o XML de retorno bruto (envio.XmlRetorno) var xmlRetornoPath = Path.Combine(dirXmlEnviados, $"RPS_{nfse.Cod_NF}_XmlRetorno_{attempt}.xml"); File.WriteAllText(xmlRetornoPath, envio.XmlRetorno ?? string.Empty, Encoding.UTF8); // Se retornou erros, mas são de comunicação e ainda há tentativa disponível, re-tenta if (envio?.Erros != null && envio.Erros.Count > 0 && IsTransientCommError(envio) && attempt < maxRetries) { Thread.Sleep(Math.Min(8000, 1000 * attempt)); // backoff simples continue; } // Sucesso ou erro não transitório -> sai do loop break; } catch (Exception ex) { lastEx = ex; if (!IsTransientCommError(ex) || attempt == maxRetries) break; Thread.Sleep(Math.Min(8000, 1000 * attempt)); // backoff simples } } // Se falhou sem retorno estruturado (exceção nas tentativas) if (envio == null) { strMsgErro += (lastEx?.Message ?? "Falha de comunicação na emissão.") + " "; ACBrNFSe.LimparLista(); continue; } if (envio.Erros.Count > 0) { foreach (var erro in envio.Erros) { strMsgErro += "NºRPS: " + nfse.Cod_NF + " " + erro.Codigo + " " + erro.Descricao + " " + erro.Correcao + "<br>"; } ACBrNFSe.LimparLista(); continue; } var JSONLote = NFSeUtil.DeserializeJson<EnviarLoteDpsResposta2>(envio.XmlRetorno.ToString()); LsNumeroProcolo.Add(JSONLote); ACBrNFSe.LimparLista(); if (contadorRps != listaRPS.Count) { //string carregarIni2 = carregarIni.CarregarIniAbrasaf(prestador, nfse, configNFSe, sigoCFG, null); //ACBrNFSe.CarregarINI(carregarIni2); } } List<NFSeRetorno> listaRetorno = new List<NFSeRetorno>(); foreach (var itemNumeroProtocolo in LsNumeroProcolo) { int TempoMS = 5000; int tentativas = 0; ConsultaLoteNfse consultaLoteRps = new ConsultaLoteNfse(); while (tentativas <= 10) { tentativas++; Thread.Sleep(TempoMS); if (TempoMS < 1920000) TempoMS += TempoMS; string RetornoLote = ACBrNFSe.ConsultarNFSePorChave(itemNumeroProtocolo.ChaveAcesso); consultaLoteRps = carregarIni.RetornoConsultaLoteNFSEIniAcbr(RetornoLote); string msgTemp = ""; if (consultaLoteRps.Erros.Count > 0) { foreach (var erro in consultaLoteRps.Erros) { // re try em E999/X203 ou mensagens equivalentes if (erro.Descricao == "Remessa ainda não foi processada" || IsGovCommErrorCode(erro.Codigo, erro.Descricao)) { msgTemp = erro.Descricao; break; } strMsgErro += erro.Codigo + " " + erro.Descricao + " " + erro.Correcao; } if (!string.IsNullOrEmpty(msgTemp)) continue; break; } else { break; } } using JsonDocument docJson = JsonDocument.Parse(consultaLoteRps.XmlRetorno.ToString()); if (!docJson.RootElement.TryGetProperty("nfseXmlGZipB64", out var propB64) || propB64.ValueKind != JsonValueKind.String) { // Sem NFSe no retorno (caso típico X203) strMsgErro += "X203 Não foi retornado nenhuma NFSe. "; continue; } string nfseXmlGZipB64 = propB64.GetString(); var xmlFormatado = NFSeUtil.DecodeNfseXmlGZipB64(nfseXmlGZipB64); XDocument doc = XDocument.Parse(xmlFormatado); XNamespace ns = "http://www.sped.fazenda.gov.br/nfse"; var nfseList = doc.Descendants(ns + "NFSe"); if (nfseList.Any()) { foreach (var n in nfseList) { var inf = n.Element(ns + "infNFSe"); var dps = inf.Element(ns + "DPS"); var infDps = dps.Element(ns + "infDPS"); listaRetorno.Add(new NFSeRetorno { Cod_NFSe = int.Parse(inf.Element(ns + "nNFSe")?.Value ?? "0"), // número da NFSe Cod_Verificador = "Padrao Nacional", //inf.Attribute("Id")?.Value, // Informa no lugar do cod verificador que a nota foi emitida via padrão nacional que não possui esse valor Dta_Emissao = DateTime.Parse(infDps.Element(ns + "dhEmi")?.Value ?? DateTime.MinValue.ToString()), // data emissão da DPS Cod_NF = int.Parse(infDps.Element(ns + "nDPS")?.Value ?? "0"), // número interno da DPS (substitui o RPS) Situacao = 1 }); } } } if (strMsgErro != "") { int notaProcessada = 0; if (listaRetorno.Count > 0) notaProcessada = new NFSeDAO().processaRetornoNFSe(sigoCFG, prestador, listaRetorno, 0); string resultadoErro = ""; if (notaProcessada == 0) resultadoErro = " <br> Ocorreu erro no envio do lote da nota fiscal " + "<br> Mensagem de Erro:<span style=\"color: #ff0000;\"> " + strMsgErro + " </span>"; else resultadoErro = " Quantidade de Nota(s) Processada(s) com sucesso: " + notaProcessada + "<br> Ocorreu erro no envio do lote da nota fiscal " + "<br> Mensagem de Erro:<span style=\"color: #ff0000;\"> " + strMsgErro + " </span>"; ACBrNFSe.Dispose(); return base.FormataRetornoJSON(false, (int)NFSeUtil.TipoEmissao.WebService, null, resultadoErro); } int TotaldeNotas = 0; TotaldeNotas = new NFSeDAO().processaRetornoNFSe(sigoCFG, prestador, listaRetorno, 0); //caso nao tenha erro string resultadoOK = " Todas as nota(s) fiscal foram enviada com sucesso para a prefeitura e enviado ao email do cliente!<br> Quantidade de Nota(s) Processada(s): " + TotaldeNotas;/// "<br><br><span> Token do email" + TokenReposta + "<br><br>"+ TokenReposta2 + "</span>"; ACBrNFSe.Dispose(); return base.FormataRetornoJSON(false, (int)NFSeUtil.TipoEmissao.WebService, null, resultadoOK); } public string Descriminacao(Sigo.NFSe.Models.NFSe NFSe, Prestador prestador, string ItensAux) { string c_TextoAux = ""; string c_TextoTF = ""; decimal fimposto = 0; if (NFSe.Deducao_IR == 0 && NFSe.ExcFiscal_IR == 1) // 484 A 498 ir fimposto += (NFSe.Vlr_IR); if (NFSe.Deducao_PCC == 0 && NFSe.ExcFiscal_PCC == 1) //484 A 498 CSLL fimposto += (NFSe.Vlr_CSLL + NFSe.Vlr_Cofins + NFSe.Vlr_PIS); if ((NFSe.Exibe_Impostos == 0) /*&& prestador.Enquadramento != (int)NFSeUtil.Enquadramento.SimplesNacional*/) { if (NFSe.Deducao_ISS == 0 && NFSe.ExcFiscal_ISS == 1) { if (c_TextoAux != "") { c_TextoAux += " / ISS:" + (NFSe.PCT_ISS / 100).ToString("P02") + "%" + " Vlr: " + (NFSe.Vlr_ISS / 100).ToString("P02").Replace("%", ""); } else { c_TextoAux += "ISS: " + (NFSe.PCT_ISS / 100).ToString("P02") + "%" + " Vlr: " + (NFSe.Vlr_ISS / 100).ToString("P02").Replace("%", ""); ; } } if (NFSe.Deducao_IR == 0 && NFSe.ExcFiscal_IR == 1 && NFSe.Vlr_IR > 0) { if (c_TextoAux != "") { c_TextoAux += " / I.R: " + ((NFSe.Vlr_Total / NFSe.Vlr_IR) / 100).ToString("P02");// String.Format("{0:C}", NFSe.Vlr_IR/NFSe.Vlr_Total) ; } else { c_TextoAux += "I.R: " + ((NFSe.Vlr_Total / NFSe.Vlr_IR) / 100).ToString("P02"); } } if (NFSe.Deducao_PCC == 0 && NFSe.ExcFiscal_PCC == 1 && fimposto > 0) //484 A 498 CSLL { float rPct_Pis = 0; float rPct_Cofins = 0; float rPct_Csll = 0; if (c_TextoAux != "") c_TextoAux += " / PIS: " + ((NFSe.Vlr_PIS / NFSe.Vlr_Total) / 100).ToString("P02") + (NFSe.Vlr_PIS / 100).ToString("P02").Replace("%", "") + " / "; else c_TextoAux += "PIS: " + ((NFSe.Vlr_PIS / NFSe.Vlr_Total) / 100).ToString("P02") + (NFSe.Vlr_PIS / 100).ToString("P02").Replace("%", "") + " / "; if (NFSe.Vlr_Cofins / NFSe.Vlr_Total > 0) c_TextoAux += " / COFINS: " + ((NFSe.Vlr_Cofins / NFSe.Vlr_Total) / 100).ToString("P02") + (NFSe.Vlr_Cofins / 100).ToString("P02").Replace("%", "") + " / "; c_TextoAux += " CSLL:" + ((NFSe.Vlr_CSLL / NFSe.Vlr_Total) / 100).ToString("P02") + (NFSe.Vlr_CSLL / 100).ToString("P02").Replace("%", ""); } if (NFSe.Deducao_INSS == 0 && NFSe.ExcFiscal_INSS == 1) { if (c_TextoAux != "") c_TextoAux += " / INSS: " + ((NFSe.Vlr_INSS / NFSe.Vlr_Total) / 100).ToString("P02") + (NFSe.Vlr_PIS / 100).ToString("P02").Replace("%", ""); else c_TextoAux += "INSS: " + ((NFSe.Vlr_INSS / NFSe.Vlr_Total) / 100).ToString("P02") + (NFSe.Vlr_PIS / 100).ToString("P02").Replace("%", ""); } } if (c_TextoAux != "") { c_TextoAux = "Impostos Retidos Nesta Nota Fiscal: " + c_TextoAux; } if (NFSe.Vlr_TxAdm > 0) { if (c_TextoAux != "") c_TextoAux += "Taxas Administrativas: " + (NFSe.Vlr_TxAdm / 100).ToString("P02").Replace("%", "") + " / " + c_TextoAux; // c_TextoAux += "Taxas Administrativas: " + String.Format("{0:C}", NFSe.Vlr_TxAdm) + " / " + c_TextoAux; else c_TextoAux += "Taxas Administrativas: " + (NFSe.Vlr_TxAdm / 100).ToString("P02").Replace("%", ""); // c_TextoAux += "Taxas Administrativas: " + String.Format("{0:C}", NFSe.Vlr_TxAdm); } string TFCOD = !String.IsNullOrEmpty(NFSe.TF_Codigo) ? NFSe.TF_Codigo : "0"; if (int.Parse(TFCOD) > 0) { c_TextoTF = " || Valor Aprox. dos Tributos "; float rVlr_TF = 0; float rPct_TF = 0; if (NFSe.TF_PctFederal > 0) { rVlr_TF += (float)Math.Round((decimal)NFSe.Vlr_Total * (decimal)(NFSe.TF_PctFederal / 100), 2); rPct_TF += (float)NFSe.TF_PctFederal; } if (NFSe.TF_PctImportado > 0) { rVlr_TF += (float)Math.Round((decimal)NFSe.Vlr_Total * (decimal)(NFSe.TF_PctImportado / 100), 2); rPct_TF += (float)NFSe.TF_PctImportado; } if (NFSe.TF_PctEstadual > 0) { rVlr_TF += (float)Math.Round((decimal)NFSe.Vlr_Total * (decimal)(NFSe.TF_PctEstadual / 100), 2); rPct_TF += (float)NFSe.TF_PctEstadual; } if (NFSe.TF_PctMunicipal > 0) { rVlr_TF += (float)Math.Round((decimal)NFSe.Vlr_Total * (decimal)(NFSe.TF_PctMunicipal / 100), 2); rPct_TF += (float)NFSe.TF_PctMunicipal; } //c_TextoTF += String.Format("{0:C}", rVlr_TF); c_TextoTF += "R$ " + (rVlr_TF / 100).ToString("P02").Replace("%", ""); c_TextoTF += "(" + (rPct_TF / 100).ToString("P02") + ")"; if (!String.IsNullOrEmpty(NFSe.TF_Fonte)) { c_TextoTF += " " + NFSe.TF_Fonte; if (!String.IsNullOrEmpty(NFSe.TF_Chave)) { c_TextoTF += " Chave: " + NFSe.TF_Chave; } } } c_TextoAux = ItensAux + c_TextoTF; if (!String.IsNullOrEmpty(NFSe.Obs)) c_TextoAux += " | Observação da Nota Fiscal: " + NFSe.Obs; if (c_TextoAux.Length > 1000) return c_TextoAux.Substring(0, 999); else return c_TextoAux; } // Heurística para detectar falhas transitórias de comunicação private static bool IsTransientCommError(Exception ex) { if (ex == null) return false; // Tipos comuns de falha de comunicação if (ex is HttpRequestException || ex is WebException || ex is IOException) return true; if (ex is System.Net.Sockets.SocketException) return true; var msg = ex.Message?.ToLowerInvariant() ?? string.Empty; return msg.Contains("timeout") || msg.Contains("timed out") || msg.Contains("temporar") // temporariamente indisponível || msg.Contains("comunica") // comunicação || msg.Contains("conex") // conexão || msg.Contains("ssl") || msg.Contains("tls") || msg.Contains("dns") || msg.Contains("503") || msg.Contains("502") || msg.Contains("504") || msg.Contains("gateway") || msg.Contains("unavailable"); } private static bool IsTransientCommError(Envio envio) { if (envio?.Erros == null || envio.Erros.Count == 0) return false; foreach (var e in envio.Erros) { if (IsGovCommErrorCode(e?.Codigo, e?.Descricao)) return true; var d = (e?.Descricao ?? string.Empty).ToLowerInvariant(); if (d.Contains("timeout") || d.Contains("temporar") || d.Contains("comunica") || d.Contains("conex") || d.Contains("ssl") || d.Contains("tls") || d.Contains("dns") || d.Contains("503") || d.Contains("502") || d.Contains("504") || d.Contains("gateway") || d.Contains("unavailable")) return true; } return false; } // Códigos/descrições típicos de falha de comunicação do governo private static bool IsGovCommErrorCode(string codigo, string descricao) { var code = (codigo ?? "").Trim().ToUpperInvariant(); var desc = (descricao ?? "").ToLowerInvariant(); if (code == "E999" || code == "X203") return true; if (desc.Contains("não foi retornado nenhuma nfse") || desc.Contains("nao foi retornado nenhuma nfse")) return true; if (desc.Contains("erro não catalogado") || desc.Contains("erro nao catalogado")) return true; return false; } } } using Sigo.NFSe.Models; using System; using System.Collections.Generic; using System.Text; using IniParser; using IniParser.Model; using Sigo.NFSe.Util; using Sigo.NFSe.WebServices.Provedores; using System.IO; using IniParser.Parser; using NFSe.WebServices.Provedores.ISSDSF; namespace NFSe.WebServices.Provedores.PadraoNacional { public class CarregarIni { public string CarregarIniAbrasaf(Prestador prestador, Sigo.NFSe.Models.NFSe nfse, NFSeConfig configNFSe, SigoCFG sigoCFG, PrestadorCerts PessCerts) { IniData data = new IniData(); data["IdentificacaoNFSe"]["Numero"] = nfse.Cod_NF.ToString(); data["IdentificacaoNFSe"]["CodigoVerificacao"] = nfse.Cod_Verificador ?? ""; data["IdentificacaoRps"]["Producao"] = (configNFSe.Ambiente == 2) ? "1" : "2"; data["IdentificacaoRps"]["Status"] = "1"; data["IdentificacaoRps"]["OutrasInformacoes"] = ""; data["IdentificacaoRps"]["TipoTributacaoRps"] = "T"; data["IdentificacaoRps"]["SeriePrestacao"] = "99"; data["IdentificacaoRps"]["Numero"] = nfse.Cod_NF.ToString(); data["IdentificacaoRps"]["Serie"] = "1"; data["IdentificacaoRps"]["Tipo"] = "1"; data["IdentificacaoRps"]["DataEmissao"] = nfse.Dta_Cad.ToString("dd/MM/yyyy"); data["IdentificacaoRps"]["Competencia"] = nfse.Dta_Cad.ToString("dd/MM/yyyy"); data["IdentificacaoRps"]["NaturezaOperacao"] = nfse.Tributacao == (int)NFSeUtil.TipoTributacao.DentroDoMunicipio ? "01" : "02"; //Usado pelo provedor ISSSaoPaulo data["IdentificacaoRps"]["PercentualCargaTributaria"] = "0"; //Usado pelo provedor ISSSaoPaulo data["IdentificacaoRps"]["ValorCargaTributaria"] = "0"; data["IdentificacaoRps"]["PercentualCargaTributariaMunicipal"] = nfse.TF_PctMunicipal.ToString(); data["IdentificacaoRps"]["ValorCargaTributariaMunicipal"] = (nfse.Vlr_Total) * (decimal)(nfse.TF_PctMunicipal) / 100 + ""; data["IdentificacaoRps"]["PercentualCargaTributariaEstadual"] = nfse.TF_PctEstadual.ToString(); data["IdentificacaoRps"]["ValorCargaTributariaEstadual"] = (nfse.Vlr_Total) * (decimal)(nfse.TF_PctEstadual) / 100 + ""; data["IdentificacaoRps"]["verAplic"] = "ACBrNFSeX-1.00"; // Preencher a seção [Prestador] string Enquandramento = ""; switch (prestador.Enquadramento) { case 1: Enquandramento = "7"; break; case 2: Enquandramento = "8"; break; case 3: Enquandramento = "9"; break; case 4: Enquandramento = ""; break; } ; data["Prestador"]["Regime"] = "0";//Verificar esse campo depois no sistema data["Prestador"]["OptanteSN"] = Enquandramento == "9" ? "2" : "1"; data["Prestador"]["opSimpNac"] = prestador.Enquadramento == 3 ? "3" : "1"; data["Prestador"]["IncentivadorCultural"] = "2"; data["Prestador"]["CNPJ"] = prestador.Nro_Docto; data["Prestador"]["InscricaoMunicipal"] = prestador.Enquadramento == 3 ? prestador.CCM_NIT : ""; data["Prestador"]["NIF"] = ""; data["Prestador"]["CAEPF"] = ""; data["Prestador"]["RazaoSocial"] = ""; data["Prestador"]["NomeFantasia"] = prestador.Fantasia; data["Prestador"]["Logradouro"] = prestador.Tipo_End + " " + prestador.Endereco; data["Prestador"]["Numero"] = prestador.End_Nro; data["Prestador"]["Complemento"] = prestador.Complemento; data["Prestador"]["Bairro"] = prestador.Bairro; data["Prestador"]["CodigoMunicipio"] = prestador.Cod_Municipio.ToString(); data["Prestador"]["UF"] = prestador.UF; data["Prestador"]["CodigoPais"] = "1058"; data["Prestador"]["xPais"] = "Brasil"; data["Prestador"]["CEP"] = prestador.Cep; data["Prestador"]["Telefone"] = prestador.Fone1; data["Prestador"]["Email"] = prestador.Email; data["Tomador"]["Tipo"] = (nfse.Tomador.Tipo_Docto == 1) ? "2" : nfse.Tributacao == (int)NFSeUtil.TipoTributacao.DentroDoMunicipio ? "03" : "04"; data["Tomador"]["CNPJCPF"] = nfse.Tomador.Nro_Docto; data["Tomador"]["InscricaoMunicipal"] = nfse.Tomador.CCM_NIT; data["Tomador"]["NIF"] = ""; data["Tomador"]["CAEPF"] = nfse.Tomador.Nro_Docto.Length == 14 ? nfse.Tomador.Nro_Docto : ""; data["Tomador"]["InscricaoEstadual"] = nfse.Tomador.IE_RG; data["Tomador"]["RazaoSocial"] = nfse.Tomador.Nome_Empresa; data["Tomador"]["TipoLogradouro"] = nfse.Tomador.Tipo_End; data["Tomador"]["Logradouro"] = nfse.Tomador.Endereco; data["Tomador"]["Numero"] = nfse.Tomador.End_Nro; data["Tomador"]["Complemento"] = nfse.Tomador.Complemento; data["Tomador"]["Bairro"] = nfse.Tomador.Bairro; data["Tomador"]["CodigoMunicipio"] = nfse.Tomador.Cod_Municipio.ToString(); data["Tomador"]["xMunicipio"] = nfse.Tomador.Municipio; data["Tomador"]["UF"] = nfse.Tomador.UF; data["Tomador"]["CodigoPais"] = "1058"; data["Tomador"]["CEP"] = nfse.Tomador.Cep; data["Tomador"]["xPais"] = "Brasil"; data["Tomador"]["Telefone"] = nfse.Tomador.Fone1; data["Tomador"]["Email"] = nfse.Tomador.Email; data["Tomador"]["AtualizaTomador"] = "1"; data["Tomador"]["TomadorExterior"] = "2"; data["Servico"]["ItemListaServico"] = nfse.Cod_Servico.ToString(); data["Servico"]["CodigoCnae"] = nfse.Cod_Atividade.ToString().Substring(0, Math.Min(7, nfse.Cod_Atividade.ToString().Length)); data["Servico"]["CodigoTributacaoMunicipio"] = nfse.Cod_Atividade.ToString(); ;//nfse.Cod_Servico.ToString(); data["Servico"]["Discriminacao"] = formatarDiscriminacaoServicosRPS(nfse); data["Servico"]["CodigoMunicipio"] = prestador.Cod_Municipio.ToString(); data["Servico"]["CodigoPais"] = "1058"; data["Servico"]["ExigibilidadeISS"] = (nfse.Deducao_ISS == 0 && nfse.ExcFiscal_ISS == 1) ? "3" : "1"; data["Servico"]["MunicipioIncidencia"] = prestador.Cod_Municipio.ToString(); data["Servico"]["UFPrestacao"] = prestador.UF; data["Servico"]["ResponsavelRetencao"] = ""; data["Servico"]["Operacao"] = "A"; data["Servico"]["Tributacao"] = "C"; data["Servico"]["CodigoNBS"] = nfse.TF_Codigo.ToString(); // Preencher a seção [Valores] data["Valores"]["ValorServicos"] = nfse.Vlr_Total.ToString("F2").Replace('.', ','); data["Valores"]["ValorDeducoes"] = "0,00"; data["Valores"]["AliquotaDeducoes"] = "0,00";//nfse.Valores.AliquotaDeducoes.ToString("F2").Replace(',', '.'); if (nfse.Deducao_PCC == 0 && nfse.ExcFiscal_PCC == 1 && nfse.Vlr_PIS > 0) { data["Valores"]["ValorPis"] = Math.Round(nfse.Vlr_PIS, 2).ToString("F2").Replace(',', '.'); data["Valores"]["AliquotaPis"] = Math.Round((nfse.Vlr_Total / nfse.Vlr_PIS), 2).ToString("F2"); data["Valores"]["ValorCofins"] = Math.Round(nfse.Vlr_Cofins, 2).ToString("F2");//nfse.Valores.ValorCofins.ToString("F2").Replace(',', '.'); data["Valores"]["AliquotaCofins"] = Math.Round((nfse.Vlr_Total / nfse.Vlr_Cofins), 2).ToString("F2"); } else { data["Valores"]["ValorPis"] = ""; data["Valores"]["AliquotaPis"] = ""; data["Valores"]["ValorCofins"] = ""; data["Valores"]["AliquotaCofins"] = ""; } if (nfse.Deducao_INSS == 0 && nfse.ExcFiscal_INSS == 1 && nfse.Vlr_INSS > 0) data["Valores"]["ValorInss"] = Math.Round((nfse.Vlr_Total / nfse.Vlr_INSS), 2).ToString("F2"); else data["Valores"]["ValorInss"] = "0"; if (nfse.Deducao_IR == 0 && nfse.ExcFiscal_IR == 1 && nfse.Vlr_IR > 0) data["Valores"]["ValorIr"] = Math.Round(nfse.Vlr_IR, 2).ToString("F2"); else data["Valores"]["ValorIr"] = "0"; if (nfse.Deducao_PCC == 0 && nfse.ExcFiscal_PCC == 1 && nfse.Vlr_PIS > 0) data["Valores"]["ValorCsll"] = nfse.Vlr_CSLL.ToString("F2"); else data["Valores"]["ValorCsll"] = ""; data["Valores"]["OutrasRetencoes"] = "0"; data["Valores"]["DescontoIncondicionado"] = "0"; data["Valores"]["DescontoCondicionado"] = "0"; data["Valores"]["BaseCalculo"] = nfse.Vlr_Total.ToString("F2"); data["Valores"]["Aliquota"] = ((nfse.ExcFiscal_ISS == 1 && nfse.Deducao_ISS == 0) && nfse.Vlr_ISS > 0) ? nfse.PCT_ISS.ToString("F2").Replace('.', ',') : ""; // nfse.PCT_ISS.ToString("F2"); data["Valores"]["ValorIss"] = nfse.Vlr_ISS.ToString("F2"); data["Valores"]["ValorIssRetido"] = nfse.Vlr_ISS.ToString("F2"); data["Valores"]["ValorLiquidoNfse"] = nfse.Vlr_Liquido.ToString("F2"); data["Valores"]["ValorTotalNotaFiscal"] = nfse.Vlr_Total.ToString("F2"); data["InformacoesComplementares"]["xInfComp"] = nfse.Obs; data["tribMun"]["tribISSQN"] = "1"; data["tribMun"]["cPaisResult"] = "0"; data["tribMun"]["tpBM"] = "0"; data["tribMun"]["nBM"] = ""; data["tribMun"]["vRedBCBM"] = "0"; data["tribMun"]["pRedBCBM"] = "0"; data["tribMun"]["tpSusp"] = ""; data["tribMun"]["nProcesso"] = ""; data["tribMun"]["tpImunidade="] = ""; if (prestador.Enquadramento == 3) data["tribMun"]["pAliq"] = ((nfse.ExcFiscal_ISS == 1 && nfse.Deducao_ISS == 0) && nfse.Vlr_ISS > 0) ? nfse.PCT_ISS.ToString("F2").Replace('.', ',') : ""; // nfse.PCT_ISS.ToString("F2"); //data["totTrib"]["indTotTrib"] = "1"; //data["totTrib"]["pTotTribSN"] = ((nfse.TF_PctMunicipal) + (nfse.TF_PctEstadual) + (nfse.TF_PctFederal)).ToString(); //data["totTrib"]["vTotTrib"] = ""; //data["totTrib"]["pTotTrib"] = ""; data["tribMun"]["tpRetISSQN"] = ((nfse.ExcFiscal_ISS == 1 && nfse.Deducao_ISS == 0) && nfse.Vlr_ISS > 0) ? "2" : "1"; if ((nfse.ExcFiscal_PCC == 1 && nfse.Deducao_PCC == 0) && (nfse.Vlr_PIS > 0 || nfse.Vlr_Cofins > 0 || nfse.Vlr_CSLL > 0)) { data["tribFederal"]["CST"] = "01"; data["tribFederal"]["tpRetPisCofins"] = "1"; data["tribFederal"]["vBCPisCofins"] = nfse.Vlr_Total.ToString("F2"); data["tribFederal"]["pAliqPis"] = ((nfse.Vlr_PIS / nfse.Vlr_Total) * 100).ToString("F2").Replace('.', ','); data["tribFederal"]["vPis"] = nfse.Vlr_PIS.ToString("F2").Replace('.', ','); data["tribFederal"]["pAliqCofins"] = ((nfse.Vlr_Cofins / nfse.Vlr_Total) * 100).ToString("F2").Replace('.', ','); data["tribFederal"]["vCofins"] = nfse.Vlr_Cofins.ToString("F2").Replace('.', ','); data["tribFederal"]["vRetCSLL"] = nfse.Vlr_CSLL.ToString("F2").Replace('.', ','); } else { data["tribFederal"]["tpRetPisCofins"] = "2"; } data["tribFederal"]["vRetIRRF"] = ((nfse.ExcFiscal_IR == 1 && nfse.Deducao_IR == 0) && nfse.Vlr_IR > 0) ? nfse.Vlr_IR.ToString("F2").Replace('.', ',') : ""; data["tribFederal"]["vRetCP"] = ((nfse.ExcFiscal_INSS == 1 && nfse.Deducao_INSS == 0) && nfse.Vlr_INSS > 0) ? nfse.Vlr_INSS.ToString("F2").Replace('.', ',') : ""; return data.ToString(); } public Envio RetornoIniAcbr(string RetornoIni) { Envio envio = new Envio(); var parser = new IniDataParser(); IniData data; data = parser.Parse(RetornoIni); var envioSection = data["Envio"]; if (envioSection != null) { envio.CodigoVerificacao = envioSection["CodigoVerificacao"]; // Parse da data no formato "dd/MM/yyyy HH:mm:ss" if (DateTime.TryParseExact(envioSection["Data"], "dd/MM/yyyy HH:mm:ss", null, System.Globalization.DateTimeStyles.None, out DateTime parsedDate)) { envio.Data = parsedDate; } else { envio.Data = DateTime.MinValue; } envio.Link = envioSection["Link"]; // Parse de inteiros envio.Lote = int.TryParse(envioSection["Lote"], out int lote) ? lote : 0; envio.MaxRps = int.TryParse(envioSection["MaxRps"], out int maxRps) ? maxRps : 0; envio.ModoEnvio = envioSection["ModoEnvio"]; envio.NumeroNota = envioSection["NumeroNota"]; envio.Protocolo = envioSection["Protocolo"]; envio.Situacao = envioSection["Situacao"]; envio.Sucesso = int.TryParse(envioSection["Sucesso"], out int sucesso) ? sucesso : 0; envio.XmlEnvio = envioSection["XmlEnvio"]; envio.XmlRetorno = envioSection["XmlRetorno"]; } List<Erro> errosListaRetornoLote = new List<Erro>(); foreach (var section in data.Sections) { if (section.SectionName.StartsWith("Erro", StringComparison.OrdinalIgnoreCase)) { Erro erro = new Erro { Codigo = section.Keys["Codigo"], Correcao = section.Keys["Correcao"], Descricao = section.Keys["Descricao"] }; errosListaRetornoLote.Add(erro); } } envio.Erros = errosListaRetornoLote; return envio; } public ConsultaLoteRps RetornoConsultaLoteIniAcbr(string RetornoIni) { var parser = new IniDataParser(); IniData data; data = parser.Parse(RetornoIni); ConsultaLoteRps consulta = new ConsultaLoteRps(); var consultaSection = data["ConsultaLoteRps"]; if (consultaSection != null) { consulta.CodVerificacao = consultaSection["CodVerificacao"]; consulta.Lote = int.TryParse(consultaSection["Lote"], out int lote) ? lote : 0; consulta.Protocolo = consultaSection["Protocolo"]; consulta.Situacao = int.TryParse(consultaSection["Situacao"], out int situacao) ? situacao : 0; consulta.XmlEnvio = consultaSection["XmlEnvio"]; consulta.XmlRetorno = consultaSection["XmlRetorno"]; } List<Erro> errosListaRetornoLote = new List<Erro>(); foreach (var section in data.Sections) { if (section.SectionName.StartsWith("Erro", StringComparison.OrdinalIgnoreCase)) { Erro erro = new Erro { Codigo = section.Keys["Codigo"], Correcao = section.Keys["Correcao"], Descricao = section.Keys["Descricao"] }; errosListaRetornoLote.Add(erro); } } consulta.Erros = errosListaRetornoLote; return consulta; } public ConsultaLoteNfse RetornoConsultaLoteNFSEIniAcbr(string RetornoIni) { var parser = new IniDataParser(); IniData data; data = parser.Parse(RetornoIni); ConsultaLoteNfse consulta = new ConsultaLoteNfse(); var consultaSection = data["ConsultaNFSe"]; if (consultaSection != null) { consulta.XmlEnvio = consultaSection["XmlEnvio"]; consulta.XmlRetorno = consultaSection["XmlRetorno"]; } List<Erro> errosListaRetornoLote = new List<Erro>(); foreach (var section in data.Sections) { if (section.SectionName.StartsWith("Erro", StringComparison.OrdinalIgnoreCase)) { Erro erro = new Erro { Codigo = section.Keys["Codigo"], Correcao = section.Keys["Correcao"], Descricao = section.Keys["Descricao"] }; errosListaRetornoLote.Add(erro); } } consulta.Erros = errosListaRetornoLote; return consulta; } public string formatarDiscriminacaoServicosRPS(Sigo.NFSe.Models.NFSe NFSe, string quebraDeLinha = "|") { var descricaoItensNFSe = ""; if (NFSe.Tipo_ExibeItens == (int)NFSeUtil.TipoDiscriminacao.DescricaoSimplificada) { descricaoItensNFSe += NFSe.Descricao_Simpl + quebraDeLinha; } else { foreach (var item in NFSe.NFSeItens) { descricaoItensNFSe += item.Quantidade + " " + item.Descricao + " - " + item.Vlr_Unitario + " Cada = " + item.Vlr_SubTotal + quebraDeLinha; } } // OBS NFSe descricaoItensNFSe += NFSe.Obs; return descricaoItensNFSe; } public string formatarImpostosRPS(Prestador Prestador, Sigo.NFSe.Models.NFSe NFSe, string quebraDeLinha = "|") { var descricaoImpostosNFSe = ""; if ((NFSe.Exibe_Impostos == 0) && (Prestador.Enquadramento != (int)NFSeUtil.Enquadramento.SimplesNacional)) { if (NFSe.Deducao_ISS == 0 && NFSe.ExcFiscal_ISS == 1 && NFSe.Vlr_ISS > 0) { descricaoImpostosNFSe += descricaoImpostosNFSe != "" ? " / " : ""; descricaoImpostosNFSe += String.Format("ISS: {0:P2} - Vlr: R${1:0.00}", ((NFSe.Vlr_ISS / NFSe.Vlr_Total)), (NFSe.Vlr_ISS)); } if (NFSe.Deducao_IR == 0 && NFSe.ExcFiscal_IR == 1 && NFSe.Vlr_IR > 0) { descricaoImpostosNFSe += descricaoImpostosNFSe != "" ? " / " : ""; descricaoImpostosNFSe += String.Format("IR: {0:P2} - Vlr: R${1:0.00}", ((NFSe.Vlr_IR / NFSe.Vlr_Total)), (NFSe.Vlr_IR)); } if ((NFSe.Deducao_PCC == 0 && NFSe.ExcFiscal_PCC == 1) && (NFSe.Vlr_PIS > 0 || NFSe.Vlr_Cofins > 0 || NFSe.Vlr_CSLL > 0)) { descricaoImpostosNFSe += descricaoImpostosNFSe != "" ? " / " : ""; descricaoImpostosNFSe += String.Format( "PIS: {0:P2} - Vlr: R${1:0.00} / COFINS: {2:P2} - Vlr: R${3:0.00} / CSLL: {4:P2} - Vlr: R${5:0.00}", ((NFSe.Vlr_PIS / NFSe.Vlr_Total)), (NFSe.Vlr_PIS), ((NFSe.Vlr_Cofins / NFSe.Vlr_Total)), (NFSe.Vlr_Cofins), ((NFSe.Vlr_CSLL / NFSe.Vlr_Total)), (NFSe.Vlr_CSLL) ); } if (NFSe.Deducao_INSS == 0 && NFSe.ExcFiscal_INSS == 1 && NFSe.Vlr_INSS > 0) { descricaoImpostosNFSe += descricaoImpostosNFSe != "" ? " / " : ""; descricaoImpostosNFSe += String.Format("IR: {0:P2} - Vlr: R${1:0.00}", ((NFSe.Vlr_INSS / NFSe.Vlr_Total)), (NFSe.Vlr_INSS)); } } return descricaoImpostosNFSe != "" ? " - Impostos Retidos Nesta Nota Fiscal: " + descricaoImpostosNFSe : ""; } } } 6388-lista-nfse-ger.json 6388-lista-nfse-ger-soap.json 6388-ger-nfse.json 6388-ger-nfse-soap.json NFSe.xml
Recommended Posts
Crie uma conta ou entre para comentar
Você precisar ser um membro para fazer um comentário
Criar uma conta
Crie uma nova conta em nossa comunidade. É fácil!
Crie uma nova contaEntrar
Já tem uma conta? Faça o login.
Entrar Agora