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
+ }
+}