Skip to Content
Go Realm v1 is released 🎉
Accountingবই (Print Edition)অধ্যায় ২৩: Statement of Changes in Equity

অধ্যায় ২৩ — Statement of Changes in Equity

Volume 1 · Part 3 — Financial Statements · Chapter 23

পূর্বশর্ত: অধ্যায় ২ (Closing Equity = Opening + Profit − Drawings), অধ্যায় ৩ (Retained Earnings — সেতু), অধ্যায় ৫ (3xxx system account), অধ্যায় ২০–২২


১. Learning Objective

এই অধ্যায় শেষে আপনি পারবেন:

Statement of Changes in Equity (SOCE) কী মাপে — "মালিকের অংশ কেন বদলাল" — চারটি কারণে Equity-র চারটি উপাদান — capital, retained earnings, current year profit, drawings/dividend — আর reserves কোথায় SOCE-কে একটা matrix হিসেবে পড়তে: column = উপাদান, row = কারণ, শেষ row = Balance Sheet-এর equity Sole proprietorship (Capital, Drawings) আর company (Share Capital, Retained Earnings, Dividend) — একই statement, দুই ভাষা Dividend declared বনাম paid — liability-র মাঝের ধাপ; drawings — কেন খরচ নয় Prior-period error / policy change — retained earnings-এ কেন, Income Statement-এ কেন নয় 3100, 3200, 3300, 3400 — চারটি account-এ কে post করে, কে করে না — নিয়ম ও enforcement SOCE-কে posted_lines থেকে source_type-ধরে বানাতে — নতুন table ছাড়া তিনটি cross-check: profit == Income Statement, closing == Balance Sheet, capital/dividend == Cash Flow financing

সময়: পড়া ৩০ মিনিট + অনুশীলন ৩৫ মিনিট।


২. Concept Explanation

চতুর্থ statement — সবচেয়ে ছোট, সবচেয়ে বাঁধুনি

তিনটি statement লেখা হয়ে গেছে। চতুর্থটা এক পাতার কম — কিন্তু এটাই তিনটিকে একটা সূত্রে বাঁধে, কারণ equity-ই সেই জায়গা যেখানে Income Statement Balance Sheet-এ ঢোকে (অধ্যায় ৩-এর “সেতু”)।

অধ্যায় ২-এর সূত্র:

Closing Equity = Opening Equity + Profit + নতুন পুঁজি − Drawings / Dividend

SOCE এই সূত্রটাই, উপাদান-ধরে ভেঙে। প্রশ্ন একটাই: ১ জুলাইয়ে মালিকের অংশ ছিল 11,20,000; ৩১ ডিসেম্বরে 13,98,365 — কেন? উত্তরের চারটি সম্ভাব্য কারণ, আর কোনোটাই নয়:

১. ব্যবসা লাভ/ক্ষতি করেছে Income Statement-এর net profit ২. মালিক টাকা দিয়েছেন পুঁজি (share issue / capital injection) ৩. মালিক টাকা নিয়েছেন drawings / dividend ৪. আগের বছরের ভুল / নীতি বদল retained earnings-এ সরাসরি (নিচে)

Equity বদলানোর পঞ্চম কোনো পথ নেই। কোনো entry equity-কে অন্যভাবে বদলালে (কেউ 3200-এ JV দিল “মেলানোর জন্য”) — এই statement সেটা ধরে, কারণ ওই Δ-র কোনো row নেই।

Matrix — column উপাদান, row কারণ

Share Retained Current Yr Drawings / Total Capital Earnings Profit Dividend Equity ───────── ────────── ────────── ────────── ────────── Balance, 1 July 2025 10,00,000 1,20,000 0 0 11,20,000 Net profit for the period — — 2,78,365 — 2,78,365 Capital introduced — — — — 0 Dividend / drawings — — — 0 0 ───────────────────────── ───────── ────────── ────────── ────────── ────────── Balance, 31 December 2025 10,00,000 1,20,000 2,78,365 0 13,98,365

শেষ row-টা অক্ষরে অক্ষরে Balance Sheet-এর equity section (অধ্যায় ২১)। Profit row-টা Income Statement-এর শেষ লাইন (অধ্যায় ২০)। Capital আর dividend row Cash Flow-এর financing section (অধ্যায় ২২) — যদি cash-এ হয়ে থাকে। তিনটি সূত্র, একটা ছোট table।

Sole proprietor বনাম company — একই কাঠামো

sole proprietorship / partnership company (limited) ────────────────────────────── ────────────────────────────── 3100 Capital 3100 Share Capital (একই account-এ লাভ জমে) 3200 Retained Earnings 3300 Current Year Profit 3400 Drawings 3400 Dividend (declared) partner-ধরে capital ও drawings shareholder-ধরে নয় — share register আলাদা

