# Inventario de reportes — EnterFarmaPlus

Listado completo de páginas de reporte/listado en 3 áreas: **Reportes**, **Inventario**, **Finanzas**.
Armado para revisar 1x1. Cada fila tiene checkbox de estado — marcar `[x]` a medida que se audite.

Fuente: exploración directa de `modules/*/Routes/web.php`, `SettingController::buildReportCatalog()` (catálogo de `/list-reports`) y `resources/views/tenant/layouts/partials/sidebar.blade.php`. 2026-07-24.

---

## 1. Reportes (`/list-reports`)

### 1.1 Ventas y documentos

| ✓ | Título | URL | Descripción |
|---|---|---|---|
| [ ] | Ventas por documento | `/reports/sales` | Comprobantes individuales por fecha, cliente, vendedor. **Ya revisado esta sesión** — fusionado con Notas de Venta, totales corregidos, filtros rediseñados. |
| [ ] | Estado de cuenta por cliente | `/reports/state-account` | Saldo, vencimiento, pagos y documentos del cliente. **Ya revisado esta sesión** — confirmado que NO debe filtrar solo pendientes (eso ya lo cubre Finanzas → Cuentas por cobrar); es un extracto completo, no una herramienta de cobranza. |
| [ ] | Ventas por producto | `/reports/sales-consolidated` | Totales por producto vendido; enlaza a "Ver detalle" (`/reports/general-items`). |
| [ ] | Ventas por categoría | `/reports/sales-by-category` | Resumen de ventas agrupado por categoría (monto, cantidad, %). |

### 1.2 Compras

| ✓ | Título | URL | Descripción |
|---|---|---|---|
| [ ] | Compras por documento | `/reports/purchases` | Comprobantes de compra individuales por proveedor y fecha. |
| [ ] | Compras por producto | `/reports/purchases/general_items` | Productos comprados con costos y cantidades por línea. |

### 1.3 Inventario y vencimientos (dentro del hub Reportes, distinto del submenú "Inventario" — ver sección 2)

| ✓ | Título | URL | Descripción |
|---|---|---|---|
| [x] | Stock crítico por almacén | `/reports/items/stockcero` | Ya no tenía filtro real "por almacén" pese al nombre (el backend hacía LIKE sobre nombre de almacén pero la UI nunca mandaba ese campo). Agregado select de Almacén (por warehouse_id), KPIs ahora respetan el filtro, header a 1 línea, export corrige establecimiento hardcodeado (`Establishment::first()` → `auth()->user()->establishment`). |
| [x] | Lotes por vencer / vencidos | `/reports/items/date_of_due` | Tenía un bug real: `DataTableDateofDue.vue` estaba clonado de un componente orientado a clientes, con fetches muertos a `/reports/customers/filter` + `/reports/data-table/items` que dejaban `this.persons` en `undefined` y tiraban un `TypeError` en consola en cada carga. Se quitó toda esa maquinaria muerta (persons/establishments/document_types/items nunca usados en pantalla). Se agregaron filtros reales de Descripción/Categoría/Marca (el backend ya los soportaba pero no tenían UI) vía nuevo endpoint `items_date_of_due_filter`. Se quitó el radio-group redundante (duplicaba las 4 tarjetas KPI clickeables) y se le agregó estado activo visual. Default cambiado de "Próximos 60 días" (mostraba 0 aun con vencidos reales) a "Ya vencidos" (el bucket más urgente/accionable). Export PDF/Excel (comparten la misma vista Blade) actualizado para tener paridad exacta con pantalla: agregado "Días", agregadas Marca/Categoría, quitado "#". Header a 1 línea. |
| [x] | Rotación y cobertura de inventario → renombrado "Rotación de inventario" | `/reports/purchases/rotation_items` | Nunca calculaba "cobertura" (campo hardcodeado en 0) — nombre corregido. Header 1 línea + toggle de filtros (visible por defecto si hay >1 almacén, ya que elegir almacén es obligatorio; auto-oculta+autocarga en mono-almacén). |
| [ ] | Trazabilidad por lote | `/reports/pharmacy/traceability-lot` (vía `PharmacyReportController`) | Ver `app/Services/PharmacyReports/PharmacyReportCatalog.php` |
| [ ] | Mermas y vencidos | `/reports/pharmacy/...` | Ídem — catálogo de reportes farmacéuticos avanzados |
| [x] | Cobertura de stock (días) | `/reports/pharmacy/stock-coverage` | Sistema genérico `PharmacyReportCatalog`+`PharmacyReportController` (declarativo: 1 controller sirve los 7 "pharmacy reports" via config de filtros/columnas). Ya auto-carga, export Excel usa las MISMAS columnas que pantalla por construcción (garantiza paridad, sin el bug-class que tuvimos en otros reportes). Sin cambios. 0 registros en demo = falta data de consumo calificada, no es bug. |
| [ ] | Recall sanitario | `/reports/pharmacy/...` | Ídem — no revisado (fuera de la lista de 8 "Inventario y stock" del usuario) |
| [x] | Inmovilizados | `/reports/pharmacy/idle-stock` | Misma arquitectura que Cobertura de stock. Ya auto-carga. Sin cambios. |
| [ ] | Quiebres recurrentes | `/reports/pharmacy/...` | Ídem |
| [ ] | Score de riesgo regulatorio | `/reports/pharmacy/...` | Ídem |

