অধ্যায় ১৮ — 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
| ঘটনা | Debit | Credit |
|---|---|---|
| Prepaid কেনা (bill/টাকা) | Prepaid Expense, VAT Receivable | A/P বা Bank |
| Prepaid → খরচ (মাসে মাসে) | Expense | Prepaid Expense |
| Accrual, মাসের শেষে | Expense (অনুমান) | Accrued Expenses |
| Reversal, পরের মাসের ১ তারিখ | Accrued Expenses | Expense |
| Bill এলে (reversal-এর পরে) | Expense (আসল), VAT Receivable | A/P |
| Accrued revenue | Unbilled Revenue | Revenue |
কোনটা কী
কিছু পাননি, bill নেই → 1140 Advance
সেবা সময় ধরে, bill/টাকা হয়েছে → 1150 Prepaid, মাসে মাসে
জিনিস, বহু বছর → 1510 Asset, অবচয়
সেবা এ মাসেই → 5xxx
ভোগ হয়েছে, bill আসেনি → 5xxx + 2135, অনুমান, reversalReversal
উল্টে যায়: 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,500Subcontractor-এর ৪০,০০০ অধ্যায় ১৭-এর 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 BOOLEANAccrual 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 dSupplier ছাড়া 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,000Internet-এর সারিটা পড়ুন: ডিসেম্বরে 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 ছাড়া accrual | auditor: “১২,০০০ কোথা থেকে?” | basis NOT NULL |
| Bill না এলেও accrual থামে না, কেউ দেখে না | supplier হারিয়ে গেছে, দেনা ভুয়া | ৯০ দিনে stale সতর্কতা |
| Advance আর prepaid এক account | bill এলে সমন্বয় গুলিয়ে যায় | 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_runstable-এ — অধ্যায় ২৫-এর 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 আর গ্রাহকের হাতে থাকা কাগজ — তিনটিকে বদলে দেয়।