MVP Foundation · v2

Samyzarif — Dollar Buy/Sale Platform
Foundation Deliverables

আগের planning report-এর উপরে দাঁড়িয়ে তিনটে ভিত্তি-ডেলিভারেবল: সম্পূর্ণ ডাটাবেস মাইগ্রেশন, double-entry ledger-এর posting logic, আর লঞ্চ-গেট নিরাপত্তা চেকলিস্ট। এটা MVP-র ভিত্তি — পূর্ণ অ্যাপ্লিকেশন নয়।

৪৫ টেবিল ৭০ foreign key ৪৪ CHECK constraint ৬ PHP ক্লাস ১৩৫ নিরাপত্তা আইটেম MariaDB 10.11-এ যাচাইকৃত
০১

ডাটাবেস মাইগ্রেশন (SQL)

MySQL/MariaDB-র জন্য ১০টি মাইগ্রেশন, column-level সংজ্ঞা সহ — index, foreign key, CHECK constraint, আর immutability trigger। প্রতিটি idempotent (IF NOT EXISTS), তাই বারবার চালানো নিরাপদ। প্রতিটির জন্য আলাদা rollback স্ক্রিপ্টও আছে।

#ফাইলযা তৈরি করেটেবিল
001001_users.sqlusers, user_devices, user_sessions, password_resets, otp_codes, login_attempts6
002002_kyc.sqlkyc_verifications, kyc_documents, kyc_limits3
003003_bank_accounts.sqlbank_accounts (encrypted), payout_methods, bank_account_events3
004004_wallets.sqlwallets, wallet_balances, wallet_holds, wallet_balance_snapshots4
005005_rates.sqlrate_sources, exchange_rates, rate_history, rate_quotes4
006006_orders.sqlorders, order_items, order_status_history, order_attachments4
007007_transactions.sqltransactions, transaction_events, idempotency_keys, webhook_events4
008008_ledger_entries.sqlledger_accounts, ledger_batches, ledger_entries + ২ ভিউ + ২ trigger4
009009_audit_logs.sqlaudit_logs (hash-chained), admin_roles, admin_permissions, admin_users, admin_actions, admin_approvals7
010010_support_notifications.sqlsupport_tickets, ticket_messages, ticket_attachments, disputes, notifications, platform_settings6
📘 sql/README.md
sql/README.md
কীভাবে চালাবেন, টেবিল-তালিকা, ডিজাইন সিদ্ধান্ত, যাচাইয়ের কমান্ড।
▶ run_up.sql
sql/run_up.sql
সব ১০টি মাইগ্রেশন একসাথে চালায়। mysql DB < run_up.sql
◀ run_down.sql
sql/run_down.sql
সব rollback একসাথে। ⚠️ সব ডেটা মুছে যাবে — আগে ব্যাকআপ নিন।
↩ 999_rollback_all.sql
sql/down/999_rollback_all.sql
পূর্ণ rollback — reverse dependency order-এ সব অবজেক্ট drop।

✅ যাচাই করা হয়েছে — আসল MariaDB 10.11-এ

  • সব ১০টি মাইগ্রেশন ক্লিন পাস → ৪৫ টেবিল, ২ ভিউ, ৪ ট্রিগার, ৭০ FK, ৪৪ CHECK
  • দ্বিতীয়বার চালালে কোনো এরর নেই (idempotency প্রমাণিত)
  • Rollback → ০ অবজেক্ট; আবার apply → ৪৫ টেবিল ফিরে আসে
  • Ledger-এ UPDATE/DELETE → trigger ব্লক করে; unbalanced batch → CHECK reject করে
০২

Double-Entry Ledger — Posting Logic

