Coder Social home page Coder Social logo

rshk-jsifenlib's People

Contributors

david-ayala avatar martinzarza avatar pablo avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

rshk-jsifenlib's Issues

Consultar estado CDC

Como se podria consultar el estado de un CDC ya sea en lote o en forma individual?

Retorno nulo al consultar RUC

Estoy intentando realizar una consulta de RUC mediante la función consultaRUC de la clase Sifen y estoy obteniendo la siguiente respuesta por parte de el servicio web de Sifen

{ "codigoEstado": 200, "respuestaBruta": "<html>\n <head>\n <meta name=\"robots\" content=\"noindex,nofollow\">\n <title>BIG-IP logout page</title>\n <link rel=\"stylesheet\" type=\"text/css\" HREF=\"/public/include/css/apm.css\">\n <script src=\"/public/include/js/common.js\" language=\"javascript\"></script>\n <script src=\"/public/include/js/u_plugin.js\" language=\"javascript\"></script>\n\t\n <script language=\"javascript\">\n function InsertActivexControl(clsid, params)\n {\n var container = document.getElementById(\"logoutActivexContainer\");\n \n if (navigator.appName == \"Microsoft Internet Explorer\") {\n var paramsCode = \"\";\n for (var item in params) {\n paramsCode += \"<param name='\" + item + \"' value='\" + params[item] + \"'>\";\n }\n \n container.innerHTML = \n \"<center><object classId=CLSID:\" + clsid + \" border=0 width=1 height=1>\" +\n paramsCode + \"</object></center>\";\n }\n else {\n var pluginHost = new UPluginHost(\"\", container);\n var control = {\"clsid\": clsid, \"width\": 1, \"height\": 1};\n pluginHost.hostControl(control, params);\n }\n }\n\t \n function OnLoad()\n {\n var isBrowserControl = false;\n try {\n isBrowserControl = (\"undefined\" != typeof(window.external))\n && (\"unknown\" != typeof(window.external))\n && (\"undefined\" != typeof(window.external.WebLogonNotifyUser))\n && (\"unknown\" != typeof(window.external.WebLogonNotifyUser));\n }\n catch(e) {}\n if(!isBrowserControl) {\n document.getElementById(\"newSessionDIV\").style.visibility = \"visible\";\n }\n\n try\n {\n if (get_cookie(\"F5_PWS\") == \"1\")\n {\n document.cookie = \"F5_PWS=0; path=/; expires=Fri, 01-Jan-1970 00:00:01 GMT\";\n var pwsClassId = \"7E73BE8F-FD87-44EC-8E22-023D5FF960FF\";\n InsertActivexControl(pwsClassId, {\"command\": \"exit\"} );\n }\n }catch (e) {};\n }\n </script>\n </head>\n\n<body onload=\"OnLoad();\">\n<script>\ntry{\n\n if(window.external && window.external.WebLogonOnAuthFailure) {\n window.external.WebLogonOnAuthFailure();\n }\n}catch(e){};\n try {\n window.external.OnHostClose();\n } catch(e) { }\n</script>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=Edge\">\n<meta name=\"viewport\" id=\"viewport\" content=\"initial-scale=1.0\" />\n<meta name=\"robots\" context=\"noindex,nofollow\">\n<script language=\"javascript\">\n//orientation toolbox\nfunction setViewport(){\n document.getElementById(\"viewport\").setAttribute('content', Math.abs(window.orientation) == 90 ? 'width=device-height, initial-scale=1' : 'width=device-width, initial-scale=1.0' );\n}\nsetViewport();\nwindow.onorientationchange = function() {\n setViewport();\n}\n</script>\n<table id=\"page_header\">\n <tr >\n <td id=\"header_leftcell\"><img src='/public/images/my/flogo.png'/></td>\n <td id=\"header_rightcell\"></td>\n </tr>\n <tr>\n <td></td>\n <td id=\"maxTimeoutTd\"><span id=\"maxTimeoutTag\" title=\"\"></span></td>\n </tr>\n</table>\n<noscript>\n<div id=\"noscript_warning_red\">JavaScript no está habilitado. Habilite JavaScript en su navegador o póngase en contacto con su administrador de sistema para obtener ayuda.</div>\n<div id=\"noscript_warning_newsession\">Para abrir una nueva sesión, <A href=\"/\">haga clic aquí.</A></div>\n</noscript>\n<table id=\"main_table\" class=\"logout_page\">\n<tr>\n <td id=\"main_table_info_cell\">\n <table id=\"interaction_table\">\n <tr>\n <td id=\"interaction_table_header\">Su sesión ha finalizado.</td>\n </tr>\n <tr>\n <td class=\"interaction_table_option_cell\"><br><DIV ID=\"sessionDIV\" style='visibility:hidden' align=left></DIV>\n Cerró la sesión exitosamente.<br> <br>Gracias por usar BIG-IP.<br><br>\n <div id=\"newSessionDIV\" style='visibility:hidden'>Para abrir una nueva sesión, <A href='/'>haga clic aquí.</A></div> </td>\n </tr>\n <tr>\n <td class=\"interaction_table_footer\"></td>\n </tr>\n </table>\n </td>\n <td id=\"main_table_image_cell\"><img src=\"/public/images/my/tr.gif\"></td></tr>\n</table>\n<div id=\"page_footer\"><div>Este producto tiene la autorización de F5 Networks. © 1999-2018 F5 Networks. Todos los derechos reservados</div></div>\n<DIV ID=\"logoutActivexContainer\" class=\"inspectionHostDIVSmall\"></DIV>\n\n</body>\n</html>\n", "dCodRes": null, "dMsgRes": null, "xContRUC": null }

Ademas en el log generado por la libreria obtengo los siguientes mensajes:

2022-03-02 22:13:41.741 INFO 61835 --- [nio-8080-exec-6] class com.roshka.sifen.Sifen : Preparando petición 'Consulta de RUC' 2022-03-02 22:13:41.775 INFO 61835 --- [nio-8080-exec-6] c.r.sifen.internal.request.BaseRequest : XML generado, se realiza la petición 2022-03-02 22:13:41.838 INFO 61835 --- [nio-8080-exec-6] c.r.s.internal.helpers.SSLContextHelper : Contexto SSL no cargado aún. Empezando carga... 2022-03-02 22:13:41.854 INFO 61835 --- [nio-8080-exec-6] c.r.sifen.internal.helpers.SoapHelper : Conectando a: https://sifen-test.set.gov.py/de/ws/consultas/consulta-ruc.wsdl 2022-03-02 22:13:42.103 INFO 61835 --- [nio-8080-exec-6] c.r.sifen.internal.helpers.SoapHelper : Enviando mensaje SOAP ERROR: 'Open quote is expected for attribute "classId" associated with an element type "object".' 2022-03-02 22:13:42.306 ERROR 61835 --- [nio-8080-exec-6] c.sun.xml.internal.messaging.saaj.soap : SAAJ0511: Unable to create envelope from given source 2022-03-02 22:13:42.306 WARN 61835 --- [nio-8080-exec-6] c.r.sifen.internal.request.ReqConsRuc : El cuerpo del mensaje SOAP es nulo. No se puede obtener el nodo principal. 2022-03-02 22:13:42.307 INFO 61835 --- [nio-8080-exec-6] c.r.sifen.internal.request.BaseRequest : Petición realizada, se formatea la respuesta

Para la configuration de Sifen estableci los siguientes parámetros:

  • TipoAmbiente = DEV
  • idCSC = 0002
  • CSC = EFGH0000000000000000000000000000
  • TipoCertificadoCliente = PFX

El certificado de cliente y la constraseña me fueron proveídos por la empresa donde desarrollo. Finalmente, ejecuto las siguientes lineas de código:

Sifen.setSifenConfig(config); RespuestaConsultaRUC consulta = Sifen.consultaRUC(ruc);

Me podrían indicar si existe algún error en mi configuración o si necesito algún permiso extra para realizar la consulta a Sifen.

Envio de lote

Buenas.

Al realizar el envió de lote utilizando el siguiente método:

RespuestaRecepcionLoteDE respuesta = Sifen.recepcionLoteDE(deList);

Recibo la siguiente respuesta:

<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">env:Header/
env:Body
<ns2:rResEnviLoteDe xmlns:ns2="http://ekuatia.set.gov.py/sifen/xsd">ns2:dFecProc2023-02-16T10:05:12-03:00</ns2:dFecProc>
ns2:dCodRes0301</ns2:dCodRes>ns2:dMsgResLote no encolado para procesamiento</ns2:dMsgRes>ns2:dTpoProces0</ns2:dTpoProces></ns2:rResEnviLoteDe>
</env:Body>
</env:Envelope>

¿Es correcta la forma en que estoy enviando?

Veo que el problema es el RUC del emisor que solo tiene 7 digitos, como se haria el envio para este tipo de RUC?

Nota Tecnica 16

Consulta, habrá soporte para la Nota Técnica 16 con con la ampliación del soporte de sha-512?

Divide sobre zero

Por alguna razón en TgToSub.java 105

this.dPorcDescTotal = this.dDescTotal.multiply(BigDecimal.valueOf(100)).divide(this.dTotOpe.add(this.dDescTotal), 2, RoundingMode.HALF_UP);

me esta dividiendo /by zero, no se por que tiene valor 0

Problemas con firma digital &#13; al final de cada linea

Buenas tardes,

