Skip to Content
Go Realm v1 is released 🎉
Accountingবই (Print Edition)অধ্যায় ২১: Balance Sheet

অধ্যায় ২১ — Balance Sheet

Volume 1 · Part 3 — Financial Statements · Chapter 21

পূর্বশর্ত: অধ্যায় ২ (সমীকরণ), অধ্যায় ৫ (sub_type, contra), অধ্যায় ১০ (closing column), অধ্যায় ২০ (movement, layout-as-data, 3300)


১. Learning Objective

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

Balance Sheet কী মাপে — "এই দিনে কী আছে, কার কাছে কত দেনা, বাকিটা কার" — একটা তারিখে, closing দিয়ে Trial Balance-এর 1xxx, 2xxx, 3xxx closing থেকে একটা classified Balance Sheet হাতে বানাতে Current বনাম non-current — ১২ মাসের নিয়ম — asset ও liability দুই দিকে প্রয়োগ করতে কেন দুই পাশ মেলে: 3300 Current Year Profit = অধ্যায় ২০-এর YTD net profit — আর মেলার শর্ত কী Presentation-এর ছয়টি সমন্বয়: contra netting, ব্যালেন্সের দিক (overdraft, A/R credit), party-ধরে reclass, VAT offset, loan-এর current portion, unbilled বনাম A/R — কোনটা entry, কোনটা শুধু দেখানো closing(as_of) — অধ্যায় ২০-এর movement()-এর ভাই — একই engine, তারিখের নিচের সীমা নেই Reclassification rule-কে data হিসেবে রাখতে, GL নয় subledger স্তরে প্রয়োগ করতে Assets == Liabilities + Equity — layout-নিরপেক্ষ assert — আর মিলল না মানে কী কী হতে পারে Note (PDC, contingent), comparative column, তিনটি ratio — পাঠকের চোখে Balance Sheet পড়তে

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


২. Concept Explanation

ছবি — একটা তারিখ

অধ্যায় ২০-এর Income Statement ভিডিও ছিল; Balance Sheet ছবি — ৩১ ডিসেম্বর ২০২৫ রাত বারোটায় কোম্পানিটাকে থামিয়ে তোলা। এক তারিখ, তিনটি প্রশ্ন:

কী আছে? Assets 1xxx ← closing balance কার কাছে কত দেনা? Liabilities 2xxx ← closing balance বাকিটা কার? Equity 3xxx ← closing balance + এ বছরের লাভ

অধ্যায় ২-এর সমীকরণ — Assets = Liabilities + Equity — একটা report হয়ে ফিরে এল। Income Statement ছিল সমীকরণের পরিবর্তন; Balance Sheet সমীকরণ নিজে

Closing, movement নয়। অধ্যায় ১০-এর তিন জোড়া column-এর তৃতীয়টা। আর অধ্যায় ৯-এর কথা: closing = অর্থবছরের শুরুর opening (OB voucher) + সেই থেকে সব movement। Balance Sheet-এর query-তে তারিখের নিচের সীমা নেইposting_date <= as_of, ব্যস। Permanent account কখনো শূন্য থেকে শুরু করে না (অধ্যায় ৩)।

বাকিটা কার — 3300 যেভাবে দুই পাশ মেলায়

Trial Balance-এ 4xxx আর 5xxx আছে; Balance Sheet-এ নেই। তাদের নিট — অর্থবছরের শুরু থেকে আজ পর্যন্ত — একটা লাইনে:

3300 Current Year Profit = Σ (credit − debit) movement, REVENUE ও EXPENSE, FY শুরু → as_of = অধ্যায় ২০-এর YTD net profit = 2,78,365

এটা কোনো posted ব্যালেন্স নয় — report-এর সময় হিসাব হয়, অধ্যায় ২০-এর movement() দিয়ে। বছর শেষে একবার closing entry এটাকে 3200 Retained Earnings-এ ঢালে (অধ্যায় ২৬); তার আগে পর্যন্ত এটা “চলতি”। মাঝের যেকোনো তারিখে Balance Sheet চাইলে 3300 ওই তারিখ পর্যন্ত YTD।

এই লাইন ছাড়া দুই পাশ মেলে না — ঠিক 2,78,365 কম পড়ে। আর মিললে সেটা প্রমাণ করে তিনটি জিনিস একসাথে ঠিক: Trial Balance মিলেছে, Income Statement-এর নিট সংখ্যা ঠিক, Balance Sheet-এর layout কোনো account হারায়নি বা দুবার গোনেনি। অধ্যায় ২০-এর “layout-নিরপেক্ষ সত্য” — এই statement-এর জন্য এটাই।

Classified — current আর non-current

Statement-এর মূল সাজানো একটাই প্রশ্নে: ১২ মাসের মধ্যে?

ASSET current ১২ মাসে (বা operating cycle-এ) cash হবে / খরচ হবে cash, A/R, unbilled, prepaid, VAT non-current থাকবে, ব্যবহার হবে equipment, furniture, vehicles LIABILITY current ১২ মাসে মেটাতে হবে A/P, salary payable, accrued, advance, deferred, VAT, TDS, loan-এর ১২ মাসের কিস্তি non-current তার পরে loan-এর বাকিটা

অধ্যায় ৫-এর sub_type (CURRENT_ASSET, FIXED_ASSET, CURRENT_LIABILITY, LONG_TERM_LIABILITY) ঠিক এই কাজের জন্য ছিল। এক ব্যতিক্রম যেখানে account যথেষ্ট নয়: একটা ঋণের দুই টুকরো — 2510 একটাই account, কিন্তু আগামী ১২ মাসের কিস্তি current, বাকিটা non-current। নিচে “loan-এর current portion”।

ক্রম: asset-এ তরলতার ক্রমে (cash আগে, equipment শেষে); liability-তে মেটানোর ক্রমে। IFRS উল্টোটাও মানে (non-current আগে); ছক layout-এর, engine-এর নয়।

ব্যালেন্স যেদিকে, ঘর সেদিকে — reclassification

Part 2-তে চারবার এই বাক্য এসেছে (অধ্যায় ১১, ১৪, ১৬, ১৯)। এবার একসাথে:

account স্বাভাবিক উল্টো হলে Balance Sheet-এ ─────── ───────── ────────── ─────────────── 1120 Bank Dr, asset Cr (overdraft) → current liability "Bank overdraft" 1130 A/R Dr, asset Cr (unapplied / CN) → current liability "Customer credit balances" 2110 A/P Cr, liability Dr (overpaid / DN refund due) → current asset "Advances & receivables from suppliers" 2160 Cust. Advance Cr, liability (কখনো Dr হওয়ার কথা নয় — হলে bug)

এটা entry নয়, উপস্থাপনা। GL-এ 1130-এ 11,500 Cr-ই থাকে; report সেটা liability-র ঘরে দেখায়। JV দিয়ে সরালে পরের মাসে উল্টো JV — অকারণ শব্দ।

