erp-core/docs/05-user-stories/ANALISIS-ODOO-VS-ERP-CORE-FINANCIERO.md
rckrdmrd 4c4e27d9ba feat: Documentation and orchestration updates
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-07 05:35:20 -06:00

1012 lines
43 KiB
Markdown

# ANALISIS COMPARATIVO EXHAUSTIVO: Odoo Account vs ERP-Core Financial
## Metadata
- **Fecha de Analisis:** 2026-01-04
- **Fuente Odoo:** `/home/isem/workspace-old/wsl-ubuntu/workspace/worskpace-inmobiliaria/shared/reference/odoo/addons/account/models/`
- **Fuente ERP-Core:** `/home/isem/workspace-v1/projects/erp-core/database/ddl/04-financial.sql`
---
# 1. INVENTARIO DE MODELOS/TABLAS
## 1.1 Modelos Odoo Account
| # | Modelo Odoo | Descripcion | Tabla SQL Equivalente |
|---|-------------|-------------|----------------------|
| 1 | account.move | Journal Entry (Asiento Contable/Factura) | journal_entries + invoices |
| 2 | account.move.line | Journal Item (Linea de Asiento) | journal_entry_lines + invoice_lines |
| 3 | account.journal | Diarios Contables | journals |
| 4 | account.journal.group | Grupos de Diarios | NO EXISTE |
| 5 | account.account | Cuentas Contables | accounts |
| 6 | account.account.tag | Etiquetas de Cuentas | NO EXISTE |
| 7 | account.group | Grupos de Cuentas | NO EXISTE |
| 8 | account.root | Raiz de Cuentas | NO EXISTE |
| 9 | account.tax | Impuestos | taxes |
| 10 | account.tax.group | Grupos de Impuestos | tax_groups |
| 11 | account.tax.repartition.line | Distribucion de Impuestos | NO EXISTE |
| 12 | account.payment | Pagos | payments |
| 13 | account.payment.term | Terminos de Pago | payment_terms |
| 14 | account.payment.term.line | Lineas de Terminos de Pago | NO EXISTE (JSONB) |
| 15 | account.payment.method | Metodos de Pago | NO EXISTE (ENUM) |
| 16 | account.payment.method.line | Lineas de Metodos de Pago | NO EXISTE |
| 17 | account.bank.statement | Extractos Bancarios | NO EXISTE |
| 18 | account.bank.statement.line | Lineas de Extractos | NO EXISTE |
| 19 | account.partial.reconcile | Conciliacion Parcial | account_partial_reconcile |
| 20 | account.full.reconcile | Conciliacion Completa | account_full_reconcile |
| 21 | account.reconcile.model | Modelos de Conciliacion | NO EXISTE |
| 22 | account.reconcile.model.line | Lineas de Modelos de Conciliacion | NO EXISTE |
| 23 | account.fiscal.position | Posiciones Fiscales | NO EXISTE |
| 24 | account.fiscal.position.tax | Mapeo de Impuestos Fiscales | NO EXISTE |
| 25 | account.fiscal.position.account | Mapeo de Cuentas Fiscales | NO EXISTE |
| 26 | account.cash.rounding | Redondeo de Efectivo | NO EXISTE |
| 27 | account.incoterms | Incoterms | NO EXISTE |
| 28 | account.analytic.account | Cuentas Analiticas | NO EXISTE |
| 29 | account.analytic.line | Lineas Analiticas | NO EXISTE |
| 30 | account.analytic.plan | Planes Analiticos | NO EXISTE |
## 1.2 Tablas ERP-Core Financial
| # | Tabla ERP-Core | Descripcion | Modelo Odoo Equivalente |
|---|----------------|-------------|------------------------|
| 1 | financial.account_types | Tipos de Cuentas | PARCIAL - fields.Selection en account.account |
| 2 | financial.accounts | Plan de Cuentas | account.account |
| 3 | financial.journals | Diarios | account.journal |
| 4 | financial.fiscal_years | Anos Fiscales | NO EXISTE EN ODOO BASE |
| 5 | financial.fiscal_periods | Periodos Fiscales | NO EXISTE EN ODOO BASE |
| 6 | financial.journal_entries | Asientos | account.move |
| 7 | financial.journal_entry_lines | Lineas de Asiento | account.move.line |
| 8 | financial.tax_groups | Grupos de Impuestos | account.tax.group |
| 9 | financial.taxes | Impuestos | account.tax |
| 10 | financial.payment_terms | Terminos de Pago | account.payment.term |
| 11 | financial.invoices | Facturas | account.move (con move_type) |
| 12 | financial.invoice_lines | Lineas de Factura | account.move.line |
| 13 | financial.payments | Pagos | account.payment |
| 14 | financial.payment_invoice | Conciliacion Pago-Factura | account.partial.reconcile |
| 15 | financial.bank_accounts | Cuentas Bancarias | res.partner.bank |
| 16 | financial.reconciliations | Conciliaciones Bancarias | account.bank.statement |
| 17 | financial.account_full_reconcile | Conciliacion Completa | account.full.reconcile |
| 18 | financial.account_partial_reconcile | Conciliacion Parcial | account.partial.reconcile |
---
# 2. COMPARATIVA DETALLADA POR TABLA
## 2.1 account.move (Odoo) vs journal_entries + invoices (ERP-Core)
### 2.1.1 Campos de account.move
| Campo Odoo | Tipo Odoo | Campo ERP-Core | Tipo ERP | Estado | Notas |
|------------|-----------|----------------|----------|--------|-------|
| id | Integer | id | UUID | EQUIVALENTE | ERP usa UUID |
| name | Char | name (journal_entries) / number (invoices) | VARCHAR | EQUIVALENTE | |
| ref | Char | ref (journal_entries) / ref (invoices) | VARCHAR | EQUIVALENTE | |
| date | Date | date (journal_entries) / invoice_date (invoices) | DATE | EQUIVALENTE | |
| state | Selection | status | ENUM | EQUIVALENTE | Valores diferentes |
| move_type | Selection | - / invoice_type | ENUM | PARCIAL | Odoo unifica facturas y asientos |
| is_storno | Boolean | - | - | **FALTANTE** | |
| journal_id | Many2one | journal_id | UUID FK | EQUIVALENTE | |
| company_id | Many2one | company_id | UUID FK | EQUIVALENTE | |
| line_ids | One2many | - | - | EQUIVALENTE | Relacion inversa |
| origin_payment_id | Many2one | - | - | **FALTANTE** | |
| matched_payment_ids | Many2many | - | - | **FALTANTE** | |
| reconciled_payment_ids | Many2many (computed) | - | - | **FALTANTE** | |
| payment_count | Integer (computed) | - | - | N/A | Computed |
| statement_line_id | Many2one | - | - | **FALTANTE** | |
| statement_id | Many2one | - | - | **FALTANTE** | |
| tax_cash_basis_rec_id | Many2one | - | - | **FALTANTE** | Cash basis |
| tax_cash_basis_origin_move_id | Many2one | - | - | **FALTANTE** | |
| tax_cash_basis_created_move_ids | One2many | - | - | **FALTANTE** | |
| always_tax_exigible | Boolean | - | - | **FALTANTE** | |
| auto_post | Selection | - | - | **FALTANTE** | |
| auto_post_until | Date | - | - | **FALTANTE** | |
| auto_post_origin_id | Many2one | - | - | **FALTANTE** | |
| checked | Boolean | - | - | **FALTANTE** | |
| posted_before | Boolean | - | - | **FALTANTE** | |
| made_sequence_gap | Boolean | - | - | **FALTANTE** | |
| invoice_line_ids | One2many | - | - | N/A | Subset de line_ids |
| invoice_date | Date | invoice_date | DATE | EQUIVALENTE | |
| invoice_date_due | Date | due_date | DATE | EQUIVALENTE | |
| delivery_date | Date | - | - | **FALTANTE** | |
| invoice_payment_term_id | Many2one | payment_term_id | UUID FK | EQUIVALENTE | |
| partner_id | Many2one | partner_id | UUID FK | EQUIVALENTE | |
| commercial_partner_id | Many2one | - | - | **FALTANTE** | |
| partner_shipping_id | Many2one | - | - | **FALTANTE** | |
| partner_bank_id | Many2one | - | - | **FALTANTE** | |
| fiscal_position_id | Many2one | - | - | **FALTANTE** | |
| payment_reference | Char | - | - | **FALTANTE** | |
| display_qr_code | Boolean | - | - | **FALTANTE** | |
| qr_code_method | Selection | - | - | **FALTANTE** | |
| invoice_outstanding_credits_debits_widget | Binary | - | - | N/A | Computed |
| invoice_has_outstanding | Boolean | - | - | N/A | Computed |
| invoice_payments_widget | Binary | - | - | N/A | Computed |
| preferred_payment_method_line_id | Many2one | - | - | **FALTANTE** | |
| company_currency_id | Many2one | - | - | N/A | Related |
| currency_id | Many2one | currency_id | UUID FK | EQUIVALENTE | |
| invoice_currency_rate | Float | - | - | **FALTANTE** | |
| direction_sign | Integer | - | - | N/A | Computed |
| amount_untaxed | Monetary | amount_untaxed | DECIMAL | EQUIVALENTE | |
| amount_tax | Monetary | amount_tax | DECIMAL | EQUIVALENTE | |
| amount_total | Monetary | amount_total | DECIMAL | EQUIVALENTE | |
| amount_residual | Monetary | amount_residual | DECIMAL | EQUIVALENTE | |
| amount_untaxed_signed | Monetary | - | - | **FALTANTE** | |
| amount_tax_signed | Monetary | - | - | **FALTANTE** | |
| amount_total_signed | Monetary | - | - | **FALTANTE** | |
| amount_residual_signed | Monetary | - | - | **FALTANTE** | |
| amount_total_in_currency_signed | Monetary | - | - | **FALTANTE** | |
| tax_totals | Binary | - | - | N/A | Computed |
| payment_state | Selection | payment_state | ENUM | EQUIVALENTE | |
| reversed_entry_id | Many2one | - | - | **FALTANTE** | |
| reversal_move_ids | One2many | - | - | **FALTANTE** | |
| invoice_vendor_bill_id | Many2one | - | - | **FALTANTE** | |
| invoice_source_email | Char | - | - | **FALTANTE** | |
| invoice_partner_display_name | Char | - | - | N/A | Computed |
| is_manually_modified | Boolean | - | - | **FALTANTE** | |
| quick_edit_mode | Boolean | - | - | N/A | Computed |
| quick_edit_total_amount | Monetary | - | - | **FALTANTE** | |
| restrict_mode_hash_table | Boolean | - | - | **FALTANTE** | Hash |
| secure_sequence_number | Integer | - | - | **FALTANTE** | Hash |
| inalterable_hash | Char | - | - | **FALTANTE** | Hash |
| secured | Boolean | - | - | N/A | Computed |
| needed_terms | Binary | - | - | N/A | Computed |
| needed_terms_dirty | Boolean | - | - | N/A | Computed |
| created_at | - | created_at | TIMESTAMP | EQUIVALENTE | ERP |
| created_by | - | created_by | UUID FK | EQUIVALENTE | ERP |
| updated_at | - | updated_at | TIMESTAMP | EQUIVALENTE | ERP |
| updated_by | - | updated_by | UUID FK | EQUIVALENTE | ERP |
| posted_at | - | posted_at | TIMESTAMP | EQUIVALENTE | ERP |
| posted_by | - | posted_by | UUID FK | EQUIVALENTE | ERP |
| cancelled_at | - | cancelled_at | TIMESTAMP | EQUIVALENTE | ERP |
| cancelled_by | - | cancelled_by | UUID FK | EQUIVALENTE | ERP |
| validated_at | - | validated_at | TIMESTAMP | EQUIVALENTE | ERP |
| validated_by | - | validated_by | UUID FK | EQUIVALENTE | ERP |
### Estado Selection Odoo (move_type):
```python
[
('entry', 'Journal Entry'),
('out_invoice', 'Customer Invoice'),
('out_refund', 'Customer Credit Note'),
('in_invoice', 'Vendor Bill'),
('in_refund', 'Vendor Credit Note'),
('out_receipt', 'Sales Receipt'),
('in_receipt', 'Purchase Receipt'),
]
```
### Estado ENUM ERP-Core (invoice_type):
```sql
CREATE TYPE financial.invoice_type AS ENUM (
'customer',
'supplier'
);
```
**GAP:** ERP-Core no distingue entre facturas, notas de credito y recibos. Solo tiene customer/supplier.
---
## 2.2 account.move.line (Odoo) vs journal_entry_lines + invoice_lines (ERP-Core)
| Campo Odoo | Tipo Odoo | Campo ERP-Core | Tipo ERP | Estado | Notas |
|------------|-----------|----------------|----------|--------|-------|
| id | Integer | id | UUID | EQUIVALENTE | |
| move_id | Many2one | entry_id | UUID FK | EQUIVALENTE | |
| journal_id | Many2one | - | - | **FALTANTE** | Related en Odoo |
| company_id | Many2one | - | - | **FALTANTE** | Related en Odoo |
| move_name | Char | - | - | N/A | Related |
| parent_state | Selection | - | - | N/A | Related |
| date | Date | - | - | N/A | Related |
| ref | Char | ref | VARCHAR | EQUIVALENTE | |
| sequence | Integer | - | - | **FALTANTE** | Orden |
| account_id | Many2one | account_id | UUID FK | EQUIVALENTE | |
| account_name | Char | - | - | N/A | Related |
| account_code | Char | - | - | N/A | Related |
| name | Char | description | TEXT | EQUIVALENTE | |
| debit | Monetary | debit | DECIMAL | EQUIVALENTE | |
| credit | Monetary | credit | DECIMAL | EQUIVALENTE | |
| balance | Monetary | - | - | **FALTANTE** | debit - credit |
| cumulated_balance | Monetary | - | - | N/A | Computed |
| currency_rate | Float | - | - | N/A | Computed |
| amount_currency | Monetary | amount_currency | DECIMAL | EQUIVALENTE | |
| currency_id | Many2one | currency_id | UUID FK | EQUIVALENTE | |
| is_same_currency | Boolean | - | - | N/A | Computed |
| partner_id | Many2one | partner_id | UUID FK | EQUIVALENTE | |
| is_imported | Boolean | - | - | **FALTANTE** | |
| reconcile_model_id | Many2one | - | - | **FALTANTE** | |
| payment_id | Many2one | - | - | **FALTANTE** | |
| statement_line_id | Many2one | - | - | **FALTANTE** | |
| statement_id | Many2one | - | - | **FALTANTE** | |
| tax_ids | Many2many | tax_ids | UUID[] | EQUIVALENTE | Array en ERP |
| group_tax_id | Many2one | - | - | **FALTANTE** | |
| tax_line_id | Many2one | - | - | **FALTANTE** | |
| tax_group_id | Many2one | - | - | **FALTANTE** | |
| tax_base_amount | Monetary | - | - | **FALTANTE** | |
| tax_repartition_line_id | Many2one | - | - | **FALTANTE** | |
| tax_tag_ids | Many2many | - | - | **FALTANTE** | |
| tax_tag_invert | Boolean | - | - | **FALTANTE** | |
| amount_residual | Monetary | - | - | **FALTANTE** | Conciliacion |
| amount_residual_currency | Monetary | - | - | **FALTANTE** | Conciliacion |
| reconciled | Boolean | - | - | **FALTANTE** | |
| full_reconcile_id | Many2one | - | - | **FALTANTE** | |
| matched_debit_ids | One2many | - | - | **FALTANTE** | |
| matched_credit_ids | One2many | - | - | **FALTANTE** | |
| matching_number | Char | - | - | **FALTANTE** | |
| is_account_reconcile | Boolean | - | - | N/A | Related |
| account_type | Selection | - | - | N/A | Related |
| display_type | Selection | - | - | **FALTANTE** | |
| product_id | Many2one | product_id | UUID FK | EQUIVALENTE | |
| product_uom_id | Many2one | uom_id | UUID FK | EQUIVALENTE | |
| quantity | Float | quantity | DECIMAL | EQUIVALENTE | |
| date_maturity | Date | - | - | **FALTANTE** | Fecha vencimiento |
| price_unit | Float | price_unit | DECIMAL | EQUIVALENTE | |
| price_subtotal | Monetary | amount_untaxed | DECIMAL | EQUIVALENTE | |
| price_total | Monetary | amount_total | DECIMAL | EQUIVALENTE | |
| discount | Float | - | - | **FALTANTE** | |
| analytic_line_ids | One2many | - | - | **FALTANTE** | |
| analytic_distribution | Json | analytic_account_id | UUID | PARCIAL | ERP solo soporta 1 cuenta |
| discount_date | Date | - | - | **FALTANTE** | Early payment |
| discount_amount_currency | Monetary | - | - | **FALTANTE** | |
| discount_balance | Monetary | - | - | **FALTANTE** | |
| payment_date | Date | - | - | N/A | Computed |
### Display Type Selection Odoo:
```python
[
('product', 'Product'),
('cogs', 'Cost of Goods Sold'),
('tax', 'Tax'),
('discount', "Discount"),
('rounding', "Rounding"),
('payment_term', 'Payment Term'),
('line_section', 'Section'),
('line_note', 'Note'),
('epd', 'Early Payment Discount')
]
```
**GAP:** ERP-Core no tiene display_type para diferenciar tipos de lineas.
---
## 2.3 account.journal (Odoo) vs journals (ERP-Core)
| Campo Odoo | Tipo Odoo | Campo ERP-Core | Tipo ERP | Estado | Notas |
|------------|-----------|----------------|----------|--------|-------|
| id | Integer | id | UUID | EQUIVALENTE | |
| name | Char | name | VARCHAR | EQUIVALENTE | |
| code | Char | code | VARCHAR | EQUIVALENTE | |
| active | Boolean | active | BOOLEAN | EQUIVALENTE | |
| type | Selection | journal_type | ENUM | EQUIVALENTE | |
| autocheck_on_post | Boolean | - | - | **FALTANTE** | |
| account_control_ids | Many2many | - | - | **FALTANTE** | |
| default_account_type | Char | - | - | N/A | Computed |
| default_account_id | Many2one | default_account_id | UUID FK | EQUIVALENTE | |
| suspense_account_id | Many2one | - | - | **FALTANTE** | |
| restrict_mode_hash_table | Boolean | - | - | **FALTANTE** | Hash |
| sequence | Integer | - | - | **FALTANTE** | |
| invoice_reference_type | Selection | - | - | **FALTANTE** | |
| invoice_reference_model | Selection | - | - | **FALTANTE** | |
| currency_id | Many2one | currency_id | UUID FK | EQUIVALENTE | |
| company_id | Many2one | company_id | UUID FK | EQUIVALENTE | |
| country_code | Char | - | - | N/A | Related |
| refund_sequence | Boolean | - | - | **FALTANTE** | |
| payment_sequence | Boolean | - | - | **FALTANTE** | |
| sequence_override_regex | Text | - | - | **FALTANTE** | |
| inbound_payment_method_line_ids | One2many | - | - | **FALTANTE** | |
| outbound_payment_method_line_ids | One2many | - | - | **FALTANTE** | |
| profit_account_id | Many2one | - | - | **FALTANTE** | |
| loss_account_id | Many2one | - | - | **FALTANTE** | |
| bank_account_id | Many2one | - | - | **FALTANTE** | |
| bank_statements_source | Selection | - | - | **FALTANTE** | |
| bank_acc_number | Char | - | - | N/A | Related |
| bank_id | Many2one | - | - | N/A | Related |
| alias_id | Many2one | - | - | **FALTANTE** | Email |
| journal_group_ids | Many2many | - | - | **FALTANTE** | |
| available_payment_method_ids | Many2many | - | - | N/A | Computed |
| selected_payment_method_codes | Char | - | - | N/A | Computed |
| accounting_date | Date | - | - | N/A | Computed |
| sequence_id | - | sequence_id | UUID FK | SOLO ERP | |
| tenant_id | - | tenant_id | UUID FK | SOLO ERP | Multi-tenant |
### Journal Type Odoo:
```python
[
('sale', 'Sales'),
('purchase', 'Purchase'),
('cash', 'Cash'),
('bank', 'Bank'),
('credit', 'Credit Card'),
('general', 'Miscellaneous'),
]
```
### Journal Type ERP-Core:
```sql
CREATE TYPE financial.journal_type AS ENUM (
'sale',
'purchase',
'bank',
'cash',
'general'
);
```
**GAP:** ERP-Core no tiene 'credit' (Credit Card).
---
## 2.4 account.account (Odoo) vs accounts (ERP-Core)
| Campo Odoo | Tipo Odoo | Campo ERP-Core | Tipo ERP | Estado | Notas |
|------------|-----------|----------------|----------|--------|-------|
| id | Integer | id | UUID | EQUIVALENTE | |
| name | Char | name | VARCHAR | EQUIVALENTE | |
| code | Char | code | VARCHAR | EQUIVALENTE | |
| currency_id | Many2one | currency_id | UUID FK | EQUIVALENTE | |
| deprecated | Boolean | is_deprecated | BOOLEAN | EQUIVALENTE | |
| used | Boolean | - | - | N/A | Computed |
| account_type | Selection | account_type_id | UUID FK | DIFERENTE | Odoo usa Selection, ERP usa FK |
| include_initial_balance | Boolean | - | - | N/A | Computed |
| internal_group | Selection | - | - | N/A | Computed |
| reconcile | Boolean | is_reconcilable | BOOLEAN | EQUIVALENTE | |
| tax_ids | Many2many | - | - | **FALTANTE** | Default taxes |
| note | Text | notes | TEXT | EQUIVALENTE | |
| company_ids | Many2many | company_id | UUID FK | DIFERENTE | Odoo multi-company |
| tag_ids | Many2many | - | - | **FALTANTE** | |
| group_id | Many2one | - | - | N/A | Computed |
| root_id | Many2one | - | - | N/A | Computed |
| allowed_journal_ids | Many2many | - | - | **FALTANTE** | |
| opening_debit | Monetary | - | - | **FALTANTE** | |
| opening_credit | Monetary | - | - | **FALTANTE** | |
| opening_balance | Monetary | - | - | **FALTANTE** | |
| current_balance | Float | - | - | N/A | Computed |
| related_taxes_amount | Integer | - | - | N/A | Computed |
| non_trade | Boolean | - | - | **FALTANTE** | |
| parent_id | - | parent_id | UUID FK | SOLO ERP | Jerarquia |
| tenant_id | - | tenant_id | UUID FK | SOLO ERP | Multi-tenant |
### Account Type Odoo (Selection):
```python
[
("asset_receivable", "Receivable"),
("asset_cash", "Bank and Cash"),
("asset_current", "Current Assets"),
("asset_non_current", "Non-current Assets"),
("asset_prepayments", "Prepayments"),
("asset_fixed", "Fixed Assets"),
("liability_payable", "Payable"),
("liability_credit_card", "Credit Card"),
("liability_current", "Current Liabilities"),
("liability_non_current", "Non-current Liabilities"),
("equity", "Equity"),
("equity_unaffected", "Current Year Earnings"),
("income", "Income"),
("income_other", "Other Income"),
("expense", "Expenses"),
("expense_depreciation", "Depreciation"),
("expense_direct_cost", "Cost of Revenue"),
("off_balance", "Off-Balance Sheet"),
]
```
### Account Type ERP-Core (ENUM + Tabla):
```sql
CREATE TYPE financial.account_type AS ENUM (
'asset',
'liability',
'equity',
'revenue',
'expense'
);
-- Mas seed data con tipos especificos
```
**GAP:** ERP-Core tiene solo 5 tipos generales vs 18 tipos especificos de Odoo.
---
## 2.5 account.tax (Odoo) vs taxes (ERP-Core)
| Campo Odoo | Tipo Odoo | Campo ERP-Core | Tipo ERP | Estado | Notas |
|------------|-----------|----------------|----------|--------|-------|
| id | Integer | id | UUID | EQUIVALENTE | |
| name | Char | name | VARCHAR | EQUIVALENTE | |
| type_tax_use | Selection | tax_type | ENUM | EQUIVALENTE | |
| tax_scope | Selection | - | - | **FALTANTE** | service/consu |
| amount_type | Selection | amount_type | VARCHAR | EQUIVALENTE | |
| active | Boolean | active | BOOLEAN | EQUIVALENTE | |
| company_id | Many2one | company_id | UUID FK | EQUIVALENTE | |
| children_tax_ids | Many2many | children_tax_ids | UUID[] | EQUIVALENTE | |
| sequence | Integer | - | - | **FALTANTE** | |
| amount | Float | rate | DECIMAL | EQUIVALENTE | |
| description | Html | - | - | **FALTANTE** | |
| invoice_label | Char | - | - | **FALTANTE** | |
| price_include | Boolean | price_include | BOOLEAN | EQUIVALENTE | |
| price_include_override | Selection | - | - | **FALTANTE** | |
| include_base_amount | Boolean | include_base_amount | BOOLEAN | EQUIVALENTE | |
| is_base_affected | Boolean | - | - | **FALTANTE** | |
| analytic | Boolean | - | - | **FALTANTE** | |
| tax_group_id | Many2one | tax_group_id | UUID FK | EQUIVALENTE | |
| hide_tax_exigibility | Boolean | - | - | N/A | Related |
| tax_exigibility | Selection | - | - | **FALTANTE** | on_invoice/on_payment |
| cash_basis_transition_account_id | Many2one | - | - | **FALTANTE** | |
| invoice_repartition_line_ids | One2many | - | - | **FALTANTE** | Tax distribution |
| refund_repartition_line_ids | One2many | - | - | **FALTANTE** | |
| repartition_line_ids | One2many | - | - | **FALTANTE** | |
| country_id | Many2one | - | - | **FALTANTE** | |
| country_code | Char | - | - | N/A | Related |
| is_used | Boolean | - | - | N/A | Computed |
| invoice_legal_notes | Html | - | - | **FALTANTE** | |
| has_negative_factor | Boolean | - | - | N/A | Computed |
| code | - | code | VARCHAR | SOLO ERP | |
| account_id | - | account_id | UUID FK | PARCIAL | En Odoo es repartition_line |
| refund_account_id | - | refund_account_id | UUID FK | PARCIAL | En Odoo es repartition_line |
### Tax Type Odoo:
```python
TYPE_TAX_USE = [
('sale', 'Sales'),
('purchase', 'Purchases'),
('none', 'None'),
]
```
### Tax Type ERP-Core:
```sql
CREATE TYPE financial.tax_type AS ENUM (
'sales',
'purchase',
'all'
);
```
**GAP:** Diferente nomenclatura (sale vs sales, none vs all).
---
## 2.6 account.payment (Odoo) vs payments (ERP-Core)
| Campo Odoo | Tipo Odoo | Campo ERP-Core | Tipo ERP | Estado | Notas |
|------------|-----------|----------------|----------|--------|-------|
| id | Integer | id | UUID | EQUIVALENTE | |
| name | Char | - | - | **FALTANTE** | Numero de pago |
| date | Date | payment_date | DATE | EQUIVALENTE | |
| move_id | Many2one | journal_entry_id | UUID FK | EQUIVALENTE | |
| journal_id | Many2one | journal_id | UUID FK | EQUIVALENTE | |
| company_id | Many2one | company_id | UUID FK | EQUIVALENTE | |
| state | Selection | status | ENUM | DIFERENTE | Estados diferentes |
| is_reconciled | Boolean | - | - | N/A | Computed |
| is_matched | Boolean | - | - | N/A | Computed |
| is_sent | Boolean | - | - | **FALTANTE** | |
| available_partner_bank_ids | Many2many | - | - | N/A | Computed |
| partner_bank_id | Many2one | - | - | **FALTANTE** | |
| qr_code | Html | - | - | N/A | Computed |
| paired_internal_transfer_payment_id | Many2one | - | - | **FALTANTE** | Transferencias |
| payment_method_line_id | Many2one | - | - | **FALTANTE** | |
| payment_method_id | Many2one | payment_method | ENUM | DIFERENTE | |
| amount | Monetary | amount | DECIMAL | EQUIVALENTE | |
| payment_type | Selection | payment_type | ENUM | EQUIVALENTE | |
| partner_type | Selection | - | - | **FALTANTE** | customer/supplier |
| memo | Char | - | - | **FALTANTE** | |
| payment_reference | Char | ref | VARCHAR | EQUIVALENTE | |
| currency_id | Many2one | currency_id | UUID FK | EQUIVALENTE | |
| partner_id | Many2one | partner_id | UUID FK | EQUIVALENTE | |
| outstanding_account_id | Many2one | - | - | **FALTANTE** | |
| destination_account_id | Many2one | - | - | **FALTANTE** | |
| invoice_ids | Many2many | - | - | N/A | Relacion via payment_invoice |
| reconciled_invoice_ids | Many2many | - | - | N/A | Computed |
| amount_signed | Monetary | - | - | N/A | Computed |
| amount_company_currency_signed | Monetary | - | - | N/A | Computed |
| duplicate_payment_ids | Many2many | - | - | N/A | Computed |
| notes | - | notes | TEXT | SOLO ERP | |
### Payment State Odoo:
```python
[
('draft', "Draft"),
('in_process', "In Process"),
('paid', "Paid"),
('canceled', "Canceled"),
('rejected', "Rejected"),
]
```
### Payment Status ERP-Core:
```sql
CREATE TYPE financial.payment_status AS ENUM (
'draft',
'posted',
'reconciled',
'cancelled'
);
```
**GAP:** Estados diferentes - Odoo tiene in_process, paid, rejected. ERP tiene posted, reconciled.
---
## 2.7 account.payment.term (Odoo) vs payment_terms (ERP-Core)
| Campo Odoo | Tipo Odoo | Campo ERP-Core | Tipo ERP | Estado | Notas |
|------------|-----------|----------------|----------|--------|-------|
| id | Integer | id | UUID | EQUIVALENTE | |
| name | Char | name | VARCHAR | EQUIVALENTE | |
| active | Boolean | active | BOOLEAN | EQUIVALENTE | |
| note | Html | - | - | **FALTANTE** | |
| line_ids | One2many | terms | JSONB | DIFERENTE | Odoo usa tabla, ERP usa JSON |
| company_id | Many2one | company_id | UUID FK | EQUIVALENTE | |
| sequence | Integer | - | - | **FALTANTE** | |
| display_on_invoice | Boolean | - | - | **FALTANTE** | |
| discount_percentage | Float | - | - | **FALTANTE** | Early payment |
| discount_days | Integer | - | - | **FALTANTE** | Early payment |
| early_pay_discount_computation | Selection | - | - | **FALTANTE** | |
| early_discount | Boolean | - | - | **FALTANTE** | |
| code | - | code | VARCHAR | SOLO ERP | |
### Payment Term Line (Odoo vs ERP-Core JSON):
**Odoo tiene tabla account.payment.term.line:**
```python
fields:
- value: Selection [('percent', 'Percent'), ('fixed', 'Fixed')]
- value_amount: Float
- delay_type: Selection [días después, fin de mes, etc.]
- nb_days: Integer
- days_next_month: Char
- payment_id: Many2one
```
**ERP-Core usa JSONB:**
```sql
-- Ejemplo: [{"days": 30, "percent": 100}]
terms JSONB NOT NULL DEFAULT '[]'
```
**GAP:** ERP-Core pierde la flexibilidad de delay_type (fin de mes, etc.).
---
## 2.8 account.tax.group (Odoo) vs tax_groups (ERP-Core)
| Campo Odoo | Tipo Odoo | Campo ERP-Core | Tipo ERP | Estado | Notas |
|------------|-----------|----------------|----------|--------|-------|
| id | Integer | id | UUID | EQUIVALENTE | |
| name | Char | name | VARCHAR | EQUIVALENTE | |
| sequence | Integer | sequence | INTEGER | EQUIVALENTE | |
| company_id | Many2one | - | - | **FALTANTE** | |
| tax_payable_account_id | Many2one | - | - | **FALTANTE** | |
| tax_receivable_account_id | Many2one | - | - | **FALTANTE** | |
| advance_tax_payment_account_id | Many2one | - | - | **FALTANTE** | |
| country_id | Many2one | country_id | UUID | EQUIVALENTE | |
| country_code | Char | - | - | N/A | Related |
| preceding_subtotal | Char | - | - | **FALTANTE** | |
| pos_receipt_label | Char | - | - | **FALTANTE** | |
| tenant_id | - | tenant_id | UUID FK | SOLO ERP | |
---
## 2.9 account.bank.statement (Odoo) vs reconciliations (ERP-Core)
**Nota:** ERP-Core tiene una implementacion muy simplificada de conciliaciones bancarias.
| Campo Odoo | Tipo Odoo | Campo ERP-Core | Tipo ERP | Estado | Notas |
|------------|-----------|----------------|----------|--------|-------|
| id | Integer | id | UUID | EQUIVALENTE | |
| name | Char | - | - | **FALTANTE** | |
| reference | Char | - | - | **FALTANTE** | |
| date | Date | - | - | **FALTANTE** | Usa start_date/end_date |
| first_line_index | Char | - | - | **FALTANTE** | |
| balance_start | Monetary | balance_start | DECIMAL | EQUIVALENTE | |
| balance_end | Monetary | balance_end_computed | DECIMAL | EQUIVALENTE | |
| balance_end_real | Monetary | balance_end_real | DECIMAL | EQUIVALENTE | |
| company_id | Many2one | company_id | UUID FK | EQUIVALENTE | |
| currency_id | Many2one | - | - | N/A | Computed |
| journal_id | Many2one | - | - | **FALTANTE** | |
| line_ids | One2many | reconciled_line_ids | UUID[] | DIFERENTE | Array vs relacion |
| is_complete | Boolean | - | - | N/A | Computed |
| is_valid | Boolean | - | - | N/A | Computed |
| problem_description | Text | - | - | N/A | Computed |
| attachment_ids | Many2many | - | - | **FALTANTE** | |
| bank_account_id | - | bank_account_id | UUID FK | EQUIVALENTE | |
| start_date | - | start_date | DATE | SOLO ERP | |
| end_date | - | end_date | DATE | SOLO ERP | |
| status | - | status | ENUM | SOLO ERP | |
**GAP CRITICO:** Odoo tiene account.bank.statement.line como modelo separado. ERP-Core no tiene lineas de extracto.
---
## 2.10 account.partial.reconcile (Odoo) vs account_partial_reconcile (ERP-Core)
| Campo Odoo | Tipo Odoo | Campo ERP-Core | Tipo ERP | Estado | Notas |
|------------|-----------|----------------|----------|--------|-------|
| id | Integer | id | UUID | EQUIVALENTE | |
| debit_move_id | Many2one | debit_move_id | UUID FK | EQUIVALENTE | |
| credit_move_id | Many2one | credit_move_id | UUID FK | EQUIVALENTE | |
| full_reconcile_id | Many2one | full_reconcile_id | UUID FK | EQUIVALENTE | |
| exchange_move_id | Many2one | - | - | **FALTANTE** | Diferencia cambio |
| company_currency_id | Many2one | company_currency_id | UUID FK | EQUIVALENTE | |
| debit_currency_id | Many2one | debit_currency_id | UUID FK | EQUIVALENTE | |
| credit_currency_id | Many2one | credit_currency_id | UUID FK | EQUIVALENTE | |
| amount | Monetary | amount | DECIMAL | EQUIVALENTE | |
| debit_amount_currency | Monetary | debit_amount_currency | DECIMAL | EQUIVALENTE | |
| credit_amount_currency | Monetary | credit_amount_currency | DECIMAL | EQUIVALENTE | |
| company_id | Many2one | - | - | **FALTANTE** | |
| max_date | Date | max_date | DATE | EQUIVALENTE | |
---
## 2.11 account.full.reconcile (Odoo) vs account_full_reconcile (ERP-Core)
| Campo Odoo | Tipo Odoo | Campo ERP-Core | Tipo ERP | Estado | Notas |
|------------|-----------|----------------|----------|--------|-------|
| id | Integer | id | UUID | EQUIVALENTE | |
| name | - | name | VARCHAR | SOLO ERP | |
| partial_reconcile_ids | One2many | - | - | **FALTANTE** | Relacion inversa |
| reconciled_line_ids | One2many | - | - | **FALTANTE** | Relacion inversa |
| exchange_move_id | Many2one | exchange_move_id | UUID FK | EQUIVALENTE | |
---
# 3. ENUMS/SELECTIONS COMPARATIVA
## 3.1 Estados de Factura
### Odoo (state en account.move):
```python
[
('draft', 'Draft'),
('posted', 'Posted'),
('cancel', 'Cancelled'),
]
```
### ERP-Core (invoice_status):
```sql
CREATE TYPE financial.invoice_status AS ENUM (
'draft',
'open',
'paid',
'cancelled'
);
```
**GAP:** Odoo no tiene 'open'. Odoo usa payment_state para indicar si esta pagado.
## 3.2 Estado de Pago
### Odoo (PAYMENT_STATE_SELECTION):
```python
[
('not_paid', 'Not Paid'),
('in_payment', 'In Payment'),
('paid', 'Paid'),
('partial', 'Partially Paid'),
('reversed', 'Reversed'),
('blocked', 'Blocked'),
('invoicing_legacy', 'Invoicing App Legacy'),
]
```
### ERP-Core (payment_state):
```sql
CREATE TYPE financial.payment_state AS ENUM (
'not_paid',
'in_payment',
'paid',
'partial',
'reversed'
);
```
**GAP:** ERP-Core no tiene 'blocked' ni 'invoicing_legacy'.
## 3.3 Tipo de Asiento/Factura
### Odoo (move_type):
```python
[
('entry', 'Journal Entry'),
('out_invoice', 'Customer Invoice'),
('out_refund', 'Customer Credit Note'),
('in_invoice', 'Vendor Bill'),
('in_refund', 'Vendor Credit Note'),
('out_receipt', 'Sales Receipt'),
('in_receipt', 'Purchase Receipt'),
]
```
### ERP-Core (invoice_type):
```sql
CREATE TYPE financial.invoice_type AS ENUM (
'customer',
'supplier'
);
```
**GAP CRITICO:** ERP-Core no distingue entre:
- Facturas vs Notas de Credito (refund)
- Facturas vs Recibos (receipt)
## 3.4 Tipo de Cuenta
### Odoo (account_type):
```python
[
("asset_receivable", "Receivable"),
("asset_cash", "Bank and Cash"),
("asset_current", "Current Assets"),
("asset_non_current", "Non-current Assets"),
("asset_prepayments", "Prepayments"),
("asset_fixed", "Fixed Assets"),
("liability_payable", "Payable"),
("liability_credit_card", "Credit Card"),
("liability_current", "Current Liabilities"),
("liability_non_current", "Non-current Liabilities"),
("equity", "Equity"),
("equity_unaffected", "Current Year Earnings"),
("income", "Income"),
("income_other", "Other Income"),
("expense", "Expenses"),
("expense_depreciation", "Depreciation"),
("expense_direct_cost", "Cost of Revenue"),
("off_balance", "Off-Balance Sheet"),
]
```
### ERP-Core (account_type ENUM):
```sql
CREATE TYPE financial.account_type AS ENUM (
'asset',
'liability',
'equity',
'revenue',
'expense'
);
```
**GAP CRITICO:** 18 tipos Odoo vs 5 tipos ERP-Core. Pierdes:
- Distincion receivable/payable para reportes
- Distincion cash/current/non-current
- Tipos especiales como off_balance
---
# 4. FUNCIONES/METODOS COMPARATIVA
## 4.1 Funciones ERP-Core Existentes
| Funcion | Descripcion | Equivalente Odoo |
|---------|-------------|------------------|
| financial.validate_entry_balance(p_entry_id) | Valida balance debit=credit | account.move._check_balanced() |
| financial.post_journal_entry(p_entry_id) | Contabiliza asiento | account.move.action_post() |
| financial.calculate_invoice_totals(p_invoice_id) | Calcula totales factura | account.move._compute_amount() |
| financial.update_invoice_paid_amount(p_invoice_id) | Actualiza monto pagado | account.move._compute_payment_state() |
## 4.2 Funciones Odoo FALTANTES en ERP-Core
| Metodo Odoo | Modelo | Descripcion |
|-------------|--------|-------------|
| _recompute_tax_lines() | account.move | Recalcula lineas de impuestos |
| _compute_payments_widget_reconciled_info() | account.move | Widget de pagos reconciliados |
| _compute_amount_residual() | account.move.line | Calcula monto residual |
| _reconcile_plan() | account.move.line | Plan de reconciliacion |
| _create_tax_cash_basis_moves() | account.partial.reconcile | Crea asientos cash basis |
| _compute_terms() | account.payment.term | Calcula terminos de pago |
| _get_due_date() | account.payment.term.line | Calcula fecha vencimiento |
| _get_journal_bank_account_balance() | account.journal | Balance cuenta bancaria |
| _check_repartition_lines() | account.tax | Valida lineas de distribucion |
| _compute_is_valid() | account.bank.statement | Valida extracto bancario |
---
# 5. GAPS IDENTIFICADOS
## 5.1 Tablas/Modelos Faltantes (CRITICO)
| GAP ID | Modelo Odoo | Descripcion | Impacto |
|--------|-------------|-------------|---------|
| GAP-TBL-001 | account.bank.statement.line | Lineas de extracto bancario | Conciliacion bancaria incompleta |
| GAP-TBL-002 | account.tax.repartition.line | Distribucion de impuestos | Reportes fiscales limitados |
| GAP-TBL-003 | account.fiscal.position | Posiciones fiscales | No hay mapeo de impuestos/cuentas por cliente |
| GAP-TBL-004 | account.fiscal.position.tax | Mapeo fiscal de impuestos | |
| GAP-TBL-005 | account.fiscal.position.account | Mapeo fiscal de cuentas | |
| GAP-TBL-006 | account.reconcile.model | Modelos de conciliacion automatica | |
| GAP-TBL-007 | account.journal.group | Grupos de diarios | Multi-ledger |
| GAP-TBL-008 | account.account.tag | Etiquetas de cuentas | Reportes personalizados |
| GAP-TBL-009 | account.group | Grupos de cuentas | Jerarquia de plan de cuentas |
| GAP-TBL-010 | account.cash.rounding | Redondeo de efectivo | |
| GAP-TBL-011 | account.incoterms | Incoterms | Comercio internacional |
| GAP-TBL-012 | account.payment.method | Metodos de pago | Flexibilidad en pagos |
| GAP-TBL-013 | account.payment.method.line | Config de metodos por diario | |
| GAP-TBL-014 | account.analytic.plan | Planes analiticos | Contabilidad analitica multi-dimension |
| GAP-TBL-015 | account.payment.term.line | Lineas de terminos de pago | ERP usa JSONB |
## 5.2 Campos Faltantes en Tablas Existentes (ALTO)
### account.move / invoices
| GAP ID | Campo | Tipo | Impacto |
|--------|-------|------|---------|
| GAP-FLD-001 | is_storno | Boolean | Contabilidad de reversiones |
| GAP-FLD-002 | auto_post | Selection | Facturacion recurrente |
| GAP-FLD-003 | delivery_date | Date | Fecha de entrega |
| GAP-FLD-004 | fiscal_position_id | FK | Posiciones fiscales |
| GAP-FLD-005 | payment_reference | Char | Referencia de pago |
| GAP-FLD-006 | reversed_entry_id | FK | Reversiones |
| GAP-FLD-007 | inalterable_hash | Char | Integridad/Auditoria |
| GAP-FLD-008 | amount_*_signed | Monetary | Montos con signo |
| GAP-FLD-009 | invoice_currency_rate | Float | Tasa de cambio |
| GAP-FLD-010 | commercial_partner_id | FK | Partner comercial |
### account.move.line / journal_entry_lines
| GAP ID | Campo | Tipo | Impacto |
|--------|-------|------|---------|
| GAP-FLD-011 | sequence | Integer | Orden de lineas |
| GAP-FLD-012 | balance | Monetary | Balance (debit-credit) |
| GAP-FLD-013 | display_type | Selection | Tipo de linea |
| GAP-FLD-014 | tax_base_amount | Monetary | Base imponible |
| GAP-FLD-015 | tax_repartition_line_id | FK | Distribucion impuesto |
| GAP-FLD-016 | amount_residual | Monetary | Monto residual |
| GAP-FLD-017 | amount_residual_currency | Monetary | Residual en moneda |
| GAP-FLD-018 | reconciled | Boolean | Estado reconciliacion |
| GAP-FLD-019 | matching_number | Char | Numero matching |
| GAP-FLD-020 | date_maturity | Date | Fecha vencimiento |
| GAP-FLD-021 | discount | Float | Descuento por linea |
| GAP-FLD-022 | discount_date | Date | Fecha descuento pronto pago |
### account.journal / journals
| GAP ID | Campo | Tipo | Impacto |
|--------|-------|------|---------|
| GAP-FLD-023 | suspense_account_id | FK | Cuenta de suspension |
| GAP-FLD-024 | profit_account_id | FK | Cuenta de ganancia |
| GAP-FLD-025 | loss_account_id | FK | Cuenta de perdida |
| GAP-FLD-026 | bank_account_id | FK | Cuenta bancaria |
| GAP-FLD-027 | sequence | Integer | Orden |
| GAP-FLD-028 | restrict_mode_hash_table | Boolean | Hash de seguridad |
### account.tax / taxes
| GAP ID | Campo | Tipo | Impacto |
|--------|-------|------|---------|
| GAP-FLD-029 | tax_scope | Selection | Alcance (service/consu) |
| GAP-FLD-030 | sequence | Integer | Orden de aplicacion |
| GAP-FLD-031 | description | Html | Descripcion |
| GAP-FLD-032 | invoice_label | Char | Etiqueta en factura |
| GAP-FLD-033 | tax_exigibility | Selection | Exigibilidad (on_invoice/on_payment) |
| GAP-FLD-034 | cash_basis_transition_account_id | FK | Cash basis |
| GAP-FLD-035 | is_base_affected | Boolean | Impuestos en cascada |
| GAP-FLD-036 | analytic | Boolean | Incluir en analitica |
| GAP-FLD-037 | country_id | FK | Pais |
### account.payment / payments
| GAP ID | Campo | Tipo | Impacto |
|--------|-------|------|---------|
| GAP-FLD-038 | name | Char | Numero de pago |
| GAP-FLD-039 | is_sent | Boolean | Enviado |
| GAP-FLD-040 | partner_bank_id | FK | Cuenta bancaria destino |
| GAP-FLD-041 | paired_internal_transfer_payment_id | FK | Transferencias internas |
| GAP-FLD-042 | memo | Char | Memo |
| GAP-FLD-043 | outstanding_account_id | FK | Cuenta outstanding |
| GAP-FLD-044 | destination_account_id | FK | Cuenta destino |
| GAP-FLD-045 | partner_type | Selection | customer/supplier |
## 5.3 ENUMs Incompletos (MEDIO)
| GAP ID | ENUM | Valores Faltantes |
|--------|------|-------------------|
| GAP-ENM-001 | invoice_type | out_refund, in_refund, out_receipt, in_receipt, entry |
| GAP-ENM-002 | account_type | 13 subtipos especificos |
| GAP-ENM-003 | journal_type | credit (Credit Card) |
| GAP-ENM-004 | payment_state | blocked, invoicing_legacy |
| GAP-ENM-005 | tax_type | Diferencia nomenclatura (sale vs sales) |
## 5.4 Funcionalidades Faltantes (CRITICO)
| GAP ID | Funcionalidad | Descripcion |
|--------|---------------|-------------|
| GAP-FUN-001 | Tax Repartition | Sistema de distribucion de impuestos |
| GAP-FUN-002 | Cash Basis Accounting | Contabilidad base efectivo |
| GAP-FUN-003 | Fiscal Positions | Posiciones fiscales para impuestos/cuentas |
| GAP-FUN-004 | Bank Statement Lines | Lineas de extracto bancario |
| GAP-FUN-005 | Auto-Post Entries | Asientos automaticos recurrentes |
| GAP-FUN-006 | Invoice Reversal | Sistema completo de reversiones |
| GAP-FUN-007 | Multi-currency Reconciliation | Reconciliacion multi-moneda avanzada |
| GAP-FUN-008 | Hash Security | Inalterabilidad de asientos |
| GAP-FUN-009 | Early Payment Discount | Descuento por pronto pago |
| GAP-FUN-010 | Reconcile Models | Modelos de reconciliacion automatica |
| GAP-FUN-011 | Payment Terms Lines | Lineas de terminos de pago (multi-vencimiento) |
| GAP-FUN-012 | Account Tags | Sistema de etiquetas para reportes |
---
# 6. PORCENTAJE DE COBERTURA
## 6.1 Por Tablas/Modelos
| Categoria | Odoo | ERP-Core | Cobertura |
|-----------|------|----------|-----------|
| Modelos Core | 30 | 18 | 60% |
## 6.2 Por Campos (Modelos Core)
| Modelo | Campos Odoo | Campos ERP | Campos Equivalentes | Cobertura |
|--------|-------------|------------|---------------------|-----------|
| account.move | ~70 | ~25 | 18 | 26% |
| account.move.line | ~55 | ~18 | 14 | 25% |
| account.journal | ~45 | ~12 | 8 | 18% |
| account.account | ~25 | ~12 | 8 | 32% |
| account.tax | ~30 | ~15 | 10 | 33% |
| account.payment | ~45 | ~15 | 9 | 20% |
| account.payment.term | ~15 | ~8 | 5 | 33% |
| account.tax.group | ~10 | ~5 | 3 | 30% |
| account.partial.reconcile | ~12 | ~11 | 9 | 75% |
| account.full.reconcile | ~4 | ~3 | 2 | 50% |
## 6.3 Por ENUMs
| ENUM | Valores Odoo | Valores ERP | Cobertura |
|------|--------------|-------------|-----------|
| move_type/invoice_type | 7 | 2 | 29% |
| account_type | 18 | 5 | 28% |
| journal_type | 6 | 5 | 83% |
| payment_state | 7 | 5 | 71% |
| tax_type_use | 3 | 3 | 100% (nomenclatura diferente) |
## 6.4 Por Funciones
| Categoria | Funciones Odoo | Funciones ERP | Cobertura |
|-----------|----------------|---------------|-----------|
| Validacion | ~15 | 2 | 13% |
| Computo | ~50 | 2 | 4% |
| Acciones | ~30 | 2 | 7% |
| Reconciliacion | ~20 | 0 | 0% |
## 6.5 Cobertura General Estimada
| Aspecto | Cobertura |
|---------|-----------|
| Estructura de Datos | 35% |
| Logica de Negocio | 15% |
| Funcionalidad Completa | 25% |
---
# 7. RECOMENDACIONES PRIORITARIAS
## 7.1 Prioridad CRITICA (Bloqueante)
1. **Agregar move_type/invoice_subtype**: Distinguir facturas, notas de credito y recibos
2. **Crear account_types expandido**: Los 18 tipos de Odoo vs 5 genericos
3. **Agregar amount_residual a journal_entry_lines**: Fundamental para reconciliacion
4. **Crear bank_statement_lines**: Completar flujo de conciliacion bancaria
5. **Agregar campos de reconciliacion**: reconciled, matching_number, full_reconcile_id
## 7.2 Prioridad ALTA (Importante)
6. **Crear tax_repartition_lines**: Distribucion de impuestos
7. **Agregar fiscal_position**: Mapeo fiscal por cliente
8. **Agregar date_maturity a lineas**: Vencimiento por linea
9. **Agregar display_type a lineas**: Tipo de linea (product, tax, payment_term, etc.)
10. **Expandir payment_terms con lineas**: Soportar multiples vencimientos
## 7.3 Prioridad MEDIA (Mejora)
11. **Agregar cash_basis a taxes**: Contabilidad base efectivo
12. **Agregar reversiones**: reversed_entry_id, reversal_move_ids
13. **Agregar hash de seguridad**: inalterable_hash
14. **Crear reconcile_models**: Reconciliacion automatica
15. **Agregar account_tags**: Reportes personalizados
---
# 8. RESUMEN EJECUTIVO
## Fortalezas de ERP-Core:
- Arquitectura multi-tenant nativa
- Sistema de auditoria robusto (created_by, updated_by, etc.)
- Estructura de fiscal_years y fiscal_periods
- RLS (Row Level Security) implementado
- Triggers automaticos para tracking
## Debilidades vs Odoo:
- **Modelo unificado de facturas**: Odoo usa account.move para todo (asientos, facturas, pagos). ERP-Core separa en tablas.
- **Sistema de tipos de cuenta**: Odoo tiene 18 tipos especificos vs 5 genericos en ERP-Core.
- **Reconciliacion**: Faltan campos criticos para reconciliacion avanzada.
- **Distribucion de impuestos**: Falta tax_repartition_lines para reportes fiscales.
- **Extractos bancarios**: Implementacion muy basica.
## Cobertura General: ~25-30%
Para alcanzar paridad funcional con Odoo Account, se requiere:
1. Expandir ENUMs con subtipos
2. Agregar ~45 campos a tablas existentes
3. Crear ~10 tablas adicionales
4. Implementar ~30+ funciones de negocio