Descripción
Las Notas de Débito (tipo documento 08) se utilizan para aumentar el valor de facturas o boletas previamente emitidas. Se aplican en casos como:- Intereses por mora
- Gastos adicionales no incluidos originalmente
- Penalidades
- Aumento en el valor de la operación
- FC01: Para notas de débito que afectan Facturas (01)
- BC01: Para notas de débito que afectan Boletas (03)
Flujo de Trabajo
- Crear nota de débito:
POST /api/notas-debito- Genera el registro y XML firmado - Enviar a SUNAT:
POST /api/notas-debito/{id}/enviar- Envío sincrónico vía SOAP - Obtener CDR:
GET /api/notas-debito/{id}/cdr- Descarga la constancia de recepción
POST /api/notas-debito
Crea una nueva nota de débito asociada a una venta existente.Request Body
ID de la venta a afectar (factura o boleta existente)
ID del motivo de la nota de débito. Obtener lista desde
GET /api/notas-debito/motivosMonto total del cargo adicional (incluye IGV). Debe ser mayor a 0.01
Descripción personalizada del motivo (opcional, usa la descripción del motivo por defecto si se omite)
Motivos de Nota de Débito (Catálogo SUNAT 10)
| Código | Descripción |
|---|---|
| 01 | Intereses por mora |
| 02 | Aumento en el valor |
| 03 | Penalidades / otros conceptos |
Lógica del Servidor
- Valida que la venta exista y pertenezca a la empresa del usuario
- Determina la serie automáticamente:
- Si
tipo_doc_afectado = '01'(Factura) → Serie FC01 - Si
tipo_doc_afectado = '03'(Boleta) → Serie BC01
- Si
- Genera el número correlativo (máximo + 1)
- Calcula el desglose de IGV:
- Genera el XML UBL 2.1 firmado digitalmente usando Greenter
- Calcula el hash CPE del XML
- Almacena el XML en
storage/app/sunat/xml/{ruc}/
Response
Indica si la operación fue exitosa
Objeto de la nota de débito creada
Información sobre el XML generado
Ejemplo de Request
Ejemplo de Response (201 Created)
POST /api/notas-debito//enviar
Envía la nota de débito generada a SUNAT para su aceptación.Path Parameters
ID de la nota de débito a enviar
Flujo SUNAT (Sincrónico)
- Lee el XML firmado desde
storage/app/sunat/xml/{ruc}/ - Se autentica con SUNAT usando credenciales SOL (RUC + usuario + clave)
- Envía el XML vía SOAP a la API de SUNAT
- Recibe el CDR (Constancia de Recepción) inmediatamente
- Almacena el CDR en
storage/app/sunat/cdr/{ruc}/R-{nombre}.zip - Actualiza el estado de la nota según la respuesta
Validaciones
- La nota de débito debe tener XML generado (
nombre_xmlno nulo) - El archivo XML debe existir en el servidor
Response (Éxito)
true si SUNAT aceptó la nota de débito
Código de respuesta de SUNAT (ej: “0” = aceptado, “0100” = aceptado con observaciones)
Descripción de la respuesta de SUNAT
Response (Error)
false si SUNAT rechazó la nota
Código de error de SUNAT
Descripción del error
Ejemplo de Response (Éxito)
Ejemplo de Response (Error)
GET /api/notas-debito
Obtiene lista paginada de notas de débito de la empresa.Query Parameters
Número de página
Response
Objeto de paginación Laravel con 15 items por página.GET /api/notas-debito/
Obtiene detalle completo de una nota de débito específica.Path Parameters
ID de la nota de débito
GET /api/notas-debito/motivos
Obtiene la lista de motivos disponibles para notas de débito.Response
Notas Técnicas
Integración con Greenter
El sistema utiliza la librería Greenter para:- Construir objetos UBL 2.1 conformes a SUNAT (tipo documento “08”)
- Firmar digitalmente el XML con certificado PEM
- Enviar vía SOAP al webservice de SUNAT
- Procesar la respuesta CDR
SunatService::generarNotaDebitoXml() (línea 446) y enviarNotaDebito() (línea 508).
Diferencia con Nota de Crédito
| Aspecto | Nota de Crédito | Nota de Débito |
|---|---|---|
| Tipo documento | 07 | 08 |
| Efecto | Disminuye/anula | Aumenta |
| Monto | Copia de venta | Libre (usuario lo define) |
| Venta original | Se marca como anulada | Permanece activa |
Cálculo de IGV
El IGV se calcula automáticamente desde elmonto_total proporcionado:
monto_total= 118.00igvRate= 0.18subtotal= 100.00igv= 18.00
Certificados Digitales
Se buscan en este orden:storage/app/sunat/certificados/{ruc}-cert.pem(específico de empresa)- Certificado de prueba configurado en
config/sunat.php
Ambientes SUNAT
Siempresa.modo !== 'production':
- Usa RUC de prueba:
20000000001 - Usuario SOL:
MODDATOS - Clave SOL:
moddatos - Endpoint beta de SUNAT
Líneas en el XML
Las notas de débito reutilizan las líneas de productos de la venta original para conformidad UBL, aunque el usuario solo especifica el monto total del cargo adicional. VerSunatService::buildSaleDetailsFromVenta() (línea 1001).
Errores Comunes
| Código | Descripción | Solución |
|---|---|---|
| 2324 | Documento afectado no existe | Verificar que la factura/boleta esté aceptada por SUNAT |
| 2800 | Serie no autorizada | Verificar configuración de series en SUNAT |
| 1033 | Certificado inválido | Renovar certificado digital PEM |
| 422 | XML no generado | Llamar primero a POST /api/notas-debito |
| 422 | monto_total requerido | El monto debe ser mayor a 0.01 |