Estoy teniendo un problema en la generación de la firma digital. Puedo usar correctamente mi certificado pero la firma generada tiene problemas. La gente de Sifen me indico que los carctares al final de cada linea en los campos SignatureValue y X509Certificate producen errores al tratar de validar la firma en del lado de Sifen. Es posible que la generación de esos carácteres al generar la firma con la libreria se deba a una mala configuración del certificado? La configuración que utilizo es la siguiente:

SifenConfig config = new SifenConfig(
SifenConfig.TipoAmbiente.DEV,
"0002", // ID CSC
"EFGH0000000000000000000000000000", // CSC
SifenConfig.TipoCertificadoCliente.PFX,
"/Users/fabriciomendozagranada/Documents/CDS/sifenbridge/certificado_digital.pfx",
"password"
);
config.setUsarCertificadoCliente(true);

    Sifen.setSifenConfig(config);

Constantes URL xsi:schemaLocation definidas erróneamente

Aparentemente las URLs que definen la URL del XSD para xsi:schemaLocation se concatenan incorrectamente en las líneas 15 y 16. El URL final contiene un espacio y es inválido.

public static final String SIFEN_NS_URI_RECEP_DE = SIFEN_NS_URI + " siRecepDE_v150.xsd";

public static final String SIFEN_NS_URI_RECEP_EVENTO = SIFEN_NS_URI + " siRecepEvento_v150.xsd";

Actualmente:

image

URL correcta:
image

Si hay una buena razón por la que las constantes fueron definidas de esta manera, favor ignorar y cerrar rabiosamente el ticket.

Envio en lote de los DE a la SET - numero de lote faltante en RespuestaRecepcionLoteDE

Buenos dias, en el envio en lote de los DE a la SET, veo que en la clase RespuestaRecepcionLoteDE estaria faltando el atributo: dProtConsLote

Ya que en caso de que el lote fuese transmitido correctamente, la SET genera un numero de lote para luego poder utilizar en la consulta: siResultLoteDE, de tal manera a monitorear luego de la transmisión del lote, si dicho lote fue procesado con exito por la SET.

Num Ruc de 6 digitos

Tengo Ruc emisor de 6 dígitos, y la validación cdc me pide 44 caracteres, se autocompleta mi ruc al comienzo con dos ceros "00387956" y me rechaza por eso, que puedo hacer en ese caso?

NOTA TECNICA Nº 14

Buenos dias,

Desde el 30 de Abril 2023 rige en test la exigencia de la NOTA TECNICA Nº 14 y desde el 31 Mayo 2023 en producción.

NT_E_KUATIA_014_MT_V150.pdf

Creen que tendríamos el release de esto en breve?, estamos apoyados 100% en esta excelente librería.

Desde ya muchas gracias

Descuentos de items

al pasar un valor de descuento a gValorRestaItem.setdDescGloItem();
o a gValorRestaItem.setdDescItem(); y al ser la cantidad > 1, multiplica y descuenta al total de la operacion

ejemplo:
total bruto 129.500
descuento 6.450
total neto 123.050
total neto en el DE xml 84.350

no se si estoy seteando mal los montos o que paso aca

parte del xml:
<cUniMed>77</cUniMed> <dDesUniMed>UNI</dDesUniMed> <dCantProSer>7.000</dCantProSer> <gValorItem> <dPUniProSer>18500.000</dPUniProSer> <dTotBruOpeItem>129500.000000</dTotBruOpeItem> <gValorRestaItem> <dDescGloItem>6450.000</dDescGloItem> <dAntPreUniIt>0</dAntPreUniIt> <dAntGloPreUniIt>0</dAntGloPreUniIt> <dTotOpeItem>84350.000000</dTotOpeItem> </gValorRestaItem> </gValorItem> <gCamIVA> <iAfecIVA>1</iAfecIVA> <dDesAfecIVA>Gravado IVA</dDesAfecIVA> <dPropIVA>100</dPropIVA> <dTasaIVA>10</dTasaIVA> <dBasGravIVA>76682</dBasGravIVA> <dLiqIVAItem>7668.000000</dLiqIVAItem> </gCamIVA> </gCamItem> </gDtipDE> <gTotSub> <dSubExe>0</dSubExe> <dSubExo>0</dSubExo> <dSub5>0</dSub5> <dSub10>84350.000000</dSub10> <dTotOpe>84350.000000</dTotOpe> <dTotDesc>0</dTotDesc> <dTotDescGlotem>6450.000</dTotDescGlotem> <dTotAntItem>0</dTotAntItem> <dTotAnt>0</dTotAnt> <dPorcDescTotal>7.10</dPorcDescTotal> <dDescTotal>6450.000</dDescTotal> <dAnticipo>0</dAnticipo> <dRedon>0.000000</dRedon> <dComi>0</dComi> <dTotGralOpe>84350.000000</dTotGralOpe> <dIVA5>0</dIVA5> <dIVA10>7668.000000</dIVA10> <dLiqTotIVA5>0</dLiqTotIVA5> <dLiqTotIVA10>0</dLiqTotIVA10> <dIVAComi>0</dIVAComi> <dTotIVA>7668.000000</dTotIVA> <dBaseGrav5>0</dBaseGrav5> <dBaseGrav10>76682</dBaseGrav10> <dTBasGraIVA>76682</dTBasGraIVA> </gTotSub>

validacion de firma digital del DE recibido

Buenas.
Hay algun metodo en la libreria que se pueda utilizar para validar que la firma digital de un DE (Documento Electronico) recibido por parte de un emisor correspondan al contenido del DE?

Si bien SIFEN realiza estas validaciones cuando se envia un DE al web service, entiendo que existe la posibilidad de que, por ejemplo, un proveedor envie una factura electronica a su cliente sin haber pasado por el SIFEN todavia.

FE en dolares

Buenas, tengo un inconveniente si me podrian orientar por favor, envio una FE en dolares con lo sigte:

 gTotSub>
                            <dSubExe>0</dSubExe>
                            <dSubExo>0</dSubExo>
                            <dSub5>0</dSub5>
                            <dSub10>1309.7205009</dSub10>
                            <dTotOpe>1309.7205009</dTotOpe>
                            <dTotDesc>0</dTotDesc>
                            <dTotDescGlotem>0</dTotDescGlotem>
                            <dTotAntItem>0</dTotAntItem>
                            <dTotAnt>0</dTotAnt>
                            <dPorcDescTotal>0.00</dPorcDescTotal>
                            <dDescTotal>0</dDescTotal>
                            <dAnticipo>0</dAnticipo>
                            <dRedon>0.7205009</dRedon>
                            <dComi>0</dComi>
                            <dTotGralOpe>1309.0000000</dTotGralOpe>
                            <dIVA5>0</dIVA5>
                            <dIVA10>119.0605009</dIVA10>
                            <dLiqTotIVA5>0</dLiqTotIVA5>
                            <dLiqTotIVA10>0</dLiqTotIVA10>
                            <dIVAComi>0.00</dIVAComi>
                            <dTotIVA>119.0605009</dTotIVA>
                            <dBaseGrav5>0</dBaseGrav5>
                            <dBaseGrav10>1190.66</dBaseGrav10>
                            <dTBasGraIVA>1190.66</dTBasGraIVA>
                            <dTotalGs>9380922.320000000</dTotalGs>
                        </gTotSub>

pero me retorna como rechazado porque el tag dRedon posee mas digitos,

<ns2:gResProc>
					<ns2:dCodRes>0160</ns2:dCodRes>
					<ns2:dMsgRes>XML malformado [El valor cvc-fractionDigits-valid: Value '0.7205009' has 7 fraction digits, but the number of fraction digits has been limited to 4. del elemento: N/D es invalido]</ns2:dMsgRes>
				</ns2:gResProc>
				<ns2:gResProc>
					<ns2:dCodRes>0160</ns2:dCodRes>
					<ns2:dMsgRes>XML malformado [El valor 0.7205009 del elemento: dRedon es invalido]</ns2:dMsgRes>
				</ns2:gResProc>

No genera DE con descuento x item

Buenas.
Al querer aplicar descuentos x item (no el global), dPorcDescTotal aparentemente no calcula adecuandamente porque la sifen emite:
EA004: El descuento Global sobre el precio unitario por Item no coincidente con lo informado.

En tal sentido, comentando el archivo TgTotSub linea 100:
this.dPorcDescTotal = this.dDescTotal.multiply(BigDecimal.valueOf(100)).divide(this.dTotOpe.add(this.dDescTotal), 2, RoundingMode.HALF_UP);

Libreria

Buenos dias como estan... tengo un problema con la libreria uso netbeans para abrir el proyecto pero no me reconoce el import java.xml.soap...

Calculo de iAfecIVA = 4 (Gravado parcial (Grav-Exento))

Buen dia @pablo como estas? , estoy teniendo una inconsistencia en el calculo de dBasGravIVA, dLiqIVAItem y dBasExe cuando el item es Gravado Parcial (iAfecIVA = 4).

RESPUESTA DE LA SET:
<rRetEnviDe xmlns="http://ekuatia.set.gov.py/sifen/xsd"> <rProtDe> <Id>01800170890001002000016922023060618131755007</Id> <dFecProc>2023-06-06T10:52:51</dFecProc> <dDigVal>UXZPU3RwbFB3SGZaOGdEK1pjclRuVTZZbXF4SHZvVGUwbEZncDcyOHFkMD0=</dDigVal> <dEstRes>Rechazado</dEstRes> <dProtAut>0</dProtAut> <gResProc xmlns="http://ekuatia.set.gov.py/sifen/xsd"> <dCodRes>1911</dCodRes> **<dMsgRes>TEST - Error en el cálculo de la base gravada del IVA por ítem para tasa del 10%</dMsgRes>** </gResProc> </rProtDe> </rRetEnviDe>

