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
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 grandes2026-10-02 17:42:59 +00:00
Nolberto
was assigned by Carlos2026-10-02 20:06:41 +00:00
Carlos
self-assigned this 2026-10-02 20:06:57 +00:00
Nolberto
was unassigned by Carlos2026-10-02 20:07:01 +00:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Qué es la deuda
Backend (
apps/api)src/entitiesestán escritas a mano y ya no coinciden con el contrato:Productno tieneunit,statusniupdatedAt;Supplierno tienephone,email,addressnitaxId;Inventoryno tieneaddress. Loscolumnsde cada repositorio repiten la lista.interfaces/*-repository.interface.ts/*-service.interface.tssolo hacen alias deIRepository<...>, y 14 servicios solo sobrescribennotFoundMessage.operating-day.service.tsycash-register-session.service.tscargan la tabla completa confindAll()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).activePriceByProductestá duplicado enpos/page.tsxyproductos/page.tsx.pos/page.tsx(571 líneas),productos/page.tsx(561),reportes/page.tsx(420),inventario/[id]/page.tsx(391).login/_services/auth.service.tsusafetchdirecto en vez deapiClient.Qué estamos pagando hoy
Arreglo propuesto
columnscomoreadonly (keyof Entity)[]entityNameenBaseServicepara eliminar los overrides denotFoundMessagewhereen vez de filtrar en memoria_core/utils/format.tsconmoney()y hookuseActivePrices()useCart,useStockByInventory) y componentes por secciónapiClienten el logines-MX/MXN). Hoy todo usaes-ARy los montos se muestran enUSD. Centralizar en_core/utils/format.ts(LOCALE = "es-MX",CURRENCY = "MXN",money(),formatDate(),formatDateTime()) y reemplazar los 20 usos:money()conUSD(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:22es-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:518Techo de esta ronda
Eliminar duplicados y desalineación de tipos. Fuera: el paquete
packages/sharedpara 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
Modularidad: tipos derivados del contrato, eliminar duplicados y dividir páginas grandesto [debt] Modularidad: tipos derivados del contrato, eliminar duplicados y dividir páginas grandes