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

অধ্যায় ১১ — Cash ও Bank

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

পূর্বশর্ত: অধ্যায় ৭ (Journal Entry), অধ্যায় ৯ (General Ledger), অধ্যায় ১০ (Trial Balance)


১. Learning Objective

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

Cash আর Bank কেন আলাদা account — আর প্রতিটি bank account কেন আলাদা GL account, তা ব্যাখ্যা করতে Receipt, Payment ও Contra — তিন ধরনের নগদ লেনদেন চিনতে ও entry লিখতে Contra entry কেন আয়ও নয়, খরচও নয় — এবং কেন তার আলাদা voucher লাগে, তা বলতে Petty Cash ও imprest পদ্ধতি হিসাবে ধরতে Cheque-এর জীবনচক্র (হাতে, জমা, clear, dishonour) খাতায় ঠিকভাবে ফোটাতে Bank overdraft — asset account-এ credit balance — সামলাতে Cash কখনো ঋণাত্মক হতে পারে না — এই নিয়ম software-এ প্রয়োগ করতে, back-dated entry সহ Cash Book তৈরি করতে এবং হাতে গোনা টাকার সাথে মেলাতে Payment/Receipt document থেকে journal entry — source document ও তার schema নকশা করতে

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


২. Concept Explanation

Cash কেন সবচেয়ে বেশি নজরের account

Part 1-এ আমরা account, entry, ledger, Trial Balance — পুরো যন্ত্রটা বানিয়েছি। Part 2-তে সেই যন্ত্র দিয়ে বাস্তব ব্যবসা চালাব। আর শুরু করছি সেই account দিয়ে যেখানে ব্যবসার প্রতিটি চক্র শেষ পর্যন্ত এসে থামে:

বিক্রি ──▶ পাওনা (A/R) ──▶ টাকা এল ──▶ ┐ │ CASH / BANK ক্রয় ──▶ দেনা (A/P) ──▶ টাকা গেল ──▶ ┘

Sales, purchase, salary, loan, capital — যেখান থেকেই শুরু হোক, শেষে হয় নগদ আসে, নয় নগদ যায়। তাই Cash ও Bank হলো সবচেয়ে ব্যস্ত, সবচেয়ে liquid, এবং দুঃখজনকভাবে সবচেয়ে চুরি হওয়ার account।

Developer-এর দৃষ্টিতে Cash ও Bank-এর একটা অনন্য বৈশিষ্ট্য আছে: এগুলোই একমাত্র GL account যার সত্যতা বাইরের কেউ যাচাই করে দেয়। Sales account ঠিক আছে কিনা — সেটা শুধু আপনার নিজের খাতাই বলতে পারে। কিন্তু Bank account ঠিক আছে কিনা — ব্যাংক নিজে একটা statement পাঠিয়ে বলে দেয়। Cash-এর জন্য একই কাজ করে হাতে গোনা টাকা। এই “বাইরের সত্য”-এর সাথে খাতা মেলানোই পরের অধ্যায় (Bank Reconciliation)।

Cash বনাম Bank — কেন আলাদা

দুটোই টাকা। তবু দুটো account আলাদা রাখা হয়, কারণ তাদের নিয়ন্ত্রণ আর যাচাইয়ের পদ্ধতি সম্পূর্ণ আলাদা:

Cash in HandBank
কোথায় থাকেসিন্দুক, ক্যাশ বাক্সব্যাংকের হিসাবে
কে সামলায়ক্যাশিয়ারauthorized signatory
যাচাই কীভাবেহাতে গুনেbank statement দিয়ে
ঋণাত্মক হতে পারে?কখনোই নাoverdraft থাকলে হ্যাঁ
প্রমাণরসিদ, vouchercheque, statement, transfer advice
ঝুঁকিচুরি, গোনার ভুলজালিয়াতি, ভুল account-এ transfer

Balance Sheet-এ দুটোই এক জায়গায় দেখানো হয় — Cash and Cash Equivalents — কিন্তু ledger-এ কখনো মেশানো হয় না।

প্রতিটি bank account = একটি GL account

এটা এই অধ্যায়ের প্রথম কঠিন নিয়ম:

প্রতিটি bank account-এর জন্য আলাদা একটি GL account থাকবে। একটাই “Bank” account-এ দুটো ব্যাংকের টাকা রাখবেন না।

অধ্যায় ৫-এর COA-তে এটা আগেই করা আছে:

1120 Bank — Prime Bank CA 4471 1125 Bank — City Bank SND 8890

কারণটা পরের অধ্যায়ে পুরোপুরি বোঝা যাবে, তবে এক লাইনে: প্রতিটি bank statement একটি মাত্র ledger-এর সাথে মেলানো হয়। দুটো ব্যাংকের লেনদেন এক ledger-এ মিশে থাকলে কোন statement-এর সাথে কী মেলাবেন? মেলানো অসম্ভব হয়ে যায়।

তবে account-এর নামে ব্যাংকের নম্বর লিখে রাখাই যথেষ্ট নয়। ব্যাংকের নাম, শাখা, account নম্বর, ধরন, overdraft সীমা — এসব master data, COA-র নাম নয়। তাই একটা আলাদা table লাগবে যা GL account-এর সাথে এক-এক সম্পর্কে বাঁধা (section ৫-এ)।

আরেকটা নিয়ম যা এখন শুধু নাম করে রাখছি: এক bank account, এক currency। USD account আর BDT account কখনো এক GL account-এ নয় (অধ্যায় ৫৪)।

তিন ধরনের নগদ লেনদেন

Cash বা Bank-কে ছুঁয়ে যায় এমন প্রতিটি entry তিনটির একটি:

RECEIPT বাইরে থেকে টাকা এল Dr Cash/Bank Cr <কারণ> PAYMENT বাইরে টাকা গেল Dr <কারণ> Cr Cash/Bank CONTRA নিজের এক পকেট থেকে অন্যটায় Dr Cash/Bank (গন্তব্য) Cr Cash/Bank (উৎস)

“কারণ” account-টা যেকোনো কিছু হতে পারে — এটাই Part 2-র বাকি অধ্যায়গুলোর বিষয়:

টাকা এল কেন? Cr কোথায় ────────────── ───────── গ্রাহক পাওনা দিল 1130 Accounts Receivable (+ party) নগদে বিক্রি হলো 4110 Sales (+ 2140 VAT Payable) মালিক পুঁজি দিল 3100 Share Capital ব্যাংক ঋণ দিল 2510 Bank Loan ব্যাংক সুদ দিল 4510 Interest Income গ্রাহক অগ্রিম দিল 2160 Customer Advance টাকা গেল কেন? Dr কোথায় ────────────── ───────── সরবরাহকারীর দেনা শোধ 2110 Accounts Payable (+ party) বেতন দিলাম 2120 Salary Payable (বা 5210 সরাসরি) ভাড়া দিলাম 5220 Office Rent ব্যাংক charge কাটল 5280 Bank Charges ঋণের কিস্তি 2510 Bank Loan + 5510 Interest Expense

লক্ষ করুন — Cash/Bank পাশটা সবসময় একই, শুধু অন্য পাশটা বদলায়। এই কারণেই Cash ও Bank-এর entry গুলো software-এ সবচেয়ে সহজে স্বয়ংক্রিয় করা যায়: এক পাশ যন্ত্র জানে, অন্য পাশ ব্যবহারকারী বলে।

Contra — যে লেনদেনে কিছুই বদলায় না