আর একটা সূক্ষ্মতা, অধ্যায় ১৪-এর: reclass GL স্তরে নয়, party স্তরে। 1130-এ করিম 20,000 Dr আর সালমা 31,500 Cr হলে GL বলে “11,500 Cr” — কিন্তু সত্যি হলো A/R 20,000 আর গ্রাহকের কাছে দেনা 31,500। Netting দুটোকেই লুকায়। Control account-এ reclass subledger থেকে, party-ধরে — section ৫-এ নিয়ম।

Contra — মূল account-এর নিচে, নিট

1515 Accum. Dep. — Computer-এর ব্যালেন্স credit, asset-এর ভিতরে। Balance Sheet-এ আলাদা liability নয় — মূল asset থেকে বিয়োগ, তিন লাইনে:

Computer Equipment 2,40,000 Less: Accumulated Depreciation (13,333) ───────── 2,26,667 ← net book value; এটাই "asset"

গ্রাহকের কাছে ২,৪০,০০০-এর laptop নেই — আছে ২,২৬,৬৬৭-এর। Contra-র উদ্দেশ্য দুটোই দেখানো (অধ্যায় ৫-এর is_contra): কত দামে কেনা, কত ক্ষয়। Equity-তে 3400 Drawings একই রীতিতে।

VAT — offset, একটা নীতি

1160 VAT Receivable 49,200 Dr, 2140 VAT Payable 46,500 Cr — দুটোই একই সরকারের সাথে, একই return-এ কাটাকাটি হয়। Balance Sheet-এ দুটো আলাদা দেখানো ফোলায় — asset-ও বেশি, liability-ও বেশি। রীতি (IAS 12-এর ভাষায়: একই কর্তৃপক্ষ, netting-এর আইনি অধিকার): নিট একটা লাইন, যেদিকে ব্যালেন্স সেদিকে — এখানে 2,700 net VAT receivable, current asset। GL-এ দুটো account-ই থাকে (return-এর জন্য দরকার); offset শুধু উপস্থাপনায়। দুই দেশের VAT (অধ্যায় ৫৫) হলে দেশ-ধরে আলাদা নিট।

Loan — একটা account, দুই লাইন

2510 Bank Loan 3,20,000 (৩১ ডিসে)। কিস্তি 20,000/মাস। আগামী ১২ মাসে যাবে 2,40,000 — সেটা current; 80,000 non-current। কোথা থেকে জানব? ঋণের schedule থেকে — GL জানে না, শুধু ব্যালেন্স জানে। দুটো পথ:

ক. উপস্থাপনায়: loan_schedules থেকে current portion হিসাব, report-এ ভাগ ← এই বইয়ে খ. entry দিয়ে: মাসের শেষে JV Dr 2510 / Cr 2520 Current Portion of Loan ← অধ্যায় ২৫-এর adjusting entry হিসেবে

দুটোই চলে। ক-তে GL সরল, report-এ একটা নিয়ম; খ-তে GL-ই সত্য, কিন্তু প্রতি মাসে JV। ছোট system-এ ক; যেখানে auditor “GL-ই দেখান” বলেন, খ। একটা বেছে স্থির থাকুন — Income Statement-এর 4540-এর মতো।

Unbilled আর A/R — দুটো, একটা নয়

অধ্যায় ১৭-এর কথা: 1170 Unbilled 1,80,000 আর 1130 A/R — দুটোই “গ্রাহকের কাছে পাওনা”, কিন্তু আলাদা লাইনে। A/R-এর invoice আছে, due date আছে, তাগাদা দেওয়া যায়; unbilled-এর কিছুই নেই। এক লাইনে মিশিয়ে “Receivables 1,80,000” লিখলে পাঠক ভাবেন invoice গেছে। Auditor-ও দুটোকে আলাদা মাপেন। একই যুক্তিতে 1140 Advance to Supplier আর 1150 Prepaid আলাদা — একটা টাকা ফেরত পাওয়ার অধিকার, অন্যটা সেবা পাওয়ার।

যা Balance Sheet-এ নেই — তাই note

কিছু জিনিস ব্যালেন্স নয়, কিন্তু পাঠকের জানা দরকার:

PDC issued, not yet due অধ্যায় ১৬-এর 1,26,000 (৩০ নভে) — Bank কমেনি, A/P কমেনি; note Contract position নদী গ্রুপের বাকি কাজ, চুক্তি মূল্য — commitment Customer credit balances কোন গ্রাহকের, কেন (unapplied CN) Advance-এর বয়স সাগর লিমিটেড 1,00,000, project জানুয়ারিতে Depreciation policy ৩৬ / ৬০ মাস, straight-line Contingent liability মামলা, guarantee — সম্ভাবনা, অঙ্ক নয়

Statement-এর প্রতিটি লাইনের একটা নম্বর, নিচে note — এটা ছাপার রীতি; software-এ প্রতিটি note একটা query (PDC register, advance aging, credit balance report — Part 2-তে সবগুলো লেখা হয়ে গেছে)।

তিনটি ratio — পাঠক যা প্রথমে দেখেন

Working capital = current assets − current liabilities 11,82,365 Current ratio = current assets ÷ current liabilities 2.36 Debt-to-equity = total liabilities ÷ equity 0.68

Ratio-র সংখ্যা এই অধ্যায়ের বিষয় নয়; কিন্তু কেন sub_type ভুল হলে ratio ভুল (অধ্যায় ৫) — এখন দেখা যায়। Loan-এর 2,40,000 non-current-এ থাকলে current ratio 2.36 নয়, 3.25 — ব্যাংক যে সংখ্যা দেখে ঋণ দেয়, সেটা মিথ্যা।

যা এই অধ্যায়ে নেই

Fixed asset register, disposal, revaluation অধ্যায় ৩০ Inventory valuation অধ্যায় ২৭ Provision, allowance for doubtful debt অধ্যায় ৫৯ Multi-currency translation অধ্যায় ৫৪ Consolidated Balance Sheet অধ্যায় ৬১ Closing entry, opening balance-এর যান্ত্রিকতা অধ্যায় ২৬, ৬২

৩. Accounting Rule

গঠন

Assets = Liabilities + Equity Equity = Share Capital + Retained Earnings (opening) + Current Year Profit − Drawings Current Year Profit = Income Statement (FY start → as_of).net_profit

কোন সংখ্যা

Balance Sheet (as_of) = Σ posted_lines WHERE posting_date <= as_of -- নিচের সীমা নেই শুধু ASSET, LIABILITY, EQUITY (closing) + 3300 = movement(REVENUE, EXPENSE, FY start → as_of)

Classification

current ১২ মাসে cash হবে / মেটাতে হবে sub_type non-current বাকি sub_type একটা account দুই টুকরো (loan) → schedule থেকে current portion

Presentation-এর সমন্বয় — entry নয়

সমন্বয়নিয়মস্তর
Contra nettingcontra মূল account-এর নিচে, বিয়োগ; নিট-ই assetaccount
ব্যালেন্সের দিকasset-এ Cr → liability লাইন; liability-তে Dr → asset লাইনparty (control account-এ), নইলে account
VAT offsetএকই কর্তৃপক্ষ → নিট এক লাইন, যেদিকে ব্যালেন্সaccount-জোড়া
Loan current portionআগামী ১২ মাসের principal → currentschedule
Unbilled ≠ A/R, Advance ≠ Prepaidআলাদা লাইনlayout
Group totalsub_type-ধরে subtotal; total assets, total L+Elayout