Copio parte del XML que envio a rshk-jsifenlib :

<gDtipDE> <gCamFE> <iIndPres>1</iIndPres> <dDesIndPres>Operacion presencial</dDesIndPres> </gCamFE> <gCamCond> <iCondOpe>1</iCondOpe> <dDCondOpe>Contado</dDCondOpe> <gPaConEIni xmlns="http://ekuatia.set.gov.py/sifen/xsd"> <iTiPago>1</iTiPago> <dDesTiPag>Efectivo</dDesTiPag> <dMonTiPag>3204635.00</dMonTiPag> <cMoneTiPag>PYG</cMoneTiPag> <dDMoneTiPag>Guarani</dDMoneTiPag> </gPaConEIni> </gCamCond> <gCamItem xmlns="http://ekuatia.set.gov.py/sifen/xsd"> <dCodInt>4</dCodInt> <dDesProSer>Ticket Aereo Exterior</dDesProSer> <cUniMed>77</cUniMed> <dDesUniMed>Unidad</dDesUniMed> <dCantProSer>1.00</dCantProSer> <gValorItem> <dPUniProSer>3054535.00</dPUniProSer> <dTotBruOpeItem>3054535.00</dTotBruOpeItem> <gValorRestaItem> <dTotOpeItem>3054535.00</dTotOpeItem> </gValorRestaItem> </gValorItem> <gCamIVA> <iAfecIVA>4</iAfecIVA> <dDesAfecIVA>Gravado parcial (Grav-Exento)</dDesAfecIVA> <dPropIVA>62.43</dPropIVA> <dTasaIVA>10</dTasaIVA> <dBasGravIVA>1794957.41</dBasGravIVA> <dLiqIVAItem>179495.74</dLiqIVAItem> <dBasExe>1080081.84</dBasExe> </gCamIVA> </gCamItem> <gCamItem xmlns="http://ekuatia.set.gov.py/sifen/xsd"> <dCodInt>35</dCodInt> <dDesProSer>Agente de Viajes</dDesProSer> <cUniMed>77</cUniMed> <dDesUniMed>Unidad</dDesUniMed> <dCantProSer>1.00</dCantProSer> <gValorItem> <dPUniProSer>150100.00</dPUniProSer> <dTotBruOpeItem>150100.00</dTotBruOpeItem> <gValorRestaItem> <dTotOpeItem>150100.00</dTotOpeItem> </gValorRestaItem> </gValorItem> <gCamIVA> <iAfecIVA>1</iAfecIVA> <dDesAfecIVA>Gravado IVA</dDesAfecIVA> <dPropIVA>100.00</dPropIVA> <dTasaIVA>10</dTasaIVA> <dBasGravIVA>136454.54</dBasGravIVA> <dLiqIVAItem>13645.45</dLiqIVAItem> <dBasExe>0.00</dBasExe> </gCamIVA> </gCamItem> </gDtipDE>

