Skip to Content
Go Realm v1 is released 🎉
Accountingবই (Print Edition)অধ্যায় ১৮: Accrual ও Prepaid

অধ্যায় ১৮ — Accrual ও Prepaid

Volume 1 · Part 2 — Core Business Accounting · Chapter 18

পূর্বশর্ত: অধ্যায় ১৭ (Revenue ও Expense Recognition — 2×2 matrix, recognition job), অধ্যায় ১৫ (Purchase — তিনটি তারিখ), অধ্যায় ১০ (Trial Balance — period)


১. Learning Objective

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

Prepaid expense (asset) আর accrued expense (liability) — 2×2-এর নিচের সারি — চিনতে ও entry লিখতে Prepaid-কে মাসে মাসে খরচে নামানোর schedule বানাতে — deferred revenue-র আয়নায় Bill না আসা খরচ আনুমানিক অঙ্কে accrue করতে, আর অনুমানের ভিত্তি লিখে রাখতে Reversing entry কী, কেন, কোন entry উল্টে যায় আর কোনটা যায় না — তা বলতে Accrue করা খরচের bill এলে কী হয় — তিনটি ক্ষেত্রে (সমান, বেশি-কম, আসেনি) — সামলাতে "একবার accrue হলে bill পরের মাসে" — এই নিয়মটা কেন, আর software-এ কীভাবে আটকাবেন Advance (1140), prepaid (1150), fixed asset (1510), expense (5xxx) — চারটি আলাদা করতে Standing accrual template নকশা করতে — যে খরচ প্রতি মাসে দেরিতে bill হয় মাসের শেষের কাজের ক্রম বলতে: recognition → amortization → accrual → depreciation → TB রাতের যাচাই: GL 1150 == Σ prepaid বাকি, GL 2135 == Σ খোলা accrual — চালাতে

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


২. Concept Explanation

2×2-এর নিচের সারি

অধ্যায় ১৭-এ উপরের সারি — deferred (2180) আর unbilled (1170) — আয়ের দিক। এবার খরচের দিক:

document/টাকা আগে, ভোগ আগে, ভোগ পরে document/টাকা পরে ───────────────── ──────────────────── ──────────────────── খরচ 1150 Prepaid Expense 2135 Accrued Expenses (ASSET — সেবা পাব) (LIABILITY — টাকা দেব) license ১২ মাসের, আজ bill বিদ্যুৎ এ মাসের, bill পরের মাসে

দুটোই সময়ের ফাঁক ধরে রাখার account — আর দুটোরই আয়না উপরের সারিতে আছে:

1150 Prepaid ↔ 2180 Deferred (document আগে; asset ↔ liability) 2135 Accrued ↔ 1170 Unbilled (কাজ/ভোগ আগে; liability ↔ asset)

তাই এই অধ্যায়ের অর্ধেক কোড অধ্যায় ১৭ থেকে ধার করা — schedule, মাসের শেষের job, idempotent, rounding শেষ মাসে। নতুন যা: reversing entry, আর অনুমান।

Prepaid — আগে দিলেন, পরে ভোগ

বার্ষিক dev tool license ৬০,০০০, ১ নভেম্বর থেকে ১২ মাস, card-এ টাকা গেল। নভেম্বরের খরচ ৬০,০০০ নয় — ৫,০০০:

টাকা যাওয়ার দিন: Dr 1150 Prepaid Expense 60,000 ← asset: ১২ মাসের সেবা পাওনা Cr 1120 Bank 60,000 প্রতি মাসের শেষে, ১২ বার: Dr 5130 Third-party Software 5,000 ← এ মাসের ভোগ Cr 1150 Prepaid Expense 5,000

এটা অধ্যায় ১৩-এর deferred revenue-র হুবহু উল্টো: সেখানে Cr 2180 → মাসে মাসে Dr 2180 / Cr Revenue; এখানে Dr 1150 → মাসে মাসে Dr Expense / Cr 1150। Schedule একই, straight_line, শেষ মাসে rounding-এর বাকিটা।

কী prepaid হয়: বীমা, বার্ষিক license/subscription, অগ্রিম ভাড়া (তিন মাসের একসাথে), domain/hosting বার্ষিক, AMC। শর্ত: সেবাটা নির্দিষ্ট, সময়কালটা জানা।

চারটি “আগে দেওয়া” — চারটি account

Developer-রা এই চারটিকে গুলিয়ে ফেলেন, কারণ চারটিতেই “টাকা গেল, খরচ এখনই নয়”:

account কী পেলেন খরচে যায় কীভাবে ─────── ─────── ─────────────── 1140 Advance to Supplier কিছু না — bill-ও না bill এলে, তার সাথে সমন্বয় (অধ্যায় ১৯) 1150 Prepaid Expense সেবার অধিকার, সময় ধরে মাসে মাসে, schedule 1510 Fixed Asset জিনিস, বহু বছর অবচয়, মাসে মাসে (অধ্যায় ৩০) 5xxx Expense সেবা, এ মাসেই এখনই

সিদ্ধান্তটা bill-এর line-এ — অধ্যায় ১৫-এর “Dr কোথায়”-এর পূর্ণ রূপ। Item master-এ purchase_account_id আর তার সাথে amortize_months থাকলে system নিজেই prepaid বানায়।

Accrued — আগে ভোগ, পরে bill

নভেম্বরের বিদ্যুৎ ব্যবহার হয়ে গেছে; bill আসবে ১৪ ডিসেম্বরে। ৩০ নভেম্বরে অঙ্কটা জানা নেই — আনুমানিক ১২,০০০:

৩০-১১, মাসের শেষে: Dr 5230 Electricity 12,000 ← নভেম্বরের খরচ, অনুমান Cr 2135 Accrued Expenses 12,000 ← liability, bill ছাড়া

অধ্যায় ১৫-এ অক্টোবরের bill “আসেনি” বলে কিছু লিখিনি। তার দাম কী — section ৪-এ দেখবেন: নভেম্বরে দুই মাসের বিদ্যুৎ।

