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

43 KiB

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):

[
    ('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):

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:

[
    ('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:

[
    ('sale', 'Sales'),
    ('purchase', 'Purchase'),
    ('cash', 'Cash'),
    ('bank', 'Bank'),
    ('credit', 'Credit Card'),
    ('general', 'Miscellaneous'),
]

Journal Type ERP-Core:

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):

[
    ("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):

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:

TYPE_TAX_USE = [
    ('sale', 'Sales'),
    ('purchase', 'Purchases'),
    ('none', 'None'),
]

Tax Type ERP-Core:

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:

[
    ('draft', "Draft"),
    ('in_process', "In Process"),
    ('paid', "Paid"),
    ('canceled', "Canceled"),
    ('rejected', "Rejected"),
]

Payment Status ERP-Core:

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:

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:

-- 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):

[
    ('draft', 'Draft'),
    ('posted', 'Posted'),
    ('cancel', 'Cancelled'),
]

ERP-Core (invoice_status):

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):

[
    ('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):

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):

[
    ('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):

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):

[
    ("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):

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)

  1. Crear tax_repartition_lines: Distribucion de impuestos
  2. Agregar fiscal_position: Mapeo fiscal por cliente
  3. Agregar date_maturity a lineas: Vencimiento por linea
  4. Agregar display_type a lineas: Tipo de linea (product, tax, payment_term, etc.)
  5. Expandir payment_terms con lineas: Soportar multiples vencimientos

7.3 Prioridad MEDIA (Mejora)

  1. Agregar cash_basis a taxes: Contabilidad base efectivo
  2. Agregar reversiones: reversed_entry_id, reversal_move_ids
  3. Agregar hash de seguridad: inalterable_hash
  4. Crear reconcile_models: Reconciliacion automatica
  5. 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