roshkadev / rshk-jsifenlib Goto Github PK
View Code? Open in Web Editor NEWLibrería de código abierto para interactuar con SIFEN de la SET.
Librería de código abierto para interactuar con SIFEN de la SET.
Como se podria consultar el estado de un CDC ya sea en lote o en forma individual?
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:
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.
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?
Consulta, habrá soporte para la Nota Técnica 16 con con la ampliación del soporte de sha-512?
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
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);
¿Cómo puedo obtener el XML enviado y el XML de respuesta?
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.
Actualmente:
Si hay una buena razón por la que las constantes fueron definidas de esta manera, favor ignorar y cerrar rabiosamente el ticket.
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.
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?
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.
Creen que tendríamos el release de esto en breve?, estamos apoyados 100% en esta excelente librería.
Desde ya muchas gracias
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>
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.
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>
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);
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...
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.!
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.
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á habilitado para utilizar este tipo de servicio</ns2:dMsgRes>
parece que ni todos los RUC iran adicionado zero al inicio.
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));
}
}
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
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)
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
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.
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?
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
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>
¿Alguien tiene un procedimiento para generar el kude pare compartir?
Gracias y saludos,
Eduardo
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]
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úmero de timbrado inválido</ns2:dMsgRes></ns2:gResProc></ns2:rProtDe></ns2:rRetEnviDe></env:Body></env:Envelope>
A partir del 21 de Mayo del 2023 se requiere enviar el campo dBasExe.
Adjunto la documentación sobre dicho cambio.
NT_E_KUATIA_013_MT_V150.pdf
De ser requerido puedo apoyarlos con el cambio.
Saludos!
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?
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) 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 = 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
¿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)
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
}
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:
<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>
if(window.external && window.external.WebLogonOnAuthFailure) {
window.external.WebLogonOnAuthFailure();
}
}catch(e){};
try {
window.external.OnHostClose();
} catch(e) { }
</script>
![]() |
|
|
![]() |
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);
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álculo del total general de la operación incorrecto</ns2:dMsgRes> </ns2:gResProc> </ns2:gResProcLote> </ns2:rResEnviConsLoteDe> </env:Body> </env:Envelope>
si podrian orientarme por favor.
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)
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));
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>
if(window.external && window.external.WebLogonOnAuthFailure) {
window.external.WebLogonOnAuthFailure();
}
}catch(e){};
try {
window.external.OnHostClose();
} catch(e) { }
</script>
![]() |
|
|
![]() |
como soluciono esto?, o a que se debe el problema?
En un equipo en particular el objeto dRedon del xml tiene "," (coma) en el separador de decimales, ejemplo:
0,09
Lo correcto es que sea
0.09
No encuentro el lugar donde se pueda forzar eso o de que depende
Obs: en otras implementaciones hace correcto
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
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
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 !!
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.
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);
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".
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();
}
`
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.