তৃতীয়টা আলাদা করে বোঝার মতো। নগদ টাকা ব্যাংকে জমা দিলেন:

Dr 1120 Bank — Prime 2,00,000 Cr 1110 Cash in Hand 2,00,000

এখানে কোনো আয় নেই, কোনো খরচ নেই, বাইরের কেউ নেই। Cash আর Bank-এর যোগফল আগেও যা ছিল, পরেও তাই। শুধু টাকাটা এক পকেট থেকে অন্য পকেটে গেছে।

তিন রকম contra হয়:

জমা (deposit) Cash → Bank Dr Bank Cr Cash উত্তোলন (withdrawal) Bank → Cash Dr Cash Cr Bank স্থানান্তর (transfer) Bank A → Bank B Dr Bank B Cr Bank A

কেন আলাদা voucher type (CV) দরকার? দুটো কারণ:

১. Cash Book-এ contra দুই পাশেই দেখা যায় — receipt পাশে "Bank থেকে", payment পাশে "Bank-এ" — পাঠক বুঝবেন এটা একই টাকা। ২. Cash Flow Statement (অধ্যায় ২২) থেকে contra সম্পূর্ণ বাদ দিতে হয়। নইলে ৩,০০,০০০ টাকা এক ব্যাংক থেকে আরেক ব্যাংকে সরালে report বলবে "৩,০০,০০০ এল, ৩,০০,০০০ গেল" — যা অর্থহীন। contra চিহ্নিত না থাকলে এটা বাদ দেওয়ার কোনো নির্ভরযোগ্য উপায় নেই।

এটাই অধ্যায় ৭-এর কথার প্রতিধ্বনি: voucher type নিছক label নয়, report-এর যুক্তি এর উপর দাঁড়ায়। Contra-কে সাধারণ JV হিসেবে লিখলে entry ঠিক থাকবে, Trial Balance মিলবে — কিন্তু Cash Flow Statement চুপচাপ ভুল হবে। অধ্যায় ১০-এর ভাষায়: এটা এমন ভুল যা Trial Balance কখনো ধরবে না।

Petty Cash ও Imprest পদ্ধতি

চা, রিকশা ভাড়া, কলম — ছোট খরচগুলোর জন্য প্রতিবার cheque লেখা বা ক্যাশিয়ারের কাছে যাওয়া অবাস্তব। তাই একটা ছোট তহবিল থাকে একজন custodian-এর কাছে। এটাই Petty Cash (1115)।

এর প্রচলিত নিয়মটির নাম imprest পদ্ধতি:

১. একটা নির্দিষ্ট অঙ্ক ঠিক হয় — ধরুন ১০,০০০ টাকা (float) Dr 1115 Petty Cash 10,000 Cr 1110 Cash 10,000 ← contra ২. custodian খরচ করেন, প্রতিটির জন্য একটা ছোট voucher রাখেন (খাতায় এখনো কিছু লেখা হয় না) ৩. তহবিল কমে এলে voucher গুলো জমা দেন, ঠিক সেই অঙ্ক ফেরত পান Dr 5260 Conveyance 4,000 Dr 5250 Office Supplies 3,500 Cr 1110 Cash 7,500 ← replenishment ৪. তহবিল আবার ঠিক ১০,০০০-এ ফিরে গেল

সৌন্দর্যটা ধাপ ৪-এ: Petty Cash account-এর ব্যালেন্স সবসময় float-এর সমান থাকে। যেকোনো মুহূর্তে custodian-এর কাছে “নগদ + voucher” মিলে ১০,০০০ হতেই হবে — না হলে কিছু একটা হারিয়েছে।

লক্ষ করুন replenishment entry-তে 1115 নেই। খরচগুলো সরাসরি Cash থেকে ধরা হচ্ছে, কারণ Petty Cash-এর ব্যালেন্স তো বদলায়নি — ১০,০০০ ছিল, ১০,০০০ থাকল।

দুটো সতর্কতা:

মাস শেষে অ-replenished voucher থাকলে খরচগুলো সেই মাসে পড়েনি। ছোট অঙ্ক হলে উপেক্ষা করা যায়; বড় হলে মাস শেষে বাধ্যতামূলক replenish। software-এ প্রতিটি voucher আলাদা করে রাখুন (তারিখ, অঙ্ক, খরচের account), কিন্তু journal entry তৈরি করুন replenishment-এর সময়, একসাথে।

Cheque — কাগজ আর টাকার মাঝের সময়

Cheque-এর সমস্যা একটাই: কাগজটা হাতে আসা আর টাকাটা ব্যাংকে আসা এক সময়ে ঘটে না। এই ফাঁকটা কয়েক দিন থেকে কয়েক সপ্তাহ হতে পারে, আর এই ফাঁকেই বেশিরভাগ বিভ্রান্তি।

পাওয়া cheque-এর জীবনচক্র:

হাতে পেলাম ──▶ ব্যাংকে জমা দিলাম ──▶ clear হলো (received) (deposited) (cleared) └──▶ ফেরত এল (dishonoured / bounced)

কোন ধাপে খাতায় কী লিখবেন? দুটো পথ:

পথ ১ — সরাসরি Bank-এ পথ ২ — Cheques in Hand হয়ে ───────────────────── ────────────────────────── জমার দিন: হাতে পাওয়ার দিন: Dr 1120 Bank Dr 1117 Cheques in Hand Cr 1130 A/R (গ্রাহক) Cr 1130 A/R (গ্রাহক) জমার দিন: Dr 1120 Bank Cr 1117 Cheques in Hand

পথ ২-এর জন্য COA-তে একটা নতুন account লাগে — 1117 Cheques in Hand (কেউ বলে Undeposited Funds)। কখন কোনটা?

cheque পাওয়ার দিনেই জমা হয় → পথ ১ যথেষ্ট cheque কয়েক দিন হাতে থাকে → পথ ২, নইলে গ্রাহকের পাওনা কমে গেছে কিন্তু টাকা কোথাও নেই

Clear হওয়াটা খাতায় লেখা হয় না। এটা ব্যাংকের দিকের ঘটনা; আপনি জমা দেওয়ার দিনেই Bank Dr করেছেন। clear হয়েছে কিনা তা পরের অধ্যায়ের reconciliation বলবে।

Dishonour হলে পুরোটা উল্টে যায় — গ্রাহক আবার দেনাদার, আর ব্যাংক একটা charge কাটে:

Dr 1130 A/R (গ্রাহক) 80,000 ← পাওনা ফিরে এল Dr 5280 Bank Charges 200 ← ফেরতের charge Cr 1120 Bank 80,200

দেওয়া cheque-এর জীবনচক্র:

লিখলাম ──▶ হাতে দিলাম ──▶ সে ব্যাংকে দিল ──▶ আমার ব্যাংক থেকে কাটল (issued) (presented) (cleared)

নিয়ম: cheque লেখার দিনেই entry হবেDr A/P, Cr Bank। ব্যাংক থেকে কাটার জন্য অপেক্ষা করবেন না। কারণ cheque দেওয়ার মুহূর্ত থেকেই সরবরাহকারীর দেনা মিটে গেছে, আর ওই টাকা আপনার আর নেই — যদিও ব্যাংক এখনো জানে না।

এতে book আর bank-এর মাঝে একটা ফাঁক তৈরি হয় — একে বলে outstanding cheque। এই ফাঁক সমস্যা নয়, স্বাভাবিক; reconciliation ঠিক এটাই সামলায়।