> Los 7 de `PharmacyReportController` comparten una sola ruta genérica `/reports/pharmacy/{report}` — conviene auditarlos juntos revisando `PharmacyReportCatalog.php` primero.

### 1.4 Comisiones y rentabilidad

| ✓ | Título | URL | Descripción |
|---|---|---|---|
| [ ] | Comisiones por ventas del vendedor | `/reports/commissions` | Base comisionable y comisión calculada por vendedor. |
| [ ] | Comisiones por utilidad del vendedor | `/reports/user-commissions` | Comisión basada en utilidad neta por vendedor. |
| [ ] | Comisión por producto vendido | `/reports/commissions-products` | Comisión generada por producto y documento de origen. |
| [ ] | Ajustes de comisión por venta | `/reports/commission-adjustments` | Ajustes aplicados a comisiones por documento o producto. |
| [ ] | Rentabilidad por producto | `/reports/commissions-detail` | Margen unitario y utilidad total por producto vendido. |

### 1.5 Despacho

| ✓ | Título | URL | Descripción |
|---|---|---|---|
| [ ] | Guías por producto | `/reports/guides/general-items` | Despachos y guías de remisión por producto y cliente. |

### 1.6 Utilidades del sistema

| ✓ | Título | URL | Descripción |
|---|---|---|---|
| [ ] | Descarga masiva de documentos | `/reports/massive-downloads` | Genera descargas masivas filtradas por rango y cliente. |
| [ ] | Bandeja de reportes | `/reports/download-tray` | Historial de archivos generados para descarga posterior. |

### 1.7 Avanzados (analítica)

| ✓ | Título | URL | Descripción |
|---|---|---|---|
| [ ] | Compras vs ventas (proveedor/laboratorio) | `/reports/pharmacy-analytics/purchase-vs-sales` | Brecha entre lo comprado y lo vendido por marca/laboratorio. |
| [ ] | ABC rotación y margen | `/reports/pharmacy-analytics/abc-rotation-margin` | Clasificación Pareto por rotación o margen comercial. |

### 1.8 Otros giros (solo visible con giro "hotel" activo)

| ✓ | Título | URL | Descripción |
|---|---|---|---|
| [ ] | Giro negocio hoteles | `/reports/document-hotels` | Documentos operativos y comerciales del giro hotelero. |
| [ ] | Reporte de habitaciones | `/reports/report_hotels` | Movimientos y ocupación de habitaciones. |

### 1.9 NO están en el menú "Reportes" (huérfanas / legacy / posibles duplicados)

Existen como ruta+controller pero no aparecen en `/list-reports`. Prioridad de revisión: confirmar si siguen usándose desde algún link directo, o si se pueden dar de baja.

