# 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