Post-dated cheque (PDC) — ভবিষ্যতের তারিখ লেখা cheque — একটা ব্যতিক্রম। এটা ওই তারিখের আগে টাকা নয়, একটা প্রতিশ্রুতি। খাতায় লিখবেন না; একটা আলাদা PDC register-এ রাখুন, তারিখ এলে entry দিন (section ৫-এ)।

Bank Overdraft — যখন Bank credit balance-এ

Bank একটা asset account, স্বাভাবিক ব্যালেন্স debit। কিন্তু ব্যাংক যদি overdraft সুবিধা দেয়, আপনি জমার চেয়ে বেশি তুলতে পারেন — তখন ব্যালেন্স credit-এ চলে যায়:

1120 Bank Cr 1,20,000 ← ব্যাংককে আপনি ১,২০,০০০ দেবেন

অধ্যায় ৩-এর ভাষায়: asset-এ credit balance মানে আসলে এটা এখন liability। দুটো পথ:

পথ ১ — একই account, report-এ পুনর্শ্রেণিকরণ ledger-এ 1120 credit-এ থাকুক। Balance Sheet বানানোর সময়: ব্যালেন্স credit হলে Current Liabilities-এ "Bank Overdraft" হিসেবে দেখান। পথ ২ — আলাদা OD account ব্যাংক যদি আলাদা OD account দেয় (আলাদা statement সহ), তার জন্য আলাদা GL account: 2170 Bank Overdraft (LIABILITY)।

ব্যাংক যেভাবে statement দেয়, সেভাবেই account রাখুন — এক statement, এক GL account নিয়মটা এখানেও।

একটা বাস্তব সংঘর্ষ: অধ্যায় ১০-এর “অস্বাভাবিক ব্যালেন্স” সতর্কতা overdraft-এ প্রতি রাতে বাজবে। তাই account-এ একটা allow_credit_balance পতাকা (বা bank master-এ overdraft_limit) রাখুন — সীমার ভিতরে থাকলে সতর্কতা নয়, সীমা ছাড়ালে সতর্কতা।

Cash কখনো ঋণাত্মক নয়

সিন্দুকে যা নেই তা খরচ করা যায় না। তাই:

Cash in Hand-এর ব্যালেন্স যেকোনো তারিখে শূন্যের নিচে নামা মানে খাতা ভুল — ব্যবসা নয়।

কারণগুলো সবসময় একই রকম: একটা receipt লেখা হয়নি, একটা payment ভুল account থেকে দেখানো হয়েছে, বা তারিখ ভুল। Software-এর কাজ এটা ঘটার আগেই আটকানো।

কিন্তু আটকানোটা যতটা সহজ শোনায়, ততটা নয়। “এখনকার ব্যালেন্স যথেষ্ট আছে কিনা” — এই যাচাই যথেষ্ট নয়:

আজ ৩১ আগস্ট, Cash ব্যালেন্স ১,০৪,৫০০ — যথেষ্ট। কেউ ৫ আগস্ট তারিখে একটা ২,৪০,০০০ টাকার payment লিখলেন। ৫ আগস্টের ব্যালেন্স ছিল ২,৪৩,০০০ → ৩,০০০ থাকে, ঠিক আছে ১২ আগস্টের ব্যালেন্স হয়ে যাবে -২৭,৫০০ → ভুল! (মাঝে ৭ তারিখে ৩৪,৫০০ এসেছিল, কিন্তু ১২ তারিখে ৬৫,০০০ গেছে)

Back-dated entry-র জন্য ওই তারিখ থেকে আজ পর্যন্ত প্রতিটি দিনের running balance যাচাই করতে হয়, শুধু একটা দিন নয়। আর দুজন একই সময়ে payment লিখলে দুটোই “যথেষ্ট আছে” দেখে ঢুকে যেতে পারে — এটা অধ্যায় ৪৭-এর concurrency সমস্যা; এখানে শুধু জেনে রাখুন যে যাচাইটা lock ছাড়া নিরাপদ নয়।

Bank-এর জন্য নিয়ম একই, শুধু শূন্যের জায়গায় -overdraft_limit

Cash Book — দিনের খাতা

Cash Book হলো Cash ও Bank account-গুলোর ledger, দিন ধরে সাজানো, receipt আর payment দুই পাশে:

CASH BOOK — ২৫ আগস্ট ২০২৫ RECEIPT PAYMENT ───────────────────────────── ───────────────────────────── Opening 1,12,500 Petty cash replenish 7,500 Closing 1,05,000 ───────────────────────────── ───────────────────────────── 1,12,500 1,12,500

বহু-column রূপে Cash আর প্রতিটি Bank পাশাপাশি থাকে, আর contra entry দুই column-এই দেখা যায়। ক্যাশিয়ার দিনের শেষে এটা মেলান।

Physical count — মাস শেষে (ভালো হয় প্রতিদিন) সিন্দুকের টাকা গুনে খাতার সাথে মেলানো:

খাতা বলে 1,05,000 গুনে পেলাম 1,04,500 ঘাটতি 500

ঘাটতি বা বাড়তি — যেটাই হোক — একটা আলাদা account-এ লিখুন: 5295 Cash Over/Shortকখনো একটা বানানো receipt বা payment দিয়ে মিলিয়ে দেবেন না। ৫০০ টাকার ঘাটতি একটা তথ্য; সেটা লুকালে পরের মাসে ৫,০০০ হবে।


৩. Accounting Rule

তিন ধরনের লেনদেন

ধরনDebitCreditVoucher
ReceiptCash/Bankকারণ (A/R, Sales, Capital, Loan…)RV
Paymentকারণ (A/P, Expense, Loan…)Cash/BankPV
ContraCash/Bank (গন্তব্য)Cash/Bank (উৎস)CV

Cheque

পাওয়া cheque, একই দিনে জমা Dr Bank Cr A/R (party) পাওয়া cheque, পরে জমা Dr Cheques in Hand Cr A/R (party) ... জমার দিন Dr Bank Cr Cheques in Hand clear হলো কোনো entry নয় dishonour হলো Dr A/R (party), Dr Bank Charges Cr Bank দেওয়া cheque লেখার দিনেই: Dr A/P (party) Cr Bank post-dated cheque তারিখের আগে কোনো entry নয় (register-এ)

Petty Cash (imprest)

float তৈরি Dr Petty Cash Cr Cash (contra) replenish Dr Expense (একাধিক) Cr Cash (Petty Cash অপরিবর্তিত) অলঙ্ঘনীয়: Petty Cash ব্যালেন্স == float

সীমা

Cash in Hand ব্যালেন্স ≥ 0 প্রতিটি তারিখে Bank ব্যালেন্স ≥ -overdraft প্রতিটি তারিখে Cheques in Hand ব্যালেন্স ≥ 0, এবং কোনো line N দিনের বেশি পুরনো নয়

গণনার পার্থক্য

ঘাটতি Dr 5295 Cash Over/Short Cr Cash বাড়তি Dr Cash Cr 5295 Cash Over/Short কখনো নয়: বানানো receipt/payment দিয়ে মিলিয়ে দেওয়া

Overdraft

Bank credit balance → Balance Sheet-এ Current Liability হিসেবে দেখান আলাদা OD account → আলাদা GL account (2170, LIABILITY)

৪. Real Business Example

আগস্ট ২০২৫ — একই company, পরের মাস

অধ্যায় ৯ ও ১০-এর সেই software company। জুলাইয়ের closing থেকে আগস্টের opening:

1110 Cash in Hand 2,53,000 Dr 1115 Petty Cash 0 1117 Cheques in Hand 0 ← এই মাসে নতুন 1120 Bank — Prime Bank CA 4471 11,10,000 Dr 1125 Bank — City Bank SND 8890 0 ← এই মাসে খোলা হবে

মাসের ঘটনাগুলো, একে একে। প্রতিটির জন্য আগে কোন ধরন (receipt / payment / contra) ঠিক করুন, তারপর entry:

০১-০৮ — City Bank-এ নতুন account, Prime থেকে ৩,০০,০০০ transfer

ধরন: contra (bank → bank) CV-08-0001 Dr 1125 Bank — City 3,00,000 Cr 1120 Bank — Prime 3,00,000

০২-০৮ — Petty cash float ১০,০০০, নগদ থেকে

ধরন: contra (cash → petty cash) CV-08-0002 Dr 1115 Petty Cash 10,000 Cr 1110 Cash 10,000

০৪-০৮ — ABC Ltd জুলাইয়ের invoice-এর ৫,৭৫,০০০ টাকার cheque দিল; জমা দেওয়া হবে পরে

ধরন: receipt (cheque হাতে) RV-08-0001 Dr 1117 Cheques in Hand 5,75,000 Cr 1130 A/R [ABC Ltd] 5,75,000

০৫-০৮ — সেই cheque Prime Bank-এ জমা

ধরন: contra (cheques in hand → bank) CV-08-0003 Dr 1120 Bank — Prime 5,75,000 Cr 1117 Cheques in Hand 5,75,000

০৭-০৮ — নগদে ৩০,০০০ টাকার বিক্রি, VAT ৪,৫০০

ধরন: receipt RV-08-0002 Dr 1110 Cash 34,500 Cr 4110 Software Dev. Income 30,000 Cr 2140 VAT Payable 4,500

১০-০৮ — সরবরাহকারীকে cheque #00412, ১,৫০,০০০

ধরন: payment (cheque লেখার দিনেই) PV-08-0001 Dr 2110 A/P [সরবরাহকারী] 1,50,000 Cr 1120 Bank — Prime 1,50,000

১২-০৮ — অফিস ভাড়া নগদে ৬৫,০০০

ধরন: payment PV-08-0002 Dr 5220 Office Rent 65,000 Cr 1110 Cash 65,000

১৫-০৮ — নগদ ১,০০,০০০ City Bank-এ জমা

ধরন: contra (cash → bank) CV-08-0004 Dr 1125 Bank — City 1,00,000 Cr 1110 Cash 1,00,000

১৮-০৮ — রহিম এন্টারপ্রাইজের ৮০,০০০ টাকার cheque, একই দিনে Prime-এ জমা

ধরন: receipt (সরাসরি bank-এ, কারণ একই দিনে জমা) RV-08-0003 Dr 1120 Bank — Prime 80,000 Cr 1130 A/R [রহিম এন্টারপ্রাইজ] 80,000

২২-০৮ — ব্যাংক ফোনে জানাল: রহিমের cheque ফেরত এসেছে, charge ২০০

ধরন: payment (dishonour) JV-08-0005 Dr 1130 A/R [রহিম এন্টারপ্রাইজ] 80,000 Dr 5280 Bank Charges 200 Cr 1120 Bank — Prime 80,200

রহিম আবার দেনাদার — তার subledger-এ ৮০,০০০ ফিরে গেল। আর charge-টা ফোনে শোনা “প্রায় ২০০” — এটা মনে রাখুন, পরের অধ্যায়ে কাজে লাগবে।

২৫-০৮ — Petty cash replenish: voucher ৭,৫০০

ধরন: payment PV-08-0003 Dr 5260 Travel & Conveyance 4,000 Dr 5250 Office Supplies 3,500 Cr 1110 Cash 7,500

Petty Cash (1115) এই entry-তে নেই — তার ব্যালেন্স ১০,০০০-ই থাকল।

২৮-০৮ — বেতন ৩,৫০,০০০, Prime থেকে transfer

ধরন: payment PV-08-0004 Dr 2120 Salary Payable 3,50,000 Cr 1120 Bank — Prime 3,50,000

৩১-০৮ — মাস শেষে cash count: খাতায় ১,০৫,০০০, গুনে ১,০৪,৫০০

ধরন: payment (ঘাটতি) JV-08-0006 Dr 5295 Cash Over/Short 500 Cr 1110 Cash 500

Ledger — 1110 Cash in Hand

LEDGER — 1110 Cash in Hand — আগস্ট ২০২৫ তারিখ Voucher বিবরণ Debit Credit Balance ───── ─────── ───── ───── ────── ─────── 01-08 Opening 2,53,000 Dr 02-08 CV-08-0002 Petty cash float 10,000 2,43,000 Dr 07-08 RV-08-0002 Cash sale + VAT 34,500 2,77,500 Dr 12-08 PV-08-0002 Office rent 65,000 2,12,500 Dr 15-08 CV-08-0004 Deposit to City Bank 1,00,000 1,12,500 Dr 25-08 PV-08-0003 Petty cash replenish 7,500 1,05,000 Dr 31-08 JV-08-0006 Cash short 500 1,04,500 Dr ──────── ──────── 34,500 1,83,000

প্রতিটি সারিতে ব্যালেন্স শূন্যের উপরে — নিয়ম মানা হয়েছে।

Ledger — 1120 Bank — Prime Bank

LEDGER — 1120 Bank — Prime — আগস্ট ২০২৫ তারিখ Voucher বিবরণ Debit Credit Balance ───── ─────── ───── ───── ────── ─────── 01-08 Opening 11,10,000 Dr 01-08 CV-08-0001 Transfer to City Bank 3,00,000 8,10,000 Dr 05-08 CV-08-0003 Deposit chq — ABC Ltd 5,75,000 13,85,000 Dr 10-08 PV-08-0001 Chq #00412 — supplier 1,50,000 12,35,000 Dr 18-08 RV-08-0003 Chq — রহিম এন্টারপ্রাইজ 80,000 13,15,000 Dr 22-08 JV-08-0005 Chq returned — রহিম 80,200 12,34,800 Dr 28-08 PV-08-0004 Salary transfer 3,50,000 8,84,800 Dr ──────── ──────── 6,55,000 8,80,200

এই ৮,৮৪,৮০০ সংখ্যাটা মনে রাখুন। পরের অধ্যায়ে ব্যাংক একটা statement পাঠাবে, আর সেখানে অন্য একটা সংখ্যা থাকবে। দুটোই ঠিক হবে — সেটাই reconciliation-এর ধাঁধা।

মাস শেষে — Cash ও Bank এক নজরে

1110 Cash in Hand 1,04,500 1115 Petty Cash 10,000 1117 Cheques in Hand 0 ← এসেছে, জমা হয়েছে, খালি 1120 Bank — Prime 8,84,800 1125 Bank — City 4,00,000 ────────── Cash and Cash Equivalents 13,99,300

জুলাই শেষে ছিল ২,৫৩,০০০ + ১১,১০,০০০ = ১৩,৬৩,০০০। এ মাসে বেড়েছে ৩৬,৩০০। কোথা থেকে? contra গুলো বাদ দিয়ে হিসাব করুন:

এল: ABC Ltd 5,75,000 + cash sale 34,500 = 6,09,500 গেল: supplier 1,50,000 + rent 65,000 + charges 200 + petty exp 7,500 + salary 3,50,000 + short 500 = 5,73,200 ────────── নিট 36,300 ✓