অনুমানের ভিত্তি লিখে রাখতে হয় — basis: “গত bill ১১,৪০০, শীতে কম, ১২,০০০”; “চুক্তির হার × দিন”; “meter reading”। Auditor প্রথম যে প্রশ্ন করেন: “১২,০০০ কোথা থেকে?”

কী accrue হয়: utility (বিদ্যুৎ, internet, পানি), মাসের শেষে না-আসা subcontractor bill, audit fee (বছর শেষে), bonus, সুদ (ঋণের, মাস শেষে), commission। শর্ত: ভোগ হয়েছে, অঙ্ক যুক্তিসঙ্গতভাবে অনুমান করা যায়।

Reversing entry — accrual-এর দ্বিতীয় অর্ধেক

Accrual-এর সমস্যা: ১৪ ডিসেম্বরে আসল bill ১২,৮০০ এল। সেটা যদি স্বাভাবিকভাবে post হয় (Dr 5230 12,800), ডিসেম্বরে খরচ ১২,৮০০, আর নভেম্বরের ১২,০০০ — দুবার। সমাধান দুটো পথ:

পথ ১ — reversing entry (এই বই) ০১-১২ Dr 2135 12,000 / Cr 5230 12,000 ← accrual উল্টে দিন ১৪-১২ Dr 5230 12,800 / Cr A/P 12,800 ← bill স্বাভাবিক ডিসেম্বরের 5230: −12,000 + 12,800 = 800 ← শুধু অনুমানের ভুল পথ ২ — bill সরাসরি accrual-এ ১৪-১২ Dr 2135 12,000 / Dr 5230 800 / Cr A/P 12,800 ডিসেম্বরের 5230: 800

ফল এক। কিন্তু পথ ২-এ bill post করার সময় জানতে হয় এটা accrue করা ছিল — accountant-কে খুঁজতে হয়, software-কে match করতে হয়, আর bill না এলে 2135-এ ১২,০০০ চিরকাল পড়ে থাকে। পথ ১-এ কিছু জানতে হয় না: মাসের প্রথম দিনে সব accrual উল্টে যায়, bill যখন খুশি আসুক স্বাভাবিকভাবে post হোক। সরল, আর ভুল হওয়ার জায়গা কম।

কোন entry উল্টে যায়, কোনটা নয়:

উল্টে যায় accrued expense, accrued revenue (bill/invoice আসবে) উল্টে যায় না prepaid amortization, deferred recognition, depreciation (এগুলো ফাঁক বন্ধ করছে, ফাঁক খুলছে না)

নিয়মটা: যে entry-র “আসল” document পরে আসবে, সেটা উল্টে যায় — যাতে document এলে জায়গা খালি থাকে।

একবার accrue হলে bill পরের মাসে

একটা সূক্ষ্ম ফাঁদ। ISP-র bill_date ২৮-১১, আসে ০৬-১২। অধ্যায় ১৫-এর নিয়মে “খরচের মাস, period খোলা থাকলে” — নভেম্বর ০৫-১২ পর্যন্ত খোলা। তাহলে bill নভেম্বরে post? কিন্তু নভেম্বরে ৮,০০০ accrue করা আছে, ০১-১২-এ reversal হয়ে গেছে:

নভেম্বর: accrual +8,000 + bill 8,000 = 16,000 ✗ ডিসেম্বর: reversal −8,000 ✗

মোট ঠিক, দুটো মাসই ভুল। নিয়ম: যে খরচ accrue করা হয়েছে, তার bill reversal-এর মাসে (বা পরে) post হবে — accrual-এর মাসে কখনো নয়। অধ্যায় ১৫-এর posting_date-এর যুক্তিতে একটা নতুন শর্ত:

posting_date = খরচের মাস যদি period খোলা এবং ওই (supplier, account)-এ ওই মাসের কোনো accrual নেই নইলে → reversal-এর মাস

Software এটা নিজে দেখবে — accountant মনে রাখবেন না।

Bill না এলে

Accrual উল্টে গেল ০১-১২-এ। Bill এল না ডিসেম্বরেও। ডিসেম্বরের 5230: −১২,০০০ — ঋণাত্মক খরচ। ডিসেম্বরের শেষে আবার accrue — এবার দুই মাসের (নভেম্বর + ডিসেম্বর) ২৪,৫০০। প্রতি মাসের শেষে “যা bill হয়নি” — সবটাই; আগের accrual reversal-এ চলে গেছে, তাই দুবার হয় না।

কিন্তু তিন মাস bill না আসা মানে কিছু একটা ভুল — supplier ভুলে গেছে, ঠিকানা বদলেছে, bill হারিয়েছে। রাতের যাচাই: একই (supplier, account)-এ ৯০ দিনের বেশি ধরে accrual চলছে, bill নেই → সতর্কতা।

Standing accrual — প্রতি মাসের একই গল্প

বিদ্যুৎ, internet, পানি — প্রতি মাসে দেরিতে bill, প্রতি মাসে accrual। মানুষ ভুলে যান। তাই template: (supplier, account, অনুমানের পদ্ধতি) — মাসের শেষের job নিজেই accrual তৈরি করে, অনুমান “শেষ bill-এর অঙ্ক” বা “নির্দিষ্ট”। Accountant শুধু review করেন, বদলান যদি জানেন এ মাসে কিছু আলাদা।

Accrued revenue — contract ছাড়া

উপরের সারির unbilled (1170) অধ্যায় ১৭-এ contract-ভিত্তিক। কিন্তু contract ছাড়াও আয় আগে হয়: ব্যাংকের সুদ (মাস শেষে জমা হয় না, quarter-এ), যে কাজ হয়ে গেছে কিন্তু invoice জানুয়ারিতে লেখা হবে। একই কাঠামো, দিক উল্টো:

৩১-১২ Dr 1170 Unbilled/Accrued Revenue x Cr 4510 Interest Income x ০১-০১ reversal পরে ব্যাংক জমা করলে / invoice লিখলে স্বাভাবিক entry

