অধ্যায় ২৩ — 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 / DividendSOCE এই সূত্রটাই, উপাদান-ধরে ভেঙে। প্রশ্ন একটাই: ১ জুলাইয়ে মালিকের অংশ ছিল 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,000Proprietor-এর “বেতন” — একই কথা: আইনত মালিক নিজেকে বেতন দিতে পারেন না (কিছু দেশে পারেন, 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 restate — Dr 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 | জমা লাভ | Cr | closing entry (লাভ), prior-period adj (+/−) |
| 3300 Current Year Profit | এ বছরের | Cr | computed (মাঝে); closing entry (শেষে) |
| 3400 Drawings / Dividend | তুলে নেওয়া | Dr (contra) | drawings, dividend declared |
| 3250 Reserve (থাকলে) | সরানো লাভ | Cr | transfer 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') → rejectDatabase 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 finding | 3400, 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 | দুটো মিথ্যা flow | non-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 —
restatedswitch 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 triggerDividend / 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 StatementCross-check
profit row == Income Statement · closing row == Balance Sheet equity · cash capital/dividend == Cash Flow financing
non-cash capital (asset) → noteDeveloper 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-এ বেরোয়।