erp-core/docs/CORRECCION-GAP-001-REPORTE.md

16 KiB

REPORTE DE CORRECCION - GAP-001: Contabilidad Analitica Universal

Fecha: 2025-11-24 Ejecutado por: Database Architect Agent Gap Origen: REPORTE-REVALIDACION-TECNICA-COMPLETA.md


Resumen de Cambios

Gap corregido: Contabilidad analitica universal incompleta Impacto: CRITICO (P0) Esfuerzo real: 1 hora (correcciones DDL) Estado: COMPLETADO


Problema Identificado

El campo analytic_account_id NO estaba presente en TODAS las tablas transaccionales, violando el patron de contabilidad analitica universal de Odoo.

Antes de la correccion:

Tabla Campo analytic_account_id FK Constraint Indice
financial.invoice_lines Si Si Si
financial.journal_entry_lines Si Si Si
purchase.purchase_order_lines Si No No
sales.sales_order_lines Si No No
inventory.stock_moves NO - -
projects.timesheets NO - -

Impacto: Los reportes P&L por proyecto estarian INCOMPLETOS. No se podrian rastrear:

  • Compras directas por proyecto/departamento
  • Ventas directas por proyecto/departamento
  • Movimientos de stock por proyecto
  • Horas trabajadas (labor costs) por proyecto

Cambios Realizados

1. Schemas SQL (4 archivos modificados)

purchase-schema-ddl.sql

Lineas 126-127 - Agregado Foreign Key Constraint:

-- Analitica
analytic_account_id UUID REFERENCES analytics.analytic_accounts(id), -- Distribucion analitica

Linea 330 - Agregado indice:

CREATE INDEX idx_purchase_order_lines_analytic_account_id ON purchase.purchase_order_lines(analytic_account_id) WHERE analytic_account_id IS NOT NULL;

Impacto:

  • Campo ya existia (linea 127 antes sin FK)
  • Agregada constraint de Foreign Key
  • Agregado indice parcial para optimizar queries analiticas

sales-schema-ddl.sql

Lineas 145-146 - Agregado Foreign Key Constraint:

-- Analitica
analytic_account_id UUID REFERENCES analytics.analytic_accounts(id), -- Distribucion analitica

Linea 367 - Agregado indice:

CREATE INDEX idx_sales_order_lines_analytic_account_id ON sales.sales_order_lines(analytic_account_id) WHERE analytic_account_id IS NOT NULL;

Impacto:

  • Campo ya existia (linea 146 antes sin FK)
  • Agregada constraint de Foreign Key
  • Agregado indice parcial

inventory-schema-ddl.sql

Lineas 325-326 - Agregado campo NUEVO:

-- Analitica
analytic_account_id UUID REFERENCES analytics.analytic_accounts(id), -- Distribucion analitica

Linea 445 - Agregado indice:

CREATE INDEX idx_stock_moves_analytic_account_id ON inventory.stock_moves(analytic_account_id) WHERE analytic_account_id IS NOT NULL;

Impacto:

  • Campo NUEVO agregado
  • Foreign Key definido
  • Indice agregado
  • Permite tracking de movimientos de inventario por proyecto/departamento

projects-schema-ddl.sql

Lineas 250-252 - Agregado campo NUEVO:

-- Analitica
analytic_account_id UUID REFERENCES analytics.analytic_accounts(id), -- Distribucion analitica
analytic_line_id UUID REFERENCES analytics.analytic_lines(id), -- Linea analitica generada

Linea 347 - Agregado indice:

CREATE INDEX idx_timesheets_analytic_account_id ON projects.timesheets(analytic_account_id) WHERE analytic_account_id IS NOT NULL;

Impacto:

  • Campo NUEVO analytic_account_id agregado
  • Diferenciado de analytic_line_id existente (son campos distintos con propositos diferentes)
  • Foreign Key definido
  • Indice agregado
  • Permite tracking de horas trabajadas por proyecto/departamento

Nota importante: La tabla timesheets ahora tiene DOS campos relacionados con analitica:

  1. analytic_account_id - La cuenta analitica a la que se distribuye el timesheet (NUEVO)
  2. analytic_line_id - La linea analitica generada automaticamente en analytics.analytic_lines (YA EXISTIA)

2. Especificaciones Tecnicas Backend

NOTA: Los archivos ET-Backend encontrados son plantillas genericas autogeneradas que NO reflejan la estructura real de las tablas. Requieren personalizacion manual:

Archivos que requieren actualizacion (NO modificados en esta correccion):

  • ET-BACKEND-MGN-006-002-gestion-de-ordenes-de-compra.md
  • ET-BACKEND-MGN-007-003-gestion-de-ordenes-de-venta.md
  • ET-BACKEND-MGN-005-003-movimientos-de-stock.md
  • ET-BACKEND-MGN-011-004-timesheet-de-proyectos.md

Cambios necesarios (pendientes de implementacion manual):

Para cada ET-Backend se debe:

  1. Actualizar seccion "Modelo de Datos (Prisma Schema)":
model PurchaseOrderLine {
  // ... campos existentes ...

  // Analitica
  analyticAccountId String?   @map("analytic_account_id")
  analyticAccount   AnalyticAccount? @relation(fields: [analyticAccountId], references: [id])

  // ... resto ...
}
  1. Actualizar DTOs:
export class CreatePurchaseOrderLineDto {
  // ... campos existentes ...

  @IsUUID()
  @IsOptional()
  analyticAccountId?: string;

  // ... resto ...
}
  1. Actualizar Response DTOs:
export class PurchaseOrderLineResponseDto {
  // ... campos existentes ...
  analyticAccountId?: string;
  analyticAccount?: AnalyticAccountSummaryDto; // Si se incluye en la respuesta
  // ... resto ...
}

Razon de NO modificacion: Los archivos ET-Backend son plantillas que necesitan ser actualizadas por el equipo de desarrollo durante la implementacion real. Los DDL SQL son la fuente de verdad oficial.


3. Especificaciones Tecnicas Frontend

Estado: NO MODIFICADO (pendiente)

Archivos que requieren actualizacion:

  • Buscar archivos en /especificaciones-tecnicas/frontend/mgn-005/
  • Buscar archivos en /especificaciones-tecnicas/frontend/mgn-006/
  • Buscar archivos en /especificaciones-tecnicas/frontend/mgn-007/
  • Buscar archivos en /especificaciones-tecnicas/frontend/mgn-011/

Cambios necesarios (pendientes):

  1. Interfaces TypeScript:
export interface PurchaseOrderLine {
  // ... campos existentes ...
  analyticAccountId?: string;
  analyticAccount?: AnalyticAccountSummary;
}
  1. Schemas Zod:
const purchaseOrderLineSchema = z.object({
  // ... campos existentes ...
  analyticAccountId: z.string().uuid().optional(),
});
  1. Formularios:
<AnalyticAccountSelector
  value={form.analyticAccountId}
  onChange={(id) => form.setAnalyticAccountId(id)}
  optional={true}
  label="Cuenta Analitica"
/>

4. Requerimientos Funcionales

Estado: NO MODIFICADO (pendiente)

Archivos que requieren actualizacion:

  • RF-MGN-006-002-gestion-de-ordenes-de-compra.md
  • RF-MGN-007-003-gestion-de-ordenes-de-venta.md
  • RF-MGN-005-003-movimientos-de-stock.md
  • RF-MGN-011-004-timesheet-de-proyectos.md

Cambios necesarios (pendientes):

Agregar Regla de Negocio a cada RF:

Para Compras (RF-MGN-006-002):

### RN-X: Distribucion Analitica Opcional en Lineas de Compra

**Descripcion:** Cada linea de orden de compra puede asociarse opcionalmente a una cuenta analitica para tracking de costos por proyecto/departamento/categoria.

**Criterios:**
- El campo `analytic_account_id` es OPCIONAL
- Si se especifica, debe ser una cuenta analitica activa
- Permite reportes P&L detallados por dimension analitica
- El usuario debe tener permisos sobre la cuenta analitica seleccionada

Para Ventas (RF-MGN-007-003):

### RN-X: Distribucion Analitica Opcional en Lineas de Venta

**Descripcion:** Cada linea de orden de venta puede asociarse opcionalmente a una cuenta analitica para tracking de ingresos por proyecto/departamento/categoria.

**Criterios:**
- El campo `analytic_account_id` es OPCIONAL
- Si se especifica, debe ser una cuenta analitica activa
- Permite reportes P&L detallados por dimension analitica
- El usuario debe tener permisos sobre la cuenta analitica seleccionada

Para Inventario (RF-MGN-005-003):

### RN-X: Distribucion Analitica Opcional en Movimientos de Stock

**Descripcion:** Cada movimiento de stock puede asociarse opcionalmente a una cuenta analitica para tracking de costos de inventario por proyecto/departamento.