Company-তে লাভ আর পুঁজি আলাদা রাখতে হয় — আইন (share capital হাতে দেওয়া যায় না, dividend শুধু retained earnings থেকে)। Proprietor-এর জন্য এত ভাগ দরকার নেই, তবু এই বইয়ের COA (অধ্যায় ৫) চারটি রাখে — কারণ software-এ আলাদা রাখা সস্তা, পরে ভাগ করা দামি। Partnership: 3100 আর 3400 partner-ধরে subledger (party_id — অধ্যায় ১৪-এর কৌশল, এবার মালিকের জন্য)।

Drawings — খরচ নয়

মালিক ব্যবসা থেকে 60,000 নিলেন। এটা 52xx-এ নয়। ব্যবসা কিছু পায়নি (বেতন হলে পেত — কাজ); মালিক নিজের অংশ তুলে নিলেন। Income Statement অপরিবর্তিত; equity কমল:

Dr 3400 Drawings 60,000 ← contra-equity (অধ্যায় ৫) Cr 1120 Bank 60,000

Proprietor-এর “বেতন” — একই কথা: আইনত মালিক নিজেকে বেতন দিতে পারেন না (কিছু দেশে পারেন, tax-এর জন্য) — drawings। Developer-দের একটা সাধারণ ভুল: মালিকের ব্যক্তিগত খরচ (গাড়ির তেল) ব্যবসার 5260-এ — লাভ কম, কর কম, audit-এ ধরা।

Dividend — declared, তারপর paid

Company-তে দুই ধাপ, কারণ ঘোষণা আর টাকা আলাদা দিনে:

ঘোষণা (board resolution): Dr 3400 Dividend Declared Cr 2170 Dividend Payable ← liability; equity এখনই কমে পরিশোধ: Dr 2170 Dividend Payable Cr Bank ← এবার cash flow (financing)

SOCE ঘোষণার তারিখে দেখায়; Cash Flow পরিশোধের তারিখে। দুটোর মাঝে 2170 Balance Sheet-এ current liability। Interim dividend — বছরের মাঝে, current year profit থেকে — অনুমতি দেশভেদে; final dividend — AGM-এর পরে, retained earnings থেকে। Software-এ: dividend একটা document (dividend_declarations — তারিখ, হার, মোট, approved_by), JV নয়; section ৫।

Retained earnings — বছরের সেতু, আর ভুলের ঘর

অধ্যায় ৩: বছর শেষে সব revenue/expense শূন্য, নিট 3200-এ। এই বইয়ে দুই ধাপে — 4xxx/5xxx → 3300, তারপর 3300 → 3200 (অধ্যায় ২৬)। বছরের মাঝে 3200 স্থির — শুধু দুটো ব্যতিক্রম:

Prior-period error — গত বছরের হিসাবে ভুল, এ বছর ধরা পড়ল: গত বছরের 40,000 বিদ্যুতের bill post হয়নি। এ বছরের 5230-তে দিলে এ বছরের লাভ মিথ্যা কমে (এটা এ বছরের খরচ নয়)। IAS 8: retained earnings-এ, opening balance restateDr 3200 / Cr 2110, আর SOCE-তে একটা আলাদা row: “Prior-period adjustment”। Comparative column-ও restate (গত বছরের ছাপা statement বদলায় — তাই note বাধ্যতামূলক)।

Policy change — depreciation ৩৬ মাস থেকে ৬০ মাস; revenue recognition milestone থেকে percent-complete — retrospective প্রয়োগের cumulative effect retained earnings-এ, একই row।

দুটোই বিরল, বড়, approved — সাধারণ correction নয়। এ বছরের ভুল এ বছরেই (অধ্যায় ৪৩); “গত মাসের” ভুল এ বছরের ভিতরে Income Statement-এই। Materiality: 800 টাকার অনুমানের ভুল (অধ্যায় ১৮) retained earnings-এ নয়।

Reserves — সরিয়ে রাখা লাভ

কিছু দেশ/আইন retained earnings-এর একটা অংশ আলাদা রাখতে বলে (statutory reserve, general reserve) — dividend-এ দেওয়া যাবে না। এটা 3200 থেকে 3250-এ সরানো — equity-র ভিতরেই, মোট বদলায় না। SOCE-তে একটা row “Transfer to reserve”: retained earnings −, reserve +, total 0। Revaluation reserve (asset-এর দাম বাড়ল, অধ্যায় ৩০) আর FX translation reserve (অধ্যায় ৫৪) — “Other Comprehensive Income” — এই বইয়ের বাইরে; জেনে রাখুন column আরও হতে পারে, কাঠামো একই।

চারটি account, চারটি দরজা

3xxx-এ কে post করে — এটা এই অধ্যায়ের নকশা-কেন্দ্র:

