অধ্যায় ১১ — 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 Hand | Bank | |
|---|---|---|
| কোথায় থাকে | সিন্দুক, ক্যাশ বাক্স | ব্যাংকের হিসাবে |
| কে সামলায় | ক্যাশিয়ার | authorized signatory |
| যাচাই কীভাবে | হাতে গুনে | bank statement দিয়ে |
| ঋণাত্মক হতে পারে? | কখনোই না | overdraft থাকলে হ্যাঁ |
| প্রমাণ | রসিদ, voucher | cheque, 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
তিন ধরনের লেনদেন
| ধরন | Debit | Credit | Voucher |
|---|---|---|---|
| Receipt | Cash/Bank | কারণ (A/R, Sales, Capital, Loan…) | RV |
| Payment | কারণ (A/P, Expense, Loan…) | Cash/Bank | PV |
| Contra | Cash/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,500Petty 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 500Ledger — 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-এর নিচে হলে rejectConcurrency: দুটো 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.idStatus-টা গুরুত্বপূর্ণ: গ্রাহকের 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 Statement | Cash/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 পাওয়ার দিনেই post | Bank ব্যালেন্স এমন টাকা দেখায় যা নেই | 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-এ প্রতিটি খরচ আলাদা entry | 1115 ওঠানামা করে, 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 মেলানোর যন্ত্র কীভাবে বানাবেন।