এটাও উল্টে যায় — document (bank credit, invoice) পরে আসবে।

মাসের শেষের ক্রম

এই অধ্যায় আর অধ্যায় ১৭ মিলে adjusting entry-র চারটি প্রকার (পঞ্চমটা অধ্যায় ৩০)। ক্রম গুরুত্বপূর্ণ:

১. Revenue recognition (অধ্যায় ১৭) contract position থেকে ২. Prepaid amortization (এই অধ্যায়) schedule থেকে ৩. Accruals (এই অধ্যায়) template + manual, reversal পরের মাসের ১-এ ৪. Depreciation (অধ্যায় ৩০) asset register থেকে ৫. Trial Balance (অধ্যায় ১০) এবার সংখ্যাগুলো "সত্যি" ৬. Close (অধ্যায় ২৬)

১–৪ প্রতিটি একটা period-ভিত্তিক job, প্রতিটি idempotent, প্রতিটির ফল state-এ। অধ্যায় ২৫ এই ক্রমটাকে একটা checklist হিসেবে গড়বে; এখানে ২ আর ৩-এর ভিতরটা।


৩. Accounting Rule

Entry

ঘটনাDebitCredit
Prepaid কেনা (bill/টাকা)Prepaid Expense, VAT ReceivableA/P বা Bank
Prepaid → খরচ (মাসে মাসে)ExpensePrepaid Expense
Accrual, মাসের শেষেExpense (অনুমান)Accrued Expenses
Reversal, পরের মাসের ১ তারিখAccrued ExpensesExpense
Bill এলে (reversal-এর পরে)Expense (আসল), VAT ReceivableA/P
Accrued revenueUnbilled RevenueRevenue

কোনটা কী

কিছু পাননি, bill নেই → 1140 Advance সেবা সময় ধরে, bill/টাকা হয়েছে → 1150 Prepaid, মাসে মাসে জিনিস, বহু বছর → 1510 Asset, অবচয় সেবা এ মাসেই → 5xxx ভোগ হয়েছে, bill আসেনি → 5xxx + 2135, অনুমান, reversal

Reversal

উল্টে যায়: accrued expense, accrued revenue (document পরে আসবে) যায় না: prepaid, deferred, depreciation (ফাঁক বন্ধ করছে) reversal-এর posting_date = পরের period-এর প্রথম দিন

Accrual-এর পরে bill

accrue করা (supplier, account, মাস)-এর bill → posting_date ≥ reversal-এর মাস

অনুমান

basis বাধ্যতামূলক (শেষ bill / চুক্তি / meter / নির্দিষ্ট) অনুমান ≠ আসল → পার্থক্য bill-এর মাসে (অনুমানের ভুল), আগের মাস বদলায় না

Materiality

threshold-এর নিচে বহু-মাসের খরচ → সরাসরি expense (নীতি, config)

৪. Real Business Example

নভেম্বর–ডিসেম্বর ২০২৫ — মাসের শেষের কাজ

১২-১১ — অক্টোবরের বিদ্যুৎ bill এল: ১১,৪০০ (অধ্যায় ১৫-এর “আসেনি”)

অক্টোবর ০৫-১১-এ বন্ধ হয়ে গেছে। অক্টোবরে accrual করা হয়নি। তাই:

PB-11-0004 (supplier bill: DESCO Oct, bill_date 08-11) posting_date 12-11 ← অক্টোবর বন্ধ; নভেম্বরে Dr 5230 Electricity 11,400 Cr 2110 A/P [DESCO] 11,400

অক্টোবরের Income Statement-এ বিদ্যুৎ শূন্য, নভেম্বরে দুই মাসের। এটাই accrual না করার দাম — আর এই মাস থেকে করব।

২৫-১১ — dev tool license, card-এ ৬০,০০০, ১ নভেম্বর থেকে ১২ মাস (auto-renew)

Dr কোথায়? সেবা ১২ মাসের, সময়কাল জানা → Prepaid threshold 20,000-এর উপরে ✓ PV-11-0010 (card statement; বিদেশি vendor, VAT invoice নেই) Dr 1150 Prepaid Expense 60,000 Cr 1120 Bank — Prime 60,000 prepaid_items: PI-0007, 5130, 60,000, 01-11 → 31-10-2026, 12 মাস, 5,000/মাস

Payment ২৫-১১, কিন্তু সেবা ০১-১১ থেকে — schedule সেবার তারিখে, payment-এর নয়।

৩০-১১ — মাসের শেষ: ধাপ ২, prepaid amortization

JV-11-0011 posting_date 30-11, source = amortization, PI-0007 Dr 5130 Third-party Software 5,000 Cr 1150 Prepaid Expense 5,000 PI-0007: amortized 5,000, বাকি 55,000, ১১ মাস

৩০-১১ — ধাপ ৩, accruals

Template থেকে দুটো, review-এ একটাও বদলানো হয়নি:

template basis অনুমান ──────── ───── ────── DESCO / 5230 শেষ bill 11,400 → শীতে বেশি 12,000 ISP / 5240 নির্দিষ্ট (চুক্তি) 8,000 JV-11-0012 posting_date 30-11, source = accrual, auto_reverse_on = 01-12 Dr 5230 Electricity 12,000 Cr 2135 Accrued Expenses 12,000 JV-11-0013 posting_date 30-11, source = accrual, auto_reverse_on = 01-12 Dr 5240 Internet & Telephone 8,000 Cr 2135 Accrued Expenses 8,000

নভেম্বরের Income Statement-এ এখন: বিদ্যুৎ ১১,৪০০ (অক্টোবরের) + ১২,০০০ (নভেম্বরের, অনুমান); internet ৮,০০০; software ৫,০০০। 2135-এ ২০,০০০।

০১-১২ — period খুলল: reversal, স্বয়ংক্রিয়