account post করে কখনো নয় ───────────────────── ────────────────────────────── ──────────────────────── 3100 Share Capital capital transaction document manual JV ("adjustment") 3200 Retained Earnings closing entry (অধ্যায় ২৬), manual JV; "মেলানোর" plug prior-period adjustment (approved) 3300 Current Year Profit closing entry-র প্রথম ধাপ; মাসের মাঝে কিছু; report-এ computed 3400 Drawings / Dividend payment (party = owner), expense account-এ dividend declaration

অধ্যায় ৫-এর allow_manual_posting = false, system_account_key — এই চারটির জন্যই ছিল। SOCE-র প্রতিটি row একটা source_type — যা এই দরজাগুলো দিয়ে ঢোকে। যে entry কোনো দরজা দিয়ে ঢোকেনি, SOCE-তে তার row নেই — আর তখন opening + rows ≠ closing। এটাই এই statement-এর “layout-নিরপেক্ষ সত্য”।


৩. Accounting Rule

সূত্র

Closing Equity = Opening Equity + Net Profit + Capital Introduced − Drawings/Dividend ± Prior-period Adjustment প্রতিটি উপাদান (column)-এ একই সূত্র; Total column = Σ উপাদান

উপাদান ও চিহ্ন

Accountউপাদানস্বাভাবিকবাড়ে যখন
3100 Share Capital / CapitalপুঁজিCrমালিক টাকা/asset দেন
3200 Retained Earningsজমা লাভCrclosing entry (লাভ), prior-period adj (+/−)
3300 Current Year Profitএ বছরেরCrcomputed (মাঝে); closing entry (শেষে)
3400 Drawings / Dividendতুলে নেওয়াDr (contra)drawings, dividend declared
3250 Reserve (থাকলে)সরানো লাভCrtransfer from 3200

দরজা

3100 ← capital_transaction 3200 ← closing_entry, prior_period_adjustment 3300 ← closing_entry 3400 ← drawings (payment, party = owner), dividend_declaration manual JV → কোনোটায় নয়

Dividend

declared: Dr 3400 / Cr 2170 (liability) — SOCE-তে এই তারিখে paid: Dr 2170 / Cr Bank — Cash Flow-এ এই তারিখে

Prior-period

গত বছরের ভুল / নীতি বদল, material, approved → 3200, SOCE-তে আলাদা row, comparative restate, note এ বছরের ভুল → Income Statement (অধ্যায় ৪৩)

অলঙ্ঘনীয়

opening + Σ rows == closing (প্রতিটি column) profit row == Income Statement.net_profit (একই range) closing row == Balance Sheet.equity section (একই as_of)

৪. Real Business Example

১ জুলাই – ৩১ ডিসেম্বর ২০২৫ — software company

Equity account-এর ledger, ছয় মাস:

3100 Share Capital opening 10,00,000 Cr movement: নেই closing 10,00,000 Cr 3200 Retained Earnings opening 1,20,000 Cr movement: নেই closing 1,20,000 Cr 3300 Current Year Profit opening 0 movement: নেই (computed) closing 0 → report-এ 2,78,365 3400 Drawings opening 0 movement: নেই closing 0

তিন সারি খালি — ভালো: এই ছয় মাসে মালিক টাকা দেননি, নেননি, কেউ 3200 ছোঁয়নি। Statement:

STATEMENT OF CHANGES IN EQUITY সফটওয়্যার কোম্পানি লিমিটেড ১ জুলাই – ৩১ ডিসেম্বর ২০২৫ টাকা Share Retained Current Year Total Capital Earnings Profit Equity ────────── ────────── ────────── ────────── Balance at 1 July 2025 10,00,000 1,20,000 0 11,20,000 Net profit for the period (note ১) — — 2,78,365 2,78,365 Capital introduced — — — — Dividend declared — — — — ────────── ────────── ────────── ────────── Balance at 31 December 2025 10,00,000 1,20,000 2,78,365 13,98,365 ══════════ ══════════ ══════════ ══════════ ১ Income Statement, ১ জুলাই – ৩১ ডিসেম্বর ২০২৫ (অধ্যায় ২০)

যাচাই: 13,98,365 == অধ্যায় ২১-এর Total Equity ✓; 2,78,365 == অধ্যায় ২০-এর YTD ✓; Cash Flow-এর financing-এ পুঁজি/dividend 0 ✓ (অধ্যায় ২২ — শুধু loan)।

শুধু ডিসেম্বরের জন্য চাইলে: opening 13,07,565 (৩০ নভে), profit 90,800, closing 13,98,365 — একই কাঠামো, ছোট range।

একই statement, ঘটনাবহুল — একটা proprietorship

কাঠামো দেখাতে দ্বিতীয় উদাহরণ: “রহমান ট্রেডার্স”, মালিক একজন, অর্থবছর জানু–ডিসে ২০২৫:

০১-০১ opening: Capital 5,00,000 ১৫-০৩ মালিক নিজের গাড়ি ব্যবসায় দিলেন, মূল্য 8,00,000 Dr 1530 Vehicles / Cr 3100 Capital ← non-cash পুঁজি প্রতি মাসে ২৫ তারিখ মালিক 15,000 নিলেন "সংসার খরচ" Dr 3400 Drawings / Cr 1110 ← 12 × 15,000 = 1,80,000 ১০-০৮ মালিকের ছেলের স্কুল ফি ব্যবসার ব্যাংক থেকে 40,000 Dr 3400 Drawings / Cr 1120 ← খরচ নয় ২০-১১ ২০২৪-এর একটা bill 30,000 post হয়নি, এখন পাওয়া গেল Dr 3200? — proprietorship-এ 3100-এই Dr 3100 Capital / Cr 2110 ← prior-period ৩১-১২ বছরের লাভ (Income Statement) 2,10,000
STATEMENT OF CHANGES IN EQUITY — রহমান ট্রেডার্স, ২০২৫ Capital Drawings Total ────────── ────────── ────────── Balance at 1 January 2025 5,00,000 0 5,00,000 Prior-period adjustment — 2024 bill (note ২) (30,000) — (30,000) Restated balance at 1 January 2025 4,70,000 0 4,70,000 Capital introduced — vehicle (non-cash, note ৩) 8,00,000 — 8,00,000 Net profit for the year 2,10,000 — 2,10,000 Drawings — (2,20,000) (2,20,000) ────────── ────────── ────────── Balance at 31 December 2025 14,80,000 (2,20,000) 12,60,000 ══════════ ══════════ ══════════ ২ ২০২৪-এর supplier bill যা ২০২৪-এ post হয়নি; ২০২৪-এর comparative-এ A/P +30,000, capital −30,000 restated ৩ Cash Flow-এ নেই — non-cash financing, note-এ

তিনটি বিষয়। গাড়ি — equity বাড়ল 8,00,000, Cash Flow-এ শূন্য (অধ্যায় ২২-এর non-cash note)। স্কুল ফি — 5xxx-এ গেলে লাভ 1,70,000 হতো; drawings-এ ঠিক। 2024-এর bill — 2025-এর খরচে গেলে লাভ 1,80,000 দেখাত, যেটা 2025-এর সত্য নয়; opening restate — আর একটা আলাদা row, যাতে পাঠক দেখেন opening বদলেছে।

Proprietorship-এ বছর শেষে drawings capital-এ ঢোকে (Dr 3100 / Cr 3400, closing entry-র অংশ) — ২০২৬-এর opening capital 12,60,000, drawings 0।


৫. Implementation — Software ও Database

নতুন table নেই — source_type-ই row

SOCE-র প্রতিটি row = 3xxx account-এ একটা নির্দিষ্ট source_type-এর movement। অধ্যায় ৭-এর journal_entries.source_type (invoice, receipt, accrual, …) এখানে equity-র জন্য:

source_type row account ───────────────────── ────────────────────── ───────── capital_transaction Capital introduced 3100 drawings Drawings 3400 dividend_declaration Dividend declared 3400 prior_period_adjustment Prior-period adjustment 3200 (বা 3100) reserve_transfer Transfer to reserve 3200 → 3250 closing_entry (row নয় — বছর শেষে, নিচে) 4xxx/5xxx → 3300 → 3200 (computed) Net profit 3300 — movement() থেকে, অধ্যায় ২০
soce(company, from, to): cols = equity accounts (3xxx, posting) opening[c] = closing(company, from − 1 দিন)[c] -- অধ্যায় ২১ opening[3300] = currentYearProfit(company, from − 1 দিন) -- computed, FY-এর ভিতরে rows = posted_lines WHERE account ∈ cols AND posting_date ∈ [from, to] GROUP BY source_type, account -- প্রতিটি (row, column)-এ একটা সংখ্যা rows['net_profit'][3300] = incomeStatement(company, from, to).net_profit closing[c] = opening[c] + Σ rows[*][c] -- অলঙ্ঘনীয় প্রতিটি c: assert closing[c] == closing(company, to)[c] (3300: currentYearProfit(to)) (১) assert Σ closing == balanceSheet(to).total_equity (২) unknown = rows.keys() − known source_types; ≠ ∅ ⇒ ব্যর্থ ("3200-এ JV-12-0031, source manual") (৩)

(৩)-ই আসল দরজা-পাহারা: source_type = 'manual' কোনো 3xxx-এ থাকলে report ব্যর্থ, আর বার্তায় entry-র নম্বর। যা যাচাই ৬৫ রাতে ধরে, এটা report-এর সময় আবার ধরে — দুবার, কারণ এই ভুল সবচেয়ে সহজে হয় (“Balance Sheet মিলছে না, 3200-এ পার্থক্য দিয়ে দিই”)।

