Opening Balance Entry

June 17, 2026 29 views admin

Opening Balance Entry — Complete User Guide

Comprehensive guide for opening balances system in Two Accounts Web


Table of Contents

  1. What Is an Opening Balance Entry?
  2. When To Use Opening Balance Entries
  3. When NOT To Use Opening Balance Entries
  4. Complete Field-by-Field Guide
  5. How Opening Balances Post to the General Ledger
  6. Balance Sheet Accounts — Double-Entry Posting
  7. Profit & Loss Accounts — Why They Are Excluded
  8. Foreign Currency Handling
  9. Sample Data & Output
  10. Edge Cases & Null Handling
  11. Lock Date Enforcement
  12. Viewing Opening Balances in Reports

§. Accounting Regulation Validation


1. What Is an Opening Balance Entry?

An Opening Balance Entry is used to seed the General Ledger with beginning balances when:

  • Migrating from another accounting system to this system
  • Starting a new fiscal year with balances carried forward
  • Setting up initial account balances for a new business

Each entry represents one account's opening balance on a specific financial year start date.


2. When To Use Opening Balance Entries

You should use this form for:

Scenario Example
Accounts Receivable — customer balances outstanding Customer A owes BDT 5,00,000
Accounts Payable — supplier balances unpaid You owe Supplier B BDT 3,00,000
Cash & Bank Accounts — cash in hand and at bank Bank ABC balance BDT 10,00,000
Loans Payable/Receivable — outstanding loans Bank loan balance BDT 50,00,000
Capital Accounts — owner's equity Owner's capital BDT 20,00,000
Special Accounts — special purpose balances Special deposit BDT 1,00,000
Investments — investment holdings 500 shares of XYZ Ltd at BDT 1,000/share
Intangible Assets — patents, trademarks, goodwill Patent valued at BDT 2,00,000
Employee Clearing — employee advance balances Employee advance BDT 50,000
Expense Claims — outstanding claims Unpaid claim BDT 25,000
Any Balance Sheet account — assets, liabilities, equity Any opening balance needed

3. When NOT To Use Opening Balance Entries

The system has dedicated forms for certain asset types. Do NOT use Opening Balance Entry for these:

Asset Type Use This Instead Why
Fixed Assets (machinery, vehicles, buildings) Fixed Asset form — set OpeningBalanceCost and OpeningBalanceAccumulatedDepreciation on each asset record The Fixed Asset form tracks individual assets with depreciation schedules, disposal tracking, and asset register reporting. An Opening Balance Entry posts to the GL account but creates NO asset-level tracking.
Inventory Items (stock on hand) Inventory Item form — set OpeningInventoryQuantity and OpeningInventoryCost on each item The Inventory Item form creates inventory cost layers that integrate with the costing engine (FIFO/LIFO/Moving Average). An Opening Balance Entry posts to the GL account but creates NO item-level tracking or cost layers.
Import Letter of Credit Payable Letter of Credit module — create LC with DocumentsPresented status The LC module auto-creates the complete LC liability, cost capitalization, and tax entries. An OB Entry would miss all the cost line splits, VAT calculations, and margin/financing allocations.
Export Letter of Credit Receivable Export Letter of Credit module — create with DocumentsShipped status The Export LC module auto-creates the receivable, clearing account, and fee handling.
LC Accrual Interest Payable LC Accrue Interest form on the LC View The accrual form calculates interest correctly based on days, rate, and financed portion.

If you must set an LC-related opening balance manually, use a Journal Entry with the IsLCAdjustment or IsExportLCAdjustment flag set, and link to the specific LC. Do NOT use the Opening Balance Entry form for LC-related accounts.


4. Complete Field-by-Field Guide

The Form Fields

