# Accounting & Journal Entries - How It Works ## Executive Summary **There is NO duplicate journal entry creation.** The system is working correctly. When you create and post invoices/bills, commission and expenses are added as **invoice lines**, not as separate journal entries. When the invoice is posted, Odoo automatically creates ONE journal entry that includes all the invoice lines (products, commission, expenses, shipping, etc.). --- ## How Commission and Expense Accounting Works ### Modern Workflow (Current Implementation) ✅ #### 1. Creating Customer Invoices When you create a customer invoice using the "Create Invoice" wizard (`wizard/create_invoice_wizard.py`): 1. **Product lines** are added from Master Order lines 2. **Commission line** is added based on commission rate (e.g., 10% of product sales) 3. **Expense lines** are added for expenses that should be invoiced to the customer 4. **Shipping charge line** is added if applicable All of these are added as **invoice lines**, not as separate journal entries. #### 2. Posting the Invoice When you post the invoice using `action_post()`: - Odoo automatically creates **ONE journal entry** with multiple lines: - **Debit**: Customer Receivable Account (total amount owed by customer) - **Credit**: Income accounts for each line: - Product income account (for products sold) - Commission income account (for commission) - Expense income account (for reinvoiced expenses) - Shipping income account (for shipping charges) **Result**: ONE balanced journal entry that includes everything. #### 3. Example If you create an invoice with: - Products: $1,000 - Commission (10%): $100 - Shipping: $50 - **Total**: $1,150 The posted journal entry will be: ``` Date Account Debit Credit --------------------------------------------------------- 2024-01-14 Customer Receivable $1,150 2024-01-14 Product Income $1,000 2024-01-14 Commission Income $100 2024-01-14 Shipping Income $50 --------------------------------------------------------- TOTAL $1,150 $1,150 ✅ BALANCED ``` **This is ONE journal entry, not multiple separate entries.** --- ## Legacy Methods (DO NOT USE) ❌ The following methods exist in the code but are **NEVER called**: 1. `_create_commission_journal_entry()` in `models/master_order.py` 2. `_create_expense_customer_journal_entry()` in `models/master_order.py` 3. `_create_expenses_journal_entry()` in `models/master_order.py` These were part of an old workflow where commission and expenses were recorded as **separate journal entries** apart from the invoice. This approach was: - More complex to manage - Required manual reconciliation - Created confusion about whether items were "double-counted" **The old workflow has been completely replaced.** These methods are kept only for backward compatibility and are clearly marked as "LEGACY - DO NOT USE". --- ## Why You Might Think There Are "Duplicate" Entries You may see what looks like duplicate entries in Odoo, but they're actually the same data viewed from different perspectives: ### 1. **Journal Items vs. Invoices** - **Accounting > Journal Items**: Shows the raw journal entry with all debit/credit lines - **Invoicing > Customer Invoices**: Shows the invoice document with line items These are two views of the **SAME data**, not duplicates. ### 2. **Analytic Entries** If you have analytic accounting enabled: - Each invoice line creates an **analytic entry** on the analytic account - This is for cost/revenue tracking by project or department - These are **not journal entries**, they're analytic distribution records ### 3. **Partner Ledger** When you view the partner ledger for a customer: - You see the invoice amount as a single line - If you drill down, you see the invoice line details - Again, this is the **SAME data** viewed at different levels of detail --- ## Vendor Bills The same logic applies to vendor bills: ### Creating a Vendor Bill 1. Products, shipping costs, and other expenses are added as **bill lines** 2. When posted, Odoo creates **ONE journal entry**: - **Debit**: Expense accounts (for each bill line) - **Credit**: Vendor Payable Account (total amount owed to vendor) ### Example If you create a vendor bill for: - Product purchase: $800 - Shipping cost: $50 - **Total**: $850 The posted journal entry will be: ``` Date Account Debit Credit --------------------------------------------------------- 2024-01-14 Product Expense $800 2024-01-14 Shipping Expense $50 2024-01-14 Vendor Payable $850 --------------------------------------------------------- TOTAL $850 $850 ✅ BALANCED ``` --- ## What To Do If You See Unexpected Journal Entries If you're seeing journal entries that you think are duplicates: ### Step 1: Check the Journal Entry Source 1. Go to **Accounting > Accounting > Journal Items** 2. Find the journal entry you think is a duplicate 3. Check the **Reference** field - it will show you where it came from: - `INV/2024/00001` = Customer Invoice - `BILL/2024/00001` = Vendor Bill - `MISC/2024/00001` = Manual Journal Entry - `PAYMENT/2024/00001` = Payment ### Step 2: Verify It's Not the Same Entry 1. Check the **Date** and **Amount** 2. Check the **Partner** (customer/vendor) 3. Check the **Journal** (Sales, Purchase, Miscellaneous, etc.) If they match, they're likely the same entry viewed in different places. ### Step 3: Check for Manual Entries If you find entries with the reference pattern `MISC/*` or similar: - These might be manual journal entries created by mistake - Check if they reference the Master Order - These can be deleted if they're truly duplicates --- ## Best Practices ### ✅ DO: 1. **Create invoices/bills using the wizards** - they automatically include commission, expenses, and shipping as invoice lines 2. **Let Odoo create journal entries automatically** when you post invoices/bills 3. **Use the "Journal Items" report** to see the full accounting details 4. **Review the balance** - every journal entry should be balanced (Debit = Credit) ### ❌ DON'T: 1. **Don't manually create journal entries** for commission or expenses - they're already included in the invoice 2. **Don't use the legacy methods** (`_create_commission_journal_entry`, etc.) - they're deprecated 3. **Don't panic if you see "multiple" entries** - check if they're the same entry in different views 4. **Don't delete journal entries** without understanding their source - they might be legitimate --- ## Technical Details ### Code References #### Invoice Creation with Commission and Expenses **File**: `wizard/create_invoice_wizard.py` **Method**: `action_create_invoice()` **Lines**: 222-255 This is where commission and expense lines are added to the invoice: ```python # Add commission line (lines 222-239) if has_commission and total_products > 0: commission_amount = (total_products * self.commission_rate) / 100.0 if commission_amount > 0: commission_product = self._get_or_create_commission_product(master) invoice_vals['invoice_line_ids'].append((0, 0, { 'product_id': commission_product.id, 'name': f'Commission ({self.commission_rate}%)', 'quantity': 1.0, 'price_unit': commission_amount, # ... (account_id set from product's income account) })) # Add expense lines (lines 241-255) if has_expenses: for expense in self.expense_ids: expense_product = self._get_or_create_expense_product(expense, master) invoice_vals['invoice_line_ids'].append((0, 0, { 'product_id': expense_product.id, 'name': f'{expense.expense_type}: {expense.description}', 'quantity': 1.0, 'price_unit': expense.amount, # ... (account_id set from product's income account) })) ``` #### Invoice Posting (No Additional Journal Entries Created) **File**: `models/account_move.py` **Method**: `action_post()` **Lines**: 947-978 The override only validates balance and syncs bill lines to Master Order. **No additional journal entries are created**. ```python def action_post(self): """Override to validate invoice balance and sync vendor bill lines to Master Order. NOTE: Commission and expenses are added as invoice lines (not separate journal entries). When the invoice is posted, they become part of the invoice's journal entry automatically. """ # Validate balance before posting if self.move_type in ['out_invoice', 'out_refund', 'in_invoice', 'in_refund']: total_debit = sum(self.line_ids.mapped('debit')) total_credit = sum(self.line_ids.mapped('credit')) if abs(total_debit - total_credit) > 0.01: raise ValidationError(_('The entry is not balanced...')) res = super().action_post() # Standard Odoo posting - creates the journal entry # Sync vendor bill lines to MO when bill is posted if self.move_type == 'in_invoice' and self.master_order_id: for line in self.invoice_line_ids.filtered(...): line._sync_to_master_order() # Create supplier debt record for tracking if self.move_type == 'in_invoice' and self.master_order_customer_id: self._create_supplier_debt_record() # This creates a vera.client.supplier record, NOT a journal entry return res ``` --- ## Summary **The system is working correctly.** Commission and expenses are included as invoice lines, and when the invoice is posted, Odoo creates ONE balanced journal entry that includes everything. If you're seeing what looks like "duplicate" journal entries, they're likely: 1. The same entry viewed from different perspectives (Journal Items vs. Invoices) 2. Analytic entries (for project/department tracking) 3. Different entries for different transactions If you have specific journal entries you think are duplicates, please provide: - Journal Entry Reference numbers (e.g., `MISC/2024/00001`) - Dates and amounts - Partner names This will help identify if there's an actual issue or just confusion about how the accounting views work. --- **Last Updated**: 2026-01-14 **Module**: at_master_order **Version**: 18.0