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_idagregado - ✅ Diferenciado de
analytic_line_idexistente (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:
analytic_account_id- La cuenta analitica a la que se distribuye el timesheet (NUEVO)analytic_line_id- La linea analitica generada automaticamente enanalytics.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.mdET-BACKEND-MGN-007-003-gestion-de-ordenes-de-venta.mdET-BACKEND-MGN-005-003-movimientos-de-stock.mdET-BACKEND-MGN-011-004-timesheet-de-proyectos.md
Cambios necesarios (pendientes de implementacion manual):
Para cada ET-Backend se debe:
- 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 ...
}
- Actualizar DTOs:
export class CreatePurchaseOrderLineDto {
// ... campos existentes ...
@IsUUID()
@IsOptional()
analyticAccountId?: string;
// ... resto ...
}
- 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):
- Interfaces TypeScript:
export interface PurchaseOrderLine {
// ... campos existentes ...
analyticAccountId?: string;
analyticAccount?: AnalyticAccountSummary;
}
- Schemas Zod:
const purchaseOrderLineSchema = z.object({
// ... campos existentes ...
analyticAccountId: z.string().uuid().optional(),
});
- 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.mdRF-MGN-007-003-gestion-de-ordenes-de-venta.mdRF-MGN-005-003-movimientos-de-stock.mdRF-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.yamlTRACEABILITY-MGN-006.yamlTRACEABILITY-MGN-007.yamlTRACEABILITY-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_idagregado ainventory.stock_moves - Campo
analytic_account_idagregado aprojects.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)
- ✅ [COMPLETADO] Actualizar DDL SQL schemas (4 archivos)
- ⚠️ [PENDIENTE] Actualizar ET-Backend (4 archivos) - Requiere revision manual
- ⚠️ [PENDIENTE] Actualizar ET-Frontend (4+ archivos) - Requiere revision manual
- ⚠️ [PENDIENTE] Actualizar RFs (4 archivos) - Agregar reglas de negocio
- ⚠️ [PENDIENTE] Actualizar User Stories (N archivos) - Agregar criterios de aceptacion
- ⚠️ [PENDIENTE] Actualizar Matrices de Trazabilidad (4 YAML)
Fase 2 - Implementacion (Futuro)
- Crear migracion PostgreSQL para agregar campos en BD existente
- Actualizar Prisma schema con nuevos campos
- Regenerar Prisma Client
- Implementar DTOs Backend (NestJS)
- Implementar componentes Frontend (React/Vue)
- Crear tests unitarios y e2e
- Validar integracion con modulo MGN-008 (Analitica)
Fase 3 - Validacion
- Validar coherencia entre archivos
- Revisar cambios en git diff
- 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:
- Requerimientos Funcionales (RFs) - Agregar reglas de negocio
- User Stories (US) - Agregar criterios de aceptacion
- 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)