Y esta sería la respuesta de Roshka (la diferencia en el calculo se encuentra en el nodo gCamIVA dentro de iAfecIVA = 4:

<gDtipDE> <gCamFE> <iIndPres>1</iIndPres> <dDesIndPres>Operación presencial</dDesIndPres> </gCamFE> <gCamCond> <iCondOpe>1</iCondOpe> <dDCondOpe>Contado</dDCondOpe> <gPaConEIni> <iTiPago>1</iTiPago> <dDesTiPag>Efectivo</dDesTiPag> <dMonTiPag>3204635.00</dMonTiPag> <cMoneTiPag>PYG</cMoneTiPag> <dDMoneTiPag>Guarani</dDMoneTiPag> </gPaConEIni> </gCamCond> <gCamItem> <dCodInt>4</dCodInt> <dDesProSer>Ticket Aereo Exterior</dDesProSer> <cUniMed>77</cUniMed> <dDesUniMed>UNI</dDesUniMed> <dCantProSer>1.00</dCantProSer> <gValorItem> <dPUniProSer>3054535.00</dPUniProSer> <dTotBruOpeItem>3054535</dTotBruOpeItem> <gValorRestaItem> <dDescItem>0</dDescItem> <dPorcDesIt>0.00</dPorcDesIt> <dAntPreUniIt>0</dAntPreUniIt> <dAntGloPreUniIt>0</dAntGloPreUniIt> <dTotOpeItem>3054535</dTotOpeItem> </gValorRestaItem> </gValorItem> <gCamIVA> <iAfecIVA>4</iAfecIVA> <dDesAfecIVA>Gravado parcial (Grav- Exento)</dDesAfecIVA> <dPropIVA>62.43</dPropIVA> <dTasaIVA>10</dTasaIVA> <dBasGravIVA>2776850</dBasGravIVA> <dLiqIVAItem>277685</dLiqIVAItem> <dBasExe>1080155</dBasExe> </gCamIVA> </gCamItem> <gCamItem> <dCodInt>35</dCodInt> <dDesProSer>Agente de Viajes</dDesProSer> <cUniMed>77</cUniMed> <dDesUniMed>UNI</dDesUniMed> <dCantProSer>1.00</dCantProSer> <gValorItem> <dPUniProSer>150100.00</dPUniProSer> <dTotBruOpeItem>150100</dTotBruOpeItem> <gValorRestaItem> <dDescItem>0</dDescItem> <dPorcDesIt>0.00</dPorcDesIt> <dAntPreUniIt>0</dAntPreUniIt> <dAntGloPreUniIt>0</dAntGloPreUniIt> <dTotOpeItem>150100</dTotOpeItem> </gValorRestaItem> </gValorItem> <gCamIVA> <iAfecIVA>1</iAfecIVA> <dDesAfecIVA>Gravado IVA</dDesAfecIVA> <dPropIVA>100.00</dPropIVA> <dTasaIVA>10</dTasaIVA> <dBasGravIVA>136455</dBasGravIVA> <dLiqIVAItem>13645</dLiqIVAItem> <dBasExe>0</dBasExe> </gCamIVA> </gCamItem> </gDtipDE>

Estoy utilizando la version rshk-jsifenlib-0.2.4-SNAPSHOT, si me podrian dar una mano por favor.

Desde ya muchas gracias.!

En el valor dRedon (F013) se está enviando en valor incorrecto

Por favor, podrían verificar de nuevo la lógica de la nueva implementación de redondeo.

La nueva función RedondeoUtil.redondeoOficialSET, esta devolviendo el valor de la operación redondeada, cuando según tengo entendido, debería ser solo el redondeo.
Ej: Como lo pueden verificar en sus propios test:
107437 debería retornar 37, cuando actualmente esta retornando 107400
#

Esto afecta al neto total de la operación (dTotGralOpe), ya que se hace una resta de este valor al total de la operación y queda el valor de redondeo como valor total de la operación.

Ruc invalido

En la clase TgEmis, metodo setdRucEm adiciona 0 a la izquierda. Al enviar la requisicion me devuelve
<ns2:dMsgRes>XML malformado [El valor 02534435 del elemento: dRucEm es invalido]</ns2:dMsgRes>

si dejo el setdRucEm sin el SifenUtil.leftPad me devuelve
<ns2:dMsgRes>RUC del emisor no est&#225; habilitado para utilizar este tipo de servicio</ns2:dMsgRes>

parece que ni todos los RUC iran adicionado zero al inicio.

Error de calculo de iva cuando la base no es 100

En la línea 34 de TgCamIVA esta redondeando un calculo que no tiene que redondear.
Si la base es 30 por ejemplo, lo quehace es 30/100 y queda en 0, en vez de quedar 0.30, solo en caso de que sea 100 queda bien, o sea 1

A continuación el método con las correcciones propuestas:

public void setupSOAPElements(GenerationCtx generationCtx, SOAPElement gCamItem, CMondT cMoneOpe, BigDecimal dTotOpeItem) throws SOAPException {
        SOAPElement gCamIVA = gCamItem.addChildElement("gCamIVA");
        gCamIVA.addChildElement("iAfecIVA").setTextContent(String.valueOf(this.iAfecIVA.getVal()));
        gCamIVA.addChildElement("dDesAfecIVA").setTextContent(this.iAfecIVA.getDescripcion());
        gCamIVA.addChildElement("dPropIVA").setTextContent(String.valueOf(this.dPropIVA));
        gCamIVA.addChildElement("dTasaIVA").setTextContent(String.valueOf(this.dTasaIVA));
        int scale = cMoneOpe.name().equals("PYG") ? 0 : 2;

        dTotOpeItem = dTotOpeItem.setScale(scale, RoundingMode.HALF_UP);

        BigDecimal hundred = BigDecimal.valueOf(100);
        //AQUI ESTAN REDONDEANDO ERRONEAMENTE
        //BigDecimal propIVA = this.dPropIVA.divide(hundred, scale, RoundingMode.HALF_UP);
        BigDecimal propIVA = this.dPropIVA.divide(hundred, 3, RoundingMode.HALF_UP);
        BigDecimal tasaIvaCoef = this.dTasaIVA.divide(hundred, 3, RoundingMode.HALF_UP).add(BigDecimal.ONE);

        if (this.iAfecIVA.getVal() == 1 || this.iAfecIVA.getVal() == 4) {
            dBasGravIVA = dTotOpeItem
                    .multiply(propIVA)
                    .divide(tasaIvaCoef, scale, RoundingMode.HALF_UP);
            dLiqIVAItem = dTotOpeItem.multiply(propIVA).subtract(dBasGravIVA);
            
//            if (this.dTasaIVA.equals(BigDecimal.valueOf(10))) {
//                //(total)*1/1.1 
//
//                this.dBasGravIVA = dTotOpeItem.multiply(propIVA).divide(BigDecimal.valueOf(1.1), scale, RoundingMode.HALF_UP);
//                //(preciovta*cantidad)*1/11
//                this.dLiqIVAItem = dTotOpeItem.multiply(propIVA).divide(BigDecimal.valueOf(11), scale, RoundingMode.HALF_UP);
//            } else if (this.dTasaIVA.equals(BigDecimal.valueOf(5))) {
//                this.dBasGravIVA = dTotOpeItem.multiply(propIVA).divide(BigDecimal.valueOf(1.05), scale, RoundingMode.HALF_UP);
//                this.dLiqIVAItem = dTotOpeItem.multiply(propIVA).divide(BigDecimal.valueOf(21), scale, RoundingMode.HALF_UP);
//            }
        } else {
            this.dBasGravIVA = BigDecimal.ZERO;
            this.dLiqIVAItem = BigDecimal.ZERO;
        }

        gCamIVA.addChildElement("dBasGravIVA").setTextContent(String.valueOf(this.dBasGravIVA));
        gCamIVA.addChildElement("dLiqIVAItem").setTextContent(String.valueOf(this.dLiqIVAItem));

        if (generationCtx.isHabilitarNotaTecnica13()) {
            if (this.iAfecIVA.getVal() == 4) {
                // Actualización: https://ekuatia.set.gov.py/portal/ekuatia/detail?content-id=/repository/collaboration/sites/ekuatia/documents/documentacion/documentacion-tecnica/NT_E_KUATIA_013_MT_V150.pdf
                // E737 = [100 * EA008 * (100 – E733)] / [10000 + (E734 * E733)]
                //this.dBasExe = (dTotOpeItem.multiply(hundred.subtract(dPropIVA)).multiply(hundred)).divide((this.dTasaIVA.multiply(dPropIVA)).add(BigDecimal.valueOf(10000)), scale, RoundingMode.HALF_UP);
                
                //Mas simple y claro  exento = total-basegravada-iva
                this.dBasExe = dTotOpeItem.subtract(this.dBasGravIVA).subtract(this.dLiqIVAItem);
            } else {
                this.dBasExe = BigDecimal.valueOf(0);
            }
            gCamIVA.addChildElement("dBasExe").setTextContent(String.valueOf(this.dBasExe));
        }

    }

Como volver a utilizar el cdc

Buenas.

¿Como se puede volver a reutilizar un cdc?, seria el caso, en que los datos correspondientes a cdc no cambian, no veo una forma de asignar el cdc a la clase DocumentoElectronico

Condicion de Venta

Buenas, me podrían ayudar, estoy trabajando en el ambiente de Test del Sifen con la libreria.

Tengo un problema al querer definir la condición de tipo CONTADO, solo me está aceptando el de tipo CREDITO.

TgCamCond gCamCond = new TgCamCond();

gCamCond.setiCondOpe(TiCondOpe.CREDITO); // ok
gCamCond.setiCondOpe(TiCondOpe.CONTADO); // error

ERROR:

Exception in thread "main" java.lang.NullPointerException
at java.util.Objects.requireNonNull(Objects.java:203)
at com.roshka.sifen.core.fields.request.de.TgCamCond.setupSOAPElements(T gCamCond.java:27)
at com.roshka.sifen.core.fields.request.de.TgDtipDE.setupSOAPElements(Tg DtipDE.java:39)
at com.roshka.sifen.core.beans.DocumentoElectronico.setupDE(DocumentoEle ctronico.java:265)
at com.roshka.sifen.core.beans.DocumentoElectronico.setupSOAPElements(Do cumentoElectronico.java:226)

Error Autofactura

Buenos dias,

Estoy intentando enviar el XML de Autofactura por el momento arroja el error indicado mas abajo, la de factura y nc funcionan correctamente:
"Exception in thread "main" java.lang.ArithmeticException: / by zero
at java.base/java.math.BigDecimal.divideAndRound(BigDecimal.java:4675)" abajo el mapeo del DE, me estaba fijando el codigo y veo que el valor del divisor toma del campo descuento, pero el documento no cuenta con descuento

XML:

final Logger logger = Logger.getLogger(App.class.toString());

    LocalDateTime currentDate = LocalDateTime.now();

    // Grupo A
    DocumentoElectronico DE = new DocumentoElectronico();
    DE.setdFecFirma(currentDate);
    DE.setdSisFact((short) 1);

    // Grupo B
    TgOpeDE gOpeDE = new TgOpeDE();
    gOpeDE.setiTipEmi(TTipEmi.NORMAL);
    DE.setgOpeDE(gOpeDE);

    // Grupo C
    TgTimb gTimb = new TgTimb();
    gTimb.setiTiDE(TTiDE.AUTOFACTURA_ELECTRONICA);
    gTimb.setdNumTim(12560442);
    gTimb.setdEst("001");
    gTimb.setdPunExp("001");
    gTimb.setdNumDoc("0000001");
    gTimb.setdFeIniT(LocalDate.parse("2023-02-08"));
    DE.setgTimb(gTimb);

    // Grupo D
    String FechaEmision = ("2023-04-28T17:55:34");
    DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
    fechaEmiDe = LocalDateTime.parse(FechaEmision, formatter);
    TdDatGralOpe dDatGralOpe = new TdDatGralOpe();
    dDatGralOpe.setdFeEmiDE(fechaEmiDe);

    TgOpeCom gOpeCom = new TgOpeCom();
    gOpeCom.setiTipTra(TTipTra.PRESTACION_SERVICIOS);

    gOpeCom.setiTImp(TTImp.NINGUNO);
    gOpeCom.setcMoneOpe(CMondT.PYG);
    dDatGralOpe.setgOpeCom(gOpeCom);

    TgEmis gEmis = new TgEmis();
    gEmis.setdRucEm("80011000");
    gEmis.setdDVEmi("0");

    gEmis.setiTipCont(TiTipCont.PERSONA_JURIDICA);
    gEmis.setdNomEmi("DE generado en ambiente de prueba - sin valor comercial ni fiscal");
    gEmis.setdDirEmi("San Martin 620");
    gEmis.setdNumCas("620");
    gEmis.setcDepEmi(TDepartamento.CAPITAL);
    gEmis.setcCiuEmi(1);
    gEmis.setdDesCiuEmi("ASUNCION (DISTRITO)");
    gEmis.setdTelEmi("021 688 6510");
    gEmis.setdEmailE("[email protected]");

    List<TgActEco> gActEcoList = new ArrayList<>();
    TgActEco gActEco = new TgActEco();
    gActEco.setcActEco("81290");
    gActEco.setdDesActEco("OTRAS ACTIVIDADES DE LIMPIEZA DE EDIFICIOS E INDUSTRIAL");
    gActEcoList.add(gActEco);

    gEmis.setgActEcoList(gActEcoList);
    dDatGralOpe.setgEmis(gEmis);

    TgDatRec gDatRec = new TgDatRec();

    gDatRec.setiNatRec(TiNatRec.NO_CONTRIBUYENTE);

    gDatRec.setiTipIDRec(TiTipDocRec.CEDULA_PARAGUAYA);

    gDatRec.setdNumIDRec("4420256");
    gDatRec.setdNomRec("Diego Perez");
    gDatRec.setiTiContRec(TiTipCont.PERSONA_FISICA);

    gDatRec.setiTiOpe(TiTiOpe.B2C);
    gDatRec.setiTiContRec(TiTipCont.PERSONA_FISICA);

    gDatRec.setcPaisRec(PaisType.PRY);

    dDatGralOpe.setgDatRec(gDatRec);
    DE.setgDatGralOpe(dDatGralOpe);

    // Grupo E
    TgDtipDE gDtipDE = new TgDtipDE();

    TgCamFE gCamFE = new TgCamFE();
    gCamFE.setiIndPres(TiIndPres.OPERACION_ELECTRONICA);
    gDtipDE.setgCamFE(gCamFE);

    // Grupo Autofactura
    TgCamAE gCamAE = new TgCamAE();
    gCamAE.setiNatVen(TiNatVen.NO_CONTRIBUYENTE);
    gCamAE.setiTipIDVen(TiTipDoc.CEDULA_PARAGUAYA);
    gCamAE.setdNumIDVen("333333");
    gCamAE.setdNomVen("Juan Perez");
    gCamAE.setdDirVen("Las Palmas 720");
    gCamAE.setdNumCasVen(720);
    gCamAE.setcDepVen(TDepartamento.CAPITAL);
    gCamAE.setcDisVen((short) 1);
    gCamAE.setcCiuVen(1);

    // Datos de la transaccion es decir donde se realizó el servicio
    gCamAE.setcDepProv(TDepartamento.CAPITAL);
    gCamAE.setcDisProv((short) 1);
    gCamAE.setcCiuProv(1);

    gDtipDE.setgCamAE(gCamAE);

    // FIN GRUPO AUTOFACTURA

    TgCamCond gCamCond = new TgCamCond();
    gCamCond.setiCondOpe(TiCondOpe.CONTADO);
    // gCamCond.setgPaConEIniList();

    List<TgPaConEIni> gPaConEIniList = new ArrayList<>();
    TgPaConEIni gPaConEIni = new TgPaConEIni();
    gPaConEIni.setiTiPago(TiTiPago.CHEQUE);
    gPaConEIni.setdMonTiPag(BigDecimal.valueOf(500000));
    gPaConEIni.setcMoneTiPag(CMondT.PYG);

    // Datos del cheque
    TgPagCheq gPagCheq = new TgPagCheq();
    gPagCheq.setdNumCheq("00000001");
    gPagCheq.setdBcoEmi("Itau");

    gPaConEIni.setgPagCheq(gPagCheq);

    gPaConEIniList.add(gPaConEIni);

    gCamCond.setgPaConEIniList(gPaConEIniList);

    gDtipDE.setgCamCond(gCamCond);

    int count = Item.size();

    List<TgCamItem> gCamItemList = new ArrayList<>();

    for (int i = 0; i < count; i++) {
        TgCamItem gCamItem = new TgCamItem();
        gCamItem.setdCodInt("SERV-00001");

        // dDesProSer Descripcion Item
        gCamItem.setdDesProSer("Consultoría");

        gCamItem.setcUniMed(TcUniMed.UNI);
        gCamItem.setdCantProSer(BigDecimal.valueOf(1));

        // Seccion Campos que describen los precios, descuentos y valor total por ítem
        TgValorItem gValorItem = new TgValorItem();
        gValorItem.setdPUniProSer(BigDecimal.valueOf(500000));

        TgValorRestaItem gValorRestaItem = new TgValorRestaItem();
        gValorRestaItem.setdDescItem(BigDecimal.valueOf(50000));

        gValorItem.setgValorRestaItem(gValorRestaItem);
        gCamItem.setgValorItem(gValorItem);

        TgCamIVA gCamIVA = new TgCamIVA();
        gCamIVA.setiAfecIVA(TiAfecIVA.EXENTO);
        gCamIVA.setdPropIVA(BigDecimal.valueOf(0));
        gCamIVA.setdTasaIVA(BigDecimal.valueOf(0));

        gCamItem.setgCamIVA(gCamIVA);

        gCamItemList.add(gCamItem);
    }

    gDtipDE.setgCamItemList(gCamItemList);
    DE.setgDtipDE(gDtipDE);
    DE.setgTotSub(new TgTotSub());

    logger.info("CDC del Documento Electrónico -> " + DE.obtenerCDC());

    String CDC = DE.obtenerCDC();

    String xml = DE.generarXml();
    ImprimirXML(xml);

gracias de antemano

certificados ya no seran entregados en medio fisico?

Buenas. Que hay de cierto de que el MIC esta cambiando la reglamentación en cuanto a emision de certificados?

Segun me comentaron que los certificados de firma digital ya no se van a entregar por medios fisicos y que estos unicamente van a ser accedidos por una API con usuario y contraseña.

Codigo de respuesta 0301

Buenas, nosotros estamos recibiendo el codigo 0301, que seria lote rechazado, consulte a sifen y me repondieron asi

En atención a la consulta, si obtienen el código 0301 pueden ser por uno de dos motivos:

  • Puede darse la situación debido a que ya existen estos documentos transmitidos anteriormente y como aún están en procesamiento, se les rechaza el lote completo.

  • O puede darse el caso de que se transmite el Lote pero el lapso de recepción de su Sistema con el SIFEN está en 30 segundos, es decir, si en 30 segundos el SIFEN no retorna el código de recepción del lote, automáticamente se devuelve el mensaje 0301.

Por tanto, sugerimos que puedan verificar en su sistem a.

Atentamente.

La consulta seria si con la libreria se puede tenes ese caso de los 30 segundos?

Notas técnicas 018, 019, 20

Fueron publicadas las notas técnicas 018, 019 y 020, en la cual la 018 tiene mayor proximidad en producción, 08/01/2024, y en test a partir de mañana 01/12/2023

Las notas técnicas 018 se agregan nuevos datos algunos campos que necesitan, eso se podría ver actualizar la libreria? ya que necesito setear esos datos.

Aguardo retorno.

Agradecido

Error XML Mal Formado en Eventos

Estoy siguiendo los ejemplos de eventos pero no logro hacer que funcionen los eventos.

public static void EnviaEvento() throws SifenException {
    LocalDateTime currentDate = LocalDateTime.now();

    TrGeVeCan trGeVeCan = new TrGeVeCan();
    trGeVeCan.setId("01800349091001001000001922024010314429356330");
    trGeVeCan.setmOtEve("Error de carga de datos");

    TgGroupTiEvt tgGroupTiEvt = new TgGroupTiEvt();
    tgGroupTiEvt.setrGeVeCan(trGeVeCan);
    
    TrGesEve rGesEve1 = new TrGesEve();
    rGesEve1.setdFecFirma(currentDate);
    rGesEve1.setId("123");
	rGesEve1.setgGroupTiEvt(tgGroupTiEvt);
	
	EventosDE eventosDE = new EventosDE();
	eventosDE.setrGesEveList(Collections.singletonList(rGesEve1));

	RespuestaRecepcionEvento ret = Sifen.recepcionEvento(eventosDE);
}

Me genera este xml (aquí formateado y sin la firma digital y certificado), alguien sabe que me falta o está mal? Gracias

<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
env:Header/
env:Body

1




2024-01-05T19:09:21
150


01800349091001001000001922024010314429356330
Error de carga de datos













...


...


...







</env:Body>
</env:Envelope>

En este evento, y también con Inutilización, siempre me retorna XML Mal Formado

<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">env:Header/env:Body<ns2:rRetEnviDe xmlns:ns2="http://ekuatia.set.gov.py/sifen/xsd">ns2:rProtDens2:dFecProc2024-01-05T19:26:47-03:00</ns2:dFecProc>ns2:dEstResRechazado</ns2:dEstRes>ns2:gResProcns2:dCodRes0160</ns2:dCodRes>ns2:dMsgResXML Mal Formado.</ns2:dMsgRes></ns2:gResProc></ns2:rProtDe></ns2:rRetEnviDe></env:Body></env:Envelope>

Kude

¿Alguien tiene un procedimiento para generar el kude pare compartir?

Gracias y saludos,

Eduardo

[Bug] java.lang.NumberFormatException TqCamItem.java

Pasos a reproducir:
Instalar todas la dependencias.
Realizar todas la configuraciones según la documentación
Usar el servicio web Sifen.consultaDE(String cdc)

Enviroment:
sifen.ambiente = PROD
Java versión = 1.8

jsifenlib version:
0.1.9

Error call stack:

java.lang.NumberFormatException: For input string: "2700809000000"
	at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) ~[na:na]
	at java.base/java.lang.Integer.parseInt(Integer.java:652) ~[na:na]
	at java.base/java.lang.Integer.parseInt(Integer.java:770) ~[na:na]
	at com.roshka.sifen.core.fields.request.de.TgCamItem.setValueFromChildNode(TgCamItem.java:133) ~[rshk-jsifenlib-0.1.9.jar:na]
	at com.roshka.sifen.internal.response.SifenObjectFactory.getFromNode(SifenObjectFactory.java:22) ~[rshk-jsifenlib-0.1.9.jar:na]
	at com.roshka.sifen.core.fields.request.de.TgDtipDE.setValueFromChildNode(TgDtipDE.java:74) ~[rshk-jsifenlib-0.1.9.jar:na]
	at com.roshka.sifen.internal.response.SifenObjectFactory.getFromNode(SifenObjectFactory.java:22) ~[rshk-jsifenlib-0.1.9.jar:na]
	at com.roshka.sifen.core.beans.DocumentoElectronico.setValueFromChildNode(DocumentoElectronico.java:294) ~[rshk-jsifenlib-0.1.9.jar:na]
	at com.roshka.sifen.internal.response.SifenObjectFactory.getFromNode(SifenObjectFactory.java:22) ~[rshk-jsifenlib-0.1.9.jar:na]
	at com.roshka.sifen.core.fields.response.de.TxContenDE.setValueFromChildNode(TxContenDE.java:24) ~[rshk-jsifenlib-0.1.9.jar:na]
	at com.roshka.sifen.internal.response.SifenObjectFactory.getFromNode(SifenObjectFactory.java:22) ~[rshk-jsifenlib-0.1.9.jar:na]
	at com.roshka.sifen.core.beans.response.RespuestaConsultaDE.setValueFromChildNode(RespuestaConsultaDE.java:27) ~[rshk-jsifenlib-0.1.9.jar:na]
	at com.roshka.sifen.internal.response.SifenObjectFactory.getFromNode(SifenObjectFactory.java:22) ~[rshk-jsifenlib-0.1.9.jar:na]
	at com.roshka.sifen.internal.request.ReqConsDe.processResponse(ReqConsDe.java:66) ~[rshk-jsifenlib-0.1.9.jar:na]
	at com.roshka.sifen.internal.request.BaseRequest.makeRequest(BaseRequest.java:52) ~[rshk-jsifenlib-0.1.9.jar:na]
	at com.roshka.sifen.internal.request.ReqConsDe.makeRequest(ReqConsDe.java:26) ~[rshk-jsifenlib-0.1.9.jar:na]
	at com.roshka.sifen.Sifen.consultaDE(Sifen.java:78) ~[rshk-jsifenlib-0.1.9.jar:na]

