FACTURA
Generación de factura
Este primer punto permitirá saber si sus datos están completos y a su vez, generará el XML en el servidor de la API, para ello debe enviar los datos de su factura en formato JSON a través de la siguiente url del servicio:
INFO: Tenga en cuenta que la API no valida la información de datos de venta(errores de costos y entre otros) estos datos son validados por SUNAT.
https://billing.codideep.com/bill/generatexml
Si los datos enviados son correctos, se le enviará un mensaje de operación realizada correctamente, caso contrario se atribuirá el mensaje de error correspondiente; así mismo, el sistema de la API se encargará de almacenar el archivo enviado para futuras consultas o en caso de que se requiera enviar la factura a la SUNAT(Servicio de Administración Tributaria del Perú). El flujo inicial para este primer endpoint se representa en el siguiente diagrama:
Hasta ahora se sabe cual es la url del servicio y el formato de los datos que se deben enviar, ahora se mostrará un ejemplo de como se debe enviar la información de la factura en formato JSON usando algunos lenguajes y herramientas.
INFO: Para poder realizar las peticiones al servidor necesita contar con las credencial de acceso(username y password), ambos obtenidos al momento de adquirir el servicio.
{
"dto_codigoUnicoVenta": 1,
"dto_serieNumeroComprobanteEf": "F001-00000001",
"dto_fechaEmisionComprobanteEf": "2022-11-23",
"dto_rucEmpresaEf": "00000000000",
"dto_razonSocialEmisorEf": "CODIDEEP E.I.R.L.",
"dto_representanteLegalEmisorEf": "KEVIN ARNOLD ARIAS FIGUEROA",
"dto_direccionEmisorEf": "Urb. Intimpas S/N Abancay - Apurímac.",
"dto_documentoClienteEf": "10707485863",
"dto_tipoDocumentoClienteEf": "RUC",
"dto_denominacionClienteEf": "Kevin Arnold Arias Figueroa",
"dto_divisaEf": "Soles",
"dto_totalVentaEf": 118.00,
"dto_subTotalVentaEf": 100.00,
"dto_totalImpuestoInafectoEf": 0,
"dto_totalImpuestoAplicadoEf": 18.00,
"dto_tipoPagoEf": "Al contado",
"dto_listaProductoEf": [
{
"nombreProductoEf": "cuaderno",
"cantidadProductoEf": 1,
"precioTotalVentaProductoEf": 118,
"subTotalVentaProductoEf": 100,
"impuestoInafectoVentaProductoEf": 0,
"impuestoAplicadoVentaProductoEf": 18,
"precioUnitarioVentaProductoEf": 118,
"subTotalPrecioUnitarioVentaProductoEf": 100,
"situacionImpuestoProductoEf": "Afecto",
"porcentajeTributacionProductoEf": 18
}
],
"dto_userNameEf": "",
"dto_passwordEf": ""
}
$data = array(
"dto_codigoUnicoVenta" => 1,
"dto_serieNumeroComprobanteEf" => "F001-00000001",
"dto_fechaEmisionComprobanteEf" => "2022-11-23",
"dto_rucEmpresaEf" => "00000000000",
"dto_razonSocialEmisorEf" => "CODIDEEP E.I.R.L.",
"dto_representanteLegalEmisorEf" => "KEVIN ARNOLD ARIAS FIGUEROA",
"dto_direccionEmisorEf" => "Urb. Intimpas S/N Abancay - Apurímac.",
"dto_documentoClienteEf" => "10707485863",
"dto_tipoDocumentoClienteEf" => "RUC",
"dto_denominacionClienteEf" => "Kevin Arnold Arias Figueroa",
"dto_divisaEf" => "Soles",
"dto_totalVentaEf" => 118.00,
"dto_subTotalVentaEf" => 100.00,
"dto_totalImpuestoInafectoEf" => 0,
"dto_totalImpuestoAplicadoEf" => 18.00,
"dto_tipoPagoEf" => "Al contado",
"dto_listaProductoEf" => array(
array(
"nombreProductoEf" => "cuaderno",
"cantidadProductoEf" => 1,
"precioTotalVentaProductoEf" => 118,
"subTotalVentaProductoEf" => 100,
"impuestoInafectoVentaProductoEf" => 0,
"impuestoAplicadoVentaProductoEf" => 18,
"precioUnitarioVentaProductoEf" => 118,
"subTotalPrecioUnitarioVentaProductoEf" => 100,
"situacionImpuestoProductoEf" => "Afecto",
"porcentajeTributacionProductoEf" => 18
)
),
"dto_userNameEf" => "",
"dto_passwordEf" => ""
);
$data_string = json_encode($data);
$ch = curl_init('https://billing.codideep.com/bill/generatexml');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Content-Length: ' . strlen($data_string))
);
echo $result = curl_exec($ch);
curl_close($ch);
// La URL de la API a la que se enviará la solicitud
const url = 'https://billing.codideep.com/bill/generatexml';
// Los datos de la factura en formato JSON
const data = {
"dto_codigoUnicoVenta": 1,
"dto_serieNumeroComprobanteEf": "F001-00000001",
"dto_fechaEmisionComprobanteEf": "2022-11-23",
"dto_rucEmpresaEf": "00000000000",
"dto_razonSocialEmisorEf": "CODIDEEP E.I.R.L.",
"dto_representanteLegalEmisorEf": "*** ***",
"dto_direccionEmisorEf": "Urb. Intimpas S/N Abancay - Apurímac.",
"dto_documentoClienteEf": "1070...",
"dto_tipoDocumentoClienteEf": "RUC",
"dto_denominacionClienteEf": "*** *** ***",
"dto_divisaEf": "Soles",
"dto_totalVentaEf": 118.00,
"dto_subTotalVentaEf": 100.00,
"dto_totalImpuestoInafectoEf": 0,
"dto_totalImpuestoAplicadoEf": 18.00,
"dto_tipoPagoEf": "Al contado",
"dto_listaProductoEf":
[
{
"nombreProductoEf": "cuaderno",
"cantidadProductoEf": 1,
"precioTotalVentaProductoEf": 118,
"subTotalVentaProductoEf": 100,
"impuestoInafectoVentaProductoEf": 0,
"impuestoAplicadoVentaProductoEf": 18,
"precioUnitarioVentaProductoEf": 118,
"subTotalPrecioUnitarioVentaProductoEf": 100,
"situacionImpuestoProductoEf": "Afecto",
"porcentajeTributacionProductoEf": 18
}
],
"dto_userNameEf": "",
"dto_passwordEf": ""
};
// Opciones de la solicitud, incluyendo el método y el cuerpo
const options = {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
// Convierte el objeto a una cadena JSON
body: JSON.stringify(data)
};
// Envia la solicitud y maneja la respuesta
fetch(url, options)
.then(response => response.json())
.then(data => {
// Imprime la respuesta en la consola
console.log(data);
})
.catch(error => {
// Si ocurre un error, lo muestra en la consola
console.error(error);
});
import requests
# Establecemos los datos a enviar en la petición
data = {
"dto_codigoUnicoVenta": 1,
"dto_serieNumeroComprobanteEf": "F001-00000001",
"dto_fechaEmisionComprobanteEf": "2022-11-23",
"dto_rucEmpresaEf": "00000000000",
"dto_razonSocialEmisorEf": "CODIDEEP E.I.R.L.",
"dto_representanteLegalEmisorEf": "KEVIN ARNOLD ARIAS FIGUEROA",
"dto_direccionEmisorEf": "Urb. Intimpas S/N Abancay - Apurímac.",
"dto_documentoClienteEf": "10707485863",
"dto_tipoDocumentoClienteEf": "RUC",
"dto_denominacionClienteEf": "Kevin Arnold Arias Figueroa",
"dto_divisaEf": "Soles",
"dto_totalVentaEf": 118.00,
"dto_subTotalVentaEf": 100.00,
"dto_totalImpuestoInafectoEf": 0,
"dto_totalImpuestoAplicadoEf": 18.00,
"dto_tipoPagoEf": "Al contado",
"dto_listaProductoEf": [
{
"nombreProductoEf": "cuaderno",
"cantidadProductoEf": 1,
"precioTotalVentaProductoEf": 118,
"subTotalVentaProductoEf": 100,
"impuestoInafectoVentaProductoEf": 0,
"impuestoAplicadoVentaProductoEf": 18,
"precioUnitarioVentaProductoEf": 118,
"subTotalPrecioUnitarioVentaProductoEf": 100,
"situacionImpuestoProductoEf": "Afecto",
"porcentajeTributacionProductoEf": 18
}
],
"dto_userNameEf": "",#usuario de la empresa
"dto_passwordEf": ""#contraseña de la empresa
}
# Realizamos la petición POST a la URL especificada
response = requests.post('https://billing.codideep.com/bill/generatexml', data=data)
# Imprimimos la respuesta
print(response.text)
Si los datos enviados son correctos, se le enviará un objeto con el mensaje de operación realizada correctamente, como se muestra a continuación:
{
"mo": {
"listMessage": [
"Operación realizada correctamente."
],
"type": "success"
},
"dto": {
"hash": "gmJWd3Cu2dc0GTRtkWNOW05gU+Y="
},
"listDto": null
}
Envío del XML a SUNAT
Una vez que has generado tu factura en formato XML y se ha enviado a través del sistema de la API, estamos listos para poder emitir nuestra factura a la SUNAT, el siguiente paso una vez enviado nuestra factura sería esperar a que la SUNAT procese tu factura y nos envíe una respuesta, nosotros como intermediarios recibiremos el CDR comprimido y se le enviará a usted la respuesta que fue emitida por parte de SUNAT. La respuesta puede ser positiva, lo que significa que la SUNAT ha aceptado tu factura y la ha registrado en su sistema, o negativa, lo que significa que la SUNAT ha encontrado algún problema con tu factura y no la ha aceptado. El flujo para este proceso se detalla en el siguiente diagrama.
El endpoint para este segundo proceso es el siguiente:
https://billing.codideep.com/bill/send
Ahora que ya tienes el XML con los datos de tu factura generado en nuestro sistema, puedes enviar los datos a SUNAT, para ello debes enviar un objeto JSON con los siguientes datos:
{
"dto_codigoUnicoVenta" : 1,
"dto_rucEmpresaEf" : "00000000000",
"dto_userNameEf": "",
"dto_passwordEf": "",
"dto_serieNumeroComprobanteEf":"F001-00000001" ,
"dto_demoEf": true
}
// Inicializamos el manejador de cURL
$curl = curl_init();
// Establecemos la URL a la que se realizará la petición
curl_setopt($curl, CURLOPT_URL, 'https://billing.codideep.com/bill/send');
// Establecemos el método de petición a POST
curl_setopt($curl, CURLOPT_POST, 1);
// Establecemos los datos a enviar en la petición
$data =
[
"dto_codigoUnicoVenta" => 1,
"dto_rucEmpresaEf" => "00000000000",
"dto_userNameEf" => "",//usuario de la empresa
"dto_passwordEf" => "",//contraseña de la empresa
"dto_serieNumeroComprobanteEf" => "F001-00000001",
"dto_demoEf" => true//si es entorno de pruebas colocar true, si es entorno de producción colocar false
];
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data));
// Ejecutamos la petición y recogemos la respuesta
$response = curl_exec($curl);
// Cerramos el manejador de cURL
curl_close($curl);
// Mostramos la respuesta
echo $response;
// La URL de la API a la que se enviará la solicitud
const url = 'https://billing.codideep.com/bill/send';
// Los datos de la factura en formato JSON
const data = {
"dto_codigoUnicoVenta" : 1,
"dto_rucEmpresaEf" : "00000000000",
"dto_userNameEf": "user",
"dto_passwordEf": "password",
"dto_serieNumeroComprobanteEf":"F001-00000001" ,
"dto_demoEf": true
};
// Opciones de la solicitud, incluyendo el método y el cuerpo
const options = {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
// Convierte el objeto a una cadena JSON
body: JSON.stringify(data)
};
// Envia la solicitud y maneja la respuesta
fetch(url, options)
.then(response => response.json())
.then(data => {
// Imprime la respuesta en la consola
console.log(data);
})
.catch(error => {
// Si ocurre un error, lo muestra en la consola
console.error(error);
});
import requests
# Establecemos los datos a enviar en la petición
data = {
"dto_codigoUnicoVenta" : 1,
"dto_rucEmpresaEf" : "00000000000",
"dto_userNameEf": "user",
"dto_passwordEf": "password",
"dto_serieNumeroComprobanteEf":"F001-00000001" ,
"dto_demoEf": true
}
# Realizamos la petición POST a la URL especificada
response = requests.post('https://billing.codideep.com/bill/send', data=data)
# Imprimimos la respuesta
print(response.text)
Por ejemplo, si la respuesta emitida por la SUNAT es correcta, tendrás como respueta algo similiar:
{
"mo": {
"listMessage": [
"Operación realizada correctamente."
],
"type": "success"
},
"dto": {
"codigoCdr": "0",
"estadoEnvioSunat": "Aprobado",
"descripcionCdr": "La Factura numero F001-00000001, ha sido aceptada"
},
"listDto": null
}