# 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

# 2) Desarrollo
# frontend en modo dev, backend en modo dev
# frontend: http://localhost:4000
# backend:  http://localhost:3001/api/v1
docker compose 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
```

## Produccion con Docker
El frontend de Next debe correr con `FRONTEND_MODE=production`. Si se deja `development`, `next build` puede fallar o comportarse distinto al despliegue real.

```bash
# ejemplo rapido
FRONTEND_MODE=production 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 3 pasos para crear OTs.
- 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 "npx tsc --noEmit"

# Frontend typecheck
docker compose exec frontend sh -lc "npm run typecheck"

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

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

## Documentacion
- Plan de implementacion: `docs/implementation_plan.md`
- OpenAPI: `docs/api/openapi.yaml`

---
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.