Closing entry-র মাস (জুন): 3300 → 3200-এর movement দুই column-এ ± সমান, total 0 — SOCE-তে “Transfer to retained earnings” row; বছরের SOCE-তে (জুলাই–জুন) profit column-এ opening 0, profit +X, transfer −X, closing 0 — আর retained earnings +X। অধ্যায় ২৬।

Capital transaction — document, JV নয়

capital_transactions id, company_id kind VARCHAR(20) -- injection | withdrawal (proprietor) | share_issue | share_buyback party_id BIGINT FK -- owner / partner / shareholder (partnership: subledger) date, amount DECIMAL(18,4) form VARCHAR(10) -- cash | asset | liability_waiver asset_account_id BIGINT FK NULL -- form = asset হলে কোন account (1530 Vehicles) resolution_ref VARCHAR(60) -- board resolution / partnership deed approved_by, status, journal_entry_id postCapital(t): injection, cash: Dr Bank / Cr 3100 [party] injection, asset: Dr asset_account / Cr 3100 [party] -- valuation basis note-এ withdrawal: Dr 3400 [party] / Cr Bank -- proprietor drawings source_type = 'capital_transaction' | 'drawings'

party_id 3100/3400-এ — partnership-এ partner-ধরে ব্যালেন্স (অধ্যায় ১৪-এর control account-এর কৌশল); company-তে shareholder-ধরে নয় (share register আলাদা module)।

Dividend — ঘোষণা, দায়, পরিশোধ

dividend_declarations id, company_id, kind (interim | final), declared_on, record_date, payment_date basis (per_share | percent | amount), rate, total_amount source (retained_earnings | current_year) -- interim → current year; আইন/config resolution_ref, approved_by, status (declared | paid | cancelled), journal_entry_id declare(d): Dr 3400 Dividend / Cr 2170 Dividend Payable source_type = 'dividend_declaration' pay(d): Dr 2170 / Cr Bank (payments, party_type = shareholder) → Cash Flow financing যাচাই: total_amount ≤ distributable (3200 + 3300 − reserve) — নইলে reject; আইন দেশভেদে (অধ্যায় ৫৫)

Prior-period adjustment — approved, বিরল

prior_period_adjustments id, company_id, fiscal_year_affected, reason (error | policy_change), description amount, account_id (counter — 2110, 1515 …), approved_by (দুজন), journal_entry_id restated_comparatives BOOLEAN -- comparative column-এ প্রয়োগ হয়েছে? post(p): Dr/Cr 3200 / Cr/Dr counter source_type = 'prior_period_adjustment', posting_date = চলতি period-এর প্রথম দিন

Comparative restate — অধ্যায় ২১-এর balanceSheet(গত বছরের শেষ)-এ এই adjustment-গুলো যেন ওই তারিখেই ছিল ধরে দেখানো: closing(as_of) + Σ prior_period_adjustments WHERE fiscal_year_affected <= FY(as_of) AND posting_date > as_of। Report-এর একটা switch (restated = true), আর note। Software-এ কম system-ই এটা করে; না করলে অন্তত note।

3xxx-এ দরজা — enforcement

accounts: 3100, 3200, 3300, 3400, 3250 → allow_manual_posting = false, system_account_key সেট post() (অধ্যায় ৮)-এ যাচাই: line.account.allow_manual_posting == false AND entry.source_type == 'manual' → reject line.account == 3300 AND entry.source_type ≠ 'closing_entry' → reject line.account == 3200 AND entry.source_type ∉ ('closing_entry', 'prior_period_adjustment', 'reserve_transfer') → reject

Database trigger-ও (অধ্যায় ৪৫-এর immutability-র মতো, belt and braces): posted_lines-এ 3200/3300-এ INSERT যদি entry-র source_type অনুমোদিত না হয় → RAISE। Application আর database — দুটোই, কারণ এই account-এ একটা ভুল পুরো বছরের report বদলায়।

রাতের যাচাই

৭৬. soce(FY start → আজ): assert (১)(২)(৩) ৭৭. 3xxx-এ source_type = 'manual' → ০টি (যাচাই ৬৫-এর কড়া রূপ) ৭৮. 2170 Dividend Payable == Σ dividend_declarations WHERE status = 'declared' (unpaid) ৭৯. dividend total ≤ distributable — declared-এ যাচাই হয়েছে; আজও (distributable কমে গেলে সতর্কতা)

Test হিসেবে

