# Plan de Resolucion de GAPs - Mecanicas Diesel **Fecha:** 2025-12-12 **Proyecto:** mecanicas-diesel **Estado:** Pre-desarrollo **Responsable:** Architecture-Analyst --- ## Resumen Ejecutivo Este documento detalla el plan para resolver los 12 GAPs identificados en el analisis arquitectonico antes de iniciar el desarrollo de backend/frontend del proyecto mecanicas-diesel. ### Clasificacion de GAPs | Criticidad | Cantidad | Descripcion | |------------|----------|-------------| | **CRITICA (P0)** | 3 | Bloquean desarrollo, deben resolverse primero | | **ALTA (P1)** | 5 | Importantes para MVP completo | | **MEDIA (P2)** | 3 | Mejoras significativas | | **BAJA (P3)** | 1 | Opcionales/simplificadas | --- ## GAPs Criticos (P0) - Semana 1 ### GAP-01: Sistema de Tracking de Cambios (mail.thread) **Problema:** No existe sistema automatico de auditoria/tracking de cambios en documentos (ordenes, cotizaciones, diagnosticos). **Impacto:** - Pierde historial de modificaciones - No hay trazabilidad de quien cambio que - No cumple con auditorias **Solucion:** Implementar patron mail.thread de Odoo adaptado **SPEC de Referencia:** `erp-core/docs/04-modelado/especificaciones-tecnicas/transversal/SPEC-MAIL-THREAD-TRACKING.md` **Acciones:** 1. Crear schema `notifications` en mecanicas-diesel 2. Crear tablas: - `notifications.messages` - Mensajes y tracking - `notifications.message_subtypes` - Tipos de mensaje - `notifications.tracking_values` - Valores trackeados 3. Implementar decorator `@Tracked` para campos 4. Agregar tracking a tablas criticas: - `service_management.service_orders` - `service_management.quotes` - `service_management.diagnostics` **DDL Requerido:** ```sql -- Schema de notificaciones CREATE SCHEMA IF NOT EXISTS notifications; -- Tabla de mensajes (chatter) CREATE TABLE notifications.messages ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id UUID NOT NULL, res_model VARCHAR(100) NOT NULL, res_id UUID NOT NULL, message_type VARCHAR(20) NOT NULL DEFAULT 'notification', subtype_code VARCHAR(50), author_id UUID, subject VARCHAR(500), body TEXT, tracking_values JSONB DEFAULT '[]', is_internal BOOLEAN NOT NULL DEFAULT false, parent_id UUID REFERENCES notifications.messages(id), created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), CONSTRAINT chk_message_type CHECK (message_type IN ('comment', 'notification', 'note')) ); -- Indices CREATE INDEX idx_messages_resource ON notifications.messages(res_model, res_id); CREATE INDEX idx_messages_tenant ON notifications.messages(tenant_id); CREATE INDEX idx_messages_created ON notifications.messages(created_at DESC); ``` **Esfuerzo:** 8 horas **Entregable:** DDL + Documentacion --- ### GAP-02: Sistema de Followers/Suscriptores **Problema:** No hay manera de suscribirse a documentos para recibir notificaciones automaticas. **Impacto:** - Usuarios no se enteran de cambios importantes - Comunicacion manual requerida - Pierde eficiencia operativa **Solucion:** Implementar sistema de followers **SPEC de Referencia:** `SPEC-MAIL-THREAD-TRACKING.md` (seccion Followers) **Acciones:** 1. Crear tabla `notifications.followers` 2. Crear tabla `notifications.follower_subtypes` 3. Implementar auto-suscripcion: - Mecanico asignado sigue su orden - Cliente sigue sus cotizaciones - Jefe de taller sigue ordenes de su bahia **DDL Requerido:** ```sql -- Seguidores de documentos CREATE TABLE notifications.followers ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id UUID NOT NULL, res_model VARCHAR(100) NOT NULL, res_id UUID NOT NULL, partner_id UUID NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), UNIQUE(tenant_id, res_model, res_id, partner_id) ); -- Suscripciones a tipos de mensaje CREATE TABLE notifications.follower_subtypes ( follower_id UUID NOT NULL REFERENCES notifications.followers(id) ON DELETE CASCADE, subtype_code VARCHAR(50) NOT NULL, PRIMARY KEY (follower_id, subtype_code) ); CREATE INDEX idx_followers_resource ON notifications.followers(res_model, res_id); CREATE INDEX idx_followers_partner ON notifications.followers(partner_id); ``` **Esfuerzo:** 4 horas **Entregable:** DDL + Documentacion --- ### GAP-03: Actividades Programadas **Problema:** No hay sistema de recordatorios/actividades asociadas a documentos. **Impacto:** - No hay seguimiento de llamadas pendientes - No hay recordatorios de mantenimientos - Clientes olvidados **Solucion:** Implementar sistema de actividades (mail.activity) **SPEC de Referencia:** `SPEC-MAIL-THREAD-TRACKING.md` (seccion Activities) **Acciones:** 1. Crear tabla `notifications.activities` 2. Crear tabla `notifications.activity_types` 3. Configurar tipos predeterminados: - `call` - Llamar al cliente - `meeting` - Cita de entrega - `todo` - Tarea pendiente - `reminder` - Recordatorio de mantenimiento **DDL Requerido:** ```sql -- Tipos de actividad CREATE TABLE notifications.activity_types ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), code VARCHAR(50) NOT NULL UNIQUE, name VARCHAR(100) NOT NULL, icon VARCHAR(50) DEFAULT 'fa-tasks', default_days INTEGER DEFAULT 0, is_active BOOLEAN NOT NULL DEFAULT true, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); -- Actividades programadas CREATE TABLE notifications.activities ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id UUID NOT NULL, res_model VARCHAR(100) NOT NULL, res_id UUID NOT NULL, activity_type_id UUID NOT NULL REFERENCES notifications.activity_types(id), user_id UUID NOT NULL, date_deadline DATE NOT NULL, summary VARCHAR(500), note TEXT, state VARCHAR(20) NOT NULL DEFAULT 'planned', date_done TIMESTAMPTZ, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), created_by UUID NOT NULL, CONSTRAINT chk_activity_state CHECK (state IN ('planned', 'today', 'overdue', 'done', 'canceled')) ); -- Seed de tipos predeterminados INSERT INTO notifications.activity_types (code, name, icon, default_days) VALUES ('call', 'Llamar cliente', 'fa-phone', 0), ('meeting', 'Cita de entrega', 'fa-calendar', 0), ('todo', 'Tarea pendiente', 'fa-tasks', 1), ('reminder', 'Recordatorio mantenimiento', 'fa-bell', 30), ('followup', 'Seguimiento cotizacion', 'fa-envelope', 3); CREATE INDEX idx_activities_resource ON notifications.activities(res_model, res_id); CREATE INDEX idx_activities_user ON notifications.activities(user_id); CREATE INDEX idx_activities_deadline ON notifications.activities(date_deadline); CREATE INDEX idx_activities_state ON notifications.activities(state) WHERE state NOT IN ('done', 'canceled'); ``` **Esfuerzo:** 4 horas **Entregable:** DDL + Documentacion + Seed --- ## GAPs Alta Prioridad (P1) - Semana 2-3 ### GAP-04: Facturacion Integrada (MMD-007) **Problema:** No hay modulo de facturacion, no se generan asientos contables. **Impacto:** - No hay CFDI - Proceso de facturacion manual - Sin integracion contable **Solucion:** Documentar e implementar MMD-007 **SPEC de Referencia:** - `SPEC-FIRMA-ELECTRONICA-NOM151.md` (para CFDI) - `erp-core/docs/02-definicion-modulos/ALCANCE-POR-MODULO.md` (MGN-004) **Acciones:** 1. Crear documentacion de EPIC-MMD-007-facturacion.md 2. Crear documentacion de modulo MMD-007 3. Definir historias de usuario (8-10 US) 4. Disenar schema `billing` 5. Integrar con PAC para timbrado **Fases:** - Fase 2a: Pre-factura desde orden de servicio - Fase 2b: Timbrado CFDI con PAC - Fase 2c: Reportes de facturacion **Esfuerzo:** 40 horas (distribuido en Fase 2) **Entregable:** Documentacion completa + DDL --- ### GAP-05: Contabilidad Analitica **Problema:** No hay P&L por orden de servicio, no se puede medir rentabilidad. **Impacto:** - No se sabe cuanto gana o pierde por orden - No hay control de costos por servicio - Decisiones sin datos financieros **Solucion:** Implementar cuentas analiticas simplificadas **SPEC de Referencia:** `SPEC-CONTABILIDAD-ANALITICA-MULTIDIMENSIONAL.md` **Acciones:** 1. Agregar `analytic_account_id` a `service_orders` 2. Crear tabla `analytics.accounts` simplificada 3. Crear tabla `analytics.lines` para costos/ingresos 4. Generar lineas automaticas al: - Usar refacciones (costo) - Facturar (ingreso) - Registrar mano de obra (costo) **DDL Requerido:** ```sql CREATE SCHEMA IF NOT EXISTS analytics; CREATE TABLE analytics.accounts ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id UUID NOT NULL, code VARCHAR(20) NOT NULL, name VARCHAR(100) NOT NULL, account_type VARCHAR(20) NOT NULL DEFAULT 'service_order', service_order_id UUID, is_active BOOLEAN NOT NULL DEFAULT true, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), UNIQUE(tenant_id, code) ); CREATE TABLE analytics.lines ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id UUID NOT NULL, account_id UUID NOT NULL REFERENCES analytics.accounts(id), date DATE NOT NULL, name VARCHAR(256), amount DECIMAL(20,6) NOT NULL, unit_amount DECIMAL(20,6), ref VARCHAR(100), source_model VARCHAR(100), source_id UUID, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); CREATE INDEX idx_analytics_lines_account ON analytics.lines(account_id); CREATE INDEX idx_analytics_lines_date ON analytics.lines(date); ``` **Esfuerzo:** 16 horas **Entregable:** DDL + Documentacion --- ### GAP-06: Portal de Clientes **Problema:** Cliente no puede ver el avance de su vehiculo en linea. **Impacto:** - Llamadas constantes preguntando estado - Menor satisfaccion del cliente - Proceso ineficiente **Solucion:** Implementar portal basico para clientes **SPEC de Referencia:** `ALCANCE-POR-MODULO.md` (MGN-013) **Acciones:** 1. Documentar MMD-Portal en Fase 2 2. Crear rol `portal_cliente` 3. Implementar vistas de solo lectura: - Mis vehiculos - Mis ordenes de servicio - Estado actual - Cotizaciones pendientes de aprobar 4. Implementar aprobacion online de cotizaciones **Esfuerzo:** 32 horas (Fase 2) **Entregable:** Documentacion + DDL permisos --- ### GAP-09: Compras con RFQ Completo **Problema:** Solo hay recepciones, no hay ordenes de compra ni solicitudes de cotizacion. **Impacto:** - No hay control de compras - No hay historial de proveedores - No hay aprobaciones de compra **Solucion:** Implementar modulo de compras simplificado **SPEC de Referencia:** `ALCANCE-POR-MODULO.md` (MGN-006) **Acciones:** 1. Crear schema `purchasing` 2. Crear tablas: - `purchasing.purchase_orders` - `purchasing.purchase_order_lines` - `purchasing.suppliers` (o usar partners existentes) 3. Integrar con recepciones de inventario **DDL Requerido:** ```sql CREATE SCHEMA IF NOT EXISTS purchasing; CREATE TABLE purchasing.purchase_orders ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id UUID NOT NULL, order_number VARCHAR(50) NOT NULL, supplier_id UUID NOT NULL, status VARCHAR(20) NOT NULL DEFAULT 'draft', order_date DATE NOT NULL DEFAULT CURRENT_DATE, expected_date DATE, subtotal DECIMAL(20,6) NOT NULL DEFAULT 0, tax_amount DECIMAL(20,6) NOT NULL DEFAULT 0, total DECIMAL(20,6) NOT NULL DEFAULT 0, notes TEXT, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), created_by UUID NOT NULL, CONSTRAINT chk_po_status CHECK (status IN ('draft', 'sent', 'confirmed', 'received', 'cancelled')) ); CREATE TABLE purchasing.purchase_order_lines ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), purchase_order_id UUID NOT NULL REFERENCES purchasing.purchase_orders(id) ON DELETE CASCADE, part_id UUID NOT NULL, quantity DECIMAL(20,6) NOT NULL, unit_price DECIMAL(20,6) NOT NULL, subtotal DECIMAL(20,6) NOT NULL, received_quantity DECIMAL(20,6) NOT NULL DEFAULT 0, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); CREATE INDEX idx_po_tenant ON purchasing.purchase_orders(tenant_id); CREATE INDEX idx_po_supplier ON purchasing.purchase_orders(supplier_id); CREATE INDEX idx_po_status ON purchasing.purchase_orders(status); ``` **Esfuerzo:** 24 horas **Entregable:** DDL + Documentacion --- ### GAP-10: Reporte de Garantias **Problema:** No hay tracking formal de garantias de refacciones usadas. **Impacto:** - No se sabe cuales piezas estan en garantia - Perdida de dinero por no reclamar garantias - Sin historial para cliente **Solucion:** Agregar tracking de garantias **Acciones:** 1. Agregar campos de garantia a `parts_management.parts`: - `warranty_months` - `warranty_policy` 2. Crear tabla `parts_management.warranty_claims` 3. Crear vista de piezas en garantia **DDL Requerido:** ```sql -- Ajuste a parts (si no existe) ALTER TABLE parts_management.parts ADD COLUMN IF NOT EXISTS warranty_months INTEGER DEFAULT 0; -- Claims de garantia CREATE TABLE parts_management.warranty_claims ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id UUID NOT NULL, part_id UUID NOT NULL, service_order_id UUID, serial_number VARCHAR(100), installation_date DATE NOT NULL, expiration_date DATE NOT NULL, claim_date DATE, claim_status VARCHAR(20) DEFAULT 'active', claim_notes TEXT, resolution TEXT, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), CONSTRAINT chk_warranty_status CHECK (claim_status IN ('active', 'claimed', 'approved', 'rejected', 'expired')) ); -- Vista de garantias activas CREATE VIEW parts_management.v_active_warranties AS SELECT wc.*, p.sku, p.name as part_name, so.order_number, c.name as customer_name FROM parts_management.warranty_claims wc JOIN parts_management.parts p ON p.id = wc.part_id LEFT JOIN service_management.service_orders so ON so.id = wc.service_order_id LEFT JOIN workshop_core.customers c ON c.id = so.customer_id WHERE wc.claim_status = 'active' AND wc.expiration_date >= CURRENT_DATE; ``` **Esfuerzo:** 8 horas **Entregable:** DDL + Vista --- ## GAPs Media Prioridad (P2) - Semana 4+ ### GAP-07: Integracion Calendario **Problema:** No hay agendamiento de citas de servicio. **Impacto:** - No se pueden programar citas - Overbooking de bahias - Sin vista de calendario **Solucion:** Integrar con sistema de calendario (opcional) **SPEC de Referencia:** `SPEC-INTEGRACION-CALENDAR.md` **Acciones:** 1. Evaluar necesidad real del taller 2. Si se requiere: - Crear tabla `scheduling.appointments` - Integrar con bahias de trabajo - Vista de calendario por bahia **Esfuerzo:** 8 horas (si se requiere) **Entregable:** Evaluacion + DDL opcional --- ### GAP-08: Pricing Rules Avanzado **Problema:** No hay descuentos escalonados ni reglas de precios complejas. **Impacto:** - Precios manuales - Sin descuentos por volumen - Sin promociones **Solucion:** Implementar pricing basico **SPEC de Referencia:** `SPEC-PRICING-RULES.md` **Acciones:** 1. Evaluar necesidad (talleres normalmente tienen precios fijos) 2. Si se requiere: - Crear tabla `pricing.pricelists` - Crear tabla `pricing.pricelist_items` - Integrar con cotizaciones **Esfuerzo:** 16 horas (si se requiere) **Entregable:** Evaluacion + DDL opcional --- ### GAP-12: Firma Electronica **Problema:** Aprobacion de cotizaciones sin firma legal. **Impacto:** - Sin respaldo legal - Disputas de aprobacion - Proceso informal **Solucion:** Implementar firma basica **SPEC de Referencia:** `SPEC-FIRMA-ELECTRONICA-NOM151.md` **Acciones:** 1. Para MVP: Firma canvas simple (HTML5) 2. Agregar campos a cotizaciones: - `signature_data` (base64) - `signed_at` - `signed_by_ip` 3. Para Fase 2+: Evaluar NOM-151 completa **DDL Requerido:** ```sql -- Agregar campos de firma a cotizaciones ALTER TABLE service_management.quotes ADD COLUMN IF NOT EXISTS signature_data TEXT, ADD COLUMN IF NOT EXISTS signed_at TIMESTAMPTZ, ADD COLUMN IF NOT EXISTS signed_by_ip VARCHAR(45), ADD COLUMN IF NOT EXISTS signed_by_name VARCHAR(256); ``` **Esfuerzo:** 8 horas (firma basica) **Entregable:** DDL + Documentacion --- ## GAPs Baja Prioridad (P3) - Post-MVP ### GAP-11: Contratos de Empleados **Problema:** Empleados (mecanicos) sin gestion de contratos formal. **Impacto:** - Sin historial laboral - Sin control de documentos - Riesgo legal **Solucion:** Simplificado para taller **Decision:** Para MVP, mantener simplificado con campos basicos en `users`. Implementar HR completo en Fase 3 si el taller lo requiere. **Esfuerzo:** 0 horas (mantener simplificado) **Entregable:** N/A --- ## Cronograma de Implementacion ``` SEMANA 1 (Gaps Criticos P0) ├── Dia 1-2: GAP-01 Sistema de tracking (8h) ├── Dia 3: GAP-02 Followers (4h) ├── Dia 4: GAP-03 Actividades (4h) └── Dia 5: Pruebas y documentacion SEMANA 2 (Gaps P1 - Parte 1) ├── Dia 1-2: GAP-05 Contabilidad analitica (16h) └── Dia 3-5: GAP-10 Garantias (8h) + Documentacion GAP-04 SEMANA 3 (Gaps P1 - Parte 2) ├── Dia 1-3: GAP-09 Compras basico (24h) └── Dia 4-5: GAP-12 Firma basica (8h) SEMANA 4+ (Evaluacion Gaps P2) ├── GAP-07 Calendario - Evaluar necesidad ├── GAP-08 Pricing - Evaluar necesidad └── Documentacion GAP-04/GAP-06 para Fase 2 ``` --- ## Entregables por Semana ### Semana 1 - [ ] `database/init/07-notifications-schema.sql` - [ ] `docs/03-modelo-datos/SCHEMA-NOTIFICATIONS.md` - [ ] Actualizacion de `PROJECT-STATUS.md` ### Semana 2 - [ ] `database/init/08-analytics-schema.sql` - [ ] `docs/03-modelo-datos/SCHEMA-ANALYTICS.md` - [ ] `docs/02-definicion-modulos/MMD-007-facturacion/README.md` (estructura) ### Semana 3 - [ ] `database/init/09-purchasing-schema.sql` - [ ] `docs/03-modelo-datos/SCHEMA-PURCHASING.md` - [ ] Actualizacion DDL cotizaciones (firma) ### Semana 4 - [ ] Evaluacion y decision de Gaps P2 - [ ] Documentacion completa para desarrollo --- ## Metricas de Exito | Metrica | Objetivo | Validacion | |---------|----------|------------| | Gaps P0 resueltos | 3/3 | DDL ejecutable | | Gaps P1 documentados | 5/5 | Documentacion completa | | DDL sin errores | 100% | Scripts de validacion | | Cobertura documentacion | 100% | Review | --- ## Riesgos y Mitigaciones | Riesgo | Probabilidad | Impacto | Mitigacion | |--------|--------------|---------|------------| | Complejidad tracking | Media | Alto | Usar SPEC existente de erp-core | | Integracion con existente | Baja | Medio | Probar incrementalmente | | Cambios de alcance | Media | Medio | Documentar decisiones | --- ## Aprobaciones - [ ] **Product Owner:** Aprobacion de priorizacion - [ ] **Tech Lead:** Revision tecnica de DDL - [ ] **QA:** Plan de validacion --- ## Estado de Implementacion | GAP | DDL Creado | Fecha | |-----|------------|-------| | GAP-01 | 07-notifications-schema.sql | 2025-12-12 | | GAP-02 | 07-notifications-schema.sql | 2025-12-12 | | GAP-03 | 07-notifications-schema.sql | 2025-12-12 | | GAP-04 | Fase 2 (documentado) | - | | GAP-05 | 08-analytics-schema.sql | 2025-12-12 | | GAP-06 | Fase 2 (documentado) | - | | GAP-07 | Evaluado - Opcional | - | | GAP-08 | Evaluado - Opcional | - | | GAP-09 | 09-purchasing-schema.sql | 2025-12-12 | | GAP-10 | 10-warranty-claims.sql | 2025-12-12 | | GAP-11 | Simplificado (Post-MVP) | - | | GAP-12 | 11-quote-signature.sql | 2025-12-12 | --- **Documento creado por:** Architecture-Analyst **Fecha:** 2025-12-12 **Version:** 1.1.0 **Estado:** IMPLEMENTADO - DDL creados