Skip to content

Account Transfer Documentation

Overview

The Account Transfer module (account.transfer) manages fund transfers between bank accounts, cash accounts, or other GL accounts. Transfers create balanced journal entries moving funds from one account to another, supporting multi-currency transfers with exchange rate handling and tracking category allocation.


Model Information

Model Name: account.transfer Display Name: Transfer Name Field: date Key Fields: None (auto-increment ID) Default Sort Order: date desc, id desc

Features

  • ✅ Multi-company support
  • ✅ Multi-currency with exchange rates
  • ✅ State workflow (draft/posted/voided)
  • ✅ Automatic journal entry creation
  • ✅ Tracking category support
  • ✅ Sequence number generation
  • ✅ Document attachments

Key Fields Reference

Core Transfer Fields

Field Type Required Description
date Date Transfer date
number Char Transfer number (auto-generated)
account_from_id Many2One Source account
account_to_id Many2One Destination account
amount Decimal Amount leaving source account
amount_received Decimal Amount received in destination (for currency conversion)
ref Char Reference/memo
state Selection Draft/Posted/Voided
company_id Many2One Company (auto-filled)

Accounting Fields

Field Type Description
move_id Many2One Generated journal entry
track_id Many2One Tracking category (Track-1)
track2_id Many2One Tracking category (Track-2)
Field Type Description
comments One2Many Comments and notes
documents One2Many Document attachments

State Workflow

draft → posted → (voided)
  ↓       ↓
delete  to_draft
State Description
draft Initial state, can be edited or deleted
posted Transfer recorded, journal entry created
voided Transfer cancelled, journal entry voided

API Methods

1. Create Transfer

Method: create(vals, context)

Creates transfer in draft state with auto-generated number.

Example:

transfer_id = get_model("account.transfer").create({
    "date": "2025-01-15",
    "account_from_id": bank_account_id,
    "account_to_id": cash_account_id,
    "amount": 5000.00,
    "amount_received": 5000.00,
    "ref": "Petty cash replenishment"
})


2. Post Transfer

Method: post(ids, context)

Posts transfer and creates journal entry.

Behavior: 1. Validates accounts and amounts 2. Creates balanced journal entry: - Debit: To Account - Credit: From Account 3. Handles currency conversion if needed 4. Sets state to "posted"

Example:

get_model("account.transfer").post([transfer_id])

Journal Entry Created:

Dr  Destination Account    5,000
    Cr  Source Account              5,000


3. Void Transfer

Method: void(ids, context)

Voids posted transfer.

Example:

get_model("account.transfer").void([transfer_id])


4. To Draft

Method: to_draft(ids, context)

Reverts posted transfer to draft (voids and deletes journal entry).

Example:

get_model("account.transfer").to_draft([transfer_id])


5. Do Transfer (UI Action)

Method: do_transfer(ids, context)

Posts transfer and shows success message.


Common Use Cases

Use Case 1: Simple Bank-to-Cash Transfer

# Transfer from bank to petty cash
transfer_id = get_model("account.transfer").create({
    "date": "2025-01-15",
    "account_from_id": bank_account_id,
    "account_to_id": petty_cash_id,
    "amount": 1000.00,
    "amount_received": 1000.00,
    "ref": "Weekly petty cash"
})

get_model("account.transfer").post([transfer_id])
print("✓ Transfer posted")

Use Case 2: Multi-Currency Transfer

# Transfer from USD bank to THB bank
# Rate: 1 USD = 35 THB

usd_bank_id = get_model("account.account").search([
    ["code", "=", "1110"]
])[0]

thb_bank_id = get_model("account.account").search([
    ["code", "=", "1120"]
])[0]

transfer_id = get_model("account.transfer").create({
    "date": "2025-01-15",
    "account_from_id": usd_bank_id,
    "account_to_id": thb_bank_id,
    "amount": 1000.00,  # 1000 USD
    "amount_received": 35000.00,  # 35,000 THB
    "ref": "Currency conversion"
})

get_model("account.transfer").post([transfer_id])
# System handles currency conversion automatically

Use Case 3: Inter-Bank Transfer

# Transfer between two bank accounts
transfer_id = get_model("account.transfer").create({
    "date": "2025-01-15",
    "account_from_id": bank_a_id,
    "account_to_id": bank_b_id,
    "amount": 50000.00,
    "amount_received": 50000.00,
    "ref": "Fund reallocation"
})

get_model("account.transfer").post([transfer_id])

Use Case 4: Transfer with Tracking

# Transfer with department tracking
transfer_id = get_model("account.transfer").create({
    "date": "2025-01-15",
    "account_from_id": main_bank_id,
    "account_to_id": project_bank_id,
    "amount": 100000.00,
    "amount_received": 100000.00,
    "ref": "Project Alpha funding",
    "track_id": project_alpha_id  # Track to project
})

get_model("account.transfer").post([transfer_id])

Use Case 5: Void Transfer

# Void incorrect transfer
transfer = get_model("account.transfer").browse([transfer_id])[0]

if transfer.state == "posted":
    get_model("account.transfer").void([transfer_id])
    print("✓ Transfer voided")

Best Practices

1. Use Clear References

# Good: Descriptive reference
"ref": "Weekly petty cash replenishment - Week 3"

# Less helpful: Generic
"ref": "Transfer"

2. Verify Amounts for Currency Transfers

# Calculate received amount based on exchange rate
from_account = get_model("account.account").browse([from_account_id])[0]
to_account = get_model("account.account").browse([to_account_id])[0]

amount_sent = 1000.00
exchange_rate = 35.0

amount_received = get_model("currency").convert(
    amount_sent,
    from_account.currency_id.id,
    to_account.currency_id.id,
    date="2025-01-15"
)

transfer = {
    "amount": amount_sent,
    "amount_received": amount_received
}

3. Always Post Transfers

# Good: Post after creation
transfer_id = get_model("account.transfer").create({...})
get_model("account.transfer").post([transfer_id])

# Avoid: Leaving in draft indefinitely
# (Doesn't create accounting entries until posted)

Database Constraints

Delete Restriction

# Can only delete draft transfers
# Attempting to delete posted/voided transfers raises exception

Model Relationship Description
account.account Many2One Source and destination accounts
account.move Many2One Generated journal entry
account.track.categ Many2One Tracking categories
company Many2One Multi-company support
sequence Referenced Transfer number generation

Version History

Last Updated: 2025-12-16 Model Version: account_transfer.py Framework: Netforce


Additional Resources

  • Account Documentation: account.account
  • Journal Entry Documentation: account.move
  • Currency Documentation: currency

This documentation is generated for developer onboarding and reference purposes.