**Criterios:**
- El campo `analytic_account_id` es OPCIONAL
- Si se especifica, debe ser una cuenta analitica activa
- Permite tracking de consumos de material por proyecto
- Util para proyectos de construccion, obras, etc.

Para Proyectos (RF-MGN-011-004):

### RN-X: Distribucion Analitica en Timesheets

**Descripcion:** Cada entrada de timesheet puede asociarse opcionalmente a una cuenta analitica diferente al proyecto principal, permitiendo distribucion multi-dimensional de horas.

**Criterios:**
- El campo `analytic_account_id` es OPCIONAL
- Si no se especifica, se usa la cuenta analitica del proyecto por defecto
- Permite tracking de horas por sub-proyecto, fase, o categoria de trabajo
- Genera automaticamente una linea en `analytics.analytic_lines`

5. User Stories

Estado: NO MODIFICADO (pendiente)

Criterios de aceptacion a agregar a User Stories correspondientes:

### Criterios de Aceptacion

**Criterio adicional:**
- [ ] Usuario puede asignar una cuenta analitica a la linea [compra/venta/movimiento/timesheet]
- [ ] El selector de cuenta analitica muestra solo cuentas activas del tenant
- [ ] El campo es OPCIONAL y puede dejarse vacio
- [ ] Si se especifica, se valida que la cuenta exista y este activa
- [ ] Los reportes analiticos incluyen correctamente las transacciones con cuenta analitica asignada

6. Matrices de Trazabilidad

Estado: NO MODIFICADO (pendiente)

Archivos a actualizar:

  • TRACEABILITY-MGN-005.yaml
  • TRACEABILITY-MGN-006.yaml
  • TRACEABILITY-MGN-007.yaml
  • TRACEABILITY-MGN-011.yaml

Cambios necesarios en cada YAML:

database_tables:
  - name: purchase.purchase_order_lines  # (o tabla correspondiente)
    important_columns:
      - id
      - order_id
      - product_id
      - quantity
      - price_unit
      - analytic_account_id  # <-- AGREGAR
      - created_at

business_rules:
  - code: RN-MGN-006-XXX  # (codigo correspondiente)
    description: "Distribucion analitica opcional en lineas permite tracking por proyecto/departamento"
    priority: high
    implements:
      - requirement: REQ-MGN-006-002
        percentage: 100

Validacion Post-Correccion

Checklist Tecnico

  • Campo analytic_account_id agregado a inventory.stock_moves
  • Campo analytic_account_id agregado a projects.timesheets
  • Foreign Key constraints agregadas/corregidas en todas las tablas
  • Indices parciales creados para optimizar queries analiticas
  • ⚠️ DTOs Backend actualizados (PENDIENTE - templates genericos)
  • ⚠️ Interfaces TypeScript Frontend actualizadas (PENDIENTE)
  • ⚠️ Reglas de negocio documentadas en RFs (PENDIENTE)
  • ⚠️ User Stories con criterios de aceptacion correctos (PENDIENTE)
  • ⚠️ Trazabilidad YAML actualizada (PENDIENTE)

Estado Final - Base de Datos

GAP-001 CORREGIDO AL 100% EN NIVEL DATABASE

Tablas transaccionales con analytic_account_id:

Tabla Campo FK Constraint Indice Estado
financial.invoice_lines OK
financial.journal_entry_lines OK
purchase.purchase_order_lines FIXED
sales.sales_order_lines FIXED
inventory.stock_moves FIXED
projects.timesheets FIXED

Cobertura analitica: 100% (6/6 tablas transaccionales)


Impacto en Reportes

Con esta correccion, el modulo MGN-008 (Contabilidad Analitica) ahora podra generar reportes P&L completos por proyecto/departamento/categoria incluyendo:

ANTES (coverage 33%):

  • Facturas de cliente (revenue) - invoice_lines
  • Facturas de proveedor (costs) - invoice_lines
  • Compras directas (costs) - FALTABA
  • Ventas directas (revenue) - FALTABA
  • Movimientos de inventario (costs) - FALTABA
  • Horas trabajadas (labor costs) - FALTABA

DESPUES (coverage 100%):

  • Facturas de cliente (revenue) - invoice_lines
  • Facturas de proveedor (costs) - invoice_lines
  • Compras directas (costs) - purchase_order_lines ← NUEVO
  • Ventas directas (revenue) - sales_order_lines ← NUEVO
  • Movimientos de inventario (costs) - stock_moves ← NUEVO
  • Horas trabajadas (labor costs) - timesheets ← NUEVO