JV-12-0001 posting_date 01-12, source = accrual_reversal, reversal_of = JV-11-0012 Dr 2135 Accrued Expenses 12,000 Cr 5230 Electricity 12,000 JV-12-0002 reversal_of = JV-11-0013 Dr 2135 Accrued Expenses 8,000 Cr 5240 Internet & Telephone 8,000 2135: 0 ডিসেম্বরের 5230: −12,000 5240: −8,000 ← এখন ঋণাত্মক; bill এলে ঠিক হবে

০৬-১২ — ISP-র bill: নভেম্বরের internet, ৮,০০০ + VAT, bill_date ২৮-১১; নভেম্বর এখনো খোলা

অধ্যায় ১৫-এর নিয়ম বলত: নভেম্বর (খোলা) এই অধ্যায়ের শর্ত: (ISP, 5240, নভেম্বর)-এ accrual ছিল → reversal-এর মাস PB-12-0001 posting_date 01-12 (system ঠিক করল, log: "accrued in 2025-11") Dr 5240 Internet & Telephone 8,000 Dr 1160 VAT Receivable 1,200 Cr 2110 A/P [ISP] 9,200 ডিসেম্বরের 5240: −8,000 + 8,000 = 0 ✓ (নভেম্বরে 8,000 — ঠিক জায়গায়)

১৪-১২ — DESCO-র bill: নভেম্বরের বিদ্যুৎ, ১২,৮০০

PB-12-0004 posting_date 14-12 Dr 5230 Electricity 12,800 Cr 2110 A/P [DESCO] 12,800 ডিসেম্বরের 5230: −12,000 + 12,800 = 800 ← অনুমানের ভুল, ডিসেম্বরে থাকল

৮০০ টাকা নভেম্বরে ফেরত নিয়ে যাওয়া হয় না — নভেম্বর ছাপা হয়ে গেছে, আর ৮০০ material নয়। অনুমান বড় ভুল হলে (২০%+) — template-এর basis বদলান, মাস নয়।

৩১-১২ — মাসের শেষ, আবার

ধাপ ২ — amortization JV-12-0021 Dr 5130 5,000 / Cr 1150 5,000 PI-0007: বাকি 50,000 ধাপ ৩ — accruals DESCO / 5230 শেষ bill 12,800 → 12,500 (template) ISP / 5240 8,000 (template) UI subcontractor 40,000, ডিসেম্বরের কাজ, bill জানুয়ারিতে (manual — অধ্যায় ১৭-এর project) basis: "PO-0031, কাজ গৃহীত 28-12" JV-12-0022 Dr 5230 12,500 / Cr 2135 12,500 auto_reverse_on 01-01 JV-12-0023 Dr 5240 8,000 / Cr 2135 8,000 auto_reverse_on 01-01 JV-12-0024 Dr 5270 40,000 / Cr 2135 40,000 auto_reverse_on 01-01 2135 (৩১-১২): 60,500

Subcontractor-এর ৪০,০০০ অধ্যায় ১৭-এর project-এর ডিসেম্বরের লাভে ছিল — এই entry-টাই সেটা। Bill ১০-০১-এ এলে: reversal ০১-০১-এ হয়ে গেছে, bill স্বাভাবিক, জানুয়ারির 5270 শূন্য, ডিসেম্বরে ৪০,০০০।

দুই মাসের 5230 — ledger-এ

5230 Electricity তারিখ Ref বিবরণ Dr Cr মাস 12-11 PB-11-0004 DESCO Oct bill (দেরিতে) 11,400 নভ 30-11 JV-11-0012 accrual Nov 12,000 নভ ────── 23,400 নভেম্বর মোট (দুই মাস) 01-12 JV-12-0001 reversal 12,000 ডিসে 14-12 PB-12-0004 DESCO Nov bill 12,800 ডিসে 31-12 JV-12-0022 accrual Dec 12,500 ডিসে ────── ────── 25,300 12,000 ডিসেম্বর নিট 13,300 (12,500 + 800 অনুমানের ভুল)

জানুয়ারি থেকে ছন্দ স্থির: প্রতি মাসে reversal − , bill +, accrual + → নিট ≈ এক মাসের বিদ্যুৎ ± অনুমানের ভুল।

1150 আর 2135 — ৩১ ডিসেম্বরে

1150 Prepaid Expense 50,000 == PI-0007 বাকি 50,000 (১০ মাস) ✓ 2135 Accrued Expenses 60,500 == JV-12-0022/23/24, কোনোটা reversed নয় ✓

দুটোর প্রতিটি টাকার একটা নাম আছে — কোন prepaid item, কোন accrual। এটা GL-এর নিচের স্তর, অধ্যায় ১৪-এর “স্তর ৩”-এর মতো: 1150-এর ব্যালেন্স যথেষ্ট নয়, জানতে হয় কিসের


৫. Implementation — Software ও Database

Prepaid — deferred-এর আয়না, একই schedule

prepaid_items id, company_id item_no VARCHAR(40) -- PI-0007 description TEXT source_type VARCHAR(20) -- purchase_invoice_line | payment source_id BIGINT expense_account_id BIGINT FK -- 5130 total_amount DECIMAL(18,4) service_from, service_to DATE months INT amortized_to_date DECIMAL(18,4) NOT NULL DEFAULT 0 status VARCHAR(20) -- active | completed | written_off CHECK (amortized_to_date <= total_amount)

Schedule — অধ্যায় ১৭-এর recognition_schedule-এর সাথে একই table, একটা kind:

amortization_schedules id, company_id kind VARCHAR(20) -- deferred_revenue | prepaid_expense item_type / item_id -- contract_obligation | prepaid_item period CHAR(7) planned_amount, posted_amount DECIMAL(18,4) journal_entry_id BIGINT FK NULL UNIQUE (kind, item_type, item_id, period)

buildSchedule() অধ্যায় ১৭-এরটাই — straight_line, শেষ মাসে rounding-এর বাকি, Σ planned == total

