অধ্যায় ৩১ — Hospital Accounting
Volume 2 · Part 4 — Application-specific Accounting · Chapter 31
পূর্বশর্ত: অধ্যায় ১৩ (Sales ও Revenue), অধ্যায় ১৪ (Accounts Receivable), অধ্যায় ১৭ (Revenue Recognition — unbilled), অধ্যায় ১৯ (Advance), অধ্যায় ২৭ (Inventory), অধ্যায় ২৯ (Payroll — aggregated entry, subledger)
১. Learning Objective
এই অধ্যায় শেষে আপনি পারবেন:
একটা রোগীর যাত্রা — ভর্তি → service → bill → payment → claim — কোন ধাপে কোন entry, বলতে
Charge capture — প্রতিটি service একটা accounting event, bill নয় — কেন, আর তার ফল মাস শেষে
In-patient-এর খোলা account (unbilled charges) — asset, কিন্তু A/R নয় — অধ্যায় ১৭-এর 1170 এখানে
Patient deposit — liability, revenue নয় — নেওয়া, সমন্বয়, ফেরত — তিনটি entry
Visiting doctor-এর fee — hospital principal না agent — কোন অংশ আয়, কোন অংশ দেনা
Pharmacy — বিক্রি + COGS (অধ্যায় ২৭), ফেরত, consumables — একই engine
Package (OT, delivery) বনাম itemized — একটা দাম, অনেক service — allocation
Payer split — রোগী, insurer, corporate — একটা bill, তিনটি A/R
Insurance claim — submitted, approved, disallowed — contractual adjustment কোথায় যায়
Discount, charity, bad debt — তিনটি আলাদা জিনিস, তিনটি আলাদা account
Counter cash, shift, refund — অধ্যায় ১১-এর cash book একাধিক দরজায়
Encounter / charge / bill / claim — schema, posting rule, আর 1132, 2161, 2185-এর reconciliationসময়: পড়া ৬০ মিনিট + অনুশীলন ৬০ মিনিট।
২. Concept Explanation
নতুন ব্যবসা, পুরনো নিয়ম
এ পর্যন্ত চারটি অধ্যায় একই software company-র। এবার সিটি কেয়ার হাসপাতাল — আলাদা company, আলাদা বই, আলাদা COA। কিন্তু engine একই: journal, ledger, subledger, period, report — Volume 1-এর কিছুই বদলায় না। বদলায় প্রশ্নগুলো:
software company hospital
──────────────── ────────
invoice = আয়ের দিন service-এর দিন = আয়ের দিন; bill অনেক পরে
গ্রাহক একজন, দেয় একজন রোগী একজন, দেয় তিনজন (রোগী, insurer, corporate)
advance কম deposit প্রায় সবসময়, refund-ও
supplier-কে bill, কর্মীকে বেতন visiting doctor — supplier-ও নয়, কর্মীও নয়
inventory নেই (ছিল না) pharmacy + consumables, রোগী-ধরে issue
একটা দাম payer-ধরে দাম (insurer-এর contract rate)Part 4-এর ছাঁচ একই — Business Flow → Financial Event → Entry → Subledger → GL → Statement → Schema → API। শুধু business flow-টা একটা রোগীর চারপাশে।
রোগীর যাত্রা — কোন ধাপে entry
Business Flow Financial Event? Entry
───────────── ──────────────── ─────
registration না —
admission + deposit deposit এল — দেনা (ফেরত দিতে হতে পারে) Dr 1110 / Cr 2161 Patient Deposit
প্রতিটি service (bed, test, আয় হলো — এখনই, bill-এর আগে Dr 1132 In-patient Charges / Cr 42xx Revenue
doctor, OT, ওষুধ) (doctor-এর অংশ: দেনা) … / Cr 2185 Doctor Fee Payable
(ওষুধ: stock গেল) Dr 5140 COGS / Cr 1145 Pharmacy Inventory
discharge → final bill দেনার মালিক ঠিক হলো — কে কত দেবে Dr 1130 A/R [রোগী], Dr 1133 A/R [insurer] / Cr 1132
discount (অনুমোদিত) আয় কমল Dr 4280 Discount / Cr 1130
deposit adjust + refund দেনা কাটাকাটি; বাড়তি ফেরত Dr 2161 / Cr 1130; Dr 2161 / Cr 1110
claim → insurer payment A/R শোধ; disallowed → contractual adj. Dr 1120, Dr 4285 / Cr 1133
doctor payout (মাসিক) দেনা শোধ, TDS Dr 2185 / Cr 2150, Cr 1120অধ্যায় ১৩-এর দুটো প্রশ্ন — আয় হলো? টাকা এল? — এখানে তিনটে: আয় হলো? টাকা এল? কে দেবে? তৃতীয়টা bill-এর দিন ঠিক হয়, আর সেটাই hospital-এর নিজস্ব জটিলতা।
Charge capture — service-ই event, bill নয়
রোগী ০৩-১১ ভর্তি, ০৬-১১ discharge, bill ০৬-১১। Bed-এর আয় কোন দিনের? প্রতিটি দিনের — ০৩, ০৪, ০৫। মাস শেষে (৩০-১১) একজন রোগী ভর্তি থাকলে তার সাত দিনের bed, দুটো OT, বিশটা test — সব নভেম্বরের আয়, bill ডিসেম্বরে হলেও (অধ্যায় ১৭)।
দুটো নকশা:
ক. bill-এ revenue charges শুধু তালিকা; discharge-এ Dr A/R / Cr Revenue
মাস শেষে: খোলা encounter-এর সব charge হাতে accrual (Dr 1170 / Cr 42xx), পরের মাসে reversal
→ বড় hospital-এ ৩০০ খোলা রোগী, প্রতি মাসে ৩০০টা accrual, প্রতিটি bill-এ match
খ. charge-এ revenue প্রতিটি charge post হওয়া মাত্র Dr 1132 / Cr 42xx
discharge-এ bill শুধু 1132 → A/R (payer-ধরে) সরায়; মাস শেষে কিছুই করার নেইখ — কারণ accrual-এর কাজটা system-ই করে, প্রতিটি charge-এ, আন্দাজ ছাড়া। অধ্যায় ২৮-এ GRN যেমন মালের accrual স্বয়ংক্রিয় করেছিল, charge এখানে আয়ের accrual। 1132 In-patient Charges (Unbilled) — অধ্যায় ১৭-এর 1170-এর hospital-সংস্করণ: asset, রোগীর কাছে পাওনা, কিন্তু invoice নেই, due date নেই, কে দেবে ঠিক নেই।
Developer-এর দৃষ্টিতে:
chargestable-এর প্রতিটি সারি একটা journal entry-র উৎস (source_type = charge)। Bill =SELECT SUM(amount) FROM charges WHERE encounter = ?— bill কিছু তৈরি করে না, শুধু সরায়। Charge ভুল হলে edit নয় — reverse + নতুন charge (অধ্যায় ৪৩)। এটাই এ অধ্যায়ের কেন্দ্র।
Deposit — দেনা, আয় নয়
ভর্তির সময় ৫০,০০০ deposit। এটা আয়? না — রোগী তিন দিন পরে চলে গেলে ৩০,০০০ ফেরত দিতে হবে। অধ্যায় ১৯-এর customer advance: 2161 Patient Deposit, রোগী-ধরে subledger। তিনটি entry:
নেওয়া Dr 1110 Cash / Cr 2161 [রোগী] 50,000
সমন্বয় Dr 2161 [রোগী] / Cr 1130 [রোগী] 30,700 ← bill-এর রোগীর অংশ
ফেরত Dr 2161 [রোগী] / Cr 1110 19,300 ← বাকি; অনুমোদন, রোগীর সইDeposit-এর টাকা bank-এ আছে, কিন্তু আপনার নয় — Balance Sheet-এ liability। বড় hospital-এ 2161-এ কোটি টাকা; সেটা “নগদ আছে” নয়, “রোগীদের টাকা রাখা আছে”।
Visiting doctor — principal না agent
Dr. রহমান visiting consultant; রোগী visit fee ২,০০০ দেন; hospital রাখে ২০%, doctor পান ৮০%। Hospital-এর আয় কত — ২,০০০ না ৪০০?
PRINCIPAL (hospital service দিচ্ছে, doctor তার supplier) Cr 4220 Revenue 2,000; Dr 5310 Doctor Fee 1,600 / Cr 2185
→ revenue ফোলে, gross margin-এ doctor cost
AGENT (doctor service দিচ্ছেন, hospital টাকা তুলে দিচ্ছে) Cr 4220 Revenue 400; Cr 2185 Doctor Fee Payable 1,600
→ revenue শুধু নিজের অংশ; 1,600 কখনো আয় ছিল নাIFRS 15-এর প্রশ্ন: service-এর নিয়ন্ত্রণ কার? Visiting doctor নিজের রোগী, নিজের fee, নিজের সময় — hospital ঘর আর counter দিচ্ছে → agent। Employed doctor (বেতনে) → hospital principal, পুরো fee আয়, doctor-এর বেতন অধ্যায় ২৯-এ। Software-এ doctors.engagement = visiting | employed, আর charge-এর posting rule সেটা দেখে ভাগ করে। দুটো model-এ Income Statement-এর revenue ৫ গুণ আলাদা হতে পারে — একই hospital।
2185 doctor-ধরে subledger; মাস শেষে payout run — অধ্যায় ২৯-এর payroll-এর মতো aggregated entry, TDS কেটে (অধ্যায় ৫৬), doctor-এর statement (কোন রোগী, কোন দিন, কত)।
Pharmacy — অধ্যায় ২৭, রোগী-ধরে
ওষুধ inventory। রোগীকে issue = বিক্রি + COGS, একসাথে, একই transaction (অধ্যায় ২৭-এর postSalesInvoice-এর মতো):
Dr 1132 In-patient Charges 3,200 / Cr 4250 Pharmacy Sales 3,200 ← বিক্রয়মূল্য
Dr 5140 COGS — Pharmacy 2,400 / Cr 1145 Pharmacy Inventory 2,400 ← cost (FIFO / avg)Discharge-এ অব্যবহৃত ওষুধ ফেরত → charge reverse + stock return_in (মূল cost-এ)। Consumables (gloves, syringe) — কিছু charge হয় (রোগীর bill-এ), কিছু হয় না (department-এর খরচ: Dr 5xxx / Cr 1148) — item master-এ chargeable flag।
Package — একটা দাম, অনেক service
Appendectomy package ৪৫,০০০: OT, anesthesia, ২ দিন bed, standard ওষুধ। Itemized হলে ৫২,০০০ হতো। রোগী দেন ৪৫,০০০। আয়ের account কোনটা — 4240 OT? bed-এর অংশ 4210-এ যাবে না?
সরল পুরোটা 4240 Package Revenue; ভিতরের item-গুলো charge হয় "package-এর অংশ", দাম 0 (report-এ দেখা যায়, bill-এ নয়)
সঠিক package-এর দাম component-ধরে ভাগ (standalone price-এর অনুপাতে — IFRS 15 allocation):
OT 30,000 → 4240; bed 2 দিন 10,000 → 4210; ওষুধ 5,000 → 4250 (52,000-এর অনুপাতে 45,000)দ্বিতীয়টা department-ধরে আয় ঠিক রাখে (OT-র আয় কত, bed-এর কত — অধ্যায় ৩৪-এর cost center report)। Package-এর বাইরের item (extra দিন, extra test) আলাদা charge, পুরো দামে। Package-এর ভিতরের item আবার charge হয়ে যাওয়া (double billing) — সবচেয়ে সাধারণ hospital billing bug।
Payer split — একটা bill, তিন A/R
Final bill ৯২,২০০। Insurer pre-authorization: surgery ৬০,০০০ পর্যন্ত। বাকি রোগীর। Corporate রোগী হলে employer দেয়। একটা bill, একাধিক payer, প্রত্যেকে আলাদা A/R:
1130 A/R — Patients রোগী-ধরে; deposit-এ কাটে, বাকি নগদে; aging ছোট
1133 A/R — Insurers insurer-ধরে, claim-ধরে; aging ৩০–৯০ দিন; disallowance হয়
1134 A/R — Corporate company-ধরে; মাসিক statementBill-এর line-গুলো payer-এ ভাগ হয় নিয়মে (pre-auth-এর scope: কোন service, কত পর্যন্ত), বাকি রোগী। Insurer-এর দাম আলাদা হতে পারে (contract rate) → price_lists payer-ধরে।
Claim — disallowed কোথায় যায়
Insurer-কে ৬০,০০০-এর claim। তারা দিল ৫৪,০০০ — surgeon fee তাদের rate-এর বেশি। ৬,০০০ কোথায়?
contract বলে রোগীকে চাওয়া যাবে না → 4285 Contractual Adjustment (contra revenue): আয় আসলে ৫৪,০০০-ই ছিল
contract বলে রোগীর দায় → Dr 1130 [রোগী] / Cr 1133 [insurer] 6,000 — রোগীকে re-bill
claim-এ কাগজের ভুল, resubmit → 1133-এ থাকে, claim status = resubmittedতিনটি আলাদা ঘটনা, তিনটি আলাদা entry। “insurer কম দিল, বাদ দাও” বলে 5530 Bad Debt-এ ফেলা — ভুল: bad debt মানে পাওনা ছিল, পাওয়া গেল না; contractual adjustment মানে পাওনাই ছিল না, আমরা বেশি লিখেছিলাম।
Discount, charity, bad debt
discount (অনুমোদিত, bill-এ) 4280 Patient Discount (contra revenue) আয় কম — সিদ্ধান্ত বিক্রির সময়
charity / welfare fund 4280-এই, dimension charity; বা fund থাকলে Dr 2195 Welfare Fund দাতব্য — নীতি
bad debt (রোগী চলে গেছেন) 5530 Bad Debt Expense (অধ্যায় ৫৯) আয় ছিল, টাকা এল না — খরচতিনটি এক account-এ মিশলে “কত ছাড় দিই” আর “কত হারাই” আলাদা করা যায় না — management-এর দুটো আলাদা প্রশ্ন।
Counter cash — অনেক দরজা
OPD counter, IPD counter, pharmacy counter, emergency — ২৪ ঘণ্টা, তিন shift। অধ্যায় ১১-এর cash book প্রতিটি counter-এ (1110 counter dimension), shift শেষে গোনা, reconcile, bank-এ জমা। Refund counter থেকে — অনুমোদনে, রোগীর সই। Hospital-এ নগদ চুরির সবচেয়ে সহজ পথ: charge post না করে টাকা নেওয়া (রসিদ হাতে লেখা) — তাই receipt ছাড়া charge settle হয় না, আর counter-এর receipt নম্বর gapless (অধ্যায় ১৩)।
যা এই অধ্যায়ে নেই
Clinical data (EMR), doctor-এর order, nursing HIS — accounting-এর বাইরে; এখানে শুধু charge
Department-ধরে cost ও profitability (Lab লাভজনক?) অধ্যায় ৩৪
Equipment (MRI ৫ কোটি) depreciation অধ্যায় ৩০ — একই
Bad debt provision-এর হিসাব অধ্যায় ৫৯
Government / NGO grant accounting এ বইয়ে নেই
VAT — চিকিৎসা সেবা সাধারণত exempt; pharmacy দেশভেদে অধ্যায় ৫৫; উদাহরণে VAT নেই৩. Accounting Rule
Entry
| ঘটনা | Debit | Credit |
|---|---|---|
| Deposit | Cash / Bank | Patient Deposit (2161) [রোগী] |
| Charge — hospital service (bed, test, OT) | In-patient Charges (1132) [encounter] | Revenue (42xx, department) |
| Charge — visiting doctor (agent) | In-patient Charges | Revenue (hospital share), Doctor Fee Payable (2185) [doctor] |
| Charge — employed doctor (principal) | In-patient Charges | Revenue (পুরো) |
| Charge — pharmacy | In-patient Charges; COGS | Pharmacy Sales; Pharmacy Inventory |
| Charge reversal | (উল্টো) | (উল্টো) |
| OPD (নগদে, সাথে সাথে) | Cash | Revenue (, Doctor Fee Payable) |
| Final bill | A/R — Patient (1130), A/R — Insurer (1133), A/R — Corporate (1134), Discount (4280) | In-patient Charges (1132) |
| Deposit adjust | Patient Deposit | A/R — Patient |
| Refund | Patient Deposit | Cash |
| Claim paid, disallowed (contract) | Bank, Contractual Adjustment (4285) | A/R — Insurer |
| Disallowed → রোগীর দায় | A/R — Patient | A/R — Insurer |
| Doctor payout | Doctor Fee Payable | TDS Payable, Bank |
| Bad debt | Bad Debt Expense (5530) | A/R — Patient |
Recognition
আয় = service-এর দিন, charge post-এ; bill শুধু 1132 → A/R
মাস শেষে খোলা encounter: কিছু করার নেই — 1132 balance == unbilled revenue
package: component-ধরে allocation (standalone price-এর অনুপাতে); ভিতরের item আবার charge নয়Principal / Agent
visiting → agent: revenue = hospital share; doctor-এর অংশ 2185 (কখনো আয় নয়)
employed → principal: revenue পুরো; doctor payroll-এ
doctors.engagement ঠিক করে; charge-এ copyPayer
bill line → payer: pre-auth scope / corporate contract / নইলে রোগী
payer-ধরে A/R (1130 / 1133 / 1134), payer-ধরে price list
claim disallowed: contract → 4285; রোগীর দায় → 1130; resubmit → থাকেControl accounts
1132 == Σ charges (active) of open/unbilled encounters
2161 == Σ deposits − adjusted − refunded, রোগী-ধরে
2185 == Σ doctor share (charges) − payouts, doctor-ধরে
1133 == Σ claims (submitted − paid − adjusted), claim-ধরেঅলঙ্ঘনীয়
Charge edit নয় — reverse + নতুন। Deposit আয় নয়। Doctor-এর অংশ আয় নয়। Receipt ছাড়া settle নয়।৪. Real Business Example
নভেম্বর ২০২৬ — সিটি কেয়ার হাসপাতাল, একজন রোগী
নতুন company, নতুন বই। COA-র যে অংশ এখানে লাগবে:
1110 Cash — Counters ASSET post dimension: counter (OPD / IPD / Pharmacy)
1120 Bank ASSET post
1130 A/R — Patients ASSET post ← control, রোগী-ধরে
1132 In-patient Charges (Unbilled) ASSET post ← control, encounter-ধরে
1133 A/R — Insurers ASSET post ← control, claim-ধরে
1134 A/R — Corporate ASSET post ← control
1145 Inventory — Pharmacy ASSET post ← অধ্যায় ২৭
1148 Inventory — Consumables ASSET post
2150 TDS Payable LIAB. post
2161 Patient Deposit LIAB. post ← control, রোগী-ধরে
2185 Doctor Fee Payable LIAB. post ← control, doctor-ধরে
4210 Bed & Nursing REVENUE post dept IPD
4220 Consultation & Procedure Fee REVENUE post dept OPD / IPD
4230 Investigation (Lab, Radiology) REVENUE post dept LAB / RAD
4240 OT & Package REVENUE post dept OT
4250 Pharmacy Sales REVENUE post dept PHARM
4280 Patient Discount REVENUE post ← contra
4285 Contractual Adjustment — Insurer REVENUE post ← contra
5140 COGS — Pharmacy EXPENSE post
5530 Bad Debt Expense EXPENSE postDr. রহমান (surgeon) visiting — hospital ২০%। Dr. নাসরিন (OPD) employed। Insurer গ্রিন লাইফ — রোগীর policy surgery package + surgeon fee ৬০,০০০ পর্যন্ত, pre-auth নেওয়া।
০৩-১১ সকাল — করিম উদ্দিন ভর্তি (appendicitis), deposit ৫০,০০০ নগদ, IPD counter
encounter E-2611-0042 (IPD, cabin, admit 03-11 09:30)
RC-IPD-08811
Dr 1110 Cash [IPD counter] 50,000
Cr 2161 Patient Deposit [করিম] 50,000
2161 subledger: করিম 50,000Revenue শূন্য — এখনো কিছু হয়নি।
০৩-১১ — দিনের charge-গুলো (প্রতিটি আলাদা entry, source = charge)
C-1 bed (cabin), 1 দিন Dr 1132 [E-0042] 5,000 / Cr 4210 5,000
C-2 Dr. রহমান visit (visiting, 20%) Dr 1132 2,000 / Cr 4220 400, Cr 2185 [রহমান] 1,600
C-3 lab: CBC, CRP, USG Dr 1132 4,500 / Cr 4230 4,500
C-4 OT: appendectomy package Dr 1132 45,000 / Cr 4240 30,000 (OT), Cr 4210 10,000 (bed ২ দিন), Cr 4250 5,000 (std ওষুধ)
← allocation: standalone 52,000-এর অনুপাতে; package-এর bed দিন ০৪, ০৫ আলাদা charge নয়
C-5 surgeon fee, Dr. রহমান Dr 1132 15,000 / Cr 4220 3,000, Cr 2185 [রহমান] 12,000
C-6 pharmacy (package-এর বাইরে) Dr 1132 3,200 / Cr 4250 3,200
Dr 5140 2,400 / Cr 1145 2,400 ← FIFO costদিন শেষে 1132 [E-0042] = ৭৪,৭০০; আয় (hospital-এর) = ৫,০০০ + ৪০০ + ৪,৫০০ + ৪৫,০০০ + ৩,০০০ + ৩,২০০ = ৬১,১০০; doctor-এর ১৩,৬০০ আয় নয়। Bill এখনো নেই, রোগী এখনো ভর্তি — কিন্তু নভেম্বরের Income Statement-এ ৬১,১০০ ইতিমধ্যে আছে।
০৪-১১, ০৫-১১ — পরের দুই দিন
C-7, C-10 Dr. রহমান round visit ×2 Dr 1132 2,000 ×2 / Cr 4220 400 ×2, Cr 2185 1,600 ×2
C-8 lab: CBC repeat Dr 1132 1,500 / Cr 4230 1,500
C-9, C-11 pharmacy 1,800 + 600 Dr 1132 2,400 / Cr 4250 2,400; Dr 5140 1,800 / Cr 1145 1,800
(bed ০৪, ০৫ — package-এ; C-4-এর allocation-এ 4210-তে গেছে; আলাদা charge নেই)০৫-১১ রাত — অব্যবহৃত ওষুধ ফেরত, ৪০০ (cost ৩০০)
C-11-R reversal of part of C-11 Dr 4250 400 / Cr 1132 400
stock return_in (মূল cost) Dr 1145 300 / Cr 5140 300Charge edit নয় — reversal সারি, মূলটা অক্ষত।
০৬-১১ সকাল ১০টা — discharge; final bill
1132 [E-0042] = 74,700 + 4,000 + 1,500 + 2,400 − 400 = 82,200 ← Σ active charges
bill B-2611-0187 payer
───────────────────────────────────────── ─────
bed & nursing (cabin ৩ দিন, ২ দিন package-এ) 5,000 রোগী
consultation ×3 6,000 রোগী
investigation 6,000 রোগী
OT package (appendectomy) 45,000 insurer (pre-auth)
surgeon fee 15,000 insurer (pre-auth)
pharmacy (net of return) 5,200 রোগী
─────────────────────────────────────────
gross 82,200
discount (bed 10%, admin approved) (500) রোগী
─────────────────────────────────────────
রোগী 21,700 insurer 60,000
JV-11-0412 source = bill B-0187
Dr 1130 A/R — Patients [করিম] 21,700
Dr 1133 A/R — Insurers [গ্রিন লাইফ, claim CL-0093] 60,000
Dr 4280 Patient Discount 500
Cr 1132 In-patient Charges [E-0042] 82,200
1132 [E-0042] = 0 ✓; encounter status = billedBill-এ নতুন আয় নেই — শুধু 1132 থেকে A/R-এ, payer-ধরে। ছাড়টা contra revenue, খরচ নয়।
০৬-১১ — deposit সমন্বয়, বাকি ফেরত
JV-11-0413 Dr 2161 [করিম] 21,700 / Cr 1130 [করিম] 21,700 → 1130 [করিম] 0
RF-IPD-00214 Dr 2161 [করিম] 28,300 / Cr 1110 [IPD counter] 28,300 → 2161 [করিম] 0 (অনুমোদন: billing supervisor; রোগীর সই)রোগী ৫০,০০০ দিয়েছিলেন, bill ২১,৭০০, ফেরত ২৮,৩০০। Cash book-এ refund আলাদা লাইন — receipt-এর ঋণাত্মক নয়।
০৭-১১ — OPD: একজন walk-in, Dr. নাসরিন (employed) ১,৫০০ + lab ২,০০০, নগদ
encounter E-2611-0058 (OPD); RC-OPD-23107
Dr 1110 Cash [OPD counter] 3,500
Cr 4220 Consultation 1,500 ← employed: পুরোটা আয়
Cr 4230 Investigation 2,0001132 নেই, 2185 নেই — OPD-তে service আর payment এক মুহূর্তে।
২০-১১ — claim CL-0093 গ্রিন লাইফকে পাঠানো (৬০,০০০); ১৫-১২ — ৫৪,০০০ এল, surgeon fee ৬,০০০ disallowed (তাদের rate ৯,০০০)
১৫-১২ contract: disallowed surgeon fee রোগীকে চাওয়া যাবে না
JV-12-0071
Dr 1120 Bank 54,000
Dr 4285 Contractual Adjustment — Insurer 6,000
Cr 1133 A/R — Insurers [গ্রিন লাইফ, CL-0093] 60,000
claim status = settled; 1133 [CL-0093] = 0ডিসেম্বরের আয় ৬,০০০ কমল — নভেম্বরের নয় (তখন জানা ছিল না; estimate-এর সংশোধন, অধ্যায় ২৫)। Dr. রহমান কিন্তু ১২,০০০-ই পাবেন — hospital আর insurer-এর চুক্তি তাঁর নয় (নীতি; কিছু hospital-এ doctor-ও ভাগ নেন — চুক্তিতে)।
৩০-১১ — Doctor payout run, Dr. রহমান
2185 [রহমান], নভেম্বর: E-0042: 1,600 × 3 + 12,000 = 16,800; অন্য রোগী: 1,03,200 → Σ 1,20,000
TDS 10% = 12,000
JV-11-0498 source = doctor_payout DP-2611, aggregated (৯ জন doctor)
Dr 2185 Doctor Fee Payable 4,80,000
Cr 2150 TDS Payable 48,000
Cr 1120 Bank 4,32,000
doctor statement (রহমান): রোগী-ধরে, charge-ধরে — 2185 subledger থেকে; hash, snapshot (অধ্যায় ২৯-এর payslip-এর মতো)Encounter E-0042 — এক নজরে
তারিখ ঘটনা 1132 2161 1130 1133 আয় (hospital) 2185
───── ──── ──── ──── ──── ──── ───────────── ────
03-11 deposit +50,000
03-11 charges C-1…C-6 +74,700 +61,100 +13,600
04-05 charges C-7…C-11 +7,900 +4,700 +3,200
05-11 return −400 −400
06-11 bill −82,200 +21,700 +60,000 −500 (discount)
06-11 adjust + refund −50,000 −21,700
15-12 claim settled −60,000 −6,000 (adj., ডিসেম্বরে)
────── ────── ────── ────── ────────── ──────
0 0 0 0 নভ 64,900 16,800 → payout
ডিসে −6,000চারটি control account শূন্যে ফিরল, আয় দুই মাসে ৫৮,৯০০ (নভেম্বর ৬৪,৯০০, ডিসেম্বরে −৬,০০০), doctor ১৬,৮০০ পেলেন — যা কখনো hospital-এর আয় ছিল না। রোগী দিলেন ২১,৭০০, insurer ৫৪,০০০, মোট ৭৫,৭০০ = ৫৮,৯০০ + ১৬,৮০০ ✓।
৩০ নভেম্বর — খোলা encounter
৩০-১১ রাতে ভর্তি ৪২ জন; তাঁদের charges Σ 18,40,000 → 1132 balance 18,40,000
নভেম্বরের Income Statement: এই 18,40,000-এর আয় ইতিমধ্যে 42xx-এ
accrual entry: নেই। reversal: নেই। ডিসেম্বরে bill হলে: 1132 → A/R, আয় ছোঁয় নানকশা ক হলে এখানে ৪২টা accrual, ডিসেম্বরে ৪২টা reversal, প্রতিটি bill-এ match। নকশা খ-তে — কিছুই না। এটাই charge-time recognition-এর পুরস্কার।
৫. Implementation — Software ও Database
Master
service_items doctors
id, code, name id, name, engagement (visiting | employed)
department_id FK (cost center — অধ্যায় ৩৪) default_share_pct DECIMAL(5,2) -- hospital-এর অংশ
revenue_account_id FK (42xx) tds_rate
kind bed | consult | investigation | procedure | package | pharmacy | consumable
chargeable BOOLEAN price_lists
is_package BOOLEAN id, payer_type (self | insurer | corporate), payer_id NULL, effective_from
inventory_item_id FK NULL (pharmacy) price_list_lines: price_list_id, service_item_id, rate
doctor_share_pct DECIMAL(5,2) NULL
packages / package_components
package_id, service_item_id, qty, standalone_price, alloc_pct (computed)revenue_account_id item-এ; doctor_share_pct doctor-এ (item override); rate price list থেকে — client দাম পাঠায় না।
Encounter ও charge
encounters charges
id, patient_id id, encounter_id, charge_no (gapless per encounter)
type opd | ipd | emergency | daycare service_item_id, description
admitted_at, discharged_at service_date DATE -- আয়ের দিন
bed_id, department_id posting_date DATE -- সাধারণত = service_date
status open | discharged | billed | quantity, rate, amount DECIMAL(18,4)
settled | closed price_list_id FK -- কোন দামে
attending_doctor_id doctor_id FK NULL
payer_rules JSON (pre-auth: scope, cap; doctor_share_amount DECIMAL(18,4) -- 2185-এ
corporate contract) hospital_amount DECIMAL(18,4) -- 42xx-এ
package_id, is_package_component -- component: amount 0 / allocated
revenue_account_id FK -- copy
department_id FK
stock_movement_id FK NULL -- pharmacy
status active | reversed
reversed_by_charge_id FK NULL; reverses_charge_id FK NULL
journal_entry_id FK
created_by, created_at
UNIQUE (encounter_id, charge_no)
INDEX (encounter_id, status); INDEX (service_date, department_id); INDEX (doctor_id, service_date)Charge post-এ entry; status = reversed মানে reversal charge আছে (ঋণাত্মক, নিজের entry)। UPDATE charges SET amount কখনো নয়।
postCharge()
postCharge(enc, item, qty, service_date, doctor, by):
যাচাই: enc.status == open (discharged → শুধু pharmacy return / correction, অনুমতিতে)
service_date BETWEEN enc.admitted_at AND today; period open
item.chargeable; package-এর ভিতরের item আবার নয়: if enc has package covering item → is_package_component, amount 0
rate = priceList(enc.payer_for(item), item).rate -- client rate পাঠায় না
c = charges.insert(amount = qty × rate, …)
if item.kind == pharmacy: m = issue(item.inventory_item, qty, ref = c); c.stock_movement_id = m -- অধ্যায় ২৭
-- doctor split
if c.doctor AND doctor.engagement == visiting:
c.doctor_share_amount = amount × (1 − share_pct); c.hospital_amount = amount − doctor_share
else: c.hospital_amount = amount
-- package allocation
if item.is_package: lines = package.components.map(comp → (comp.revenue_account, amount × comp.alloc_pct))
else: lines = [(c.revenue_account_id, c.hospital_amount)]
entry = JournalEntry(source = ('charge', c.id), posting_date = c.posting_date, idempotency = ('charge', c.id))
entry.line(Dr 1132, c.amount, dims = {encounter = enc.id})
প্রতিটি (acct, amt) in lines: entry.line(Cr acct, amt, dims = {department})
if c.doctor_share_amount > 0: entry.line(Cr 2185, c.doctor_share_amount, dims = {doctor}); doctor_ledger += (doctor, c, amount)
if pharmacy: entry.line(Dr 5140, m.total_cost); entry.line(Cr 1145, m.total_cost)
assert balanced; post(entry); c.journal_entry_id = entry.id
-- OPD (নগদে): Dr 1110 [counter] instead of 1132, receipt বাধ্যতামূলক
reverseCharge(c, reason, by):
যাচাই: c.status == active; by has 'charge.reverse'; reason
r = charges.insert(reverses_charge_id = c.id, amount = −c.amount, …) -- সব field উল্টো
entry উল্টো (posting_date = আজ, খোলা period); pharmacy হলে return_in মূল cost-এ
c.status = reversed; c.reversed_by_charge_id = r.idBill — সরায়, তৈরি করে না
bills bill_payers
id, encounter_id, bill_no (gapless), bill_date bill_id, payer_type, payer_id (patient | insurer | corporate)
gross, discount, net amount, ar_account_id (1130 | 1133 | 1134), claim_id NULL
status draft | final | settled | void
journal_entry_id bill_discounts
bill_id, amount, reason, approved_by, limit_checked
finalizeBill(enc, by):
যাচাই: enc.status == discharged; pending pharmacy issue নেই; সব charge posted (journal_entry_id NOT NULL)
gross = Σ charges(active).amount; assert gross == closing(1132, encounter = enc.id) -- control যাচাই, প্রতিবার
payers = splitByPayer(charges, enc.payer_rules) -- pre-auth scope/cap → insurer; corporate contract → corporate; বাকি patient
discount = approvedDiscounts(bill) -- approval_limits (অধ্যায় ৪১)
entry: প্রতিটি payer: Dr payer.ar_account amount, dims = {party, claim}
Dr 4280 discount
Cr 1132 gross, dims = {encounter}
assert balanced; post
enc.status = billed; insurer payer → claims.insert(status = draft)
applyDeposit(enc): প্রতিটি deposit(open) → allocation to patient A/R (অধ্যায় ১৪-এর allocations, document_type = bill)
entry Dr 2161 / Cr 1130 min(deposit, patient due); বাকি deposit → refundable
refund(enc, amount, by, approver): যাচাই approver ≠ by; রোগীর সই (document); entry Dr 2161 / Cr 1110 [counter]; RF নম্বর gaplessClaim
claims: id, insurer_id, bill_id, encounter_id, claimed, submitted_on, approved, disallowed, paid, status (draft | submitted | resubmitted | settled | rejected)
claim_lines: claim_id, charge_id, claimed, approved, disallow_reason
settleClaim(claim, paid, disallowances[{charge, amount, treatment}]):
entry: Dr bank paid
প্রতিটি d: treatment == 'contractual' → Dr 4285 d.amount
treatment == 'patient' → Dr 1130 [patient] d.amount (রোগীকে notice)
treatment == 'resubmit' → থাকে (entry নেই), claim.status = resubmitted
Cr 1133 [claim] paid + Σ contractual + Σ patient
claim.status = settled if 1133[claim] == 0Doctor payout
doctor_ledger: doctor_id, charge_id, service_date, gross_fee, share_amount, payout_run_id NULL
payoutRun(period): অধ্যায় ২৯-এর payroll-এর কাঠামো — aggregated entry (Dr 2185 Σ / Cr 2150 TDS / Cr bank), doctor-ধরে statement, snapshot
যাচাই: by ≠ approver; doctor-এর bank verified; reversed charge-এর share ঋণাত্মক (clawback)Counter cash
cash_counters: id, name, gl dimension
shifts: counter_id, opened_by, opened_at, opening_float, closed_at, counted, system_receipts, system_refunds, variance, closed_by
closeShift(): system = Σ receipts − Σ refunds (this shift); variance = counted − (float + system); variance → 5xxx cash over/short, অনুমোদনে
bank deposit পরদিন: Dr 1120 / Cr 1110 [counter] (অধ্যায় ১১)API / Service
POST /encounters … /admit … /discharge
POST /encounters/{id}/deposits {amount, counter} → receipt
POST /encounters/{id}/charges {item, qty, service_date, doctor} → rate server-এ; entry
POST /charges/{id}/reverse {reason}
POST /encounters/{id}/bill → payer split, discount (approved), entry; final
POST /bills/{id}/apply-deposit … /refund {amount, approver}
POST /claims/{id}/submit … /settle {paid, disallowances[]}
POST /doctors/payout-runs … /approve … /pay
GET /encounters/{id}/statement charges, payments, deposits — রোগীর "আপনার হিসাব"
GET /revenue/by-department?from=&to= 42xx × department — 1132-এর পাশে
GET /reconciliation?as_of= যাচাই ১২০–১২৬POST /charges-এ amount এলে reject — price list-ই সত্য। Discount client পাঠায় না — bill_discounts approval দিয়ে।
রাতের যাচাই
১২০. closing(1132) == Σ charges(active).amount WHERE encounter.status IN (open, discharged) — encounter-ধরে
১২১. closing(2161) == Σ deposits − allocations − refunds, রোগী-ধরে; refund যার approver == created_by → ০টি
১২২. closing(2185) == Σ doctor_ledger.share WHERE payout_run_id IS NULL, doctor-ধরে
১২৩. closing(1133) == Σ claims (claimed − paid − adjusted − transferred), claim-ধরে; submitted > ৬০ দিন → সতর্কতা
১২৪. 1132 / 2161 / 2185 / 1133-এ posted line যার source_type ∉ (charge, bill, deposit, refund, claim_settlement, doctor_payout,
opening_balance) → ০টি; charges যার journal_entry_id NULL → ০টি
১২৫. discharged > ২৪ ঘণ্টা অথচ bill নেই → সতর্কতা; billed অথচ patient due > ০ আর deposit > ০ → ০টি (apply হয়নি)
১২৬. package encounter-এ component item আলাদা charge (amount > 0) → ০টি (double billing); shift closed অথচ variance unapproved → সতর্কতা১২০ ব্যর্থ হলে প্রথমে ১২৪ — কেউ 1132-এ JV লিখেছে বা charge post হয়নি। ১২৬-এর প্রথম অংশ accounting নয়, কিন্তু রোগীর সবচেয়ে বড় অভিযোগ।
Test হিসেবে
test "charge-এ আয়, bill-এ নয়":
admit(E); postCharge(E, bed, 03-11)
assert Δ 4210 == +5,000 and Δ 1132 == +5,000 and Δ 1130 == 0
finalizeBill(E); assert Δ 42xx (bill) == 0 and Δ 1132 == −5,000 and Δ 1130 == +5,000
test "deposit আয় নয়; সমন্বয় ও ফেরত":
deposit(E, 50,000); assert Δ 2161 == −50,000 and Δ 4xxx == 0
bill patient 21,700; applyDeposit; refund(28,300, approver)
assert closing(2161, করিম) == 0 and closing(1130, করিম) == 0 and Δ 1110 == +50,000 − 28,300
test "visiting doctor: agent — share আয় নয়":
postCharge(E, consult 2,000, doctor = রহমান (visiting, 20%))
assert Δ 4220 == +400 and Δ 2185 == −1,600 and Δ 1132 == +2,000
test "employed doctor: principal — পুরো আয়":
postCharge(E, consult 1,500, doctor = নাসরিন (employed))
assert Δ 4220 == +1,500 and Δ 2185 == 0
test "pharmacy: বিক্রি + COGS একসাথে; ফেরত মূল cost-এ":
postCharge(E, drug × 10) → assert Δ 4250 == +3,200 and Δ 5140 == +2,400 and Δ 1145 == −2,400
reverseCharge(partial 400) → assert Δ 4250 == −400 and Δ 1145 == +300
test "package: allocation, component double-bill নয়":
postCharge(E, appendectomy package 45,000)
assert Δ 4240 == +30,000 and Δ 4210 == +10,000 and Δ 4250 == +5,000
c = postCharge(E, bed, 04-11); assert c.is_package_component and c.amount == 0
test "payer split: pre-auth scope":
(E-0042) finalizeBill
assert Δ 1130 == +21,700 and Δ 1133 == +60,000 and Δ 4280 == +500 and Δ 1132 == −82,200
test "claim: contractual → 4285; patient → 1130; resubmit → থাকে":
settleClaim(CL, paid 54,000, [{surgeon, 6,000, contractual}]) → assert Δ 4285 == +6,000 and closing(1133, CL) == 0
settleClaim(CL2, paid 50,000, [{x, 10,000, patient}]) → assert Δ 1130 == +10,000
settleClaim(CL3, paid 0, [{y, 5,000, resubmit}]) → assert closing(1133, CL3) unchanged
test "charge edit নয়":
assert rejects UPDATE charges SET amount … (API নেই); reverseCharge → নতুন সারি, মূল status reversed
test "rate client থেকে নয়":
assert rejects POST /charges {item, qty, amount: 1}
assert postCharge(E insurer-payer, item).rate == priceList(insurer).rate
test "discharge-এর পরে charge নয়":
discharge(E); assert rejects postCharge(E, bed)
test "মাস শেষে খোলা encounter: accrual লাগে না":
42 open encounters, Σ charges 18,40,000
assert closing(1132) == 18,40,000 and revenue(Nov) includes 18,40,000 and entries(source = accrual, Nov).count == 0
test "doctor payout: aggregated, TDS, statement":
payoutRun(Nov)
assert entry.lines.count == 3 and Δ 2185 == +4,80,000 and Δ 2150 == −48,000
assert statement(রহমান).Σ == 1,20,000 and closing(2185, রহমান) == 0
test "shift: variance approval":
closeShift(counted = system − 500) → assert rejects without approver; with approver: Δ 5xxx cash short == +500৬. Financial Statement Impact
INCOME STATEMENT (নভেম্বর ২০২৬ — একটা encounter-এর অংশ; পুরো hospital-এ হাজারটা)
4210 Bed & Nursing 15,000 (5,000 + package-এর 10,000)
4220 Consultation & Procedure 4,200 (400 × 3 + 3,000) ← visiting share; doctor-এর 16,800 নেই
4230 Investigation 6,000
4240 OT & Package 30,000
4250 Pharmacy Sales 10,200 (5,000 + 5,200)
4280 Patient Discount (500)
Net revenue 64,900
5140 COGS — Pharmacy 3,900 (2,400 + 1,800 − 300)
(ডিসেম্বরে: 4285 Contractual Adjustment (6,000))
BALANCE SHEET (৩০ নভেম্বর ২০২৬, পুরো hospital)
1132 In-patient Charges (Unbilled) 18,40,000 ← current asset; A/R-এর পাশে, আলাদা লাইন (অধ্যায় ২১-এর 1170-এর যুক্তি)
1130 A/R — Patients 3,20,000 ← ছোট, দ্রুত
1133 A/R — Insurers 42,60,000 ← বড়, ধীর; aging আলাদা
1134 A/R — Corporate 8,10,000
2161 Patient Deposit 21,00,000 ← liability; "নগদ" নয়
2185 Doctor Fee Payable 4,80,000 ← ৩০-১১ payout-এর আগে
CASH FLOW
operating: deposit +, refund −, insurer receipt +; increase in 1132/1133 —; increase in 2161 +তিনটি কথা। Revenue-র সংজ্ঞা model-এ — agent হিসেবে 4220-তে ৪,২০০; principal হলে ২১,০০০ আর 5310-এ ১৬,৮০০; net profit এক, revenue ৫ গুণ — investor, regulator, benchmark সবাই দ্বিতীয় লাইনটা দেখেন, তাই সিদ্ধান্তটা accounting policy-তে লেখা থাকে। 1132 আর 1133 A/R থেকে আলাদা — একটার invoice নেই, অন্যটার payer আলাদা প্রকৃতির (৯০ দিন, disallowance)। 2161 Balance Sheet-এর সবচেয়ে ভুল বোঝা লাইন — ২১ লাখ liability, অথচ management ভাবে “ব্যাংকে টাকা আছে”।
৭. Common Developer Mistakes
| ভুল | কী ঘটে | সঠিক পথ |
|---|---|---|
| Revenue bill-এ (discharge-এ) | মাস শেষে খোলা রোগীর আয় নেই; ৩০০ accrual হাতে | charge-এ revenue, 1132 |
| Deposit revenue-তে | ভর্তির দিন “আয়”, ফেরত দিলে “ক্ষতি” | 2161 liability, রোগী-ধরে |
| Visiting doctor-এর পুরো fee revenue | revenue ফোলে, 5310-এ doctor “খরচ” — agent হলে ভুল | engagement → split; share 2185 |
| Employed doctor-এর fee split | আয় কম, 2185-এ কর্মীর দেনা | principal: পুরো আয় |
| Charge UPDATE | audit নেই, 1132 ≠ Σ, doctor share ভুল | reverse + নতুন |
| Rate client পাঠায় | যা খুশি দাম | price list, payer-ধরে |
| Package component আলাদা charge | double billing — রোগীর অভিযোগ, refund | is_package_component, amount 0 |
| Package পুরোটা এক account-এ | department revenue ভুল (bed-এর আয় OT-তে) | allocation |
| এক A/R সব payer-এর | insurer aging patient-এর সাথে মিশে; disallowance কোথায় জানা নেই | 1130 / 1133 / 1134 |
| Disallowed → bad debt | ”হারালাম” বনাম “পাওনা ছিল না” — দুটো আলাদা সিদ্ধান্ত | 4285 / 1130 / resubmit |
| Discount খরচে | আয় ফোলে | 4280 contra |
| Discount বিনা অনুমোদনে | counter থেকে যা খুশি ছাড় | approval_limits, log |
| Pharmacy issue COGS ছাড়া | stock কমে না বা gross margin ১০০% | issue() একই transaction |
| Refund receipt-এর ঋণাত্মক হিসেবে | cash book-এ লুকায়, অনুমোদন নেই | RF নম্বর, approver, সই |
| Counter shift reconcile নেই | নগদ চুরি — সবচেয়ে সাধারণ | shift close, variance, deposit |
| Receipt ছাড়া charge settle | হাতের রসিদ, টাকা পকেটে | gapless receipt, settle শুধু receipt-এ |
| Discharge-এর পরে charge | bill পাঠানোর পরে অঙ্ক বদলায় | block; correction reverse-এ |
| Encounter-ধরে dimension নেই 1132-এ | ৩০০ রোগীর 1132 এক পিণ্ড | dimension; যাচাই ১২০ |
| 1132/2161/2185-এ হাতে JV | subledger ≠ GL | control; যাচাই ১২৪ |
প্রথম আর তৃতীয় সবচেয়ে ব্যয়বহুল — দুটোই Income Statement-এর প্রথম লাইনকে ভুল করে, আর দুটোই “কিন্তু bill-এ তো এটাই লেখা” বলে defend করা হয়। পনেরো আর ষোলো টাকা হারায় — hospital-এ নগদের দরজা অনেক, আর প্রতিটি দরজায় একজন মানুষ।
৮. Exercises
সেট ক — entry লিখুন
১। রোগী ভর্তি, deposit ৩০,০০০ bKash-এ (1125 mobile wallet)। entry। subledger।
২। দিন ১: ICU bed ১৫,০০০; visiting intensivist ৫,০০০ (hospital ২৫%); ventilator ৮,০০০/দিন;
ওষুধ ১২,০০০ (cost ৯,৫০০)। প্রতিটির entry। দিনের hospital revenue, doctor payable।
৩। ২ নম্বরের রোগী ৩ দিন পরে মারা গেলেন। bill ১,২০,০০০; deposit ৩০,০০০; পরিবার ৫০,০০০ দিতে
পারল; বাকি ৪০,০০০ welfare fund থেকে (charity, অনুমোদিত)। bill, adjust, charity — entry।
৪। Corporate রোগী (employer দেবে, contract rate 10% কম): OPD consult ২,০০০ (employed),
lab ৩,০০০। entry — rate কোনটা, A/R কোনটা।
৫। Claim ৮০,০০০: insurer দিল ৭০,০০০; ৬,০০০ contractual, ৪,০০০ "রোগীর co-pay" (contract-এ রোগীর
দায়)। entry। রোগীকে কী পাঠাবেন?
৬। Delivery package ৩৫,০০০ (OT 20,000, bed 2 দিন 8,000, নবজাতক care 7,000 standalone)।
allocation। রোগী ৪ দিন থাকলেন — extra ২ দিন charge?
৭। Dr. রহমানের নভেম্বরের একটা charge (১,৬০০ share) ডিসেম্বরে reverse হলো (ভুল রোগী)।
payout নভেম্বরে হয়ে গেছে। ডিসেম্বরের payout-এ কী?সেট খ — মাস শেষ ও reconciliation
৮। ৩০-১১: 1132 GL 18,40,000; Σ charges(active, open enc.) 18,52,000। পার্থক্য ১২,০০০ —
তিনটি সম্ভাব্য কারণ, প্রতিটি কীভাবে খুঁজবেন।
৯। 2161 GL 21,00,000; subledger-এ একজন রোগীর deposit −৫,০০০ (ঋণাত্মক)। কীভাবে হলো?
কী করবেন?
১০। Insurer aging: ০–৩০: ১২ লাখ, ৩১–৬০: ১৮ লাখ, ৬১–৯০: ৯ লাখ, ৯০+: ৩.৬ লাখ। ৯০+-এর
জন্য কী — bad debt? contractual? resubmit? কোন তথ্য লাগবে?
১১। নকশা ক (bill-এ revenue) হলে ৩০-১১-এর accrual entry কত হতো, ০১-১২-এ reversal, আর
ডিসেম্বরের bill-এ কী match করতে হতো? নকশা খ-এর সাথে ধাপ গুনে তুলনা।সেট গ — কোনটা ভুল
১২। Dr 1110 50,000 / Cr 4210 50,000 — deposit
১৩। Dr 1132 2,000 / Cr 4220 2,000; মাস শেষে Dr 5310 1,600 / Cr 2185 1,600 — visiting doctor
১৪। Dr 1130 82,200 / Cr 4210 …, Cr 4220 … — discharge bill, charges ছিল না
১৫। Dr 5530 Bad Debt 6,000 / Cr 1133 6,000 — insurer contractual disallowance
১৬। Dr 5xxx Discount Expense 500 / Cr 1130 500
১৭। UPDATE charges SET amount = 1,800 WHERE id = C-9 — "ভুল qty"
১৮। Dr 1132 3,200 / Cr 4250 3,200 — pharmacy, COGS পরে "মাস শেষে গড়ে"
১৯। Refund: Dr 1110 −28,300 (ঋণাত্মক receipt)সেট ঘ — নকশা
২০। Interim bill (৭ দিন পরে, রোগী এখনো ভর্তি): 1132 → 1130 আংশিক? না শুধু deposit চাওয়া?
দুটোর entry ও ফল (aging, claim)।
২১। Doctor share যদি insurer-এর disallowance-এর সাথে বদলায় (চুক্তি: "hospital যা পায় তার ৮০%")
— charge-এ share কত লিখবেন? claim settle-এ 2185 adjust? doctor_ledger-এ কী?
২২। একই doctor OPD-তে visiting (share), IPD-তে employed (বেতনে) — engagement encounter-type-ধরে?
schema-তে কী বদলাবে?
২৩। Emergency: রোগী অজ্ঞান, নাম নেই, deposit নেই, charge শুরু। encounter কার নামে? পরে
পরিচয় পেলে merge? 1132-এর dimension বদলায় — entry?
২৪। Department profitability (অধ্যায় ৩৪-এর আগাম): Lab-এর revenue 4230 থেকে; Lab-এর cost —
reagent (consumables), technician (payroll), machine (depreciation)। তিনটি অধ্যায়ের dimension
এক জায়গায় আসছে — কোন column সবগুলোতে থাকতে হবে?উত্তর আছে Workbook-এর Answer Key, অধ্যায় ৩১-এ।
৯. Developer Challenge
একটি PatientBillingService নকশা করুন — admission থেকে claim settlement — Part 4-এর পঞ্চম project (Projects ও Exit Criteria: Patient billing accounting engine)।
যা যা নকশা করবেন:
১. Master —
service_items(revenue account, department, kind, chargeable, package),doctors(engagement, share),price_listspayer-ধরে,packages/components(allocation standalone price-এর অনুপাতে)।২.
postCharge()— rate price list থেকে, doctor split engagement-ধরে, package allocation ও component suppression, pharmacy issue একই transaction (অধ্যায় ২৭-এরissue()), entrysource = charge, encounter dimension 1132-এ।reverseCharge()— নতুন সারি, মূল অক্ষত, pharmacy return মূল cost-এ। OPD path: 1110 [counter] সরাসরি, receipt বাধ্যতামূলক।৩.
finalizeBill()— Σ charges == 1132[encounter] যাচাই, payer split (pre-auth scope/cap, corporate contract), discount approval, entry শুধু 1132 → A/R।applyDeposit()অধ্যায় ১৪-এর allocations reuse;refund()approver ≠ creator, gapless RF।৪. Claims — submit, settle with disallowances (contractual / patient / resubmit — তিনটি path), 1133 claim-ধরে, aging আলাদা।
৫. Doctor payout — অধ্যায় ২৯-এর payout কাঠামো reuse: aggregated entry, TDS, doctor statement snapshot, clawback reversed charge-এ।
৬. Counter cash — অধ্যায় ১১-এর cash book counter dimension-এ, shift open/close, variance approval, daily bank deposit।
৭. Reports — encounter statement (রোগীর “আপনার হিসাব”), revenue by department (42xx × dept), open encounters (1132 detail), insurer aging, doctor statement। প্রতিটি subledger থেকে, GL-এর সাথে যাচাই ১২০–১২৬।
৮. Section ৫-এর চৌদ্দটি test; আর: (ক) দুই nurse একই ওষুধ একই রোগীকে একই সময়ে charge — duplicate কীভাবে আটকাবেন (idempotency key কী)? (খ) ৫০০ শয্যার hospital-এ দিনে ২০,০০০ charge → ২০,০০০ entry — GL ফোলে? বিকল্প: charge-ধরে entry বনাম দিনে department-ধরে aggregated entry + charge subledger (অধ্যায় ২৯-এর payroll-এর সিদ্ধান্ত) — trade-off, আর 1132[encounter] dimension তখন কীভাবে? (গ) অধ্যায় ৩৪-এর জন্য department dimension সব revenue ও cost line-এ।
২ আর ৮(খ) একসাথে আসল পরীক্ষা। Charge-time recognition মানে প্রতিটি service একটা accounting event — মাস শেষের accrual চিরতরে চলে যায়, কিন্তু GL-এ দিনে হাজার entry। Aggregate করলে GL হালকা, কিন্তু “এই 1132-এর ১৮ লাখ কোন রোগীর” প্রশ্নের উত্তর subledger-এ যেতে হয়। দুটো নকশাই ঠিক — শর্ত একটাই: subledger == GL প্রতি রাতে, আর কোনো সংখ্যা দুই জায়গায় দুইভাবে হিসাব নয়। এটা পারলে অধ্যায় ৩৬-এর Subledger Architecture-এ আপনি নিজের উদাহরণ নিয়ে ঢুকবেন।
১০. Summary Card
রোগীর যাত্রা
deposit Dr 1110 / Cr 2161 [রোগী] দেনা, আয় নয়
charge Dr 1132 [enc] / Cr 42xx (, Cr 2185 [doctor]) আয় service-এর দিন; bill নয়
pharmacy + Dr 5140 / Cr 1145 একই transaction
bill Dr 1130 / 1133 / 1134 (payer), Dr 4280 / Cr 1132 সরায়, তৈরি করে না
adjust Dr 2161 / Cr 1130; refund Dr 2161 / Cr 1110 (approver, সই)
claim Dr 1120, Dr 4285 (contractual) | Dr 1130 (patient) / Cr 1133
payout Dr 2185 / Cr 2150, Cr 1120 aggregated, statementতিনটি সিদ্ধান্ত
recognition charge-এ (নকশা খ): মাস শেষে accrual নেই; 1132 == unbilled
doctor visiting = agent (share আয়); employed = principal (পুরো আয়)
payer একটা bill, payer-ধরে A/R; price list payer-ধরে; disallowed: 4285 / 1130 / resubmitতিনটি আলাদা জিনিস
discount 4280 (contra) charity 4280 dim / welfare fund bad debt 5530 (খরচ)Control accounts
1132 == Σ active charges (open enc.) 2161 == Σ open deposits 2185 == Σ unpaid doctor share 1133 == Σ open claims
হাতে JV নয়; encounter / রোগী / doctor / claim dimensionDeveloper checklist
□ service_items: revenue account, dept, kind, package; doctors: engagement, share; price_lists payer-ধরে
□ charges: gapless per encounter, service_date, status active/reversed, entry link; UPDATE নেই
□ postCharge: rate server-এ; split; package suppression; pharmacy issue একসাথে
□ OPD: 1110 [counter] সরাসরি, receipt gapless
□ finalizeBill: Σ charges == 1132[enc]; payer split; discount approval; 1132 → A/R শুধু
□ deposit: 2161 রোগী-ধরে; apply → allocations; refund approver ≠ creator, RF gapless
□ claims: claim-ধরে 1133; settle তিন path; aging আলাদা
□ doctor payout: aggregated; TDS; statement snapshot; clawback
□ counter shifts: open/close, variance approval, bank deposit
□ discharge-এর পরে charge block
□ department dimension সব 42xx/5xxx line-এ (অধ্যায় ৩৪)
□ control accounts: হাতে JV block
□ রাতে: ১২০ 1132, ১২১ 2161, ১২২ 2185, ১২৩ 1133, ১২৪ অচেনা source, ১২৫ unbilled discharge, ১২৬ double-bill / shiftপরবর্তী অধ্যায়
অধ্যায় ৩২ — School Accounting: Hospital-এর উল্টো ছবি — service আগে থেকে জানা (বছরের tuition), টাকা আগে আসে (session-এর শুরুতে বা মাসিক), আর গ্রাহক একজন নয়, একটা পরিবার (ভাই-বোন, একই অভিভাবক)। Tuition বারো মাসের আয় — জানুয়ারিতে পুরোটা নিলে deferred (অধ্যায় ১৭); admission fee একবারের — আয় কখন; scholarship আর waiver — discount না খরচ; late fee; hostel, transport, canteen — আলাদা service, আলাদা account; আর fee collection-এর aging যেখানে “overdue” মানে একটা শিশু, একটা ফোন। Hospital-এ প্রশ্ন ছিল “কে দেবে”; school-এ “কোন মাসের”।