๐งฑ ERD โ TokoFlow
1. ๐ Ringkasan
Entity Relationship Diagram (ERD) TokoFlow menggambarkan struktur database untuk sistem manajemen toko berbasis Software as a Service (SaaS).
Setiap akun pengguna (owner) memiliki satu atau lebih toko (store) dalam satu lingkungan cloud (multi-tenant).
Semua data penjualan, stok, dan user disimpan terisolasi per toko untuk menjaga keamanan dan privasi data antar pengguna.
2. ๐ Daftar Entitas & Relasi
2.1 ๐ค Users
| Kolom |
Tipe |
Keterangan |
id |
UUID |
Primary key |
fullName |
string |
Nama lengkap |
email |
string |
Unik, digunakan untuk login |
passwordHash |
string |
Disimpan dalam bentuk hash |
role |
enum |
owner / admin / kasir |
storeId |
UUID (nullable) |
FK โ stores.id (user terikat ke toko) |
planId |
UUID (nullable) |
FK โ subscription_plans.id |
isActive |
boolean |
Default: true |
createdAt |
datetime |
- |
updatedAt |
datetime |
- |
๐ก Owner dapat memiliki banyak toko (multi-store), sementara admin dan kasir hanya terikat ke satu toko.
2.2 ๐ฌ Stores
| Kolom |
Tipe |
Keterangan |
id |
UUID |
Primary key |
ownerId |
UUID |
FK โ users.id |
name |
string |
Nama toko |
address |
string |
Alamat toko |
phone |
string |
Opsional |
isActive |
boolean |
Default: true |
createdAt |
datetime |
- |
updatedAt |
datetime |
- |
๐ Relasi:
- Users (owner) โ Stores (one-to-many)
- Stores โ Products, Sales, Inventory (one-to-many)
2.3 ๐๏ธ Categories
| Kolom |
Tipe |
Keterangan |
id |
UUID |
Primary key |
storeId |
UUID |
FK โ stores.id |
name |
string |
Unik per toko |
createdAt |
datetime |
- |
updatedAt |
datetime |
- |
2.4 ๐ฆ Products
| Kolom |
Tipe |
Keterangan |
id |
UUID |
Primary key |
storeId |
UUID |
FK โ stores.id |
sku |
string |
Unik per toko |
name |
string |
Nama produk |
categoryId |
UUID (nullable) |
FK โ categories.id |
unit |
string |
pcs / box / pack |
costPrice |
decimal |
Harga modal |
salePrice |
decimal |
Harga jual |
barcode |
string |
Opsional |
isActive |
boolean |
Default: true |
createdAt |
datetime |
- |
updatedAt |
datetime |
- |
2.5 ๐ Inventory (Mutasi Stok)
| Kolom |
Tipe |
Keterangan |
id |
UUID |
Primary key |
storeId |
UUID |
FK โ stores.id |
productId |
UUID |
FK โ products.id |
type |
enum |
IN / OUT / ADJUST / TRANSFER |
quantity |
integer |
Jumlah stok berubah |
reference |
string |
Referensi transaksi / dokumen |
reason |
string |
Keterangan opsional |
createdBy |
UUID |
FK โ users.id |
createdAt |
datetime |
- |
2.6 ๐ฐ Sales (Transaksi Penjualan)
| Kolom |
Tipe |
Keterangan |
id |
UUID |
Primary key |
storeId |
UUID |
FK โ stores.id |
userId |
UUID |
FK โ users.id (kasir/admin) |
customerId |
UUID (nullable) |
FK โ customers.id |
total |
decimal |
Total transaksi |
paymentMethod |
enum |
cash / transfer / qris |
status |
enum |
SAVED / DRAFT / CANCELLED |
notes |
string |
Opsional |
createdAt |
datetime |
- |
updatedAt |
datetime |
- |
2.7 ๐งพ Sales Details
| Kolom |
Tipe |
Keterangan |
id |
UUID |
Primary key |
saleId |
UUID |
FK โ sales.id |
productId |
UUID |
FK โ products.id |
sku |
string |
Duplikat dari produk |
name |
string |
Duplikat dari produk |
quantity |
integer |
Jumlah barang |
unitPrice |
decimal |
Harga per item |
discount |
decimal |
Opsional |
total |
decimal |
(quantity ร unitPrice) - discount |
2.8 ๐ Audit Trail
| Kolom |
Tipe |
Keterangan |
id |
UUID |
Primary key |
userId |
UUID |
FK โ users.id |
module |
string |
PRODUCT / SALES / INVENTORY / AUTH |
action |
string |
CREATE / UPDATE / DELETE / LOGIN |
before |
JSON |
Data sebelum perubahan |
after |
JSON |
Data sesudah perubahan |
meta |
JSON |
IP, userAgent |
createdAt |
datetime |
- |
2.9 ๐ณ Subscription Plans (SaaS Specific)
| Kolom |
Tipe |
Keterangan |
id |
UUID |
Primary key |
name |
string |
Nama paket (Free, Basic, Pro) |
price |
decimal |
Harga per bulan |
storeLimit |
integer |
Jumlah toko maksimum |
productLimit |
integer |
Jumlah produk maksimum |
userLimit |
integer |
Jumlah user maksimum |
features |
JSON |
Daftar fitur aktif |
createdAt |
datetime |
- |
2.10 ๐ Subscriptions
| Kolom |
Tipe |
Keterangan |
id |
UUID |
Primary key |
userId |
UUID |
FK โ users.id (owner) |
planId |
UUID |
FK โ subscription_plans.id |
status |
enum |
ACTIVE / EXPIRED / CANCELLED |
startDate |
datetime |
- |
endDate |
datetime |
- |
paymentReference |
string |
ID dari Midtrans / Xendit |
createdAt |
datetime |
- |
3. ๐ Hubungan Antar Entitas (Ringkasan)
| Relasi |
Jenis |
Deskripsi |
| Users โ Stores |
One-to-Many |
Owner bisa punya banyak toko |
| Stores โ Products |
One-to-Many |
Tiap toko punya daftar produk sendiri |
| Products โ Inventory |
One-to-Many |
Setiap produk memiliki mutasi stok |
| Sales โ SalesDetails |
One-to-Many |
Setiap transaksi punya banyak item |
| Sales โ Users |
Many-to-One |
Transaksi dilakukan oleh kasir/admin |
| Users โ SubscriptionPlans |
Many-to-One |
Tiap owner terikat ke satu paket langganan |
| AuditTrail โ Users |
Many-to-One |
Log aktivitas oleh user tertentu |
4. ๐๏ธ Model Multi-Tenant
TokoFlow menggunakan pendekatan single database, isolated by storeId:
- Semua tabel utama (
products, sales, inventory, dll.) memiliki kolom storeId.
- Setiap pengguna (admin/kasir) hanya dapat mengakses data yang terkait dengan
storeId mereka.
- Owner dapat melihat data lintas toko.
Keuntungan:
- โก Skalabilitas tinggi (1 database untuk banyak tenant)
- ๐พ Hemat resource (dibanding 1 DB per toko)
- ๐ง Mudah dikelola & di-backup
5. ๐ง Catatan Implementasi
- ORM: Sequelize (Node.js)
- Database: PostgreSQL
- Schema: Public, dengan
storeId sebagai foreign key di semua entitas operasional
- Autentikasi: JWT + Role-Based Access Control
- Integrasi Pembayaran: Midtrans / Xendit (Subscription Billing)
๐ ERD ini dirancang agar fleksibel dan siap dikembangkan sebagai sistem SaaS multi-tenant dengan opsi langganan (freemium โ premium).
Struktur ini menjaga keseimbangan antara skalabilitas, performa, dan kemudahan pengembangan backend menggunakan Express + Sequelize + PostgreSQL.