Prepaid তৈরি হয় bill post-এর সময়, item master থেকে:

postBill() -এ, প্রতিটি line: যদি line.item.amortize_months > 0 এবং line.net ≥ config.prepaid_threshold: line.debit_account_id = 1150 -- expense নয় INSERT prepaid_items (expense_account = item.purchase_account_id, total = line.net, service_from = line.service_from ?? bill.posting_date, months = item.amortize_months) buildSchedule(prepaid_item) নইলে: সরাসরি expense (threshold-এর নিচে)

Card/নগদ payment-এ একই — payments-এর line থেকে।

মাসের শেষের job — amortization

amortizePrepaid(period, by): period_end = last day যাচাই: period খোলা প্রতিটি prepaid_items WHERE status = 'active': planned = schedule(item, period).planned_amount due = Σ schedule.planned WHERE period ≤ this − item.amortized_to_date -- due ≠ planned হলে আগের মাস বাদ পড়েছে; সবটা এ মাসে, log যদি due ≤ 0: continue entry = JV(posting_date = period_end, source_type = 'amortization', source_id = item.id) Dr item.expense_account due Cr 1150 due post(entry) item.amortized_to_date += due schedule.posted_amount = due; journal_entry_id = entry.id যদি amortized_to_date == total: status = 'completed'

অধ্যায় ১৭-এর recognizeRevenue()-এর হুবহু কাঠামো: idempotent (state থেকে due), period_end, item-ধরে entry। দুটো এক function-এ আনা যায় — Developer Challenge।

Accrual — journal entry-তে দুটো column

Reversal-এর জন্য journal_entries-এ:

journal_entries (+) auto_reverse_on DATE NULL -- থাকলে: এই তারিখে উল্টো entry reversal_of_id BIGINT FK NULL -- এটা কার reversal CHECK (auto_reverse_on IS NULL OR auto_reverse_on > posting_date)

আর accrual নিজে:

accruals id, company_id period CHAR(7) expense_account_id BIGINT FK supplier_id BIGINT FK NULL amount DECIMAL(18,4) basis TEXT NOT NULL -- "শেষ bill 11,400, শীতে বেশি" source VARCHAR(10) -- template | manual template_id BIGINT FK NULL journal_entry_id BIGINT FK -- accrual entry reversal_entry_id BIGINT FK NULL -- ০১ তারিখে বসে matched_bill_id BIGINT FK NULL -- bill এলে (তথ্যের জন্য; GL-এ দরকার নেই) status VARCHAR(20) -- accrued | reversed | matched | stale INDEX (company_id, supplier_id, expense_account_id, period)
accrual_templates id, company_id expense_account_id, supplier_id estimate_method VARCHAR(20) -- last_bill | fixed | avg_3 fixed_amount DECIMAL(18,4) NULL active BOOLEAN

Accrual job — মাসের শেষে

accrueExpenses(period, by): period_end = last day proposals = [] -- template থেকে প্রতিটি accrual_templates WHERE active: যদি bill আছে (supplier, account) posting_date IN period: continue -- এসে গেছে est = estimate(template) -- last_bill: শেষ posted bill-এর net proposals.append((template, est, basis = "…")) -- manual যোগ হয় UI থেকে (subcontractor) return proposals -- review: বদলান, বাদ দিন, যোগ করুন postAccruals(period, proposals, by): প্রতিটি p: entry = JV(posting_date = period_end, source_type = 'accrual', auto_reverse_on = first day of next period) Dr p.expense_account p.amount Cr 2135 p.amount post(entry) INSERT accruals (period, account, supplier, amount, basis, journal_entry_id = entry.id, status = 'accrued')

estimate(last_bill) — bill না থাকলে (নতুন supplier) proposal-এ শূন্য, সতর্কতা: “basis দিন”।

Reversal job — period খোলার দিন

postReversals(date): প্রতিটি journal_entries WHERE auto_reverse_on = date AND কোনো reversal নেই: rev = JV(posting_date = date, source_type = 'accrual_reversal', reversal_of_id = e.id) প্রতিটি line: Dr ↔ Cr উল্টে post(rev) accrual.reversal_entry_id = rev.id; status = 'reversed'

“কোনো reversal নেই” — WHERE NOT EXISTS (SELECT 1 FROM journal_entries r WHERE r.reversal_of_id = e.id) — idempotent: দুবার চালালে দ্বিতীয়বার কিছু হয় না। Date-এ চালানো হয় period open-এর অংশ হিসেবে (অধ্যায় ২৬); period খোলার আগে reversal post করা যায় না, তাই ক্রম নিশ্চিত।

Bill posting-এ নতুন শর্ত

অধ্যায় ১৫-এর postBill()-এর posting_date যুক্তিতে:

resolvePostingDate(bill): d = bill.service_month -- খরচের মাস যদি period(d) বন্ধ: d = first day of open period; log প্রতিটি line: a = accruals WHERE supplier = bill.supplier AND account = line.debit_account AND period = period(d) AND status IN ('accrued','reversed') যদি a আছে: d = max(d, a.reversal_entry.posting_date) -- reversal-এর মাসে a.matched_bill_id = bill.id; a.status = 'matched' log "accrued in {a.period}, posted in {period(d)}" return d

Supplier ছাড়া accrual (subcontractor bill যার supplier জানা কিন্তু template নেই) — manual accrual-এ supplier দিয়ে রাখুন, নইলে match হবে না। Match না হলে ক্ষতি GL-এ নয় (reversal তো হয়েছেই) — শুধু matched_bill_id ফাঁকা, আর “stale” সতর্কতা ভুল বাজবে।

রাতের যাচাই

