Files
odoo-addons/addons/at_master_order/CUSTOMER_SUPPLIER_TRACKING_IMPLEMENTED.md

8.8 KiB

Complete Customer & Supplier Tracking - Implementation Summary

What Has Been Implemented

Phase 1: Bill-to-Customer Linking

Problem: Bills may not always have master_order_customer_id set correctly.

Solution Implemented:

  1. Auto-set customer in create() method (account_move.py):

    • When a bill is created with master_order_id, automatically sets master_order_customer_id
    • Ensures customer is always set when bill is created
  2. Auto-update customer in write() method (account_move.py):

    • When master_order_id changes, automatically updates master_order_customer_id
    • When master_order_id is removed, clears master_order_customer_id
  3. Enhanced _link_master_order() method (account_move.py):

    • Now always sets customer when linking to MO
    • Ensures customer is never missing when MO is linked
  4. Validation constraint (account_move.py):

    • _check_customer_consistency() ensures customer matches MO customer
    • Prevents data inconsistencies
  5. Auto-create supplier debt (account_move.py):

    • _create_supplier_debt_record() creates supplier debt when bill is posted
    • Ensures supplier debts are tracked per customer automatically

Phase 2: Supplier Payment Tracking

Problem: Supplier payments may not be properly linked to customers.

Solution Implemented:

  1. Enhanced payment-to-customer linking (document_links.py):

    • Method 1: From Master Order (existing)
    • Method 2: From master_order_customer_id on bills (NEW)
    • Method 3: From reconciled bills directly (NEW)
    • Ensures customer is always found when payment is made
  2. Supplier payment transaction creation (document_links.py):

    • Creates paid_out transaction for supplier payments
    • Links transaction to customer cash flow
    • Sets counterparty_id to supplier
  3. Auto-update supplier debt (document_links.py):

    • Calls cashflow._update_supplier_debt() when payment is made
    • Refreshes supplier debt totals automatically

Phase 3: Supplier Debt Tracking

Problem: Supplier debts may not reflect all bills correctly.

Solution Implemented:

  1. Auto-create supplier debt on bill post (account_move.py):

    • _create_supplier_debt_record() called when bill is posted
    • Creates vera.client.supplier record if doesn't exist
    • Links supplier debt to customer cash flow
  2. Update supplier debt method (vera_client_cashflow.py):

    • _update_supplier_debt() refreshes supplier debt totals
    • Called when payments are made
    • Ensures supplier debts are always up-to-date
  3. Supplier debt computation (vera_client_supplier.py):

    • Uses master_order_customer_id to find bills (more reliable)
    • Computes totals from bills and payments correctly
    • Shows accurate outstanding amounts per customer

Phase 4: Migration & Repair Tools

Implementation:

  1. Migration script (account_move_migration.py):

    • repair_all_bill_customers() - Fixes all bills with missing customer links
    • sync_all_payments_to_cashflow() - Syncs existing payments to cash flow
  2. Repair wizard (repair_customer_links_wizard.py):

    • UI for running repair operations
    • Options to repair bills, create supplier debts, sync payments
    • Shows summary of fixes

Data Flow Diagram

┌─────────────────┐
│ Master Order    │
│ (at.master.order)│
└────────┬────────┘
         │
         ├─── client_id → Customer
         │
         ├─── vendor_bill_ids → Bills
         │      ├─── master_order_id → MO ✅
         │      ├─── master_order_customer_id → Customer ✅ (AUTO-SET)
         │      └─── partner_id → Supplier
         │             │
         │             └─── When Posted:
         │                    ├─── Create vera.client.supplier ✅
         │                    └─── Update customer cash flow ✅
         │
         └─── customer_invoice_ids → Invoices
                ├─── master_order_id → MO ✅
                └─── partner_id → Customer ✅

