FASE 3: Plan de Correcciones Basado en Analisis Odoo vs ERP-Core
Fecha: 2026-01-04
Objetivo: Plan priorizado de correcciones para alinear ERP-Core con definiciones Odoo
Estado: En Progreso
Basado en: FASE-1 (Planeacion), FASE-2 (Analisis Detallado)
1. Resumen Ejecutivo de Brechas
1.1 Cobertura por Modulo
| Modulo |
Cobertura |
Gaps Criticos |
Gaps Altos |
Gaps Medios |
| BASE/AUTH |
75% |
3 |
4 |
5 |
| PRODUCT/STOCK |
65% |
4 |
5 |
6 |
| SALE |
70% |
2 |
4 |
3 |
| PURCHASE |
70% |
2 |
3 |
4 |
| ACCOUNT/FINANCIAL |
65% |
4 |
5 |
4 |
| CRM |
75% |
2 |
3 |
3 |
| ANALYTIC |
65% |
2 |
2 |
2 |
| PROJECT |
80% |
2 |
2 |
3 |
| HR |
70% |
1 |
3 |
4 |
1.2 Total de Correcciones Identificadas
| Severidad |
Cantidad |
% del Total |
| CRITICO |
22 |
18% |
| ALTO |
31 |
26% |
| MEDIO |
34 |
28% |
| BAJO |
34 |
28% |
| TOTAL |
121 |
100% |
2. Plan de Correcciones por Prioridad
2.1 PRIORIDAD CRITICA (P0) - Bloqueantes
COR-001: Agregar estado 'to_approve' a Purchase Orders
- Archivo DDL:
database/ddl/06-purchase.sql
- Cambio: Modificar ENUM
purchase.order_status
- De:
('draft', 'sent', 'confirmed', 'received', 'billed', 'cancelled')
- A:
('draft', 'sent', 'to_approve', 'purchase', 'received', 'billed', 'cancelled')
- Impacto: Functions, Triggers, Domain Models
- Dependencias: None
COR-002: Agregar estados faltantes a Stock Moves
- Archivo DDL:
database/ddl/05-inventory.sql
- Cambio: Modificar ENUM
inventory.move_status
- De:
('draft', 'confirmed', 'assigned', 'done', 'cancelled')
- A:
('draft', 'waiting', 'confirmed', 'partially_available', 'assigned', 'done', 'cancelled')
- Impacto: stock_moves, pickings, Functions
- Dependencias: None
COR-003: Crear tabla stock_move_lines
- Archivo DDL:
database/ddl/05-inventory.sql
- Cambio: Nueva tabla para granularidad a nivel de lote/serie
- Estructura:
CREATE TABLE inventory.stock_move_lines (
id UUID PRIMARY KEY,
tenant_id UUID NOT NULL,
move_id UUID NOT NULL REFERENCES inventory.stock_moves(id),
product_id UUID NOT NULL,
product_uom_id UUID NOT NULL,
lot_id UUID REFERENCES inventory.lots(id),
package_id UUID,
owner_id UUID REFERENCES core.partners(id),
location_id UUID NOT NULL,
location_dest_id UUID NOT NULL,
quantity DECIMAL(12, 4) NOT NULL,
quantity_done DECIMAL(12, 4) DEFAULT 0,
state VARCHAR(20),
-- Audit fields
);
- Impacto: stock_moves, reserve_quantity(), process_stock_move()
- Dependencias: COR-002
COR-004: Agregar payment_state a Facturas
- Archivo DDL:
database/ddl/04-financial.sql
- Cambio: Nueva columna para separar estado contable de estado de pago
- De: Solo
status (draft, open, paid, cancelled)
- A:
status + payment_state (not_paid, in_payment, paid, partial, reversed)
- Impacto: invoices, payment_invoice, triggers
- Dependencias: None
COR-005: Implementar Tax Groups
- Archivo DDL:
database/ddl/04-financial.sql
- Cambio: Nueva tabla para grupos de impuestos complejos
- Estructura:
CREATE TABLE financial.tax_groups (
id UUID PRIMARY KEY,
tenant_id UUID NOT NULL,
name VARCHAR(100) NOT NULL,
sequence INTEGER DEFAULT 10,
country_id UUID
);
ALTER TABLE financial.taxes
ADD COLUMN tax_group_id UUID REFERENCES financial.tax_groups(id),
ADD COLUMN amount_type VARCHAR(20) DEFAULT 'percent', -- percent, fixed, group, division
ADD COLUMN include_base_amount BOOLEAN DEFAULT FALSE,
ADD COLUMN price_include BOOLEAN DEFAULT FALSE,
ADD COLUMN children_tax_ids UUID[];
- Impacto: Calculo de impuestos en invoice_lines, sales_order_lines, purchase_order_lines
- Dependencias: None
COR-006: Vincular Sale Orders con Invoices
- Archivo DDL:
database/ddl/07-sales.sql
- Cambio: Agregar campos para vinculacion factura
- Estructura:
ALTER TABLE sales.sales_orders
ADD COLUMN invoice_ids UUID[] DEFAULT '{}',
ADD COLUMN invoice_count INTEGER GENERATED ALWAYS AS (array_length(invoice_ids, 1)) STORED;
- Impacto: sales_orders, invoices, workflows
- Dependencias: None
2.2 PRIORIDAD ALTA (P1) - Importantes
COR-007: Agregar picking_type_id a Pickings
- Archivo DDL:
database/ddl/05-inventory.sql
- Cambio: Nueva tabla y campo para tipos de operacion
- Estructura:
CREATE TABLE inventory.picking_types (
id UUID PRIMARY KEY,
tenant_id UUID NOT NULL,
warehouse_id UUID REFERENCES inventory.warehouses(id),
name VARCHAR(100) NOT NULL,
code VARCHAR(20) NOT NULL, -- incoming, outgoing, internal
sequence_id UUID,
default_location_src_id UUID,
default_location_dest_id UUID,
return_picking_type_id UUID,
show_operations BOOLEAN DEFAULT FALSE,
show_reserved BOOLEAN DEFAULT TRUE,
active BOOLEAN DEFAULT TRUE
);
ALTER TABLE inventory.pickings
ADD COLUMN picking_type_id UUID REFERENCES inventory.picking_types(id);
- Impacto: pickings, workflows
- Dependencias: None
COR-008: Implementar Product Attributes System
- Archivo DDL:
database/ddl/05-inventory.sql
- Cambio: Sistema completo de atributos y variantes
- Estructura:
CREATE TABLE inventory.product_attributes (
id UUID PRIMARY KEY,
tenant_id UUID NOT NULL,
name VARCHAR(100) NOT NULL,
create_variant VARCHAR(20) DEFAULT 'always', -- always, dynamic, no_variant
display_type VARCHAR(20) DEFAULT 'radio' -- radio, select, color, multi
);
CREATE TABLE inventory.product_attribute_values (
id UUID PRIMARY KEY,
attribute_id UUID NOT NULL REFERENCES inventory.product_attributes(id),
name VARCHAR(100) NOT NULL,
html_color VARCHAR(10),
sequence INTEGER DEFAULT 10
);
CREATE TABLE inventory.product_template_attribute_lines (
id UUID PRIMARY KEY,
product_tmpl_id UUID NOT NULL REFERENCES inventory.products(id),
attribute_id UUID NOT NULL REFERENCES inventory.product_attributes(id),
value_ids UUID[] NOT NULL
);
- Impacto: products, product_variants
- Dependencias: None
COR-009: Agregar Approval Workflow a Purchase
- Archivo DDL:
database/ddl/06-purchase.sql
- Cambio: Campos y funciones para flujo de aprobacion
- Estructura:
ALTER TABLE purchase.purchase_orders
ADD COLUMN approved_at TIMESTAMP,
ADD COLUMN approved_by UUID REFERENCES auth.users(id),
ADD COLUMN approval_required BOOLEAN DEFAULT FALSE,
ADD COLUMN amount_threshold DECIMAL(15, 2);
CREATE OR REPLACE FUNCTION purchase.button_approve(p_order_id UUID)
RETURNS VOID AS $$...$$;
- Impacto: purchase_orders, rbac
- Dependencias: COR-001
COR-010: Implementar Address Management
- Archivo DDL:
database/ddl/02-core.sql
- Cambio: Direcciones de facturacion y envio separadas
- Estructura:
ALTER TABLE sales.sales_orders
ADD COLUMN partner_invoice_id UUID REFERENCES core.partners(id),
ADD COLUMN partner_shipping_id UUID REFERENCES core.partners(id);
ALTER TABLE purchase.purchase_orders
ADD COLUMN dest_address_id UUID REFERENCES core.partners(id);
- Impacto: sales_orders, purchase_orders, partners
- Dependencias: None
COR-011: Agregar Locked State a Orders
- Archivo DDL:
database/ddl/06-purchase.sql, database/ddl/07-sales.sql
- Cambio: Campo locked para bloquear modificaciones
- Estructura:
ALTER TABLE purchase.purchase_orders
ADD COLUMN locked BOOLEAN DEFAULT FALSE;
ALTER TABLE sales.sales_orders
ADD COLUMN locked BOOLEAN DEFAULT FALSE;
- Impacto: Triggers de validacion
- Dependencias: None
COR-012: Implementar Downpayments (Anticipos)
- Archivo DDL:
database/ddl/07-sales.sql
- Cambio: Soporte para anticipos en ventas
- Estructura:
ALTER TABLE sales.sales_order_lines
ADD COLUMN is_downpayment BOOLEAN DEFAULT FALSE;
ALTER TABLE sales.sales_orders
ADD COLUMN require_payment BOOLEAN DEFAULT FALSE,
ADD COLUMN prepayment_percent DECIMAL(5, 2) DEFAULT 0;
- Impacto: sales_order_lines, invoice generation
- Dependencias: COR-006
COR-013: Agregar Reconciliation Engine
- Archivo DDL:
database/ddl/04-financial.sql
- Cambio: Motor de conciliacion completo
- Estructura:
CREATE TABLE financial.account_partial_reconcile (
id UUID PRIMARY KEY,
tenant_id UUID NOT NULL,
debit_move_id UUID NOT NULL REFERENCES financial.journal_entry_lines(id),
credit_move_id UUID NOT NULL REFERENCES financial.journal_entry_lines(id),
amount DECIMAL(15, 2) NOT NULL,
amount_currency DECIMAL(15, 2),
currency_id UUID,
full_reconcile_id UUID,
max_date DATE
);
CREATE TABLE financial.account_full_reconcile (
id UUID PRIMARY KEY,
name VARCHAR(100) NOT NULL,
partial_reconcile_ids UUID[],
reconciled_line_ids UUID[]
);
- Impacto: journal_entry_lines, invoices, payments
- Dependencias: COR-004
2.3 PRIORIDAD MEDIA (P2) - Mejoras
COR-014: Implementar Predictive Lead Scoring (PLS)
- Archivo DDL:
database/ddl/11-crm.sql
- Cambio: Sistema de scoring predictivo
- Impacto: leads, opportunities
- Dependencias: ML pipeline
COR-015: Agregar Multi-Plan Hierarchy (Analytics)
- Archivo DDL:
database/ddl/03-analytics.sql
- Cambio: Jerarquia de planes analiticos
- Impacto: analytic_accounts, analytic_lines
- Dependencias: None
COR-016: Implementar Recurring Tasks (Projects)
- Archivo DDL:
database/ddl/08-projects.sql
- Cambio: Tareas recurrentes
- Impacto: project_tasks
- Dependencias: None
COR-017: Agregar Multi-User Assignment (Tasks)
- Archivo DDL:
database/ddl/08-projects.sql
- Cambio: Multiples usuarios asignados
- Impacto: project_tasks
- Dependencias: None
COR-018: Implementar Backorder Management
- Archivo DDL:
database/ddl/05-inventory.sql
- Cambio: Gestion de backorders
- Impacto: pickings, stock_moves
- Dependencias: COR-002, COR-003
COR-019: Agregar Auto-Assignment Rules (CRM)
- Archivo DDL:
database/ddl/11-crm.sql
- Cambio: Reglas de asignacion automatica
- Impacto: leads, teams
- Dependencias: None
COR-020: Implementar Duplicate Detection (Partners)
- Archivo DDL:
database/ddl/02-core.sql
- Cambio: Deteccion de duplicados
- Impacto: partners
- Dependencias: None
2.4 PRIORIDAD BAJA (P3) - Nice to Have
COR-021 a COR-034: Mejoras menores documentadas en archivo separado
- Ver:
FASE-3-CORRECCIONES-MENORES.md
3. Archivos Afectados por Correccion
3.1 Matriz de Impacto DDL
| Archivo DDL |
P0 |
P1 |
P2 |
Total |
| 02-core.sql |
0 |
1 |
1 |
2 |
| 03-analytics.sql |
0 |
0 |
1 |
1 |
| 04-financial.sql |
2 |
1 |
0 |
3 |
| 05-inventory.sql |
2 |
2 |
2 |
6 |
| 06-purchase.sql |
1 |
2 |
0 |
3 |
| 07-sales.sql |
1 |
2 |
0 |
3 |
| 08-projects.sql |
0 |
0 |
2 |
2 |
| 11-crm.sql |
0 |
0 |
2 |
2 |
3.2 Matriz de Impacto Domain Models
| Domain Model |
Correcciones |
Secciones |
| inventory-domain.md |
COR-002, COR-003, COR-007, COR-008, COR-018 |
States, Relations, Constraints |
| sales-domain.md |
COR-006, COR-010, COR-011, COR-012 |
Relations, Fields |
| financial-domain.md |
COR-004, COR-005, COR-013 |
States, Tax Logic, Reconciliation |
| crm-domain.md |
COR-014, COR-019 |
Scoring, Assignment |
| analytics-domain.md |
COR-015 |
Plans, Hierarchy |
| projects-domain.md |
COR-016, COR-017 |
Recurrence, Assignment |
3.3 Matriz de Impacto Workflows
| Workflow |
Correcciones |
Impacto |
| (nuevo) WORKFLOW-PURCHASE-APPROVAL.md |
COR-001, COR-009 |
Nuevo workflow |
| (nuevo) WORKFLOW-STOCK-MOVES.md |
COR-002, COR-003, COR-018 |
Nuevo workflow |
| WORKFLOW-CIERRE-PERIODO-CONTABLE.md |
COR-004 |
Actualizacion menor |
4. Dependencias entre Correcciones
COR-001 (PO states)
└── COR-009 (Approval workflow)
COR-002 (Move states)
└── COR-003 (Move lines)
└── COR-018 (Backorders)
COR-004 (Payment state)
└── COR-013 (Reconciliation engine)
COR-006 (SO-Invoice link)
└── COR-012 (Downpayments)
5. Orden de Ejecucion Recomendado
Fase 6.1: Foundation (Semana 1)
- COR-001: PO states
- COR-002: Move states
- COR-004: Payment state
- COR-005: Tax groups
Fase 6.2: Inventory (Semana 2)
- COR-003: Move lines
- COR-007: Picking types
- COR-008: Product attributes
Fase 6.3: Sales/Purchase (Semana 3)
- COR-006: SO-Invoice link
- COR-009: Approval workflow
- COR-010: Address management
- COR-011: Locked states
- COR-012: Downpayments
Fase 6.4: Financial (Semana 4)
- COR-013: Reconciliation engine
Fase 6.5: Advanced Features (Semana 5)
- COR-014 a COR-020: Prioridad Media
6. Riesgos Identificados
| Riesgo |
Probabilidad |
Impacto |
Mitigacion |
| Breaking changes en ENUM |
Alta |
Alto |
Migracion incremental |
| Incompatibilidad de datos existentes |
Media |
Alto |
Scripts de migracion |
| Regresiones en funciones existentes |
Media |
Medio |
Tests unitarios |
| Performance en nuevas tablas |
Baja |
Medio |
Indices optimizados |
7. Entregables FASE 3
8. Proximos Pasos (FASE 4)
- Validar dependencias entre correcciones
- Verificar impacto en archivos downstream (User Stories, Backend Specs)
- Identificar tests de regresion necesarios
- Aprobar plan con stakeholders
Generado: 2026-01-04
Herramienta: Claude Code