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
}