El módulo de ventas permite registrar transacciones comerciales en tiempo real, con búsqueda dinámica de productos vía AJAX, soporte para dos tipos de comprobante (BOLETA y FACTURA) y gestión de estados. Al registrar una venta, el sistema descuenta el stock de cada producto automáticamente y crea los registros deDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/interezante456-pixel/proyecto-dise-o/llms.txt
Use this file to discover all available pages before exploring further.
DetalleVenta correspondientes. Todos los usuarios autenticados (rol Admin y Vendedor) pueden registrar y consultar ventas; la anulación también es accesible para ambos roles.
Registrar una venta
Navegar al formulario de registro
Dirígete a
GET /Venta/Registrar. El formulario se carga vacío — los productos no se precargan en la vista para evitar transferir catálogos de gran tamaño al cliente.Buscar productos con AJAX
Escribe el nombre o el código del producto en el campo de búsqueda. El campo realiza una petición al endpoint:El servidor consulta los productos con
Si el término de búsqueda está vacío o es solo espacios, el endpoint devuelve un arreglo JSON vacío
Activo = true cuyo Nombre o Codigo contengan el término buscado, retorna un máximo de 20 resultados y los serializa como JSON con los siguientes campos:| Campo | Tipo | Descripción |
|---|---|---|
id | int | IdProducto del producto. |
nombre | string | Nombre del producto. |
codigo | string | Código del producto. |
precio | decimal | PrecioVenta actual. |
stock | int | Stock disponible. |
[] sin consultar la base de datos.Agregar productos al carrito
Selecciona uno o más productos de los resultados y establece la cantidad deseada para cada uno. El sistema valida que la cantidad y el precio sean mayores a cero, y que el stock disponible sea suficiente antes de confirmar.
Completar la información del cliente
Ingresa el nombre o razón social del cliente en el campo Cliente. Si se deja en blanco o solo contiene espacios, el sistema lo asigna automáticamente como
"Público en general".Seleccionar el tipo de comprobante
Elige entre BOLETA o FACTURA. Los requisitos de validación difieren según el tipo seleccionado (ver sección Tipos de comprobante).
Completar campos adicionales para FACTURA
Si el tipo de comprobante es FACTURA, el formulario requiere obligatoriamente:
- Razón Social (
Cliente): no puede ser"Público en general". - RUC (
Ruc): exactamente 11 dígitos numéricos. - Celular (
Celular): exactamente 9 dígitos numéricos, comenzando con9.
Ruc y Celular se ignoran y se guardan como null.Enviar el formulario
Al hacer
POST /Venta/Registrar, el sistema:- Crea el registro
VentaconFechaVenta = DateTime.Now,Estado = ActivayTotalcalculado. - Para cada producto, verifica que
producto.Stock >= cantidadsolicitada. - Descuenta el stock:
producto.Stock = Math.Max(0, producto.Stock - cantidad). - Crea un registro
DetalleVentaconVenta_ID,Producto_ID,CantidadyPrecioUnitario. - Todo ocurre dentro de una transacción de base de datos — si cualquier paso falla, se ejecuta
RollbackAsync()y se restaura el estado del carrito en la vista.
Tipos de comprobante
- BOLETA
- FACTURA
La BOLETA es el comprobante estándar para ventas al consumidor final. No requiere datos fiscales del cliente.Requisitos:
Cliente: opcional. Si está vacío, se usa"Público en general".Ruc: no requerido. Se guarda comonull.Celular: no requerido. Se guarda comonull.
Historial de ventas
DetallesVentas con los productos asociados, cargados mediante .Include(v => v.DetallesVentas).ThenInclude(d => d.Producto). Si ocurre un error al cargar el historial, se redirige al dashboard principal con un mensaje en TempData["Error"].
Estados de venta
El modeloVenta utiliza el enum EstadoVenta para controlar el ciclo de vida de cada transacción:
| Valor | Descripción |
|---|---|
Activa | Estado inicial. La venta fue registrada correctamente y el stock fue descontado. Es el valor por defecto (Estado = EstadoVenta.Activa). |
Anulada | La venta fue anulada por un usuario. El stock fue restaurado. La venta permanece en el historial. |
Anular una venta
Anulada y restaura el stock de cada producto involucrado.
El proceso completo ejecutado por el controlador es:
ModificadoPor registra el nombre de usuario (User.Identity.Name) del operador que realizó la anulación, lo que garantiza trazabilidad de auditoría.
Editar una venta
| Campo editable | Descripción |
|---|---|
Cliente | Nombre o razón social del cliente. No puede estar vacío. |
TipoComprobante | Permite cambiar entre BOLETA y FACTURA. |
Total | Monto total de la venta. Debe ser mayor a cero. |
DetallesVentas (productos y cantidades), el RUC, el Celular, la FechaVenta y el Estado no se modifican en esta acción. Si el ID del formulario no coincide con el ID de la URL, la operación se cancela con un error.