| ✓ | Título (inferido) | URL | Descripción |
|---|---|---|---|
| [x] | Compras por ítem (vista alterna) | `/reports/purchases/items` | **DUPLICADO CONFIRMADO** de "Compras por producto" (`purchases/general_items`) — mismo `PurchaseItem`/`getRecords()`. Peor: la vista Blade que debería renderizar (`report::purchases_items.index`) **no existe en el repo** — visitarla tira 500. Huérfana, sin referencias en menú ni config. Candidata a retirar. |
| [ ] | Registro de compras — Formato 09 | `/reports/purchases/format_09` | Formato SUNAT; middleware `redirect.level` (posible feature restringida). |
| [ ] | Cotizaciones | `/reports/quotations` | Listado de cotizaciones emitidas. |
| [ ] | Reporte de caja | `/reports/cash` | Movimientos de caja (aperturas/cierres) por usuario/fecha. |
| [ ] | Análisis comercial | `/reports/commercial-analysis` | Análisis de clientes/ventas por categoría. |
| [ ] | Detracciones | `/reports/document-detractions` | Documentos sujetos a detracción SUNAT. |
| [x] | Ventas por ítem (legacy) | `/reports/items` | **DUPLICADO CONFIRMADO** — reemplazado por `general_items` (detalle línea-a-línea vigente, con más filtros: nota de venta, doctor, almacén, marca, categoría), enlazado desde "Ver detalle" en Ventas por producto. `items.index` no está en ningún menú ni config. Candidata a retirar. |
| [ ] | Notas de pedido consolidadas | `/reports/order-notes-consolidated` | Notas de pedido agrupadas por ítem con totales. |
| [ ] | Ítems extra / adicionales | `/reports/extra-general-items/items` | Variante de reporte de ítems con atributos extra (color, etc.). |
| [ ] | Notas de pedido (general) | `/reports/order-notes-general` | Listado general de notas de pedido. |
| [ ] | Compras de activos fijos | `/reports/fixed-asset-purchases` | Compras registradas como activo fijo. |
| [ ] | Propinas | `/reports/tips` | Propinas registradas por documento de origen. |

### 1.10 Bugs de rutas detectados de paso (no reportes en sí, pero vale anotarlos)

- `tenant.reports.sales.email` está definida **dos veces** (`/reports/sales/email` y `/reports/sales/export`) — el nombre de ruta del email queda pisado, siempre resuelve a `/export`.
- `tenant.reports.document_hotels.records` duplicada — la copia en `/reports/document-detractions/records` debería llamarse `tenant.reports.document_detractions.records`.
- `tenant.reports.extra.items.records` reutilizada en 3 rutas distintas (impredecible a cuál resuelve `route(...)`).
- `/reports/no_paid/excel` (`ReportUnpaidController`, en `modules/Report`) es un export legacy que duplica al reporte real "Cuentas por cobrar" (`modules/Finance`, sección 3).

---

## 2. Inventario (submenú lateral)

