# Análisis de contexto del proyecto

> Actualizado **2026-07-28**. Lectura consolidada del estado del proyecto
> (SaaS multi-tenant + POS + landing pública). Empezar aquí en sesiones nuevas;
> POS: **`docs/PLAN_POS.md`**; marketing: **`docs/MANUAL_IDENTIDAD_PUBLICA.md`**.

---

## 1. Qué es el sistema hoy

**labSoft** es un LIMS (laboratorio clínico) en **CodeIgniter 4.6.5 /
PHP 8.3 / MySQL**, operando como SaaS multi-tenant (**MT-0 + MT-1**): una BD,
`tenant_id`, `BaseTenantModel`, superadmin y provisión de laboratorios.

| Rol (grupo Shield) | Home | Capacidades principales |
|--------------------|------|-------------------------|
| `admin` | `/dashboard` | Atajos + **POS embebido**; CRUDs, reportes, config. Menú **Venta** → `/cotizacion` |
| `empleado` | `/cotizacion` | **POS** → venta/cotización → ticket/PDF; abonos, monedero, resultados |
| `laboratorista` | `/pendientes` | Captura de resultados, listado de capturados (`/capturas`) |
| `superadmin` | `/super` | Backoffice plataforma: tenants, feedback, KPI |

Auth: **CodeIgniter Shield 1.3** (login por `username`, CSRF por sesión).
Registro **público** de laboratorio en `/registro` (trial interno vía
`TenantProvisioner`). Auditoría transversal vía `BaseAuditModel` + `auditoria`.

Frontend: Bootstrap 5.3 + DM Sans + jQuery + DataTables 2 + Select2, tokens
**Modernize** en `public/css/app.css`. Landing: GSAP + ScrollTrigger (CDN).
Sin SPA ni build tooling.

---

## 2. Historia de los documentos

### `PLAN_MODERNIZACION.md` — modernización original (días 1–20)

Migración legacy → CI4, esquema, modelos, `VentaService`, CDB, captura JSON,
FPDF, abonos/monedero. Bugs graves ya cerrados. **Histórico.**

### `PLAN_ACTUALIZACION.md` — transformación SaaS (documento vivo)

Multi-tenant, stack, UI, features. Bitácora de avances al final — **registrar
ahí todo avance**.

Decisiones SaaS cerradas: una BD + `tenant_id`; super-admin sin auto-registro;
frontend CI4+Bootstrap sin SPA.

### `PLAN_POS.md` — punto de venta (documento vivo)

Decisiones de producto del POS, mapa de archivos/endpoints, checklist y
**backlog priorizado (POS-01…)**. Leer antes de tocar venta/carrito/cotización.

### `INSTALACION.md` — operación

Hostinger, `.env`, schema/seed, migraciones.

### `CLAUDE.md` (raíz) — contrato de agentes

Arquitectura, Docker, reglas de modelos/auditoría/frontend, `ventas.idconsecutivo`
(= folio, no FK).

---

## 3. Estado real del código (julio 2026)

```
Listo y estable
├── Auth Shield + roles operativos + superadmin
├── Multi-tenant MT-0/MT-1 (tenant_id, BaseTenantModel, /super/tenants)
├── Auditoría / soft delete
├── UI Modernize (shell backoffice)
├── Landing pública + registro trial (LR-0+1)
│   ├── Copy: $0 en desarrollo · precios por determinarse
│   ├── PAS, FAQ, escenarios por rol, para quién
│   └── GSAP + ScrollTrigger (public/js/landing.js)
├── Portal público de resultados (verificación identidad)
├── DataTables + Select2
├── POS unificado (partials) en /cotizacion y /dashboard (admin)
├── Lab: pendientes + captura + capturas + rangos de referencia
├── Admin: CRUDs (incl. categorías, químicas) + reportes/KPIs
└── Ayuda /feedback en app

Pendiente / parcial
├── Billing / precios del software (copy: por determinarse)
├── Onboarding dueño (force password + checklist)
├── Carrito en BD (sigue en sesión)
├── Descuentos / fidelidad rediseñados (POS-11)
└── Validación server-side sistemática en CRUDs
```

### Sitio público (guest)

| Ruta | Qué es |
|------|--------|
| `GET /` | Landing marketing (`Home::index` → `public/landing`) |
| `GET/POST /registro` | Alta self-service trial → `TenantProvisioner` |
| `GET /login` | Entrada Shield |
| Portal resultados | Verificación paciente (rutas portal) |

Docs: `PLAN_LANDING_REGISTRO.md`, `MANUAL_IDENTIDAD_PUBLICA.md`.

### Home admin (`/dashboard`)

1. Cards de acceso: Análisis, Clientes, Reportes.
2. **Punto de venta embebido** (mismos partials que `/cotizacion`).
3. Menú también tiene **Venta** → `/cotizacion` (POS a pantalla completa).

### POS (admin + empleado)

```
empleado:  /cotizacion  →  POST /venta  →  ticket/PDF
admin:     /dashboard (POS) o /cotizacion  →  POST /venta  →  ticket/PDF
           /catalogo redirige a /cotizacion
```

- Select2 paciente + modal alta; Select2 análisis; carrito en cards; panel cobro.
- Precio siempre columna **`General`** (sin tipo de precio en el POS).
- Carrito en sesión; `VentaService::procesar()` sin bifurcar.
- Detalle y **pendientes**: **`docs/PLAN_POS.md`**.

Núcleo de negocio: consecutivo `FOR UPDATE`, muestras, CDB, puntos (umbral
`maximos`), venta + abono inicial.

---

## 4. POS: decisiones y deudas

Documento canónico: **`docs/PLAN_POS.md`**. Resumen:

| Tema | Estado |
|------|--------|
| Empleado | Home = `/cotizacion` |
| Admin | POS en `/dashboard` + menú `/cotizacion` |
| Partials | `_pos.php` + `_pos_scripts.php` |
| Tipo de precio en caja | Eliminado; precio `General` |
| Descuentos / fidelidad | Pendiente POS-11 |
| Método de pago en BD | Pendiente POS-10 |
| Sucursal al vender (admin) | Pendiente POS-01 |
| Carrito sesión vs BD | Sesión; BD = Fase 4 / POS-30 |
| KPIs en dashboard | Fase 6 / POS-17 (conviven con POS) |

---

## 5. Mapa rápido de archivos del POS

```
app/Views/empleado/cotizacion/_pos.php          ← UI compartida
app/Views/empleado/cotizacion/_pos_scripts.php  ← JS compartido
app/Views/empleado/cotizacion/index.php         ← /cotizacion
app/Views/admin/dashboard.php                   ← atajos + POS
app/Controllers/Admin/Dashboard.php
app/Controllers/Empleado/Cotizacion.php
app/Controllers/Empleado/Carrito.php
app/Controllers/Empleado/Catalogo.php           ← buscar + redirect
app/Controllers/Empleado/Venta.php
app/Services/VentaService.php                   ← no bifurcar
app/Views/admin/clientes/_modal.php
app/Config/Routes.php
public/css/app.css | public/js/app.js
docs/PLAN_POS.md                                ← backlog
```

---

## 6. Siguiente sesión

1. Leer bitácora al final de **`docs/PLAN_ACTUALIZACION.md`**.
2. Si es POS → **`docs/PLAN_POS.md`**; si es marketing → **`MANUAL_IDENTIDAD_PUBLICA.md`**.
3. Avance → bitácora + docs de plan afectados.

Usuarios de prueba locales: `test_admin :: Prueba2026admin`,
`test_empleado :: Prueba2026emp`, `test_lab :: Prueba2026lab`.