Equity-র নিয়ম

3100, 3200 — হাতে post নয় (system) 3300 — post-ই নয়; হিসাব; বছর শেষে closing entry → 3200 (অধ্যায় ২৬) 3400 Drawings — contra, equity-র নিচে বিয়োগ

অলঙ্ঘনীয়

Assets == Liabilities + Equity — নইলে report নয় প্রতিটি ASSET/LIABILITY/EQUITY posting account ঠিক একটা লাইনে (unmapped ⇒ ব্যর্থ) reclass উপস্থাপনায়; GL অপরিবর্তিত

৪. Real Business Example

৩১ ডিসেম্বর ২০২৫ — Trial Balance-এর 1xxx, 2xxx, 3xxx

অধ্যায় ১০-এর query, closing column, শুধু permanent account। পাশে ৩০ নভেম্বর — তুলনার জন্য, আর অধ্যায় ২২-এর জন্য (দুই ছবির পার্থক্যই cash flow)।

TRIAL BALANCE (অংশ) — closing সংখ্যা: টাকা Code Account ৩০ নভে ২০২৫ ৩১ ডিসে ২০২৫ উৎস ──── ───────────────────────── ────────────── ────────────── ───────────── 1110 Cash in Hand 38,050 Dr 42,500 Dr 1115 Petty Cash 10,000 Dr 10,000 Dr 1120 Bank — Prime 15,07,665 Dr 13,67,665 Dr অধ্যায় ১২-এর adjusted book 1125 Bank — City 4,00,000 Dr 4,00,000 Dr 1130 Accounts Receivable 34,900 Dr 11,500 Cr ← অধ্যায় ১৯: সালমার CN, unapplied 1140 Advance to Supplier 0 0 অধ্যায় ১৬: রফিকের সমন্বয় হয়েছে 1150 Prepaid Expense 55,000 Dr 50,000 Dr অধ্যায় ১৮: PI-0007 1160 VAT Receivable 49,200 Dr 49,200 Dr 1170 Unbilled Revenue 0 1,80,000 Dr অধ্যায় ১৭: নদী গ্রুপ 1510 Computer Equipment 2,40,000 Dr 2,40,000 Dr অধ্যায় ১৫ 1515 Accum. Dep. — Computer 6,667 Cr 13,333 Cr 6,667/মাস, নভেম্বর থেকে 1520 Furniture & Fixtures 80,000 Dr 72,000 Dr অধ্যায় ১৯: DN 8,000 1525 Accum. Dep. — Furniture 1,333 Cr 2,667 Cr 2110 Accounts Payable 1,26,000 Cr 22,000 Cr নভে: PDC; ডিসে: ISP 9,200 + DESCO 12,800 2120 Salary Payable 3,50,000 Cr 3,50,000 Cr মাসের বেতন, ২৮ তারিখে পরের মাসে 2135 Accrued Expenses 20,000 Cr 60,500 Cr অধ্যায় ১৮ 2140 VAT Payable 45,000 Cr 46,500 Cr ডিসে output 51,000 − CN 4,500 2150 TDS Payable 8,250 Cr 6,500 Cr 2160 Customer Advance 0 1,00,000 Cr অধ্যায় ১৯: সাগর লিমিটেড 2180 Deferred Revenue 2,10,000 Cr 80,000 Cr নদী 1,20,000→0; ABC 90,000→80,000 2510 Bank Loan — Long Term 3,40,000 Cr 3,20,000 Cr 20,000/মাস (অধ্যায় ১২) 3100 Share Capital 10,00,000 Cr 10,00,000 Cr 3200 Retained Earnings (১ জুলাই) 1,20,000 Cr 1,20,000 Cr 3300 Current Year Profit — — TB-তে নেই — হিসাব হবে 3400 Drawings 0 0

৩১ ডিসেম্বরে Dr মোট 24,11,365, Cr মোট 21,33,000 — অমিল 2,78,365। অমিল নয়: এটা ঠিক অধ্যায় ২০-এর YTD net profit — 4xxx/5xxx সারি বাদ দেওয়ার ফল। এই সংখ্যাটাই 3300।

ধাপে ধাপে

ধাপ ১ — 3300 হিসাব: movement(REVENUE, EXPENSE, 01-07-2025 → 31-12-2025) = 2,78,365 (অধ্যায় ২০)। ৩০ নভেম্বরের জন্য: 2,78,365 − 90,800 = 1,87,565।

ধাপ ২ — উল্টো ব্যালেন্স খোঁজা: 1130-এ Cr 11,500। Subledger (অধ্যায় ১৯): করিম 0, রহিম 0, নদী 0, সালমা 11,500 Cr। Party-ধরে: Dr অংশ 0 → A/R লাইন 0; Cr অংশ 11,500 → “Customer credit balances”, current liability। 2110-এ কোনো party Dr নয় (অফিস মার্ট 0)। Bank সব Dr।

ধাপ ৩ — contra netting: 1510 − 1515 = 2,26,667; 1520 − 1525 = 69,333।

ধাপ ৪ — VAT offset: 1160 49,200 Dr − 2140 46,500 Cr = 2,700 Dr → “VAT receivable (net)”, current asset। নভেম্বর: 49,200 − 45,000 = 4,200 Dr।

ধাপ ৫ — loan-এর ভাগ: schedule: 20,000/মাস। ৩১ ডিসে-র পরের ১২ কিস্তি = 2,40,000 current; 3,20,000 − 2,40,000 = 80,000 non-current। ৩০ নভে: 2,40,000 / 1,00,000।

ধাপ ৬ — লাইনে বসানো, subtotal, দুই পাশ:

BALANCE SHEET সফটওয়্যার কোম্পানি লিমিটেড ৩১ ডিসেম্বর ২০২৫ (তুলনায় ৩০ নভেম্বর ২০২৫) টাকা note ৩১ ডিসে ২০২৫ ৩০ নভে ২০২৫ ───────────── ───────────── ASSETS Current assets Cash and cash equivalents ১ 18,20,165 19,55,715 Accounts receivable ২ 0 34,900 Unbilled revenue ৩ 1,80,000 0 Prepaid expenses 50,000 55,000 VAT receivable (net) ৪ 2,700 4,200 ───────────── ───────────── 20,52,865 20,49,815 Non-current assets Computer equipment 2,40,000 2,40,000 Less: accumulated depreciation (13,333) (6,667) Furniture & fixtures 72,000 80,000 Less: accumulated depreciation (2,667) (1,333) ───────────── ───────────── 2,96,000 3,12,000 ───────────── ───────────── TOTAL ASSETS 23,48,865 23,61,815 ═════════════ ═════════════ LIABILITIES Current liabilities Accounts payable ৫ 22,000 1,26,000 Salary payable 3,50,000 3,50,000 Accrued expenses ৬ 60,500 20,000 Tax deducted at source 6,500 8,250 Customer credit balances ২ 11,500 0 Customer advances ৭ 1,00,000 0 Deferred revenue ৩ 80,000 2,10,000 Current portion of bank loan ৮ 2,40,000 2,40,000 ───────────── ───────────── 8,70,500 9,54,250 Non-current liabilities Bank loan — long term ৮ 80,000 1,00,000 ───────────── ───────────── TOTAL LIABILITIES 9,50,500 10,54,250 EQUITY Share capital 10,00,000 10,00,000 Retained earnings (১ জুলাই ২০২৫) 1,20,000 1,20,000 Current year profit (১ জুলাই থেকে) ৯ 2,78,365 1,87,565 ───────────── ───────────── TOTAL EQUITY 13,98,365 13,07,565 ───────────── ───────────── TOTAL LIABILITIES AND EQUITY 23,48,865 23,61,815 ═════════════ ═════════════ Notes ১ Cash in hand 42,500; petty cash 10,000; Prime Bank 13,67,665 (adjusted book, অধ্যায় ১২); City Bank 4,00,000 ২ A/R GL ব্যালেন্স 11,500 Cr — সালমা আক্তারের unapplied credit note CN-12-0002; কোনো open invoice নেই ৩ Unbilled: নদী গ্রুপ, milestone গৃহীত ২৮-১২, invoice জানুয়ারিতে। Deferred: ABC Ltd maintenance ৮ মাস বাকি ৪ VAT receivable 49,200 − VAT payable 46,500; ডিসেম্বরের return জানুয়ারিতে ৫ ৩০ নভেম্বরে PDC issued not yet due 1,26,000 (টেক সাপ্লাই, due ০৫-১২) — A/P-র ভিতরে ৬ DESCO 12,500, ISP 8,000, subcontractor 40,000 — সবই bill-এর আগে, basis সহ (অধ্যায় ১৮) ৭ সাগর লিমিটেড, proforma PF-12-0002, project জানুয়ারি ২০২৬ ৮ Prime Bank term loan, 20,000/মাস principal + সুদ; পরের ১২ কিস্তি current ৯ অধ্যায় ২০-এর Income Statement, ১ জুলাই – ৩১ ডিসেম্বর ২০২৫

ধাপ ৭ — যাচাই: 23,48,865 == 9,50,500 + 13,98,365 ✓; নভেম্বর 23,61,815 == 10,54,250 + 13,07,565 ✓।

এই পাতাটা পড়া

Equity 90,800 বাড়ল — ঠিক ডিসেম্বরের net profit। Balance Sheet-এর দুই column-এর equity-র পার্থক্য == মাসের Income Statement — এটা অধ্যায় ২৩-এর Statement of Changes in Equity-র পুরো কথা, drawings/নতুন পুঁজি না থাকলে।

Cash কমল 1,35,550, অথচ লাভ 90,800। Part 2-র সেই তিন সংখ্যা। Balance Sheet বলে কোথায় গেল: unbilled বাড়ল 1,80,000 (কাজ হয়েছে, invoice হয়নি — টাকা নেই), A/P কমল 1,04,000 (PDC পাস হলো — টাকা গেল), deferred কমল 1,30,000 (আগের টাকার কাজ হলো — এখন আয়, টাকা নয়), advance এল 1,00,000 (টাকা এল, আয় নয়)। অধ্যায় ২২ ঠিক এই সারিগুলো যোগ-বিয়োগ করে −1,35,550 বের করবে — দুই Balance Sheet-এর পার্থক্য + Income Statement = Cash Flow। এখানে শুধু জেনে রাখুন: সংখ্যাগুলো ইতিমধ্যে এই পাতায়।

Current ratio 2.15 → 2.36। Current liability কমল (PDC পাস, deferred খরচ হলো), current asset প্রায় সমান — cash কমল কিন্তু unbilled বাড়ল। Unbilled-কে কেউ “cash-এর মতো” ভাবলে ভুল — invoice-ই হয়নি; তাই note ৩।

A/R শূন্য, অথচ গ্রাহকের কাছে দেনা 11,500। GL-এ 1130-এ একটাই সংখ্যা: (11,500)। Party-ধরে reclass না করলে asset-এর ঘরে “(11,500)” — ঋণাত্মক asset — ছাপা হতো। Auditor-এর প্রথম প্রশ্ন।

Loan এক account, দুই লাইন। 3,20,000-এর 2,40,000 current — এটা না করলে current liabilities 6,30,500, current ratio 3.25। ব্যাংক এটাই দেখে।

ছবির নিচে তালিকা

অধ্যায় ২০-এর drill-down এখানেও, কিন্তু একটা পার্থক্য: Balance Sheet-এর লাইনে ledger নয়, তালিকা — কারণ ব্যালেন্স মানে “এই মুহূর্তে কী কী আছে”:

Accounts receivable 0 / Customer credit balances 11,500 └── open items (অধ্যায় ১৪): কোনো open invoice নেই; unapplied CN-12-0002 সালমা 11,500 Accrued expenses 60,500 └── accruals (অধ্যায় ১৮): JV-12-0022 DESCO 12,500 · JV-12-0023 ISP 8,000 · JV-12-0024 PO-0031 40,000 Prepaid expenses 50,000 └── prepaid_items: PI-0007 dev tool license, 10 মাস বাকি Unbilled revenue 1,80,000 └── contract positions (অধ্যায় ১৭): নদী গ্রুপ, milestone 2, recognized 4,20,000 − billed 2,40,000 Customer advances 1,00,000 └── open advances (অধ্যায় ১৯): RV-12-0003 সাগর, 23 দিন Accounts payable 22,000 └── open bills: PB-12-0001 ISP 9,200 · PB-12-0004 DESCO 12,800 Bank — Prime 13,67,665 └── reconciliation (অধ্যায় ১২): statement 13,91,665 − outstanding cheques 24,000

Part 2-র প্রতিটি subledger-এর “GL == Σ subledger” যাচাই (অধ্যায় ১৪-এর ৩০, ১৭-এর ৩৮, ১৮, ১৯-এর ৫১…) এই পাতার জন্যই ছিল: Balance Sheet-এর প্রতিটি লাইনের নিচে একটা তালিকা, যার যোগফল লাইনটা। যে লাইনের তালিকা নেই (5230-এর মতো P&L account-এ ledger-ই তালিকা; কিন্তু 2135-এ ledger যথেষ্ট নয়), সেটা auditor-এর কাছে “একটা সংখ্যা”।


৫. Implementation — Software ও Database

closing(as_of) — movement()-এর ভাই

অধ্যায় ২০-এর movement(from, to) — নিচের সীমা তুলে দিলেই closing:

closing(company, as_of): return movement(company, from = NULL, to = as_of) -- posting_date <= as_of -- {account_id: (debit, credit, signed_dr)} -- চিহ্ন: debit − credit (Balance Sheet-এর স্বাভাবিক)

একটাই function, দুটো নাম। Snapshot থাকলে (অধ্যায় ৯): as_of কোনো period-এর শেষ দিন হলে account_period_balances.closing_signed; মাঝের তারিখে period-এর opening + posted_lines থেকে ওই তারিখ পর্যন্ত movement। is_stale মানুন।

