project-openubl / xhandler-java

Java library for creating and sending XML files through SOAP - SUNAT
https://project-openubl.github.io/
Apache License 2.0
18 stars 18 forks source link

javax.xml.ws.soap.SOAPFaultException: Unmarshalling Error: unexpected element (uri:"", local:"rucComprobante"). Expected elements are <{}statusCdr> #15

Closed geraldvaras closed 3 years ago

geraldvaras commented 4 years ago

Estoy intentando ejecutar el metodo getStatusCDR de la clase BillConsultServiceManager pero obtengo una excepcion SOAPFaultException

El metodo que estoy empleando para ejecutarlo es el siguiente: public void assertConsultToSunat(String ruc, String documentType , String serie, Integer numero, BillServiceModel.Status estado) throws Exception{ ServiceConfig serviceConfig = new ServiceConfig.Builder() .url(WEBSERVICE_URL) .username(WEBSERVICE_USERNAME) .password(WEBSERVICE_PASSWORD) .build(); BillConsultModel consulta = new BillConsultModel.Builder() .ruc(ruc) .serie(serie) .numero(numero) .tipo(documentType) .build(); StatusResponse statusResponse = BillConsultServiceManager.getStatusCdr(consulta, serviceConfig); assertEquals(statusResponse.getStatusCode(),estado); }

Lo cual me deberia devolver una instancia de la clase StatusResponse sin embargo obtengo el error: ` javax.xml.ws.soap.SOAPFaultException: Unmarshalling Error: unexpected element (uri:"", local:"rucComprobante"). Expected elements are <{}statusCdr>

at org.apache.cxf.jaxws.JaxWsClientProxy.mapException(JaxWsClientProxy.java:195)
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:145)
at com.sun.proxy.$Proxy193.getStatusCdr(Unknown Source)
at io.github.project.openubl.xmlsenderws.webservices.wrappers.BillConsultServiceWrapper.getStatusCdr(BillConsultServiceWrapper.java:44)
at io.github.project.openubl.xmlsenderws.webservices.managers.BillConsultServiceManager.getStatusCdr(BillConsultServiceManager.java:34)

Caused by: org.apache.cxf.binding.soap.SoapFault: Unmarshalling Error: unexpected element (uri:"", local:"rucComprobante"). Expected elements are <{}statusCdr> `

Adjunto el soap response del servidor ID: 1 Response-Code: 500 Encoding: UTF-8 Content-Type: text/xml;charset=UTF-8 Headers: {Content-Length=[308], content-type=[text/xml;charset=UTF-8], Date=[Mon, 21 Sep 2020 20:51:39 GMT], Server=[JBoss-EAP/7], X-Powered-By=[Undertow/1]} Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><soap:Fault><faultcode>soap:Client</faultcode><faultstring>Unmarshalling Error: unexpected element (uri:"", local:"rucComprobante"). Expected elements are &lt;{}statusCdr> </faultstring></soap:Fault></soap:Body></soap:Envelope>

github-actions[bot] commented 4 years ago

Cogratulations! You have just created your first issue. Thanks for contributting to this project! We will answer you as soon as possible' first issue

carlosthe19916 commented 4 years ago

@geraldvaras No veo ningun problema en el método que adjuntaste, excepto la linea assertEquals(statusResponse.getStatusCode(), estado); ya que estas comparando dos tipos de datos distintos. Acá adjunto tu código con algunas modificaciones para hacer que funcione correctamente:

@Test
public void testConsultToSunat () throws IOException {
    assertConsultToSunat("myRUC", Catalogo1.FACTURA.getCode(), "F001", 20);
}

public void assertConsultToSunat(String ruc, String documentType, String serie, Integer numero) throws IOException {
    ServiceConfig serviceConfig = new ServiceConfig.Builder()
            .url("https://e-factura.sunat.gob.pe/ol-it-wsconscpegem/billConsultService")
            .username(WEBSERVICE_USERNAME)
            .password(WEBSERVICE_PASSWORD)
            .build();

    BillConsultModel consulta = new BillConsultModel.Builder()
            .ruc(ruc)
            .serie(serie)
            .numero(numero)
            .tipo(documentType)
            .build();

    // Fetch data from SUNAT
    service.sunat.gob.pe.billconsultservice.StatusResponse statusResponse = BillConsultServiceManager.getStatusCdr(consulta, serviceConfig);

    // Verify data Invoice exists in SUNAT
    assertEquals(statusResponse.getStatusCode(), "0004");
    assertEquals(statusResponse.getStatusMessage(), "La constancia existe");
    assertNotNull(statusResponse.getContent());

    // Write the CRD to your filesystem
    Path path = Paths.get("/home/guest/myCrd.zip");
    Files.write(path, statusResponse.getContent());
}

Los puntos en los que debes de tener cuidado:

Como extra, acá tienes el código de ejemplo funcionando al 100% sin ninguna clase de error. Solo copia y pega el ejemplo que te compartí. Me comestas si solucionaste tu problema.

Screenshot from 2020-09-22 08-45-12_11

Recuerda que este es un proyecto Open Source y puedes colaborar dándole una estrella al proyecto, sugiriendo mejoras, reportando errores, etc.

geraldvaras commented 4 years ago

@carlosthe19916 Gracias por la pronta respuesta. Te comento hice las modificaciones que me indicaste en el método, sin embargo sigo obteniendo el mismo error. (Adjunto screen) imagen Me puse a depurar el soap request con SoapUI y me acabo de percatar que necesita incluir los parámetros con la etiqueta <statusCdr> para que la llamada pueda funcionar, adicional a esto el parámetro de numero de comprobante lo he tenido que completar con 0s para que me devuelva el cdr caso contrario me indica que el ticket no existe. imagen imagen imagen

De antemano te agradezco la respuesta y por tu valioso tiempo.

carlosthe19916 commented 4 years ago

@geraldvaras el ejemplo que adjuntas me parece muy interesante ya que estas consultando una Guia de Remisión y no una boleta/factura/etc. como en el ejemplo que yo adjunté.

Una pregunta que URL usas para consultar "Guias de remisión", es https://e-factura.sunat.gob.pe/ol-it-wsconscpegem/billConsultService? u otra?

Si hay algo que mejorar me gustaria mejorar la libreria para poder cubrir todos los casos, incluyendo el tuyo.

geraldvaras commented 4 years ago

@carlosthe19916 en este caso mi proveedor (bizlinks) usa una única url para para todas las operaciones relacionas a la facturación electrónica. https://osetesting.bizlinks.com.pe/ol-ti-itcpe/billService?wsdl. He estado probando la librería para las demás operaciones y funcionan a la perfección, y es de gran ayuda. Espero poder colaborar con la misma. Salu2,

carlosthe19916 commented 4 years ago

@geraldvaras hice un par de pruebas y la libreria funciona correctamente usando:

Al parecer tu proveedor no funciona exactamente como la SUNAT lo hace.

Screenshot from 2020-09-22 20-15-29

geraldvaras commented 4 years ago

Si efectivamente no funciona como SUNAT lo hace, Que me recomendarías para este caso. De antemano gracias por tu respuesta.

carlosthe19916 commented 4 years ago

@geraldvaras