৪৪. GL 1150 == Σ (prepaid_items.total − amortized_to_date) WHERE active ৪৫. GL 2135 == Σ accruals.amount WHERE status = 'accrued' (reversed নয়) ৪৬. প্রতিটি prepaid_item: Σ schedule.planned == total; Σ posted == amortized_to_date ৪৭. auto_reverse_on ≤ today কিন্তু reversal নেই → ০ সারি (reversal job ব্যর্থ?) ৪৮. একই (supplier, account)-এ ৯০ দিনের বেশি ধরে টানা accrual, bill নেই → সতর্কতা (stale) ৪৯. bill-এর posting মাসে ওই (supplier, account)-এ accrual status = 'accrued' → ০ সারি (accrual-এর মাসে bill ঢুকে গেছে — দুবার খরচ)

৪৯ নম্বরটা resolvePostingDate() আটকায় — তবু রাতে দেখুন; সরাসরি JV, migration, override।

Test হিসেবে

test "prepaid: ১২ মাসে ১২ বার, Σ == total": item = prepaid(60,000, 01-11, 12 মাস) প্রতিটি মাস: amortizePrepaid(m) assert Σ Δ 5130 == 60,000 assert balance(1150) == 0; item.status == 'completed' test "amortization idempotent": amortizePrepaid(2025-11); g = snapshot() amortizePrepaid(2025-11) assert snapshot() == g test "accrual + reversal + bill = এক মাসের খরচ": accrue(2025-11, DESCO, 5230, 12,000); postReversals(01-12) postBill(DESCO, 5230, 12,800, service = Nov, received 14-12) assert expense(5230, 2025-11) == 12,000 assert expense(5230, 2025-12) == 800 assert balance(2135) == 0 test "accrue করা bill accrual-এর মাসে ঢোকে না": accrue(2025-11, ISP, 5240, 8,000); postReversals(01-12) period(2025-11) এখনো খোলা bill = postBill(ISP, 5240, 8,000, service = Nov, received 06-12) assert bill.posting_date == 01-12 -- নভেম্বর নয় assert expense(5240, 2025-11) == 8,000 assert expense(5240, 2025-12) == 0 test "reversal দুবার হয় না": postReversals(01-12); postReversals(01-12) assert count(reversal_of = JV-11-0012) == 1 test "bill না এলে পরের মাসে আবার accrual, দুবার নয়": accrue(Nov, 12,000); reverse(01-12); bill নেই accrue(Dec, 24,500) -- দুই মাসের assert expense(5230, Nov) == 12,000 assert expense(5230, Dec) == 12,500 -- 24,500 − 12,000 reversal assert balance(2135) == 24,500 test "threshold-এর নিচে prepaid নয়": postBill(line(item amortize 12, net 1,200)) assert count(prepaid_items) == 0; Δ expense == 1,200

৬. Financial Statement Impact

INCOME STATEMENT নভ ডিসে 5230 Electricity 23,400 13,300 ← নভেম্বরে দুই মাস 5240 Internet 8,000 8,000 ← −8,000 + 8,000 + 8,000 5130 Software 5,000 5,000 ← ৬০,০০০ নয় 5270 Professional Fee 50,000 40,000 ← ডিসেম্বরে accrual BALANCE SHEET (মাস শেষে) 1150 Prepaid Expense 55,000 50,000 2135 Accrued Expenses 20,000 60,500 1120 Bank (license) −60,000 — CASH FLOW নভেম্বরে license −60,000 পুরোটা; Income Statement-এ 5,000

Internet-এর সারিটা পড়ুন: ডিসেম্বরে reversal (−৮,০০০) আর নভেম্বরের bill (+৮,০০০) কাটাকাটি, তার উপরে ডিসেম্বরের নিজের accrual (+৮,০০০) — নিট ৮,০০০। প্রতি মাসে ঠিক এক মাসের খরচ — accrual-এর পুরো উদ্দেশ্য এই এক লাইনে।

Balance Sheet-এ 1150 আর 2135 দুটোই “সময়ের ফাঁক”। Auditor দুটোরই তালিকা চান — item-ধরে, accrual-ধরে — আর প্রতিটির basis। যে system-এ 2135-এর ব্যালেন্স আছে কিন্তু তালিকা নেই, সেটা “একটা সংখ্যা”, হিসাব নয়।


৭. Common Developer Mistakes

ভুলকী ঘটেসঠিক পথ
বার্ষিক license পুরো এক মাসেএক মাসে লোকসান, ১১ মাস “বিনামূল্যে”1150 + schedule
Prepaid বানানো, amortize করা হয় না1150 ফুলে থাকে, খরচ কখনো আসে নামাসের শেষের job, যাচাই ৪৪
Schedule payment-এর তারিখ থেকে২৫-১১-এ কিনে নভেম্বরের ৫ দিনservice_from
Accrual করা হয় না (“bill এলে দেখব”)মাসের খরচ পরের মাসে, দুই মাস একসাথেtemplate, মাসের শেষে
Accrual আছে, reversal নেইbill এলে দুবার খরচ, 2135 জমেauto_reverse_on, ০১ তারিখে job
Reversal manual, ভুলে যাওয়াকিছু accrual উল্টায়, কিছু নয়job, যাচাই ৪৭
Prepaid amortization-ও উল্টে দেওয়া1150 ওঠানামা, খরচ শূন্যশুধু accrual উল্টায়
Bill accrual-এর মাসে post (period খোলা বলে)ওই মাসে দুবার, পরের মাসে ঋণাত্মকresolvePostingDate(), যাচাই ৪৯
অনুমানের ভুল আগের মাসে ফেরতছাপা report বদলায়bill-এর মাসে থাকে
basis ছাড়া accrualauditor: “১২,০০০ কোথা থেকে?”basis NOT NULL
Bill না এলেও accrual থামে না, কেউ দেখে নাsupplier হারিয়ে গেছে, দেনা ভুয়া৯০ দিনে stale সতর্কতা
Advance আর prepaid এক accountbill এলে সমন্বয় গুলিয়ে যায়1140 বনাম 1150
১,২০০ টাকার subscription-ও prepaid১০০ টাকার ১২টা entry, শব্দthreshold
Amortization job-এ “চালানো হয়েছে” পতাকাপতাকা হারালে দুবারamortized_to_date থেকে due

