diff --git a/README.md b/README.md
index 1f6bf26..82c9a98 100644
--- a/README.md
+++ b/README.md
@@ -28,7 +28,9 @@ Descargas el modulo mediante Maven:
mx.com.sw.services
SW-JAVA
- 0.0.3.3
+
+ 0.0.3.4
+
```
@@ -36,7 +38,9 @@ Descargas el modulo mediante Maven:
Descargar el modulo directamente de los siguientes links:
* [Relase Github](https://github.com/lunasoft/sw-sdk-java/releases)
-* [Maven](https://oss.sonatype.org/service/local/artifact/maven/redirect?r=releases&g=mx.com.sw.services&a=SW-JAVA&v=0.0.3.3&e=jar)
+
+* [Maven](https://oss.sonatype.org/service/local/artifact/maven/redirect?r=releases&g=mx.com.sw.services&a=SW-JAVA&v=0.0.3.4&e=jar)
+
Asi como instalar manualmente cada una de las dependencias:
* [Unirest](http://unirest.io/java.html)
* [org.json](http://www.json.org/java)
diff --git a/SW-JAVA.iml b/SW-JAVA.iml
index e9cf19e..acddec2 100644
--- a/SW-JAVA.iml
+++ b/SW-JAVA.iml
@@ -13,7 +13,7 @@
-
+
@@ -22,7 +22,7 @@
-
+
@@ -31,7 +31,7 @@
-
+
@@ -41,26 +41,18 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 64f497e..ca38f06 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
mx.com.sw.services
SW-JAVA
- 0.0.3.3
+ 0.0.3.4
jar
@@ -167,6 +167,12 @@
juniversalchardet
1.0.3
+
+ org.apache.servicemix.bundles
+ org.apache.servicemix.bundles.not-yet-commons-ssl
+ 0.3.11_1
+
+
diff --git a/src/main/java/Utils/Requests/Stamp/StampRequest.java b/src/main/java/Utils/Requests/Stamp/StampRequest.java
index 6ac9a58..abb516f 100644
--- a/src/main/java/Utils/Requests/Stamp/StampRequest.java
+++ b/src/main/java/Utils/Requests/Stamp/StampRequest.java
@@ -11,10 +11,23 @@
import com.mashape.unirest.http.exceptions.UnirestException;
import com.mashape.unirest.request.body.MultipartBody;
+import org.apache.http.HttpEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.mime.HttpMultipartMode;
+import org.apache.http.entity.mime.MultipartEntity;
+import org.apache.http.entity.mime.content.StringBody;
+import org.apache.http.impl.client.BasicResponseHandler;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
import org.json.JSONException;
import org.json.JSONObject;
+import sun.misc.IOUtils;
import java.io.*;
+import java.nio.charset.Charset;
+import java.util.Scanner;
import java.util.UUID;
public class StampRequest implements IRequestor {
@@ -28,32 +41,43 @@ public IResponse sendRequest(IRequest request) throws GeneralException, AuthExce
String boundary = UUID.randomUUID().toString();
String raw = "--"+boundary+"\r\nContent-Disposition: form-data; name=xml; filename=xml\r\nContent-Type: application/xml\r\n\r\n"+xmlStr+"\r\n--"+boundary+"--";
- Unirest.setTimeouts(60000, 360000);
- HttpResponse response = Unirest.post(request.URI)
- .header("Authorization","bearer "+request.Token)
- .header("content-type","multipart/form-data; boundary="+boundary)
- .body( raw).asJson();
-
-
- if(!response.getBody().toString().equalsIgnoreCase("{}")) {
- JSONObject body = new JSONObject(response.getBody().toString());
- if(response.getStatus()==200){
+ CloseableHttpClient client = HttpClients.createDefault();
+ HttpPost httppost = new HttpPost(request.URI);
+ MultipartEntity entity = new MultipartEntity( HttpMultipartMode.BROWSER_COMPATIBLE );
+ StringBody xmlcfdi = new StringBody(raw, Charset.forName( "UTF-8" ));
+ entity.addPart("xml",xmlcfdi);
+ httppost.setEntity(entity);
+ httppost.setHeader("Authorization", "bearer " + request.Token);
+ httppost.setHeader("Content-Type", "multipart/form-data; boundary="+boundary);
+ httppost.addHeader("Content-Disposition", "form-data; name=xml; filename=xml");
+ CloseableHttpResponse responseB = client.execute(httppost);
+
+ InputStream inputStream = responseB.getEntity().getContent();
+
+ Scanner s = new Scanner(inputStream).useDelimiter("\\A");
+ String responseString = s.hasNext() ? s.next() : "";
+
+ int statusE = responseB.getStatusLine().getStatusCode();
+ client.close();
+ if(!responseString.isEmpty()) {
+ JSONObject body = new JSONObject(responseString);
+ if(statusE==200){
JSONObject data = body.getJSONObject("data");
if (request.version.equalsIgnoreCase("v1")) {
- return new SuccessV1Response(response.getStatus(),body.getString("status"),data.getString("tfd"),"OK","OK");
+ return new SuccessV1Response(statusE,body.getString("status"),data.getString("tfd"),"OK","OK");
}
else if(request.version.equalsIgnoreCase("v2")){
- return new SuccessV2Response(response.getStatus(),body.getString("status"),data.getString("tfd"),data.getString("cfdi"),"OK","OK");
+ return new SuccessV2Response(statusE,body.getString("status"),data.getString("tfd"),data.getString("cfdi"),"OK","OK");
}
else if(request.version.equalsIgnoreCase("v3")){
- return new SuccessV3Response(response.getStatus(),body.getString("status"),data.getString("cfdi"),"OK","OK");
+ return new SuccessV3Response(statusE,body.getString("status"),data.getString("cfdi"),"OK","OK");
}else if(request.version.equalsIgnoreCase("v4")){
- return new SuccessV4Response(response.getStatus(),body.getString("status"),data.getString("cfdi"),data.getString("cadenaOriginalSAT"),data.getString("noCertificadoSAT"),data.getString("noCertificadoCFDI"),data.getString("uuid"),data.getString("selloSAT"),data.getString("selloCFDI"),data.getString("fechaTimbrado"),data.getString("qrCode"),"OK","OK");
+ return new SuccessV4Response(statusE,body.getString("status"),data.getString("cfdi"),data.getString("cadenaOriginalSAT"),data.getString("noCertificadoSAT"),data.getString("noCertificadoCFDI"),data.getString("uuid"),data.getString("selloSAT"),data.getString("selloCFDI"),data.getString("fechaTimbrado"),data.getString("qrCode"),"OK","OK");
}
else{
- return new SuccessV1Response(response.getStatus(),body.getString("status"),data.toString(),"OK","OK");
+ return new SuccessV1Response(statusE,body.getString("status"),data.toString(),"OK","OK");
}
@@ -66,38 +90,38 @@ else if(request.version.equalsIgnoreCase("v3")){
messageDetail = body.getString("messageDetail");
}
if (request.version.equalsIgnoreCase("v1")) {
- return new SuccessV1Response(response.getStatus(),body.getString("status"),"",body.getString("message"),messageDetail);
+ return new SuccessV1Response(statusE,body.getString("status"),"",body.getString("message"),messageDetail);
}
else if(request.version.equalsIgnoreCase("v2")){
- return new SuccessV2Response(response.getStatus(),body.getString("status"),"","",body.getString("message"),messageDetail);
+ return new SuccessV2Response(statusE,body.getString("status"),"","",body.getString("message"),messageDetail);
}
else if(request.version.equalsIgnoreCase("v3")){
- return new SuccessV3Response(response.getStatus(),body.getString("status"),"",body.getString("message"),messageDetail);
+ return new SuccessV3Response(statusE,body.getString("status"),"",body.getString("message"),messageDetail);
}else if(request.version.equalsIgnoreCase("v4")){
- return new SuccessV4Response(response.getStatus(),body.getString("status"),"","","","","","","","","",body.getString("message"),messageDetail);
+ return new SuccessV4Response(statusE,body.getString("status"),"","","","","","","","","",body.getString("message"),messageDetail);
}
else{
- return new SuccessV1Response(response.getStatus(),body.getString("status"),"",body.getString("message"),messageDetail);
+ return new SuccessV1Response(statusE,body.getString("status"),"",body.getString("message"),messageDetail);
}
}
}
else{
if (request.version.equalsIgnoreCase("v1")) {
- return new SuccessV1Response(response.getStatus(),"error","",response.getStatusText(),response.getStatusText());
+ return new SuccessV1Response(statusE,"error","",responseB.getStatusLine().getReasonPhrase(),responseB.getStatusLine().getReasonPhrase());
}
else if(request.version.equalsIgnoreCase("v2")){
- return new SuccessV2Response(response.getStatus(),"error","","",response.getStatusText(),response.getStatusText());
+ return new SuccessV2Response(statusE,"error","","",responseB.getStatusLine().getReasonPhrase(),responseB.getStatusLine().getReasonPhrase());
}
else if(request.version.equalsIgnoreCase("v3")){
- return new SuccessV3Response(response.getStatus(),"error","",response.getStatusText(),response.getStatusText());
+ return new SuccessV3Response(statusE,"error","",responseB.getStatusLine().getReasonPhrase(),responseB.getStatusLine().getReasonPhrase());
}else if(request.version.equalsIgnoreCase("v4")){
- return new SuccessV4Response(response.getStatus(),"error","","","","","","","","","",response.getStatusText(),response.getStatusText());
+ return new SuccessV4Response(statusE,"error","","","","","","","","","",responseB.getStatusLine().getReasonPhrase(),responseB.getStatusLine().getReasonPhrase());
}
else{
- return new SuccessV1Response(response.getStatus(),"error","",response.getStatusText(),response.getStatusText());
+ return new SuccessV1Response(statusE,"error","",responseB.getStatusLine().getReasonPhrase(),responseB.getStatusLine().getReasonPhrase());
}
@@ -114,15 +138,14 @@ else if(request.version.equalsIgnoreCase("v3")){
- } catch (UnirestException e) {
-
- throw new GeneralException(404,"HOST DESCONOCIDO");
}
catch (JSONException e){
throw new GeneralException(500,e.getMessage());
+ } catch (IOException e) {
+ e.printStackTrace();
+ throw new GeneralException(500,e.getMessage());
}
-
}
}
diff --git a/src/test/java/Tests/Stamp/SWStampServiceTest.java b/src/test/java/Tests/Stamp/SWStampServiceTest.java
index 7354f49..50d611d 100644
--- a/src/test/java/Tests/Stamp/SWStampServiceTest.java
+++ b/src/test/java/Tests/Stamp/SWStampServiceTest.java
@@ -20,45 +20,59 @@ public class SWStampServiceTest extends TestCase {
public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V1() throws Exception {
SWStampService api = new SWStampService("demo","123456789",Utils.url_pruebas);
SuccessV1Response response = null;
+ Utils ut = new Utils();
- response = (SuccessV1Response) api.Stamp(Utils.xml_b,"v1");
+
+ response = (SuccessV1Response) api.Stamp(ut.StringgenBasico(),"v1");
System.out.println(response.Status);
System.out.println(response.HttpStatusCode);
System.out.println(response.tfd);
+ System.out.println(response.message);
String expect_status = "success";
- Assert.assertTrue(expect_status.equalsIgnoreCase(response.Status));
+ String expect_error = "307. El comprobante contiene un timbre previo.";
+ Assert.assertTrue(expect_status.equalsIgnoreCase(response.Status) || expect_error.equalsIgnoreCase(response.message));
}
public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V2() throws Exception {
SWStampService api = new SWStampService("demo","123456789",Utils.url_pruebas);
SuccessV2Response response = null;
- response = (SuccessV2Response) api.Stamp(Utils.dummy_xml_string,"v2");
+ Utils ut = new Utils();
+ if(ut.getRandomBoolean()){
+ response = (SuccessV2Response) api.Stamp(ut.StringgenBasico(),"v2");
+ }else{
+ response = (SuccessV2Response) api.Stamp(ut.signXML(ut.StringgenBasico()),"v2");
+ }
+
System.out.println(response.message);
System.out.println(response.Status);
System.out.println(response.HttpStatusCode);
System.out.println(response.tfd);
System.out.println(response.cfdi);
String expect_status = "success";
- Assert.assertTrue(expect_status.equalsIgnoreCase(response.Status));
+ String expect_error = "307. El comprobante contiene un timbre previo.";
+ Assert.assertTrue(expect_status.equalsIgnoreCase(response.Status) || expect_error.equalsIgnoreCase(response.message));
}
public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V3() throws Exception {
SWStampService api = new SWStampService("demo","123456789",Utils.url_pruebas);
SuccessV3Response response = null;
- response = (SuccessV3Response) api.Stamp(Utils.dummy_xml_string,"v3");
+ Utils ut = new Utils();
+ response = (SuccessV3Response) api.Stamp(ut.StringgenBasico(),"v3");
System.out.println(response.Status);
System.out.println(response.HttpStatusCode);
System.out.println(response.message);
System.out.println(response.cfdi);
String expect_status = "success";
- Assert.assertTrue(expect_status.equalsIgnoreCase(response.Status));
+ String expect_error = "307. El comprobante contiene un timbre previo.";
+ Assert.assertTrue(expect_status.equalsIgnoreCase(response.Status) || expect_error.equalsIgnoreCase(response.message));
}
public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V4() throws Exception {
SWStampService api = new SWStampService("demo","123456789",Utils.url_pruebas);
SuccessV4Response response = null;
- response = (SuccessV4Response) api.Stamp(Utils.dummy_xml_string,"V4");
+ Utils ut = new Utils();
+ response = (SuccessV4Response) api.Stamp(ut.StringgenBasico(),"V4");
System.out.println(response.message);
System.out.println(response.Status);
System.out.println(response.cfdi);
@@ -71,50 +85,60 @@ public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V4() throws Exception {
System.out.println(response.fechaTimbrado);
System.out.println(response.uuid);
String expect_status = "success";
- Assert.assertTrue(expect_status.equalsIgnoreCase(response.Status));
+ String expect_error = "307. El comprobante contiene un timbre previo.";
+ Assert.assertTrue(expect_status.equalsIgnoreCase(response.Status) || expect_error.equalsIgnoreCase(response.message));
}
public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V1_b64() throws Exception {
SWStampService api = new SWStampService("demo","123456789",Utils.url_pruebas);
SuccessV1Response response = null;
- response = (SuccessV1Response) api.Stamp(Utils.toBase64(Utils.dummy_xml_string),"v1",true);
+ Utils ut = new Utils();
+ response = (SuccessV1Response) api.Stamp(ut.toBase64(ut.StringgenBasico()),"v1",true);
System.out.println(response.Status);
System.out.println(response.message);
System.out.println(response.HttpStatusCode);
System.out.println(response.tfd);
- Assert.assertTrue(Utils.isValidB64(response.tfd));
+ String expect_error = "307. El comprobante contiene un timbre previo.";
+ Assert.assertTrue(Utils.isValidB64(response.tfd) || expect_error.equalsIgnoreCase(response.message));
+
+
}
public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V2_b64() throws Exception {
SWStampService api = new SWStampService("demo","123456789",Utils.url_pruebas);
SuccessV2Response response = null;
- response = (SuccessV2Response) api.Stamp(Utils.toBase64(Utils.dummy_xml_string),"v2",true);
+ Utils ut = new Utils();
+ response = (SuccessV2Response) api.Stamp(ut.toBase64(ut.StringgenBasico()),"v2",true);
System.out.println(response.Status);
System.out.println(response.HttpStatusCode);
System.out.println(response.tfd);
System.out.println(response.cfdi);
boolean cfdi_valid = Utils.isValidB64(response.cfdi), tfd_valid = Utils.isValidB64(response.tfd);
- Assert.assertTrue(cfdi_valid && tfd_valid);
+ String expect_error = "307. El comprobante contiene un timbre previo.";
+ Assert.assertTrue(cfdi_valid && tfd_valid || expect_error.equalsIgnoreCase((response.message)));
}
public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V3_b64() throws Exception {
SWStampService api = new SWStampService("demo","123456789",Utils.url_pruebas);
SuccessV3Response response = null;
- response = (SuccessV3Response) api.Stamp(Utils.toBase64(Utils.dummy_xml_string),"v3",true);
+ Utils ut = new Utils();
+ response = (SuccessV3Response) api.Stamp(ut.toBase64(ut.StringgenBasico()),"v3",true);
System.out.println(response.message);
System.out.println(response.Status);
System.out.println(response.HttpStatusCode);
System.out.println(response.message);
System.out.println(response.cfdi);
- Assert.assertTrue(Utils.isValidB64(response.cfdi));
+ String expect_error = "307. El comprobante contiene un timbre previo.";
+ Assert.assertTrue(Utils.isValidB64(response.cfdi) || expect_error.equalsIgnoreCase(response.message));
}
public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V4_b64() throws Exception {
SWStampService api = new SWStampService("demo","123456789",Utils.url_pruebas);
SuccessV4Response response = null;
- response = (SuccessV4Response) api.Stamp(Utils.toBase64(Utils.dummy_xml_string),"V4",true);
+ Utils ut = new Utils();
+ response = (SuccessV4Response) api.Stamp(ut.toBase64(ut.StringgenBasico()),"V4",true);
System.out.println(response.message);
System.out.println(response.Status);
System.out.println(response.cfdi);
@@ -130,7 +154,8 @@ public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V4_b64() throws Exceptio
valid_qr = Utils.isValidB64(response.qrCode),
valid_sellocfdi = Utils.isValidB64(response.selloCFDI),
valid_sellosat = Utils.isValidB64(response.selloSAT);
- Assert.assertTrue(valid_cfdi && valid_qr && valid_sellocfdi && valid_sellosat);
+ String expect_error = "307. El comprobante contiene un timbre previo.";
+ Assert.assertTrue(valid_cfdi && valid_qr && valid_sellocfdi && valid_sellosat || expect_error.equalsIgnoreCase(response.message));
}
@@ -140,43 +165,50 @@ public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V4_b64() throws Exceptio
public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V1_CC10() throws Exception {
SWStampService api = new SWStampService("demo","123456789",Utils.url_pruebas);
SuccessV1Response response = null;
- response = (SuccessV1Response) api.Stamp(Utils.cc10,"v1");
+ Utils ut = new Utils();
+ response = (SuccessV1Response) api.Stamp(ut.genc10(),"v1");
System.out.println(response.message);
System.out.println(response.Status);
System.out.println(response.HttpStatusCode);
System.out.println(response.tfd);
String expect_status = "success";
- Assert.assertTrue(expect_status.equalsIgnoreCase(response.Status));
+ String expect_error = "307. El comprobante contiene un timbre previo.";
+ Assert.assertTrue(expect_status.equalsIgnoreCase(response.Status) || expect_error.equalsIgnoreCase(response.message));
}
public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V2_CC10() throws Exception {
SWStampService api = new SWStampService("demo","123456789",Utils.url_pruebas);
SuccessV2Response response = null;
- response = (SuccessV2Response) api.Stamp(Utils.cc10,"v2");
+ Utils ut = new Utils();
+ response = (SuccessV2Response) api.Stamp(ut.genc10(),"v2");
System.out.println(response.Status);
System.out.println(response.message);
System.out.println(response.HttpStatusCode);
System.out.println(response.tfd);
System.out.println(response.cfdi);
String expect_status = "success";
- Assert.assertTrue(expect_status.equalsIgnoreCase(response.Status));
+ String expect_error = "307. El comprobante contiene un timbre previo.";
+ Assert.assertTrue(expect_status.equalsIgnoreCase(response.Status) || expect_error.equalsIgnoreCase(response.message));
}
public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V3_CC10() throws Exception {
SWStampService api = new SWStampService("demo","123456789",Utils.url_pruebas);
SuccessV3Response response = null;
- response = (SuccessV3Response) api.Stamp(Utils.cc10,"v3");
+ Utils ut = new Utils();
+ response = (SuccessV3Response) api.Stamp(ut.genc10(),"v3");
System.out.println(response.Status);
System.out.println(response.HttpStatusCode);
System.out.println(response.cfdi);
String expect_status = "success";
- Assert.assertTrue(expect_status.equalsIgnoreCase(response.Status));
+ String expect_error = "307. El comprobante contiene un timbre previo.";
+ Assert.assertTrue(expect_status.equalsIgnoreCase(response.Status) || expect_error.equalsIgnoreCase(response.message));
}
public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V4_CC10() throws Exception {
SWStampService api = new SWStampService("demo","123456789",Utils.url_pruebas);
SuccessV4Response response = null;
- response = (SuccessV4Response) api.Stamp(Utils.cc10,"V4");
+ Utils ut = new Utils();
+ response = (SuccessV4Response) api.Stamp(ut.genc10(),"V4");
System.out.println(response.Status);
System.out.println(response.qrCode);
@@ -195,7 +227,8 @@ public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V4_CC10() throws Excepti
public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V1_b64_CC10() throws Exception {
SWStampService api = new SWStampService("demo","123456789",Utils.url_pruebas);
SuccessV1Response response = null;
- response = (SuccessV1Response) api.Stamp(Utils.toBase64(Utils.cc10),"v1",true);
+ Utils ut = new Utils();
+ response = (SuccessV1Response) api.Stamp(ut.toBase64(ut.genc10()),"v1",true);
System.out.println(response.Status);
System.out.println(response.HttpStatusCode);
System.out.println(response.tfd);
@@ -205,20 +238,23 @@ public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V1_b64_CC10() throws Exc
public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V2_b64_CC10() throws Exception {
SWStampService api = new SWStampService("demo","123456789",Utils.url_pruebas);
SuccessV2Response response = null;
- response = (SuccessV2Response) api.Stamp(Utils.toBase64(Utils.cc10),"v2",true);
+ Utils ut = new Utils();
+ response = (SuccessV2Response) api.Stamp(ut.toBase64(ut.genc10()),"v2",true);
System.out.println(response.Status);
System.out.println(response.HttpStatusCode);
System.out.println(response.tfd);
System.out.println(response.cfdi);
boolean cfdi_valid = Utils.isValidB64(response.cfdi), tfd_valid = Utils.isValidB64(response.tfd);
- Assert.assertTrue(cfdi_valid && tfd_valid);
+ String expect_error = "307. El comprobante contiene un timbre previo.";
+ Assert.assertTrue(cfdi_valid && tfd_valid || expect_error.equalsIgnoreCase(response.message));
}
public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V3_b64_CC10() throws Exception {
SWStampService api = new SWStampService("demo","123456789",Utils.url_pruebas);
SuccessV3Response response = null;
- response = (SuccessV3Response) api.Stamp(Utils.toBase64(Utils.cc10),"v3",true);
+ Utils ut = new Utils();
+ response = (SuccessV3Response) api.Stamp(ut.toBase64(ut.genc10()),"v3",true);
System.out.println(response.Status);
System.out.println(response.HttpStatusCode);
System.out.println(response.cfdi);
@@ -228,7 +264,8 @@ public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V3_b64_CC10() throws Exc
public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V4_b64_CC10() throws Exception {
SWStampService api = new SWStampService("demo","123456789",Utils.url_pruebas);
SuccessV4Response response = null;
- response = (SuccessV4Response) api.Stamp(Utils.toBase64(Utils.cc10),"V4",true);
+ Utils ut = new Utils();
+ response = (SuccessV4Response) api.Stamp(ut.toBase64(ut.genc10()),"V4",true);
System.out.println(response.Status);
System.out.println(response.cfdi);
System.out.println(response.qrCode);
@@ -257,7 +294,8 @@ public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V4_b64_CC10() throws Exc
public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V1_PAGOS10() throws Exception {
SWStampService api = new SWStampService("demo","123456789",Utils.url_pruebas);
SuccessV1Response response = null;
- response = (SuccessV1Response) api.Stamp(Utils.pagos10,"v1");
+ Utils ut = new Utils();
+ response = (SuccessV1Response) api.Stamp(ut.genPagos10(),"v1");
System.out.println(response.Status);
System.out.println(response.message);
System.out.println(response.HttpStatusCode);
@@ -269,7 +307,8 @@ public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V1_PAGOS10() throws Exce
public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V2_PAGOS10() throws Exception {
SWStampService api = new SWStampService("demo","123456789",Utils.url_pruebas);
SuccessV2Response response = null;
- response = (SuccessV2Response) api.Stamp(Utils.pagos10,"v2");
+ Utils ut = new Utils();
+ response = (SuccessV2Response) api.Stamp(ut.genPagos10(),"v2");
System.out.println(response.Status);
System.out.println(response.message);
System.out.println(response.HttpStatusCode);
@@ -282,20 +321,23 @@ public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V2_PAGOS10() throws Exce
public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V3_PAGOS10() throws Exception {
SWStampService api = new SWStampService("demo","123456789",Utils.url_pruebas);
SuccessV3Response response = null;
- response = (SuccessV3Response) api.Stamp(Utils.pagos10,"v3");
+ Utils ut = new Utils();
+ response = (SuccessV3Response) api.Stamp(ut.genPagos10(),"v3");
System.out.println(response.Status);
System.out.println(response.message);
System.out.println(response.HttpStatusCode);
System.out.println(response.cfdi);
String expect_status = "success";
- Assert.assertTrue(expect_status.equalsIgnoreCase(response.Status));
+ String expect_error = "307. El comprobante contiene un timbre previo.";
+ Assert.assertTrue(expect_status.equalsIgnoreCase(response.Status) || expect_error.equalsIgnoreCase(response.message));
}
public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V4_PAGOS10() throws Exception {
SWStampService api = new SWStampService("demo","123456789",Utils.url_pruebas);
SuccessV4Response response = null;
- response = (SuccessV4Response) api.Stamp(Utils.pagos10,"V4");
+ Utils ut = new Utils();
+ response = (SuccessV4Response) api.Stamp(ut.genPagos10(),"V4");
System.out.println(response.Status);
System.out.println(response.cfdi);
System.out.println(response.qrCode);
@@ -307,25 +349,29 @@ public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V4_PAGOS10() throws Exce
System.out.println(response.fechaTimbrado);
System.out.println(response.uuid);
String expect_status = "success";
- Assert.assertTrue(expect_status.equalsIgnoreCase(response.Status));
+ String expect_error = "307. El comprobante contiene un timbre previo.";
+ Assert.assertTrue(expect_status.equalsIgnoreCase(response.Status) || expect_error.equalsIgnoreCase(response.message));
}
public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V1_b64_PAGOS10() throws Exception {
SWStampService api = new SWStampService("demo","123456789",Utils.url_pruebas);
SuccessV1Response response = null;
- response = (SuccessV1Response) api.Stamp(Utils.toBase64(Utils.pagos10),"v1",true);
+ Utils ut = new Utils();
+ response = (SuccessV1Response) api.Stamp(ut.toBase64(ut.genPagos10()),"v1",true);
System.out.println(response.Status);
System.out.println(response.message);
System.out.println(response.HttpStatusCode);
System.out.println(response.tfd);
- Assert.assertTrue(Utils.isValidB64(response.tfd));
+ String expect_error = "307. El comprobante contiene un timbre previo.";
+ Assert.assertTrue(Utils.isValidB64(response.tfd) || expect_error.equalsIgnoreCase(response.message));
}
public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V2_b64_PAGOS10() throws Exception {
SWStampService api = new SWStampService("demo","123456789",Utils.url_pruebas);
SuccessV2Response response = null;
- response = (SuccessV2Response) api.Stamp(Utils.toBase64(Utils.pagos10),"v2",true);
+ Utils ut = new Utils();
+ response = (SuccessV2Response) api.Stamp(ut.toBase64(ut.genPagos10()),"v2",true);
System.out.println(response.Status);
System.out.println(response.message);
System.out.println(response.HttpStatusCode);
@@ -339,18 +385,21 @@ public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V2_b64_PAGOS10() throws
public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V3_b64_PAGOS10() throws Exception {
SWStampService api = new SWStampService("demo","123456789",Utils.url_pruebas);
SuccessV3Response response = null;
- response = (SuccessV3Response) api.Stamp(Utils.toBase64(Utils.pagos10),"v3",true);
+ Utils ut = new Utils();
+ response = (SuccessV3Response) api.Stamp(ut.toBase64(ut.genPagos10()),"v3",true);
System.out.println(response.Status);
System.out.println(response.message);
System.out.println(response.HttpStatusCode);
System.out.println(response.cfdi);
- Assert.assertTrue(Utils.isValidB64(response.cfdi));
+ String expect_error = "307. El comprobante contiene un timbre previo.";
+ Assert.assertTrue(Utils.isValidB64(response.cfdi) || expect_error.equalsIgnoreCase(response.message));
}
public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V4_b64_PAGOS10() throws Exception {
SWStampService api = new SWStampService("demo","123456789",Utils.url_pruebas);
SuccessV4Response response = null;
- response = (SuccessV4Response) api.Stamp(Utils.toBase64(Utils.pagos10),"V4",true);
+ Utils ut = new Utils();
+ response = (SuccessV4Response) api.Stamp(ut.toBase64(ut.genPagos10()),"V4",true);
System.out.println(response.Status);
System.out.println(response.message);
System.out.println(response.cfdi);
@@ -380,7 +429,8 @@ public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V4_b64_PAGOS10() throws
public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V1_NOMINA12() throws Exception {
SWStampService api = new SWStampService("demo","123456789",Utils.url_pruebas);
SuccessV1Response response = null;
- response = (SuccessV1Response) api.Stamp(Utils.nomina10,"v1");
+ Utils ut = new Utils();
+ response = (SuccessV1Response) api.Stamp(ut.genNomina10(),"v1");
System.out.println(response.Status);
System.out.print(response.message);
System.out.println(response.HttpStatusCode);
@@ -391,7 +441,8 @@ public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V1_NOMINA12() throws Exc
public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V2_NOMINA12() throws Exception {
SWStampService api = new SWStampService("demo","123456789",Utils.url_pruebas);
SuccessV2Response response = null;
- response = (SuccessV2Response) api.Stamp(Utils.nomina10,"v2");
+ Utils ut = new Utils();
+ response = (SuccessV2Response) api.Stamp(ut.genNomina10(),"v2");
System.out.println(response.Status);
System.out.println(response.HttpStatusCode);
System.out.println(response.tfd);
@@ -402,7 +453,8 @@ public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V2_NOMINA12() throws Exc
public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V3_NOMINA12() throws Exception {
SWStampService api = new SWStampService("demo","123456789",Utils.url_pruebas);
SuccessV3Response response = null;
- response = (SuccessV3Response) api.Stamp(Utils.nomina10,"v3");
+ Utils ut = new Utils();
+ response = (SuccessV3Response) api.Stamp(ut.genNomina10(),"v3");
System.out.println(response.Status);
System.out.println(response.HttpStatusCode);
@@ -413,7 +465,8 @@ public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V3_NOMINA12() throws Exc
public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V4_NOMINA12() throws Exception {
SWStampService api = new SWStampService("demo","123456789",Utils.url_pruebas);
SuccessV4Response response = null;
- response = (SuccessV4Response) api.Stamp(Utils.nomina10,"V4");
+ Utils ut = new Utils();
+ response = (SuccessV4Response) api.Stamp(ut.genNomina10(),"V4");
System.out.println(response.Status);
System.out.println(response.cfdi);
System.out.println(response.qrCode);
@@ -431,20 +484,23 @@ public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V4_NOMINA12() throws Exc
public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V1_b64_NOMINA12() throws Exception {
SWStampService api = new SWStampService("demo","123456789",Utils.url_pruebas);
SuccessV1Response response = null;
- response = (SuccessV1Response) api.Stamp(Utils.toBase64(Utils.nomina10),"v1",true);
+ Utils ut = new Utils();
+ response = (SuccessV1Response) api.Stamp(ut.toBase64(ut.genNomina10()),"v1",true);
System.out.println(response.Status);
System.out.println(response.HttpStatusCode);
System.out.println(response.message);
System.out.println(response.tfd);
Assert.assertTrue(Utils.isValidB64(response.tfd));
String expect_status = "success";
- Assert.assertTrue(expect_status.equalsIgnoreCase(response.Status));
+ String expect_error = "307. El comprobante contiene un timbre previo.";
+ Assert.assertTrue(expect_status.equalsIgnoreCase(response.Status) || expect_error.equalsIgnoreCase(response.message));
}
public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V2_b64_NOMINA12() throws Exception {
SWStampService api = new SWStampService("demo","123456789",Utils.url_pruebas);
SuccessV2Response response = null;
- response = (SuccessV2Response) api.Stamp(Utils.toBase64(Utils.nomina10),"v2",true);
+ Utils ut = new Utils();
+ response = (SuccessV2Response) api.Stamp(ut.toBase64(ut.genNomina10()),"v2",true);
System.out.println(response.Status);
System.out.println(response.HttpStatusCode);
System.out.println(response.tfd);
@@ -457,7 +513,8 @@ public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V2_b64_NOMINA12() throws
public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V3_b64_NOMINA12() throws Exception {
SWStampService api = new SWStampService("demo","123456789",Utils.url_pruebas);
SuccessV3Response response = null;
- response = (SuccessV3Response) api.Stamp(Utils.toBase64(Utils.nomina10),"v3",true);
+ Utils ut = new Utils();
+ response = (SuccessV3Response) api.Stamp(ut.toBase64(ut.genNomina10()),"v3",true);
System.out.println(response.Status);
System.out.println(response.HttpStatusCode);
System.out.println(response.cfdi);
@@ -467,7 +524,8 @@ public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V3_b64_NOMINA12() throws
public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V4_b64_NOMINA12() throws Exception {
SWStampService api = new SWStampService("demo","123456789",Utils.url_pruebas);
SuccessV4Response response = null;
- response = (SuccessV4Response) api.Stamp(Utils.toBase64(Utils.nomina10),"V4",true);
+ Utils ut = new Utils();
+ response = (SuccessV4Response) api.Stamp(ut.toBase64(ut.genNomina10()),"V4",true);
System.out.println(response.Status);
System.out.println(response.cfdi);
System.out.println(response.qrCode);
@@ -482,7 +540,8 @@ public void testStampREAL_XML_STRING_USER_PASSWORD_AUTH_V4_b64_NOMINA12() throws
valid_qr = Utils.isValidB64(response.qrCode),
valid_sellocfdi = Utils.isValidB64(response.selloCFDI),
valid_sellosat = Utils.isValidB64(response.selloSAT);
- Assert.assertTrue(valid_cfdi && valid_qr && valid_sellocfdi && valid_sellosat);
+ String expect_error = "307. El comprobante contiene un timbre previo.";
+ Assert.assertTrue(valid_cfdi && valid_qr && valid_sellocfdi && valid_sellosat || expect_error.equalsIgnoreCase(response.message));
}
@@ -492,7 +551,8 @@ public void testStampREAL_XML_STRING_EMPTY_PARAMS() throws Exception {
try{
SWStampService api = new SWStampService("","","");
IResponse response = null;
- response = api.Stamp(Utils.dummy_xml_string,"v1");
+ Utils ut = new Utils();
+ response = api.Stamp(ut.StringgenBasico(),"v1");
System.out.println(response.Status);
System.out.println(response.HttpStatusCode);
@@ -511,7 +571,8 @@ public void testStampREAL_XML_STRING_INCORRECT_PARAMS() throws Exception {
try{
SWStampService api = new SWStampService("USER_BAD","PASSWORD_BAD","BAD_URI");
IResponse response = null;
- response = api.Stamp(Utils.dummy_xml_string,"v1");
+ Utils ut = new Utils();
+ response = api.Stamp(ut.StringgenBasico(),"v1");
System.out.println(response.Status);
System.out.println(response.HttpStatusCode);
@@ -540,7 +601,8 @@ public void testStampTOKEN_EXPIRES_NOT_USER_NOT_PASSWORD() throws Exception {
api.setPassword(null);
}
try{
- response = api.Stamp(Utils.dummy_xml_string,"v1");
+ Utils ut = new Utils();
+ response = api.Stamp(ut.StringgenBasico(),"v1");
}catch (Exception e){
diff --git a/src/test/java/Tests/Utils.java b/src/test/java/Tests/Utils.java
index 642b1db..e22c9cf 100644
--- a/src/test/java/Tests/Utils.java
+++ b/src/test/java/Tests/Utils.java
@@ -1,36 +1,83 @@
package Tests;
+
+import Tests.assets.Sign;
import jdk.nashorn.internal.runtime.regexp.RegExp;
import jdk.nashorn.internal.runtime.regexp.RegExpMatcher;
import org.apache.commons.codec.binary.Base64;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.mime.HttpMultipartMode;
+import org.apache.http.entity.mime.MultipartEntity;
+import org.apache.http.entity.mime.content.StringBody;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.w3c.dom.Document;
+import org.xml.sax.InputSource;
import sun.misc.BASE64Decoder;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.util.JAXBSource;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.*;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+import java.io.*;
+import java.net.URL;
+import java.nio.charset.Charset;
+
+import java.security.cert.X509Certificate;
import java.text.Normalizer;
+import java.text.SimpleDateFormat;
import java.util.Date;
+import java.util.Random;
+import java.util.Scanner;
+import java.util.UUID;
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+
+import static javax.xml.parsers.DocumentBuilderFactory.*;
+
/**
* Created by asalvio on 16/02/2017.
*/
public class Utils {
public static String dummy_token = "T2lYQ0t4L0RHVkR4dHZ5Nkk1VHNEakZ3Y0J4Nk9GODZuRyt4cE1wVm5tbXB3YVZxTHdOdHAwVXY2NTdJb1hkREtXTzE3dk9pMmdMdkFDR2xFWFVPUTQyWFhnTUxGYjdKdG8xQTZWVjFrUDNiOTVrRkhiOGk3RHladHdMaEM0cS8rcklzaUhJOGozWjN0K2h6R3gwQzF0c0g5aGNBYUt6N2srR3VoMUw3amtvPQ.T2lYQ0t4L0RHVkR4dHZ5Nkk1VHNEakZ3Y0J4Nk9GODZuRyt4cE1wVm5tbFlVcU92YUJTZWlHU3pER1kySnlXRTF4alNUS0ZWcUlVS0NhelhqaXdnWTRncklVSWVvZlFZMWNyUjVxYUFxMWFxcStUL1IzdGpHRTJqdS9Zakw2UGRiMTFPRlV3a2kyOWI5WUZHWk85ODJtU0M2UlJEUkFTVXhYTDNKZVdhOXIySE1tUVlFdm1jN3kvRStBQlpLRi9NeWJrd0R3clhpYWJrVUMwV0Mwd3FhUXdpUFF5NW5PN3J5cklMb0FETHlxVFRtRW16UW5ZVjAwUjdCa2g0Yk1iTExCeXJkVDRhMGMxOUZ1YWlIUWRRVC8yalFTNUczZXdvWlF0cSt2UW0waFZKY2gyaW5jeElydXN3clNPUDNvU1J2dm9weHBTSlZYNU9aaGsvalpQMUxyQ0IvSUh1bHYxaFMxa2xmb3ZIaHlqQlpZZGRmVlpuRDBHdHNweStrZmNPcWZjWktlcm5IZVFhelhRUDBQWXpHS0JmMGhURm9OTU5KUEJLeEZMeGpnR3hpOWFoakcvaXRVb2RSSVFFSVF2OFd5UExVT3JiSFo5RmcxOGJUWTlQSnJPdzAxdU5NdVRwWlR1azRQY0FQdTg9.YA-QpZRGEYqNpQz5Un_eFwY20-JijfDKJvX6sC5z-XE";
- public static String cc10 = "";
+
public static String cc10_b64 = "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48Y2ZkaTpDb21wcm9iYW50ZSB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuc2F0LmdvYi5teC9jZmQvMyBodHRwOi8vd3d3LnNhdC5nb2IubXgvc2l0aW9faW50ZXJuZXQvY2ZkLzMvY2ZkdjMzLnhzZCBodHRwOi8vd3d3LnNhdC5nb2IubXgvQ29tZXJjaW9FeHRlcmlvcjExIGh0dHA6Ly93d3cuc2F0LmdvYi5teC9zaXRpb19pbnRlcm5ldC9jZmQvQ29tZXJjaW9FeHRlcmlvcjExL0NvbWVyY2lvRXh0ZXJpb3IxMS54c2QiIHhtbG5zOmNjZTExPSJodHRwOi8vd3d3LnNhdC5nb2IubXgvQ29tZXJjaW9FeHRlcmlvcjExIiBWZXJzaW9uPSIzLjMiIFNlcmllPSJSb2d1ZU9uZSIgRm9saW89IkhORksyMzEiIEZlY2hhPSIyMDE3LTA1LTE0VDExOjQzOjI0IiBTZWxsbz0iTjZrdzZGK200M1l0OFFlcnk0MmI0SEhRcE02azQwVWsxU21DTFNMM29BSHVJMG9QNGkvcEtOSkZCUWZVMkxvLzdIb3EraXFLUkRheXE3TG5pbURlRkp0RnRUR052dHBiN2NXdmxNZ2lXK2pLWFdwZldZK3NZYUViQWdEZGpBVndDTkF5cFZTak9oNzZka0w0YWYyUGZFOWYzS2czSnk2bU1wMWd1VFVjYWxXS3dmVExranprRjdjT0xWazZWaVVZTkxoQ2xhRlVhazArcWlVMjExbzFmQlJXbVkzU3cwb2ZRTEk1am45RENXemd3OXBEUVl4bTNoN3RXZlVwdk9NbFIwRjZUTU8xSzJQdkRVbm56WnR6Ukx1Q3VOL1VXNEdVUEVHQk9LSlBuYzl6NTl0RFZhRU5iRXQyYzdTNkdlcEdDVllSTlk2cFFyTDhuUmFaY2R4YmZnPT0iIEZvcm1hUGFnbz0iMDEiIE5vQ2VydGlmaWNhZG89IjIwMDAxMDAwMDAwMzAwMDIyODE1IiBDZXJ0aWZpY2Fkbz0iTUlJRnhUQ0NBNjJnQXdJQkFnSVVNakF3TURFd01EQXdNREF6TURBd01qSTRNVFV3RFFZSktvWklodmNOQVFFTEJRQXdnZ0ZtTVNBd0hnWURWUVFEREJkQkxrTXVJRElnWkdVZ2NISjFaV0poY3lnME1EazJLVEV2TUMwR0ExVUVDZ3dtVTJWeWRtbGphVzhnWkdVZ1FXUnRhVzVwYzNSeVlXTnB3N051SUZSeWFXSjFkR0Z5YVdFeE9EQTJCZ05WQkFzTUwwRmtiV2x1YVhOMGNtRmphY096YmlCa1pTQlRaV2QxY21sa1lXUWdaR1VnYkdFZ1NXNW1iM0p0WVdOcHc3TnVNU2t3SndZSktvWklodmNOQVFrQkZocGhjMmx6Ym1WMFFIQnlkV1ZpWVhNdWMyRjBMbWR2WWk1dGVERW1NQ1FHQTFVRUNRd2RRWFl1SUVocFpHRnNaMjhnTnpjc0lFTnZiQzRnUjNWbGNuSmxjbTh4RGpBTUJnTlZCQkVNQlRBMk16QXdNUXN3Q1FZRFZRUUdFd0pOV0RFWk1CY0dBMVVFQ0F3UVJHbHpkSEpwZEc4Z1JtVmtaWEpoYkRFU01CQUdBMVVFQnd3SlEyOTViMkZqdzZGdU1SVXdFd1lEVlFRdEV3eFRRVlE1TnpBM01ERk9Uak14SVRBZkJna3Foa2lHOXcwQkNRSU1FbEpsYzNCdmJuTmhZbXhsT2lCQlEwUk5RVEFlRncweE5qRXdNalV5TVRVeU1URmFGdzB5TURFd01qVXlNVFV5TVRGYU1JR3hNUm93R0FZRFZRUURFeEZEU1U1RVJVMUZXQ0JUUVNCRVJTQkRWakVhTUJnR0ExVUVLUk1SUTBsT1JFVk5SVmdnVTBFZ1JFVWdRMVl4R2pBWUJnTlZCQW9URVVOSlRrUkZUVVZZSUZOQklFUkZJRU5XTVNVd0l3WURWUVF0RXh4TVFVNDNNREE0TVRjelVqVWdMeUJHVlVGQ056Y3dNVEUzUWxoQk1SNHdIQVlEVlFRRkV4VWdMeUJHVlVGQ056Y3dNVEUzVFVSR1VrNU9NRGt4RkRBU0JnTlZCQXNVQzFCeWRXVmlZVjlEUmtSSk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBZ3Z2Q2lDRkRGVmFZWDd4ZFZSaHAvMzhVTFd0by9MS0RTWnkxeXJYS3BhcUZYcUVSSldGNzhZSEtmM041R0JvWGd6d0ZQdURYKzVrdlk1d3RZTnh4L093dTJzaE5acUZGaDZFS3N5c1FNZVA1cno2a0UxZ0ZZZW5hUEVVUDl6aitoMGJMM3hSNWFxb1RzcUdGMjRtS0JMb2lhSzQ0cFhCekd6Z3N4WmlzaFZKVk02WGJ6TkpWb25FVU5iSTI1RGhnV0FkODZmMmFVM0JtT0gySzFSWng0MWR0VFQ1NlVzc3pKbHM0dFBGT0RyL2NhV3VaRXVVdkxwMU0zbmo3RHl1ODhtaEQyZisxZkEvZzdremNVLzF0Y3BGWEYvckl5OTNBUHZrVTcyand2a3JucHJ6cytTbkc4MSsvRjE2YWh1R3NiMkVaODhkS0h3cXhFa3d6aE15VGJRSURBUUFCb3gwd0d6QU1CZ05WSFJNQkFmOEVBakFBTUFzR0ExVWREd1FFQXdJR3dEQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFKL3hrTDhJK2ZwaWxaUCs5YU84bjkzKzIwWHhWb21MSmplU0wrTmcyRXJMMkdnYXRwTHVONUprbkZCa1pBaHhWSWdNYVRTMjN6emsxUkx0UmFZdkg4M2xCSDVFK00ra0VqRkdwMTRGbmUxaVYyUG0zdkw0amVMbXpIZ1kxS2Y1SG1lVnJycDRQVTdXUWcxNlZweUhhSi9lb25QTmlFQlVqY3lRMWlGZmt6Sm1uU0p2REd0ZlFLMlRpRW9sREpBcFl2ME9XZG00aXM5QnNmaTlqNmxJOS9UNk1OWisvTE0yTC90NzJWYXU0cjdtOTRKREV6YU8zQTB3SEF0UTk3ZmpCZkJpTzVNOEFFSVNBVjdlWmlkSWwzaWFKSkhrUWJCWWlpVzJnaWtyZVVaS1BVWDBIbWxuSXFxUWNCSmhXS1J1Nk5xazZhWkJURVRMTHBHcnZGOU9BclYxSlNzYmR3L1pIK1A4OFJBdDVlbTUvZ2p3d3RGbE5IeWlLRzV3K1VGcGFaT0szZ1pQMHN1MHNhNmRsUGVROUVMNEpsRmtHcVFDZ1NRK05Pc1hxYU9hdmdvUDVWTHlrTHd1R253SVVudWhCVFZlRGJ6cGdyZzlMdUY1ZFlwL3pzK1k5U2NKcWU1Vk1BYWdMU1lUU2hOdE44bHVWN0x2eEY5cGdXd1pkY003bFV3cUptVWRkQ2lacWRuZ2czdnpUYWN0TVRvRzE2Z1pBNENXbk1nYlU0RStyNTQxK0ZOTXBnQVpOdnMyQ2lXL2VBcGZhYVFvanNaRUFIRHNEdjRMNW4zTTFDQzdmWWpFL2Q2MWFTbmcxTGFPNlQxbWgrZEVmUHZMenA3enl6eitVZ1dNaGk1Q3M0cGNYeDFlaWM1cjd1eFBvQndjQ1R0M1lJMWpLVlZuVjcvdz0iIFN1YlRvdGFsPSIyMDAuMDAiIE1vbmVkYT0iTVhOIiBUaXBvQ2FtYmlvPSIxIiBUb3RhbD0iNjAzLjI4IiBUaXBvRGVDb21wcm9iYW50ZT0iSSIgTWV0b2RvUGFnbz0iUFVFIiBMdWdhckV4cGVkaWNpb249IjA2MzAwIiB4bWxuczpjZmRpPSJodHRwOi8vd3d3LnNhdC5nb2IubXgvY2ZkLzMiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPjxjZmRpOkVtaXNvciBSZmM9IkxBTjcwMDgxNzNSNSIgTm9tYnJlPSJDSU5ERU1FWCBTQSBERSBDViIgUmVnaW1lbkZpc2NhbD0iNjAxIiAvPjxjZmRpOlJlY2VwdG9yIFJmYz0iQUFBMDEwMTAxQUFBIiBOb21icmU9IlJvZG9sZm8gQ2FycmFuemEgUmFtb3MiIFVzb0NGREk9IkcwMyIgLz48Y2ZkaTpDb25jZXB0b3M+PGNmZGk6Q29uY2VwdG8gQ2xhdmVQcm9kU2Vydj0iNTAyMTE1MDMiIE5vSWRlbnRpZmljYWNpb249IlVUNDIxNTExIiBDYW50aWRhZD0iMSIgQ2xhdmVVbmlkYWQ9Ikg4NyIgVW5pZGFkPSJQaWV6YSIgRGVzY3JpcGNpb249IkNpZ2Fycm9zIiBWYWxvclVuaXRhcmlvPSIyMDAuMDAiIEltcG9ydGU9IjIwMC4wMCI+PGNmZGk6SW1wdWVzdG9zPjxjZmRpOlRyYXNsYWRvcz48Y2ZkaTpUcmFzbGFkbyBCYXNlPSIyMDAuMDAiIEltcHVlc3RvPSIwMDIiIFRpcG9GYWN0b3I9IlRhc2EiIFRhc2FPQ3VvdGE9IjAuMTYwMDAwIiBJbXBvcnRlPSIzMi4wOCIgLz48Y2ZkaTpUcmFzbGFkbyBCYXNlPSIyMzIuMDAiIEltcHVlc3RvPSIwMDMiIFRpcG9GYWN0b3I9IlRhc2EiIFRhc2FPQ3VvdGE9IjEuNjAwMDAwIiBJbXBvcnRlPSIzNzEuMjAiIC8+PC9jZmRpOlRyYXNsYWRvcz48L2NmZGk6SW1wdWVzdG9zPjwvY2ZkaTpDb25jZXB0bz48L2NmZGk6Q29uY2VwdG9zPjxjZmRpOkltcHVlc3RvcyBUb3RhbEltcHVlc3Rvc1RyYXNsYWRhZG9zPSI0MDMuMjgiPjxjZmRpOlRyYXNsYWRvcz48Y2ZkaTpUcmFzbGFkbyBJbXB1ZXN0bz0iMDAyIiBUaXBvRmFjdG9yPSJUYXNhIiBUYXNhT0N1b3RhPSIwLjE2MDAwMCIgSW1wb3J0ZT0iMzIuMDgiIC8+PGNmZGk6VHJhc2xhZG8gSW1wdWVzdG89IjAwMyIgVGlwb0ZhY3Rvcj0iVGFzYSIgVGFzYU9DdW90YT0iMS42MDAwMDAiIEltcG9ydGU9IjM3MS4yMCIgLz48L2NmZGk6VHJhc2xhZG9zPjwvY2ZkaTpJbXB1ZXN0b3M+PGNmZGk6Q29tcGxlbWVudG8+PGNjZTExOkNvbWVyY2lvRXh0ZXJpb3IgQ2VydGlmaWNhZG9PcmlnZW49IjAiIENsYXZlRGVQZWRpbWVudG89IkExIiBJbmNvdGVybT0iRk9CIiBTdWJkaXZpc2lvbj0iMCIgVGlwb0NhbWJpb1VTRD0iMTkuNDQ5MyIgVGlwb09wZXJhY2lvbj0iMiIgVG90YWxVU0Q9IjUxOTkuMDUiIFZlcnNpb249IjEuMSI+PGNjZTExOkVtaXNvcj48L2NjZTExOkVtaXNvcj48Y2NlMTE6UmVjZXB0b3IgTnVtUmVnSWRUcmliPSI4ODkwMTAzNTciPjwvY2NlMTE6UmVjZXB0b3I+PGNjZTExOk1lcmNhbmNpYXM+PGNjZTExOk1lcmNhbmNpYSBDYW50aWRhZEFkdWFuYT0iMTIwMCIgRnJhY2Npb25BcmFuY2VsYXJpYT0iOTgwMTAwMDEiIE5vSWRlbnRpZmljYWNpb249IkEtMTIzTEZNIiBVbmlkYWRBZHVhbmE9IjAxIiBWYWxvckRvbGFyZXM9IjIyMjAuNDYiIFZhbG9yVW5pdGFyaW9BZHVhbmE9IjEuODUiPjwvY2NlMTE6TWVyY2FuY2lhPjxjY2UxMTpNZXJjYW5jaWEgQ2FudGlkYWRBZHVhbmE9Ijk1OCIgRnJhY2Npb25BcmFuY2VsYXJpYT0iOTQwNTkxMDIiIE5vSWRlbnRpZmljYWNpb249IkEtMTIzSktMIiBVbmlkYWRBZHVhbmE9IjAxIiBWYWxvckRvbGFyZXM9IjE1MTkuNDMiIFZhbG9yVW5pdGFyaW9BZHVhbmE9IjEuNTkiPjwvY2NlMTE6TWVyY2FuY2lhPjxjY2UxMTpNZXJjYW5jaWEgQ2FudGlkYWRBZHVhbmE9IjExNTAiIEZyYWNjaW9uQXJhbmNlbGFyaWE9Ijk0MDU5MTAyIiBOb0lkZW50aWZpY2FjaW9uPSJBLTEyM1dIWCIgVW5pZGFkQWR1YW5hPSIwMSIgVmFsb3JEb2xhcmVzPSIxNDU5LjE2IiBWYWxvclVuaXRhcmlvQWR1YW5hPSIxLjI3Ij48L2NjZTExOk1lcmNhbmNpYT48L2NjZTExOk1lcmNhbmNpYXM+PC9jY2UxMTpDb21lcmNpb0V4dGVyaW9yPjwvY2ZkaTpDb21wbGVtZW50bz48L2NmZGk6Q29tcHJvYmFudGU+";
- public static String pagos10 = "";
+
public static String pagos10_b64 = "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48Y2ZkaTpDb21wcm9iYW50ZSB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuc2F0LmdvYi5teC9jZmQvMyBodHRwOi8vd3d3LnNhdC5nb2IubXgvc2l0aW9faW50ZXJuZXQvY2ZkLzMvY2ZkdjMzLnhzZCBodHRwOi8vd3d3LnNhdC5nb2IubXgvUGFnb3MgaHR0cDovL3d3dy5zYXQuZ29iLm14L3NpdGlvX2ludGVybmV0L2NmZC9QYWdvcy9QYWdvczEwLnhzZCIgeG1sbnM6cGFnbzEwPSJodHRwOi8vd3d3LnNhdC5nb2IubXgvUGFnb3MiIFZlcnNpb249IjMuMyIgRmVjaGE9IjIwMTctMDUtMTRUMTI6NTU6MDkiIFNlbGxvPSJlb2NFWEVYajJCWkdwWkNlTWdtL2k5bWJyTlFDM0lSUHJpOU1tbnZYb0Q3cVVGQnNqVVgvWnlPZWZuQjcwRFk5Vnk1OG5yeDB6QllQMGFMTWQ2cmdOV2tlejBmVGo1WU9HeEVJN1VOTXA3ajVBYkJQenZZc0QxaTFSWFh4ZkVIcFJZWVRXRVRqYmZ1VGNwN3ZlS0dOdmVyS0h4MjVWa005blgzSHhOOXJiTHlkTVRwSXA1Q2ljSCtCQnYzaUFCUVdZWmMySUpiek9zanhadndGaWljK2xTZWtSbjR2bG5zTzRaVkErbXBIcG1GcXRZd3JRTnBPOHF1QUh5cVZRSS8zbzZuMXMyVlU0UjIrQW1LNmVYYTJ1TlVaRDlwb2JFNW1zQmF6K1lIby95ZFNnSFlIalp4ZEczL0hFM3lnOERpNUtuamlSaWNBVTRwcnlKaWFmVUJJbFE9PSIgTm9DZXJ0aWZpY2Fkbz0iMjAwMDEwMDAwMDAzMDAwMjI4MTUiIENlcnRpZmljYWRvPSJNSUlGeFRDQ0E2MmdBd0lCQWdJVU1qQXdNREV3TURBd01EQXpNREF3TWpJNE1UVXdEUVlKS29aSWh2Y05BUUVMQlFBd2dnRm1NU0F3SGdZRFZRUUREQmRCTGtNdUlESWdaR1VnY0hKMVpXSmhjeWcwTURrMktURXZNQzBHQTFVRUNnd21VMlZ5ZG1samFXOGdaR1VnUVdSdGFXNXBjM1J5WVdOcHc3TnVJRlJ5YVdKMWRHRnlhV0V4T0RBMkJnTlZCQXNNTDBGa2JXbHVhWE4wY21GamFjT3piaUJrWlNCVFpXZDFjbWxrWVdRZ1pHVWdiR0VnU1c1bWIzSnRZV05wdzdOdU1Ta3dKd1lKS29aSWh2Y05BUWtCRmhwaGMybHpibVYwUUhCeWRXVmlZWE11YzJGMExtZHZZaTV0ZURFbU1DUUdBMVVFQ1F3ZFFYWXVJRWhwWkdGc1oyOGdOemNzSUVOdmJDNGdSM1ZsY25KbGNtOHhEakFNQmdOVkJCRU1CVEEyTXpBd01Rc3dDUVlEVlFRR0V3Sk5XREVaTUJjR0ExVUVDQXdRUkdsemRISnBkRzhnUm1Wa1pYSmhiREVTTUJBR0ExVUVCd3dKUTI5NWIyRmp3NkZ1TVJVd0V3WURWUVF0RXd4VFFWUTVOekEzTURGT1RqTXhJVEFmQmdrcWhraUc5dzBCQ1FJTUVsSmxjM0J2Ym5OaFlteGxPaUJCUTBSTlFUQWVGdzB4TmpFd01qVXlNVFV5TVRGYUZ3MHlNREV3TWpVeU1UVXlNVEZhTUlHeE1Sb3dHQVlEVlFRREV4RkRTVTVFUlUxRldDQlRRU0JFUlNCRFZqRWFNQmdHQTFVRUtSTVJRMGxPUkVWTlJWZ2dVMEVnUkVVZ1ExWXhHakFZQmdOVkJBb1RFVU5KVGtSRlRVVllJRk5CSUVSRklFTldNU1V3SXdZRFZRUXRFeHhNUVU0M01EQTRNVGN6VWpVZ0x5QkdWVUZDTnpjd01URTNRbGhCTVI0d0hBWURWUVFGRXhVZ0x5QkdWVUZDTnpjd01URTNUVVJHVWs1T01Ea3hGREFTQmdOVkJBc1VDMUJ5ZFdWaVlWOURSa1JKTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFndnZDaUNGREZWYVlYN3hkVlJocC8zOFVMV3RvL0xLRFNaeTF5clhLcGFxRlhxRVJKV0Y3OFlIS2YzTjVHQm9YZ3p3RlB1RFgrNWt2WTV3dFlOeHgvT3d1MnNoTlpxRkZoNkVLc3lzUU1lUDVyejZrRTFnRlllbmFQRVVQOXpqK2gwYkwzeFI1YXFvVHNxR0YyNG1LQkxvaWFLNDRwWEJ6R3pnc3haaXNoVkpWTTZYYnpOSlZvbkVVTmJJMjVEaGdXQWQ4NmYyYVUzQm1PSDJLMVJaeDQxZHRUVDU2VXNzekpsczR0UEZPRHIvY2FXdVpFdVV2THAxTTNuajdEeXU4OG1oRDJmKzFmQS9nN2t6Y1UvMXRjcEZYRi9ySXk5M0FQdmtVNzJqd3Zrcm5wcnpzK1NuRzgxKy9GMTZhaHVHc2IyRVo4OGRLSHdxeEVrd3poTXlUYlFJREFRQUJveDB3R3pBTUJnTlZIUk1CQWY4RUFqQUFNQXNHQTFVZER3UUVBd0lHd0RBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQWdFQUoveGtMOEkrZnBpbFpQKzlhTzhuOTMrMjBYeFZvbUxKamVTTCtOZzJFckwyR2dhdHBMdU41SmtuRkJrWkFoeFZJZ01hVFMyM3p6azFSTHRSYVl2SDgzbEJINUUrTStrRWpGR3AxNEZuZTFpVjJQbTN2TDRqZUxtekhnWTFLZjVIbWVWcnJwNFBVN1dRZzE2VnB5SGFKL2VvblBOaUVCVWpjeVExaUZma3pKbW5TSnZER3RmUUsyVGlFb2xESkFwWXYwT1dkbTRpczlCc2ZpOWo2bEk5L1Q2TU5aKy9MTTJML3Q3MlZhdTRyN205NEpERXphTzNBMHdIQXRROTdmakJmQmlPNU04QUVJU0FWN2VaaWRJbDNpYUpKSGtRYkJZaWlXMmdpa3JlVVpLUFVYMEhtbG5JcXFRY0JKaFdLUnU2TnFrNmFaQlRFVExMcEdydkY5T0FyVjFKU3NiZHcvWkgrUDg4UkF0NWVtNS9nand3dEZsTkh5aUtHNXcrVUZwYVpPSzNnWlAwc3Uwc2E2ZGxQZVE5RUw0SmxGa0dxUUNnU1ErTk9zWHFhT2F2Z29QNVZMeWtMd3VHbndJVW51aEJUVmVEYnpwZ3JnOUx1RjVkWXAvenMrWTlTY0pxZTVWTUFhZ0xTWVRTaE50TjhsdVY3THZ4RjlwZ1d3WmRjTTdsVXdxSm1VZGRDaVpxZG5nZzN2elRhY3RNVG9HMTZnWkE0Q1duTWdiVTRFK3I1NDErRk5NcGdBWk52czJDaVcvZUFwZmFhUW9qc1pFQUhEc0R2NEw1bjNNMUNDN2ZZakUvZDYxYVNuZzFMYU82VDFtaCtkRWZQdkx6cDd6eXp6K1VnV01oaTVDczRwY1h4MWVpYzVyN3V4UG9Cd2NDVHQzWUkxaktWVm5WNy93PSIgU3ViVG90YWw9IjEiIE1vbmVkYT0iTVhOIiBUaXBvQ2FtYmlvPSIxIiBUb3RhbD0iMS4xNiIgVGlwb0RlQ29tcHJvYmFudGU9IkkiIEx1Z2FyRXhwZWRpY2lvbj0iNDUxMDAiIHhtbG5zOmNmZGk9Imh0dHA6Ly93d3cuc2F0LmdvYi5teC9jZmQvMyIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+PGNmZGk6RW1pc29yIFJmYz0iTEFONzAwODE3M1I1IiBOb21icmU9IkNJTkRFTUVYIFNBIERFIENWIiBSZWdpbWVuRmlzY2FsPSI2MDEiIC8+PGNmZGk6UmVjZXB0b3IgUmZjPSJYRVhYMDEwMTAxMDAwIiBOb21icmU9ImNsaWVudGUgYWwgcHVibGljbyIgUmVzaWRlbmNpYUZpc2NhbD0iVVNBIiBVc29DRkRJPSJQMDEiIC8+PGNmZGk6Q29uY2VwdG9zPjxjZmRpOkNvbmNlcHRvIENsYXZlUHJvZFNlcnY9IjEwMTUxNzAxIiBDYW50aWRhZD0iMSIgQ2xhdmVVbmlkYWQ9IktHTSIgVW5pZGFkPSJraWxvcyIgRGVzY3JpcGNpb249ImFycm96IiBWYWxvclVuaXRhcmlvPSIxIiBJbXBvcnRlPSIxIj48Y2ZkaTpJbXB1ZXN0b3M+PGNmZGk6VHJhc2xhZG9zPjxjZmRpOlRyYXNsYWRvIEJhc2U9IjEiIEltcHVlc3RvPSIwMDIiIFRpcG9GYWN0b3I9IlRhc2EiIFRhc2FPQ3VvdGE9IjAuMTYwMDAwIiBJbXBvcnRlPSIwLjE2IiAvPjwvY2ZkaTpUcmFzbGFkb3M+PC9jZmRpOkltcHVlc3Rvcz48L2NmZGk6Q29uY2VwdG8+PC9jZmRpOkNvbmNlcHRvcz48Y2ZkaTpJbXB1ZXN0b3MgVG90YWxJbXB1ZXN0b3NUcmFzbGFkYWRvcz0iMC4xNiI+PGNmZGk6VHJhc2xhZG9zPjxjZmRpOlRyYXNsYWRvIEltcHVlc3RvPSIwMDIiIFRpcG9GYWN0b3I9IlRhc2EiIFRhc2FPQ3VvdGE9IjAuMTYwMDAwIiBJbXBvcnRlPSIwLjE2IiAvPjwvY2ZkaTpUcmFzbGFkb3M+PC9jZmRpOkltcHVlc3Rvcz48Y2ZkaTpDb21wbGVtZW50bz48cGFnbzEwOlBhZ29zIFZlcnNpb249IjEuMCI+PHBhZ28xMDpQYWdvIEZlY2hhUGFnbz0iMjAxNy0wMy0xNVQwMDowMDowMCIgRm9ybWFEZVBhZ29QPSIwMyIgTW9uZWRhUD0iTVhOIiBNb250bz0iMS4xMSIgTnVtT3BlcmFjaW9uPSJOdW1PcGVyYWNpb24xIiBSZmNFbWlzb3JDdGFPcmQ9IkFBQTAxMDEwMUFBQSIgTm9tQmFuY29PcmRFeHQ9Ik5vbUJhbmNvT3JkRXh0MSIgQ3RhT3JkZW5hbnRlPSIxMjM0NTY3ODkwIiBSZmNFbWlzb3JDdGFCZW49IkFBQTAxMDEwMUFBQSIgQ3RhQmVuZWZpY2lhcmlvPSIxMjM0NTY3ODkwIiBUaXBvQ2FkUGFnbz0iMDEiIENlcnRQYWdvPSJJQT09IiBDYWRQYWdvPSJDYWRQYWdvMSIgU2VsbG9QYWdvPSJJQT09Ij48cGFnbzEwOkRvY3RvUmVsYWNpb25hZG8gSWREb2N1bWVudG89IjEyMzQ1Njc4LTEyMzQtMTIzNC0xMjM0LTEyMzQ1Njc4OTAxMiIgTW9uZWRhRFI9Ik1YTiIgTWV0b2RvRGVQYWdvRFI9IlBVRSIgSW1wU2FsZG9BbnQ9IjEiIEltcFBhZ2Fkbz0iMS4xMSIgLz48cGFnbzEwOkltcHVlc3RvcyBUb3RhbEltcHVlc3Rvc1JldGVuaWRvcz0iMS4xMSIgVG90YWxJbXB1ZXN0b3NUcmFzbGFkYWRvcz0iMSI+PHBhZ28xMDpSZXRlbmNpb25lcz48cGFnbzEwOlJldGVuY2lvbiBJbXB1ZXN0bz0iMDAyIiBJbXBvcnRlPSIxLjExIiAvPjwvcGFnbzEwOlJldGVuY2lvbmVzPjxwYWdvMTA6VHJhc2xhZG9zPjxwYWdvMTA6VHJhc2xhZG8gSW1wdWVzdG89IjAwMyIgVGlwb0ZhY3Rvcj0iQ3VvdGEiIFRhc2FPQ3VvdGE9IjAuMDAwMDAwIiBJbXBvcnRlPSIxIiAvPjwvcGFnbzEwOlRyYXNsYWRvcz48L3BhZ28xMDpJbXB1ZXN0b3M+PC9wYWdvMTA6UGFnbz48L3BhZ28xMDpQYWdvcz48L2NmZGk6Q29tcGxlbWVudG8+PC9jZmRpOkNvbXByb2JhbnRlPg==";
- public static String nomina10 = "";
- public static String nomina10_b64 = "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48Y2ZkaTpDb21wcm9iYW50ZSB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuc2F0LmdvYi5teC9jZmQvMyBodHRwOi8vd3d3LnNhdC5nb2IubXgvc2l0aW9faW50ZXJuZXQvY2ZkLzMvY2ZkdjMzLnhzZCBodHRwOi8vd3d3LnNhdC5nb2IubXgvbm9taW5hMTIgaHR0cDovL3d3dy5zYXQuZ29iLm14L3NpdGlvX2ludGVybmV0L2NmZC9ub21pbmEvbm9taW5hMTIueHNkIiB4bWxuczpub21pbmExMj0iaHR0cDovL3d3dy5zYXQuZ29iLm14L25vbWluYTEyIiBWZXJzaW9uPSIzLjMiIFNlcmllPSJSb2d1ZU9uZSIgRm9saW89IkhORksyMzEiIEZlY2hhPSIyMDE3LTA1LTE0VDExOjQzOjI0IiBTZWxsbz0iTCtkK1c1dStwWm9YMUhwM2FGc0xvMUJxR0gxT3F1Zk5EVEtrdFNXdkpiaGllZmtwaVJLS2J1ZVRlYnRGNTR3Q09ma0thVzlRZU5mT25qdXVSNDhNTUJTNFh3YWJiY2Zrb2ZZVzE0OTYyY0x2NVlPVEh2dWFkRUJ4SDJxMGFJSjQ1T2VEOXU5VDZvSmt5Vm5pNWZUYXk1eDA0SWFRNnVuZWhEZ3RieitIUHh2SjZnSXdVUEFLN1N2MlA1eCtGK3JCOVNaWXZHMGpySk5oNkhaZWRza3JobFNRVTkrc1dlcG5GbGk2Vk5ZT0pFMGkxNlhtN1k5cGd5K0xWcTdhU2oySnp5R3p0S0dYdHlDdlhZOXEzS3F3azQ4S2Mrdk1SdlA3ZnphbXdZWXN2QmQxd0VsS0QvbVloVGlWV3RlNnNoMFZZbkpoZmtXbENqMUFOVHlEZytwTDhRPT0iIEZvcm1hUGFnbz0iMDEiIE5vQ2VydGlmaWNhZG89IjIwMDAxMDAwMDAwMzAwMDIyODE1IiBDZXJ0aWZpY2Fkbz0iTUlJRnhUQ0NBNjJnQXdJQkFnSVVNakF3TURFd01EQXdNREF6TURBd01qSTRNVFV3RFFZSktvWklodmNOQVFFTEJRQXdnZ0ZtTVNBd0hnWURWUVFEREJkQkxrTXVJRElnWkdVZ2NISjFaV0poY3lnME1EazJLVEV2TUMwR0ExVUVDZ3dtVTJWeWRtbGphVzhnWkdVZ1FXUnRhVzVwYzNSeVlXTnB3N051SUZSeWFXSjFkR0Z5YVdFeE9EQTJCZ05WQkFzTUwwRmtiV2x1YVhOMGNtRmphY096YmlCa1pTQlRaV2QxY21sa1lXUWdaR1VnYkdFZ1NXNW1iM0p0WVdOcHc3TnVNU2t3SndZSktvWklodmNOQVFrQkZocGhjMmx6Ym1WMFFIQnlkV1ZpWVhNdWMyRjBMbWR2WWk1dGVERW1NQ1FHQTFVRUNRd2RRWFl1SUVocFpHRnNaMjhnTnpjc0lFTnZiQzRnUjNWbGNuSmxjbTh4RGpBTUJnTlZCQkVNQlRBMk16QXdNUXN3Q1FZRFZRUUdFd0pOV0RFWk1CY0dBMVVFQ0F3UVJHbHpkSEpwZEc4Z1JtVmtaWEpoYkRFU01CQUdBMVVFQnd3SlEyOTViMkZqdzZGdU1SVXdFd1lEVlFRdEV3eFRRVlE1TnpBM01ERk9Uak14SVRBZkJna3Foa2lHOXcwQkNRSU1FbEpsYzNCdmJuTmhZbXhsT2lCQlEwUk5RVEFlRncweE5qRXdNalV5TVRVeU1URmFGdzB5TURFd01qVXlNVFV5TVRGYU1JR3hNUm93R0FZRFZRUURFeEZEU1U1RVJVMUZXQ0JUUVNCRVJTQkRWakVhTUJnR0ExVUVLUk1SUTBsT1JFVk5SVmdnVTBFZ1JFVWdRMVl4R2pBWUJnTlZCQW9URVVOSlRrUkZUVVZZSUZOQklFUkZJRU5XTVNVd0l3WURWUVF0RXh4TVFVNDNNREE0TVRjelVqVWdMeUJHVlVGQ056Y3dNVEUzUWxoQk1SNHdIQVlEVlFRRkV4VWdMeUJHVlVGQ056Y3dNVEUzVFVSR1VrNU9NRGt4RkRBU0JnTlZCQXNVQzFCeWRXVmlZVjlEUmtSSk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBZ3Z2Q2lDRkRGVmFZWDd4ZFZSaHAvMzhVTFd0by9MS0RTWnkxeXJYS3BhcUZYcUVSSldGNzhZSEtmM041R0JvWGd6d0ZQdURYKzVrdlk1d3RZTnh4L093dTJzaE5acUZGaDZFS3N5c1FNZVA1cno2a0UxZ0ZZZW5hUEVVUDl6aitoMGJMM3hSNWFxb1RzcUdGMjRtS0JMb2lhSzQ0cFhCekd6Z3N4WmlzaFZKVk02WGJ6TkpWb25FVU5iSTI1RGhnV0FkODZmMmFVM0JtT0gySzFSWng0MWR0VFQ1NlVzc3pKbHM0dFBGT0RyL2NhV3VaRXVVdkxwMU0zbmo3RHl1ODhtaEQyZisxZkEvZzdremNVLzF0Y3BGWEYvckl5OTNBUHZrVTcyand2a3JucHJ6cytTbkc4MSsvRjE2YWh1R3NiMkVaODhkS0h3cXhFa3d6aE15VGJRSURBUUFCb3gwd0d6QU1CZ05WSFJNQkFmOEVBakFBTUFzR0ExVWREd1FFQXdJR3dEQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFKL3hrTDhJK2ZwaWxaUCs5YU84bjkzKzIwWHhWb21MSmplU0wrTmcyRXJMMkdnYXRwTHVONUprbkZCa1pBaHhWSWdNYVRTMjN6emsxUkx0UmFZdkg4M2xCSDVFK00ra0VqRkdwMTRGbmUxaVYyUG0zdkw0amVMbXpIZ1kxS2Y1SG1lVnJycDRQVTdXUWcxNlZweUhhSi9lb25QTmlFQlVqY3lRMWlGZmt6Sm1uU0p2REd0ZlFLMlRpRW9sREpBcFl2ME9XZG00aXM5QnNmaTlqNmxJOS9UNk1OWisvTE0yTC90NzJWYXU0cjdtOTRKREV6YU8zQTB3SEF0UTk3ZmpCZkJpTzVNOEFFSVNBVjdlWmlkSWwzaWFKSkhrUWJCWWlpVzJnaWtyZVVaS1BVWDBIbWxuSXFxUWNCSmhXS1J1Nk5xazZhWkJURVRMTHBHcnZGOU9BclYxSlNzYmR3L1pIK1A4OFJBdDVlbTUvZ2p3d3RGbE5IeWlLRzV3K1VGcGFaT0szZ1pQMHN1MHNhNmRsUGVROUVMNEpsRmtHcVFDZ1NRK05Pc1hxYU9hdmdvUDVWTHlrTHd1R253SVVudWhCVFZlRGJ6cGdyZzlMdUY1ZFlwL3pzK1k5U2NKcWU1Vk1BYWdMU1lUU2hOdE44bHVWN0x2eEY5cGdXd1pkY003bFV3cUptVWRkQ2lacWRuZ2czdnpUYWN0TVRvRzE2Z1pBNENXbk1nYlU0RStyNTQxK0ZOTXBnQVpOdnMyQ2lXL2VBcGZhYVFvanNaRUFIRHNEdjRMNW4zTTFDQzdmWWpFL2Q2MWFTbmcxTGFPNlQxbWgrZEVmUHZMenA3enl6eitVZ1dNaGk1Q3M0cGNYeDFlaWM1cjd1eFBvQndjQ1R0M1lJMWpLVlZuVjcvdz0iIFN1YlRvdGFsPSIyMDAuMDAiIE1vbmVkYT0iTVhOIiBUaXBvQ2FtYmlvPSIxIiBUb3RhbD0iNjAzLjI4IiBUaXBvRGVDb21wcm9iYW50ZT0iSSIgTWV0b2RvUGFnbz0iUFVFIiBMdWdhckV4cGVkaWNpb249IjA2MzAwIiB4bWxuczpjZmRpPSJodHRwOi8vd3d3LnNhdC5nb2IubXgvY2ZkLzMiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPjxjZmRpOkVtaXNvciBSZmM9IkxBTjcwMDgxNzNSNSIgTm9tYnJlPSJDSU5ERU1FWCBTQSBERSBDViIgUmVnaW1lbkZpc2NhbD0iNjAxIiAvPjxjZmRpOlJlY2VwdG9yIFJmYz0iQUFBMDEwMTAxQUFBIiBOb21icmU9IlJvZG9sZm8gQ2FycmFuemEgUmFtb3MiIFVzb0NGREk9IkcwMyIgLz48Y2ZkaTpDb25jZXB0b3M+PGNmZGk6Q29uY2VwdG8gQ2xhdmVQcm9kU2Vydj0iNTAyMTE1MDMiIE5vSWRlbnRpZmljYWNpb249IlVUNDIxNTExIiBDYW50aWRhZD0iMSIgQ2xhdmVVbmlkYWQ9Ikg4NyIgVW5pZGFkPSJQaWV6YSIgRGVzY3JpcGNpb249IkNpZ2Fycm9zIiBWYWxvclVuaXRhcmlvPSIyMDAuMDAiIEltcG9ydGU9IjIwMC4wMCI+PGNmZGk6SW1wdWVzdG9zPjxjZmRpOlRyYXNsYWRvcz48Y2ZkaTpUcmFzbGFkbyBCYXNlPSIyMDAuMDAiIEltcHVlc3RvPSIwMDIiIFRpcG9GYWN0b3I9IlRhc2EiIFRhc2FPQ3VvdGE9IjAuMTYwMDAwIiBJbXBvcnRlPSIzMi4wOCIgLz48Y2ZkaTpUcmFzbGFkbyBCYXNlPSIyMzIuMDAiIEltcHVlc3RvPSIwMDMiIFRpcG9GYWN0b3I9IlRhc2EiIFRhc2FPQ3VvdGE9IjEuNjAwMDAwIiBJbXBvcnRlPSIzNzEuMjAiIC8+PC9jZmRpOlRyYXNsYWRvcz48L2NmZGk6SW1wdWVzdG9zPjwvY2ZkaTpDb25jZXB0bz48L2NmZGk6Q29uY2VwdG9zPjxjZmRpOkltcHVlc3RvcyBUb3RhbEltcHVlc3Rvc1RyYXNsYWRhZG9zPSI0MDMuMjgiPjxjZmRpOlRyYXNsYWRvcz48Y2ZkaTpUcmFzbGFkbyBJbXB1ZXN0bz0iMDAyIiBUaXBvRmFjdG9yPSJUYXNhIiBUYXNhT0N1b3RhPSIwLjE2MDAwMCIgSW1wb3J0ZT0iMzIuMDgiIC8+PGNmZGk6VHJhc2xhZG8gSW1wdWVzdG89IjAwMyIgVGlwb0ZhY3Rvcj0iVGFzYSIgVGFzYU9DdW90YT0iMS42MDAwMDAiIEltcG9ydGU9IjM3MS4yMCIgLz48L2NmZGk6VHJhc2xhZG9zPjwvY2ZkaTpJbXB1ZXN0b3M+PGNmZGk6Q29tcGxlbWVudG8+PG5vbWluYTEyOk5vbWluYSBWZXJzaW9uPSIxLjIiIFRpcG9Ob21pbmE9Ik8iIEZlY2hhUGFnbz0iMjAxNi0wOS0wOSIgRmVjaGFJbmljaWFsUGFnbz0iMjAxNi0wOS0xNSIgRmVjaGFGaW5hbFBhZ289IjIwMTYtMDktMzAiIE51bURpYXNQYWdhZG9zPSIxNSIgVG90YWxEZWR1Y2Npb25lcz0iMTEyLjAzIiBUb3RhbFBlcmNlcGNpb25lcz0iMTE1LjAwIj48bm9taW5hMTI6RW1pc29yIFJlZ2lzdHJvUGF0cm9uYWw9IkExMjM0NTY3ODkwIiAvPjxub21pbmExMjpSZWNlcHRvciBDdXJwPSJBQUFBMDAxMDMwSFNQQkJCMDAiIE51bVNlZ3VyaWRhZFNvY2lhbD0iMTIzNDU2Nzg5MDEiIEZlY2hhSW5pY2lvUmVsTGFib3JhbD0iMjAxMy0wOS0yMSIgQW50aWfDvGVkYWQ9IlAxNThXIiBUaXBvQ29udHJhdG89IjAxIiBTaW5kaWNhbGl6YWRvPSJObyIgVGlwb0pvcm5hZGE9IjA2IiBUaXBvUmVnaW1lbj0iMDIiIE51bUVtcGxlYWRvPSIxMjMiIERlcGFydGFtZW50bz0iRGVwYXJ0YW1lbnRvIiBQdWVzdG89IlB1ZXN0byIgUmllc2dvUHVlc3RvPSIxIiBQZXJpb2RpY2lkYWRQYWdvPSIxMCIgQmFuY289IjAxMiIgQ3VlbnRhQmFuY2FyaWE9IjU1MTIzNDU2NzgiIFNhbGFyaW9CYXNlQ290QXBvcj0iMTIzNC4xMiIgU2FsYXJpb0RpYXJpb0ludGVncmFkbz0iMTIzNC4xMiIgQ2xhdmVFbnRGZWQ9IkRJRiIgLz48bm9taW5hMTI6UGVyY2VwY2lvbmVzIFRvdGFsU3VlbGRvcz0iMTE1LjAwIiBUb3RhbEV4ZW50bz0iNTkuMDAiIFRvdGFsR3JhdmFkbz0iNTYuMDAiPjxub21pbmExMjpQZXJjZXBjaW9uIENsYXZlPSIwMTIiIENvbmNlcHRvPSJDb25jZXB0byBUaXBvIDAxMiIgSW1wb3J0ZUV4ZW50bz0iOC4wMCIgSW1wb3J0ZUdyYXZhZG89IjIuMDAiIFRpcG9QZXJjZXBjaW9uPSIwMTIiIC8+PG5vbWluYTEyOlBlcmNlcGNpb24gQ2xhdmU9IjAwMSIgQ29uY2VwdG89IkNvbmNlcHRvIFRpcG8gMDAxIiBJbXBvcnRlRXhlbnRvPSIxLjAwIiBJbXBvcnRlR3JhdmFkbz0iMi4wMCIgVGlwb1BlcmNlcGNpb249IjAwMSIgLz48bm9taW5hMTI6UGVyY2VwY2lvbiBDbGF2ZT0iMDE0IiBDb25jZXB0bz0iQ29uY2VwdG8gVGlwbyAwMTQiIEltcG9ydGVFeGVudG89IjUwLjAwIiBJbXBvcnRlR3JhdmFkbz0iNTIuMDAiIFRpcG9QZXJjZXBjaW9uPSIwMTQiIC8+PC9ub21pbmExMjpQZXJjZXBjaW9uZXM+PG5vbWluYTEyOkRlZHVjY2lvbmVzIFRvdGFsT3RyYXNEZWR1Y2Npb25lcz0iMTEyLjAzIj48bm9taW5hMTI6RGVkdWNjaW9uIFRpcG9EZWR1Y2Npb249IjAwMSIgQ2xhdmU9IjAwMSIgQ29uY2VwdG89IkRlZHVjY2nDs24gVGlwbyAwMDEiIEltcG9ydGU9IjIyLjUzIiAvPjxub21pbmExMjpEZWR1Y2Npb24gVGlwb0RlZHVjY2lvbj0iMDE4IiBDbGF2ZT0iMDE4IiBDb25jZXB0bz0iRGVkdWNjacOzbiBUaXBvIDAxOCIgSW1wb3J0ZT0iNzEuNjAiIC8+PG5vbWluYTEyOkRlZHVjY2lvbiBUaXBvRGVkdWNjaW9uPSIwMTkiIENsYXZlPSIwMTkiIENvbmNlcHRvPSJEZWR1Y2Npw7NuIFRpcG8gMDE5IiBJbXBvcnRlPSIxNy45MCIgLz48L25vbWluYTEyOkRlZHVjY2lvbmVzPjxub21pbmExMjpJbmNhcGFjaWRhZGVzPjxub21pbmExMjpJbmNhcGFjaWRhZCBEaWFzSW5jYXBhY2lkYWQ9IjEiIFRpcG9JbmNhcGFjaWRhZD0iMDIiIEltcG9ydGVNb25ldGFyaW89IjEwMi4wMCIgLz48L25vbWluYTEyOkluY2FwYWNpZGFkZXM+PC9ub21pbmExMjpOb21pbmE+PC9jZmRpOkNvbXBsZW1lbnRvPjwvY2ZkaTpDb21wcm9iYW50ZT4=";
+
+
public static String url_pruebas = "http://services.test.sw.com.mx";
public static String url_prod = "https://services.sw.com.mx";
- public static String xml_b = "";
- public String url_beta = "http://swservicestest-rc.azurewebsites.net";//"http://services.test.sw.com.mx
- public static String dummy_xml_string = "";
+
+ public String genc10(){
+ return signXML("");
+ }
+
+ public String genPagos10(){
+ return signXML("");
+ }
+
+ public String genNomina10(){
+ return signXML("");
+ }
+
+ public String StringgenBasico(){
+ return signXML("");
+ }
+
+ public boolean getRandomBoolean() {
+ Random random = new Random();
+ return random.nextBoolean();
+ }
+
public static String remove2(String input) {
@@ -41,11 +88,97 @@ public static String remove2(String input) {
return pattern.matcher(normalized).replaceAll("");
}
- public static String toBase64(String xml){
+
+
+ public String toBase64(String xmlF){
+
+ String xml = this.signXML(xmlF);
byte[] bytesEncoded = Base64.encodeBase64(xml.getBytes());
return new String(bytesEncoded);
}
+ public String changeDate(String xml) {
+ SimpleDateFormat date = new SimpleDateFormat("yyyy-MM-dd");
+ SimpleDateFormat time = new SimpleDateFormat("HH:mm:ss");
+ String datetime;
+ datetime = date.format(new Date())+"T"+time.format(new Date());
+
+ DocumentBuilderFactory factory = newInstance();
+ DocumentBuilder builder;
+ TransformerFactory tf = TransformerFactory.newInstance();
+ Transformer transformer;
+ Sign si = new Sign();
+ try
+ { UUID uuid = UUID.randomUUID();
+ String randomUUIDString = uuid.toString().replace("-","");
+ long unixTime = System.currentTimeMillis() / 1000L;
+ builder = factory.newDocumentBuilder();
+ Document doc = builder.parse( new InputSource( new StringReader( xml ) ) );
+ doc.getDocumentElement().setAttribute("Fecha",datetime);
+ if(getRandomBoolean()){
+ doc.getDocumentElement().setAttribute("Folio",unixTime+"k");
+ }else{
+ doc.getDocumentElement().setAttribute("Folio",randomUUIDString+"k");
+ }
+
+ transformer = tf.newTransformer();
+ StringWriter writer = new StringWriter();
+ transformer.transform(new DOMSource(doc), new StreamResult(writer));
+ String output = writer.getBuffer().toString();
+
+ return output;
+ } catch (Exception e) {
+ e.printStackTrace();
+ return null;
+ }
+
+ }
+
+ public String signXML(String xml){
+ Sign si = new Sign();
+ try{
+ String xmlDateChanged = changeDate(xml);
+ String cadena = si.getCadena(xmlDateChanged);
+ String sello = si.getSign(cadena,"12345678a");
+
+ return putsSign(xmlDateChanged,sello);
+
+ }catch (Exception e){
+
+ }
+ return null;
+ }
+
+ public String putsSign(String xml, String sello){
+
+ try{
+
+
+ DocumentBuilderFactory factory = newInstance();
+ DocumentBuilder builder;
+ TransformerFactory tf = TransformerFactory.newInstance();
+ Transformer transformer;
+
+ builder = factory.newDocumentBuilder();
+ Document doc = builder.parse( new InputSource( new StringReader( xml ) ) );
+ doc.getDocumentElement().setAttribute("Sello",sello);
+ transformer = tf.newTransformer();
+ StringWriter writer = new StringWriter();
+ transformer.transform(new DOMSource(doc), new StreamResult(writer));
+ String output = writer.getBuffer().toString();
+
+
+ return output;
+
+ }catch (Exception e){
+
+ }
+
+ return null;
+ }
+
+
+
public static String b64xml = "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48Y2ZkaTpDb21wcm9iYW50ZSB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuc2F0LmdvYi5teC9jZmQvMyBodHRwOi8vd3d3LnNhdC5nb2IubXgvc2l0aW9faW50ZXJuZXQvY2ZkLzMvY2ZkdjMzLnhzZCIgVmVyc2lvbj0iMy4zIiBGZWNoYT0iMjAxNy0wNy0xN1QxNzowNToxMiIgU2VsbG89IkpzWGp5Y2tkdm9MdDI3NCtKSUtUeVJnVGliZ1E5ZjZ3OTZtaVVjUmt1UVZEamxwRWErMmFtc2QxUjE5VGEwOURQSCtWcXdNNE5SOWN1QnRTKzJ4RUoyTU9TOWYyVGtkYlY4ZEhZS0xyMi9wZW4wSnNOaTZSTmpwVEFSbzZ5b2pUbGY5NHorLytScUFleGp6MVRpNDRrTFE1R1Y4VE8vd2M2eHhkc091aVFFQ3pYTFhKM1lIVjBucWd3UkxtaXAwZnlxWWlJUm5vcXJyQmlHdHViWEtrYmJDY3VIY0VQUXpZdElKNS9jZVozMEJnNkcyeVJiMm5VZkZsZE91cW9PTjlKQzFBb21reGljeVJoL2NjdkZBb1kySHNiYVMycHNqd1pDb0xzSFM5V3dBbE52ZHloOFJMQm93elpkd09IQmdXYnd6a09jb21oYlRud0M0TXR3NDRwUT09IiBGb3JtYVBhZ289IjAxIiBOb0NlcnRpZmljYWRvPSIyMDAwMTAwMDAwMDMwMDAyMjgxNSIgQ2VydGlmaWNhZG89Ik1JSUZ4VENDQTYyZ0F3SUJBZ0lVTWpBd01ERXdNREF3TURBek1EQXdNakk0TVRVd0RRWUpLb1pJaHZjTkFRRUxCUUF3Z2dGbU1TQXdIZ1lEVlFRRERCZEJMa011SURJZ1pHVWdjSEoxWldKaGN5ZzBNRGsyS1RFdk1DMEdBMVVFQ2d3bVUyVnlkbWxqYVc4Z1pHVWdRV1J0YVc1cGMzUnlZV05wdzdOdUlGUnlhV0oxZEdGeWFXRXhPREEyQmdOVkJBc01MMEZrYldsdWFYTjBjbUZqYWNPemJpQmtaU0JUWldkMWNtbGtZV1FnWkdVZ2JHRWdTVzVtYjNKdFlXTnB3N051TVNrd0p3WUpLb1pJaHZjTkFRa0JGaHBoYzJsemJtVjBRSEJ5ZFdWaVlYTXVjMkYwTG1kdllpNXRlREVtTUNRR0ExVUVDUXdkUVhZdUlFaHBaR0ZzWjI4Z056Y3NJRU52YkM0Z1IzVmxjbkpsY204eERqQU1CZ05WQkJFTUJUQTJNekF3TVFzd0NRWURWUVFHRXdKTldERVpNQmNHQTFVRUNBd1FSR2x6ZEhKcGRHOGdSbVZrWlhKaGJERVNNQkFHQTFVRUJ3d0pRMjk1YjJGanc2RnVNUlV3RXdZRFZRUXRFd3hUUVZRNU56QTNNREZPVGpNeElUQWZCZ2txaGtpRzl3MEJDUUlNRWxKbGMzQnZibk5oWW14bE9pQkJRMFJOUVRBZUZ3MHhOakV3TWpVeU1UVXlNVEZhRncweU1ERXdNalV5TVRVeU1URmFNSUd4TVJvd0dBWURWUVFERXhGRFNVNUVSVTFGV0NCVFFTQkVSU0JEVmpFYU1CZ0dBMVVFS1JNUlEwbE9SRVZOUlZnZ1UwRWdSRVVnUTFZeEdqQVlCZ05WQkFvVEVVTkpUa1JGVFVWWUlGTkJJRVJGSUVOV01TVXdJd1lEVlFRdEV4eE1RVTQzTURBNE1UY3pValVnTHlCR1ZVRkNOemN3TVRFM1FsaEJNUjR3SEFZRFZRUUZFeFVnTHlCR1ZVRkNOemN3TVRFM1RVUkdVazVPTURreEZEQVNCZ05WQkFzVUMxQnlkV1ZpWVY5RFJrUkpNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQWd2dkNpQ0ZERlZhWVg3eGRWUmhwLzM4VUxXdG8vTEtEU1p5MXlyWEtwYXFGWHFFUkpXRjc4WUhLZjNONUdCb1hnendGUHVEWCs1a3ZZNXd0WU54eC9Pd3Uyc2hOWnFGRmg2RUtzeXNRTWVQNXJ6NmtFMWdGWWVuYVBFVVA5emoraDBiTDN4UjVhcW9Uc3FHRjI0bUtCTG9pYUs0NHBYQnpHemdzeFppc2hWSlZNNlhiek5KVm9uRVVOYkkyNURoZ1dBZDg2ZjJhVTNCbU9IMksxUlp4NDFkdFRUNTZVc3N6SmxzNHRQRk9Eci9jYVd1WkV1VXZMcDFNM25qN0R5dTg4bWhEMmYrMWZBL2c3a3pjVS8xdGNwRlhGL3JJeTkzQVB2a1U3Mmp3dmtybnByenMrU25HODErL0YxNmFodUdzYjJFWjg4ZEtId3F4RWt3emhNeVRiUUlEQVFBQm94MHdHekFNQmdOVkhSTUJBZjhFQWpBQU1Bc0dBMVVkRHdRRUF3SUd3REFOQmdrcWhraUc5dzBCQVFzRkFBT0NBZ0VBSi94a0w4SStmcGlsWlArOWFPOG45MysyMFh4Vm9tTEpqZVNMK05nMkVyTDJHZ2F0cEx1TjVKa25GQmtaQWh4VklnTWFUUzIzenprMVJMdFJhWXZIODNsQkg1RStNK2tFakZHcDE0Rm5lMWlWMlBtM3ZMNGplTG16SGdZMUtmNUhtZVZycnA0UFU3V1FnMTZWcHlIYUovZW9uUE5pRUJVamN5UTFpRmZrekptblNKdkRHdGZRSzJUaUVvbERKQXBZdjBPV2RtNGlzOUJzZmk5ajZsSTkvVDZNTlorL0xNMkwvdDcyVmF1NHI3bTk0SkRFemFPM0Ewd0hBdFE5N2ZqQmZCaU81TThBRUlTQVY3ZVppZElsM2lhSkpIa1FiQllpaVcyZ2lrcmVVWktQVVgwSG1sbklxcVFjQkpoV0tSdTZOcWs2YVpCVEVUTExwR3J2RjlPQXJWMUpTc2Jkdy9aSCtQODhSQXQ1ZW01L2dqd3d0RmxOSHlpS0c1dytVRnBhWk9LM2daUDBzdTBzYTZkbFBlUTlFTDRKbEZrR3FRQ2dTUStOT3NYcWFPYXZnb1A1Vkx5a0x3dUdud0lVbnVoQlRWZURienBncmc5THVGNWRZcC96cytZOVNjSnFlNVZNQWFnTFNZVFNoTnROOGx1VjdMdnhGOXBnV3daZGNNN2xVd3FKbVVkZENpWnFkbmdnM3Z6VGFjdE1Ub0cxNmdaQTRDV25NZ2JVNEUrcjU0MStGTk1wZ0FaTnZzMkNpVy9lQXBmYWFRb2pzWkVBSERzRHY0TDVuM00xQ0M3ZllqRS9kNjFhU25nMUxhTzZUMW1oK2RFZlB2THpwN3p5enorVWdXTWhpNUNzNHBjWHgxZWljNXI3dXhQb0J3Y0NUdDNZSTFqS1ZWblY3L3c9IiBTdWJUb3RhbD0iMSIgRGVzY3VlbnRvPSIwLjEiIE1vbmVkYT0iTVhOIiBUaXBvQ2FtYmlvPSIxIiBUb3RhbD0iMS4wNiIgVGlwb0RlQ29tcHJvYmFudGU9IkkiIE1ldG9kb1BhZ289IlBVRSIgTHVnYXJFeHBlZGljaW9uPSI0NTEwMCIgeG1sbnM6Y2ZkaT0iaHR0cDovL3d3dy5zYXQuZ29iLm14L2NmZC8zIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj48Y2ZkaTpFbWlzb3IgUmZjPSJMQU43MDA4MTczUjUiIE5vbWJyZT0iQ0lOREVNRVggU0EgREUgQ1YiIFJlZ2ltZW5GaXNjYWw9IjYwMSIgLz48Y2ZkaTpSZWNlcHRvciBSZmM9IlhFWFgwMTAxMDEwMDAiIE5vbWJyZT0iY2xpZW50ZSBhbCBwdWJsaWNvIiBVc29DRkRJPSJQMDEiIC8+PGNmZGk6Q29uY2VwdG9zPjxjZmRpOkNvbmNlcHRvIENsYXZlUHJvZFNlcnY9IjEwMTUxNzAxIiBDYW50aWRhZD0iMSIgQ2xhdmVVbmlkYWQ9IktHTSIgVW5pZGFkPSJraWxvcyIgRGVzY3JpcGNpb249ImFycm96IiBWYWxvclVuaXRhcmlvPSIxIiBJbXBvcnRlPSIxIiBEZXNjdWVudG89IjAuMSI+PGNmZGk6SW1wdWVzdG9zPjxjZmRpOlRyYXNsYWRvcz48Y2ZkaTpUcmFzbGFkbyBCYXNlPSIxIiBJbXB1ZXN0bz0iMDAyIiBUaXBvRmFjdG9yPSJUYXNhIiBUYXNhT0N1b3RhPSIwLjE2MDAwMCIgSW1wb3J0ZT0iMC4xNiIgLz48L2NmZGk6VHJhc2xhZG9zPjwvY2ZkaTpJbXB1ZXN0b3M+PC9jZmRpOkNvbmNlcHRvPjwvY2ZkaTpDb25jZXB0b3M+PGNmZGk6SW1wdWVzdG9zIFRvdGFsSW1wdWVzdG9zVHJhc2xhZGFkb3M9IjAuMTYiPjxjZmRpOlRyYXNsYWRvcz48Y2ZkaTpUcmFzbGFkbyBJbXB1ZXN0bz0iMDAyIiBUaXBvRmFjdG9yPSJUYXNhIiBUYXNhT0N1b3RhPSIwLjE2MDAwMCIgSW1wb3J0ZT0iMC4xNiIgLz48L2NmZGk6VHJhc2xhZG9zPjwvY2ZkaTpJbXB1ZXN0b3M+PGNmZGk6Q29tcGxlbWVudG8gLz48L2NmZGk6Q29tcHJvYmFudGU+";
public static boolean isNoAlphaNumeric(String s) {
return s.matches("[ \\w]+");
diff --git a/src/test/java/Tests/assets/ComercioExterior11.xslt b/src/test/java/Tests/assets/ComercioExterior11.xslt
new file mode 100644
index 0000000..ebc624a
--- /dev/null
+++ b/src/test/java/Tests/assets/ComercioExterior11.xslt
@@ -0,0 +1,181 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/test/java/Tests/assets/Pagos10.xslt b/src/test/java/Tests/assets/Pagos10.xslt
new file mode 100644
index 0000000..c408b94
--- /dev/null
+++ b/src/test/java/Tests/assets/Pagos10.xslt
@@ -0,0 +1,165 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/test/java/Tests/assets/Sign.java b/src/test/java/Tests/assets/Sign.java
new file mode 100644
index 0000000..391e0c1
--- /dev/null
+++ b/src/test/java/Tests/assets/Sign.java
@@ -0,0 +1,98 @@
+package Tests.assets;
+
+
+
+
+
+
+import org.apache.commons.ssl.PKCS8Key;
+import javax.xml.bind.DatatypeConverter;
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
+
+import javax.xml.transform.*;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+import java.io.*;
+import java.security.KeyFactory;
+import java.security.PrivateKey;
+import java.security.Signature;
+import java.security.cert.X509Certificate;
+import java.security.spec.PKCS8EncodedKeySpec;
+
+
+
+/**
+ * Created by asalvio on 30/11/2017.
+ */
+public class Sign {
+ private String getKey() {
+
+
+ try {
+ File file = new File("src/test/java/Tests/assets/key.key"); //path: es la ruta del archivo de llave privada
+ FileInputStream fileInputStream = new FileInputStream(file);
+ byte[] fileBytes = new byte[fileInputStream.available()];
+ fileInputStream.read(fileBytes);
+ fileInputStream.close();
+
+ String fileString = DatatypeConverter.printBase64Binary(fileBytes);
+
+ return fileString;
+ } catch (IOException e) {
+ e.printStackTrace();
+ return null;
+ }
+
+
+ }
+
+ public String getSign(String cadena, String keyWord){
+
+ try {
+ String archivoLlavePrivada = this.getKey();
+ InputStream myInputStream = new ByteArrayInputStream(DatatypeConverter.parseBase64Binary(archivoLlavePrivada));
+ PKCS8Key pkcs8 = new PKCS8Key(myInputStream, keyWord.toCharArray());
+ java.security.PrivateKey pk = pkcs8.getPrivateKey();
+ Signature signature = Signature.getInstance("SHA256withRSA");
+ signature.initSign(pk);
+ signature.update(cadena.getBytes("UTF-8"));
+ return new String(DatatypeConverter.printBase64Binary(signature.sign()));
+
+ }catch (Exception e){
+ e.printStackTrace();
+ }
+
+ return null;
+ }
+
+
+ public String getCadena(String xml) {
+
+
+ try {
+
+
+
+ TransformerFactory transformerFactory = TransformerFactory.newInstance();
+
+
+ Source xslt = new StreamSource(new File("src/test/java/Tests/assets/cadenaoriginal_3_3.xslt"));
+ Transformer transformer = transformerFactory.newTransformer(xslt);
+ Source xmlSource = new StreamSource(new StringReader(xml));
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ Result out = new StreamResult(baos);
+ transformer.transform(xmlSource, out);
+ byte[] cadenaOriginalArray = baos.toByteArray();
+ String cadOrig = new String(cadenaOriginalArray, "UTF-8");
+ return cadOrig;
+ } catch (TransformerConfigurationException e) {
+ e.printStackTrace();
+ } catch (TransformerException e) {
+ e.printStackTrace();
+ } catch (UnsupportedEncodingException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+}
diff --git a/src/test/java/Tests/assets/TuristaPasajeroExtranjero.xslt b/src/test/java/Tests/assets/TuristaPasajeroExtranjero.xslt
new file mode 100644
index 0000000..369e16f
--- /dev/null
+++ b/src/test/java/Tests/assets/TuristaPasajeroExtranjero.xslt
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/test/java/Tests/assets/aerolineas.xslt b/src/test/java/Tests/assets/aerolineas.xslt
new file mode 100644
index 0000000..e5c38d9
--- /dev/null
+++ b/src/test/java/Tests/assets/aerolineas.xslt
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/test/java/Tests/assets/cadenaoriginal_3_3.xslt b/src/test/java/Tests/assets/cadenaoriginal_3_3.xslt
new file mode 100644
index 0000000..fe1be76
--- /dev/null
+++ b/src/test/java/Tests/assets/cadenaoriginal_3_3.xslt
@@ -0,0 +1,349 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |||
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/test/java/Tests/assets/cer.cer b/src/test/java/Tests/assets/cer.cer
new file mode 100644
index 0000000..e4a33bb
Binary files /dev/null and b/src/test/java/Tests/assets/cer.cer differ
diff --git a/src/test/java/Tests/assets/certificadodedestruccion.xslt b/src/test/java/Tests/assets/certificadodedestruccion.xslt
new file mode 100644
index 0000000..6118240
--- /dev/null
+++ b/src/test/java/Tests/assets/certificadodedestruccion.xslt
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/test/java/Tests/assets/cfdiregistrofiscal.xslt b/src/test/java/Tests/assets/cfdiregistrofiscal.xslt
new file mode 100644
index 0000000..fc36c67
--- /dev/null
+++ b/src/test/java/Tests/assets/cfdiregistrofiscal.xslt
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/test/java/Tests/assets/cfdv33.xsd b/src/test/java/Tests/assets/cfdv33.xsd
new file mode 100644
index 0000000..c5241ff
--- /dev/null
+++ b/src/test/java/Tests/assets/cfdv33.xsd
@@ -0,0 +1,737 @@
+
+
+
+
+
+
+ Estándar de Comprobante Fiscal Digital por Internet.
+
+
+
+
+
+ Nodo opcional para precisar la información de los comprobantes relacionados.
+
+
+
+
+
+ Nodo requerido para precisar la información de los comprobantes relacionados.
+
+
+
+
+ Atributo requerido para registrar el folio fiscal (UUID) de un CFDI relacionado con el presente comprobante, por ejemplo: Si el CFDI relacionado es un comprobante de traslado que sirve para registrar el movimiento de la mercancía. Si este comprobante se usa como nota de crédito o nota de débito del comprobante relacionado. Si este comprobante es una devolución sobre el comprobante relacionado. Si éste sustituye a una factura cancelada.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Atributo requerido para indicar la clave de la relación que existe entre éste que se esta generando y el o los CFDI previos.
+
+
+
+
+
+
+ Nodo requerido para expresar la información del contribuyente emisor del comprobante.
+
+
+
+
+ Atributo requerido para registrar la Clave del Registro Federal de Contribuyentes correspondiente al contribuyente emisor del comprobante.
+
+
+
+
+ Atributo opcional para registrar el nombre, denominación o razón social del contribuyente emisor del comprobante.
+
+
+
+
+
+
+
+
+
+
+
+
+ Atributo requerido para incorporar la clave del régimen del contribuyente emisor al que aplicará el efecto fiscal de este comprobante.
+
+
+
+
+
+
+ Nodo requerido para precisar la información del contribuyente receptor del comprobante.
+
+
+
+
+ Atributo requerido para precisar la Clave del Registro Federal de Contribuyentes correspondiente al contribuyente receptor del comprobante.
+
+
+
+
+ Atributo opcional para precisar el nombre, denominación o razón social del contribuyente receptor del comprobante.
+
+
+
+
+
+
+
+
+
+
+
+
+ Atributo condicional para registrar la clave del país de residencia para efectos fiscales del receptor del comprobante, cuando se trate de un extranjero, y que es conforme con la especificación ISO 3166-1 alpha-3. Es requerido cuando se incluya el complemento de comercio exterior o se registre el atributo NumRegIdTrib.
+
+
+
+
+ Atributo condicional para expresar el número de registro de identidad fiscal del receptor cuando sea residente en el extranjero. Es requerido cuando se incluya el complemento de comercio exterior.
+
+
+
+
+
+
+
+
+
+
+
+ Atributo requerido para expresar la clave del uso que dará a esta factura el receptor del CFDI.
+
+
+
+
+
+
+ Nodo requerido para listar los conceptos cubiertos por el comprobante.
+
+
+
+
+
+ Nodo requerido para registrar la información detallada de un bien o servicio amparado en el comprobante.
+
+
+
+
+
+ Nodo opcional para capturar los impuestos aplicables al presente concepto. Cuando un concepto no registra un impuesto, implica que no es objeto del mismo.
+
+
+
+
+
+ Nodo opcional para asentar los impuestos trasladados aplicables al presente concepto.
+
+
+
+
+
+ Nodo requerido para asentar la información detallada de un traslado de impuestos aplicable al presente concepto.
+
+
+
+
+ Atributo requerido para señalar la base para el cálculo del impuesto, la determinación de la base se realiza de acuerdo con las disposiciones fiscales vigentes. No se permiten valores negativos.
+
+
+
+
+
+
+
+
+
+
+
+ Atributo requerido para señalar la clave del tipo de impuesto trasladado aplicable al concepto.
+
+
+
+
+ Atributo requerido para señalar la clave del tipo de factor que se aplica a la base del impuesto.
+
+
+
+
+ Atributo condicional para señalar el valor de la tasa o cuota del impuesto que se traslada para el presente concepto. Es requerido cuando el atributo TipoFactor tenga una clave que corresponda a Tasa o Cuota.
+
+
+
+
+
+
+
+
+
+
+
+ Atributo condicional para señalar el importe del impuesto trasladado que aplica al concepto. No se permiten valores negativos. Es requerido cuando TipoFactor sea Tasa o Cuota
+
+
+
+
+
+
+
+
+
+ Nodo opcional para asentar los impuestos retenidos aplicables al presente concepto.
+
+
+
+
+
+ Nodo requerido para asentar la información detallada de una retención de impuestos aplicable al presente concepto.
+
+
+
+
+ Atributo requerido para señalar la base para el cálculo de la retención, la determinación de la base se realiza de acuerdo con las disposiciones fiscales vigentes. No se permiten valores negativos.
+
+
+
+
+
+
+
+
+
+
+
+ Atributo requerido para señalar la clave del tipo de impuesto retenido aplicable al concepto.
+
+
+
+
+ Atributo requerido para señalar la clave del tipo de factor que se aplica a la base del impuesto.
+
+
+
+
+ Atributo requerido para señalar la tasa o cuota del impuesto que se retiene para el presente concepto.
+
+
+
+
+
+
+
+
+
+
+
+ Atributo requerido para señalar el importe del impuesto retenido que aplica al concepto. No se permiten valores negativos.
+
+
+
+
+
+
+
+
+
+
+
+
+ Nodo opcional para introducir la información aduanera aplicable cuando se trate de ventas de primera mano de mercancías importadas o se trate de operaciones de comercio exterior con bienes o servicios.
+
+
+
+
+ Atributo requerido para expresar el número del pedimento que ampara la importación del bien que se expresa en el siguiente formato: últimos 2 dígitos del año de validación seguidos por dos espacios, 2 dígitos de la aduana de despacho seguidos por dos espacios, 4 dígitos del número de la patente seguidos por dos espacios, 1 dígito que corresponde al último dígito del año en curso, salvo que se trate de un pedimento consolidado iniciado en el año inmediato anterior o del pedimento original de una rectificación, seguido de 6 dígitos de la numeración progresiva por aduana.
+
+
+
+
+
+
+
+
+
+
+
+
+ Nodo opcional para asentar el número de cuenta predial con el que fue registrado el inmueble, en el sistema catastral de la entidad federativa de que trate, o bien para incorporar los datos de identificación del certificado de participación inmobiliaria no amortizable.
+
+
+
+
+ Atributo requerido para precisar el número de la cuenta predial del inmueble cubierto por el presente concepto, o bien para incorporar los datos de identificación del certificado de participación inmobiliaria no amortizable, tratándose de arrendamiento.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Nodo opcional donde se incluyen los nodos complementarios de extensión al concepto definidos por el SAT, de acuerdo con las disposiciones particulares para un sector o actividad específica.
+
+
+
+
+
+
+
+
+
+ Nodo opcional para expresar las partes o componentes que integran la totalidad del concepto expresado en el comprobante fiscal digital por Internet.
+
+
+
+
+
+ Nodo opcional para introducir la información aduanera aplicable cuando se trate de ventas de primera mano de mercancías importadas o se trate de operaciones de comercio exterior con bienes o servicios.
+
+
+
+
+ Atributo requerido para expresar el número del pedimento que ampara la importación del bien que se expresa en el siguiente formato: últimos 2 dígitos del año de validación seguidos por dos espacios, 2 dígitos de la aduana de despacho seguidos por dos espacios, 4 dígitos del número de la patente seguidos por dos espacios, 1 dígito que corresponde al último dígito del año en curso, salvo que se trate de un pedimento consolidado iniciado en el año inmediato anterior o del pedimento original de una rectificación, seguido de 6 dígitos de la numeración progresiva por aduana.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Atributo requerido para expresar la clave del producto o del servicio amparado por la presente parte. Es requerido y deben utilizar las claves del catálogo de productos y servicios, cuando los conceptos que registren por sus actividades correspondan con dichos conceptos.
+
+
+
+
+ Atributo opcional para expresar el número de serie, número de parte del bien o identificador del producto o del servicio amparado por la presente parte. Opcionalmente se puede utilizar claves del estándar GTIN.
+
+
+
+
+
+
+
+
+
+
+
+
+ Atributo requerido para precisar la cantidad de bienes o servicios del tipo particular definido por la presente parte.
+
+
+
+
+
+
+
+
+
+
+
+ Atributo opcional para precisar la unidad de medida propia de la operación del emisor, aplicable para la cantidad expresada en la parte. La unidad debe corresponder con la descripción de la parte.
+
+
+
+
+
+
+
+
+
+
+
+
+ Atributo requerido para precisar la descripción del bien o servicio cubierto por la presente parte.
+
+
+
+
+
+
+
+
+
+
+
+
+ Atributo opcional para precisar el valor o precio unitario del bien o servicio cubierto por la presente parte. No se permiten valores negativos.
+
+
+
+
+ Atributo opcional para precisar el importe total de los bienes o servicios de la presente parte. Debe ser equivalente al resultado de multiplicar la cantidad por el valor unitario expresado en la parte. No se permiten valores negativos.
+
+
+
+
+
+
+
+ Atributo requerido para expresar la clave del producto o del servicio amparado por el presente concepto. Es requerido y deben utilizar las claves del catálogo de productos y servicios, cuando los conceptos que registren por sus actividades correspondan con dichos conceptos.
+
+
+
+
+ Atributo opcional para expresar el número de parte, identificador del producto o del servicio, la clave de producto o servicio, SKU o equivalente, propia de la operación del emisor, amparado por el presente concepto. Opcionalmente se puede utilizar claves del estándar GTIN.
+
+
+
+
+
+
+
+
+
+
+
+
+ Atributo requerido para precisar la cantidad de bienes o servicios del tipo particular definido por el presente concepto.
+
+
+
+
+
+
+
+
+
+
+
+ Atributo requerido para precisar la clave de unidad de medida estandarizada aplicable para la cantidad expresada en el concepto. La unidad debe corresponder con la descripción del concepto.
+
+
+
+
+ Atributo opcional para precisar la unidad de medida propia de la operación del emisor, aplicable para la cantidad expresada en el concepto. La unidad debe corresponder con la descripción del concepto.
+
+
+
+
+
+
+
+
+
+
+
+
+ Atributo requerido para precisar la descripción del bien o servicio cubierto por el presente concepto.
+
+
+
+
+
+
+
+
+
+
+
+
+ Atributo requerido para precisar el valor o precio unitario del bien o servicio cubierto por el presente concepto.
+
+
+
+
+ Atributo requerido para precisar el importe total de los bienes o servicios del presente concepto. Debe ser equivalente al resultado de multiplicar la cantidad por el valor unitario expresado en el concepto. No se permiten valores negativos.
+
+
+
+
+ Atributo opcional para representar el importe de los descuentos aplicables al concepto. No se permiten valores negativos.
+
+
+
+
+
+
+
+
+
+ Nodo condicional para expresar el resumen de los impuestos aplicables.
+
+
+
+
+
+ Nodo condicional para capturar los impuestos retenidos aplicables. Es requerido cuando en los conceptos se registre algún impuesto retenido.
+
+
+
+
+
+ Nodo requerido para la información detallada de una retención de impuesto específico.
+
+
+
+
+ Atributo requerido para señalar la clave del tipo de impuesto retenido
+
+
+
+
+ Atributo requerido para señalar el monto del impuesto retenido. No se permiten valores negativos.
+
+
+
+
+
+
+
+
+
+ Nodo condicional para capturar los impuestos trasladados aplicables. Es requerido cuando en los conceptos se registre un impuesto trasladado.
+
+
+
+
+
+ Nodo requerido para la información detallada de un traslado de impuesto específico.
+
+
+
+
+ Atributo requerido para señalar la clave del tipo de impuesto trasladado.
+
+
+
+
+ Atributo requerido para señalar la clave del tipo de factor que se aplica a la base del impuesto.
+
+
+
+
+ Atributo requerido para señalar el valor de la tasa o cuota del impuesto que se traslada por los conceptos amparados en el comprobante.
+
+
+
+
+
+
+
+
+
+
+
+ Atributo requerido para señalar la suma del importe del impuesto trasladado, agrupado por impuesto, TipoFactor y TasaOCuota. No se permiten valores negativos.
+
+
+
+
+
+
+
+
+
+
+ Atributo condicional para expresar el total de los impuestos retenidos que se desprenden de los conceptos expresados en el comprobante fiscal digital por Internet. No se permiten valores negativos. Es requerido cuando en los conceptos se registren impuestos retenidos
+
+
+
+
+ Atributo condicional para expresar el total de los impuestos trasladados que se desprenden de los conceptos expresados en el comprobante fiscal digital por Internet. No se permiten valores negativos. Es requerido cuando en los conceptos se registren impuestos trasladados.
+
+
+
+
+
+
+ Nodo opcional donde se incluye el complemento Timbre Fiscal Digital de manera obligatoria y los nodos complementarios determinados por el SAT, de acuerdo con las disposiciones particulares para un sector o actividad específica.
+
+
+
+
+
+
+
+
+
+ Nodo opcional para recibir las extensiones al presente formato que sean de utilidad al contribuyente. Para las reglas de uso del mismo, referirse al formato origen.
+
+
+
+
+
+
+
+
+
+
+ Atributo requerido con valor prefijado a 3.3 que indica la versión del estándar bajo el que se encuentra expresado el comprobante.
+
+
+
+
+
+
+
+
+
+ Atributo opcional para precisar la serie para control interno del contribuyente. Este atributo acepta una cadena de caracteres.
+
+
+
+
+
+
+
+
+
+
+
+
+ Atributo opcional para control interno del contribuyente que expresa el folio del comprobante, acepta una cadena de caracteres.
+
+
+
+
+
+
+
+
+
+
+
+
+ Atributo requerido para la expresión de la fecha y hora de expedición del Comprobante Fiscal Digital por Internet. Se expresa en la forma AAAA-MM-DDThh:mm:ss y debe corresponder con la hora local donde se expide el comprobante.
+
+
+
+
+ Atributo requerido para contener el sello digital del comprobante fiscal, al que hacen referencia las reglas de resolución miscelánea vigente. El sello debe ser expresado como una cadena de texto en formato Base 64.
+
+
+
+
+
+
+
+
+
+ Atributo condicional para expresar la clave de la forma de pago de los bienes o servicios amparados por el comprobante. Si no se conoce la forma de pago este atributo se debe omitir.
+
+
+
+
+ Atributo requerido para expresar el número de serie del certificado de sello digital que ampara al comprobante, de acuerdo con el acuse correspondiente a 20 posiciones otorgado por el sistema del SAT.
+
+
+
+
+
+
+
+
+
+
+
+ Atributo requerido que sirve para incorporar el certificado de sello digital que ampara al comprobante, como texto en formato base 64.
+
+
+
+
+
+
+
+
+
+ Atributo condicional para expresar las condiciones comerciales aplicables para el pago del comprobante fiscal digital por Internet. Este atributo puede ser condicionado mediante atributos o complementos.
+
+
+
+
+
+
+
+
+
+
+
+
+ Atributo requerido para representar la suma de los importes de los conceptos antes de descuentos e impuesto. No se permiten valores negativos.
+
+
+
+
+ Atributo condicional para representar el importe total de los descuentos aplicables antes de impuestos. No se permiten valores negativos. Se debe registrar cuando existan conceptos con descuento.
+
+
+
+
+ Atributo requerido para identificar la clave de la moneda utilizada para expresar los montos, cuando se usa moneda nacional se registra MXN. Conforme con la especificación ISO 4217.
+
+
+
+
+ Atributo condicional para representar el tipo de cambio conforme con la moneda usada. Es requerido cuando la clave de moneda es distinta de MXN y de XXX. El valor debe reflejar el número de pesos mexicanos que equivalen a una unidad de la divisa señalada en el atributo moneda. Si el valor está fuera del porcentaje aplicable a la moneda tomado del catálogo c_Moneda, el emisor debe obtener del PAC que vaya a timbrar el CFDI, de manera no automática, una clave de confirmación para ratificar que el valor es correcto e integrar dicha clave en el atributo Confirmacion.
+
+
+
+
+
+
+
+
+
+
+
+ Atributo requerido para representar la suma del subtotal, menos los descuentos aplicables, más las contribuciones recibidas (impuestos trasladados - federales o locales, derechos, productos, aprovechamientos, aportaciones de seguridad social, contribuciones de mejoras) menos los impuestos retenidos. Si el valor es superior al límite que establezca el SAT en la Resolución Miscelánea Fiscal vigente, el emisor debe obtener del PAC que vaya a timbrar el CFDI, de manera no automática, una clave de confirmación para ratificar que el valor es correcto e integrar dicha clave en el atributo Confirmacion. No se permiten valores negativos.
+
+
+
+
+ Atributo requerido para expresar la clave del efecto del comprobante fiscal para el contribuyente emisor.
+
+
+
+
+ Atributo condicional para precisar la clave del método de pago que aplica para este comprobante fiscal digital por Internet, conforme al Artículo 29-A fracción VII incisos a y b del CFF.
+
+
+
+
+ Atributo requerido para incorporar el código postal del lugar de expedición del comprobante (domicilio de la matriz o de la sucursal).
+
+
+
+
+ Atributo condicional para registrar la clave de confirmación que entregue el PAC para expedir el comprobante con importes grandes, con un tipo de cambio fuera del rango establecido o con ambos casos. Es requerido cuando se registra un tipo de cambio o un total fuera del rango establecido.
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/test/java/Tests/assets/consumodecombustibles.xslt b/src/test/java/Tests/assets/consumodecombustibles.xslt
new file mode 100644
index 0000000..803e9e3
--- /dev/null
+++ b/src/test/java/Tests/assets/consumodecombustibles.xslt
@@ -0,0 +1,108 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/test/java/Tests/assets/detallista.xslt b/src/test/java/Tests/assets/detallista.xslt
new file mode 100644
index 0000000..7a92fa4
--- /dev/null
+++ b/src/test/java/Tests/assets/detallista.xslt
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/test/java/Tests/assets/divisas.xslt b/src/test/java/Tests/assets/divisas.xslt
new file mode 100644
index 0000000..20df3a3
--- /dev/null
+++ b/src/test/java/Tests/assets/divisas.xslt
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/test/java/Tests/assets/donat11.xslt b/src/test/java/Tests/assets/donat11.xslt
new file mode 100644
index 0000000..da5041b
--- /dev/null
+++ b/src/test/java/Tests/assets/donat11.xslt
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/test/java/Tests/assets/ecc11.xslt b/src/test/java/Tests/assets/ecc11.xslt
new file mode 100644
index 0000000..4cc6cd2
--- /dev/null
+++ b/src/test/java/Tests/assets/ecc11.xslt
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/test/java/Tests/assets/iedu.xslt b/src/test/java/Tests/assets/iedu.xslt
new file mode 100644
index 0000000..1570f0d
--- /dev/null
+++ b/src/test/java/Tests/assets/iedu.xslt
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/test/java/Tests/assets/implocal.xslt b/src/test/java/Tests/assets/implocal.xslt
new file mode 100644
index 0000000..70639cc
--- /dev/null
+++ b/src/test/java/Tests/assets/implocal.xslt
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/test/java/Tests/assets/ine11.xslt b/src/test/java/Tests/assets/ine11.xslt
new file mode 100644
index 0000000..7d9ac31
--- /dev/null
+++ b/src/test/java/Tests/assets/ine11.xslt
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/test/java/Tests/assets/key.key b/src/test/java/Tests/assets/key.key
new file mode 100644
index 0000000..f0dc50c
Binary files /dev/null and b/src/test/java/Tests/assets/key.key differ
diff --git a/src/test/java/Tests/assets/leyendasFisc.xslt b/src/test/java/Tests/assets/leyendasFisc.xslt
new file mode 100644
index 0000000..ddee46e
--- /dev/null
+++ b/src/test/java/Tests/assets/leyendasFisc.xslt
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/test/java/Tests/assets/nomina12.xslt b/src/test/java/Tests/assets/nomina12.xslt
new file mode 100644
index 0000000..1b84648
--- /dev/null
+++ b/src/test/java/Tests/assets/nomina12.xslt
@@ -0,0 +1,412 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/test/java/Tests/assets/notariospublicos.xslt b/src/test/java/Tests/assets/notariospublicos.xslt
new file mode 100644
index 0000000..210a0e7
--- /dev/null
+++ b/src/test/java/Tests/assets/notariospublicos.xslt
@@ -0,0 +1,301 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/test/java/Tests/assets/obrasarteantiguedades.xslt b/src/test/java/Tests/assets/obrasarteantiguedades.xslt
new file mode 100644
index 0000000..c3f1f23
--- /dev/null
+++ b/src/test/java/Tests/assets/obrasarteantiguedades.xslt
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/test/java/Tests/assets/pagoenespecie.xslt b/src/test/java/Tests/assets/pagoenespecie.xslt
new file mode 100644
index 0000000..16f0c50
--- /dev/null
+++ b/src/test/java/Tests/assets/pagoenespecie.xslt
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/test/java/Tests/assets/pfic.xslt b/src/test/java/Tests/assets/pfic.xslt
new file mode 100644
index 0000000..1bff0cf
--- /dev/null
+++ b/src/test/java/Tests/assets/pfic.xslt
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/test/java/Tests/assets/renovacionysustitucionvehiculos.xslt b/src/test/java/Tests/assets/renovacionysustitucionvehiculos.xslt
new file mode 100644
index 0000000..54bb30d
--- /dev/null
+++ b/src/test/java/Tests/assets/renovacionysustitucionvehiculos.xslt
@@ -0,0 +1,152 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/test/java/Tests/assets/servicioparcialconstruccion.xslt b/src/test/java/Tests/assets/servicioparcialconstruccion.xslt
new file mode 100644
index 0000000..2a03dd5
--- /dev/null
+++ b/src/test/java/Tests/assets/servicioparcialconstruccion.xslt
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/test/java/Tests/assets/terceros11.xslt b/src/test/java/Tests/assets/terceros11.xslt
new file mode 100644
index 0000000..491ae36
--- /dev/null
+++ b/src/test/java/Tests/assets/terceros11.xslt
@@ -0,0 +1,108 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/test/java/Tests/assets/utilerias.xslt b/src/test/java/Tests/assets/utilerias.xslt
new file mode 100644
index 0000000..2fdcfdc
--- /dev/null
+++ b/src/test/java/Tests/assets/utilerias.xslt
@@ -0,0 +1,22 @@
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
diff --git a/src/test/java/Tests/assets/valesdedespensa.xslt b/src/test/java/Tests/assets/valesdedespensa.xslt
new file mode 100644
index 0000000..1022c80
--- /dev/null
+++ b/src/test/java/Tests/assets/valesdedespensa.xslt
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/test/java/Tests/assets/vehiculousado.xslt b/src/test/java/Tests/assets/vehiculousado.xslt
new file mode 100644
index 0000000..2e364af
--- /dev/null
+++ b/src/test/java/Tests/assets/vehiculousado.xslt
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+ |||
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/test/java/Tests/assets/ventavehiculos11.xslt b/src/test/java/Tests/assets/ventavehiculos11.xslt
new file mode 100644
index 0000000..3782183
--- /dev/null
+++ b/src/test/java/Tests/assets/ventavehiculos11.xslt
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+