Preguntas sobre el entorno de prueba de emisión de factura electrónica

Hola, estoy desarrollando un software para la emisión de facturas electrónicas, estoy realizando pruebas en el ambiente de pruebas, por lo que me dijeron, el número del timbrado debe ser el mismo que el número de RUC del emisor sin el dígito de control.
Realicé las pruebas intentando enviarlo por este medio, lo que dio error al validar el número del timbrado.
Así que probé con el número RUC completo para el número del timbrado y el mensaje devuelve que el número del timbrado no es válido, como se muestra en el XML de retorno a continuación.

<?xml version="1.0" encoding="UTF-8"?> <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"><env:Header/><env:Body><ns2:rRetEnviDe xmlns:ns2="http://ekuatia.set.gov.py/sifen/xsd"><ns2:rProtDe><ns2:Id>01067041248001001000000122023122011234567891</ns2:Id><ns2:dFecProc>2024-01-24T09:37:41-03:00</ns2:dFecProc><ns2:dDigVal>qQxIrwfKWu4cSM2sObs2bw7pewkofMOrMahV/uTohzE=</ns2:dDigVal><ns2:dEstRes>Rechazado</ns2:dEstRes><ns2:gResProc><ns2:dCodRes>1101</ns2:dCodRes><ns2:dMsgRes>TEST - N&#250;mero de timbrado inv&#225;lido</ns2:dMsgRes></ns2:gResProc></ns2:rProtDe></ns2:rRetEnviDe></env:Body></env:Envelope>