চতুর্থ আর পঞ্চম জোড়া — accrual না করা, আর করে উল্টে না দেওয়া — দুটোই একই মাসের খরচ দুবার বা শূন্যবার দেখায়। Reversing entry-র পুরো বিদ্যা এক লাইনে: যা অনুমানে লিখেছেন, পরের মাসের প্রথম দিনে মুছে দিন — সত্যিটা নিজে এসে বসবে।


৮. Exercises

সেট ক — entry

১। অফিস বীমা ৩৬,০০০, ০১-১২ থেকে ১২ মাস, bill ২৮-১১, payment ১০-১২। তিনটি entry (bill, payment, ডিসেম্বরের amortization)। ৩১-১২-এ 1150? ২। ১ নম্বরে bill-এ VAT ৫,৪০০। prepaid কত — ৩৬,০০০ না ৪১,৪০০? ৩। ডিসেম্বরের audit fee-র অনুমান ৭৫,০০০ (বছরে একবার, bill মার্চে)। কোন মাসে কত accrue করবেন — ডিসেম্বরে পুরো, নাকি ১২ মাসে ৬,২৫০? দুটোরই যুক্তি। ৪। ৩১-১২-এ ঋণের সুদ ১৮,০০০ জমেছে, ব্যাংক কাটবে ০৫-০১। entry, reversal, ব্যাংকের entry (অধ্যায় ১২)। জানুয়ারির 5510 নিট কত? ৫। Subcontractor accrual ৪০,০০০ (ডিসেম্বর)। bill এল ১০-০১, ৪৬,০০০ + VAT। entry। জানুয়ারির 5270 কত? পার্থক্য ৬,০০০ কোন মাসের? ৬। ৫ নম্বরে bill এল মার্চে। জানুয়ারি ও ফেব্রুয়ারির শেষে কী করবেন? তিন মাসের 5270 লিখুন।

সেট খ — reversal ও তারিখ

৭। কোনগুলো উল্টে যাবে: (ক) ডিসেম্বরের বিদ্যুৎ accrual (খ) prepaid amortization (গ) deferred revenue recognition (ঘ) accrued interest income (ঙ) depreciation (চ) subcontractor accrual। কেন? ৮। Accrual ৩০-১১, reversal ০১-১২, bill_date ২৭-১১, received ০৩-১২, নভেম্বর খোলা। posting_date? অধ্যায় ১৫-এর নিয়ম কী বলত, এই অধ্যায় কী বলে? ৯। ৮ নম্বরে reversal job ব্যর্থ হয়েছিল (কেউ দেখেনি)। bill ০৩-১২-এ ডিসেম্বরে post হলো। কোন মাসে কত ভুল? রাতের কোন যাচাই ধরত? ১০। Accrual ১২,০০০, bill ১২,৮০০, নভেম্বর তখনো খোলা। ৮০০ নভেম্বরে নেওয়া উচিত? অঙ্ক ৮,০০০ হলে? নীতি লিখুন।

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

১১। Dr 1140 Advance 60,000 / Cr Bank — বার্ষিক license, bill হাতে ১২। Dr 5130 60,000 / Cr Bank — "মাসে মাসে ভাগ করা ঝামেলা" ১৩। accrual: Dr 5230 12,000 / Cr 2110 A/P [DESCO] — "দেনা তো DESCO-র" ১৪। ০১-১২ reversal: Dr 5230 / Cr 2135 ১৫। amortization JV, auto_reverse_on = 01-12 ১৬। accruals.basis TEXT NULL

সেট ঘ — নকশা

১৭। amortization_schedules-এ deferred_revenue আর prepaid_expense এক table-এ। কোন column আলাদা? recognizeRevenue() আর amortizePrepaid() এক function-এ আনলে কী parameter লাগে? contract position (অধ্যায় ১৭) prepaid-এ আছে কি? ১৮। Accrual template-এর estimate_method 'avg_3'। bill-এর অঙ্ক আসে purchase_invoices থেকে — VAT-সহ না net? TDS থাকলে? বিদ্যুতের bill দুই মাস একসাথে এলে avg নষ্ট হয় — কীভাবে সামলাবেন? ১৯। Prepaid-এর মাঝপথে সেবা বাতিল (license ৬ মাস পরে বন্ধ, ২৫,০০০ ফেরত, ৫,০০০ ফেরত নয়)। entry? schedule-এর বাকি ৬ মাসের কী হবে? status? ২০। Period বন্ধ (অধ্যায় ২৬) আর reversal job — reversal period খোলার আগে চলতে পারে না, কিন্তু period বন্ধের আগে accrual চলতেই হবে। এই দুই job আর period status-এর state machine আঁকুন। কোন ক্রমে কী ব্যর্থ হলে কী অবস্থা?

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


৯. Developer Challenge

একটি PeriodAdjustmentService নকশা করুন — prepaid amortization, accrual, reversal — আর অধ্যায় ১৭-এর RevenueRecognitionService-এর সাথে একটা সাধারণ “period-end job” কাঠামো।

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

১. amortization_schedules এক table, kind দিয়ে — deferred revenue (অধ্যায় ১৭-এর contract obligation ও অধ্যায় ১৩-এর service_from/to) আর prepaid। একটাই buildSchedule(), একটাই amortize(kind, period); direction কোথায় লাগে (Dr/Cr), আর position (অধ্যায় ১৭) prepaid-এ লাগে কি না।

২. prepaid_items — bill line ও card payment দুটো source থেকে; item master-এ amortize_months; threshold config; মাঝপথে বাতিল/ফেরত (exercise ১৯); সেবার তারিখ বদল (license ১ মাস পিছিয়ে শুরু) — schedule পুনর্গঠন, posted অংশ অক্ষত।

৩. accruals + accrual_templates — তিনটি estimate_method, review UI (proposal → বদল → post), manual accrual-এ supplier ও basis বাধ্যতামূলক, matched_bill_id কীভাবে বসে, stale সতর্কতা।

