Skip to content

Commit 254b511

Browse files
authored
Merge pull request #157 from lunasoft/feature/ss759
Feature/ss759
2 parents 35329e8 + 9be55c3 commit 254b511

File tree

14 files changed

+176
-36
lines changed

14 files changed

+176
-36
lines changed

README.md

+60
Original file line numberDiff line numberDiff line change
@@ -1956,6 +1956,66 @@ namespace ExampleSDK
19561956
}
19571957
}
19581958
```
1959+
**Ejemplo de consumo de la librería para validar el XML pero no consultar su estatus en el SAT mediante usuario y contraseña**
1960+
```cs
1961+
using System;
1962+
using System.IO;
1963+
using System.Text;
1964+
using SW.Helpers;
1965+
using SW.Services.Validate;
1966+
namespace ExampleSDK
1967+
{
1968+
class Program
1969+
{
1970+
static void Main(string[] args)
1971+
{
1972+
try
1973+
{
1974+
//Creamos una instancia de tipo Validate
1975+
//A esta le pasamos la Url, Usuario y Contraseña para obtener el token
1976+
//Automaticamente despues de obtenerlo se procedera a validar el XML
1977+
Validate validate = new Validate ("http://services.test.sw.com.mx", "user", "password");
1978+
var xml = GetXml(build);
1979+
ValidateXmlResponse response = validate.ValidateXml(xml, false);
1980+
//Para iterar la lista sobre la validacion estructura
1981+
List<Detail> detail1 = response.detail;
1982+
Console.Write("Status: "+response.status);
1983+
Console.Write("\ndetail: ");
1984+
foreach (var i in detail1)
1985+
{
1986+
foreach(var j in i.detail)
1987+
{
1988+
Console.Write("\n\tdetail: ");
1989+
Console.Write("\n\t\tMessage: "+ j.message);
1990+
Console.Write("\n\t\tMessageDetail: "+ j.messageDetail);
1991+
TextBoxOut.AppendText("\n\t\tType: "+ j.type);
1992+
}
1993+
Console.Write("\n\tSection: \n"+ i.section);
1994+
}
1995+
//Para obtener la cadena original SAT
1996+
Console.Write(response.cadenaOriginalSAT + "\n");
1997+
//Para obtener la cadena original del comprobante
1998+
Console.Write(response.cadenaOriginalComprobante + "\n");
1999+
//Para obtener el uuid
2000+
Console.Write(response.uuid + "\n");
2001+
//Para obtener el status SAT
2002+
Console.Write(response.statusSat + "\n");
2003+
//Para obtener el status code SAT
2004+
Console.Write(response.statusCodeSat + "\n");
2005+
//En caso de error se pueden consultar los siguientes campos
2006+
Console.WriteLine(response.message);
2007+
Console.WriteLine(response.messageDetail);
2008+
}
2009+
catch (Exception e)
2010+
{
2011+
Console.WriteLine(e.Message);
2012+
}
2013+
}
2014+
}
2015+
}
2016+
```
2017+
:pushpin: ***NOTA:*** Este método permite validar la estructura del XML pero no su estatus en SAT, optimizando tiempos. En los atributos como
2018+
"statusSat" y "statusCodeSat" se obtendra un "No Aplica".
19592019
</details>
19602020

19612021
## PDF ##

SW-sdk-45/Properties/AssemblyInfo.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,5 @@
3232
// You can specify all the values or you can default the Build and Revision Numbers
3333
// by using the '*' as shown below:
3434
// [assembly: AssemblyVersion("1.0.*")]
35-
[assembly: AssemblyVersion("0.0.30.1")]
36-
[assembly: AssemblyFileVersion("0.0.30.1")]
35+
[assembly: AssemblyVersion("0.0.31.1")]
36+
[assembly: AssemblyFileVersion("0.0.31.1")]

SW-sdk-45/Services/Validate/BaseValidate.cs

+7-9
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,20 @@
33
using System.Collections.Generic;
44
using System.Linq;
55
using System.Text;
6+
using System.ServiceModel.Activation;
7+
using System.Net.NetworkInformation;
68

79
namespace SW.Services.Validate
810
{
911
public abstract class BaseValidate : ValidateService
1012
{
11-
private string _operation;
12-
public BaseValidate(string url, string user, string password, string operation, string proxy, int proxyPort) : base(url, user, password, proxy, proxyPort)
13+
public BaseValidate(string url, string user, string password, string proxy, int proxyPort) : base(url, user, password, proxy, proxyPort)
1314
{
14-
_operation = operation;
1515
}
16-
public BaseValidate(string url, string token, string operation, string proxy, int proxyPort) : base(url, token, proxy, proxyPort)
16+
public BaseValidate(string url, string token, string proxy, int proxyPort) : base(url, token, proxy, proxyPort)
1717
{
18-
_operation = operation;
1918
}
20-
public virtual ValidateXmlResponse ValidateXml(string XML)
19+
public virtual ValidateXmlResponse ValidateXml(string XML, bool? status=true)
2120
{
2221
ValidateXmlResponseHandler handler = new ValidateXmlResponseHandler();
2322
try
@@ -26,9 +25,8 @@ public virtual ValidateXmlResponse ValidateXml(string XML)
2625
var headers = GetHeaders();
2726
var content = GetMultipartContent(xmlBytes);
2827
var proxy = Helpers.RequestHelper.ProxySettings(this.Proxy, this.ProxyPort);
29-
return handler.GetPostResponse(this.Url,
30-
string.Format("validate/cfdi33/",
31-
_operation), headers, content, proxy);
28+
string path = (status == false) ? "validate/cfdi?validatestatus=false" : "validate/cfdi";
29+
return handler.GetPostResponse(this.Url,path, headers, content, proxy);
3230
}
3331
catch (Exception ex)
3432
{

SW-sdk-45/Services/Validate/Validate.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ namespace SW.Services.Validate
66
{
77
public class Validate : BaseValidate
88
{
9-
public Validate(string url, string user, string password, int proxyPort = 0, string proxy = null) : base(url, user, password, "validate", proxy, proxyPort)
9+
public Validate(string url, string user, string password, int proxyPort = 0, string proxy = null) : base(url, user, password, proxy, proxyPort)
1010
{
1111
}
12-
public Validate(string url, string token, int proxyPort = 0, string proxy = null) : base(url, token, "validate", proxy, proxyPort)
12+
public Validate(string url, string token, int proxyPort = 0, string proxy = null) : base(url, token, proxy, proxyPort)
1313
{
1414
}
1515
}

SW-sdk/Properties/AssemblyInfo.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,5 @@
3232
// You can specify all the values or you can default the Build and Revision Numbers
3333
// by using the '*' as shown below:
3434
// [assembly: AssemblyVersion("1.0.*")]
35-
[assembly: AssemblyVersion("0.0.30.1")]
36-
[assembly: AssemblyFileVersion("0.0.30.1")]
35+
[assembly: AssemblyVersion("0.0.31.1")]
36+
[assembly: AssemblyFileVersion("0.0.31.1")]

SW-sdk/Services/Validate/BaseValidate.cs

+4-7
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,19 @@ namespace SW.Services.Validate
88
{
99
public abstract class BaseValidate : ValidateService
1010
{
11-
private string _operation;
12-
public BaseValidate(string url, string user, string password, string operation, string proxy, int proxyPort) : base(url, user, password, proxy, proxyPort)
11+
public BaseValidate(string url, string user, string password, string proxy, int proxyPort) : base(url, user, password, proxy, proxyPort)
1312
{
14-
_operation = operation;
1513
}
16-
public BaseValidate(string url, string token, string operation, string proxy, int proxyPort) : base(url, token, proxy, proxyPort)
14+
public BaseValidate(string url, string token, string proxy, int proxyPort) : base(url, token, proxy, proxyPort)
1715
{
18-
_operation = operation;
1916
}
20-
public virtual ValidateXMLResponse ValidateXML(string XML)
17+
public virtual ValidateXMLResponse ValidateXML(string XML, bool? Status = true)
2118
{
2219
ValidateXMLResponseHandler handler = new ValidateXMLResponseHandler();
2320
try
2421
{
2522
var xmlBytes = Encoding.UTF8.GetBytes(XML);
26-
var request = this.RequestValidateXml(xmlBytes);
23+
var request = this.RequestValidateXml(xmlBytes,Status);
2724
return handler.GetResponse(request);
2825
}
2926
catch (Exception ex)

SW-sdk/Services/Validate/Validate.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ namespace SW.Services.Validate
66
{
77
public class Validate : BaseValidate
88
{
9-
public Validate(string url, string user, string password, int proxyPort = 0, string proxy=null) : base(url, user, password, "validate", proxy, proxyPort)
9+
public Validate(string url, string user, string password, int proxyPort = 0, string proxy=null) : base(url, user, password, proxy, proxyPort)
1010
{
1111
}
12-
public Validate(string url, string token, int proxyPort = 0, string proxy = null) : base(url, token, "validate", proxy, proxyPort)
12+
public Validate(string url, string token, int proxyPort = 0, string proxy = null) : base(url, token, proxy, proxyPort)
1313
{
1414
}
1515
}

SW-sdk/Services/Validate/ValidateService.cs

+3-2
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,11 @@ protected ValidateService(string url, string user, string password, string proxy
1414
protected ValidateService(string url, string token, string proxy, int proxyPort) : base(url, token, proxy, proxyPort)
1515
{
1616
}
17-
internal virtual HttpWebRequest RequestValidateXml(byte[] xml)
17+
internal virtual HttpWebRequest RequestValidateXml(byte[] xml, bool? status = true)
1818
{
1919
this.SetupRequest();
20-
var request = (HttpWebRequest)WebRequest.Create(this.Url + "/validate/cfdi33");
20+
string path = (status == false) ? "validate/cfdi?validatestatus=false" : "validate/cfdi";
21+
var request = (HttpWebRequest)WebRequest.Create(this.Url + path);
2122
request.Method = WebRequestMethods.Http.Post;
2223
request.Headers.Add(HttpRequestHeader.Authorization.ToString(), "bearer " + this.Token);
2324
request.ContentLength = xml != null ? xml.Length : 0;
+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<cfdi:Comprobante xsi:schemaLocation="http://www.sat.gob.mx/cfd/4 http://www.sat.gob.mx/sitio_internet/cfd/4/cfdv40.xsd" Version="4.0" Serie="SW" Folio="123456" Fecha="2024-04-29T00:00:00" Sello="mCvBiMAejE88ZAaOq01cdiZv+mD6lCG04keed7Gr2RJzJPdZvKJ4vQmKo7b1pHkQVJ4vSlEk/4kqp4kYfAApmVR8A4r1Oaz8MehtOni7fAKJVE1tyf02SN9Jqb/sh8UzKV491pSIKp1Dc3G1hQ3KeLxcHXy7e6Dh7GB9MJqWtZp149lG9C2FzqQrRw1kXDoCIX3WgyBu8D7ycs4JsMSmyz7d0apvOEekFbD9oM0QDyBklwFmTcYkLXMWVBNSCHXs7z/HxqhBYfxyWg+5lpVKFRPlAg3cP85Bw8y0Cv4MfJO+EKA9+iwMyowlJTkQnNDuba/BsvRT7tGoOgmeN/X5Ww==" FormaPago="01" NoCertificado="30001000000500003416" Certificado="MIIFsDCCA5igAwIBAgIUMzAwMDEwMDAwMDA1MDAwMDM0MTYwDQYJKoZIhvcNAQELBQAwggErMQ8wDQYDVQQDDAZBQyBVQVQxLjAsBgNVBAoMJVNFUlZJQ0lPIERFIEFETUlOSVNUUkFDSU9OIFRSSUJVVEFSSUExGjAYBgNVBAsMEVNBVC1JRVMgQXV0aG9yaXR5MSgwJgYJKoZIhvcNAQkBFhlvc2Nhci5tYXJ0aW5lekBzYXQuZ29iLm14MR0wGwYDVQQJDBQzcmEgY2VycmFkYSBkZSBjYWxpejEOMAwGA1UEEQwFMDYzNzAxCzAJBgNVBAYTAk1YMRkwFwYDVQQIDBBDSVVEQUQgREUgTUVYSUNPMREwDwYDVQQHDAhDT1lPQUNBTjERMA8GA1UELRMIMi41LjQuNDUxJTAjBgkqhkiG9w0BCQITFnJlc3BvbnNhYmxlOiBBQ0RNQS1TQVQwHhcNMjMwNTE4MTE0MzUxWhcNMjcwNTE4MTE0MzUxWjCB1zEnMCUGA1UEAxMeRVNDVUVMQSBLRU1QRVIgVVJHQVRFIFNBIERFIENWMScwJQYDVQQpEx5FU0NVRUxBIEtFTVBFUiBVUkdBVEUgU0EgREUgQ1YxJzAlBgNVBAoTHkVTQ1VFTEEgS0VNUEVSIFVSR0FURSBTQSBERSBDVjElMCMGA1UELRMcRUtVOTAwMzE3M0M5IC8gVkFEQTgwMDkyN0RKMzEeMBwGA1UEBRMVIC8gVkFEQTgwMDkyN0hTUlNSTDA1MRMwEQYDVQQLEwpTdWN1cnNhbCAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtmecO6n2GS0zL025gbHGQVxznPDICoXzR2uUngz4DqxVUC/w9cE6FxSiXm2ap8Gcjg7wmcZfm85EBaxCx/0J2u5CqnhzIoGCdhBPuhWQnIh5TLgj/X6uNquwZkKChbNe9aeFirU/JbyN7Egia9oKH9KZUsodiM/pWAH00PCtoKJ9OBcSHMq8Rqa3KKoBcfkg1ZrgueffwRLws9yOcRWLb02sDOPzGIm/jEFicVYt2Hw1qdRE5xmTZ7AGG0UHs+unkGjpCVeJ+BEBn0JPLWVvDKHZAQMj6s5Bku35+d/MyATkpOPsGT/VTnsouxekDfikJD1f7A1ZpJbqDpkJnss3vQIDAQABox0wGzAMBgNVHRMBAf8EAjAAMAsGA1UdDwQEAwIGwDANBgkqhkiG9w0BAQsFAAOCAgEAFaUgj5PqgvJigNMgtrdXZnbPfVBbukAbW4OGnUhNrA7SRAAfv2BSGk16PI0nBOr7qF2mItmBnjgEwk+DTv8Zr7w5qp7vleC6dIsZFNJoa6ZndrE/f7KO1CYruLXr5gwEkIyGfJ9NwyIagvHHMszzyHiSZIA850fWtbqtythpAliJ2jF35M5pNS+YTkRB+T6L/c6m00ymN3q9lT1rB03YywxrLreRSFZOSrbwWfg34EJbHfbFXpCSVYdJRfiVdvHnewN0r5fUlPtR9stQHyuqewzdkyb5jTTw02D2cUfL57vlPStBj7SEi3uOWvLrsiDnnCIxRMYJ2UA2ktDKHk+zWnsDmaeleSzonv2CHW42yXYPCvWi88oE1DJNYLNkIjua7MxAnkNZbScNw01A6zbLsZ3y8G6eEYnxSTRfwjd8EP4kdiHNJftm7Z4iRU7HOVh79/lRWB+gd171s3d/mI9kte3MRy6V8MMEMCAnMboGpaooYwgAmwclI2XZCczNWXfhaWe0ZS5PmytD/GDpXzkX0oEgY9K/uYo5V77NdZbGAjmyi8cE2B2ogvyaN2XfIInrZPgEffJ4AB7kFA2mwesdLOCh0BLD9itmCve3A1FGR4+stO2ANUoiI3w3Tv2yQSg4bjeDlJ08lXaaFCLW2peEXMXjQUk7fmpb5MNuOUTW6BE=" CondicionesDePago="CondicionesDePago" SubTotal="10.00" Descuento="0.00" Moneda="MXN" Total="10.00" TipoDeComprobante="I" Exportacion="01" MetodoPago="PUE" LugarExpedicion="45610"
3+
xmlns:cfdi="http://www.sat.gob.mx/cfd/4"
4+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
5+
<cfdi:Emisor Rfc="EKU9003173C9" Nombre="ESCUELA KEMPER URGATE" RegimenFiscal="603" />
6+
<cfdi:Receptor Rfc="URE180429TM6" Nombre="UNIVERSIDAD ROBOTICA ESPAÑOLA" DomicilioFiscalReceptor="86991" RegimenFiscalReceptor="601" UsoCFDI="CP01" />
7+
<cfdi:Conceptos>
8+
<cfdi:Concepto ClaveProdServ="50211503" NoIdentificacion="None" Cantidad="1.0" ClaveUnidad="H87" Unidad="Pieza" Descripcion="Cigarros" ValorUnitario="10.00" Importe="10.00" Descuento="0.00" ObjetoImp="01" />
9+
</cfdi:Conceptos>
10+
<cfdi:Complemento>
11+
<tfd:TimbreFiscalDigital xsi:schemaLocation="http://www.sat.gob.mx/TimbreFiscalDigital http://www.sat.gob.mx/sitio_internet/cfd/TimbreFiscalDigital/TimbreFiscalDigitalv11.xsd" Version="1.1" UUID="d3db1e48-4d81-41dd-834a-f43e926626f4" FechaTimbrado="2024-04-29T11:15:58" RfcProvCertif="SPR190613I52" SelloCFD="mCvBiMAejE88ZAaOq01cdiZv+mD6lCG04keed7Gr2RJzJPdZvKJ4vQmKo7b1pHkQVJ4vSlEk/4kqp4kYfAApmVR8A4r1Oaz8MehtOni7fAKJVE1tyf02SN9Jqb/sh8UzKV491pSIKp1Dc3G1hQ3KeLxcHXy7e6Dh7GB9MJqWtZp149lG9C2FzqQrRw1kXDoCIX3WgyBu8D7ycs4JsMSmyz7d0apvOEekFbD9oM0QDyBklwFmTcYkLXMWVBNSCHXs7z/HxqhBYfxyWg+5lpVKFRPlAg3cP85Bw8y0Cv4MfJO+EKA9+iwMyowlJTkQnNDuba/BsvRT7tGoOgmeN/X5Ww==" NoCertificadoSAT="30001000000500003456" SelloSAT="cIkI880UREczt2NMAbDiUCslhJAWUvLUjJDOvSzD1Yr//igqnz9fKzM/RptByQpdxfXhS8nxeIJITCrfPalbtr2sqMfj9DhGGNwtlu2qkY0RBFxrOdjMA5uWWpwB5H5gLWjv8TOfIZxF+xknRq3qSdrpCnKFhK1SFScWIkjxcIJYIU64A8wToqZresLnh8yU0e23qUQ+/9kP/4PF5FeYB1Qf6NqBT6Yh32koDRLYXDKJmsHGYhakSWOm0WDFQ+TfnV5/Fmn34+dC/uZfmMYhR29Uc4WVhu35baQvtLRkDN9Z5GX7KoCSoq4cHDaLWbDCt8EYWUrdBPFKdQHAVcNJeA=="
12+
xmlns:tfd="http://www.sat.gob.mx/TimbreFiscalDigital"
13+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
14+
</cfdi:Complemento>
15+
</cfdi:Comprobante>

Test_SW-sdk-45/Services/Validate/Validate_UT.cs

+30-6
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
using System;
22
using System.Text;
3-
using System.Collections.Generic;
4-
using SW.Helpers;
53
using SW.Services.Validate;
64
using Test_SW.Helpers;
75
using Microsoft.VisualStudio.TestTools.UnitTesting;
@@ -19,9 +17,35 @@ public void ValidateXML_UT_Ok()
1917
Validate validate = new Validate(build.Url, build.User, build.Password);
2018
var xml = GetXml(build);
2119
ValidateXmlResponse response = validate.ValidateXml(xml.ToString());
22-
Assert.IsTrue(response.status == "success"
23-
&& !string.IsNullOrEmpty(response.statusCodeSat), "N - 601: La expresión impresa proporcionada no es válida.");
20+
Assert.IsTrue(response.status == "success");
21+
Assert.IsTrue(response.statusSat == "Vigente");
22+
Assert.IsTrue(response.statusCodeSat == "S - Comprobante obtenido satisfactoriamente");
2423
}
24+
25+
[TestMethod]
26+
public void ValidateXML_UT_Ok_With_Status()
27+
{
28+
var build = new BuildSettings();
29+
Validate validate = new Validate(build.Url, build.User, build.Password);
30+
var xml = GetXml(build);
31+
ValidateXmlResponse response = validate.ValidateXml(xml.ToString(),true);
32+
Assert.IsTrue(response.status == "success");
33+
Assert.IsTrue(response.statusSat == "Vigente");
34+
Assert.IsTrue(response.statusCodeSat == "S - Comprobante obtenido satisfactoriamente");
35+
}
36+
37+
[TestMethod]
38+
public void ValidateXML_UT_Ok_Without_Status()
39+
{
40+
var build = new BuildSettings();
41+
Validate validate = new Validate(build.Url, build.User, build.Password);
42+
var xml = GetXml(build);
43+
ValidateXmlResponse response = validate.ValidateXml(xml.ToString(),false);
44+
Assert.IsTrue(response.status == "success");
45+
Assert.IsTrue(response.statusSat == "No Aplica");
46+
Assert.IsTrue(response.statusCodeSat == "No Aplica");
47+
}
48+
2549
[TestMethod]
2650
public void Validate_Test_ValidateXMLError()
2751
{
@@ -32,10 +56,10 @@ public void Validate_Test_ValidateXMLError()
3256
Assert.IsTrue(response.status == "error"
3357
&& !string.IsNullOrEmpty(response.status), "Error al leer el documento XML. La estructura del documento no es un Xml valido y/o la codificación del documento no es UTF8. Root element is missing.");
3458
}
59+
3560
private object GetXml(BuildSettings build)
3661
{
37-
var xml = Encoding.UTF8.GetString(File.ReadAllBytes("Resources/cfdi40.xml"));
38-
xml = SignTools.SigXml(xml, Convert.FromBase64String(build.Pfx), build.PfxPassword);
62+
var xml = Encoding.UTF8.GetString(File.ReadAllBytes("Resources/cfdi40_stamp.xml"));
3963
return xml;
4064
}
4165
}

Test_SW-sdk-45/Test_SW-sdk-45.csproj

+3
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,9 @@
130130
<Content Include="Resources\CancelacionXML.xml">
131131
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
132132
</Content>
133+
<Content Include="Resources\cfdi40_stamp.xml">
134+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
135+
</Content>
133136
<Content Include="Resources\cfdi40.xml">
134137
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
135138
</Content>

0 commit comments

Comments
 (0)