When Payment Made:
┌─────────────────┐
│ Payment         │
│ (account.payment)│
└────────┬────────┘
         │
         ├─── Find Customer:
         │      ├─── From master_order_id ✅
         │      ├─── From bill.master_order_customer_id ✅ (NEW)
         │      └─── From reconciled bills ✅ (NEW)
         │
         ├─── Create Transaction ✅
         │      ├─── transaction_type: 'paid_out' (supplier)
         │      └─── counterparty_id: Supplier
         │
         └─── Update Supplier Debt ✅
                └─── vera.client.supplier.total_paid

Key Features

Automatic Customer Linking

  • Bills automatically get customer from MO
  • No manual linking required
  • Customer always set when MO is linked

Automatic Supplier Debt Tracking

  • Supplier debts created automatically when bills are posted
  • Updated automatically when payments are made
  • Per-customer supplier tracking

Complete Payment Tracking

  • All payments linked to customers
  • Transactions created automatically
  • Supplier payments tracked per customer

Data Integrity

  • Validation ensures customer matches MO customer
  • Repair tools fix existing data
  • Migration scripts sync historical data

Usage

Automatic (No Action Required)

  • Bills created from MO → Customer auto-set
  • Bills linked to MO → Customer auto-set
  • Bills posted → Supplier debt auto-created
  • Payments made → Transactions auto-created
  • Payments made → Supplier debt auto-updated

Manual Repair (If Needed)

  1. Go to Master Orders > Configuration
  2. Click "Repair Customer Links" button
  3. Select options:
    • Repair Bill Customer Links
    • Create Supplier Debt Records
    • Sync Payments to Cash Flow
  4. Click "Repair"

View Customer Tracking

  • Client Cash Flow → Shows all transactions per customer
  • Supplier Debts → Shows supplier debts per customer
  • Bill Tracking → Filter by customer
  • Advanced Supplier → Company-wide supplier tracking

Files Modified

Core Models:

  • models/account_move.py - Auto-set customer, create supplier debt
  • models/document_links.py - Enhanced payment-to-customer linking
  • models/vera_client_cashflow.py - Supplier debt update method
  • models/vera_client_supplier.py - Uses master_order_customer_id

Migration & Repair:

  • models/account_move_migration.py - Repair scripts
  • wizard/repair_customer_links_wizard.py - Repair wizard
  • wizard/repair_customer_links_wizard_views.xml - Wizard views

Documentation:

  • plans/CUSTOMER_SUPPLIER_TRACKING_PLAN.md - Full plan
  • CUSTOMER_SUPPLIER_TRACKING_IMPLEMENTED.md - This summary

Testing Checklist

  • Create bill from MO → Customer auto-set
  • Link bill to MO → Customer auto-set
  • Post bill → Supplier debt created
  • Pay vendor bill → Transaction created
  • Pay vendor bill → Supplier debt updated
  • Unlink bill from MO → Customer cleared
  • Run repair wizard → Fixes existing data

Benefits

  1. Complete Traceability - Every bill/payment linked to customer
  2. Accurate Supplier Debts - Per-customer supplier tracking
  3. Automatic Sync - No manual linking required
  4. Data Integrity - Validation ensures correctness
  5. Easy Repair - Wizard fixes existing data issues

Next Steps

  1. Deploy to server and upgrade module
  2. Run repair wizard to fix existing bills
  3. Test automatic customer linking
  4. Verify supplier debts are created correctly
  5. Monitor payment transactions are created

Example Scenarios

Scenario 1: Create Bill from MO

1. User clicks "Sync Bills" in Master Order
2. System creates vendor bills for each supplier
3. ✅ master_order_customer_id automatically set from MO.client_id
4. ✅ Bill posted → Supplier debt record created
5. ✅ Customer can see supplier debt in Cash Flow page

Scenario 2: Pay Vendor Bill

1. User pays vendor bill from Bill Tracking page
2. System finds customer from bill.master_order_customer_id
3. ✅ Creates paid_out transaction in customer cash flow
4. ✅ Updates supplier debt total_paid
5. ✅ Customer can see payment in transactions
1. User links existing bill to Master Order
2. ✅ master_order_customer_id automatically set
3. ✅ Supplier debt record created if bill is posted
4. ✅ Bill now appears in customer's supplier debts