test "opening + rows == closing, প্রতিটি column": s = soce(01-07 → 31-12) প্রতিটি column c: assert s.opening[c] + Σ s.rows[*][c] == s.closing[c] assert s.closing.total == balanceSheet(31-12).total_equity == 13,98,365 test "profit row == Income Statement": assert s.rows['net_profit'][3300] == incomeStatement(01-07 → 31-12).net_profit test "manual JV 3200-এ → post reject; কোনোভাবে ঢুকলে report ব্যর্থ": assert rejects post(JV(Dr 1120 / Cr 3200, source = manual)) force_insert(...) -- trigger bypass test assert raises soce(...) with "unknown source" test "dividend declared SOCE-তে, paid Cash Flow-এ": declare(50,000, 15-12); s = soce(Dec); cf = cashFlowDirect(Dec) assert s.rows['dividend'][3400] == −50,000; cf.financing == −20,000 (loan শুধু) pay(05-01); assert cashFlowDirect(Jan).financing includes −50,000 test "drawings খরচ নয়": withdraw(owner, 40,000) assert Δ incomeStatement == 0; Δ soce.rows['drawings'] == −40,000 test "asset দিয়ে পুঁজি — SOCE-তে আছে, Cash Flow-এ নেই": capital(asset 1530, 8,00,000) assert soce.rows['capital'][3100] == +8,00,000; cashFlow.financing অপরিবর্তিত; nonCashNote includes it test "prior-period adjustment এ বছরের লাভে নয়": ppa(2024 bill 30,000) assert Δ incomeStatement(2025) == 0; soce.rows['prior_period'][3200 or 3100] == −30,000 assert balanceSheet(31-12-2024, restated = true).line('A/P') == আগের + 30,000

৬. Financial Statement Impact

SOCE-ই সেই table যার প্রতিটি ঘর অন্য একটা statement থেকে আসে:

Balance at start ← গত Balance Sheet-এর equity section অধ্যায় ২১ Net profit ← Income Statement-এর শেষ লাইন অধ্যায় ২০ Capital / Dividend paid ← Cash Flow financing (cash হলে); non-cash হলে note অধ্যায় ২২ Balance at end → এই Balance Sheet-এর equity section অধ্যায় ২১

চারটি statement এখন একটা বৃত্ত:

Income Statement (period) │ net profit Balance Sheet ──▶ SOCE ──▶ Balance Sheet (start) │ (end) │ capital, dividend (cash অংশ) Cash Flow (period) ── Δ cash ──▶ Balance Sheet (end)-এর cash

একটা ভুল যেকোনো জায়গায় — বৃত্ত ভাঙে, আর কোন জোড়ায় ভাঙল সেটাই বলে দেয় কোথায়। অধ্যায় ২৪ এই বৃত্তটাকে একটা যাচাই-matrix হিসেবে লিখবে।


৭. Common Developer Mistakes

ভুলকী ঘটেসঠিক পথ
3200-এ JV “Balance Sheet মেলাতে”ভুল লুকাল; SOCE-তে অজানা row; পরের বছর দ্বিগুণদরজা: source_type; assert (৩); কারণ খুঁজুন (অধ্যায় ২১)
Drawings expense-এলাভ কম, কর কম; audit finding3400, payment party = owner
মালিকের ব্যক্তিগত খরচ ব্যবসার 5xxx-এএকইdrawings
Dividend পরিশোধের দিনে equity কমানোঘোষণা-পরিশোধের মাঝে liability নেই; SOCE-র তারিখ ভুলdeclare → 2170; pay → bank
Dividend পুঁজি (3100) থেকেআইনত নিষিদ্ধ; distributable যাচাই নেই3200/3300 থেকে; declare()-এ যাচাই
গত বছরের ভুল এ বছরের Income Statement-এএ বছরের লাভ মিথ্যা; গত বছরের ছাপা statement ভুলই থাকেprior_period_adjustment → 3200, restate, note
এ বছরের ভুল retained earnings-এIncome Statement থেকে লুকালঅধ্যায় ৪৩ — reversal/correction, একই বছর
Asset দিয়ে পুঁজি → Cash Flow-এ financing + investingদুটো মিথ্যা flownon-cash; note
3300-এ মাসের মাঝে post (কেউ “profit book করতে”)Balance Sheet দুবার লাভcomputed; post শুধু closing entry
Proprietorship-এ বছর শেষে drawings capital-এ না ঢোকানোdrawings ৫ বছর জমে, capital ফোলাclosing entry-তে Dr 3100 / Cr 3400
Partnership-এ একটা 3100কোন partner-এর কত — জানা নেইparty_id subledger
SOCE আলাদা table-এ হাতে লেখাতিন statement-এর সাথে মেলে নাposted_lines + source_type; assert (১)(২)

প্রথমটাই মূল, বাকি সব তার ছায়া। Retained earnings হলো accounting-এর “root password” — এখানে লিখতে পারলে যেকোনো report যা-খুশি বলানো যায়। তাই দরজা: closing entry আর approved prior-period adjustment — আর কিছু নয়, কারও জন্য নয়।


