diff --git a/src/OpenAC.Net.NFSe/OpenAC.Net.NFSe.csproj b/src/OpenAC.Net.NFSe/OpenAC.Net.NFSe.csproj index 37ef7255..6176d8f0 100644 --- a/src/OpenAC.Net.NFSe/OpenAC.Net.NFSe.csproj +++ b/src/OpenAC.Net.NFSe/OpenAC.Net.NFSe.csproj @@ -184,6 +184,10 @@ True content\Schemas\WebISS2 + + True + content\Schemas\PVH + @@ -279,6 +283,9 @@ Always + + Always + \ No newline at end of file diff --git a/src/OpenAC.Net.NFSe/Providers/NFSeProvider.cs b/src/OpenAC.Net.NFSe/Providers/NFSeProvider.cs index 11e99e3e..8b3467d3 100644 --- a/src/OpenAC.Net.NFSe/Providers/NFSeProvider.cs +++ b/src/OpenAC.Net.NFSe/Providers/NFSeProvider.cs @@ -111,6 +111,9 @@ public enum NFSeProvider : sbyte WebIss = 10, [Description("WebIss v2")] - WebIss2 = 11 + WebIss2 = 11, + + [Description("Porto Velho")] + PVH = 32 } } \ No newline at end of file diff --git a/src/OpenAC.Net.NFSe/Providers/ProviderManager.cs b/src/OpenAC.Net.NFSe/Providers/ProviderManager.cs index 83b168e4..30589425 100644 --- a/src/OpenAC.Net.NFSe/Providers/ProviderManager.cs +++ b/src/OpenAC.Net.NFSe/Providers/ProviderManager.cs @@ -37,6 +37,7 @@ using OpenAC.Net.Core; using OpenAC.Net.Core.Extensions; using OpenAC.Net.NFSe.Configuracao; +using OpenAC.Net.NFSe.Providers.Pvh; namespace OpenAC.Net.NFSe.Providers { @@ -83,7 +84,8 @@ static ProviderManager() {NFSeProvider.SystemPro, typeof(ProviderSystemPro)}, {NFSeProvider.Americana, typeof(ProviderAmericana)}, {NFSeProvider.SigissWeb, typeof(ProviderSigissWeb)}, - {NFSeProvider.RLZ, typeof(ProviderRLZ)} + {NFSeProvider.RLZ, typeof(ProviderRLZ)}, + {NFSeProvider.PVH, typeof(ProviderPvh)} }; Load(); diff --git a/src/OpenAC.Net.NFSe/Providers/Pvh/ProviderPvh.cs b/src/OpenAC.Net.NFSe/Providers/Pvh/ProviderPvh.cs new file mode 100644 index 00000000..cec3d872 --- /dev/null +++ b/src/OpenAC.Net.NFSe/Providers/Pvh/ProviderPvh.cs @@ -0,0 +1,133 @@ +using OpenAC.Net.Core.Extensions; +using OpenAC.Net.DFe.Core.Serializer; +using OpenAC.Net.NFSe.Configuracao; +using OpenAC.Net.NFSe.Nota; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Xml.Linq; + +namespace OpenAC.Net.NFSe.Providers.Pvh +{ + internal sealed class ProviderPvh : ProviderABRASF203 + { + + #region Constructors + public ProviderPvh(ConfigNFSe config, OpenMunicipioNFSe municipio) : base(config, municipio) + { + Name = "PVH"; + } + + #endregion + + #region Methods + protected override IServiceClient GetClient(TipoUrl tipo) + { + return new PvhServiceClient(this, tipo); + } + #endregion + + protected override XElement WriteValoresRps(NotaServico nota) + { + var valores = new XElement("Valores"); + + valores.AddChild(AdicionarTag(TipoCampo.De2, "", "ValorServicos", 1, 15, Ocorrencia.Obrigatoria, nota.Servico.Valores.ValorServicos)); + valores.AddChild(AdicionarTag(TipoCampo.De2, "", "ValorDeducoes", 1, 15, Ocorrencia.MaiorQueZero, nota.Servico.Valores.ValorDeducoes)); + valores.AddChild(AdicionarTag(TipoCampo.De2, "", "ValorPis", 1, 15, Ocorrencia.MaiorQueZero, nota.Servico.Valores.ValorPis)); + valores.AddChild(AdicionarTag(TipoCampo.De2, "", "ValorCofins", 1, 15, Ocorrencia.MaiorQueZero, nota.Servico.Valores.ValorCofins)); + valores.AddChild(AdicionarTag(TipoCampo.De2, "", "ValorInss", 1, 15, Ocorrencia.MaiorQueZero, nota.Servico.Valores.ValorInss)); + valores.AddChild(AdicionarTag(TipoCampo.De2, "", "ValorIr", 1, 15, Ocorrencia.MaiorQueZero, nota.Servico.Valores.ValorIr)); + valores.AddChild(AdicionarTag(TipoCampo.De2, "", "ValorCsll", 1, 15, Ocorrencia.MaiorQueZero, nota.Servico.Valores.ValorCsll)); + valores.AddChild(AdicionarTag(TipoCampo.De2, "", "OutrasRetencoes", 1, 15, Ocorrencia.MaiorQueZero, nota.Servico.Valores.OutrasRetencoes)); + valores.AddChild(AdicionarTag(TipoCampo.De2, "", "ValTotTributos", 1, 15, Ocorrencia.MaiorQueZero, nota.Servico.Valores.ValTotTributos)); + valores.AddChild(AdicionarTag(TipoCampo.De2, "", "ValorIss", 1, 15, Ocorrencia.MaiorQueZero, nota.Servico.Valores.ValorIss)); + + valores.AddChild(AdicionarTag(TipoCampo.De2, "", "Aliquota", 1, 5, Ocorrencia.MaiorQueZero, nota.Servico.Valores.Aliquota)); + valores.AddChild(AdicionarTag(TipoCampo.De2, "", "DescontoIncondicionado", 1, 15, Ocorrencia.MaiorQueZero, nota.Servico.Valores.DescontoIncondicionado)); + valores.AddChild(AdicionarTag(TipoCampo.De2, "", "DescontoCondicionado", 1, 15, Ocorrencia.MaiorQueZero, nota.Servico.Valores.DescontoCondicionado)); + + return valores; + } + + protected override XElement WriteRps(NotaServico nota) + { + var rootRps = new XElement("Rps"); + + var infServico = new XElement("InfDeclaracaoPrestacaoServico", new XAttribute("Id", $"R{nota.IdentificacaoRps.Numero.OnlyNumbers()}")); + rootRps.Add(infServico); + + infServico.Add(WriteRpsRps(nota)); + + infServico.AddChild(AdicionarTag(TipoCampo.Dat, "", "Competencia", 10, 10, Ocorrencia.Obrigatoria, nota.Competencia)); + + infServico.AddChild(WriteServicosRps(nota)); + infServico.AddChild(WritePrestadorRps(nota)); + infServico.AddChild(WriteTomadorRps(nota)); + infServico.AddChild(WriteIntermediarioRps(nota)); + infServico.AddChild(WriteConstrucaoCivilRps(nota)); + + string regimeEspecialTributacao; + string optanteSimplesNacional; + + if (nota.RegimeEspecialTributacao == RegimeEspecialTributacao.SimplesNacional) + { + regimeEspecialTributacao = "1"; + optanteSimplesNacional = "1"; + } + else + { + var regime = nota.RegimeEspecialTributacao; + + switch (regime) + { + //case RegimeEspecialTributacao.Nenhum: + // regimeEspecialTributacao = ""; + // break; + case RegimeEspecialTributacao.MicroEmpresaMunicipal: + regimeEspecialTributacao = "5"; + break; + case RegimeEspecialTributacao.Estimativa: + regimeEspecialTributacao = "2"; + break; + case RegimeEspecialTributacao.SociedadeProfissionais: + regimeEspecialTributacao = "3"; + break; + case RegimeEspecialTributacao.Cooperativa: + regimeEspecialTributacao = "4"; + break; + case RegimeEspecialTributacao.MicroEmpresarioIndividual: + regimeEspecialTributacao = "7"; + break; + case RegimeEspecialTributacao.MicroEmpresarioEmpresaPP: + regimeEspecialTributacao = "6"; + break; + //case RegimeEspecialTributacao.LucroReal: + // regimeEspecialTributacao = ""; + // break; + //case RegimeEspecialTributacao.LucroPresumido: + // regimeEspecialTributacao = ""; + // break; + //case RegimeEspecialTributacao.SimplesNacional: + // regimeEspecialTributacao = ""; + // break; + default: + regimeEspecialTributacao = "1"; + break; + } + //regimeEspecialTributacao = ((int)nota.RegimeEspecialTributacao).ToString(); + optanteSimplesNacional = "2"; + } + + //if (nota.RegimeEspecialTributacao != RegimeEspecialTributacao.Nenhum) + // infServico.AddChild(AdicionarTag(TipoCampo.Int, "", "RegimeEspecialTributacao", 1, 1, Ocorrencia.NaoObrigatoria, regimeEspecialTributacao)); + + infServico.AddChild(AdicionarTag(TipoCampo.Int, "", "RegimeEspecialTributacao", 1, 1, Ocorrencia.NaoObrigatoria, regimeEspecialTributacao)); + infServico.AddChild(AdicionarTag(TipoCampo.Int, "", "OptanteSimplesNacional", 1, 1, Ocorrencia.Obrigatoria, optanteSimplesNacional)); + infServico.AddChild(AdicionarTag(TipoCampo.Int, "", "IncentivoFiscal", 1, 1, Ocorrencia.Obrigatoria, nota.IncentivadorCultural == NFSeSimNao.Sim ? 1 : 2)); + + return rootRps; + } + } +} diff --git a/src/OpenAC.Net.NFSe/Providers/Pvh/PvhServiceClient.cs b/src/OpenAC.Net.NFSe/Providers/Pvh/PvhServiceClient.cs new file mode 100644 index 00000000..0949cd36 --- /dev/null +++ b/src/OpenAC.Net.NFSe/Providers/Pvh/PvhServiceClient.cs @@ -0,0 +1,155 @@ +using OpenAC.Net.Core.Extensions; +using OpenAC.Net.DFe.Core; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Xml.Linq; + +namespace OpenAC.Net.NFSe.Providers.Pvh +{ + internal sealed class PvhServiceClient : NFSeSoapServiceClient, IServiceClient + { + public PvhServiceClient(ProviderPvh provider, TipoUrl tipoUrl) : base(provider, tipoUrl, SoapVersion.Soap11) + { + } + + #region Constructors + + #endregion + + #region Methods + public string CancelarNFSe(string cabec, string msg) + { + var message = new StringBuilder(); + message.Append(""); + message.Append(""); + message.AppendCData(cabec); + message.Append(""); + message.Append(""); + message.AppendCData(msg); + message.Append(""); + message.Append(""); + return Execute("CancelarNfseEnvio", message.ToString(), "CancelarNfseResponse"); + } + + public string CancelarNFSeLote(string cabec, string msg) + { + throw new NotImplementedException(); + } + + public string ConsultarLoteRps(string cabec, string msg) + { + var message = new StringBuilder(); + message.Append(""); + message.Append(""); + message.AppendCData(cabec); + message.Append(""); + message.Append(""); + message.AppendCData(msg); + message.Append(""); + message.Append(""); + return Execute("ConsultarLoteRpsEnvio", message.ToString(), "ConsultarLoteRpsResponse"); + } + + public string ConsultarNFSe(string cabec, string msg) + { + var message = new StringBuilder(); + message.Append(""); + message.Append(""); + message.AppendCData(cabec); + message.Append(""); + message.Append(""); + message.AppendCData(msg); + message.Append(""); + message.Append(""); + return Execute("ConsultarNfseServicoPrestadoEnvio", message.ToString(), "ConsultarNfseServicoPrestadoResponse"); + } + + public string ConsultarNFSeRps(string cabec, string msg) + { + var message = new StringBuilder(); + message.Append(""); + message.Append(""); + message.AppendCData(cabec); + message.Append(""); + message.Append(""); + message.AppendCData(msg); + message.Append(""); + message.Append(""); + return Execute("ConsultarNfseRpsEnvio", message.ToString(), "ConsultarNfsePorRpsResponse"); + } + + public string ConsultarSequencialRps(string cabec, string msg) + { + throw new NotImplementedException(); + } + + public string ConsultarSituacao(string cabec, string msg) + { + throw new NotImplementedException(); + } + + public string Enviar(string cabec, string msg) + { + var message = new StringBuilder(); + message.Append(""); + message.Append(""); + message.AppendCData(cabec); + message.Append(""); + message.Append(""); + message.AppendCData(msg); + message.Append(""); + message.Append(""); + return Execute("EnviarLoteRpsEnvio", message.ToString(), "RecepcionarLoteRpsResponse"); + } + + public string EnviarSincrono(string cabec, string msg) + { + var message = new StringBuilder(); + message.Append(""); + message.Append(""); + message.AppendCData(cabec); + message.Append(""); + message.Append(""); + message.AppendCData(msg); + message.Append(""); + message.Append(""); + return Execute("EnviarLoteRpsSincronoEnvio", message.ToString(), "RecepcionarLoteRpsSincronoResponse"); + } + + public string SubstituirNFSe(string cabec, string msg) + { + var message = new StringBuilder(); + message.Append(""); + message.Append(""); + message.AppendCData(cabec); + message.Append(""); + message.Append(""); + message.AppendCData(msg); + message.Append(""); + message.Append(""); + return Execute("SubstituirNfseEnvio", message.ToString(), "SubstituirNfseResponse"); + } + + protected override string TratarRetorno(XElement xmlDocument, string[] responseTag) + { + var element = xmlDocument.ElementAnyNs("Fault"); + if (element != null) + { + var exMessage = $"{element.ElementAnyNs("faultcode").GetValue()} - {element.ElementAnyNs("faultstring").GetValue()}"; + throw new OpenDFeCommunicationException(exMessage); + } + return xmlDocument.ElementAnyNs(responseTag[0]).ElementAnyNs("outputXML").Value; + } + + private string Execute(string soapAction, string message, string responseTag) + { + return Execute(soapAction, message, "", responseTag, "xmlns:nfse=\"http://nfse.abrasf.org.br\""); + } + + + #endregion + } +}