রহিমের ৮০,০০০ এসে আবার চলে গেছে — নিট শূন্য, তাই তালিকায় নেই। আর চারটা contra (মোট ৯,৮৫,০০০ টাকার নড়াচড়া!) এই হিসাবে একবারও আসেনি। এটাই Cash Flow Statement-এর বীজ।

Cash Book — বহু-column রূপ

CASH BOOK — আগস্ট ২০২৫ তারিখ বিবরণ RECEIPT PAYMENT Cash Prime City Cash Prime City ───── ───── ───── ───── ──── ───── ───── ──── 01-08 Opening 2,53,000 11,10,000 01-08 Transfer (C) 3,00,000 3,00,000 02-08 Petty float (C) 10,000 05-08 ABC Ltd chq 5,75,000 07-08 Cash sale 34,500 10-08 Chq #00412 1,50,000 12-08 Rent 65,000 15-08 Deposit (C) 1,00,000 1,00,000 18-08 রহিম chq 80,000 22-08 Chq returned 80,200 25-08 Petty replenish 7,500 28-08 Salary 3,50,000 31-08 Cash short 500 31-08 Closing 1,04,500 8,84,800 4,00,000 ──────── ──────── ──────── ──────── ──────── ──────── 2,87,500 17,65,000 4,00,000 2,87,500 17,65,000 4,00,000

(C) চিহ্নিত সারিগুলো contra — receipt পাশে এক column-এ, payment পাশে অন্য column-এ। Petty Cash আলাদা column হিসেবে দেখানো হয়নি, কারণ imprest পদ্ধতিতে সেটা মাসভর একই থাকে।


৫. Implementation — Software ও Database

Cash ও Bank-এর master data

GL account শুধু ব্যালেন্স রাখে। ব্যাংকের নাম, নম্বর, সীমা — এসবের জন্য একটা আলাদা table, GL account-এর সাথে এক-এক সম্পর্কে:

cash_bank_accounts id BIGINT PK company_id BIGINT FK gl_account_id BIGINT FK UNIQUE -- এক GL account, এক সারি kind VARCHAR(10) -- cash | bank | petty_cash | cheques_in_hand name VARCHAR(100) -- "Prime Bank CA 4471" -- bank হলে bank_name VARCHAR(100) NULL branch VARCHAR(100) NULL account_no VARCHAR(40) NULL account_type VARCHAR(10) NULL -- CA | SND | OD | FDR overdraft_limit DECIMAL(18,4) NOT NULL DEFAULT 0 -- petty_cash হলে custodian_user_id BIGINT NULL imprest_amount DECIMAL(18,4) NULL currency CHAR(3) NOT NULL -- অধ্যায় ৫৪ is_active BOOLEAN NOT NULL DEFAULT true UNIQUE (company_id, bank_name, account_no)

gl_account_id UNIQUE — এটাই “এক bank account, এক GL account” নিয়মটার database রূপ। কেউ দুটো ব্যাংককে এক GL account-এ বাঁধতে চাইলে database-ই না বলে দেবে।

kind দিয়ে software জানে কোন account-এ কোন নিয়ম:

kind ঋণাত্মক হতে পারে? যাচাই কীভাবে ──── ───────────────── ──────────── cash না physical count petty_cash না, আর == imprest_amount custodian-এর voucher cheques_in_hand না, আর পুরনো line নয় cheque register bank -overdraft_limit পর্যন্ত bank statement (অধ্যায় ১২)

Source document — payments table

অধ্যায় ৭-এ বলেছিলাম journal entry হাতে লেখা হয় না — কোনো একটা business document থেকে জন্মায় (source_type, source_id)। Cash ও Bank-এর ক্ষেত্রে সেই document হলো একটা receipt/payment/contra:

payments id BIGINT PK company_id BIGINT FK kind VARCHAR(10) -- receipt | payment | contra doc_no VARCHAR(40) -- RV-08-0001 doc_date DATE cash_bank_account_id BIGINT FK -- কোন Cash/Bank (receipt/payment) to_account_id BIGINT FK NULL -- contra হলে গন্তব্য party_type VARCHAR(20) NULL -- customer | supplier | employee party_id BIGINT NULL amount DECIMAL(18,4) method VARCHAR(10) -- cash | cheque | transfer | card | mobile instrument_no VARCHAR(40) NULL -- cheque নম্বর, transfer ref instrument_date DATE NULL -- cheque-এর তারিখ (PDC হলে ভবিষ্যৎ) instrument_bank VARCHAR(100) NULL status VARCHAR(20) -- draft | posted | dishonoured | cancelled journal_entry_id BIGINT FK NULL -- post হলে কোন entry narration TEXT UNIQUE (company_id, doc_no) INDEX (company_id, doc_date) INDEX (company_id, party_type, party_id)
payment_lines id BIGINT PK payment_id BIGINT FK account_id BIGINT FK -- "কারণ" account: 5220, 2110, 4110 ... amount DECIMAL(18,4) line_narration TEXT NULL -- অধ্যায় ১৪/১৬: কোন invoice-এর বিপরীতে invoice_type VARCHAR(20) NULL invoice_id BIGINT NULL

একটা receipt-এ একাধিক line থাকতে পারে (নগদ বিক্রি: Sales + VAT), একটা payment-এও (petty replenish: দুটো খরচ)। SUM(payment_lines.amount) == payments.amount — এটা যাচাই করুন post করার আগে।

Posting rule — এক পাশ যন্ত্র জানে

Section ২-এ বলেছি: Cash/Bank পাশটা সবসময় একই। তাই posting rule খুব ছোট:

postPayment(p): entry = new JournalEntry( voucher_type = p.kind == 'receipt' ? 'RV' : p.kind == 'payment' ? 'PV' : 'CV', posting_date = p.doc_date, source_type = 'payment', source_id = p.id, narration = p.narration) cb = p.cash_bank_account.gl_account_id যদি p.kind == 'receipt': entry.line(cb, debit = p.amount) প্রতিটি line l: entry.line(l.account_id, credit = l.amount, party = p.party) যদি p.kind == 'payment': প্রতিটি line l: entry.line(l.account_id, debit = l.amount, party = p.party) entry.line(cb, credit = p.amount) যদি p.kind == 'contra': entry.line(p.to_account.gl_account_id, debit = p.amount) entry.line(cb, credit = p.amount) post(entry) -- অধ্যায় ৮-এর সব validation p.journal_entry_id = entry.id p.status = 'posted' -- সবটা একটাই database transaction-এ

দুটো বাড়তি যাচাই এই rule-এর ভিতরে বসবে, অধ্যায় ৮-এর সাধারণ validation-এর উপরে:

১. contra হলে দুই পাশই cash_bank_accounts-এ থাকতে হবে (নইলে এটা contra নয়, ভুল ধরন) ২. control account (1130, 2110) line-এ party বাধ্যতামূলক (অধ্যায় ৯)

ঋণাত্মক ব্যালেন্স আটকানো — সব তারিখে

Section ২-এর সেই back-dated সমস্যা। যাচাইটা এক তারিখের নয়, একটা পরিসরের:

assertNoNegativeBalance(cbAccount, newDate, newSigned): floor = cbAccount.kind == 'bank' ? -cbAccount.overdraft_limit : 0 -- newDate-এর আগ পর্যন্ত ব্যালেন্স before = SUM(debit - credit) FROM posted_lines WHERE account_id = cbAccount.gl_account_id AND posting_date < newDate -- newDate থেকে আজ পর্যন্ত, দিন ধরে running running = before + newSigned প্রতিটি দিন d, newDate থেকে আজ, ক্রমানুসারে: running += SUM(debit - credit) ওই দিনের যদি running < floor: reject("{d} তারিখে ব্যালেন্স {running} হয়ে যাবে")

