Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/interezante456-pixel/Miercoles-Proyecto/llms.txt

Use this file to discover all available pages before exploring further.

El módulo de Reportes permite al administrador de Tiendas Mi Cholo obtener instantáneas del negocio en formato PDF listo para imprimir o archivar. Los dos reportes disponibles —ventas e inventario— se generan en el servidor con todos los datos actuales y se entregan como descarga directa en la respuesta HTTP. No se almacenan en disco; cada llamada produce un PDF nuevo al vuelo.
Ambos endpoints requieren el rol ADMIN. Cualquier token con rol VENDEDOR o ALMACENERO recibirá 403 Forbidden. Asegúrate de incluir siempre el header Authorization: Bearer <token> con un token válido y no expirado.

Biblioteca de Generación PDF

Los reportes se generan con iTextPDF versión 5.5.13.3 (com.itextpdf:itextpdf:5.5.13.3), incluida como dependencia Maven en el backend. Los documentos se producen en memoria como byte[] y se devuelven directamente en el cuerpo de la respuesta HTTP sin tocar el sistema de archivos del servidor.
Detalles del diseño generado:
ElementoDetalle
FuenteHelvetica (familia estándar PDF)
Color de encabezado de tablaÍndigo #6366F1
Color de encabezado de documentoSlate 800 #1E293B
Filas alternasSlate 100 #F1F5F9 / Blanco
Orientación — VentasA4 horizontal (landscape)
Orientación — InventarioA4 vertical (portrait)

Reporte de Ventas

GET /api/reportes/ventas

Genera el reporte con todas las ventas registradas en el sistema, ordenadas por número de venta.
GET /api/reportes/ventas
Authorization: Bearer <token>
Cabeceras de respuesta:
HeaderValor
Content-Typeapplication/pdf
Content-Dispositionattachment; filename=reporte-ventas.pdf
Columnas del reporte:
ColumnaDescripción
#Número de fila correlativo
N° VentaCódigo generado automáticamente (ej. VNT-00001)
ClienteNombre y apellidos del cliente
UsuarioNombre y apellido del vendedor que registró la venta
SubtotalMonto antes del IGV (en soles, prefijo S/)
IGVImpuesto General a las Ventas
TotalMonto total de la venta
EstadoCOMPLETADA o ANULADA
El pie del documento muestra el total de ventas registradas al momento de la generación.

Reporte de Inventario

GET /api/reportes/inventario

Genera el reporte con todos los productos del catálogo, incluyendo niveles de stock actuales versus mínimos.
GET /api/reportes/inventario
Authorization: Bearer <token>
Cabeceras de respuesta:
HeaderValor
Content-Typeapplication/pdf
Content-Dispositionattachment; filename=reporte-inventario.pdf
Columnas del reporte:
ColumnaDescripción
CódigoCódigo único del producto (ej. PROD-001)
NombreNombre del producto
CategoríaNombre de la categoría a la que pertenece
Stock Act.Stock actual disponible
Stock Mín.Stock mínimo configurado
P. VentaPrecio de venta (en soles, prefijo S/)
EstadoOK si el stock es suficiente; STOCK BAJO si stockActual ≤ stockMinimo
Las celdas Stock Act. y Estado de los productos con stock bajo se resaltan con fondo rojo claro #FEE2E2 para facilitar la identificación visual. El pie del documento muestra el total de productos en el catálogo.

Descarga desde la Terminal

Puedes descargar cualquiera de los reportes directamente con curl:
# Reporte de ventas
curl -H "Authorization: Bearer <token>" \
  http://localhost:8080/api/reportes/ventas \
  -o reporte-ventas.pdf

# Reporte de inventario
curl -H "Authorization: Bearer <token>" \
  http://localhost:8080/api/reportes/inventario \
  -o reporte-inventario.pdf
Reemplaza <token> por el valor del token obtenido al hacer login en POST /api/auth/login.

Descarga desde el Frontend Angular

Desde el cliente Angular 22, usa HttpClient con responseType: 'blob' para recibir el PDF y disparar la descarga en el navegador:
import { HttpClient } from '@angular/common/http';
import { inject } from '@angular/core';

export class ReporteService {
  private http = inject(HttpClient);

  descargarReporteVentas(): void {
    this.http
      .get('http://localhost:8080/api/reportes/ventas', {
        responseType: 'blob',
        headers: { Authorization: `Bearer ${localStorage.getItem('token')}` }
      })
      .subscribe((blob) => {
        const url = URL.createObjectURL(blob);
        const a = document.createElement('a');
        a.href = url;
        a.download = 'reporte-ventas.pdf';
        a.click();
        URL.revokeObjectURL(url);
      });
  }

  descargarReporteInventario(): void {
    this.http
      .get('http://localhost:8080/api/reportes/inventario', {
        responseType: 'blob',
        headers: { Authorization: `Bearer ${localStorage.getItem('token')}` }
      })
      .subscribe((blob) => {
        const url = URL.createObjectURL(blob);
        const a = document.createElement('a');
        a.href = url;
        a.download = 'reporte-inventario.pdf';
        a.click();
        URL.revokeObjectURL(url);
      });
  }
}

Comparación de los dos Reportes

Reporte de Ventas

Endpoint: GET /api/reportes/ventasFuente de datos: tabla ventas — incluye todas las ventas (completas y anuladas).Orientación: A4 horizontal para acomodar las 8 columnas.Archivo: reporte-ventas.pdf

Reporte de Inventario

Endpoint: GET /api/reportes/inventarioFuente de datos: tabla productos — incluye todos los productos (activos e inactivos).Orientación: A4 vertical con celdas resaltadas para stock bajo.Archivo: reporte-inventario.pdf

Respuestas de Error Comunes

CódigoCausa
401 UnauthorizedToken JWT ausente, inválido o expirado
403 ForbiddenEl token pertenece a un rol distinto de ADMIN
500 Internal Server ErrorError al generar el PDF (problema en ReporteService)

Build docs developers (and LLMs) love