অধ্যায় ৫.২ — জার্নাল ও লেজার
১. উদ্দেশ্য
travoBooks-এর হৃদয়: কীভাবে দ্বৈত-এন্ট্রি অ্যাকাউন্টিং কাজ করে এবং কেন এটি অলঙ্ঘনীয়।
২. মৌলিক নিয়ম
প্রতিটি ব্যবসায়িক লেনদেন একটি ব্যালেন্সড JE তৈরি করে যেখানে:
সমষ্টিগত ডেবিট = সমষ্টিগত ক্রেডিট
কোনো JE পোস্ট করার সময় এই সমতা যাচাই করা হয়। ব্যর্থ হলে → অবস্থানে নয় (JE_UNBALANCED ত্রুটি)।
৩. পবিত্র নিয়ম
প্রতিটি অপারেশনাল ইভেন্ট (টিকেট ইস্যু, পেমেন্ট, রিফান্ড) একই ডিবি ট্রানজ্যাকশনে একটি ব্যালেন্সড JE পোস্ট করে। এর মানে:
- বুকিং কমিট কিন্তু JE পোস্ট ব্যর্থ = অসম্ভব
- JE পোস্ট কিন্তু বুকিং রোলব্যাক = অসম্ভব
এটিই travoBooks-এর মৌলিক ডেটা ইন্টিগ্রিটি গ্যারান্টি।
৪. JE স্কিমা
journal_entries (
je_id BIGINT PK,
partner_id BIGINT NOT NULL,
je_number VARCHAR(50), -- partner-নির্দিষ্ট ক্রম
je_date DATE, -- লেনদেনের তারিখ
period_year INT,
period_month INT,
description TEXT,
source_type VARCHAR(50), -- 'BOOKING', 'PAYMENT', 'MANUAL', etc.
source_id BIGINT, -- উৎস এন্টিটির আইডি
reverse_of_je_id BIGINT NULL, -- যদি reversing JE
posted_at DATETIME(6),
posted_by BIGINT
)
journal_entry_lines (
jel_id BIGINT PK,
je_id BIGINT,
partner_id BIGINT NOT NULL,
line_number INT,
account_code VARCHAR(20),
debit DECIMAL(20,4), -- ০ যদি ক্রেডিট লাইন
credit DECIMAL(20,4), -- ০ যদি ডেবিট লাইন
transaction_currency CHAR(3),
transaction_amount DECIMAL(20,4),
functional_currency CHAR(3),
functional_amount DECIMAL(20,4),
fx_rate DECIMAL(20,8),
-- dimensions:
branch_id BIGINT NULL,
cost_center_id BIGINT NULL,
customer_id BIGINT NULL,
supplier_id BIGINT NULL,
-- additional
memo VARCHAR(500),
source_doc_ref VARCHAR(100)
)
৫. Append-only
JE পোস্ট হলে কোনো UPDATE বা DELETE নেই। সংশোধন করতে চাইলে → reversing JE তৈরি করুন।
কেন? অডিট ট্রেইল, regulatory প্রয়োজনীয়তা, ডেটা ইন্টিগ্রিটি।
৬. Reversing JE
ভুল JE ঠিক করার পদ্ধতি:
১. মূল JE অপরিবর্তিত থাকে
২. নতুন JE তৈরি — ডেবিট/ক্রেডিট উল্টানো, একই অ্যাকাউন্ট
৩. নতুন JE-তে `reverse_of_je_id` = মূল JE-এর ID
৪. মূল JE স্ট্যাটাস ভিউ-তে "REVERSED" দেখাবে
৭. JE সংখ্যায়ন
প্রতি পার্টনার প্রতি অর্থবছর ক্রমিক: JE-2026-00001, JE-2026-00002, ...
ফাঁক নেই, পুনঃব্যবহার নেই। NBR/অডিট প্রয়োজনীয়তা।
৮. পিরিয়ড স্কোপ
প্রতিটি JE-এর period_year, period_month — je_date থেকে নির্ধারিত। ক্লোজড পিরিয়ডে পোস্ট ব্লক।
৯. ম্যানুয়াল JE
অ্যাকাউন্টেন্টদের জন্য: - ব্যবহার: adjusting entries, accruals, reclasses - maker-checker: BDT 50,000-এর উপরে অনুমোদন - বাধ্যতামূলক: description, reason, source_doc_ref
১০. সাধারণ ফাঁদ
- ⚠️ ব্যর্থ ব্যালেন্স —
JE_UNBALANCEDব্লক করবে কিন্তু কোডে চেক করুন - ⚠️ JE তৈরি কিন্তু কমিট ব্যর্থ — অপারেশনাল ডেটাও রোলব্যাক হয়
- ⚠️ Closed period-এ ম্যানুয়াল পোস্ট — periodclose unaware
- ⚠️ Reversing JE তে ভুল signs — উল্টানো ডেবিট/ক্রেডিট, একই অ্যাকাউন্ট