Introducción
El flujo de venta en Santo Domingo Facturación Electrónica comprende desde la cotización inicial hasta la emisión del comprobante electrónico y la gestión de cobros. Este proceso se integra completamente con SUNAT para la emisión de facturas y boletas electrónicas válidas.El sistema permite emitir Boletas (B001), Facturas (F001) y Notas de Venta (NV01). Cada tipo de documento tiene reglas específicas de validación y afectación de stock.
Tipos de Documentos
Boleta de Venta (id_tido=1)
- Serie: B001
- Cliente: Requiere DNI (8 dígitos) o CE. NO acepta RUC (11 dígitos)
- Stock: Descuenta del Almacén 1 (Facturación)
- SUNAT: Requiere Resumen Diario posterior
Factura (id_tido=2)
- Serie: F001
- Cliente: REQUIERE RUC (11 dígitos obligatorio)
- Stock: Descuenta del Almacén 1 (Facturación)
- SUNAT: Envío sincrónico con CDR inmediato
Nota de Venta (id_tido=6)
- Serie: NV01
- Cliente: Opcional
- Stock: Descuenta del Almacén 2 (Kardex Real)
- SUNAT: NO se envía a SUNAT (documento interno)
- Conversión: Puede convertirse a Factura/Boleta posteriormente
Flujo Completo Paso a Paso
Crear Cotización (Opcional)
Iniciar desde
/cotizaciones/crearDatos requeridos:- Cliente (búsqueda por RUC/DNI o ingreso manual)
- Productos con cantidades y precios
- Moneda (PEN/USD)
- Aplicar IGV (checkbox)
- Tipo de pago: Contado (1) o Crédito (2)
CotizacionController@store- Genera número correlativo automático (COT-000001)
- Calcula totales: si
aplicar_igv=true, entoncessubtotal = total / 1.18 - Guarda en tabla
cotizacionescon estadopendiente
- Soporta cuotas de pago programadas
- Permite precio especial por producto
- Puede tener descuento general en %
- No afecta stock hasta conversión
Convertir Cotización a Venta
Desde la lista de cotizaciones, hacer clic en “Convertir a Venta”URL: Backend actualiza cotización:
/ventas/crear?tipo=factura&cotizacion_id=123Proceso automático:Crear Venta Directa
Acceder a
/ventas/crear o desde menú “Nueva Venta”Selección de Cliente
Componente:ClienteAutocomplete.jsx- Búsqueda por RUC/DNI con consulta API Perú
- Autocompletado desde base de datos local
- Creación automática si no existe
Agregar Productos
Opciones disponibles:- Búsqueda individual: Autocomplete con selector de precio (precio/costo/precio2/precio3)
- Búsqueda múltiple: Selección masiva de productos desde modal
- Modo libre: Ingresar descripción sin producto del catálogo
Configurar Almacén
Lógica automática:Configurar Forma de Pago
Tipo de Pago
Contado (id_tipo_pago=1):- Pago inmediato al emitir
- No genera cuentas por cobrar
FormaPagoContadoen XML SUNAT
- Genera cuotas en tabla
dias_ventas FormaPagoCreditocon fecha de vencimiento en XML- Aparece en módulo Cuentas por Cobrar
Método de Pago
Componente:MetodoPago.jsx- Efectivo, Tarjeta, Transferencia, Yape, Plin
- Permite subir voucher de pago
- Guarda en tabla
ventas_pagos:
Cuotas de Crédito
Modal:PaymentSchedule.jsx- Define monto inicial y cuotas
- Valida que suma = total venta
- Guarda en
dias_ventascon estado ‘P’ (Pendiente)
Guardar Venta
Generar y Enviar XML a SUNAT
Después de guardar, aparece modal Backend proceso:
PrintOptionsModal con opciones:Opción 1: Envío Inmediato a SUNAT
Para Facturas y Boletas:El CDR (Constancia de Recepción) es la respuesta de SUNAT que valida el comprobante. Código 0 = Aceptado, 4XXX = Observado pero válido, 2XXX = Rechazado.
Opción 2: Solo Generar PDF (sin SUNAT)
Para Notas de Venta o ventas que no requieren envío inmediato:Descuento de Stock Real (Opcional)
Para ventas de Almacén 1, se puede descontar posteriormente del Almacén 2 (Kardex Real):Endpoint: UI: Modal
POST /api/ventas/{id}/descontar-stockDescontarStockModal.jsx muestra preview de productos en Almacén 2.Gestionar Cobros
Para ventas al crédito
Módulo:/finanzas/cuentas-por-cobrarRegistrar pago de cuota:P= PendienteC= CanceladoV= Vencido (calculado dinámicamente si fecha < hoy)
Reporte de cobranzas
Descarga Excel:/api/cuentas-cobrar/export/excel?fecha_inicio=...&fecha_fin=...Incluye:- Cliente, RUC/DNI
- Documento (serie-número)
- Fecha emisión y vencimiento
- Monto cuota y estado
- Días de mora
Movimientos de Stock
Tabla: movimientos_stock
Tipos de movimientos para ventas:
| Tipo | tipo_movimiento | tipo_documento | Descripción |
|---|---|---|---|
| Venta | salida | venta | Descuento automático al crear venta |
| Anulación | entrada | anulacion_venta | Retorno al anular venta |
| Descuento Real | salida | descuento_almacen | Descuento manual de Almacén 2 |
Impresión y Documentos
Formatos disponibles
PDF A4:/reporteNV/a4.php?id={venta_id}
- Formato fiscal completo
- QR de validación SUNAT
- Detalles de cliente, productos, totales
- Pie de página con forma de pago
/reporteNV/ticket.php?id={venta_id}
- Formato térmico 80mm
- Para impresoras POS
/api/ventas/xml/{nombre_xml}.xml
- Descarga XML firmado
- Formato UBL 2.1 estándar SUNAT
/api/ventas/cdr/{venta_id}
- Descarga ZIP con respuesta SUNAT
- Contiene
R-{ruc}-{tipo}-{serie}-{numero}.xml
Impresión automática
Los PDFs se generan con mPDF en el backend. Las rutas usan el middleware
TokenFromQuery para autenticar con ?token= en la URL.Errores Comunes y Soluciones
Error: Para FACTURA se requiere RUC (11 dígitos)
Error: Para FACTURA se requiere RUC (11 dígitos)
Causa: Intentando emitir factura con DNI o sin documento.Solución:
- Cambiar a Boleta (B001)
- O ingresar RUC válido del cliente
VentasController.php:136-141Error: Para BOLETA use DNI. Para RUC emita Factura
Error: Para BOLETA use DNI. Para RUC emita Factura
Causa: Intentando emitir boleta con RUC.Solución: Las boletas son para consumidores finales. Use DNI o cambie a Factura.Código:
VentasController.php:143-148Stock negativo después de venta
Stock negativo después de venta
Causa: Producto sin stock suficiente en el almacén seleccionado.Solución:
- Verificar stock antes de vender
- Usar Nota de Venta (NV01) si no afecta stock
- Ajustar inventario en módulo Almacén
soloConStock excepto para Notas de Venta.CDR no generado / SUNAT timeout
CDR no generado / SUNAT timeout
Causa: Problemas de conexión o certificado inválido.Solución:
- Verificar certificado PEM en
storage/app/sunat/certificados/ - Revisar credenciales SOL en Configuración → Empresa
- Verificar modo (beta/producción) correcto
- Reenviar desde lista de ventas: botón “Enviar SUNAT”
storage/logs/laravel.log con tag SUNAT -Cuotas no aparecen en Cuentas por Cobrar
Cuotas no aparecen en Cuentas por Cobrar
Causa: Venta configurada como Contado en lugar de Crédito.Solución:
- Al crear venta, seleccionar “Crédito” en Tipo de Pago
- Definir cuotas en modal Payment Schedule
- Verificar que
id_tipo_pago = 2en BD
Flujos Alternativos
De Nota de Venta a Factura/Boleta
- Crear Nota de Venta (NV01) → No afecta stock real
- Cliente decide comprar
- Desde lista de Notas de Venta: “Convertir a Factura/Boleta”
- URL:
/ventas/crear?tipo=factura¬a_venta_id=456 - Sistema copia productos y marca nota como
estado=3(Vendida) - Nueva venta descuenta stock de Almacén 1
Venta con productos de múltiples almacenes
No soportado directamente. Workaround:- Crear venta con productos de Almacén 1
- Después de guardar, usar “Descontar Stock Real” para Almacén 2
- O crear ajustes manuales en módulo Inventario
Referencias Técnicas
Controlador principal:app/Http/Controllers/VentasController.php
Servicios:
app/Services/SunatService.php- Integración SUNATapp/Services/ProductoService.php- Gestión de stock
app/Models/Venta.phpapp/Models/ProductoVenta.php(detalle)app/Models/VentaPago.phpapp/Models/MovimientoStock.php
resources/js/components/Facturacion/Ventas/VentaForm.jsxresources/js/components/Facturacion/Ventas/hooks/useVentaForm.jsresources/js/components/shared/ProductoFormSection.jsxresources/js/components/shared/MetodoPago.jsx