টাকা সরানোর একমাত্র পথ। প্রতিটি posting-এ Σ debit = Σ credit — এটা গাণিতিক বাধ্যবাধকতা, ডাটাবেস CHECK দিয়ে জোর করা। Ledger append-only: ভুল হলে reversal entry, কখনো update/delete নয়। কোড PHP-তে, কিন্তু প্রতিটি নিয়ম ভাষা-নিরপেক্ষ — যেকোনো স্ট্যাকে পোর্ট করা যায়।

📘 README.md
ledger/README.md
মূল ধারণা, ৫ ধরনের অ্যাকাউন্ট, immutability, idempotency, lock ordering, পোর্টিং নোট।
🐘 ChartOfAccounts.php
ledger/ChartOfAccounts.php
২৩টি অ্যাকাউন্ট কোড, type, normal balance, negative-allowed অ্যাকাউন্ট।
🐘 IdempotencyService.php
ledger/IdempotencyService.php
Retry নিরাপদ করা — same key + same payload → একবারই চলে, stored response ফেরত।
⭐ LedgerService.php
ledger/LedgerService.php
মূল ফাইল। Transaction wrapper, deterministic lock order, deadlock retry (jitter সহ), balance validation, posting।
🐘 PostingTemplates.php
ledger/PostingTemplates.php
৮টি রেসিপি: deposit, order buy/sell, withdrawal, refund, fee, gateway fee, adjustment।
🐘 BalanceService.php
ledger/BalanceService.php
Ledger থেকে balance derive, ক্যাশ তুলনা, reconciliation, trial balance, statement।
🐘 ReversalService.php
ledger/ReversalService.php
Immutable ledger — ভুল সংশোধনের একমাত্র পথ reversal entry। দুইবার reverse ব্লকড।
📄 example_order_flow.md
ledger/example_order_flow.md
একটা dollar buy order-এর ৬ ধাপ — কোন টেবিলে কী, কোন অ্যাকাউন্টে debit/credit, কেন।

একটা ১০০ USD কেনার পোস্টিং

রহিম ১০০ USD কিনবে · রেট ১২৪.০০ · fee ১৮৬.০০ · মোট ১২,৫৮৬.০০ BDT

BDT book  Batch LB-2026-000790 (order_buy, BDT)
─────────────────────────────────────────────────────────────
Debit   2000  Customer Wallet Liability        12,586.00   ← কাস্টমারের BDT কমল
Credit  1040  Payment Gateway Clearing         12,400.00   ← principal হস্তান্তর
Credit  4010  Revenue — Transaction Fee           186.00   ← আমাদের আয়
─────────────────────────────────────────────────────────────
Σ debit = 12,586.00    Σ credit = 12,586.00    ✅ balanced

USD book  Batch LB-2026-000791 (order_buy, USD)
─────────────────────────────────────────────────────────────
Debit   1040  Payment Gateway Clearing            100.00   ← USD হস্তান্তর
Credit  1030  Crypto Held (USD inventory)         100.00   ← আমাদের USD কমল
─────────────────────────────────────────────────────────────
Σ debit = 100.00       Σ credit = 100.00       ✅ balanced

কেন দুইটা batch?

"১২,৫৮৬ BDT" আর "১০০ USD" একসাথে যোগ করা যায় না — আলাদা একক। তাই প্রতিটি currency-র নিজের বই, আর 1040 FX Clearing দুইটাকে সেতু করে। এই অ্যাকাউন্টের balance-ই প্ল্যাটফর্মের খোলা FX পজিশন।

⚠️ Hold ledger-এ পোস্ট হয় না

অর্ডার প্লেস করলে টাকা সরাসরি কাটা যায় না — শুধু "আটকে" রাখা হয় (wallet_holds)। Hold কোনো টাকা সরায় না, তাই ledger-এ দিলে দুইটা canceling এন্ট্রি শুধু শব্দ বাড়াত। Ledger ছোঁয়া হয় শুধু hold capture হলে।

০৩

Security Launch-Gate Checklist

