Libreria para realizar envíos de comprobantes electrónicos a los servicios web de la SUNAT y/o OSCE de acuerdo a lo especificado por la SUNAT:
Incluir la última version de la libreria. Si utiliza maven agrege las siguientes lineas al archivo pom.xml:
<dependency>
<groupId>io.github.project-openubl</groupId>
<artifactId>xsender</artifactId>
<version>3.0.1.Final</version>
</dependency>
Puede ver la lista de todos las disponibles aqui.
Utilizado para enviar:
- Boletas y Facturas.
- Notas de Crédito.
- Notas de Débito.
- Guias de Remisión.
- Percepciones.
- Retenciones.
ServiceConfig config = new ServiceConfig.Builder()
.url("https://e-beta.sunat.gob.pe/ol-ti-itcpfegem-beta/billService")
.username("12345678959MODDATOS")
.password("MODDATOS")
.build();
File file = new File("../../12345678959-01-F001-00000001.xml");
BillServiceModel result = BillServiceManager.sendBill(file, config);
Nota: El valor de URL dependerá de qué tipo de documento está intentando enviar.
Utilizado para enviar:
- Baja.
- Resumen diario.
ServiceConfig config = new ServiceConfig.Builder()
.url("https://e-beta.sunat.gob.pe/ol-ti-itcpfegem-beta/billService")
.username("12345678959MODDATOS")
.password("MODDATOS")
.build();
File file = new File(".../../12345678959-RA-20180316-00001.xml");
BillServiceModel result = BillServiceManager.sendSummary(file, config);
Nota: El resultado de enviar una baja o resumen diario es un número de ticket. En caso desee consultar el ticket al mismo tiempo en el que se envía el comprobante, entonces deberás de usar:
ServiceConfig config;
File file;
Map<String, Object> params; // Datos que se enviarán al callback.
long delay; // Cantidad de milisegundos a esperar antes de consultar el ticket.
BillServiceManager.sendSummary(
file,
config,
params,
new BillServiceCallback() {
@Override
public void onSuccess(Map<String, Object> params, int code, String description, byte[] cdr) { }
@Override
public void onError(Map<String, Object> params, int code, String description, byte[] cdr) { }
@Override
public void onProcess(Map<String, Object> params, int code, String description) { }
@Override
public void onException(Map<String, Object> params, int code, String description) { }
@Override
public void onThrownException(Map<String, Object> params, SOAPFaultException exception) { }
}, delay);
Utilizado para consultar tickets:
ServiceConfig config = new ServiceConfig.Builder()
.url("https://e-beta.sunat.gob.pe/ol-ti-itcpfegem-beta/billService")
.username("12345678959MODDATOS")
.password("MODDATOS")
.build();
BillServiceModel result = BillServiceManager.getStatus("miTicket", config);
ServiceConfig config = new ServiceConfig.Builder()
.url(URL_CONSULTA)
.username(USERNAME)
.passwod(PASSWORD)
.build();
BillConsultBean consult = new BillConsultBean.Builder()
.ruc("1234567894")
.tipo("01")
.serie("F001")
.numero(102)
.build();
service.sunat.gob.pe.billconsultservice.StatusResponse response = BillConsultServiceManager.getStatus(consult, config);
ServiceConfig config = new ServiceConfig.Builder()
.url(URL_CONSULTA)
.username(USERNAME)
.passwod(PASSWORD)
.build();
BillConsultBean consult = new BillConsultBean.Builder()
.ruc("1234567894")
.tipo("01")
.serie("F001")
.numero(102)
.build();
service.sunat.gob.pe.billconsultservice.StatusResponse response = BillConsultServiceManager.getStatusCdr(config, consult);
Verificar la autenticidad de un archivo XMl:
File file = new File("../folder/F001-00005954.xml");
ServiceConfig config = new ServiceConfig.Builder()
.url("https://e-factura.sunat.gob.pe/ol-it-wsconsvalidcpe/billValidService")
.username(USERNAME)
.passwod(PASSWORD)
.build();
StatusResponse status = BillValidServiceManager.getStatus(file, config);
El conjunto de Web Services que la SUNAT publica puede ser encontrada aqui.
La SUNAT clasifica los errores en tres tipos: Excepciones, Rechazo, Observaciones.
Los códigos se han clasificado de acuerdo al tipo de error:
- Del 0100 al 1999 Excepciones
- Del 2000 al 3999 Errores que generan rechazo
- Del 4000 en adelante Observaciones
De acuerdo al tipo de error que se genera, el sistema responde de manera distinta al emisor. Las respuestas son:
- Si es una EXCEPCION, el sistema responde como una excepción del programa, es decir, retorna el código de error con su descripción.
- Si hay un ERROR QUE GENERA RECHAZO, el sistema genera una constancia de recepción (CDR) con estado rechazada, indicando que el comprobante no ha sido registrado en SUNAT por tener errores.
- Si hay OBSERVACIONES, el sistema genera una constancia de recepción (CDR) con estado aceptada con advertencias, indicando que el comprobante ha sido correctamente enviado y registrado en SUNAT. Las advertencias se muestran en la constancia de recepción.
- Finalmente, si no hay ningún tipo de error, se genera una constancia de recepción (CDR) aceptada, indicando que el comprobante ha sido correctamente enviado y registrado en SUNAT.
Nota: La lista de errores puede ser descargada aqui.
Cuando una petición a BillService devuelve algun error es posible controlar esos errores haciendo uso de la interfaz:
interface ErrorBillServiceProviderFactory { ....}
Nota: Se recorrerá todos las instancias que implementen la interfaz ErrorBillServiceProviderFactory y se detendrá el recorrido cuando alguna instance devuelva un valor diferente a null.
CLASE | DESCRIPCION | ACTIVO POR DEFECTO |
---|---|---|
ErrorExcepcionBillServiceProviderFactory | Errores entre 100 y 1999 inclusive | SI |
ErrorRechazoBillServiceProviderFactory | Errores entre 2000 y 3999 inclusive | SI |
ErrorObservacionesBillServiceProviderFactory | Errores mayores a 4000 | SI |
Error2324BillServiceProviderFactory | Error para el error 2324. Pone como aceptado un comprobante que ya fue comunicado como baja anteriormente | SI |
Error1033BillServiceProviderFactory | Error para el error 1033. Permite recuperar el cdr de un comprobante que ya fue enviado anteriormente | NO |
En caso desees controlar los errores de la SUNAT deberás seguir los siguientes pasos:
- Crear una clase que implemente la interfaz ErrorBillServiceProviderFactory:
public class MyErrorHandlerFactory implements ErrorBillServiceProviderFactory { ... }
- Crear el archivo:
META-INF/services/ErrorBillServiceProviderFactory
- Dentro del archivo creado en el paso anterior se deberá añadir una linea indicando el nombre de la clase (incluyendo el paquete en el que está ubicado) creada en el paso 1:
mipaquete.MyErrorHandlerFactory