ডাটাবেস মাইগ্রেশন (SQL)
MySQL/MariaDB-র জন্য ১০টি মাইগ্রেশন, column-level সংজ্ঞা সহ — index, foreign key, CHECK constraint,
আর immutability trigger। প্রতিটি idempotent (IF NOT EXISTS), তাই বারবার চালানো নিরাপদ।
প্রতিটির জন্য আলাদা rollback স্ক্রিপ্টও আছে।
| # | ফাইল | যা তৈরি করে | টেবিল |
|---|---|---|---|
| 001 | 001_users.sql | users, user_devices, user_sessions, password_resets, otp_codes, login_attempts | 6 |
| 002 | 002_kyc.sql | kyc_verifications, kyc_documents, kyc_limits | 3 |
| 003 | 003_bank_accounts.sql | bank_accounts (encrypted), payout_methods, bank_account_events | 3 |
| 004 | 004_wallets.sql | wallets, wallet_balances, wallet_holds, wallet_balance_snapshots | 4 |
| 005 | 005_rates.sql | rate_sources, exchange_rates, rate_history, rate_quotes | 4 |
| 006 | 006_orders.sql | orders, order_items, order_status_history, order_attachments | 4 |
| 007 | 007_transactions.sql | transactions, transaction_events, idempotency_keys, webhook_events | 4 |
| 008 | 008_ledger_entries.sql | ledger_accounts, ledger_batches, ledger_entries + ২ ভিউ + ২ trigger | 4 |
| 009 | 009_audit_logs.sql | audit_logs (hash-chained), admin_roles, admin_permissions, admin_users, admin_actions, admin_approvals | 7 |
| 010 | 010_support_notifications.sql | support_tickets, ticket_messages, ticket_attachments, disputes, notifications, platform_settings | 6 |
✅ যাচাই করা হয়েছে — আসল 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-তে, কিন্তু প্রতিটি নিয়ম ভাষা-নিরপেক্ষ — যেকোনো স্ট্যাকে পোর্ট করা যায়।
একটা ১০০ 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 (৩০ দিনের মধ্যে)। প্রতিটিতে আছে: কী করতে হবে, কীভাবে যাচাই করবেন (কমান্ড/টেস্ট), আর ফেল করলে কী ঝুঁকি।
| বিভাগ | 🔴 BLOCKER | 🟡 POST-LAUNCH | মোট |
|---|---|---|---|
| ১. Authentication | 13 | 2 | 15 |
| ২. Authorization | 9 | 1 | 10 |
| ৩. Data Protection | 13 | 3 | 16 |
| ৪. Application Security (OWASP) | 16 | 3 | 19 |
| ৫. Fraud & AML | 12 | 3 | 15 |
| ৬. Monitoring & Detection | 11 | 3 | 14 |
| ৭. Backup & Disaster Recovery | 9 | 2 | 11 |
| ৮. Compliance | 13 | 4 | 17 |
| ৯. Operations | 13 | 5 | 18 |
| মোট | 109 | 26 | 135 |
⚠️ আইনি সতর্কতা — অবশ্যই পড়ুন
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)। এগুলো পরের ধাপ।