Field Required? What To Enter If Left Blank
Account ✅ Yes Select the GL account from the Chart of Accounts. Only Balance Sheet accounts are available (Assets, Liabilities, Equity). Profit & Loss accounts are not shown because they are temporary accounts that start each period at zero (per IAS 1 Section 35). Entry is skipped entirely — no GL posting
Customer ❌ Only if Account = AR Select the customer with outstanding balance AR entry has no customer link — treated as generic AR
Supplier ❌ Only if Account = AP Select the supplier with outstanding balance AP entry has no supplier link — treated as generic AP
Bank Account ❌ Only if Account = Cash/Bank Select the bank account Cash entry has no bank link — treated as generic cash
Employee ❌ Only if Account = Employee Clearing Select the employee Entry has no employee link
Capital Account ❌ Only if Account = Capital Accounts Select the capital account Entry has no capital account link
Special Account ❌ Only if Account = Special Accounts Select the special account Entry has no special account link
Investment ❌ Only if Account = Investments Select the investment Entry has no investment link
Intangible Asset ❌ Only if Account = Intangible Assets Select the intangible asset Entry has no asset link
Expense Claims Payer ❌ Only if Account = Expense Claims Select the expense claims payer Entry has no payer link
Quantity ❌ Only for Investments Number of shares/units Quantity not recorded in GL
Financial Year Start ✅ Yes The fiscal year date this balance belongs to (e.g., 7/1/2026) Entry may post to wrong period
Debit or Credit ✅ Yes Select Debit or Credit Entry amount sign is wrong
Amount ✅ Yes (or AmountInCurrency if foreign) Amount in base currency Entry skipped (0 amount)
Description Optional notes about this entry No description displayed
Entry Date ✅ Yes When this entry was created/effective Informational — not used in GL posting
Created At Immutable audit trail — records when the opening balance record was first created. Not used in any business logic or reporting
Reference Optional reference number No reference displayed
Division Operational division Reported without division filter
Currency ❌ Only if foreign currency Select the foreign currency Treated as base currency
Amount In Currency ❌ Only if Currency is set Amount in foreign currency Base amount used directly
Exchange Rate ❌ Only if Currency is set Rate from foreign to base currency If 0, no conversion occurs
Exchange Rate Is Inverse ❌ Only if Currency is set Check if rate is inverse format Standard direct rate used

Entity Field Visibility

The Customer, Supplier, Bank Account, Employee, Capital Account, Special Account, Investment, Intangible Asset, and Expense Claims Payer fields are conditionally visible — they only appear when the selected Account matches the expected type:

Account Selected Entity Field That Appears
Accounts Receivable (AR) / ControlAccountForCustomers Customer
Accounts Payable (AP) / ControlAccountForSuppliers Supplier
Cash at Bank / ControlAccountForBankAccounts Bank Account
Employee Clearing / ControlAccountForEmployees Employee
Capital Accounts / ControlAccountForCapitalAccounts Capital Account
Special Accounts / ControlAccountForSpecialAccounts Special Account
Investments / ControlAccountForInvestments Investment + Quantity
Intangible Assets / Accumulated Amortization Intangible Asset
Expense Claims Expense Claims Payer

If the field does not appear: Double-check that you have selected the correct Account type from the Chart of Accounts.


5. How Opening Balances Post to the General Ledger

The Opening Balance Entry form only allows selecting Balance Sheet accounts (Assets, Liabilities, Equity). Profit & Loss accounts are excluded because they are temporary accounts that start each period at zero.

When you save an Opening Balance Entry, every entry creates 2 General Ledger transactions with a built-in balancing entry — guaranteeing DR = CR.

The Posting Rule

Account Type Available in Form? Entries Created Why
Balance Sheet (Asset, Liability, Equity) ✅ Available 2 entries — Dr/Cr target account + opposite Dr/Cr RetainedEarnings The balance sheet must stay balanced. The offset to RetainedEarnings ensures Assets = Liabilities + Equity.
Profit & Loss (Income, Expense) Not available N/A P&L accounts are temporary — they start each period at zero per IAS 1 Section 35. To seed a P&L account, use a Journal Entry instead.

Why P&L Accounts Are Excluded

