RESÚMENES DIARIOS
Generación de resumen diario
La API de Resúmenes Diarios permite enviar múltiples comprobantes de boletas, notas de crédito y notas de débito a SUNAT en una sola operación. Esta funcionalidad es ideal para empresas que emiten muchas boletas diarias.
El proceso de envío del resumen diario se realiza en dos etapas:
- Generación y Envío: Se envían los datos del resumen a SUNAT y se obtiene un número de ticket
- Consulta de Estado: Se consulta el estado del procesamiento usando el ticket obtenido
Para la primera etapa (envío), debe enviar los datos en formato JSON a través de la siguiente URL del servicio:
IMPORTANTE: El resumen diario debe enviarse hasta las 12:00 p.m. del día siguiente hábil a la emisión de los comprobantes. Puede incluir boletas de venta (código 03), notas de crédito (código 07) y notas de débito (código 08) relacionadas a boletas.
https://billing.codideep.com/dailysummary/send
A continuación se mostrará un ejemplo de como se debe enviar el resumen diario directamente a SUNAT en formato JSON usando algunos lenguajes y herramientas. El sistema procesará automáticamente todos los comprobantes del día especificado.
INFO: Para poder realizar las peticiones al servidor necesita contar con las credenciales de acceso (username y password), ambos obtenidos al momento de adquirir el servicio.
{
"dto_rucEmpresaEf": "20123456789",
"dto_razonSocialEmpresaEf": "CODIDEEP E.I.R.L.",
"dto_userNameEf": "",
"dto_passwordEf": "",
"dto_serieNumeroComprobanteEf": "RC-20231123-001",
"dto_fechaParaResumenEf": "2023-11-23",
"dto_demoEf": true,
"dto_listaComprobanteEf": [
{
"documentTypeCode": "03",
"numeroRecibo": "B001-00000001",
"numeroReciboRelacionado": "",
"documentoCliente": "12345678",
"divisa": "Soles",
"total": 118.00,
"totalOutImpuestoGravado": 100.00,
"totalOutImpuestoInafecto": 0.00,
"totalOutImpuestoExonerado": 0.00,
"situacionImpuesto": "Afecto",
"isc": 0.00,
"igv": 18.00,
"impuestoAplicado": 18.00
},
{
"documentTypeCode": "07",
"numeroRecibo": "BC01-00000001",
"numeroReciboRelacionado": "B001-00000001",
"documentoCliente": "12345678",
"divisa": "Soles",
"total": 50.00,
"totalOutImpuestoGravado": 42.37,
"totalOutImpuestoInafecto": 0.00,
"totalOutImpuestoExonerado": 0.00,
"situacionImpuesto": "Afecto",
"isc": 0.00,
"igv": 7.63,
"impuestoAplicado": 18.00
}
]
}
// Lista de comprobantes para el resumen diario
$listaComprobanteEf = array();
// Ejemplo de boleta de venta
$objectTemp = new stdClass();
$objectTemp->documentTypeCode = '03'; // Boleta de venta
$objectTemp->numeroRecibo = 'B001-00000001';
$objectTemp->numeroReciboRelacionado = '';
$objectTemp->documentoCliente = '12345678';
$objectTemp->divisa = 'Soles';
$objectTemp->total = 118.00;
$objectTemp->totalOutImpuestoGravado = 100.00;
$objectTemp->totalOutImpuestoInafecto = 0.00;
$objectTemp->totalOutImpuestoExonerado = 0.00;
$objectTemp->situacionImpuesto = 'Afecto';
$objectTemp->isc = 0.00;
$objectTemp->igv = 18.00;
$objectTemp->impuestoAplicado = 18.00;
$listaComprobanteEf[] = $objectTemp;
// Ejemplo de nota de crédito relacionada a boleta
$objectTemp = new stdClass();
$objectTemp->documentTypeCode = '07'; // Nota de crédito
$objectTemp->numeroRecibo = 'BC01-00000001';
$objectTemp->numeroReciboRelacionado = 'B001-00000001';
$objectTemp->documentoCliente = '12345678';
$objectTemp->divisa = 'Soles';
$objectTemp->total = 50.00;
$objectTemp->totalOutImpuestoGravado = 42.37;
$objectTemp->totalOutImpuestoInafecto = 0.00;
$objectTemp->totalOutImpuestoExonerado = 0.00;
$objectTemp->situacionImpuesto = 'Afecto';
$objectTemp->isc = 0.00;
$objectTemp->igv = 7.63;
$objectTemp->impuestoAplicado = 18.00;
$listaComprobanteEf[] = $objectTemp;
// Datos para el resumen diario
$data = array(
'dto.rucEmpresaEf' => '20123456789',
'dto.razonSocialEmpresaEf' => 'CODIDEEP E.I.R.L.',
'dto.userNameEf' => '',
'dto.passwordEf' => '',
'dto.serieNumeroComprobanteEf' => 'RC-20231123-001',
'dto.fechaParaResumenEf' => '2023-11-23',
'dto.demoEf' => true,
'dto.listaComprobanteEf' => $listaComprobanteEf
);
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'https://billing.codideep.com/dailysummary/send');
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
// La URL de la API a la que se enviará la solicitud
const url = 'https://billing.codideep.com/dailysummary/send';
// Lista de comprobantes para el resumen diario
const listaComprobanteEf = [
// Boleta de venta
{
"documentTypeCode": "03",
"numeroRecibo": "B001-00000001",
"numeroReciboRelacionado": "",
"documentoCliente": "12345678",
"divisa": "Soles",
"total": 118.00,
"totalOutImpuestoGravado": 100.00,
"totalOutImpuestoInafecto": 0.00,
"totalOutImpuestoExonerado": 0.00,
"situacionImpuesto": "Afecto",
"isc": 0.00,
"igv": 18.00,
"impuestoAplicado": 18.00
},
// Nota de crédito relacionada a boleta
{
"documentTypeCode": "07",
"numeroRecibo": "BC01-00000001",
"numeroReciboRelacionado": "B001-00000001",
"documentoCliente": "12345678",
"divisa": "Soles",
"total": 50.00,
"totalOutImpuestoGravado": 42.37,
"totalOutImpuestoInafecto": 0.00,
"totalOutImpuestoExonerado": 0.00,
"situacionImpuesto": "Afecto",
"isc": 0.00,
"igv": 7.63,
"impuestoAplicado": 18.00
}
];
// Los datos del resumen diario en formato JSON
const data = {
"dto_rucEmpresaEf": "20123456789",
"dto_razonSocialEmpresaEf": "CODIDEEP E.I.R.L.",
"dto_userNameEf": "",
"dto_passwordEf": "",
"dto_serieNumeroComprobanteEf": "RC-20231123-001",
"dto_fechaParaResumenEf": "2023-11-23",
"dto_demoEf": true,
"dto_listaComprobanteEf": listaComprobanteEf
};
// 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
import json
# La URL de la API a la que se enviará la solicitud
url = "https://billing.codideep.com/dailysummary/send"
# Lista de comprobantes para el resumen diario
lista_comprobante_ef = [
# Boleta de venta
{
"documentTypeCode": "03",
"numeroRecibo": "B001-00000001",
"numeroReciboRelacionado": "",
"documentoCliente": "12345678",
"divisa": "Soles",
"total": 118.00,
"totalOutImpuestoGravado": 100.00,
"totalOutImpuestoInafecto": 0.00,
"totalOutImpuestoExonerado": 0.00,
"situacionImpuesto": "Afecto",
"isc": 0.00,
"igv": 18.00,
"impuestoAplicado": 18.00
},
# Nota de crédito relacionada a boleta
{
"documentTypeCode": "07",
"numeroRecibo": "BC01-00000001",
"numeroReciboRelacionado": "B001-00000001",
"documentoCliente": "12345678",
"divisa": "Soles",
"total": 50.00,
"totalOutImpuestoGravado": 42.37,
"totalOutImpuestoInafecto": 0.00,
"totalOutImpuestoExonerado": 0.00,
"situacionImpuesto": "Afecto",
"isc": 0.00,
"igv": 7.63,
"impuestoAplicado": 18.00
}
]
# Los datos del resumen diario en formato JSON
data = {
"dto_rucEmpresaEf": "20123456789",
"dto_razonSocialEmpresaEf": "CODIDEEP E.I.R.L.",
"dto_userNameEf": "",
"dto_passwordEf": "",
"dto_serieNumeroComprobanteEf": "RC-20231123-001",
"dto_fechaParaResumenEf": "2023-11-23",
"dto_demoEf": True,
"dto_listaComprobanteEf": lista_comprobante_ef
}
# Cabeceras de la solicitud
headers = {
'Content-Type': 'application/json'
}
# Realiza la solicitud POST y obtiene la respuesta
response = requests.post(url, data=json.dumps(data), headers=headers)
# Comprueba si la solicitud fue exitosa
if response.status_code == 200:
# Imprime la respuesta en formato JSON
print(response.json())
else:
# Si hay un error, imprime el código de estado
print(f"Error: {response.status_code}")
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": "xmJWd3Cu2dc0GTRtkWNOW05gU+Y="
},
"listDto": null
}
Envío del XML a SUNAT
Una vez que has generado tu resumen diario en formato XML y se ha enviado a través del sistema de la API, estamos listos para poder emitir nuestro resumen a la SUNAT. El siguiente paso una vez enviado nuestro resumen sería esperar a que la SUNAT procese tu documento 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 resumen y lo ha registrado en su sistema, o negativa, lo que significa que la SUNAT ha encontrado algún problema con tu resumen y no lo ha aceptado.
El endpoint para este segundo proceso es el siguiente:
https://billing.codideep.com/dailysummary/send
Ahora que ya tienes el XML con los datos de tu resumen diario 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_correlativoResumenEf": "RC-20231123-001",
"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/dailysummary/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"=> "",
"dto_passwordEf"=> "",
"dto_correlativoResumenEf"=> "RC-20231123-001",
"dto_demoEf"=> true
];
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/dailysummary/send';
// Los datos del resumen diario en formato JSON
const data = {
"dto_codigoUnicoVenta" : 1,
"dto_rucEmpresaEf" : "00000000000",
"dto_userNameEf": "",
"dto_passwordEf": "",
"dto_correlativoResumenEf": "RC-20231123-001",
"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": "",
"dto_passwordEf": "",
"dto_correlativoResumenEf": "RC-20231123-001",
"dto_demoEf": true
}
# Realizamos la petición POST a la URL especificada
response = requests.post('https://billing.codideep.com/dailysummary/send', data=data)
# Imprimimos la respuesta
print(response.text)
Como respuesta del servidor en caso de que la petición sea satisfactoria, se obtendrá un JSON con la siguiente estructura:
{
"mo": {
"listMessage": [
"Operación realizada correctamente."
],
"type": "success"
},
"dto": {
"codigoCdr": "0",
"estadoEnvioSunat": "Aprobado",
"descripcionCdr": "El Resumen Diario RC-20231123-001, ha sido aceptado",
"ticket": "123456789012345"
},
"listDto": null
}
Consultar Estado del Resumen
Después de enviar el resumen diario, puedes consultar su estado de procesamiento en SUNAT. Usa el mismo identificador del resumen para verificar si fue aceptado o rechazado.
https://billing.codideep.com/dailysummary/getstatus
Envía los mismos datos de autenticación y el identificador del resumen:
{
"dto_rucEmpresaEf": "20123456789",
"dto_razonSocialEmpresaEf": "CODIDEEP E.I.R.L.",
"dto_userNameEf": "",
"dto_passwordEf": "",
"dto_serieNumeroComprobanteEf": "RC-20231123-001",
"dto_demoEf": true
}
$data = array(
"dto_rucEmpresaEf" => "20123456789",
"dto_razonSocialEmpresaEf" => "CODIDEEP E.I.R.L.",
"dto_userNameEf" => "",
"dto_passwordEf" => "",
"dto_serieNumeroComprobanteEf" => "RC-20231123-001",
"dto_demoEf" => true
);
$options = array(
'http' => array(
'header' => "Content-type: application/x-www-form-urlencoded\r\n",
'method' => 'POST',
'content' => http_build_query($data)
)
);
$context = stream_context_create($options);
$result = file_get_contents("https://billing.codideep.com/dailysummary/getstatus", false, $context);
echo $result;
// La URL de la API a la que se enviará la solicitud
const url = 'https://billing.codideep.com/dailysummary/getstatus';
// Los datos para consultar el estado
const data = {
"dto_rucEmpresaEf": "20123456789",
"dto_razonSocialEmpresaEf": "CODIDEEP E.I.R.L.",
"dto_userNameEf": "",
"dto_passwordEf": "",
"dto_serieNumeroComprobanteEf": "RC-20231123-001",
"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_rucEmpresaEf": "20123456789",
"dto_razonSocialEmpresaEf": "CODIDEEP E.I.R.L.",
"dto_userNameEf": "",
"dto_passwordEf": "",
"dto_serieNumeroComprobanteEf": "RC-20231123-001",
"dto_demoEf": true
}
# Realizamos la petición POST a la URL especificada
response = requests.post('https://billing.codideep.com/dailysummary/getstatus', data=data)
# Imprimimos la respuesta
print(response.text)
La API te devolverá el estado actual del resumen diario:
{
"mo": {
"listMessage": [
"Consulta realizada correctamente."
],
"type": "success"
},
"dto": {
"codigoCdr": "0",
"estadoEnvioSunat": "Aceptado",
"descripcionCdr": "El Resumen Diario ha sido aceptado",
"estadoProceso": "Procesado"
},
"listDto": null
}