চিহ্নের সিদ্ধান্ত: Income Statement-এ credit − debit, Balance Sheet-এ debit − credit। এক function-এ দুটো নাম রাখুন (signed_dr, signed_cr = −signed_dr) — layout-এ sign column-ই বলবে কোনটা; নইলে liability লাইনে সবাই ঋণাত্মক।

3300 আলাদা:

currentYearProfit(company, as_of): fy_start = fiscalYearStart(as_of) -- অধ্যায় ১-এর fiscal_year_start return Σ movement(company, fy_start, as_of).signed_cr WHERE account_type IN (REVENUE, EXPENSE) -- বছর শেষে closing entry-র পরে (অধ্যায় ২৬) এটা 0 হতে হবে — লাভ 3200-এ চলে গেছে; -- closing entry নিজে movement()-এ বাদ থাকে (Income Statement-এর জন্য), তাই এখানে একটা শর্ত লাগে: -- FY-এর closing entry posted হলে return 0 — অধ্যায় ২৬-এ

Layout — অধ্যায় ২০-এর table, নতুন kind

statements.kind = 'balance_sheet'; statement_lines, statement_line_accounts একই। নতুন যা লাগে:

statement_lines (+) kind -- header | account | subtotal | blank | computed | contra computed_key VARCHAR(40) NULL -- 'current_year_profit' | 'loan_current_portion' | 'vat_net' contra_of_line_id BIGINT FK NULL -- contra লাইন কোন মূল লাইনের নিচে (netting-এর জন্য ছাপায় indent) reclass_to_line_id BIGINT FK NULL -- এই লাইনের account-এ উল্টো ব্যালেন্স → কোন লাইনে reclass_level VARCHAR(10) -- account | party

Mapping group-ধরে (অধ্যায় ২০-এর নিয়ম) — 1100 Current Assets group → current asset section, 1500 → non-current। sub_type fallback। 3300, VAT net, loan current portion — computed: layout বলে কোথায়, কোড বলে কত

Reclassification — GL নয়, party

reclassify(closing, line): accts = resolve(line) যদি line.reclass_level == 'party': -- control account প্রতিটি account a in accts: bal = partyBalances(a, as_of) -- {party_id: signed_dr} posted_lines.party_id থেকে normal = Σ bal WHERE দিক == a.normal_balance opposite = Σ bal WHERE দিক উল্টো line.value += normal reclass_line.value += −opposite -- অন্য পাশে, ধনাত্মক যাচাই: normal + opposite == closing[a] -- GL == Σ subledger (অধ্যায় ১৪-এর ৩০) নইলে (account): প্রতিটি a: closing[a]-এর দিক উল্টো হলে পুরোটা reclass_line-এ

partyBalances() অধ্যায় ১৪/১৬-এর subledger query — নতুন কিছু নয়। Bank overdraft account-স্তরে (account-ই party)। Reclass লাইনের নিজের কোনো account নেই — শুধু অন্য লাইন থেকে আসা; unmapped-যাচাইয়ে এটাকে বাদ রাখুন।

Computed লাইন

computed('current_year_profit') → currentYearProfit(company, as_of) computed('vat_net'): v = closing[1160] − closing[2140] -- signed_dr v > 0 → asset লাইন 'VAT receivable (net)'; v < 0 → liability লাইন 'VAT payable (net)' -- 1160 ও 2140 কোনো সাধারণ account লাইনে থাকবে না (unmapped-যাচাইয়ে 'consumed by computed' ধরে) computed('loan_current_portion'): প্রতিটি loan account a: due12 = Σ loan_schedules.principal WHERE loan.account_id = a AND due_date ∈ (as_of, as_of + 12 মাস] current += min(due12, closing[a]) noncurrent += closing[a] − min(due12, closing[a])
loan_schedules id, company_id, loan_id, account_id (2510), instalment_no, due_date, principal, interest, status

Schedule না থাকলে (পথ খ — JV দিয়ে 2520) computed লাইন লাগে না; 2520 সাধারণ current liability account। Layout-এ দুটোর একটাই থাকবে — config।

সাজানো ও assert

balanceSheet(company, statement, dates): -- dates: [as_of, comparative_as_of …] প্রতিটি d: cl[d] = closing(company, d) প্রতিটি line (line_no ক্রমে), প্রতিটি d: account: val = line.sign × Σ cl[d][a] for a in resolve(line); তারপর reclassify() contra: একই, contra_of_line-এর নিচে ঋণাত্মক computed: উপরের সূত্র subtotal: Σ children -- অলঙ্ঘনীয় প্রতিটি d: assert total_assets[d] == total_liabilities[d] + total_equity[d] (১) assert Σ cl[d] (ASSET+LIABILITY+EQUITY, signed_dr) == currentYearProfit(d) (২) unmapped = permanent accounts − resolved − consumed_by_computed; ≠ ∅ ⇒ ব্যর্থ (৩)

(১) ব্যর্থ, (২) সফল → layout-এর ভুল (লাইন বাদ / দুবার / contra ভুল দিকে / reclass এক পাশে যোগ, অন্য পাশে বিয়োগ নয়)। (২) ব্যর্থ → data-র ভুল: Trial Balance মেলেনি (অধ্যায় ১০-এর যাচাই আগে চালান), অথবা কেউ 3300/3200-এ হাতে post করেছে, অথবা closing entry আধাআধি (অধ্যায় ২৬)। (৩) — নতুন account, mapping নেই। তিনটির কোনোটাতেই report দেখাবেন না।

Comparative — কোন তারিখ

গত মাসের শেষ as_of − 1 মাস (period end) গত বছরের শেষ fiscalYearStart(as_of) − 1 দিন ← statutory রীতি (৩০ জুন ২০২৫) গত বছর একই দিন as_of − 1 বছর

প্রতিটি closing(d)-এর একটা call। Column-এর মাঝে Δ column (ডিসে − নভে) দিলে অধ্যায় ২২-এর indirect method-এর কাঁচামাল এই report-ই।

Note — প্রতিটি একটা query

statement_notes id, statement_line_id, note_no, title source_kind VARCHAR(40) -- open_items | accruals | prepaid_items | contract_positions -- | open_advances | pdc_register | bank_reconciliation | text source_params JSON

Balance Sheet-এর note নতুন কোড নয় — Part 2-র report-গুলোর একটা করে লিংক, as_of সহ। PDC note (pdc_register WHERE issue_date <= as_of AND due_date > as_of) — ব্যালেন্স নয়, তাই লাইনে নয়; note-এ। text note — depreciation policy, contingent — হাতে লেখা, statement_runs-এর সাথে জমা।

Drill-down — তালিকা, ledger নয়

account line → note থাকলে তার query (open items, accruals …) ← "কী কী আছে" → নইলে ledger(accounts, from = FY start, to = as_of), opening সহ reclass line → partyBalances() WHERE দিক উল্টো — party-ধরে computed line → 3300: Income Statement (FY start → as_of); loan: schedule; VAT: দুই account