Per IAS 1 Section 35 and ASC 220-10-45, Profit & Loss accounts cannot have carried-forward opening balances — they are temporary accounts that are closed to Retained Earnings at each period end. If P&L opening balances were allowed:

  • They would need to post a balancing entry to Retained Earnings (to maintain DR = CR)
  • Then at period-end, the P&L close would also post to Retained Earnings
  • The result: double-counting in Retained Earnings
If P&L opening balance were possible (it is not):
  Dr  SalaryExpense             5,00,000    (opening balance entry)
  Cr  RetainedEarnings           5,00,000    (balancing entry to RE)

At period end:
  Cr  SalaryExpense             5,00,000    (close to P&L summary)
  Dr  RetainedEarnings           5,00,000    (close to RE — second hit)

Result: RetainedEarnings = 5,00,000 - 5,00,000 = 0 ❌
        But it should be -5,00,000 (expense reduces equity)

To seed a P&L account with an opening balance, use a Journal Entry instead — posting directly to the P&L account with an offset to whatever Balance Sheet account is appropriate.


6. Balance Sheet Accounts — Double-Entry Posting

Each Opening Balance Entry creates 2 General Ledger transactions:

Entry 1: Post to the Target Account

Dr  AccountsReceivable (or your selected account)    Amount    (if Debit selected)
OR
Cr  AccountsReceivable (or your selected account)    Amount    (if Credit selected)

Entry 2: Post Opposite to Retained Earnings

Cr  RetainedEarnings                                  Amount    (opposite of Entry 1)
OR
Dr  RetainedEarnings                                  Amount    (opposite of Entry 1)

Why This Is Correct

The double-entry ensures that the accounting equation stays in balance:

Before:  Assets(0) - Liabilities(0) = Equity(0)
After:   Assets(5,00,000) - Liabilities(0) = Equity(5,00,000)
                                            ↑
                                     RetainedEarnings increased

Example — Customer AR Opening Balance

Scenario: Customer ABC has an outstanding balance of BDT 5,00,000 at the start of the fiscal year.

Entry in the form:

Account:      Accounts Receivable (AR)
Customer:     ABC Trading
Financial Year Start:  7/1/2026
Debit or Credit:       Debit
Amount:               5,00,000

GL entries created:

Entry 1:  Dr  AccountsReceivable (ABC Trading)    5,00,000
Entry 2:  Cr  RetainedEarnings                     5,00,000
                                     Total Dr = 5,00,000
                                     Total Cr = 5,00,000  ✅ DR = CR

Example — Supplier AP Opening Balance

Scenario: You owe Supplier XYZ BDT 3,00,000 at the start of the fiscal year.

Entry in the form:

Account:      Accounts Payable (AP)
Supplier:     XYZ Suppliers
Financial Year Start:  7/1/2026
Debit or Credit:       Credit
Amount:               3,00,000

GL entries created:

Entry 1:  Cr  AccountsPayable (XYZ Suppliers)     3,00,000
Entry 2:  Dr  RetainedEarnings                     3,00,000
                                     Total Dr = 3,00,000
                                     Total Cr = 3,00,000  ✅ DR = CR

Example — Bank Account Opening Balance

Scenario: Bank ABC has a balance of BDT 10,00,000 at the start of the fiscal year.

Entry in the form:

Account:      Cash at Bank (Bank ABC)
Bank Account: Bank ABC
Financial Year Start:  7/1/2026
Debit or Credit:       Debit
Amount:               10,00,000

GL entries created:

Entry 1:  Dr  CashAtBank (Bank ABC)              10,00,000
Entry 2:  Cr  RetainedEarnings                    10,00,000
                                     Total Dr = 10,00,000
                                     Total Cr = 10,00,000  ✅ DR = CR

Example — Loan Payable Opening Balance

Scenario: You have an outstanding bank loan of BDT 50,00,000.

Entry in the form:

Account:      Loan Payable (or your liability account)
Financial Year Start:  7/1/2026
Debit or Credit:       Credit
Amount:              50,00,000

GL entries created:

Entry 1:  Cr  LoanPayable                         50,00,000
Entry 2:  Dr  RetainedEarnings                    50,00,000
                                     Total Dr = 50,00,000
                                     Total Cr = 50,00,000  ✅ DR = CR

Example — Capital Account Opening Balance

Scenario: Owner's capital is BDT 20,00,000.

Entry in the form:

Account:      Capital Accounts
Capital Account: Owner's Equity
Financial Year Start:  7/1/2026
Debit or Credit:       Credit
Amount:              20,00,000

GL entries created:

Entry 1:  Cr  CapitalAccount (Owner's Equity)     20,00,000
Entry 2:  Dr  RetainedEarnings                    20,00,000
                                     Total Dr = 20,00,000
                                     Total Cr = 20,00,000  ✅ DR = CR

7. Profit & Loss Accounts — Why They Are Excluded

The Opening Balance Entry form only allows Balance Sheet accounts (Assets, Liabilities, Equity). The Account field is filtered to show only accounts that implement Balance Sheet Account. Profit & Loss accounts do not appear in the autocomplete list.

Why This Restriction Exists

Per IAS 1 Section 35, Profit & Loss accounts are temporary accounts — they start each period at zero and are closed to Retained Earnings at period end. Allowing opening balances on P&L accounts would create an accounting paradox:

If a P&L opening balance were allowed:
  Option A — No balancing entry:
    Dr  RentExpense                   1,00,000
    → Dr ≠ Cr  ❌  (violates double-entry)

  Option B — With RetainedEarnings offset:
    Dr  RentExpense                   1,00,000
    Cr  RetainedEarnings              1,00,000
    → At period end: RentExpense closed to RE
    → RE affected TWICE (once from OB, once from close)  ❌

There is no way to post a P&L opening balance while maintaining both double-entry integrity AND correct Retained Earnings. The only correct solution is to exclude P&L accounts from the Opening Balance Entry form.

How to Seed P&L Accounts If Needed

If you need to seed a P&L account (e.g., to enter a prior-period expense or deferred revenue carried from a migration), use a Journal Entry instead:

Step Action
1 Navigate to Journal Entries > New Journal Entry
2 Create a line for the P&L account (Dr or Cr)
3 Create a balancing line for the offset account (usually Retained Earnings)
4 Set the date to the first day of the fiscal year
5 Include a clear description like "Opening balance — Rent Expense"

Example Journal Entry for seeding a P&L account:

Date: 7/1/2026
Narration: Opening balance — Prepaid Rent from migration

Line 1: Dr  Rent Expense                    1,00,000
Line 2: Cr  RetainedEarnings                 1,00,000
                                     Total Dr = 1,00,000
                                     Total Cr = 1,00,000  ✅ DR = CR

8. Foreign Currency Handling

When Currency Applies

The Currency field becomes visible when: - The entity (Customer, Supplier, or Bank Account) has a default currency set - Or you manually select a Foreign Currency

Auto-Population

When you select an entity that has a default currency, the system automatically populates the Currency field:

Account Type Source of Auto-Populated Currency
Accounts Receivable Customer's default currency
Accounts Payable Supplier's default currency
Cash at Bank Bank Account's default currency
Employee Clearing Employee's default currency
Special Accounts Special Account's default currency
Capital Accounts Capital Account's default currency

How the Base Amount Is Computed

When Currency and AmountInCurrency are set, the system:

  1. Takes the AmountInCurrency
  2. Multiplies by the Exchange Rate (or divides if inverse)
  3. Rounds to the base currency's decimal places
  4. Rounds to the foreign currency's decimal places
If Debit is selected:
  obAmount = +AmountInCurrency (positive)
If Credit is selected:
  obAmount = -AmountInCurrency (negative)

Base Amount = |obAmount| × (ExchangeRate or 1/ExchangeRate if inverse)

Example — Foreign Currency AR

Scenario: Customer ABC (USD-based) owes USD 5,000. Exchange rate is 110 (1 USD = 110 BDT).

Entry in the form:

Account:      Accounts Receivable
Customer:     ABC Trading (USD)
Financial Year Start:  7/1/2026
Debit or Credit:       Debit
Amount:               5,50,000       computed: 5,000 × 110
Amount In Currency:   5,000          in USD
Currency:             USD
Exchange Rate:        110
Exchange Rate Is Inverse:  No

GL entries created:

Entry 1:  Dr  AccountsReceivable (ABC Trading)    USD 5,000  (BDT 5,50,000)
Entry 2:  Cr  RetainedEarnings                    BDT 5,50,000
                                     Total Dr = 5,50,000
                                     Total Cr = 5,50,000  ✅ DR = CR

Example — Inverse Exchange Rate

If the exchange rate is entered as inverse (1 BDT = 0.0091 USD):

Entry in the form:

Amount In Currency:   5,000         ← in USD
Exchange Rate:        0.0091
Exchange Rate Is Inverse:  Yes      ← Checked

Base Amount computed:

Base Amount = 5,000 / 0.0091 = 5,49,450.55 (rounded to currency decimals)

What Happens If Exchange Rate Is 0

If Exchange Rate = 0 when a Currency is set, the system treats the amount as base currency — no conversion occurs. The Amount in Currency is used directly. This can materially misstate the GL.

Always verify the Exchange Rate is > 0 when using a foreign currency.


9. Sample Data & Output

Complete Sample — Migrating from Another System

Scenario: Your previous accounting system has the following balances as of July 1, 2026:

Account Type Entity Debit/Credit Amount (BDT)
Cash at Bank Asset Bank ABC Debit 10,00,000
Accounts Receivable Asset Customer ABC Debit 5,00,000
Accounts Receivable Asset Customer DEF Debit 3,00,000
Inventory (via Item form) Asset Widget-X 15,00,000
Fixed Assets (via FA form) Asset Machine-Z 25,00,000
Accounts Payable Liability Supplier XYZ Credit 4,00,000
Bank Loan Liability Bank Loan Credit 20,00,000
Capital Account Equity Owner's Capital Credit 30,00,000
Retained Earnings Equity (auto-computed) Credit 4,00,000 (balancing)

Entries to create using Opening Balance Entry form:

Entry 1 — Cash at Bank:

Account:      Cash at Bank
Bank Account: Bank ABC
Debit:        
Amount:      10,00,000
Financial Year Start:  7/1/2026

Entry 2 — Accounts Receivable (Customer ABC):

Account:      Accounts Receivable
Customer:     ABC Trading
Debit:        
Amount:       5,00,000
Financial Year Start:  7/1/2026

Entry 3 — Accounts Receivable (Customer DEF):

Account:      Accounts Receivable
Customer:     DEF Corporation
Debit:        
Amount:       3,00,000
Financial Year Start:  7/1/2026

Entry 4 — Accounts Payable (Supplier XYZ):

Account:      Accounts Payable
Supplier:     XYZ Suppliers
Credit:       
Amount:       4,00,000
Financial Year Start:  7/1/2026

Entry 5 — Bank Loan:

Account:      Bank Loan Payable (your liability account)
Credit:       
Amount:      20,00,000
Financial Year Start:  7/1/2026

Entry 6 — Capital Account:

Account:      Capital Accounts
Capital Account: Owner's Capital
Credit:       
Amount:      30,00,000
Financial Year Start:  7/1/2026

Separately (not via OB Entry form):

  • Inventory: Go to Inventory Item form for Widget-X → set OpeningInventoryQty = 1,000, OpeningInventoryCost = 15,00,000, OpeningInventoryDate = 7/1/2026
  • Fixed Asset: Go to Fixed Asset form for Machine-Z → set OpeningBalanceCost = 25,00,000, OpeningBalanceDate = 7/1/2026

What the General Ledger Shows After Posting

Account                              Dr              Cr
---------------------------------  ----------      ----------
Cash at Bank (Bank ABC)            10,00,000
Accounts Receivable (ABC)           5,00,000
Accounts Receivable (DEF)           3,00,000
Accounts Payable (XYZ)                               4,00,000
Bank Loan Payable                                    20,00,000
Capital Account (Owner's Capital)                    30,00,000
Retained Earnings                                    4,00,000    ← auto-computed
Inventory (Widget-X)               15,00,000
Fixed Assets at Cost (Machine-Z)   25,00,000
Fixed Assets Accum Depreciation          0
                                  ----------      ----------
Total                              58,00,000       58,00,000  ✅ DR = CR

Balance Sheet After Posting

Assets:
  Cash at Bank (Bank ABC)                   10,00,000
  Accounts Receivable (ABC)                  5,00,000
  Accounts Receivable (DEF)                  3,00,000
  Inventory (Widget-X)                      15,00,000
  Fixed Assets at Cost (Machine-Z)          25,00,000
  Less: Accum. Depreciation                        0
  Total Assets                              58,00,000

Liabilities:
  Accounts Payable (XYZ)                     4,00,000
  Bank Loan Payable                         20,00,000
  Total Liabilities                         24,00,000

Equity:
  Capital Account (Owner's Capital)         30,00,000
  Retained Earnings                          4,00,000
  Total Equity                              34,00,000

Total Liabilities + Equity                  58,00,000  ✅ A = L + E

Trial Balance After Posting

Account                              Debits        Credits
Cash at Bank                        10,00,000
Accounts Receivable                  8,00,000
Inventory                           15,00,000
Fixed Assets at Cost                25,00,000
Accounts Payable                                  4,00,000
Bank Loan Payable                                20,00,000
Capital Account                                   30,00,000
Retained Earnings                                 4,00,000
                                  ----------     ----------
Total                              58,00,000     58,00,000  ✅ DR = CR

10. Edge Cases & Null Handling

What Happens When Fields Are Blank

Condition Behavior
Account is blank Entry is skipped entirely — no GL entry created
Account is set but entity does not exist in DB Entry skipped — account resolves to null, continue
Amount is 0 Entry skippedif (obAmount == 0m) continue;
Debit/Credit not set Amount defaults to positive (Dr)
FinancialYearStart is MinValue Entry posts at year 0001 — breaks date-range reports
Customer blank (AR account) AR entry has no customer link
Supplier blank (AP account) AP entry has no supplier link
BankAccount blank (Cash account) Cash entry has no bank link
Currency set but ExchangeRate = 0 No conversion — raw Amount used as base
Currency not set Base currency assumed, no conversion
Qty = 0 Qty field is null on GL entry (not tracked)
Division blank No division tracking on GL entries
Reference blank No reference displayed
Description blank View shows "-"
Lock date set and FinancialYearStart <= lock date Entry rejected — 400 error with lock date message
P&L account selected Not possible — the Account field only shows Balance Sheet accounts. P&L accounts are excluded from the autocomplete list per IAS 1 Section 35.
BS account selected 2 entries created (with RE offset)
Cache miss on account type System attempts reflection-based Singleton lookup; if that fails, entry skipped

EntryDate vs FinancialYearStart

Field Used For Not Used For
FinancialYearStart ALL GL posting — date on the GL transaction Display sorting
EntryDate Display sorting in the list view GL posting (completely ignored)

This means the FinancialYearStart is the only date that matters for accounting. EntryDate is purely informational.


11. Lock Date Enforcement

If a Lock Date has been configured in Settings, the system prevents creating or editing Opening Balance Entries with a FinancialYearStart on or before the lock date:

Error: "No opening balance entry dated before lock date (6/30/2026) can be created or updated."

This ensures that locked accounting periods cannot be modified through opening balance entries.


12. Viewing Opening Balances in Reports

Opening Balances List View

Navigation: Settings > Opening Balance Entries

Columns displayed:

Column Source Description
Account Account field The GL account name with code
Customer/Supplier/Bank Entity field Linked entity name
Quantity Qty field Quantity (for investments)
Financial Year Start FinancialYearStart The fiscal year date
Currency Currency field Foreign currency code (or "-")
Amount Amount (or AmountInCurrency) Shows foreign amount if set, else base
Type DebitOrCredit "Debit" or "Credit"
Description Description Optional notes

Each row is clickable — opens the Opening Balance View showing full details.

Opening Balance View

Click any entry from the list to see the detail view showing: - Account name - Linked entity (Customer/Supplier/Bank/etc.) - Quantity (if any) - Financial Year Start date - Currency details (if foreign) - Debit or Credit amount - Exchange Rate (if foreign) - Entry Date - Description

How Opening Balances Appear in Financial Reports

Report How Opening Balances Appear
Balance Sheet BS account opening balances appear as part of each account's cumulative balance. They are not separately identifiable — they merge with other transactions.
Trial Balance Same as Balance Sheet — the OB amounts are included in each account's total DR/CR.
Profit & Loss P&L opening balances cannot be entered via this form — only Balance Sheet accounts are available. To seed a P&L account, use a Journal Entry instead (see Section 7).
General Ledger Transactions OB entries have a special "Opening Balance Entry" flag. They can be filtered by this flag if needed.
Inventory Reports Inventory opening balances come from the Inventory Item form, not from Opening Balance Entries.
Fixed Asset Register FA opening balances come from the Fixed Asset form, not from Opening Balance Entries.

§. Accounting Regulation Validation

Compliance Matrix

Standard Requirement How the System Satisfies It
IAS 1 Section 35 P&L accounts cannot have carried-forward opening balances — they start at zero each period The Account field is restricted to BalanceSheetAccount — P&L accounts are excluded from the form, preventing users from accidentally creating unbalanced or double-counted entries.
ASC 220-10-45 Comprehensive income cannot include prior-period P&L balances ✅ P&L accounts excluded from the form. Users who need to seed a P&L account must use a Journal Entry with a clear offset to Retained Earnings (see Section 7).
Double-Entry Bookkeeping Every debit must have a corresponding credit Balance Sheet accounts get 2 entries (target + RE). The system's balancing entry guarantees DR = CR for all BS accounts.
Accounting Equation Assets = Liabilities + Equity ✅ The RE offset ensures the BS stays balanced. All sample data verifies A = L + E.
IAS 21 Foreign currency transactions translated at spot rate ✅ Currency conversion using ExchangeRate with direct/inverse support. Dual rounding (FC then base currency).
IFRS 9 Financial assets/liabilities recognized at fair value ✅ Opening balances are recorded at historical cost (the amount entered by the user).
Materiality Minor differences are acceptable ✅ All entries are double-entry for Balance Sheet accounts. P&L accounts are excluded from the form to prevent accounting errors.
Lock Date / Period Close Locked periods cannot be modified ✅ FinancialYearStart is checked against LockDate. Entries in locked periods are rejected.
Audit Trail Changes must be trackable ✅ Each Opening Balance Entry has a CreatedAt timestamp (immutable), plus the system's standard Change tracking for all objects.
Cut-off / Period Allocation Transactions must be recorded in the correct period ✅ FinancialYearStart determines the period. Only this date is used for GL posting.

Why DR = CR Is Guaranteed for Balance Sheet Accounts

For every Balance Sheet account opening balance:

Step 1:  Dr/Cr TargetAccount    Amount           (user's entry)
Step 2:  Cr/Dr RetainedEarnings  Amount × -1     (automatic offset)

Result:  Total Dr = Total Cr  ✅  every time

The offset entry always uses the exact same amount (opposite sign), so DR = CR is guaranteed by construction.

Why P&L Accounts Are Excluded from the Form

The Opening Balance Entry form restricts the Account field to Balance Sheet accounts only. This is a deliberate design decision based on:

  • IAS 1 Section 35: P&L accounts cannot have carried-forward opening balances — they start each period at zero
  • ASC 220-10-45: Comprehensive income cannot include prior-period P&L balances