৪. auto_reverse_on — journal entry-র একটা সাধারণ বৈশিষ্ট্য (accrual ছাড়াও ব্যবহার হবে, অধ্যায় ৪৩); postReversals(date) idempotent; period open-এর সাথে বাঁধা (অধ্যায় ২৬) — reversal ছাড়া period-এ কোনো entry post করা যাবে কি? নীতি ও enforcement।

৫. resolvePostingDate() — অধ্যায় ১৫-এর নিয়ম + এই অধ্যায়ের accrual শর্ত। Override অনুমতি (accountant জোর করে accrual-এর মাসে দিতে চান) — দেওয়া উচিত? দিলে কী log, কী সতর্কতা?

৬. Period-end orchestration — recognition → amortization → accrual → (depreciation placeholder) → TB; প্রতিটি ধাপ idempotent; মাঝপথে ব্যর্থ হলে আবার শুরু থেকে চালানো নিরাপদ কি (হওয়া উচিত); ধাপের ফল (কয়টা entry, মোট কত) একটা period_end_runs table-এ — অধ্যায় ২৫-এর checklist-এর ভিত্তি।

৭. Report — prepaid register (item-ধরে বাকি, শেষ তারিখ), accrual register (period-ধরে, status, বয়স), দুটোরই Σ == GL; “অনুমান বনাম আসল” — template-ধরে গত ৬ মাসের ভুলের হার, basis ঠিক করার জন্য।

৮. রাতের যাচাই ৪৪–৪৯। ৪৫ ব্যর্থ হলে (GL 2135 ≠ Σ accrued) — সম্ভাব্য কারণ চারটি, প্রতিটির query।

৪ আর ৬ নম্বরটাই আসল পরীক্ষা। Auto-reversal হলো journal entry-র প্রথম নিজের ভবিষ্যৎ জানা বৈশিষ্ট্য — post হওয়ার মুহূর্তে জানে কবে উল্টে যাবে — আর অধ্যায় ৪৩-এর reversal architecture এর উপরেই দাঁড়াবে। আর period-end orchestration — চারটি job একটা ক্রমে, প্রতিটি idempotent, মাঝপথে ভাঙলে আবার চালানো নিরাপদ — এটা Part 3-এর প্রতিটি অধ্যায়ের ভিত্তি, আর অধ্যায় ২৬-এর closing-এর আগের শেষ ধাপ।


১০. Summary Card

2×2, পুরো

document/টাকা আগে কাজ/ভোগ আগে আয় 2180 Deferred (L) 1170 Unbilled (A) ← অধ্যায় ১৭ খরচ 1150 Prepaid (A) 2135 Accrued (L) ← এই অধ্যায় schedule, উল্টায় না অনুমান, উল্টে যায়

Entry

prepaid কেনা Dr 1150 Cr A/P / Bank মাসে মাসে Dr Expense Cr 1150 schedule, শেষ মাসে rounding accrual (মাস শেষ) Dr Expense (অনুমান) Cr 2135 auto_reverse_on = পরের ১ তারিখ reversal (১ তারিখ) Dr 2135 Cr Expense bill এলে Dr Expense (আসল) Cr A/P স্বাভাবিক; reversal-এর মাসে

চারটি “আগে দেওয়া”

1140 Advance কিছু পাননি, bill নেই → bill-এ সমন্বয় 1150 Prepaid সেবা সময় ধরে → মাসে মাসে 1510 Asset জিনিস, বহু বছর → অবচয় 5xxx Expense এ মাসেই → এখনই

Reversal-এর নিয়ম

document পরে আসবে → উল্টে যায় (accrued expense/revenue) ফাঁক বন্ধ করছে → উল্টায় না (prepaid, deferred, depreciation) accrue করা bill → reversal-এর মাসে, accrual-এর মাসে নয় bill না এলে → পরের মাসে আবার accrue (জমা), ৯০ দিনে সতর্কতা

মাসের শেষের ক্রম

recognition → amortization → accrual → depreciation → TB → close প্রতিটি idempotent, state থেকে; posting_date = period_end; reversal = পরের ১ তারিখ

Developer checklist

□ prepaid_items + amortization_schedules (kind) — অধ্যায় ১৭-এর schedule পুনর্ব্যবহার □ item master: amortize_months; threshold config □ schedule service_from থেকে, payment তারিখ নয় □ amortizePrepaid(): due = Σ planned − amortized_to_date (idempotent) □ journal_entries.auto_reverse_on + reversal_of_id □ accruals: basis NOT NULL, template/manual, status □ accrual_templates: last_bill | fixed | avg_3; review আগে post □ postReversals(date) period open-এ, NOT EXISTS দিয়ে idempotent □ resolvePostingDate(): accrual থাকলে reversal-এর মাস □ অনুমানের ভুল bill-এর মাসে; আগের মাস নয় □ রাতে: 1150 == Σ prepaid বাকি, 2135 == Σ accrued, schedule Σ, reversal missing, stale accrual, accrual-এর মাসে bill

পরবর্তী অধ্যায়

অধ্যায় ১৯ — Advance, Credit Note ও Debit Note: Part 2-র শেষ অধ্যায়। তিনটি জিনিস বারবার “অধ্যায় ১৯-এ” বলে সরিয়ে রেখেছি: সালমার advance-এর সমন্বয় (অধ্যায় ১৪), টেক সাপ্লাইয়ের laptop ফেরতের debit note (অধ্যায় ১৫), রফিকের advance (অধ্যায় ১৬)। পরের অধ্যায়ে এগুলোর পূর্ণ নিয়ম — আর তার সাথে সবচেয়ে গুরুত্বপূর্ণ প্রশ্ন: invoice ভুল হলে কখন reversal, কখন credit note? উত্তরটা “document ভুল ছিল, না নতুন ঘটনা ঘটেছে” — আর সেটা period, VAT আর গ্রাহকের হাতে থাকা কাগজ — তিনটিকে বদলে দেয়।