এটা একটা গেট, পরামর্শ নয়। ৯টি বিভাগে ১৩৫টি আইটেম — ১০৯টি BLOCKER (লঞ্চের আগে অবশ্যই) আর ২৬টি POST-LAUNCH (৩০ দিনের মধ্যে)। প্রতিটিতে আছে: কী করতে হবে, কীভাবে যাচাই করবেন (কমান্ড/টেস্ট), আর ফেল করলে কী ঝুঁকি।

🛡️ LAUNCH_GATE_CHECKLIST.md
security/LAUNCH_GATE_CHECKLIST.md
১৩৫টি আইটেম, ৯ বিভাগ, সাইন-অফ ফর্ম, আইনি সতর্কতা সহ।
📘 README.md
security/README.md
প্রক্রিয়া, প্রমাণ সংগ্রহ, অগ্রাধিকার ক্রম, যাচাইয়ের কমান্ড, সাধারণ ভুল।
বিভাগ🔴 BLOCKER🟡 POST-LAUNCHমোট
১. Authentication13215
২. Authorization9110
৩. Data Protection13316
৪. Application Security (OWASP)16319
৫. Fraud & AML12315
৬. Monitoring & Detection11314
৭. Backup & Disaster Recovery9211
৮. Compliance13417
৯. Operations13518
মোট10926135

⚠️ আইনি সতর্কতা — অবশ্যই পড়ুন

Dollar buy/sale প্ল্যাটফর্ম একটা আর্থিক সেবা। বাংলাদেশে এর জন্য Bangladesh Bank-এর লাইসেন্স লাগতে পারে (মানি চেঞ্জিং / money transmission)। লাইসেন্স ছাড়া চালানো ফৌজদারি দায় ডেকে আনতে পারে।

  • লঞ্চের আগে অবশ্যই একজন যোগ্য আইনজীবীর পরামর্শ নিন
  • Bangladesh Bank-এর সাথে লাইসেন্সযোগ্যতা লিখিতভাবে নিশ্চিত করুন
  • AML/CFT কমপ্লায়েন্স প্রোগ্রাম দাঁড় করান (MLRO নিয়োগ সহ)
  • ট্যাক্স/VAT রেজিস্ট্রেশন সম্পন্ন করুন

এই ডকুমেন্টগুলো ইঞ্জিনিয়ারিং ডকুমেন্টেশন, আইনি পরামর্শ নয় — কোনো আইনি ঝুঁকি থেকে মুক্তি দেয় না।

০৪

কীভাবে ব্যবহার করবেন

১. ডাটাবেস দাঁড় করান

mysql -u USER -p DB_NAME < sql/run_up.sql — ৪৫ টেবিল তৈরি হবে। ভুল হলে sql/run_down.sql দিয়ে সব ফেরানো যাবে।

২. Ledger কোড বসান

ledger/ ফোল্ডারের ৬টি PHP ক্লাস আপনার অ্যাপে রাখুন। প্রথমে ledger/README.md পড়ুন — বিশেষত lock ordering আর decimal নিয়ে। অন্য স্ট্যাক হলে পোর্টিং নোট দেখুন।

৩. নিরাপত্তা গেট পার করুন

security/LAUNCH_GATE_CHECKLIST.md খুলুন। ১০৯টি BLOCKER-এর প্রতিটি যাচাই করুন, প্রমাণ সংরক্ষণ করুন, শেষে সাইন-অফ করুন। এটা পাস না হলে লঞ্চ নয়।

⚠️ যা এখনো নেই (ইচ্ছাকৃতভাবে)

এটা MVP-র ভিত্তি, পূর্ণ অ্যাপ নয়। এখনো বাকি: HTTP রাউট/কন্ট্রোলার, UI (mobile + PC), payment gateway ইন্টিগ্রেশন (bKash/Nagad), KYC প্রোভাইডার, ইমেইল/SMS, admin panel-এর UI, আর deployment (subdomain, SSL, CI/CD)। এগুলো পরের ধাপ।