| ✓ | Título | URL | Descripción |
|---|---|---|---|
| [ ] | Movimientos | `/inventory` | Listado general de movimientos de stock (entradas, salidas, ajustes) por producto/almacén. |
| [ ] | Traslados | `/transfers` | Traslados de mercadería entre almacenes/sucursales, con guía PDF. |
| [ ] | Devolución - Retiro | `/devolutions` | Devoluciones y retiros de inventario. |
| [x] | Reporte Kardex | `/reports/kardex` | Ya estaba excelente: 4 modos con banner de contexto, filtros modernos, toggle "ver por almacén", export PDF/Excel. Sin cambios. Nota de paso: `reports.kardex.pdf` está registrado 2 veces (`kardex` y `kardex_psicotropicos` groups, ambos usan el mismo nombre de ruta) — el segundo pisa al primero; no afecta la UI actual (SPA pega URLs directas, no usa `route()`), pero vale limpiarlo si algo empieza a usar ese nombre. |
| [x] | Kardex valorizado → renombrado "Margen por producto" | `/reports/valued-kardex` | **NO era un kardex** — nunca tocaba `InventoryKardex`, es un resumen de margen de venta por producto del período. Su botón "Exportar Formato SUNAT 13.1" era FALSO (código muerto/comentado, descargaba el mismo Excel simple) — riesgo real si un usuario lo usaba para SUNAT. Renombrado en todo lados (catálogo, sidebar, título, export, download-tray), botón falso + ruta + clases muertas eliminadas. |
| [x] | Reporte Inventario | `/reports/inventory` | Ya estaba muy bien construido (filtros, columnas configurables, export async con bandeja de descargas). Solo se agregó autoseleccion+autocarga para tenants mono-almacén. Nota: existe un `indexback.blade.php` + `stock_report.vue`/`movement_report.vue` + métodos `pdf()`/`excel()`/`search()` en el controller que son la version VIEJA, confirmados huérfanos (la vista activa usa `tenant-inventory-report` → `inventory/reports/index.vue`, flujo async exclusivamente) — candidatos a limpieza futura, no se tocaron ahora. |
| [x] | Valorización de inventario | `/reports/inventory-valuation` | Ya estaba bien: auto-carga sola, filtros funcionales (producto/almacen/categoria/marca/stock), columnas configurables persistidas en localStorage. Sin cambios. |
| [ ] | Conciliación stock / lotes | `/reports/inventory-reconciliation` | Compara stock del Kardex vs. suma de lotes, resalta diferencias. |
| [ ] | Lotes | `/inventory/lotes` | Lotes y vencimientos por producto/almacén (FEFO). |
| [ ] | Conteos físicos | `/physical-counts` | Conteos físicos de inventario, integrado con app móvil. |
| [ ] | Revisión de inventario | `/inventory-review` | Hoja de conteo imprimible por almacén/categoría (incluye variantes). |

### 2.1 Huérfanas / no enlazadas en el submenú actual

| ✓ | Título | URL | Descripción |
|---|---|---|---|
| [x] | Traslados (legacy) | `/moves`, `/inventory/moves` | **DUPLICADO CONFIRMADO** — subconjunto estricto de "Traslados". `MovesController` es solo lectura sobre `Inventory::where('description','Traslado')`; `TransferController` (el vigente) tiene modelo dedicado (`InventoryTransfer`+`InventoryTransferItem`), crear/editar/anular con reversión de stock/kardex/lotes, PDF, carga masiva. Ningún menú ni vista enlaza `moves.index`. Candidata a retirar. |
| [ ] | Kardex Psicotrópicos (URL directa) | `/reports/kardex_psicotropicos` | Misma vista que Reporte Kardex; normalmente se abre como pestaña interna, esta URL alterna no está enlazada. |

---

## 3. Finanzas (submenú lateral)

| ✓ | Título | URL | Descripción |
|---|---|---|---|
| [ ] | Movimientos | `/finances/movements` | Movimientos de caja/banco (ingresos y egresos). |
| [ ] | Ingresos | `/finances/income` | Ingresos diversos por cliente, motivo, moneda. |
| [ ] | Cuentas por cobrar | `/finances/unpaid` | Documentos de venta pendientes de pago por cliente; "pagar todo" + reporte por método/día. |
| [ ] | Cuentas por pagar | `/finances/to-pay` | Documentos de compra pendientes de pago a proveedor. |
| [ ] | Pagos | `/finances/global-payments` | Pagos globales consolidados por método/destino. |
| [ ] | Balance | `/finances/balance` | Saldos de caja y banco; transferencias entre cuentas. |
| [ ] | Ingresos y Egresos - M. Pago | `/finances/payment-method-types` | Ingresos/egresos desglosados por método de pago. |

### 3.1 Nota

- `/finances/transactions` es un redirect legacy hacia `/finances/movements` (ya consolidado) — no es página real, no hace falta auditar.

---

## Cómo seguir

1. Marcar `[x]` en la columna ✓ a medida que se revise cada reporte (¿carga bien? ¿datos correctos? ¿filtros tienen sentido? ¿duplica otro?).
2. Prioridad sugerida: primero **1.9** (huérfanos — decidir si se dan de baja) y **2.1** (duplicados de Inventario), son los de menor esfuerzo/mayor limpieza.
3. Los 7 de **1.3 farmacéuticos avanzados** conviene agruparlos en una sola pasada (comparten controller/catálogo).