Warning en consultasDE

Buenas, paso a informar que me tira este warning a la hora de consultarDE
"class com.sifen.internal.request.ReqConsLoteDe - El nombre del nodo [rRetEnviDe] no coincide con el nombre esperado [rResEnviConsLoteDe]"

y en el archivo ReqConsLoteDe.java
tenemos este metodo

BaseResponse processResponse(SOAPResponse soapResponse) throws SifenException {
Node rResEnviConsLoteDe = null;
try {
SOAPMessage soapMessage = ResponseUtil.parseSoapMessage(soapResponse.getSoapResponse());
rResEnviConsLoteDe = ResponseUtil.getMainNode(soapMessage, "rResEnviConsLoteDe");
} catch (SifenException e) {
logger.warning(e.getMessage());
}

    RespuestaConsultaLoteDE respuestaConsultaLoteDE = new RespuestaConsultaLoteDE();
    if (rResEnviConsLoteDe != null) {
        respuestaConsultaLoteDE = SifenObjectFactory.getFromNode(rResEnviConsLoteDe, RespuestaConsultaLoteDE.class);
    }

    respuestaConsultaLoteDE.setCodigoEstado(soapResponse.getStatus());
    respuestaConsultaLoteDE.setRespuestaBruta(new String(soapResponse.getRawData(), StandardCharsets.UTF_8));
    return respuestaConsultaLoteDE;
}

No se debería cambiar el rResEnviConsLoteDe por rRetEnviDe?

Soporte para versiones modulares de Java

Hola! Estoy haciendo experimentos con rshk-jsifenlib. Mi objetivo es usar en una aplicación modular con JavaFX y versiones modernas de Java. Para que eso funcione sin atar cosas con alambre es deseable que la librería

  1. tenga un descriptor de módulo
  2. declare dependencias para APIs que ya no existen en el JDK (JAX-WS, SOAP, JAXB)
  3. reemplazar código que usa APIs que, aunque todavía están presentes en JDKs nuevos, no son exportadas hacia otros módulos por defecto

(1) se soluciona agregando un module-info.java al directorio raíz de código fuente ("default package") .
Mas o menos parecido a esto:

module RshkJsifenlib {

    requires java.base;
    requires java.logging;
    requires jakarta.xml.ws;
    requires jakarta.xml.soap;
    requires java.xml.crypto;
    requires java.xml.soap;
    requires java.xml;
    requires jakarta.activation;
    
    exports com.roshka.sifen;
    exports com.roshka.sifen.core;
}

(2) se puede satisfacer a Gradle agregando esto a build.gradle:

    ...   
    implementation 'org.glassfish.jaxb:jaxb-runtime:4.0.0'
    implementation 'jakarta.xml.ws:jakarta.xml.ws-api:4.0.0'
    implementation 'com.sun.xml.ws:jaxws-rt:4.0.0'
    implementation 'javax.xml.soap:javax.xml.soap-api:1.4.0'
    implementation 'com.sun.activation:javax.activation:1.2.0'
    ...

(3) es la parte mbore, ya que la clase com.roshka.sifen.internal.helpers.SignatureHelper usa clases del package sun.security.x509, que son internas y por defecto no se pueden usar salvo que el JVM se inicie con --add-exports java.base/sun.security.x509=ALL-UNNAMED.
Por suerte, aparentemente hay un solo método que usa las clases sun.security.x509.{X509CertImpl, GeneralName, X500Name} y posiblemente se puede modificar para que funcione sin usar dependencias externas.

El método en cuestión en com.roshka.sifen.internal.helpers.SignatureHelper reescrito (compila ok pero sin probar -- puede necesitar ajuste):

        private static List<ValidezFirmaDigital.SujetoCertificado> getCertificateSubjects(KeyInfo keyInfo) {
        List<ValidezFirmaDigital.SujetoCertificado> certificateSubjects = new ArrayList<>();

        // Get certificate from Electronic Document
        X509Certificate certificate =   X509KeySelector.getCertificate(keyInfo);
        if (certificate == null) return certificateSubjects;

        // Obtener subject principal del certificado
        try {
            String subject = certificate.getIssuerX500Principal().getName();

            certificateSubjects.add(ValidezFirmaDigital.SujetoCertificado.create(
                    getAttributeFromSubject(subject, "SERIALNUMBER"),
                    SifenUtil.coalesce(getAttributeFromSubject(subject, "CN"), getAttributeFromSubject(subject, "O"))
            ));
        } catch (Exception ignored) {
        }

        // Obtener SANs desde el certificado, si existen
        try {
            
            final Collection<List<?>> sans = certificate.getSubjectAlternativeNames(); 
            
            String altNameStr = null;
            
            if(sans != null){
                for(final List<?> san : sans){
                   if((Integer) san.get(0) == 1) // name segun rfc822
                      altNameStr = (String) san.get(1);
                   certificateSubjects.add(ValidezFirmaDigital.SujetoCertificado.create(
                        getAttributeFromSubject(altNameStr, "SERIALNUMBER"),
                        SifenUtil.coalesce(getAttributeFromSubject(altNameStr, "CN"), getAttributeFromSubject(altNameStr, "O"))
                ));
                   
                }
            }
            
        } catch (Exception ignored) {
        }

        return certificateSubjects;
    }

Les parece razonable tener una rama dedicada para este caso de uso?

Saludos!

CDC menos a 8 caracteres

CDC = SifenUtil.leftPad(String.valueOf(this.getgTimb().getiTiDE().getVal()), '0', 2) +
this.getgDatGralOpe().getgEmis().getdRucEm() +
this.getgDatGralOpe().getgEmis().getdDVEmi() +
this.getgTimb().getdEst() +
this.getgTimb().getdPunExp() +
this.getgTimb().getdNumDoc() +
this.getgDatGralOpe().getgEmis().getiTipCont().getVal() +
this.getgDatGralOpe().getdFeEmiDE().format(formatter) +
this.getgOpeDE().getiTipEmi().getVal() +
this.getgOpeDE().getdCodSeg();
Cuando el ruc es menos de 8 caracteres calcula con 42/43 caracteres el CDC

Mensajes de error al validar el proyecto.

¿Buenas. Me pueden decir donde puede estar el problema?
Description Resource Path Location Type
The part 'rEnviConsDeRequest' has an invalid value 'rEnviConsDeRequest' defined for its element. Element declarations must refer to valid values defined in a schema. consulta.wsdl /rshk-jsifenlib-master/docs/set/test/v150/wsdl/consultas line 7 WSDL Problem

Utilizo el eclipse Version: Neon.3 Release (4.6.3)

Bug al consultar RUC con guiones

Cuando se consulta un RUC con guiones la set responde esto:

<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
   <env:Header />
   <env:Body>
      <ns2:rRetEnviDe xmlns:ns2="http://ekuatia.set.gov.py/sifen/xsd">
         <ns2:rProtDe>
            <ns2:dFecProc>2021-11-20T12:34:20-03:00</ns2:dFecProc>
            <ns2:dEstRes>Rechazado</ns2:dEstRes>
            <ns2:gResProc>
               <ns2:dCodRes>0160</ns2:dCodRes>
               <ns2:dMsgRes>XML Mal Formado.</ns2:dMsgRes>
            </ns2:gResProc>
         </ns2:rProtDe>
      </ns2:rRetEnviDe>
   </env:Body>
</env:Envelope>

Pero en el Objeto RespuestaConsultaRUC se setean null los atributos dCodRes y dMsgRes

{
    "codigoEstado": 400,
    "respuestaBruta": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<env:Envelope xmlns:env=\"http://www.w3.org/2003/05/soap-envelope\"><env:Header/><env:Body><ns2:rRetEnviDe xmlns:ns2=\"http://ekuatia.set.gov.py/sifen/xsd\"><ns2:rProtDe><ns2:dFecProc>2021-11-20T12:34:20-03:00</ns2:dFecProc><ns2:dEstRes>Rechazado</ns2:dEstRes><ns2:gResProc><ns2:dCodRes>0160</ns2:dCodRes><ns2:dMsgRes>XML Mal Formado.</ns2:dMsgRes></ns2:gResProc></ns2:rProtDe></ns2:rRetEnviDe></env:Body></env:Envelope>",
    "dCodRes": null,
    "dMsgRes": null,
    "xContRUC": null
}

envio DE

