Descripción
Las Notas de Crédito (tipo documento 07) se utilizan para anular o reducir el valor de facturas o boletas previamente emitidas. El sistema genera automáticamente la serie según el documento afectado:- FC01: Para notas de crédito que afectan Facturas (01)
- BC01: Para notas de crédito que afectan Boletas (03)
Flujo de Trabajo
- Crear nota de crédito:
POST /api/notas-credito- Genera el registro y XML firmado - Enviar a SUNAT:
POST /api/notas-credito/{id}/enviar- Envío sincrónico vía SOAP - Obtener CDR:
GET /api/notas-credito/{id}/cdr- Descarga la constancia de recepción
estado = 2).
POST /api/notas-credito
Crea una nueva nota de crédito asociada a una venta existente.Request Body
ID de la venta a afectar (factura o boleta existente)
ID del motivo de la nota de crédito. Obtener lista desde
GET /api/notas-credito/motivosDescripción personalizada del motivo (opcional, usa la descripción del motivo por defecto si se omite)
Motivos de Nota de Crédito (Catálogo SUNAT 09)
| Código | Descripción |
|---|---|
| 01 | Anulación de la operación |
| 02 | Anulación por error en el RUC |
| 03 | Corrección por error en la descripción |
| 04 | Descuento global |
| 05 | Descuento por ítem |
| 06 | Devolución total |
| 07 | Devolución por ítem |
| 08 | Bonificación |
| 09 | Disminución en el valor |
| 10 | 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) sincronizado con
documentos_empresas - Copia los montos de la venta original (subtotal, IGV, total)
- 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 crédito creada
Información sobre el XML generado
Ejemplo de Request
Ejemplo de Response (201 Created)
POST /api/notas-credito//enviar
Envía la nota de crédito generada a SUNAT para su aceptación.Path Parameters
ID de la nota de crédito 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
- Si es aceptada, marca la venta original como anulada
Validaciones
- La nota de crédito debe tener XML generado (
nombre_xmlno nulo) - El archivo XML debe existir en el servidor
Response (Éxito)
true si SUNAT aceptó la nota de crédito
Código de respuesta de SUNAT (ej: “0” = aceptado, “0100” = aceptado con observaciones)
Descripción de la respuesta de SUNAT
Ruta al archivo CDR (ZIP) descargado desde 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-credito
Obtiene lista paginada de notas de crédito 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-credito/
Obtiene detalle completo de una nota de crédito específica.Path Parameters
ID de la nota de crédito
GET /api/notas-credito//cdr
Descarga el archivo CDR (Constancia de Recepción) en formato ZIP.Path Parameters
ID de la nota de crédito
Response
Archivo ZIP para descarga directa.GET /api/notas-credito/xml/
Descarga el archivo XML de la nota de crédito.Path Parameters
Nombre del archivo XML (con o sin extensión .xml)
Response
Archivo XML para visualización en navegador.GET /api/notas-credito/buscar-venta
Busca una venta por serie y número para crear una nota de crédito.Query Parameters
Serie de la venta (ej: “F001”)
Número correlativo de la venta
Response
Objeto de venta con cliente y productos relacionados.GET /api/notas-credito/motivos
Obtiene la lista de motivos disponibles para notas de crédito.Response
Notas Técnicas
Integración con Greenter
El sistema utiliza la librería Greenter para:- Construir objetos UBL 2.1 conformes a SUNAT
- Firmar digitalmente el XML con certificado PEM
- Enviar vía SOAP al webservice de SUNAT
- Procesar la respuesta CDR
SunatService::generarNotaCreditoXml() (línea 319) y enviarNotaCredito() (línea 381).
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
Estado de la Venta Original
Cuando una nota de crédito es aceptada por SUNAT (código “0”), la venta afectada se actualiza automáticamente:Numeración Automática
El sistema sincroniza la numeración con la tabladocumentos_empresas:
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-credito |