|
30 | 30 | // *********************************************************************** |
31 | 31 |
|
32 | 32 | using System; |
| 33 | +using System.Security.Cryptography.X509Certificates; |
33 | 34 | using System.Text; |
34 | 35 | using System.Xml.Linq; |
35 | 36 | using OpenAC.Net.Core.Extensions; |
36 | 37 | using OpenAC.Net.DFe.Core; |
37 | | -using OpenAC.Net.NFSe.Commom; |
38 | 38 | using OpenAC.Net.NFSe.Commom.Client; |
39 | 39 | using OpenAC.Net.NFSe.Commom.Interface; |
40 | 40 | using OpenAC.Net.NFSe.Commom.Types; |
| 41 | +using System.Linq; |
41 | 42 |
|
42 | 43 | namespace OpenAC.Net.NFSe.Providers; |
43 | 44 |
|
44 | 45 | internal sealed class ISSPortoVelhoServiceClient : NFSeSoapServiceClient, IServiceClient |
45 | 46 | { |
46 | 47 | #region Constructors |
47 | 48 |
|
48 | | - public ISSPortoVelhoServiceClient(ProviderISSPortoVelho provider, TipoUrl tipoUrl) : base(provider, tipoUrl, |
49 | | - SoapVersion.Soap11) |
| 49 | + public ISSPortoVelhoServiceClient(ProviderISSPortoVelho provider, TipoUrl tipoUrl, X509Certificate2 certificado) : base(provider, tipoUrl, certificado, SoapVersion.Soap11) |
50 | 50 | { |
51 | 51 | } |
52 | 52 |
|
53 | 53 | #endregion Constructors |
54 | 54 |
|
55 | 55 | #region Methods |
56 | 56 |
|
57 | | - public string CancelarNFSe(string cabec, string msg) |
| 57 | + public string Enviar(string cabec, string msg) |
58 | 58 | { |
59 | 59 | var message = new StringBuilder(); |
60 | | - message.Append("<nfse:CancelarNfseRequest>"); |
61 | | - message.Append("<nfseCabecMsg>"); |
62 | | - message.AppendCData(cabec); |
63 | | - message.Append("</nfseCabecMsg>"); |
64 | | - message.Append("<nfseDadosMsg>"); |
65 | | - message.AppendCData(msg); |
66 | | - message.Append("</nfseDadosMsg>"); |
67 | | - message.Append("</nfse:CancelarNfseRequest>"); |
68 | | - return Execute("CancelarNfseEnvio", message.ToString(), "CancelarNfseResponse"); |
| 60 | + |
| 61 | + message.Append("<nfse:GerarNfse xmlns:nfse=\"http://nfse.abrasf.org.br\">"); |
| 62 | + message.Append("<nfse:GerarNfseRequest>"); |
| 63 | + |
| 64 | + message.Append("<nfseCabecMsg><![CDATA["); |
| 65 | + message.Append(cabec); |
| 66 | + message.Append("]]></nfseCabecMsg>"); |
| 67 | + |
| 68 | + message.Append("<nfseDadosMsg><![CDATA["); |
| 69 | + message.Append(msg); |
| 70 | + message.Append("]]></nfseDadosMsg>"); |
| 71 | + |
| 72 | + message.Append("</nfse:GerarNfseRequest>"); |
| 73 | + message.Append("</nfse:GerarNfse>"); |
| 74 | + |
| 75 | + return Execute("GerarNfse", new[] { "GerarNfseResponse", "outputXML" }, message.ToString()); |
69 | 76 | } |
70 | 77 |
|
71 | | - public string CancelarNFSeLote(string cabec, string msg) |
| 78 | + public string EnviarSincrono(string cabec, string msg) |
| 79 | + { |
| 80 | + throw new NotImplementedException(); |
| 81 | + } |
| 82 | + |
| 83 | + public string ConsultarSituacao(string cabec, string msg) |
72 | 84 | { |
73 | 85 | throw new NotImplementedException(); |
74 | 86 | } |
75 | 87 |
|
76 | 88 | public string ConsultarLoteRps(string cabec, string msg) |
77 | 89 | { |
78 | 90 | var message = new StringBuilder(); |
| 91 | + |
| 92 | + message.Append("<nfse:ConsultarLoteRps xmlns:nfse=\"http://nfse.abrasf.org.br\">"); |
79 | 93 | message.Append("<nfse:ConsultarLoteRpsRequest>"); |
80 | | - message.Append("<nfseCabecMsg>"); |
81 | | - message.AppendCData(cabec); |
82 | | - message.Append("</nfseCabecMsg>"); |
83 | | - message.Append("<nfseDadosMsg>"); |
84 | | - message.AppendCData(msg); |
85 | | - message.Append("</nfseDadosMsg>"); |
| 94 | + |
| 95 | + message.Append("<nfseCabecMsg><![CDATA["); |
| 96 | + message.Append(cabec); |
| 97 | + message.Append("]]></nfseCabecMsg>"); |
| 98 | + |
| 99 | + message.Append("<nfseDadosMsg><![CDATA["); |
| 100 | + message.Append(msg); |
| 101 | + message.Append("]]></nfseDadosMsg>"); |
| 102 | + |
86 | 103 | message.Append("</nfse:ConsultarLoteRpsRequest>"); |
87 | | - return Execute("ConsultarLoteRpsEnvio", message.ToString(), "ConsultarLoteRpsResponse"); |
| 104 | + message.Append("</nfse:ConsultarLoteRps>"); |
| 105 | + |
| 106 | + return Execute("ConsultarLoteRps", new[] { "ConsultarLoteRpsResponse", "outputXML" }, message.ToString()); |
88 | 107 | } |
89 | 108 |
|
90 | | - public string ConsultarNFSe(string cabec, string msg) |
| 109 | + public string ConsultarSequencialRps(string cabec, string msg) |
91 | 110 | { |
92 | | - var message = new StringBuilder(); |
93 | | - message.Append("<nfse:ConsultarNfseServicoPrestadoRequest>"); |
94 | | - message.Append("<nfseCabecMsg>"); |
95 | | - message.AppendCData(cabec); |
96 | | - message.Append("</nfseCabecMsg>"); |
97 | | - message.Append("<nfseDadosMsg>"); |
98 | | - message.AppendCData(msg); |
99 | | - message.Append("</nfseDadosMsg>"); |
100 | | - message.Append("</nfse:ConsultarNfseServicoPrestadoRequest>"); |
101 | | - return Execute("ConsultarNfseServicoPrestadoEnvio", message.ToString(), "ConsultarNfseServicoPrestadoResponse"); |
| 111 | + throw new NotImplementedException(); |
102 | 112 | } |
103 | 113 |
|
104 | 114 | public string ConsultarNFSeRps(string cabec, string msg) |
105 | 115 | { |
106 | 116 | var message = new StringBuilder(); |
| 117 | + |
| 118 | + message.Append("<nfse:ConsultarNfsePorRps xmlns:nfse=\"http://nfse.abrasf.org.br\">"); |
107 | 119 | message.Append("<nfse:ConsultarNfsePorRpsRequest>"); |
108 | | - message.Append("<nfseCabecMsg>"); |
109 | | - message.AppendCData(cabec); |
110 | | - message.Append("</nfseCabecMsg>"); |
111 | | - message.Append("<nfseDadosMsg>"); |
112 | | - message.AppendCData(msg); |
113 | | - message.Append("</nfseDadosMsg>"); |
| 120 | + |
| 121 | + message.Append("<nfseCabecMsg><![CDATA["); |
| 122 | + message.Append(cabec); |
| 123 | + message.Append("]]></nfseCabecMsg>"); |
| 124 | + |
| 125 | + message.Append("<nfseDadosMsg><![CDATA["); |
| 126 | + message.Append(msg); |
| 127 | + message.Append("]]></nfseDadosMsg>"); |
| 128 | + |
114 | 129 | message.Append("</nfse:ConsultarNfsePorRpsRequest>"); |
115 | | - return Execute("ConsultarNfseRpsEnvio", message.ToString(), "ConsultarNfsePorRpsResponse"); |
116 | | - } |
| 130 | + message.Append("</nfse:ConsultarNfsePorRps>"); |
117 | 131 |
|
118 | | - public string ConsultarSequencialRps(string cabec, string msg) |
119 | | - { |
120 | | - throw new NotImplementedException(); |
| 132 | + return Execute("ConsultarNfsePorRps", new[] { "ConsultarNfsePorRpsResponse", "outputXML" }, message.ToString()); |
121 | 133 | } |
122 | 134 |
|
123 | | - public string ConsultarSituacao(string cabec, string msg) |
| 135 | + public string ConsultarNFSe(string cabec, string msg) |
124 | 136 | { |
125 | 137 | throw new NotImplementedException(); |
126 | 138 | } |
127 | 139 |
|
128 | | - public string Enviar(string cabec, string msg) |
| 140 | + public string CancelarNFSe(string cabec, string msg) |
129 | 141 | { |
130 | 142 | var message = new StringBuilder(); |
131 | | - message.Append("<nfse:RecepcionarLoteRpsRequest>"); |
132 | | - message.Append("<nfseCabecMsg>"); |
133 | | - message.AppendCData(cabec); |
134 | | - message.Append("</nfseCabecMsg>"); |
135 | | - message.Append("<nfseDadosMsg>"); |
136 | | - message.AppendCData(msg); |
137 | | - message.Append("</nfseDadosMsg>"); |
138 | | - message.Append("</nfse:RecepcionarLoteRpsRequest>"); |
139 | | - return Execute("EnviarLoteRpsEnvio", message.ToString(), "RecepcionarLoteRpsResponse"); |
| 143 | + |
| 144 | + message.Append("<nfse:CancelarNfse xmlns:nfse=\"http://nfse.abrasf.org.br\">"); |
| 145 | + message.Append("<nfse:CancelarNfseRequest>"); |
| 146 | + |
| 147 | + message.Append("<nfseCabecMsg><![CDATA["); |
| 148 | + message.Append(cabec); |
| 149 | + message.Append("]]></nfseCabecMsg>"); |
| 150 | + |
| 151 | + message.Append("<nfseDadosMsg><![CDATA["); |
| 152 | + message.Append(msg); |
| 153 | + message.Append("]]></nfseDadosMsg>"); |
| 154 | + |
| 155 | + message.Append("</nfse:CancelarNfseRequest>"); |
| 156 | + message.Append("</nfse:CancelarNfse>"); |
| 157 | + |
| 158 | + return Execute("CancelarNfse", new[] { "CancelarNfseResponse", "outputXML" },message.ToString()); |
140 | 159 | } |
141 | 160 |
|
142 | | - public string EnviarSincrono(string cabec, string msg) |
| 161 | + public string CancelarNFSeLote(string cabec, string msg) |
143 | 162 | { |
144 | | - var message = new StringBuilder(); |
145 | | - message.Append("<nfse:RecepcionarLoteRpsSincronoRequest>"); |
146 | | - message.Append("<nfseCabecMsg>"); |
147 | | - message.AppendCData(cabec); |
148 | | - message.Append("</nfseCabecMsg>"); |
149 | | - message.Append("<nfseDadosMsg>"); |
150 | | - message.AppendCData(msg); |
151 | | - message.Append("</nfseDadosMsg>"); |
152 | | - message.Append("</nfse:RecepcionarLoteRpsSincronoRequest>"); |
153 | | - return Execute("EnviarLoteRpsSincronoEnvio", message.ToString(), "RecepcionarLoteRpsSincronoResponse"); |
| 163 | + throw new NotImplementedException(); |
154 | 164 | } |
155 | 165 |
|
156 | 166 | public string SubstituirNFSe(string cabec, string msg) |
157 | 167 | { |
158 | | - var message = new StringBuilder(); |
159 | | - message.Append("<nfse:SubstituirNfseRequest>"); |
160 | | - message.Append("<nfseCabecMsg>"); |
161 | | - message.AppendCData(cabec); |
162 | | - message.Append("</nfseCabecMsg>"); |
163 | | - message.Append("<nfseDadosMsg>"); |
164 | | - message.AppendCData(msg); |
165 | | - message.Append("</nfseDadosMsg>"); |
166 | | - message.Append("</nfse:SubstituirNfseRequest>"); |
167 | | - return Execute("SubstituirNfseEnvio", message.ToString(), "SubstituirNfseResponse"); |
| 168 | + throw new NotImplementedException(); |
| 169 | + } |
| 170 | + |
| 171 | + private string Execute(string soapAction, string[] responseTag, string message) |
| 172 | + { |
| 173 | + return Execute(soapAction, message, "", responseTag, ["xmlns:ws=\"http://nfse.abrasf.org.br\""]); |
168 | 174 | } |
169 | 175 |
|
170 | 176 | protected override string TratarRetorno(XElement xmlDocument, string[] responseTag) |
171 | 177 | { |
172 | | - var element = xmlDocument.ElementAnyNs("Fault"); |
173 | | - if (element != null) |
| 178 | + var fault = xmlDocument.ElementAnyNs("Fault"); |
| 179 | + if (fault != null) |
174 | 180 | { |
175 | | - var exMessage = |
176 | | - $"{element.ElementAnyNs("faultcode").GetValue<string>()} - {element.ElementAnyNs("faultstring").GetValue<string>()}"; |
177 | | - throw new OpenDFeCommunicationException(exMessage); |
| 181 | + var code = fault.ElementAnyNs("faultcode")?.Value; |
| 182 | + var message = fault.ElementAnyNs("faultstring")?.Value; |
| 183 | + throw new OpenDFeCommunicationException($"{code} - {message}"); |
178 | 184 | } |
179 | 185 |
|
180 | | - return xmlDocument.ElementAnyNs(responseTag[0]).ElementAnyNs("outputXML").Value; |
181 | | - } |
| 186 | + var outputXml = xmlDocument |
| 187 | + .Descendants() |
| 188 | + .FirstOrDefault(x => x.Name.LocalName == "outputXML"); |
182 | 189 |
|
183 | | - private string Execute(string soapAction, string message, string responseTag) |
184 | | - { |
185 | | - return Execute(soapAction, message, "", [responseTag], ["xmlns:nfse=\"http://nfse.abrasf.org.br\""]); |
| 190 | + if (outputXml == null) |
| 191 | + throw new OpenDFeCommunicationException("Retorno da NFSe não contém a tag <outputXML>."); |
| 192 | + |
| 193 | + return outputXml.Value; |
186 | 194 | } |
187 | 195 |
|
188 | 196 | #endregion Methods |
|
0 commit comments