৮. Exercises

সেট ক — হাতে বানানো

১। software company, ১ জানু – ৩০ জুন ২০২৬ (অর্থবছরের দ্বিতীয় অর্ধ): opening অধ্যায় ২১-এর ৩১ ডিসে; ধরুন জানু–জুন লাভ 2,40,000; ১৫-০৩ share issue 5,00,000 নগদে; ২০-০৬ interim dividend 1,00,000 ঘোষণা, ১০-০৭ পরিশোধ। SOCE (৪ column)। ৩০ জুনের Balance Sheet-এ 2170? Cash Flow (জানু–জুন) financing? ২। ১ নম্বরে ৩০ জুনে closing entry (অধ্যায় ২৬-এর আগাম): 3300 → 3200। পুরো বছরের (জুলাই–জুন) SOCE — profit column-এ opening, profit, transfer, closing। Retained earnings closing? ৩। রহমান ট্রেডার্সে (section ৪) ২০২৬-এর ১ জানুয়ারির opening: Capital? Drawings? closing entry কী? ৪। Partnership: করিম 60%, রহিম 40%; opening capital 6,00,000 / 4,00,000; লাভ 3,00,000; করিম drawings 1,00,000, রহিম 50,000; রহিম নতুন পুঁজি 2,00,000। partner-ধরে SOCE। লাভ ভাগ কোন entry-তে?

সেট খ — কোন row, কেন

৫। প্রতিটির row ও column (বা "SOCE-তে নয়"): (ক) মালিক ব্যক্তিগত ঋণ ব্যবসার নামে নিলেন (খ) asset revaluation +2,00,000 (গ) গত বছরের depreciation দুবার হয়েছিল, 16,000 (ঘ) এ বছরের মার্চের bill জুনে ধরা পড়ল (ঙ) bonus share issue (retained earnings → share capital) (চ) মালিক supplier-কে নিজের পকেট থেকে দিলেন, ফেরত নেবেন না ৬। Interim dividend current year profit থেকে, কিন্তু বছর শেষে ক্ষতি হলো। Dividend কি "ভুল" ছিল? Software-এ কী যাচাই সম্ভব ছিল, কী নয়? ৭। Prior-period adjustment-এর posting_date চলতি period-এর প্রথম দিন কেন — গত বছরের তারিখে নয়? গত বছর বন্ধ (অধ্যায় ২৬); খুলে post করলে কী হারায়?

সেট গ — কোনটা ভুল

৮। JV: Dr 5260 Travel / Cr 1120 — মালিকের পারিবারিক ভ্রমণ ৯। JV: Dr 1120 / Cr 3200 Retained Earnings 50,000 — "মালিক টাকা দিলেন" ১০। Dividend: Dr 3200 / Cr 1120 — পরিশোধের দিনে, ঘোষণা ছাড়া ১১। SOCE: net profit row = Balance Sheet-এর 3300 − গত মাসের 3300 — closing entry-র মাসে ১২। Dr 3400 Drawings / Cr 2120 Salary Payable — "মালিকের বেতন accrue" ১৩। accounts.allow_manual_posting = false, কিন্তু post()-এ যাচাই নেই — "UI-তে account dropdown-এ আসে না, তাই যথেষ্ট"

সেট ঘ — নকশা

১৪। soce()-এর assert (৩) — "unknown source_type" — closing entry-র মাসে `closing_entry` known, কিন্তু কেউ বছরের মাঝে closing_entry source দিয়ে JV করল (API দিয়ে)। কীভাবে আটকাবেন — source_type-এর সাথে কী বাঁধবেন? ১৫। Comparative restate (`restated = true`) — অধ্যায় ২০-এর Income Statement-এ গত বছরের column-ও restate হওয়ার কথা (prior-period expense গত বছরে)। movement()-এ কীভাবে? সহজ পথ কী, তার সীমা কী? ১৬। Partnership-এ লাভ ভাগ (60/40) — closing entry-তে? মাসে-মাসে? 3300 partner-ধরে? interest on capital, salary to partner (deed অনুযায়ী) — কোন account, SOCE-তে কোন row? ১৭। statement_runs (অধ্যায় ২০) SOCE-র জন্য — কিন্তু prior-period adjustment গত বছরের ছাপা statement-ই বদলায়। hash ভাঙবে — সেটা ঠিক না ভুল? দুই সংস্করণ কীভাবে রাখবেন (original, restated)?

উত্তর আছে Workbook-এর Answer Key, অধ্যায় ২৩-এ।


৯. Developer Challenge

FinancialStatementService-এ চতুর্থ statement — আর তার চেয়ে বড়: equity-র দরজা। Statement বানানো এক ঘণ্টার কাজ; দরজা পাহারা দেওয়াই আসল নকশা।

