এই ভলিউমে · ভলিউম 05
অ্যাকাউন্টিং
হিসাব তালিকা জার্নাল ও লেজার বিলিং ও ইনভয়েসিং পেমেন্ট ও রসিদ পেমেন্ট রিকনসিলিয়েশন মাল্টি-কারেন্সি ডেফার্ড রেভিনিউ কমিশন অ্যাকাউন্টিং কর (VAT/GST) পিরিয়ড ক্লোজ

অধ্যায় ৫.২ — জার্নাল ও লেজার

১. উদ্দেশ্য

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_monthje_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 — উল্টানো ডেবিট/ক্রেডিট, একই অ্যাকাউন্ট