অধ্যায় ২০-এর exercise ১৯-এর উত্তর এখানে: Balance Sheet-এর drill-down-এ ledger-এর opening দেখাবেন — ব্যালেন্স তো opening থেকেই।

রাতের যাচাই

৬৩. প্রতিটি খোলা period-এর শেষে: balanceSheet(as_of) assert (১)(২)(৩) — ব্যর্থ ⇒ সতর্কতা, কারণ সহ ৬৪. control account-এ: GL closing == Σ partyBalances (অধ্যায় ১৪-এর ৩০ — এখানে আবার, কারণ reclass এর উপরে দাঁড়ায়) ৬৫. 3300, 3200, 3100-এ manual posting → ০টি (allow_manual_posting = false; তবু যাচাই) ৬৬. loan account closing ≥ Σ schedule principal WHERE status = 'pending' (schedule GL-এর চেয়ে বড় নয়) ৬৭. contra account-এর দিক স্বাভাবিক (1515 Cr, 3400 Dr) — উল্টো হলে সতর্কতা ৬৮. asset/liability-তে উল্টো ব্যালেন্স যার reclass_to_line নেই → সতর্কতা ("ঋণাত্মক asset ছাপা হবে") ৬৯. বন্ধ period-এর statement_runs.hash == আবার চালানো hash

Test হিসেবে

test "দুই পাশ মেলে, 3300 = YTD profit": bs = balanceSheet(31-12-2025) assert bs.total_assets == bs.total_liabilities + bs.total_equity assert bs.line('Current year profit') == incomeStatement(01-07 → 31-12).net_profit == 2,78,365 test "closing-এ নিচের সীমা নেই — opening balance ধরা": post(OB, 30-06-2025, 1120, 8,00,000); post(Aug, 1120, +50,000) assert balanceSheet(31-08).line('Bank') == 8,50,000 -- 50,000 নয় test "A/R-এর credit party-ধরে reclass, netting নয়": subledger: করিম 20,000 Dr, সালমা 31,500 Cr -- GL 11,500 Cr bs = balanceSheet(as_of) assert bs.line('Accounts receivable') == 20,000 assert bs.line('Customer credit balances') == 31,500 assert snapshot(GL) অপরিবর্তিত -- entry নেই test "overdraft liability-তে": 1125 closing = −30,000 assert bs.line('Bank overdraft') == 30,000; bs.line('Cash and cash equivalents') excludes 1125 test "contra মূল লাইনের নিচে, নিট": assert bs.line('Computer equipment') == 2,40,000 assert bs.line('Less: accumulated depreciation', under = 'Computer equipment') == −13,333 assert bs.subtotal('Non-current assets') == 2,96,000 test "VAT offset যেদিকে ব্যালেন্স": 1160 = 49,200, 2140 = 46,500 → assert asset line 2,700, liability line absent 1160 = 10,000, 2140 = 46,500 → assert liability line 36,500, asset line absent test "loan current portion schedule থেকে": schedule 20,000 × 16 বাকি, closing 3,20,000 assert current == 2,40,000; noncurrent == 80,000 schedule-এ বাকি 8 কিস্তি (1,60,000), closing 3,20,000 → current 1,60,000, noncurrent 1,60,000, যাচাই ৬৬ সতর্কতা test "layout-এর ভুল assert (১) ধরে, (২) নয়": layout থেকে 'Accrued expenses' লাইন মুছুন (account unmapped নয় — অন্য লাইনে দুবার) assert raises (১); assert (২) passes test "closing entry-র পরে 3300 শূন্য, 3200 বাড়ে, দুই পাশ তবু মেলে": close(FY2026) -- অধ্যায় ২৬ bs = balanceSheet(30-06-2026) assert bs.line('Current year profit') == 0 assert bs.total_assets == bs.total_liabilities + bs.total_equity

৬. Financial Statement Impact

Balance Sheet বাকি তিনটিকে কোথায় ছোঁয়:

INCOME STATEMENT ──▶ 3300 লাইন (YTD) অধ্যায় ২০ দুই তারিখের equity-র পার্থক্য == মাঝের net profit (drawings/পুঁজি বাদে) BALANCE SHEET (৩০ নভে) ──Δ──▶ BALANCE SHEET (৩১ ডিসে) অধ্যায় ২২ net profit + Δ liability − Δ non-cash asset = Δ cash profit +90,800, dep +8,000 (asset কমল) asset বাড়ল/কমল: unbilled +1,80,000, A/R −46,400 (34,900 → −11,500), prepaid −5,000, VAT net −1,500, furniture −8,000 liability বাড়ল/কমল: A/P −1,04,000, accrued +40,500, TDS −1,750, advance +1,00,000, deferred −1,30,000, loan −20,000 ⇒ 90,800 + 8,000 − (1,80,000 − 46,400 − 5,000 − 1,500 − 8,000) + (−1,04,000 + 40,500 − 1,750 + 1,00,000 − 1,30,000 − 20,000) = −1,35,550 == 18,20,165 − 19,55,715 ✓ STATEMENT OF CHANGES IN EQUITY ──▶ equity section-এর প্রতিটি লাইনের opening → closing অধ্যায় ২৩

দ্বিতীয়টা দেখুন — Cash Flow Statement-এর প্রতিটি সংখ্যা ইতিমধ্যে দুটো Balance Sheet আর একটা Income Statement-এ আছে। অধ্যায় ২২ শুধু সাজাবে: কোনটা operating, কোনটা investing (furniture), কোনটা financing (loan)। আর এটাই প্রমাণ কেন Balance Sheet-এর প্রতিটি লাইন ঠিক হওয়া দরকার — একটা reclass ভুল হলে (A/R-এ 11,500 নিট) cash flow-র operating অংশ ভুল, যদিও Δcash ঠিকই মিলবে।


৭. Common Developer Mistakes

ভুলকী ঘটেসঠিক পথ
Balance Sheet-এ movement / নিচের সীমা দেওয়াopening balance হারায়; Bank “মাসের নড়াচড়া” দেখায়closing(as_of)posting_date <= as_of, শুরু নেই
3300 বাদ / হাতে postদুই পাশ মেলে না, বা মেলাতে কেউ JV দেয়computed: YTD net profit; allow_manual_posting = false
3300 হিসাবে FY start ভুল (ক্যালেন্ডার বছর)জুলাই–ডিসেম্বর কোম্পানিতে জানু–ডিসেfiscalYearStart() config থেকে (অধ্যায় ১)
Contra liability-তে (1515 credit বলে)asset ফোলে, liability ফোলেমূল লাইনের নিচে বিয়োগ
উল্টো ব্যালেন্স যেখানে আছে সেখানেইঋণাত্মক asset ছাপা; overdraft asset-এreclass_to_line, উপস্থাপনায়
Reclass GL-স্তরে (party নয়)করিমের পাওনা সালমার দেনায় কাটাকাটিreclass_level = party, subledger থেকে; যাচাই ৬৪
Reclass-এর জন্য JVমাসে দুটো অকারণ entry; ভুলে গেলে GL-ই ভুলউপস্থাপনা; GL অপরিবর্তিত
Loan পুরোটা non-currentcurrent ratio মিথ্যা; ব্যাংক covenantschedule → current portion (বা 2520 JV — একটা নীতি)
Unbilled A/R-এ মিশিয়েপাঠক ভাবেন invoice গেছে; aging ভুলআলাদা লাইন; note
VAT দুই পাশে grossasset-liability দুটোই ফোলানিট, যেদিকে ব্যালেন্স; GL-এ দুটো account-ই থাকে
Group account যোগসব দুবারis_group = false
Balance Sheet মেলাতে “suspense”-এ পার্থক্য ঢালাভুল লুকাল; পরের মাসে দ্বিগুণassert ব্যর্থ ⇒ report নয়; কারণ খুঁজুন (১)(২)(৩)
PDC-র জন্য Bank কমানো (issue-র দিনে)Bank ভুল, reconciliation ভাঙেA/P-তে থাকে, note (অধ্যায় ১৬)
Balance Sheet-এর drill-down-এ ledger-এর opening বাদব্যালেন্স আর ledger মেলে নাopening সহ, বা note-এর তালিকা
Comparative column গত মাসের snapshot থেকে, যা is_staleদুই column দুই সত্যstale হলে rebuild (অধ্যায় ৯)