buenas, desde la semana pasada estaba haciendo algunas pruebas del DE y todo ok,
pero hoy al tratar de enviar una prueba me retorna lo siguiente:

<title>BIG-IP logout page</title> <script src="/public/include/js/common.js" language="javascript"></script> <script src="/public/include/js/u_plugin.js" language="javascript"></script>
<script language="javascript">
  function InsertActivexControl(clsid, params)
  {
      var container = document.getElementById("logoutActivexContainer");
      
      if (navigator.appName == "Microsoft Internet Explorer") {
          var paramsCode = "";
          for (var item in params) {
              paramsCode += "<param name='" + item + "' value='" + params[item] + "'>";
          }
          
          container.innerHTML = 
              "<center><object classId=CLSID:" + clsid + " border=0 width=1 height=1>" +
              paramsCode + "</object></center>";
      }
      else {
          var pluginHost = new UPluginHost("", container);
          var control = {"clsid": clsid, "width": 1, "height": 1};
          pluginHost.hostControl(control, params);
      }
  }
  
  function OnLoad()
  {
    var isBrowserControl = false;
    try {
        isBrowserControl = ("undefined" != typeof(window.external))
            && ("unknown" != typeof(window.external))
            && ("undefined" != typeof(window.external.WebLogonNotifyUser))
            && ("unknown" != typeof(window.external.WebLogonNotifyUser));
    }
    catch(e) {}
    if(!isBrowserControl) {
        document.getElementById("newSessionDIV").style.visibility = "visible";
    }

    try
    {
        if (get_cookie("F5_PWS") == "1")
        {
            document.cookie = "F5_PWS=0; path=/; expires=Fri, 01-Jan-1970 00:00:01 GMT";
            var pwsClassId = "7E73BE8F-FD87-44EC-8E22-023D5FF960FF";
            InsertActivexControl(pwsClassId, {"command": "exit"} );
        }
    }catch (e) {};
  }
</script>
<script> try{
if(window.external && window.external.WebLogonOnAuthFailure) {
    window.external.WebLogonOnAuthFailure();
}

}catch(e){};
try {
window.external.OnHostClose();
} catch(e) { }
</script>


<script language="javascript"> //orientation toolbox function setViewport(){ document.getElementById("viewport").setAttribute('content', Math.abs(window.orientation) == 90 ? 'width=device-height, initial-scale=1' : 'width=device-width, initial-scale=1.0' ); } setViewport(); window.onorientationchange = function() { setViewport(); } </script>
JavaScript no está habilitado. Habilite JavaScript en su navegador o póngase en contacto con su administrador de sistema para obtener ayuda.
Para abrir una nueva sesión, haga clic aquí.
Su sesión ha finalizado.

Cerró la sesión exitosamente.

Gracias por usar BIG-IP.

Para abrir una nueva sesión, haga clic aquí.

Posible Bug en Nota Técnica N° 13

En clase TgCamIva, al verificar la implementación de la nueva variable dBaseExe, encontré que utilizaron el valor que corresponde a propIVA , que corresponde a (dPropIVA/100), o (E733/100), donde tuvieron que usar solamente dPropIVA.

En la linea 56, de la clase mencionada, debería ser:

this.dBasExe = (dTotOpeItem.multiply(hundred.subtract(dPropIVA)).multiply(hundred)).divide((this.dTasaIVA.multiply(dPropIVA)).add(BigDecimal.valueOf(10000)), scale, RoundingMode.HALF_UP);

Donde actualmente es:

this.dBasExe = (dTotOpeItem.multiply(hundred.subtract(propIVA)).multiply(hundred)).divide((this.dTasaIVA.multiply(dPropIVA)).add(BigDecimal.valueOf(10000)), scale, RoundingMode.HALF_UP);

Orientación calculo dTotGralOpe

buenas, estoy realizando las pruebas con el nuevo release y armo el xml considerando lo siguiente:
<gTotSub> <dSubExe>0</dSubExe> <dSubExo>0</dSubExo> <dSub5>0</dSub5> <dSub10>10000</dSub10> <dTotOpe>10000</dTotOpe> <dTotDesc>0</dTotDesc> <dTotDescGlotem>0</dTotDescGlotem> <dTotAntItem>0</dTotAntItem> <dTotAnt>0</dTotAnt> <dPorcDescTotal>0</dPorcDescTotal> <dDescTotal>0</dDescTotal> <dAnticipo>0</dAnticipo> <dRedon>0</dRedon> <dComi>0</dComi> <dTotGralOpe>10000</dTotGralOpe> <dIVA5>0</dIVA5> <dIVA10>909</dIVA10> <dTotIVA>909</dTotIVA> <dBaseGrav5>0</dBaseGrav5> <dBaseGrav10>9091</dBaseGrav10> <dTBasGraIVA>9091</dTBasGraIVA> </gTotSub>

pero al generar el xml firmado me retorna de la siguiente manera:
<gTotSub> <dSubExe>0</dSubExe> <dSubExo>0</dSubExo> <dSub5>0</dSub5> <dSub10>10000</dSub10> <dTotOpe>10000</dTotOpe> <dTotDesc>0</dTotDesc> <dTotDescGlotem>0</dTotDescGlotem> <dTotAntItem>0</dTotAntItem> <dTotAnt>0</dTotAnt> <dPorcDescTotal>0.00</dPorcDescTotal> <dDescTotal>0</dDescTotal> <dAnticipo>0</dAnticipo> <dRedon>0000</dRedon> <dComi>0</dComi> <dTotGralOpe>0</dTotGralOpe> <dIVA5>0</dIVA5> <dIVA10>909</dIVA10> <dLiqTotIVA5>0</dLiqTotIVA5> <dLiqTotIVA10>0</dLiqTotIVA10> <dIVAComi>0</dIVAComi> <dTotIVA>909</dTotIVA> <dBaseGrav5>0</dBaseGrav5> <dBaseGrav10>9091</dBaseGrav10> <dTBasGraIVA>9091</dTBasGraIVA> </gTotSub>

luego realiza el envio exitosamente, pero al consultar me emite un rechazo como sigue:
<?xml version="1.0" encoding="UTF-8"?> <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"> <env:Header/> <env:Body> <ns2:rResEnviConsLoteDe xmlns:ns2="http://ekuatia.set.gov.py/sifen/xsd"> <ns2:dFecProc>2023-05-17T11:07:34-04:00</ns2:dFecProc> <ns2:dCodResLot>0362</ns2:dCodResLot> <ns2:dMsgResLot>Procesamiento de lote {11637933917148136} concluido</ns2:dMsgResLot> <ns2:gResProcLote> <ns2:id>01800026152001001000022322023051611818379360</ns2:id> <ns2:dEstRes>Rechazado</ns2:dEstRes> <ns2:gResProc> <ns2:dCodRes>2365</ns2:dCodRes> <ns2:dMsgRes>TEST - C&#225;lculo del total general de la operaci&#243;n incorrecto</ns2:dMsgRes> </ns2:gResProc> </ns2:gResProcLote> </ns2:rResEnviConsLoteDe> </env:Body> </env:Envelope>

si podrian orientarme por favor.

Notas de Credito

Buenas, me podrían ayuda por favor para entender el envío de una NC al Sifen utilizando la libreria.

// Grupo E
TgDtipDE gDtipDE = new TgDtipDE();

//Nota de Credito
TgCamNCDE gNCDE = new TgCamNCDE();
if (pTipoFactura.equals("NOTA_DE_CREDITO_ELECTRONICA")) {
gNCDE.setiMotEmi(TiMotEmi.DEVOLUCION_Y_AJUSTES_DE_PRECIOS);
gDtipDE.setgCamNCDE(gNCDE);
}

ERROR:

Exception in thread "main" java.lang.NullPointerException
at com.roshka.sifen.core.beans.DocumentoElectronico.setupDE(DocumentoElectronico.java:284)
at com.roshka.sifen.core.beans.DocumentoElectronico.setupSOAPElements(DocumentoElectronico.java:226)
at com.roshka.sifen.internal.request.ReqRecDe.setupSoapMessage(ReqRecDe.java:33)
at com.roshka.sifen.internal.request.BaseRequest.makeRequest(BaseRequest.java:32)
at com.roshka.sifen.internal.request.ReqRecDe.makeRequest(ReqRecDe.java:22)
at com.roshka.sifen.Sifen.recepcionDE(Sifen.java:184)
at com.roshka.sifen.Sifen.recepcionDE(Sifen.java:162)

dTotDesc y dTotDescGlotem debe ser x la Cantidad

en TgTotSub linea 86 y 87, se debe de la suma de los descuentos unitarios x la cantidad según la documentación, por lo que creo que deberia agregarse el multiply
this.dTotDesc = this.dTotDesc.add(SifenUtil.coalesce(gCamItem.getgValorItem().getgValorRestaItem().getdDescItem().multiply( gCamItem.getdCantProSer()) , BigDecimal.ZERO));
this.dTotDescGlotem = this.dTotDescGlotem.add(SifenUtil.coalesce(gCamItem.getgValorItem().getgValorRestaItem().getdDescGloItem().multiply( gCamItem.getdCantProSer()) , BigDecimal.ZERO));

Su sesión ha finalizado

al intentar enviar o consultar un DE me devuelve lo siguiente:

