511 lines
16 KiB
Markdown
511 lines
16 KiB
Markdown
# 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:
|
|
```sql
|
|
-- Analitica
|
|
analytic_account_id UUID REFERENCES analytics.analytic_accounts(id), -- Distribucion analitica
|
|
```
|
|
|
|
**Linea 330** - Agregado indice:
|
|
```sql
|
|
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:
|
|
```sql
|
|
-- Analitica
|
|
analytic_account_id UUID REFERENCES analytics.analytic_accounts(id), -- Distribucion analitica
|
|
```
|
|
|
|
**Linea 367** - Agregado indice:
|
|
```sql
|
|
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:
|
|
```sql
|
|
-- Analitica
|
|
analytic_account_id UUID REFERENCES analytics.analytic_accounts(id), -- Distribucion analitica
|
|
```
|
|
|
|
**Linea 445** - Agregado indice:
|
|
```sql
|
|
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:
|
|
```sql
|
|
-- 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:
|
|
```sql
|
|
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)":**
|
|
```prisma
|
|
model PurchaseOrderLine {
|
|
// ... campos existentes ...
|
|
|
|
// Analitica
|
|
analyticAccountId String? @map("analytic_account_id")
|
|
analyticAccount AnalyticAccount? @relation(fields: [analyticAccountId], references: [id])
|
|
|
|
// ... resto ...
|
|
}
|
|
```
|
|
|
|
2. **Actualizar DTOs:**
|
|
```typescript
|
|
export class CreatePurchaseOrderLineDto {
|
|
// ... campos existentes ...
|
|
|
|
@IsUUID()
|
|
@IsOptional()
|
|
analyticAccountId?: string;
|
|
|
|
// ... resto ...
|
|
}
|
|
```
|
|
|
|
3. **Actualizar Response DTOs:**
|
|
```typescript
|
|
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:**
|
|
```typescript
|
|
export interface PurchaseOrderLine {
|
|
// ... campos existentes ...
|
|
analyticAccountId?: string;
|
|
analyticAccount?: AnalyticAccountSummary;
|
|
}
|
|
```
|
|
|
|
2. **Schemas Zod:**
|
|
```typescript
|
|
const purchaseOrderLineSchema = z.object({
|
|
// ... campos existentes ...
|
|
analyticAccountId: z.string().uuid().optional(),
|
|
});
|
|
```
|
|
|
|
3. **Formularios:**
|
|
```tsx
|
|
<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):**
|
|
```markdown
|
|
### 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):**
|
|
```markdown
|
|
### 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):**
|
|
```markdown
|
|
### 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):**
|
|
```markdown
|
|
### 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:**
|
|
|
|
```markdown
|
|
### 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:**
|
|
|
|
```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
|
|
|
|
- [x] Campo `analytic_account_id` agregado a `inventory.stock_moves`
|
|
- [x] Campo `analytic_account_id` agregado a `projects.timesheets`
|
|
- [x] Foreign Key constraints agregadas/corregidas en todas las tablas
|
|
- [x] 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)
|