যা যা নকশা করবেন:

১. soce(from, to)closing() ×2, movement() GROUP BY source_type, incomeStatement(); assert (১)(২)(৩); ব্যর্থতায় entry-র নম্বর সহ বার্তা। নতুন query নেই — অধ্যায় ২০–২২-এর engine-এ চতুর্থ layout।

২. capital_transactions, dividend_declarations, prior_period_adjustments — তিনটি document, প্রতিটির নিজের posting, source_type, approval (prior-period-এ দুজন); distributable হিসাব ও যাচাই; partnership-এ party_id

৩. দরজা — post()-এ 3xxx-এর নিয়ম (source_type × account matrix, data হিসেবে: equity_posting_rules), এবং database trigger; exercise ১৪-এর API-bypass; test যে দুটোই আলাদাভাবে আটকায়।

৪. Restated comparative — restated switch Balance Sheet ও Income Statement-এ (exercise ১৫); statement_runs-এ original ও restated দুই সংস্করণ (exercise ১৭)।

৫. Proprietorship / partnership mode — config: closing entry-তে drawings → capital; লাভ ভাগ (exercise ১৬); company mode-এ 3200/3300/2170। একই engine, layout ও rule আলাদা।

৬. রাতের যাচাই ৭৬–৭৯; test — section ৫-এর সাতটি, আর: (ক) closing entry-র মাসে SOCE-র transfer row, total 0; (খ) partnership দুই partner, drawings ও profit share; (গ) dividend > distributable → reject।

৩ নম্বরটাই আসল পরীক্ষা। এই বইয়ে এখন পর্যন্ত যত “allow_manual_posting = false” লেখা হয়েছে — control account (অধ্যায় ১৪, ১৬), 3xxx (অধ্যায় ৫) — সবগুলোর enforcement একটা জায়গায়, একটা rule table-এ, দুই স্তরে (app + db)। যদি এখনো শুধু UI-র dropdown-এ ভরসা, অধ্যায় ৪৮-এর Permissions-এর আগেই এটা ঠিক করুন — কারণ retained earnings-এ একটা JV-ই যথেষ্ট পুরো বইয়ের বাকি সব নিয়ম অর্থহীন করতে।


১০. Summary Card

কী মাপে

SOCE = opening equity → closing equity, উপাদান-ধরে (column), কারণ-ধরে (row) Closing = Opening + Profit + Capital − Drawings/Dividend ± Prior-period পঞ্চম কারণ নেই — অজানা row ⇒ কেউ দরজা ছাড়া ঢুকেছে

উপাদান

3100 Capital (Cr) · 3200 Retained Earnings (Cr, বছরের সেতু) · 3300 Current Year Profit (computed) 3400 Drawings / Dividend (Dr, contra) · 3250 Reserve (থাকলে) · proprietorship: 3100 + 3400 যথেষ্ট

দরজা

3100 ← capital_transaction 3200 ← closing_entry, prior_period_adjustment, reserve_transfer 3300 ← closing_entry 3400 ← drawings (payment, owner), dividend_declaration manual → কখনো নয়; app + db trigger

Dividend / Drawings / Prior-period

dividend: declared → Dr 3400 / Cr 2170 (SOCE-র তারিখ); paid → Dr 2170 / Cr Bank (Cash Flow-এর তারিখ) drawings: খরচ নয়; মালিকের ব্যক্তিগত খরচ = drawings prior-period: গত বছরের, material, approved → 3200, opening restate, note; এ বছরের → Income Statement

Cross-check

profit row == Income Statement · closing row == Balance Sheet equity · cash capital/dividend == Cash Flow financing non-cash capital (asset) → note

Developer checklist

□ soce() = closing() + movement() GROUP BY source_type + incomeStatement(); assert (১)(২)(৩) □ capital_transactions, dividend_declarations (declare/pay), prior_period_adjustments (দুজন approve) □ equity_posting_rules: source_type × account; post() + trigger □ distributable যাচাই □ partnership: party_id 3100/3400; proprietorship closing: drawings → capital □ restated comparative switch; statement_runs দুই সংস্করণ □ রাতে: ৭৬–৭৯

পরের অধ্যায়

চারটি statement লেখা — প্রতিটি আলাদা অধ্যায়ে, প্রতিটির নিজের assert। অধ্যায় ২৪ — Trial Balance থেকে Statement: এবার পুরো পথটা এক নিঃশ্বাসে — unadjusted Trial Balance → adjusting entries → adjusted Trial Balance → worksheet → চারটি statement → cross-statement যাচাই-matrix — ডিসেম্বর ২০২৫-এর জন্য, শুরু থেকে শেষ; আর একটা “reporting pack” যা মাসের শেষে এক click-এ বেরোয়।