প্রথম আর দ্বাদশটা মূল। Balance Sheet মেলাতে developer-রা যা করেন — একটা “Difference / Suspense” লাইন, বা equity-তে plug — সেটা এই অধ্যায়ের সবচেয়ে বড় পাপ: মিলছে না মানে কিছু একটা ভুল, আর সেটা খোঁজার তিনটি assert আছে। মেলানো report-এর কাজ নয়; report-এর কাজ না মিললে বলা


৮. Exercises

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

১। ৩১ জানুয়ারি ২০২৬: অধ্যায় ২০-এর exercise ১-এর জানুয়ারির লাভ নিয়ে, আর অধ্যায় ১৭ (নদী: invoice 5,52,000 জানুয়ারিতে, unbilled 0, A/R 5,52,000), অধ্যায় ১৮ (accrual reversal, prepaid 45,000), অধ্যায় ১৯ (সাগরের advance invoice-এ সমন্বয় — ধরুন invoice 2,30,000, advance পুরো কাটা), loan 3,00,000, বাকি ডিসেম্বরের মতো। Cash balancing figure। Balance Sheet লিখুন, দুই পাশ মেলান। 3300? ২। ১ নম্বরে যদি সাগরের advance সমন্বয়ের JV (Dr 2160 / Cr 1130) কেউ post না করত, শুধু allocation করত (অধ্যায় ১৯-এর ভুল) — Balance Sheet-এর কোন দুটো লাইন কত ভুল? দুই পাশ মিলত? ৩। ৩১ ডিসেম্বরের Balance Sheet-এ 1125 City Bank-এ −30,000 হলে (overdraft)। আবার লিখুন। Cash and cash equivalents কত? Current ratio? ৪। 1130-এ subledger: করিম 20,000 Dr, রহিম 3,100 Cr, সালমা 11,500 Cr, নদী 5,52,000 Dr। GL কত? Balance Sheet-এর দুই লাইন কত? GL-স্তরে reclass করলে কত ভুল? ৫। Loan schedule: বাকি ৬ কিস্তি × 20,000, কিন্তু GL 2510-এ 3,20,000 (কিস্তি post হয়নি দুই মাস)। computed লাইন কী দেখাবে? যাচাই ৬৬? আসল ভুল কোথায়?

সেট খ — কোন লাইনে, কেন

৬। প্রতিটির section, current/non-current, আর কেন: (ক) 1140 Advance to Supplier (খ) 2160 Customer Advance (গ) 1170 Unbilled (ঘ) 2180 Deferred Revenue — ১৮ মাসের maintenance চুক্তি (অধ্যায় ১৭-এর আগাম: কতটা current?) (ঙ) 2165 Unidentified Receipts (চ) 3400 Drawings ৭। একটা trading company (অধ্যায় ২৭): 1140 Inventory 4,80,000। Current? Operating cycle ১৮ মাস হলে (ship-building)? ৮। Bad debt allowance (অধ্যায় ৫৯-এর আগাম): 1135 Allowance for Doubtful Debts, credit। Balance Sheet-এ কীভাবে — 1515-এর মতো? reclass-এর মতো?

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

৯। SELECT SUM(debit−credit) FROM posted_lines WHERE posting_date BETWEEN '2025-12-01' AND '2025-12-31' AND account_type = 'ASSET' — "৩১ ডিসেম্বরের asset" ১০। 3300 = SUM(4xxx) − SUM(5xxx) WHERE posting_date BETWEEN '2025-01-01' AND as_of ১১। JV 31-12: Dr 1130 11,500 / Cr 2170 Customer Credit Balances 11,500 — "reclass" ১২। Accumulated depreciation → Non-current liabilities (credit balance বলে) ১৩। Total assets ≠ L + E → লাইন 'Suspense' = পার্থক্য, report ছাপা ১৪। VAT receivable 49,200 asset-এ, VAT payable 46,500 liability-তে — দুটোই ১৫। Bank — Prime: bank statement-এর ব্যালেন্স 13,91,665 (অধ্যায় ১২)

সেট ঘ — নকশা

১৬। reclassify()-তে party-স্তরের যাচাই "normal + opposite == closing[a]" ব্যর্থ হলে — কী কী কারণ? (posted_lines-এ party_id NULL? subledger-এর বাইরে manual JV? allocation ছাড়া receipt?) প্রতিটির জন্য কোন যাচাই আগে ধরত? ১৭। Comparative column ৩০ জুন ২০২৫ (গত বছরের শেষ) — সেই তারিখে closing entry হয়ে গেছে, 3300 = 0, 3200-এ গত বছরের লাভ। এই column-এ equity-র লাইনগুলো কীভাবে সাজাবেন যাতে দুই column পাশাপাশি অর্থপূর্ণ হয়? ১৮। Loan-এর দুই পথ (schedule বনাম 2520 JV)। প্রতিটির জন্য: কে চালায়, কখন, ভুলে গেলে কী হয়, auditor কী দেখেন, multi-loan-এ কী। আপনি কোনটা, কেন? ১৯। Balance Sheet-এর Δ column (ডিসে − নভে) থেকে অধ্যায় ২২-এর indirect cash flow বানাতে প্রতিটি লাইনের একটা "cash flow classification" লাগবে (operating / investing / financing / cash নিজে)। statement_lines-এ column? account-এ? দুটোই? কোথায় রাখলে দুই statement একমত থাকে? ২০। statement_runs-এর hash ৩১ ডিসেম্বরের জন্য মার্চে মিলল না। assert (২) এখন ব্যর্থ, তখন সফল ছিল। কী ঘটতে পারে? কোন log দেখবেন (অধ্যায় ৪২, ৪৫)?

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


৯. Developer Challenge