<title>BIG-IP logout page</title> <script src="/public/include/js/common.js" language="javascript"></script> <script src="/public/include/js/u_plugin.js" language="javascript"></script>
<script language="javascript">
  function InsertActivexControl(clsid, params)
  {
      var container = document.getElementById("logoutActivexContainer");
      
      if (navigator.appName == "Microsoft Internet Explorer") {
          var paramsCode = "";
          for (var item in params) {
              paramsCode += "<param name='" + item + "' value='" + params[item] + "'>";
          }
          
          container.innerHTML = 
              "<center><object classId=CLSID:" + clsid + " border=0 width=1 height=1>" +
              paramsCode + "</object></center>";
      }
      else {
          var pluginHost = new UPluginHost("", container);
          var control = {"clsid": clsid, "width": 1, "height": 1};
          pluginHost.hostControl(control, params);
      }
  }
  
  function OnLoad()
  {
    var isBrowserControl = false;
    try {
        isBrowserControl = ("undefined" != typeof(window.external))
            && ("unknown" != typeof(window.external))
            && ("undefined" != typeof(window.external.WebLogonNotifyUser))
            && ("unknown" != typeof(window.external.WebLogonNotifyUser));
    }
    catch(e) {}
    if(!isBrowserControl) {
        document.getElementById("newSessionDIV").style.visibility = "visible";
    }

    try
    {
        if (get_cookie("F5_PWS") == "1")
        {
            document.cookie = "F5_PWS=0; path=/; expires=Fri, 01-Jan-1970 00:00:01 GMT";
            var pwsClassId = "7E73BE8F-FD87-44EC-8E22-023D5FF960FF";
            InsertActivexControl(pwsClassId, {"command": "exit"} );
        }
    }catch (e) {};
  }
</script>
<script> try{
if(window.external && window.external.WebLogonOnAuthFailure) {
    window.external.WebLogonOnAuthFailure();
}

}catch(e){};
try {
window.external.OnHostClose();
} catch(e) { }
</script>


<script language="javascript"> //orientation toolbox function setViewport(){ document.getElementById("viewport").setAttribute('content', Math.abs(window.orientation) == 90 ? 'width=device-height, initial-scale=1' : 'width=device-width, initial-scale=1.0' ); } setViewport(); window.onorientationchange = function() { setViewport(); } </script>
JavaScript no está habilitado. Habilite JavaScript en su navegador o póngase en contacto con su administrador de sistema para obtener ayuda.
Para abrir una nueva sesión, haga clic aquí.
Su sesión ha finalizado.

Cerró la sesión exitosamente.

Gracias por usar BIG-IP.

Para abrir una nueva sesión, haga clic aquí.

como soluciono esto?, o a que se debe el problema?

Ignorancia mia..

Disculpen por la pregunta torpe.. pero en cuanto tiempo estaría disponible en Maven central la ultima versión?
Por que al colocar en el pom.xml

com.roshka.sifen
rshk-jsifenlib
0.2.3

me tira error?
en serio no pillo como se actualiza

Xml mal formado al enviar evento del receptor: Notificación de Recepción

Al intentar enviar el evento de notificación de recepción del receptor, el ws de la SET devuelve la respuesta bruta:

<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">env:Header/env:Body<ns2:rRetEnviDe xmlns:ns2="http://ekuatia.set.gov.py/sifen/xsd">ns2:rProtDens2:dFecProc2022-06-27T10:36:39-04:00</ns2:dFecProc>ns2:dEstResRechazado</ns2:dEstRes>ns2:gResProcns2:dCodRes0160</ns2:dCodRes>ns2:dMsgResXML Mal Formado.</ns2:dMsgRes></ns2:gResProc></ns2:rProtDe></ns2:rRetEnviDe></env:Body></env:Envelope>

En el server log:
10:36:39,929 WARNING [class com.roshka.sifen.internal.request.ReqRecEventoDe] (default task-1) El nombre del nodo [rRetEnviDe] no coincide con el nombre esperado [rRetEnviEventoDe]

Por lo que puedo notar, en el xml debe formarse el tag con el nombre: rRetEnviEventoDe, pero se está formando con el nombre: rRetEnviDe

Para los demas eventos del receptor no tuve inconvenientes y pude enviarlos sin problemas.

Estoy usando la ultima versión de la api: rshk-jsifenlib 0.2.1

Comparto el cdc de la FE que estoy utilizando: 01800034686001001000004322022062417878047569

ERROR: 'Las comillas de apertura se deben utilizar para el atributo "classId" asociado a un tipo de elemento "object".'

Hola !

Cuando envio mi Documento Electronico, tengo este error.

mar 05, 2023 9:00:51 PM com.roshka.sifen.Sifen setSifenConfig
INFORMACIÓN: Configuración de Sifen guardada correctamente
mar 05, 2023 9:00:51 PM com.roshka.sifen.Sifen recepcionDE
INFORMACIÓN: Preparando petición 'Recepción de DE'
mar 05, 2023 9:00:52 PM com.roshka.sifen.internal.request.BaseRequest makeRequest
INFORMACIÓN: XML generado, se realiza la petición
mar 05, 2023 9:00:52 PM com.roshka.sifen.internal.helpers.SSLContextHelper getContextFromConfig
INFORMACIÓN: Contexto SSL no cargado aún. Empezando carga...
mar 05, 2023 9:00:52 PM com.roshka.sifen.internal.helpers.SoapHelper makeSoapRequest
INFORMACIÓN: Conectando a: https://sifen-test.set.gov.py/de/ws/sync/recibe.wsdl
mar 05, 2023 9:00:52 PM com.roshka.sifen.internal.helpers.SoapHelper makeSoapRequest
INFORMACIÓN: Enviando mensaje SOAP
ERROR: 'Las comillas de apertura se deben utilizar para el atributo "classId" asociado a un tipo de elemento "object".'
mar 05, 2023 9:00:52 PM com.sun.xml.internal.messaging.saaj.soap.EnvelopeFactory createEnvelope
GRAVE: SAAJ0511: no se ha podido crear el elemento Envelope desde el origen especificado
mar 05, 2023 9:00:52 PM com.roshka.sifen.internal.request.ReqRecDe processResponse
ADVERTENCIA: El cuerpo del mensaje SOAP es nulo. No se puede obtener el nodo principal.
mar 05, 2023 9:00:52 PM com.roshka.sifen.internal.request.BaseRequest makeRequest
INFORMACIÓN: Petición realizada, se formatea la respuesta
*

Alguna ayuda al respecto ?

Gracias !!

posible bug en generar de.generarXml()

Al utilizar el metodo de.generarXml(ctx) al pasarle el parametro nuevo, tengo el error Falta establecer la configuracion del Sifen.
pero el ctx lo genero como GenerationCtx.getDefaultFromConfig(config). Este error se soluciona haciendo de.generarXml(ctx, ctx.getSifenConfig());

eh leido el codigo en el git y el metodo con un solo parametro llama y hace lo mismo que hago en mi solucion pero no me funciona con un solo parametro, estoy usando implementation 'com.roshka.sifen:rshk-jsifenlib:0.2.3', la manera de dos parametros me funciona correctamente, pero pongo esto en caso que quieran dar una mirada.

Problema en generación de firma digital

Buenas tardes,

Estoy teniendo un problema en la generación de la firma digital. Puedo usar correctamente mi certificado pero la firma generada tiene problemas. La gente de Sifen me indico que los carctares &#13; al final de cada linea en los campos SignatureValue y X509Certificate producen errores al tratar de validar la firma en del lado de Sifen. Es posible que la generación de esos carácteres al generar la firma con la libreria se deba a una mala configuración del certificado? La configuración que utilizo es la siguiente:

SifenConfig config = new SifenConfig(
SifenConfig.TipoAmbiente.DEV,
"0002", // ID CSC
"EFGH0000000000000000000000000000", // CSC
SifenConfig.TipoCertificadoCliente.PFX,
"/Users/fabriciomendozagranada/Documents/CDS/sifenbridge/certificado_digital.pfx",
"password"
);
config.setUsarCertificadoCliente(true);

Sifen.setSifenConfig(config);

Error 1301 - Descripción del país receptor no corresponde al código

Para casos de envío de facturas del exterior, falló en algunos casos ya que dió el error 1301-"Descripción del país receptor no corresponde al código".
Por ejemplo: para facturas de Hong Kong, se enviaba en la descripción del país "China, región administrativa especial de Hong Kong". En cambio, sólo se esperaba "Hong Kong".

Sugerencia - Al convertir un XML en objeto, adicionar el enlace de QR

Aveces hay la necesidad de generar el KUDE de un xml y al usar el constructor de DocumentoElectronico no genera el link de QR.

Sin mas que agregar. Excelente trabajo en la lib

`

public DocumentoElectronico(String xml) throws SifenException {
xml = xml.replaceAll(">[\s\r\n]*<", "><");

    Document xmlDocument;
    try {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setNamespaceAware(true);
        DocumentBuilder builder = factory.newDocumentBuilder();
        xmlDocument = builder.parse(new InputSource(new StringReader(xml)));
    } catch (ParserConfigurationException | IOException | SAXException e) {
        throw SifenExceptionUtil.xmlParsingError("Se produjo un error al parsear el archivo XML. Formato incorrecto.");
    }

    // Obtenemos el nodo principal
    Node mainNode = xmlDocument.getElementsByTagName("DE").item(0);
    
  
      **SUGERENCIA - ADICIONAR ESTAS LINEAS**
	Node nodeQR = xmlDocument.getElementsByTagName("dCarQR").item(0);
	this.enlaceQR = nodeQR.getTextContent();
     **SUGERENCIA - ADICIONAR ESTAS LINEAS**

    SifenObjectFactory.getFromNode(mainNode, this);
    this.obtenerCDC();
}

`

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.