[debt] Modularidad: tipos derivados del contrato, eliminar duplicados y dividir páginas grandes #6

Open
opened 2026-10-02 17:36:00 +00:00 by Carlos · 0 comments
Member

Qué es la deuda

Backend (apps/api)

  • Las entidades de src/entities están escritas a mano y ya no coinciden con el contrato: Product no tiene unit, status ni updatedAt; Supplier no tiene phone, email, address ni taxId; Inventory no tiene address. Los columns de cada repositorio repiten la lista.
  • 16 pares de interfaces/*-repository.interface.ts / *-service.interface.ts solo hacen alias de IRepository<...>, y 14 servicios solo sobrescriben notFoundMessage.
  • operating-day.service.ts y cash-register-session.service.ts cargan la tabla completa con findAll() y filtran en memoria.

Frontend (apps/web)

  • money() está copiado en 6 archivos (admin/page.tsx, reportes, productos, pos/page.tsx, historial, cash-register-control.tsx).
  • activePriceByProduct está duplicado en pos/page.tsx y productos/page.tsx.
  • Páginas que mezclan datos, reglas y UI: pos/page.tsx (571 líneas), productos/page.tsx (561), reportes/page.tsx (420), inventario/[id]/page.tsx (391).
  • login/_services/auth.service.ts usa fetch directo en vez de apiClient.
  • No hay tipos compartidos entre api y web.

Qué estamos pagando hoy

  • Los campos nuevos del contrato no llegan al API ni al front sin editar tres lugares; ya hay campos que no se devuelven.
  • Cambiar el formato de moneda o la regla de precio activo exige editar varios archivos.
  • Las páginas grandes son difíciles de revisar y de probar.
  • Las consultas que leen tablas completas se van a volver lentas conforme crezcan los datos.

Arreglo propuesto

  • Derivar las entidades del tipo del contrato y tipar columns como readonly (keyof Entity)[]
  • entityName en BaseService para eliminar los overrides de notFoundMessage
  • Métodos de repositorio con where en vez de filtrar en memoria
  • _core/utils/format.ts con money() y hook useActivePrices()
  • Dividir las páginas grandes en hooks (useCart, useStockByInventory) y componentes por sección
  • Usar apiClient en el login
  • Cambiar moneda y formato regional a pesos mexicanos (decidido: es-MX / MXN). Hoy todo usa es-AR y los montos se muestran en USD. Centralizar en _core/utils/format.ts (LOCALE = "es-MX", CURRENCY = "MXN", money(), formatDate(), formatDateTime()) y reemplazar los 20 usos:
    • money() con USD (6): admin/page.tsx:13, admin/reportes/page.tsx:43, admin/inventario/productos/page.tsx:28, pos/page.tsx:61, pos/historial/page.tsx:28, pos/_components/cash-register-control.tsx:22
    • Fechas con es-AR (14): _core/components/operating-day-badge.tsx:8, admin/_components/operating-day-control.tsx:14, admin/reportes/page.tsx:178,403,404, admin/proveedores/page.tsx:104, admin/proveedores/[id]/page.tsx:54,82, admin/inventario/categorias/page.tsx:102, admin/inventario/productos/page.tsx:538, pos/historial/page.tsx:178,191, admin/inventario/[id]/page.tsx:256, pos/page.tsx:518

Techo de esta ronda

Eliminar duplicados y desalineación de tipos. Fuera: el paquete packages/shared para compartir tipos entre api y web, que se evalúa después de #2.

Superficie

Web (apps/web)

Módulos

Web / frontend, API / backend, Punto de venta (POS), Productos / precios / categorías, Reportes

Esfuerzo

L — partir; este issue solo cubre el primer corte

Riesgo de no tocarlo

Medio

### Qué es la deuda **Backend (`apps/api`)** - Las entidades de `src/entities` están escritas a mano y ya no coinciden con el contrato: `Product` no tiene `unit`, `status` ni `updatedAt`; `Supplier` no tiene `phone`, `email`, `address` ni `taxId`; `Inventory` no tiene `address`. Los `columns` de cada repositorio repiten la lista. - 16 pares de `interfaces/*-repository.interface.ts` / `*-service.interface.ts` solo hacen alias de `IRepository<...>`, y 14 servicios solo sobrescriben `notFoundMessage`. - `operating-day.service.ts` y `cash-register-session.service.ts` cargan la tabla completa con `findAll()` y filtran en memoria. **Frontend (`apps/web`)** - `money()` está copiado en 6 archivos (`admin/page.tsx`, `reportes`, `productos`, `pos/page.tsx`, `historial`, `cash-register-control.tsx`). - `activePriceByProduct` está duplicado en `pos/page.tsx` y `productos/page.tsx`. - Páginas que mezclan datos, reglas y UI: `pos/page.tsx` (571 líneas), `productos/page.tsx` (561), `reportes/page.tsx` (420), `inventario/[id]/page.tsx` (391). - `login/_services/auth.service.ts` usa `fetch` directo en vez de `apiClient`. - No hay tipos compartidos entre api y web. ### Qué estamos pagando hoy - Los campos nuevos del contrato no llegan al API ni al front sin editar tres lugares; ya hay campos que no se devuelven. - Cambiar el formato de moneda o la regla de precio activo exige editar varios archivos. - Las páginas grandes son difíciles de revisar y de probar. - Las consultas que leen tablas completas se van a volver lentas conforme crezcan los datos. ### Arreglo propuesto - [ ] Derivar las entidades del tipo del contrato y tipar `columns` como `readonly (keyof Entity)[]` - [ ] `entityName` en `BaseService` para eliminar los overrides de `notFoundMessage` - [ ] Métodos de repositorio con `where` en vez de filtrar en memoria - [ ] `_core/utils/format.ts` con `money()` y hook `useActivePrices()` - [ ] Dividir las páginas grandes en hooks (`useCart`, `useStockByInventory`) y componentes por sección - [ ] Usar `apiClient` en el login - [ ] Cambiar moneda y formato regional a **pesos mexicanos** (decidido: `es-MX` / `MXN`). Hoy todo usa `es-AR` y los montos se muestran en `USD`. Centralizar en `_core/utils/format.ts` (`LOCALE = "es-MX"`, `CURRENCY = "MXN"`, `money()`, `formatDate()`, `formatDateTime()`) y reemplazar los 20 usos: - `money()` con `USD` (6): `admin/page.tsx:13`, `admin/reportes/page.tsx:43`, `admin/inventario/productos/page.tsx:28`, `pos/page.tsx:61`, `pos/historial/page.tsx:28`, `pos/_components/cash-register-control.tsx:22` - Fechas con `es-AR` (14): `_core/components/operating-day-badge.tsx:8`, `admin/_components/operating-day-control.tsx:14`, `admin/reportes/page.tsx:178,403,404`, `admin/proveedores/page.tsx:104`, `admin/proveedores/[id]/page.tsx:54,82`, `admin/inventario/categorias/page.tsx:102`, `admin/inventario/productos/page.tsx:538`, `pos/historial/page.tsx:178,191`, `admin/inventario/[id]/page.tsx:256`, `pos/page.tsx:518` ### Techo de esta ronda Eliminar duplicados y desalineación de tipos. Fuera: el paquete `packages/shared` para compartir tipos entre api y web, que se evalúa después de #2. ### Superficie Web (apps/web) ### Módulos Web / frontend, API / backend, Punto de venta (POS), Productos / precios / categorías, Reportes ### Esfuerzo L — partir; este issue solo cubre el primer corte ### Riesgo de no tocarlo Medio
Carlos changed title from Modularidad: tipos derivados del contrato, eliminar duplicados y dividir páginas grandes to [debt] Modularidad: tipos derivados del contrato, eliminar duplicados y dividir páginas grandes 2026-10-02 17:42:59 +00:00
Nolberto was assigned by Carlos 2026-10-02 20:06:41 +00:00
Carlos self-assigned this 2026-10-02 20:06:57 +00:00
Nolberto was unassigned by Carlos 2026-10-02 20:07:01 +00:00
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: RynextTechnologies/PDV#6