SQL-এ একই যুক্তি একটা window function দিয়ে:

WITH daily AS ( SELECT posting_date, SUM(debit - credit) AS day_net FROM posted_lines WHERE account_id = :acct AND posting_date >= :new_date GROUP BY posting_date ), running AS ( SELECT posting_date, :before + :new_signed + SUM(day_net) OVER (ORDER BY posting_date) AS bal FROM daily ) SELECT MIN(bal) FROM running; -- এটা floor-এর নিচে হলে reject

Concurrency: দুটো payment একই মুহূর্তে এই যাচাই পেরিয়ে যেতে পারে। সমাধান হলো cash_bank_accounts-এর সারিটা SELECT ... FOR UPDATE দিয়ে lock করে তারপর যাচাই ও post করা — একই transaction-এ। বিস্তারিত অধ্যায় ৪৭; এখন শুধু জানুন, lock ছাড়া এই যাচাই একটা প্রতিশ্রুতি মাত্র, নিশ্চয়তা নয়।

Cheque register ও PDC

payments table-এ instrument_date আছে। instrument_date > doc_date মানে post-dated cheque। নিয়ম:

PDC পেলে: payment তৈরি হয়, status = 'draft', instrument_date = ভবিষ্যৎ journal entry নেই প্রতিদিন একটা scheduled কাজ: SELECT * FROM payments WHERE status = 'draft' AND method = 'cheque' AND instrument_date <= today প্রতিটির জন্য: doc_date = instrument_date, postPayment()

এতে PDC register আলাদা কোনো table নয় — payments-এর একটা view:

CREATE VIEW pdc_register AS SELECT * FROM payments WHERE method = 'cheque' AND status = 'draft' AND instrument_date > CURRENT_DATE;

Dishonour একটা আলাদা কাজ, কারণ এটা reversal নয় — মূল receipt ঠিকই ছিল, পরে একটা নতুন ঘটনা ঘটেছে:

dishonour(payment, chargeAmount, date): যাচাই: payment.kind == 'receipt', method == 'cheque', status == 'posted' entry = JV, posting_date = date, source_type = 'payment_dishonour' Dr A/R (payment.party) payment.amount Dr 5280 Bank Charges chargeAmount Cr cash_bank gl account payment.amount + chargeAmount post(entry) payment.status = 'dishonoured' payment.dishonour_entry_id = entry.id

Status-টা গুরুত্বপূর্ণ: গ্রাহকের statement-এ (অধ্যায় ১৪) “cheque ফেরত” আলাদা করে দেখাতে হবে, আর একই গ্রাহকের পরের cheque নেওয়ার সময় সতর্কতা দেখাতে হবে।

Petty cash voucher

petty_cash_vouchers id BIGINT PK cash_bank_account_id BIGINT FK -- kind = petty_cash voucher_date DATE account_id BIGINT FK -- খরচের account amount DECIMAL(18,4) description TEXT replenishment_id BIGINT FK NULL -- কোন replenishment-এ গেল

Replenish করার সময় সব replenishment_id IS NULL voucher একসাথে নিয়ে একটা payment তৈরি — প্রতিটি account-এর জন্য একটা line, যোগফলটা Cash থেকে। তারপর voucher গুলোতে replenishment_id বসিয়ে দিন, যাতে দুবার replenish না হয়।

যেকোনো মুহূর্তে যাচাই:

imprest_amount == হাতের নগদ + SUM(অ-replenished voucher)

Cash count

cash_counts id BIGINT PK cash_bank_account_id BIGINT FK -- kind = cash | petty_cash count_date DATE counted_by BIGINT book_balance DECIMAL(18,4) -- গোনার মুহূর্তে খাতা যা বলেছে counted_amount DECIMAL(18,4) variance DECIMAL(18,4) -- counted - book denominations JSON NULL -- {1000: 80, 500: 40, ...} variance_entry_id BIGINT FK NULL -- 5295-এ post হলে

book_balance গোনার মুহূর্তেই সংরক্ষণ করুন, পরে হিসাব করবেন না — পরে কেউ back-dated entry দিলে সংখ্যাটা বদলে যাবে আর গণনার প্রমাণ হারাবে।

রাতের স্বাস্থ্য-যাচাইয়ে নতুন সারি

অধ্যায় ১০-এর তালিকায় যোগ করুন:

৬. কোনো cash/petty_cash account-এ কি কোনো তারিখে ঋণাত্মক ব্যালেন্স? (lock ছাড়া ঢুকে যাওয়া entry ধরার জন্য) ৭. কোনো bank account কি overdraft_limit ছাড়িয়েছে? ৮. petty_cash ব্যালেন্স == imprest_amount ? ৯. cheques_in_hand-এ কি ৭ দিনের বেশি পুরনো line আছে? (cheque হারিয়ে গেছে, বা জমা দিতে ভুলে গেছে) ১০. CV entry-র দুই line-ই কি cash_bank_accounts-এ? (JV দিয়ে contra লেখা হলে Cash Flow ভুল হবে)

শেষটা লক্ষ করুন — উল্টো দিক থেকেও যাচাই করুন: JV entry-তে দুই পাশেই cash/bank account থাকলে সেটা আসলে contra, যা CV হওয়া উচিত ছিল।

Test হিসেবে

test "back-dated payment ঋণাত্মক ব্যালেন্স তৈরি করলে reject হয়": receipt(cash, date = 01-08, 50,000) payment(cash, date = 10-08, 40,000) -- ব্যালেন্স 10,000 receipt(cash, date = 20-08, 1,00,000) -- ব্যালেন্স 1,10,000 assert rejects payment(cash, date = 05-08, 30,000) -- 05-08: 20,000 ✓ কিন্তু 10-08: -20,000 ✗ test "contra-তে Cash ও Bank-এর যোগফল বদলায় না": before = balance(1110) + balance(1120) contra(from = 1110, to = 1120, 2,00,000) after = balance(1110) + balance(1120) assert before == after test "dishonour-এ গ্রাহকের পাওনা ফিরে আসে": receipt(bank, party = রহিম, cheque, 80,000) assert subledger(1130, রহিম) == আগের - 80,000 dishonour(ওই receipt, charge = 200) assert subledger(1130, রহিম) == আগের assert balance(5280) বেড়েছে 200 test "petty cash replenish-এ Petty Cash account অপরিবর্তিত": float(10,000) voucher(5260, 4,000); voucher(5250, 3,500) replenish() assert balance(1115) == 10,000 assert balance(1110) কমেছে 7,500

৬. Financial Statement Impact

Balance Sheet — এখানেই Cash ও Bank-এর ঘর:

CURRENT ASSETS Cash and Cash Equivalents 13,99,300 Cash in Hand 1,04,500 Petty Cash 10,000 Cheques in Hand 0 Bank — Prime 8,84,800 Bank — City 4,00,000 CURRENT LIABILITIES Bank Overdraft (credit-এ থাকা bank account গুলো)

নিয়ম: ব্যালেন্স যেদিকে, ঘর সেদিকে। Debit-এ থাকা bank account asset-এ, credit-এ থাকা bank account liability-তে — একই account দুই মাসে দুই জায়গায় থাকতে পারে।

Income Statement — সামান্য:

4510 Interest Income (ব্যাংক যা দেয়) 5280 Bank Charges (ব্যাংক যা নেয়) 5295 Cash Over/Short (গণনার পার্থক্য)