অধ্যায় ২০-এর IncomeStatementService-কে বাড়িয়ে FinancialStatementService করুন — Income Statement আর Balance Sheet একই engine-এ, একই layout table-এ, একই assert-কাঠামোয়। অধ্যায় ২২ এতে Cash Flow যোগ করবে; অধ্যায় ৪৯-এ এটাই Financial Report Engine।

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

১. movement(from, to) থেকে closing(as_of) — একই function, from = NULL; snapshot হলে closing_signed, মাঝের তারিখে opening + movement; signed_drsigned_cr দুটোই ফেরত। Income Statement-এর কোড একটা লাইনও বদলাবে না — এটাই পরীক্ষা।

২. statement_lines-এ computed, contra, reclass_to_line_id, reclass_level — আর অধ্যায় ৫-এর COA-র জন্য default classified Balance Sheet-এর seed (current/non-current group-ধরে, contra মূলের নিচে, 1130/2110/112x-এর reclass, VAT net, loan current portion, 3300)।

৩. reclassify() party-স্তরে — partyBalances() অধ্যায় ১৪/১৬-এর subledger query থেকে; GL == Σ party যাচাই; ব্যর্থ হলে report নয়, exercise ১৬-এর কারণ-তালিকা সহ বার্তা।

৪. তিনটি assert — (১) A == L + E, (২) Σ permanent closing == YTD profit, (৩) unmapped — আর ব্যর্থতার কারণ-নির্ণয়: কোনটা ব্যর্থ, কোনটা সফল → layout না data না mapping; বার্তায় সন্দেহভাজন account/লাইনের তালিকা (যেমন: “লাইন X-এর account-গুলো অন্য কোনো লাইনে নেই” বা “3300-এ manual JV-12-0031”)।

৫. loan_schedules + computed current portion, অথবা 2520 + adjusting JV (অধ্যায় ২৫-এর জন্য template) — একটা config, দুটো implementation, একই লাইন।

৬. statement_notes — প্রতিটি note Part 2-র একটা report-এর as_of সহ call: open items, accruals, prepaid items, contract positions, open advances, PDC register, bank reconciliation; text note হাতে। Drill-down: account লাইন → note-এর তালিকা (থাকলে) নইলে ledger opening সহ; reclass লাইন → party-ধরে; computed → উৎস।

৭. Comparative — গত মাস / গত বছরের শেষ / গত বছর একই দিন; Δ column; exercise ১৭-এর equity সাজানো। Δ column-এর প্রতিটি লাইনে exercise ১৯-এর cash flow classification — অধ্যায় ২২-এর কাঁচামাল এখনই।

৮. রাতের যাচাই ৬৩–৬৯; statement_runs দুটো statement-এর জন্যই; test — section ৫-এর নয়টি, আর: (ক) ১,০০০ party-র control account-এ reclass এক query; (খ) as_of মাসের মাঝে (১৫ ডিসেম্বর) — snapshot + movement; (গ) দুটো loan, একটার schedule নেই — সতর্কতা, report চলে?

১ আর ৪ নম্বরটাই আসল পরীক্ষা। Income Statement লিখতে যে movement() বানিয়েছিলেন, Balance Sheet সেটাকে না বদলে ব্যবহার করতে পারল কি — না পারলে অধ্যায় ২০-এর নকশা ভুল ছিল, এখন ঠিক করুন, পরে নয়। আর assert-এর কারণ-নির্ণয়: “মেলেনি” বলা সহজ; “কারণ 2135-এর লাইন layout-এ নেই” বলা — সেটাই report engine আর report-এর পার্থক্য।


১০. Summary Card

কী মাপে

Balance Sheet = একটা তারিখে Assets = Liabilities + Equity closing, posting_date <= as_of, নিচের সীমা নেই; permanent account (1xxx, 2xxx, 3xxx) + 3300 Current Year Profit = movement(REVENUE, EXPENSE, FY start → as_of) — হিসাব, post নয়

Classified

current ১২ মাসে cash হবে / মেটাতে হবে sub_type; loan → schedule থেকে current portion non-current বাকি asset তরলতার ক্রমে; liability মেটানোর ক্রমে

Presentation — entry নয়

contra মূল লাইনের নিচে বিয়োগ; নিট-ই asset (2,40,000 − 13,333) দিক উল্টো asset Cr → liability লাইন; liability Dr → asset লাইন; control account-এ party-ধরে VAT একই কর্তৃপক্ষ → নিট এক লাইন, যেদিকে ব্যালেন্স unbilled ≠ A/R, advance ≠ prepaid — আলাদা লাইন ব্যালেন্স নয় কিন্তু জানা দরকার (PDC, commitment) → note

৩১ ডিসেম্বর ২০২৫

assets 23,48,865 = liabilities 9,50,500 + equity 13,98,365 (10,00,000 + 1,20,000 + 2,78,365) current ratio 2.36; working capital 11,82,365; Δ cash (নভে → ডিসে) −1,35,550, profit +90,800

তিনটি assert

(১) A == L + E ব্যর্থ, (২) সফল → layout (২) Σ permanent closing == YTD profit ব্যর্থ → data (TB, 3300-এ manual, closing আধাআধি) (৩) unmapped permanent account ব্যর্থ → mapping কোনোটা ব্যর্থ ⇒ report নয়; suspense/plug কখনো নয়

নকশা

closing(as_of) = movement(NULL, as_of) — অধ্যায় ২০-এর function, অপরিবর্তিত statement_lines: + computed (3300, vat_net, loan_current), contra_of, reclass_to, reclass_level reclassify() subledger থেকে; GL অপরিবর্তিত statement_notes → Part 2-র report-এ লিংক; drill-down তালিকা, ledger নয়

Developer checklist

□ closing(as_of): নিচের সীমা নেই; snapshot + movement; signed_dr/signed_cr □ 3300 computed, fiscalYearStart(); 3xxx manual posting বন্ধ □ layout data: group → current/non-current; contra মূলের নিচে □ reclass_to_line, party-স্তরে control account-এ; GL == Σ party □ VAT net computed; loan current portion (schedule বা 2520 — একটা) □ unbilled, advance, prepaid আলাদা লাইন □ assert (১)(২)(৩) + কারণ-নির্ণয়; suspense নয় □ notes: PDC, open items, accruals, advances, contract, reconciliation □ comparative + Δ column (অধ্যায় ২২-এর জন্য) □ statement_runs + hash □ রাতে: ৬৩–৬৯

পরের অধ্যায়

দুটো ছবি (৩০ নভেম্বর, ৩১ ডিসেম্বর) আর মাঝের ভিডিও (ডিসেম্বরের Income Statement) — তিনটেই লেখা। Cash কমেছে 1,35,550, লাভ হয়েছে 90,800; পার্থক্যের প্রতিটি টাকা এই অধ্যায়ের Δ column-এ বসে আছে। অধ্যায় ২২ — Cash Flow Statement: সেই Δ-গুলোকে operating / investing / financing-এ সাজানো (indirect method), আর উল্টো দিক থেকে — ব্যাংকের প্রতিটি লেনদেন থেকে (direct method) — একই −1,35,550-এ পৌঁছানো। Part 2-র “তিন সংখ্যার গল্প” সেখানে শেষ হয়।