Ejemplo de reporte mejorado:

Proyecto "Torre A" - P&L Mes Noviembre 2025
=============================================

INGRESOS:
  Facturas clientes            $800,000  (invoice_lines)
  Ventas directas sin facturar  $200,000  (sales_order_lines)  ← NUEVO
  --------
  TOTAL INGRESOS              $1,000,000

COSTOS:
  Facturas proveedores         $300,000  (invoice_lines)
  Compras sin facturar          $100,000  (purchase_order_lines) ← NUEVO
  Consumo materiales stock       $50,000  (stock_moves)          ← NUEVO
  Horas trabajadas (labor)      $150,000  (timesheets)           ← NUEVO
  --------
  TOTAL COSTOS                  $600,000

PROFIT:                         $400,000  (40% margin)

Impacto en KPIs:

  • Margin real por proyecto (antes subestimado)
  • Labor costs accuracy (antes en 0%)
  • Material costs tracking (antes no disponible)
  • WIP (Work in Progress) calculation (ahora posible)

Proximos Pasos

Fase 1 - Documentacion (Pendiente)

  1. [COMPLETADO] Actualizar DDL SQL schemas (4 archivos)
  2. ⚠️ [PENDIENTE] Actualizar ET-Backend (4 archivos) - Requiere revision manual
  3. ⚠️ [PENDIENTE] Actualizar ET-Frontend (4+ archivos) - Requiere revision manual
  4. ⚠️ [PENDIENTE] Actualizar RFs (4 archivos) - Agregar reglas de negocio
  5. ⚠️ [PENDIENTE] Actualizar User Stories (N archivos) - Agregar criterios de aceptacion
  6. ⚠️ [PENDIENTE] Actualizar Matrices de Trazabilidad (4 YAML)

Fase 2 - Implementacion (Futuro)

  1. Crear migracion PostgreSQL para agregar campos en BD existente
  2. Actualizar Prisma schema con nuevos campos
  3. Regenerar Prisma Client
  4. Implementar DTOs Backend (NestJS)
  5. Implementar componentes Frontend (React/Vue)
  6. Crear tests unitarios y e2e
  7. Validar integracion con modulo MGN-008 (Analitica)

Fase 3 - Validacion

  1. Validar coherencia entre archivos
  2. Revisar cambios en git diff
  3. Proceder con correccion de GAP-002 (mail.thread pattern)

Archivos Modificados

Schemas SQL (4 archivos)

  • /projects/erp-generic/docs/02-modelado/database-design/schemas/purchase-schema-ddl.sql
  • /projects/erp-generic/docs/02-modelado/database-design/schemas/sales-schema-ddl.sql
  • /projects/erp-generic/docs/02-modelado/database-design/schemas/inventory-schema-ddl.sql
  • /projects/erp-generic/docs/02-modelado/database-design/schemas/projects-schema-ddl.sql

Reporte de Correccion (1 archivo NUEVO)

  • /projects/erp-generic/docs/CORRECCION-GAP-001-REPORTE.md (este archivo)

TOTAL: 5 archivos (4 modificados, 1 nuevo)


Conclusiones

Exito

GAP-001 CORREGIDO AL 100% EN NIVEL DATABASE (source of truth)

  • Todos los schemas DDL SQL estan correctos y consistentes
  • Foreign Keys definidas correctamente
  • Indices optimizados para queries analiticas
  • Cobertura de contabilidad analitica universal: 100% (6/6 tablas)

Trabajo Pendiente

⚠️ Documentacion complementaria requiere actualizacion manual:

Los archivos ET-Backend y ET-Frontend son plantillas genericas que necesitan personalizacion durante la implementacion. Los cambios realizados en los DDL SQL son la fuente de verdad oficial que guiara todas las implementaciones futuras.

Recomendacion: Priorizar la actualizacion de:

  1. Requerimientos Funcionales (RFs) - Agregar reglas de negocio
  2. User Stories (US) - Agregar criterios de aceptacion
  3. Matrices de Trazabilidad (YAML) - Mantener consistencia

Los ET-Backend/Frontend pueden actualizarse durante el sprint de implementacion usando los DDL como referencia.


Firmado: Database Architect Agent Fecha: 2025-11-24 Revision: v1.0

Estado: COMPLETADO (Database Level)