Cash Flow Statement — এটাই আসল। অধ্যায় ২২-এর পুরো report এই কয়েকটা account-এর নড়াচড়া থেকে তৈরি হয়, আর contra সেখানে শূন্য। Section ৪-এর “নিট ৩৬,৩০০” হিসাবটাই তার আদিরূপ।

আয় বনাম নগদ — Part 2-র সবচেয়ে বড় পাঠ

এই অধ্যায়ের চারটি ঘটনা পাশাপাশি রাখুন:

ঘটনাIncome StatementCash/Bank
০৪-০৮ ABC Ltd-এর cheque (জুলাইয়ের invoice)কিছু নয়+৫,৭৫,০০০
০৭-০৮ নগদ বিক্রি ৩০,০০০+৩০,০০০ আয়+৩৪,৫০০
১০-০৮ সরবরাহকারীকে ১,৫০,০০০ (জুলাইয়ের bill)কিছু নয়−১,৫০,০০০
২৮-০৮ বেতন ৩,৫০,০০০ (জুলাইয়ে accrue করা)কিছু নয়−৩,৫০,০০০

ABC Ltd-এর ৫,৭৫,০০০ আগস্টে ব্যাংকে ঢুকল, কিন্তু আয় হিসেবে গোনা হয়েছিল জুলাইয়ে (invoice-এর মাসে)। বেতন আগস্টে ব্যাংক থেকে বেরোল, কিন্তু খরচ ছিল জুলাইয়ের। টাকা আসা-যাওয়া আর আয়-খরচ দুটো আলাদা সময়রেখা — একটা Cash Flow Statement-এ, অন্যটা Income Statement-এ। এই দুটো গুলিয়ে ফেলা developer-দের সবচেয়ে সাধারণ accounting ভুল, আর অধ্যায় ১৩, ১৭ ও ১৮ এটা নিয়েই।


৭. Common Developer Mistakes

ভুলকী ঘটেসঠিক পথ
সব ব্যাংক একটাই “Bank” account-এreconciliation অসম্ভবপ্রতি bank account-এ আলাদা GL account, gl_account_id UNIQUE
Contra-কে JV হিসেবে লেখাCash Flow-এ transfer আয়/ব্যয় হিসেবে দেখায়CV voucher, দুই পাশ cash_bank_accounts-এ
Cheque clear হলে entryপাওনা ভুল দেখায় সপ্তাহ ধরেজমার দিনে (পাওয়া), লেখার দিনে (দেওয়া)
PDC পাওয়ার দিনেই postBank ব্যালেন্স এমন টাকা দেখায় যা নেইinstrument_date-এ scheduled post
Dishonour-কে reversal হিসেবেমূল receipt “ভুল” হয়ে যায়, history হারায়নতুন JV, status dishonoured
শুধু আজকের ব্যালেন্স যাচাইback-dated entry-তে মাঝের দিন ঋণাত্মকতারিখ থেকে আজ পর্যন্ত running যাচাই
Lock ছাড়া ব্যালেন্স যাচাইদুই payment একসাথে ঢুকে ঋণাত্মকSELECT FOR UPDATE (অধ্যায় ৪৭)
Overdraft-এ “অস্বাভাবিক ব্যালেন্স” alertপ্রতি রাতে মিথ্যা সতর্কতাoverdraft_limit দেখে সতর্কতা
Petty cash-এ প্রতিটি খরচ আলাদা entry1115 ওঠানামা করে, imprest ভাঙেvoucher জমুক, replenish-এ এক entry
Cash ঘাটতি বানানো entry দিয়ে মেলানোচুরি/ভুল চিরতরে লুকায়5295 Cash Over/Short
book_balance count-এর পরে হিসাবback-dated entry-তে প্রমাণ বদলে যায়গোনার মুহূর্তেই সংরক্ষণ
ব্যাংকের তথ্য account-এর নামেসীমা, currency, শাখা রাখার জায়গা নেইcash_bank_accounts master

প্রথম দুটো সবচেয়ে ব্যয়বহুল — কারণ দুটোই এমন ভুল যা মাসের পর মাস কেউ টের পায় না। Trial Balance মেলে, ledger ঠিক দেখায়; শুধু reconciliation করা যায় না, আর Cash Flow Statement নীরবে ভুল থাকে।


৮. Exercises

সেট ক — entry লিখুন

প্রতিটির জন্য ধরন (receipt / payment / contra) ও journal entry লিখুন, voucher type সহ:

১। গ্রাহক করিম ট্রেডার্স ৪৫,০০০ টাকা নগদে দিল, জুনের invoice-এর জন্য। ২। Prime Bank থেকে ৫০,০০০ নগদ তোলা হলো। ৩। বিদ্যুৎ বিল ১২,০০০ City Bank থেকে online দেওয়া হলো। ৪। ব্যাংক ২,০০০ টাকা সুদ দিল, ৫০০ টাকা charge কাটল — একই দিনে। ৫। মালিক ৫,০০,০০০ টাকা পুঁজি হিসেবে Prime Bank-এ জমা দিলেন। ৬। গ্রাহক সালমা ১,২০,০০০ টাকার cheque দিল ২০ তারিখে; জমা হলো ২৩ তারিখে। দুটো entry লিখুন। ৭। ৬ নম্বরের cheque ২৬ তারিখে ফেরত এল, charge ২৫০। ৮। Petty cash float ১০,০০০ থেকে ১৫,০০০ করা হলো। ৯। Petty voucher: চা ৮০০, ফটোকপি ৬০০, রিকশা ২,১০০। replenish entry লিখুন।

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

প্রতিটিতে একটা করে ভুল আছে। কী ভুল, কী ক্ষতি, আর কী হওয়া উচিত ছিল:

১০। Dr 1120 Bank 2,00,000 / Cr 1110 Cash 2,00,000 — voucher type JV ১১। সরবরাহকারীকে cheque দেওয়া হলো ১০ তারিখে, entry লেখা হলো ১৮ তারিখে (যেদিন ব্যাংক থেকে কাটল), posting_date = 18 ১২। গ্রাহকের ৩০ সেপ্টেম্বর তারিখের cheque ১৫ আগস্টে পেয়ে সেদিনই Dr Bank / Cr A/R ১৩। রহিমের cheque ফেরত এলে RV-08-0003 reverse করা হলো ১৪। Petty cash-এ প্রতিটি চায়ের বিল আলাদা entry: Dr 5250 / Cr 1115 ১৫। মাস শেষে cash ৩০০ টাকা কম; ক্যাশিয়ার একটা "misc receipt" ৩০০ টাকার লিখে মিলিয়ে দিলেন ১৬। দুই ব্যাংকের টাকা 1120-তে, account-এর নাম "Bank (Prime + City)"

সেট গ — ঋণাত্মক ব্যালেন্স

১৭। Cash-এর ledger: 01-08 opening 20,000 05-08 receipt 50,000 10-08 payment 60,000 20-08 receipt 1,00,000 আজ ২৫-০৮। নিচের কোনগুলো গ্রহণযোগ্য, কোনগুলো reject হবে, কেন? (ক) ০৩-০৮ তারিখে ১৫,০০০ payment (খ) ০৭-০৮ তারিখে ১৫,০০০ payment (গ) ০৮-০৮ তারিখে ৫,০০০ payment (ঘ) ২২-০৮ তারিখে ১,০০,০০০ payment ১৮। একই ledger, কিন্তু account-টা bank, overdraft_limit ২০,০০০। ১৭-এর উত্তর কীভাবে বদলায়? ১৯। দুজন ব্যবহারকারী একই সেকেন্ডে ৮,০০০ টাকার দুটো payment লিখলেন, Cash ব্যালেন্স ১০,০০০। যাচাই দুটোই পাস করল। কী হলো, কেন, কীভাবে ঠেকাবেন?

