# MBTaller Mecanico - Sistema Operativo (Abr 2026)

Sistema PWA offline-first para taller mecanico, pensado para uso diario en tablet: recepcion, OT, evidencia multimedia, cotizacion, historial, sincronizacion y operacion continua con conectividad inestable.

## Estado actual
- OT completa con wizard de creacion y detalle operativo.
- Flujo real para danos, fotos, firmas, PDF, edicion y cierre de la OT.
- Historial por cliente y placa con evidencia consolidada.
- Sincronizacion incremental frontend/backend con `sync/pull` y cola offline.
- Cotizacion integrada con busqueda rapida para tablet y filtro de productos de taller.
- Docker validado para desarrollo y para build productivo.

## Inicio rapido (Docker)
```bash
# 1) Copia variables de entorno
cp .env.example .env
# Edita .env con credenciales reales de la base de datos externa

# 2) Desarrollo
# frontend en modo dev, backend en modo dev
# frontend: http://localhost:4000
# backend:  http://localhost:3001/api/v1
docker compose -f docker-compose.dev.yml up -d --build

# 3) Aplica migraciones
# incluye las tablas base y la columna taller_productos.estaller
docker compose exec backend sh -lc "npm run migration:run"

# 4) Ver logs si hace falta
docker compose logs -f
```

El compose no levanta MySQL. La base de datos debe existir fuera de Docker y se conecta por `TENANT_CLI_DB_HOST`, `TENANT_CLI_DB_PORT`, `TENANT_CLI_DB_DATABASE`, `TENANT_CLI_DB_USERNAME` y `TENANT_CLI_DB_PASSWORD` (mas `CONTROL_PLANE_DB_*` para el plano de control, `mbinvtaller`).

## Produccion con Docker
El archivo `docker-compose.yml` es el stack productivo: backend y frontend corren con `NODE_ENV=production`, Redis se levanta dentro de Docker y MySQL sigue siendo externo.

```bash
docker compose up -d --build
```

## Acceso
- Frontend (PWA): `http://localhost:4000`
- Backend (API): `http://localhost:3001/api/v1`
- Swagger: `http://localhost:3001/api/docs`

## Estructura
```text
tll/
|-- docker-compose.yml     # Orquestacion
|-- .env / .env.example    # Variables de entorno
|-- backend/               # NestJS + TypeORM
|   |-- src/auth           # JWT + permisos
|   |-- src/clientes       # CRUD + busqueda
|   |-- src/vehiculos      # CRUD + placa unica
|   |-- src/ots            # Flujo OT + locking + multimedia
|   |-- src/cotizaciones   # Snapshot + totales + aprobacion
|   |-- src/catalogos      # Catalogos internos
|   |-- src/productos      # maeplu + productos locales + estaller
|   |-- src/uploads        # Sharp + WebP + PDF
|   `-- src/sync           # Cola, pull incremental, retry
|-- frontend/              # Next.js PWA (App Router)
|   |-- src/app            # Paginas operativas
|   |-- src/components     # Layout, providers, UI
|   |-- src/lib            # offline db, sync-engine, API, caches
|   `-- public             # manifest, icons, service worker
`-- docs/                  # Documentacion
```

## Funcionalidad entregada
- OT offline-first con cola de eventos, auto-sync al reconectar y persistencia local en IndexedDB.
- Wizard 6 pasos para crear OTs: cliente, vehiculo, estado, solicitud, evidencias y confirmacion.
- Seleccion obligatoria de marca y modelo (catalogo vehicular) en alta de vehiculo desde OT y desde el modulo de vehiculos.
- Vistas reales de OT en `/dashboard/ots/[id]`, `/danos`, `/fotos`, `/firmas`, `/editar` y `/cotizacion`.
- Danos con overlay visual por zonas y registro ligado al catalogo.
- Fotos con preview, progreso de carga, reintentos de upload y galeria por OT.
- Firmas de cliente y recepcion con borrar, rehacer y persistencia WebP.
- PDF integrado directamente dentro del flujo de la OT.
- Cierre de OT con `fecha_salida` obligatoria al pasar a `entregada`.
- Locking de OTs entregadas y validacion de transiciones invalidas desde backend.
- Historial enriquecido por cliente y placa con evidencia visible: galeria, danos, firmas, PDF, cotizacion y accesos directos.
- Sync incremental real usando `GET /sync/pull` consumido en frontend, con estado de cola, ultimo error y ultima sincronizacion visible en UI.
- Cotizacion mejorada para tablet con filtros rapidos: repuestos taller, servicios y ver todo.
- Filtro de productos locales con campo `estaller` y soporte de consulta `soloTaller`.
- Correccion del recalculo de IVA en lineas de cotizacion al cambiar cantidades.
- Build productivo de frontend validado en Docker con `NODE_ENV=production`.

## QA sugerido
1. Inicia sesion con el usuario seed.
2. Crea una OT en `/dashboard/ots/nueva`.
3. Completa cliente, vehiculo, km, gasolina, requerimiento y observaciones.
4. Entra al detalle de la OT y registra danos, fotos, firmas y PDF.
5. Genera la cotizacion desde la OT y prueba los filtros `Repuestos taller`, `Servicios` y `Ver todo`.
6. Cambia cantidades en lineas de cotizacion y verifica subtotal, IVA y total.
7. Aprueba la cotizacion y avanza el estado hasta `entregada`, capturando `fecha_salida`.
8. Consulta historial por cliente y por placa.
9. Prueba modo sin conexion, crea cambios locales y verifica sincronizacion al reconectar.

## Migraciones aplicadas relevantes
- Tablas base del taller.
- Cotizaciones y lineas de cotizacion.
- Catalogo vehicular ampliado.
- `taller_productos.estaller` para separar productos operativos del taller.

## Pendiente real
- Integrar filtro por existencia/stock real del ERP en cotizacion. Hoy ya existe filtro por estaller, pero no hay una columna de stock modelada de forma confiable en este repo para forzarlo sin riesgo.
- Implementar uploads realmente resumibles a nivel binario si se va a trabajar con archivos muy grandes o redes especialmente inestables. Hoy ya hay progreso, timeout y retry automatico, pero no resume chunked.
- Agregar pruebas automatizadas para OT, cotizacion, sync e IndexedDB.
- Completar manual operativo y checklist de despliegue/soporte.

## Desarrollo local (sin Docker)
```bash
# Backend
cd backend
npm install
npm run start:dev

# Frontend
cd ../frontend
npm install
npm run dev
```

## Validacion recomendada
```bash
# Backend
docker compose exec backend sh -lc "npm run typecheck && npm run build"

# Frontend typecheck, build real de produccion y lint
docker compose exec frontend sh -lc "npm run typecheck && NODE_ENV=production npm run build && npm run lint"
```

## Credenciales por defecto
- Usuario: `admin`
- Contrasena: `admin123`

## Documentacion
- Plan de implementacion: `docs/implementation_plan.md`
- OpenAPI: `docs/api/openapi.yaml`
- Sprint 3 QA playbook extendido: `docs/sprint3_qa_playbook.md`
- Sprint 3 matriz de pruebas: `docs/sprint3_test_matrix.csv`

---
Sistema listo para seguir endureciendose como operacion real. El siguiente frente util es conectar stock real del ERP al filtro de cotizacion y cerrar la cobertura de pruebas.
