Two-tier Central Bank Digital Currency (CBDC) simulation platform untuk pengujian integrasi end-to-end.
- 🎯 Tentang Proyek
- ✨ Highlights v2.0 — Fitur Baru
- 🏗️ Arsitektur
- 📚 Dokumentasi Service
- 🚀 Quick Start
- 📋 Prasyarat
- 🔐 Akun Pengujian
- 🎛️ Fitur Admin Bank Sentral
- 🧪 Testing Manual
- 🔌 API Reference
- 💰 Aturan Finansial
- 🛠️ Troubleshooting
- 📂 Struktur Direktori
- 🤝 Kontribusi
- 📄 Lisensi
SmartBank adalah simulasi two-tier Central Bank Digital Currency (CBDC) yang menggabungkan empat service独立 ke dalam satu platform terorkestrasi:
| Service | Tech | Port | Peran |
|---|---|---|---|
| Frontend | Next.js 14 | 3001 | UI untuk semua role (Retail, Teller, Manager, Admin) |
| API Gateway | Express.js | 4000 | Pintu masuk tunggal, routing, rate limit, validasi header |
| Wallet Backend | Express.js | 6969 | Akun, transfer, payment request, loan |
| Central Bank Core | NestJS + Prisma | 3000 | Settlement engine, monetary policy, audit trail |
⚠️ Proyek ini ditujukan untuk simulasi akademis dan bukan sistem perbankan produksi.
Versi terbaru menambahkan 5 fitur admin bank sentral lengkap dengan dashboard UI:
| # | Fitur | Endpoint | Dashboard | Tujuan Bisnis |
|---|---|---|---|---|
| 1 | 💸 Issuance | POST /central-bank/issuance |
/admin/issuance |
Cetak CBDC baru dari reserve |
| 2 | 🔥 Burn | POST /central-bank/burn |
/admin/burn |
Musnahkan CBDC → sink account |
| 3 | ⏪ Reversal | POST /central-bank/reversals |
/admin/reversal |
Batalkan transaksi SETTLED |
| 4 | ⚙️ Fee Config | GET/PUT /central-bank/fees |
/admin/fee |
Atur fee FLAT/PERCENT per jenis transaksi |
| 5 | 📜 Audit Log | GET /central-bank/audit-logs |
/admin/audit |
Browse jejak audit seluruh sistem |
Plus: Supply Monitor dengan invariant check, Ledger Browser dengan filter, Dashboard overhaul dengan role-based sidebar.
Lihat 🎛️ Fitur Admin Bank Sentral untuk detail lengkap.
flowchart LR
U["User / API Client"] --> F["Frontend :3001"]
U --> G["API Gateway :4000"]
F --> G
G --> W["Wallet Backend :6969"]
G --> C["Central Bank Core :3000"]
W --> C
W --> D[("MySQL :3306")]
C --> D
Untuk pemakaian normal, frontend dan API client harus mengakses backend melalui
API Gateway. Port 3000 dan 6969 tetap diekspos untuk health check, debugging,
dan Swagger lokal.
| Layer | Tools |
|---|---|
| Frontend | Next.js 14, React, TypeScript, Tailwind CSS, Framer Motion, Lucide Icons |
| API Gateway | Express.js, Axios, Rate Limiting |
| Wallet Backend | Express.js, JWT, bcrypt, Multer, Swagger |
| Central Bank | NestJS, Prisma ORM, MySQL 8, class-validator |
| Database | MySQL 8 dengan Prisma migrations |
| Container | Docker Compose (multi-stage build) |
Dokumentasi detail per service dan operational guide. README utama ini hanya high-level overview — lihat doc terkait untuk deep-dive.
| Doc | Isi | Untuk siapa |
|---|---|---|
Central-Bank/README.md |
Arsitektur, financial invariants, endpoint list, Prisma migration guide, schema, local setup | Backend developer / Prisma contributor |
DOCKER_SETUP.md |
Full Docker Compose deployment (5 service), env vars, Prisma di Docker, troubleshooting, production hardening | DevOps / deployer / hosting |
dokumentasi-lokal.md |
Setup tanpa Docker (Laragon + MySQL lokal Windows) | Frontend-only developer / akademik |
Connector/CONNECTOR_SETUP.md |
Setup Connector lokal dan Docker, provisioning API key, wallet linking, pembayaran, troubleshooting | Integrator POS/Marketplace |
AUDIT_REPORT.md |
Audit keamanan & kualitas kode | Reviewer / auditor |
PR.md |
Ringkasan PR & changelog | Maintainer / kontributor |
| Service | Tech | Port | Dokumentasi |
|---|---|---|---|
| Central-Bank | NestJS + Prisma | 3000 | Central-Bank/README.md + AGENTS.md |
| Wallet | Express + mysql2 | 6969 | Belum ada README — lihat source di Wallet/ (entrypoint: server.js) |
| Gateway | Express | 4000 | Belum ada README — lihat source di Gateway/ (entrypoint: server.js) |
| Frontend | Next.js 14 | 3001 | Belum ada README — lihat source di frontend/src/ |
| MySQL | mysql:8.0 | 3301 | Config via docker-compose.yml |
Tip: Wallet/Gateway/Frontend belum punya README service-level. Kalau mau kontribusi, buat
README.mddi masing-masing folder mengikuti template Central-Bank/README.md (Architecture → Setup → API → Schema).
git clone https://github.com/RPL2-Becode/SmartBank.git
cd SmartBank
cp .env.example .env # atau buat manual
docker compose up -d --build --waitAkses:
| Layanan | URL |
|---|---|
| Frontend | http://localhost:3001 |
| API Gateway | http://localhost:4000/health |
| Wallet Swagger | http://localhost:6969/api-docs |
| Central Bank Health | http://localhost:3000/api/v1/health |
Lihat dokumentasi-lokal.md untuk panduan lengkap.
- Docker Desktop dengan Docker Compose (untuk full stack)
- PowerShell untuk menjalankan contoh API pada README ini
- Node.js 20.x+ dan pnpm 9.x (untuk development tanpa Docker)
- MySQL 8.x (untuk development tanpa Docker)
- Port
3000,3001,3306,4000,6969tidak sedang dipakai
Pastikan file .env tersedia di root proyek:
# MySQL
MYSQL_ROOT_PASSWORD=ganti_dengan_password_root
MYSQL_DATABASE=central_bank_core
MYSQL_USER=central_bank
MYSQL_PASSWORD=ganti_dengan_password_database
# Auth
JWT_SECRET=ganti_dengan_secret_acak_minimal_32_karakter
# Seeding
ENABLE_STAFF_SEED=true
# Frontend
NEXT_PUBLIC_API_BASE_URL=http://localhost:4000🔒 Jangan commit file
.envyang berisi kredensial asli.
Jika ENABLE_STAFF_SEED=true, Wallet membuat akun staf berikut saat startup:
| Role | Password | PIN | |
|---|---|---|---|
| Teller | teller@test.com |
password |
123456 |
| Manager | manager@test.com |
password |
123456 |
| Central Bank Admin | admin@test.com |
password |
123456 |
Akun Retail dibuat melalui halaman Register (/register). Registrasi publik
selalu membuat role WALLET_USER dan memberikan saldo awal Rp 50.000.
| Role | Routes |
|---|---|
| Retail | /dashboard, /transfer, /kyc, /pinjaman, /aktivitas |
| Teller | /teller/nasabah, /teller/operasi |
| Manager | /manager/risiko, /manager/pinjaman |
| Central Bank Admin | /admin, /admin/ledger, /admin/reversal, /admin/issuance, /admin/burn, /admin/fee, /admin/audit |
Semua fitur di bawah ini hanya dapat diakses oleh role CENTRAL_BANK_ADMIN
melalui sidebar /admin/*. Setiap aksi akan otomatis teraudit di tabel
audit_logs dan tercatat di tabel monetary_policy_events.
Apa gunanya? Menambah uang digital ke wallet tujuan dari reserve bank sentral.
Total supply bertambah. Tercatat sebagai MonetaryPolicyEvent dengan eventType = ISSUANCE.
Cara Pakai:
- Buka
/admin/issuance - Pilih wallet target dari dropdown WalletPicker
- Isi nominal dalam IDR (integer)
- Isi reason code (default:
MONETARY_EXPANSION) - (Opsional) Tambah catatan
- Klik "Proses issuance"
Validasi:
- Nominal harus angka positif
- Wallet target harus ada dan aktif
- Reserve harus memiliki saldo cukup
Apa yang terjadi di backend:
CENTRAL_RESERVE → DEBIT (uang keluar dari reserve)
target_wallet → CREDIT (uang masuk ke wallet tujuan)
Contoh kasus: Stimulus ekonomi, hibah pemerintah ke wallet tertentu, top-up darurat ke merchant.
Apa gunanya? Menarik uang digital dari wallet USER/MERCHANT dan masuk ke
BURN_OR_SINK_ACCOUNT. Total supply berkurang. Tercatat sebagai
MonetaryPolicyEvent dengan eventType = BURN.
Cara Pakai:
- Buka
/admin/burn - Pilih wallet sumber dari WalletPicker
- Isi nominal
- Reason code default:
MONETARY_CONTRACTION - Submit
Validasi:
- Hanya wallet
USER_WALLETatauMERCHANT_WALLETyang bisa di-burn - Akun sistem (reserve, fee, sink, dll) akan ditolak dengan
BURN_ACCOUNT_INVALID - Wallet sumber harus memiliki saldo cukup
Contoh kasus: Sanksi wallet fraud, tarik uang dari merchant nakal, kontraksi moneter.
Apa gunanya? Membatalkan transaksi yang sudah SETTLED. Semua entry
ledger dibalik (DEBIT ↔ CREDIT). Tercatat sebagai transaksi baru dengan
transactionType = REVERSAL yang menunjuk ke transaksi asal.
Cara Pakai:
- Buka
/admin/reversal - Pilih transaksi asal dari TransactionPicker
- Reason code default:
ADMIN_CORRECTION(wajib diisi) - (Opsional) Catatan
- Submit
Validasi:
- Hanya transaksi
SETTLEDyang bisa di-reverse - Transaksi yang sudah pernah di-reverse → ditolak
REVERSAL_NOT_ALLOWED - Type yang bisa di-reverse: TOP_UP, WITHDRAWAL, TRANSFER, PAYMENT, LOAN_DISBURSEMENT, LOAN_REPAYMENT, INITIAL_DISTRIBUTION, ISSUANCE, BURN
Apa yang terjadi:
- Entry ledger lama dibalik
- Transaksi baru
REVERSALdibuat,originalTransactionIdmenunjuk ke asal - Transaksi asal di-update jadi
REVERSED - Audit log:
TRANSACTION_REVERSED
Contoh kasus: Salah nominal transfer, fraud terdeteksi, koreksi kesalahan admin.
Apa gunanya? Admin bisa mengatur biaya transaksi per jenis transaksi, dengan mode FLAT (nominal tetap IDR) atau PERCENT (basis points, 100 bps = 1%).
Cara Pakai:
- Buka
/admin/fee - Lihat tabel fee aktif di atas
- Di form upsert:
- Pilih jenis transaksi (TOP_UP / WITHDRAWAL / TRANSFER / PAYMENT)
- Pilih mode: FLAT (IDR) atau PERCENT (bps)
- Isi value — nominal atau basis points
- Untuk PERCENT → bisa set min fee dan max fee opsional
- Centang aktif
- Klik "Simpan fee"
- Untuk edit → klik tombol Edit di tabel, form auto-fill
Contoh Setting:
| Jenis | Mode | Value | Min/Max | Arti |
|---|---|---|---|---|
| TRANSFER | FLAT | 5000 | — | Tiap transfer kena fee Rp 5.000 |
| PAYMENT | PERCENT | 250 | min 1000, max 50000 | Fee 2.5%, min Rp 1.000, max Rp 50.000 |
| TOP_UP | FLAT | 0 | — | Gratis top-up |
| WITHDRAWAL | PERCENT | 100 | — | Fee 1% withdrawal |
Validasi:
- Value tidak boleh negatif
- PERCENT max 10000 bps (100%)
- Type harus valid (TOP_UP/WITHDRAWAL/TRANSFER/PAYMENT)
Apa gunanya? Browser semua jejak audit seluruh sistem — siapa ngapain, kapan, target apa. Penting untuk compliance & forensik.
Cara Pakai:
- Buka
/admin/audit - Search box → cari di actor, action, target, request ID
- Service dropdown → filter CENTRAL-BANK, SETTLEMENT, MONEY, FEES, dll
- Klik baris mana saja → expand untuk lihat metadata JSON lengkap
Informasi per baris:
| Kolom | Keterangan |
|---|---|
| Waktu | Kapan terjadi |
| Aktor | Siapa (UUID user / "system") |
| Service | Layanan mana (centralbank-core, dll) |
| Aksi | Apa yang terjadi (TRANSFER_SETTLED, ISSUANCE_SETTLED, dll) |
| Target | Tipe + ID (transaction/loan/wallet) |
| Reason | Reason code jika ada |
| Expand | Request ID, Actor full, Target ID, Metadata JSON |
Apa gunanya? Pantauan supply uang digital secara real-time dengan invariant check untuk mendeteksi anomali.
Cara Pakai: Buka /admin (default landing untuk admin).
Yang ditampilkan:
- Total supply — nilai target (default Rp 1 Miliar)
- Reserve balance — saldo di
CENTRAL_RESERVE - Circulating supply — total saldo wallet user/merchant aktif
- Sink/burn accounting — saldo di
BURN_OR_SINK_ACCOUNT - Invariant ledger — badge VALID / PERLU INVESTIGASI
Invariant: reserve + circulating + sink === totalSupply
Apa gunanya? Penelusuran ledger entries untuk audit atau debugging.
Cara Pakai:
- Buka
/admin/ledger - Filter by account ID atau transaction ID (opsional)
- Klik Cari
docker compose ps— semua service harusUpdanhealthy- Buka http://localhost:4000/health — respons
success: true - Buka http://localhost:3001 — frontend dapat diakses
- Buka
http://localhost:3001/register - Isi nama, email, nomor telepon, password ≥ 8 karakter, PIN 6 digit
- Daftarkan User A, catat email & PIN-nya
- Logout, ulangi untuk User B
- Setelah registrasi, saldo awal harus
Rp 50.000 - Upload dokumen KYC di menu
Verifikasi KYCatau/kyc - Status tetap
BASICsampai Teller verifikasi
- Login
teller@test.com/password - Cari User A via email/telepon/User ID
- Periksa dokumen identitas
- Isi reason code, klik verifikasi KYC → status jadi
VERIFIED - Lakukan top-up (misal 100000)
- Lakukan withdraw (misal 10000)
- Cari User B, catat Wallet ID-nya
- Login sebagai User A
- Buka menu
Transfer, masukkan Wallet ID User B - Isi nominal, catatan, PIN User A
- Klik
Kirim dana - Pastikan sukses dan transaksi baru tampil di Aktivitas
- Login sebagai User B, pastikan saldo & riwayat bertambah
- User A ajukan pinjaman (misal 10000)
- Login
manager@test.com, buka/manager/pinjaman - Approve atau reject dengan reason code
- Jika disetujui, User A saldo bertambah
- Pembayaran lewat
/pinjaman
- Login
admin@test.com - Buka
/admin→ lihat supply & invariant - Buka
/admin/issuance→ cetak CBDC ke wallet User A - Buka
/admin/burn→ musnahkan sebagian dari User B - Buka
/admin/reversal→ reverse transaksi issuance tadi - Buka
/admin/fee→ set fee TRANSFER 1% - Buka
/admin/audit→ browse semua aksi yang baru dilakukan
- ✅ Semua halaman utama terbuka tanpa error
502 - ✅ Registrasi menghasilkan akun Retail dengan saldo awal
- ✅ Nasabah dapat upload KYC, Teller verifikasi
- ✅ Nasabah
BASICtidak bisa ajukan pinjaman, max saldo Rp 100.000 - ✅ Teller bisa top-up, withdraw, verifikasi KYC
- ✅ Transfer kurangi saldo pengirim, tambah saldo penerima
- ✅ Loan approval cairkan dana, reject tidak
- ✅ Suspend blokir login, activate pulihkan
- ✅ Admin bisa issuance, burn, reversal, set fee, browse audit log
- ✅ Supply invariant selalu VALID
| API | Base URL melalui Gateway |
|---|---|
| Wallet | http://localhost:4000/api/wallet/v1 |
| Central Bank | http://localhost:4000/api/bank |
Gateway menghapus prefix tersebut sebelum meneruskan ke service tujuan.
| Header | Kapan digunakan |
|---|---|
Authorization: Bearer <token> |
Semua endpoint protected |
Content-Type: application/json |
Request dengan JSON body |
Idempotency-Key: <uuid> |
Operasi finansial & mutasi penting (otomatis di-generate frontend) |
X-Wallet-Pin: <6 digit> |
Transfer, top-up, withdraw, payment request |
X-Request-Id: <uuid> |
Opsional untuk pelacakan log |
{
"success": true,
"data": {},
"error": null,
"meta": {
"request_id": "req_example",
"timestamp": "2026-06-11T00:00:00.000Z"
}
}Error:
{
"success": false,
"data": null,
"error": {
"code": "BAD_REQUEST",
"message": "Data tidak valid",
"details": {}
},
"meta": {
"request_id": "req_example",
"timestamp": "2026-06-11T00:00:00.000Z"
}
}Gateway membatasi ~100 request per menit per client.
| Method | Path | Akses | Body/Parameter |
|---|---|---|---|
POST |
/auth/register |
Public | name, email, phone, password, pin |
POST |
/auth/login |
Public | email, password |
GET |
/wallets/me/balance |
JWT | — |
GET |
/wallets/me/transactions |
JWT | — |
PUT |
/wallets/me/kyc-document |
JWT | documentType, documentNumber, documentName, documentDataUrl |
POST |
/wallets/me/topup |
JWT + PIN | amount |
POST |
/wallets/me/withdraw |
JWT + PIN | amount |
POST |
/transfers |
JWT + PIN + Idempotency | to_wallet_id, amount, opsional note |
POST |
/loans/apply |
JWT + Idempotency | amount |
POST |
/loans/:id/repay |
JWT + Idempotency | amount |
| Method | Path | Role | Body/Query |
|---|---|---|---|
POST |
/auth/register |
Public | name, email, password |
POST |
/auth/login |
Public | email, password |
GET |
/health |
JWT via Gateway | — |
POST |
/fees/quote |
JWT via Gateway | source_app, amount |
POST |
/transfers |
Wallet User + Idempotency | to_wallet_id, amount, note |
POST |
/payment-requests |
Wallet User + Idempotency | payer, payee, gross_amount, expires_at |
POST |
/payment-requests/:id/pay |
Wallet User + Idempotency | path id |
POST |
/loans/apply |
Wallet User + Idempotency | amount |
POST |
/loans/:id/repay |
Wallet User + Idempotency | amount |
GET |
/teller/customer?query=... |
Teller/Manager | email/phone/userId |
POST |
/teller/kyc/verify |
Teller/Manager | userId, reasonCode |
POST |
/teller/top-up |
Teller/Manager + Idempotency | userId, amount, reasonCode |
POST |
/teller/withdraw |
Teller/Manager + Idempotency | userId, amount, reasonCode |
POST |
/manager/users/suspend |
Manager | userId, reasonCode |
POST |
/manager/users/activate |
Manager | userId, reasonCode |
GET |
/manager/loans/pending |
Manager | — |
POST |
/manager/loans/approve |
Manager + Idempotency | loanId, reasonCode |
POST |
/manager/loans/reject |
Manager + Idempotency | loanId, reasonCode |
🆕 GET |
/central-bank/supply |
Admin | — |
🆕 GET |
/central-bank/ledger |
Admin | account_id, transaction_id, from, to |
🆕 GET |
/central-bank/wallets |
Admin | account_type, search |
🆕 GET |
/central-bank/transactions |
Admin | limit |
🆕 POST |
/central-bank/issuance |
Admin + Idempotency | target_wallet_id, amount, reason_code, note |
🆕 POST |
/central-bank/burn |
Admin + Idempotency | source_wallet_id, amount, reason_code, note |
🆕 POST |
/central-bank/reversals |
Admin + Idempotency | original_transaction_id, reason_code, note |
🆕 GET |
/central-bank/fees |
Admin | — |
🆕 GET |
/central-bank/fees/:type |
Admin | path type |
🆕 PUT |
/central-bank/fees |
Admin | type, mode, value, min_fee, max_fee, is_active |
🆕 GET |
/central-bank/audit-logs |
Admin | search, service_name, limit |
$baseUrl = "http://localhost:4000"
# Login admin
$login = Invoke-RestMethod `
-Method Post `
-Uri "$baseUrl/api/bank/auth/login" `
-ContentType "application/json" `
-Body (@{ email = "admin@test.com"; password = "password" } | ConvertTo-Json)
$token = $login.data.accessToken
$authHeaders = @{ Authorization = "Bearer $token"; "Idempotency-Key" = ([guid]::NewGuid()) }
# Cek supply
Invoke-RestMethod -Uri "$baseUrl/api/bank/central-bank/supply" -Headers $authHeaders
# Issuance 100000 ke wallet
$issuanceBody = @{
target_wallet_id = "wal_user_id"
amount = "100000"
reason_code = "MANUAL_TEST"
} | ConvertTo-Json
Invoke-RestMethod `
-Method Post `
-Uri "$baseUrl/api/bank/central-bank/issuance" `
-Headers $authHeaders `
-ContentType "application/json" `
-Body $issuanceBody| Parameter | Default | Keterangan |
|---|---|---|
| Saldo awal user | Rp 50.000 |
Dikreditkan saat registrasi |
| Limit saldo BASIC | Rp 100.000 |
Nasabah KYC BASIC dibatasi |
| Total money supply | Rp 1.000.000.000 |
Hardcoded di TOTAL_MONEY_SUPPLY |
| Maksimum pinjaman | Rp 100.000 |
Default |
| Bunga pinjaman | 10% (flat) | |
| Limit transaksi harian | 10 transaksi | Default, env-configurable |
| Cooldown transaksi | 10 detik | Default, env-configurable |
| Fee default | 0 (FLAT) | Dikonfigurasi via /admin/fee |
Nilai aktual dapat diubah melalui environment variable pada docker-compose.yml.
docker compose ps
docker compose logs --tail 200 mysql
docker compose logs --tail 200 central-bank
docker compose logs --tail 200 wallet
docker compose logs --tail 200 gateway
docker compose logs --tail 200 frontend- Pastikan Gateway, Wallet, dan Central Bank berstatus healthy
- Periksa
NEXT_PUBLIC_API_BASE_URL=http://localhost:4000 - Rebuild frontend:
docker compose up -d --build --wait frontend
- Pastikan
.envberisiENABLE_STAFF_SEED=true - Restart Wallet:
docker compose restart wallet
Tunggu minimal 10 detik sebelum transaksi berikutnya. Jika batas harian tercapai, gunakan akun uji lain atau reset volume database.
cd Central-Bank
npx prisma db push # sinkron schema tanpa migration filedocker ps
Get-NetTCPConnection -State Listen | Where-Object LocalPort -In 3000,3001,3306,4000,6969SmartBank/
├── Central-Bank/ # NestJS Central Bank Core
│ ├── prisma/
│ │ ├── schema.prisma # Database schema (Fee, Audit, MonetaryEvent)
│ │ └── migrations/ # SQL migration files
│ ├── src/
│ │ ├── common/ # AppError, ErrorCode, decorators
│ │ ├── modules/
│ │ │ ├── central-bank/ # Controller, DTO, MonetaryPolicyService
│ │ │ ├── settlement/ # SettlementService (issuance, burn, reversal)
│ │ │ ├── fees/ # FeeQuoteService
│ │ │ ├── audit/ # AuditLogService
│ │ │ └── prisma/ # PrismaService
│ │ └── main.ts
│ └── test/ # Jest unit + integration tests
├── Wallet/ # Express Wallet Backend
│ ├── src/
│ │ ├── routes/ # auth, wallet, transfer, loan
│ │ └── swagger/ # OpenAPI docs
│ └── Dockerfile
├── Gateway/ # Express API Gateway
│ ├── src/
│ │ ├── routes/ # /api/wallet, /api/bank
│ │ └── middleware/ # rate limit, auth
│ └── Dockerfile
├── frontend/ # Next.js role-based frontend
│ ├── src/
│ │ ├── app/
│ │ │ └── admin/ # Admin dashboards (supply, ledger, issuance, burn, fee, audit)
│ │ ├── components/
│ │ │ ├── dashboards/ # Admin*.tsx components
│ │ │ └── admin/ # WalletPicker, TransactionPicker
│ │ └── lib/ # fetchApi, auth store
│ └── Dockerfile
├── docker-compose.yml # Orkestrasi seluruh service
├── .env.example # Template environment variables
├── README.md # Dokumentasi ini
├── LICENSE # MIT License
├── CODE_OF_CONDUCT.md # Contributor Covenant v2.1
└── CONTRIBUTING.md # Panduan kontribusi
Kontribusi selalu diterima! Lihat CONTRIBUTING.md untuk panduan lengkap tentang:
- 🐛 Lapor bug atau request fitur
- 🔀 Cara membuat Pull Request
- 🏗️ Setup development environment
- 📏 Konvensi kode & commit message
- ✅ Pull request checklist
Proyek ini mengikuti Contributor Covenant Code of Conduct.
git clone https://github.com/RPL2-Becode/SmartBank.git
cd SmartBank
git checkout -b feat/nama-fitur-anda
# ... lakukan perubahan ...
git commit -m "feat(scope): deskripsi perubahan"
git push origin feat/nama-fitur-anda
# buka Pull Request via GitHubDidistribusikan di bawah MIT License. Lihat LICENSE untuk detail.
MIT License - Copyright (c) 2026 RPL2-Becode
- Built with ❤️ by RPL2-Becode
- Powered by NestJS, Next.js, Prisma, and MySQL
- Icons by Lucide
- Mermaid diagrams by Mermaid
Made with TypeScript, NestJS, Next.js, Prisma & MySQL