সেট ঘ — নকশা

২০। একটা company-র তিনটা ব্যাংক, দুটো petty cash (দুই শাখায়), একটা OD account। COA-তে কী কী account, আর cash_bank_accounts-এ কী কী সারি হবে? kind সহ লিখুন। ২১। "Cheques in Hand-এ ৭ দিনের বেশি পুরনো line" — এই যাচাইটা query হিসেবে লিখুন। ইঙ্গিত: 1117-এ Dr line গুলোর মধ্যে কোনগুলোর বিপরীতে Cr এসেছে, কীভাবে বুঝবেন? ২২। Section ৪-এর আগস্টের data থেকে contra বাদ দিয়ে "কোথা থেকে টাকা এল, কোথায় গেল" — এই তালিকা তৈরির query-র যুক্তি লিখুন। voucher_type ছাড়া আর কী দিয়ে contra চেনা যায়? ২৩। Cash Book-এর বহু-column রূপটা একটা query থেকে বানাতে চান। column গুলো আগে থেকে জানা নেই (ব্যাংকের সংখ্যা বদলায়)। application-এ কী করবেন, SQL-এ কী করবেন?

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


৯. Developer Challenge

একটি TreasuryService নকশা করুন — Cash, Bank, Petty Cash ও Cheque — সব একসাথে।

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

১. cash_bank_accounts, payments, payment_lines, petty_cash_vouchers, cash_counts — সম্পূর্ণ schema, constraint সহ। কোন নিয়মগুলো database-এ (CHECK, UNIQUE), কোনগুলো application-এ — আর কেন?

২. createReceipt(), createPayment(), createContra() — তিনটি operation, কিন্তু একটাই posting rule। rule-টা এমনভাবে লিখুন যেন kind ছাড়া আর কোনো if না লাগে।

৩. assertNoNegativeBalance() — back-dated entry সহ, overdraft সহ, lock সহ। কোন সারি lock করবেন, কতক্ষণ ধরে রাখবেন, আর deadlock এড়াতে lock-এর ক্রম কী হবে (দুটো contra একে অন্যের উল্টো দিকে গেলে)?

৪. Cheque-এর সম্পূর্ণ জীবনচক্র — received, deposited, cleared (কীভাবে জানবেন? পরের অধ্যায়ের ইঙ্গিত), dishonoured, PDC। প্রতিটি অবস্থায় কোন entry, কোন status, আর গ্রাহকের statement-এ কী দেখাবে?

৫. Imprest পদ্ধতির যাচাই — imprest_amount == হাতের নগদ + অ-replenished voucher — এটা কখন চালাবেন, ব্যর্থ হলে কী করবেন? মাস শেষে অ-replenished voucher থাকলে খরচটা কোন মাসে?

৬. Cash Flow Statement-এর জন্য “contra বাদ দিয়ে cash movement” — একটা query বা view নকশা করুন যা অধ্যায় ২২-এ সরাসরি ব্যবহার করা যাবে। CV voucher type-এর উপর নির্ভর করবেন, নাকি দুই line-ই cash/bank কিনা দেখবেন, নাকি দুটোই?

৭. রাতের স্বাস্থ্য-যাচাইয়ে section ৫-এর পাঁচটি নতুন যাচাই যোগ করুন। প্রতিটির severity কী, আর কোনটা ব্যর্থ হলে posting বন্ধ করবেন?

৩ আর ৪ নম্বরটাই আসল পরীক্ষা। ঋণাত্মক ব্যালেন্স আটকানো “এখনকার ব্যালেন্স দেখো” নয় — এটা একটা সময়রেখার সমস্যা আর একটা concurrency সমস্যা, দুটো একসাথে। আর cheque হলো সেই জায়গা যেখানে “ঘটনা কখন ঘটল” আর “খাতায় কখন লিখব” প্রথমবার আলাদা হয়ে যায় — Part 2-র বাকি সব অধ্যায় এই একই প্রশ্নের নানা রূপ।


১০. Summary Card

তিন ধরনের লেনদেন

RECEIPT Dr Cash/Bank Cr কারণ RV PAYMENT Dr কারণ Cr Cash/Bank PV CONTRA Dr Cash/Bank Cr Cash/Bank CV ← আয়ও নয়, খরচও নয়

কঠিন নিয়ম

এক bank account = এক GL account = এক statement Cash in Hand ≥ 0 প্রতিটি তারিখে Bank ≥ -overdraft প্রতিটি তারিখে Petty Cash == imprest সবসময় Contra → CV, Cash Flow থেকে বাদ

Cheque

পাওয়া, একই দিনে জমা Dr Bank Cr A/R পাওয়া, পরে জমা Dr Cheques in Hand Cr A/R → জমায় Dr Bank clear কোনো entry নয় dishonour Dr A/R + Dr Charges Cr Bank (নতুন JV, reversal নয়) দেওয়া লেখার দিনেই Dr A/P Cr Bank PDC তারিখের আগে entry নয়

Petty Cash (imprest)

float Dr Petty Cash Cr Cash replenish Dr Expenses Cr Cash ← Petty Cash অপরিবর্তিত

Balance Sheet

Dr ব্যালেন্স → Cash and Cash Equivalents (asset) Cr ব্যালেন্স → Bank Overdraft (liability)

আয় ≠ নগদ

invoice-এর মাসে আয় cheque-এর মাসে নগদ accrue-র মাসে খরচ transfer-এর মাসে নগদ

Developer checklist

□ cash_bank_accounts master, gl_account_id UNIQUE □ kind: cash | bank | petty_cash | cheques_in_hand □ payments + payment_lines, SUM(lines) == amount □ একটাই posting rule, Cash/Bank পাশ যন্ত্র বসায় □ contra-র দুই পাশই cash_bank_accounts-এ □ ঋণাত্মক যাচাই তারিখ থেকে আজ পর্যন্ত running □ যাচাইয়ের আগে account সারি lock □ overdraft_limit দেখে "অস্বাভাবিক" সতর্কতা □ PDC: instrument_date-এ scheduled post □ dishonour = নতুন JV + status, reversal নয় □ petty voucher জমুক, replenish-এ এক entry □ cash_counts-এ book_balance গোনার মুহূর্তে □ ঘাটতি/বাড়তি 5295-এ, বানানো entry নয় □ রাতে: ঋণাত্মক cash, overdraft ছাড়ানো, imprest, পুরনো cheque, JV-তে contra

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

অধ্যায় ১২ — Bank Reconciliation: আপনার খাতা বলছে Prime Bank-এ ৮,৮৪,৮০০ টাকা। ব্যাংকের statement এসে বলবে অন্য একটা সংখ্যা। দুটোই সঠিক — আর দুটোর মাঝের প্রতিটি টাকার হিসাব দিতে পারাই reconciliation। পরের অধ্যায়ে দেখব পার্থক্যের চার শ্রেণি, কোনটায় entry লাগে আর কোনটায় শুধু অপেক্ষা, আর সবচেয়ে গুরুত্বপূর্ণ — statement-এর line আর ledger-এর line মেলানোর যন্ত্র কীভাবে বানাবেন।