DOKUMEN REKAYASA PERANGKAT LUNAK
Perancangan dan Pengujian Sistem
E-Commerce Nalala Store
Penjualan Tas Fashion Berbasis Paket Usaha, Capacity Checker, dan Otomatisasi Logistik
Klik Export PDF di pojok kanan atas untuk simpan sebagai PDF. Daftar Isi di samping bisa diklik untuk lompat antar bab.
BAB I — PENDAHULUAN
Bab ini menjelaskan alasan kenapa sistem Nalala Store perlu dibangun, masalah apa yang ingin diselesaikan, serta tujuan dan batasan pengerjaannya.
1.1 Latar Belakang
Nalala Store adalah toko yang menjual tas fashion seperti tote bag, sling bag, shoulder bag, dan ransel. Selama ini penjualan masih dikelola manual, sehingga muncul tiga masalah utama:
- Urus reseller masih manual. Untuk dapat harga reseller, pembeli harus verifikasi manual oleh admin. Proses jadi lambat dan menghambat penjualan grosir.
- Urus pengiriman masih manual. Admin harus buat resi satu per satu, input nomor resi dari J&T, dan cetak struk thermal secara manual.
- Pembeli bingung kapasitas tas. Pembeli online tidak yakin apakah tas muat untuk laptop, botol minum, atau mukena. Akibatnya banyak yang ragu beli atau minta retur.
Untuk itu dibangun website e-commerce yang otomatis: ada program Paket Usaha untuk jadi reseller otomatis, ada fitur Capacity Checker untuk cek muat tidaknya barang, serta sistem yang otomatis buat resi J&T dan kirim notifikasi WhatsApp setelah bayar.
Website dibangun pakai Node.js + Express di backend, MySQL dengan Prisma untuk database, dan proses berat seperti buat PDF dan kirim WA dijalankan di latar belakang (async) supaya tidak bikin webhook Midtrans timeout.
1.2 Rumusan Masalah
- Bagaimana membuat sistem reseller yang otomatis tanpa verifikasi manual?
- Bagaimana menangani stok agar tidak terjadi rebutan saat dua pembeli checkout bersamaan?
- Bagaimana membantu pembeli yakin soal daya muat tas sebelum beli?
- Bagaimana mengotomatiskan pembuatan resi J&T, cetak PDF thermal 58mm, dan notifikasi WhatsApp setelah pembayaran berhasil?
- Bagaimana memastikan semua alur sudah benar lewat pengujian White Box dan Black Box?
1.3 Tujuan Penelitian
- Membangun sistem e-commerce Nalala Store yang terintegrasi pembayaran Midtrans dan pengiriman J&T.
- Menerapkan aturan Paket Usaha: beli 11 tas dapat 1 bonus, otomatis jadi reseller selamanya setelah lunas.
- Menyediakan Capacity Checker agar pembeli bisa cek muat tidaknya barang ke dalam tas.
- Mengotomatiskan resi, PDF struk, dan WA notifikasi tanpa proses manual admin.
- Menyusun dokumen perancangan basis data, perancangan sistem UML, dan pengujian yang bisa dipakai untuk laporan skripsi.
1.4 Manfaat Penelitian
- Bagi toko: Proses reseller dan pengiriman jadi lebih cepat, stok lebih aman, penjualan paket usaha meningkat.
- Bagi pembeli: Lebih yakin memilih tas, dapat harga reseller mulai 1 pcs tanpa minimal order, dan dapat info resi otomatis via WhatsApp.
- Bagi akademik: Menjadi contoh penerapan ERD ke LRS, diagram UML, serta pengujian White Box dan Black Box pada studi kasus e-commerce nyata.
1.5 Batasan Masalah
- Pembayaran hanya lewat Midtrans Snap (VA bank dan QRIS).
- Kurir yang dipakai hanya J&T Express, ongkir ditanggung pembeli.
- Paket Usaha yang dibahas adalah Paket A: 11 tas pilihan + 1 bonus acak seharga Rp0, harga flat Rp500.000 (dikonfigurasi admin).
- Capacity Checker menghitung berdasar volume sederhana, bukan simulasi 3D.
- Role pengguna hanya GUEST, RESELLER, dan ADMIN. Reseller bersifat permanen setelah upgrade.
1.6 Alur Sistem Keseluruhan (Master Flowchart)
Flowchart di bawah merangkum alur lengkap dari pengunjung datang sampai pesanan selesai dikirim. Jika bingung baca diagram lain, lihat flowchart ini dulu sebagai peta besarnya.
Cara baca: Kotak persegi = proses, belah ketupat = keputusan (ya/tidak), oval = mulai/selesai, panah = arah alur.
BAB II — PERANCANGAN BASIS DATA
Bab ini membahas bagaimana data toko disusun di database. Mulai dari gambar hubungan antar data (ERD), penjelasan tiap hubungan dengan bahasa sederhana, aturan ubah ERD jadi tabel nyata (LRS), sampai bentuk tabel akhirnya.
2.1 Entity Relationship Diagram (ERD) Konseptual
ERD adalah gambar yang menunjukkan entitas (tabel) dan hubungannya. Simbol yang dipakai adalah Crow's Foot:
||--o{artinya One-to-Many (1 ke Banyak) — satu baris di tabel kiri bisa terhubung ke banyak baris di tabel kanan.}o--o{artinya Many-to-Many (Banyak ke Banyak) — banyak baris di kiri bisa terhubung ke banyak baris di kanan (nanti dipecah jadi tabel perantara).||--||artinya One-to-One (1 ke 1) — satu baris hanya pasangan dengan satu baris.
Arahkan kursor ke garis atau label relasi pada diagram untuk melihat keterangan kardinalitasnya. Simbol akan menyala biru saat di-hover.
2.2 Penjelasan Relasi ERD (by Text)
Tabel di bawah menjelaskan tiap garis di ERD dengan bahasa sederhana: siapa terhubung ke siapa, simbolnya apa, dan kenapa begitu.
| Relasi | Simbol | Penjelasan Sederhana |
|---|---|---|
| CATEGORIES ke PRODUCTS | ||--o{One-to-Many | Satu kategori (misal "Sling Bag") bisa punya banyak produk. Satu produk hanya masuk satu kategori. |
| USERS ke CARTS | ||--o{One-to-Many | Satu user bisa punya beberapa keranjang dari waktu ke waktu. Satu keranjang hanya milik satu user. |
| USERS ke ORDERS | ||--o{One-to-Many | Satu user bisa pesan berkali-kali. Satu pesanan hanya milik satu user. |
| PRODUCTS ke CARTS | }o--o{Many-to-Many | Satu keranjang bisa berisi banyak produk. Satu produk bisa ada di banyak keranjang milik user berbeda. Nanti dipecah jadi CART_ITEMS. |
| PRODUCTS ke ORDERS | }o--o{Many-to-Many | Satu pesanan bisa berisi banyak produk. Satu produk bisa dibeli di banyak pesanan berbeda. Nanti dipecah jadi ORDER_ITEMS. |
| PAKET_USAHA ke CARTS | ||--o{One-to-Many | Satu aturan Paket Usaha (misal Paket 500rb isi 11+1) bisa dipakai di banyak keranjang. Paket Usaha bukan tas, tapi aturan promo. Keranjang yang pakai paket ditandai supaya sistem cek kuota 11 item. |
| PAKET_USAHA ke ORDERS | ||--o{One-to-Many | Satu aturan paket bisa dibeli di banyak pesanan. Tanda ini yang bikin sistem otomatis naikkan user jadi RESELLER setelah lunas. |
| ORDERS ke PAYMENTS | ||--||One-to-One | Satu pesanan hanya punya satu pembayaran Midtrans. Tidak boleh ada dua pembayaran untuk satu pesanan yang sama. |
| ORDERS ke SHIPMENTS | ||--||One-to-One | Satu pesanan lunas hanya menghasilkan satu resi J&T dan satu file PDF struk thermal. |
2.3 Aturan Transformasi ERD ke LRS
LRS (Logical Record Structure) adalah bentuk nyata tabel di database MySQL. Cara mengubah ERD jadi LRS ada 4 aturan sederhana:
Aturan 1: Entitas jadi tabel
Tiap kotak entitas di ERD menjadi satu tabel beneran. Primary Key (PK) tetap jadi kunci utama tabel. Contoh: entitas USERS jadi tabel users.
Aturan 2: Many-to-Many dipecah jadi tabel perantara
Hubungan Banyak-ke-Banyak tidak bisa langsung dibuat di database relasional. Jadi dipecah jadi tabel baru di tengah:
- PRODUCTS }o--o{ ORDERS dipecah jadi ORDER_ITEMS (simpan product_id + order_id + qty + price_at_purchase + is_bonus_item).
- PRODUCTS }o--o{ CARTS dipecah jadi CART_ITEMS.
Aturan 3: One-to-Many pakai Foreign Key
Kunci dari sisi "satu" dipindah jadi kolom Foreign Key (FK) di sisi "banyak". Contoh: users.id dipindah jadi orders.user_id.
Aturan 4: One-to-One pakai UNIQUE
Untuk ORDERS ke PAYMENTS dan SHIPMENTS, kolom order_id di tabel tujuan diberi constraint UNIQUE supaya benar-benar 1 lawan 1.
2.4 Logical Record Structure (LRS) Fisik
Diagram di bawah adalah bentuk tabel jadi di MySQL lengkap dengan kolom dan Foreign Key-nya.
2.5 Penjelasan Relasi LRS dan Fungsi Foreign Key (FK)
Foreign Key (FK) adalah kolom yang menunjuk ke tabel lain. Fungsinya supaya data saling terhubung dan tidak berantakan.
| Tabel | FK | Penjelasan Sederhana |
|---|---|---|
| CATEGORIES → PRODUCTS | category_id | Menandai produk masuk kategori apa. Jadi filter "tampilkan Sling Bag saja" tinggal pakai FK ini. |
| PRODUCTS → CART_ITEMS | product_id | Menghubungkan item di keranjang ke produk aslinya untuk cek stok dan harga. |
| PRODUCTS → ORDER_ITEMS | product_id | Menyimpan jejak produk yang sudah dibeli beserta harga saat beli (snapshot) agar tidak berubah kalau harga master naik. |
| PRODUCTS → STOCK_RESERVATIONS | product_id | Mengunci stok sementara 15 menit saat checkout supaya tidak rebutan. Kalau tidak dibayar, stok dilepas lagi. |
| PAKET_USAHA → CARTS | paket_usaha_id | Menandai keranjang ini adalah keranjang paket. Sistem jadi tahu harus cek kuota 11 item dan hitung harga flat Rp500rb. |
| PAKET_USAHA → ORDERS | paket_usaha_id | Menandai pesanan ini berasal dari paket usaha. Tanda ini yang memicu webhook untuk ubah role jadi RESELLER. |
| USERS → ORDERS | user_id | Menandai pesanan milik siapa, sekaligus menentukan harga retail atau reseller yang dipakai. |
| ORDERS → PAYMENTS | order_id UNIQUE | Satu pesanan satu pembayaran Midtrans. Dipakai webhook untuk update status lunas. |
| ORDERS → SHIPMENTS | order_id UNIQUE | Satu pesanan satu resi J&T dan satu PDF struk thermal. |
BAB III — PERANCANGAN SISTEM
Bab ini menjelaskan bagaimana sistem bekerja dari sisi pengguna dan alur antar komponen. Ada Use Case (siapa bisa apa), Activity Diagram (alur langkah), dan Sequence Diagram (urutan komunikasi antar sistem).
3.1 Use Case Diagram
Use Case menunjukkan aktor (siapa) dan apa yang bisa mereka lakukan di sistem.
3.2 Spesifikasi Use Case
Di bawah adalah contoh paling penting: UC-03 (Beli Paket Usaha). Penjelasan dibuat singkat dan mudah dipahami.
| Bagian | Isi |
|---|---|
| Kode | UC-03: Beli Paket Usaha dan Dapat Bonus |
| Aktor | Customer Guest |
| Syarat awal | Ada paket aktif di database (misal Paket A 11+1 Rp500.000). |
| Hasil akhir | Keranjang jadi pesanan, stok dikunci 15 menit, token Midtrans siap dibayar. |
| Alur utama | 1. Buka halaman Paket Usaha. 2. Sistem tampilkan produk yang boleh ikut paket (non-HPP tinggi). 3. Pembeli pilih 11 tas. 4. Sistem cek jumlah harus pas 11. 5. Sistem otomatis tambahkan 1 tas bonus acak Rp0 yang terkunci. 6. Input alamat. 7. Sistem buatkan token bayar Midtrans. |
| Jika gagal | 4a. Jika belum 11, tombol lanjut tidak aktif. 5a. Jika stok bonus habis, sistem cari bonus lain yang stoknya ada. 7a. Jika stok rebutan, sistem balas HTTP 409. |
3.3 Activity Diagram
Activity Diagram menggambarkan langkah demi langkah seperti flowchart, tapi fokus ke alur kerja sistem.
Diagram 1: Belanja Reguler dan Capacity Checker
Diagram 2: Webhook dan Logistik Otomatis
3.4 Sequence Diagram
Sequence Diagram menunjukkan urutan kirim pesan antar komponen: siapa hubungi siapa dan kapan.
Sequence: Beli Paket Usaha dan Resolusi Bonus
Sequence: Webhook Midtrans dan Pipeline Async
BAB IV — PENGUJIAN SISTEM
Bab ini membuktikan sistem berjalan benar lewat dua cara: White Box (cek logika dalam kode) dan Black Box (cek dari sisi pengguna tanpa lihat kode).
4.1 White Box Testing
Fungsi yang diuji adalah processOrderPaymentLogic() — fungsi yang menentukan status pesanan setelah webhook Midtrans masuk.
Pseudocode
1: function processOrderPaymentLogic(orderData, tStatus, fStatus) {
2: if (tStatus === "settlement") {
3: if (fStatus === "accept") {
4: orderData.status = "PAID";
5: orderData.paid_at = generateCurrentTime();
6: if (orderData.type === "PAKET_USAHA") {
7: executeRoleElevation(orderData.user_id, "RESELLER");
8: writeAuditLogReseller(orderData.user_id);
9: }
10: triggerAsynchronousLogistics(orderData.id);
11: return "STATUS_SUCCESS_FINAL";
12: } else {
13: orderData.status = "CHALLENGE_HELD";
14: return "STATUS_FRAUD_HELD";
15: }
16: } else if (tStatus === "expire") {
17: orderData.status = "EXPIRED";
18: executeRevertStockReservations(orderData.id);
19: return "STATUS_RELEASED_EXP";
20: } else {
21: orderData.status = "PENDING_AWAIT";
22: return "STATUS_NO_ACTION";
23: }
24: }
Flow Graph
Cyclomatic Complexity
Rumus: V(G) = P + 1, P = jumlah titik keputusan (predicate node). Ditemukan 4 titik (Node 2, 3, 6, 16). Jadi V(G) = 4 + 1 = 5. Artinya butuh 5 jalur uji berbeda untuk cover semua kemungkinan.
Tabel Kasus Uji White Box
WB-01 sampai WB-05 adalah 5 jalur utama. WB-06 dan WB-07 tambahan untuk cek ketahanan.
| Kode | Jalur (Node) | Input | Hasil Harapan | Return | Status |
|---|---|---|---|---|---|
| WB-01 | 1-2-3-4-6-7-10-11-24 Settlement accept paket usaha | settlement, accept, PAKET_USAHA | PAID, jadi RESELLER, logistik jalan | SUCCESS_FINAL | Pass |
| WB-02 | 1-2-3-4-6-10-11-24 Settlement accept reguler | settlement, accept, REGULER | PAID, tetap GUEST, logistik jalan | SUCCESS_FINAL | Pass |
| WB-03 | 1-2-3-13-24 Settlement challenge | settlement, challenge | CHALLENGE_HELD, tidak kirim resi | FRAUD_HELD | Pass |
| WB-04 | 1-2-16-17-24 Expire | expire | EXPIRED, stok dikembalikan | RELEASED_EXP | Pass |
| WB-05 | 1-2-16-21-24 Pending | pending | PENDING_AWAIT, tidak ada perubahan | NO_ACTION | Pass |
| WB-06 | 1-2-16-21-24 Status tidak dikenal | deny | Tidak crash, masuk PENDING | NO_ACTION | Pass |
| WB-07 | 1-2-3-4-6-7-10-11-24 Webhook dikirim 2x (idempoten) | settlement 2x order sama | Yang kedua diabaikan, tidak duplikat upgrade | SUCCESS lalu NO_ACTION | Pass |
4.2 Black Box Testing
Black Box cek dari sisi luar: input apa, output apa, tanpa lihat kode dalam. Teknik yang dipakai EP (bagi input jadi kelompok valid/tidak valid) dan BVA (cek nilai batas).
| Kode | Teknik | Skenario | Data Uji | Hasil Harapan | Status |
|---|---|---|---|---|---|
| BB-01 | EP Valid | Harga reseller mulai 1 pcs tanpa minimal | RESELLER qty=1 | Subtotal pakai price_reseller | Pass |
| BB-02 | EP Valid | Harga retail untuk GUEST + pop-up paket | GUEST qty=1 | Pakai price_retail, pop-up muncul 1x per sesi | Pass |
| BB-03 | EP Valid | Upgrade RESELLER permanen setelah paket lunas | Paket A lunas settlement | Role GUEST jadi RESELLER, reseller_since terisi | Pass |
| BB-04 | EP Valid | Kuota 11 item dapat 1 bonus terkunci | Pilih 11 produk | Order jadi 12 baris, 1 bonus Rp0 flag is_bonus=true | Pass |
| BB-05 | BVA | Kuota kurang/lebih ditolak | qty 10 dan 12 (batas 11) | Tombol checkout mati, pesan "harus tepat 11" | Pass |
| BB-06 | EP Valid | Produk HPP tinggi disaring dari paket | is_excluded=true | Tidak muncul di katalog paket, tetap ada di reguler | Pass |
| BB-07 | EP Valid | Fallback bonus jika stok habis | Bonus stok 0 | Sistem pilih bonus lain stok terbanyak | Pass |
| BB-08 | EP Valid | Capacity Checker muat | Volume 80% | Status MUAT, langsung masuk keranjang | Pass |
| BB-09 | BVA | Capacity Checker overload | Rasio 100% dan 120% | Muncul warning, harus konfirmasi dulu | Pass |
| BB-10 | BVA | Validasi dimensi Capacity Checker | 0,1,100,101,9999 cm | 0,101,9999 ditolak, 1 dan 100 diterima | Pass |
| BB-11 | EP Invalid | Rebutan stok terakhir | 2 user stok 1 bersamaan | Satu sukses, satu dapat 409 Conflict | Pass |
| BB-12 | EP Valid | Order expired lepas stok | Tidak bayar 15 menit | EXPIRED, stok balik, tetap GUEST | Pass |
| BB-13 | EP Valid | Ongkir J&T ditanggung pembeli | J&T REG | shipping_cost masuk total | Pass |
| BB-14 | EP Valid | Pipeline async: AWB, PDF, WA | Settlement accept | AWB terisi, PDF tersimpan, WA terkirim SENT | Pass |
| BB-15 | EP Invalid | Signature webhook salah | SHA512 salah | Ditolak 401, tidak ubah order | Pass |
| BB-16 | EP Invalid | Email duplikat dan login salah | Email sama, password salah | 409 dan 401, tidak dapat JWT | Pass |
BAB V — PENUTUP
5.1 Arsitektur Sistem
Sistem dibagi 4 lapisan supaya rapi dan mudah dirawat. Frontend hanya tampilkan data, backend yang atur logika, database simpan data, dan gateway eksternal untuk bayar dan kirim.
5.2 Rekomendasi Teknologi
| Komponen | Teknologi | Alasan Pilih |
|---|---|---|
| Frontend | Next.js 15, React, Tailwind | Cepat, SEO friendly, styling praktis |
| Backend | Node.js + Express | Ringan, banyak library, cocok untuk async |
| Database | MySQL 8.0 + Prisma ORM | Stabil, migrasi mudah, type-safe |
| Pembayaran | Midtrans Snap | Mendukung VA dan QRIS, webhook jelas |
| Pengiriman | J&T Express EzShip | API tarif dan AWB tersedia |
| Notifikasi | WhatsApp Gateway (Fonnte) | Jangkauan luas, format PDF bisa dikirim |
| pdf-lib | Render thermal 58mm di server tanpa dependensi berat | |
| Validasi | Zod + JWT | Validasi input ketat dan auth aman berbasis role |
5.3 Kesimpulan
- Sistem berhasil mengotomatiskan upgrade reseller lewat Paket Usaha. Guest yang beli paket dan lunas otomatis jadi RESELLER permanen tanpa verifikasi manual.
- Masalah rebutan stok diatasi dengan transaksi atomik dan kunci stok sementara 15 menit. Pengujian membuktikan satu transaksi sukses dan yang lain dapat 409 Conflict.
- Capacity Checker membantu pembeli cek muat tidaknya barang dengan peringatan overload yang jelas.
- Pipeline async setelah webhook (balas 200 dulu, baru buat resi, PDF, dan WA di belakang) membuat sistem tidak timeout dan tetap andal meski API eksternal lambat.
- Pengujian White Box V(G)=5 mencapai 100% path coverage dan Black Box 16 kasus semua Pass, menandakan sistem layak untuk dilanjutkan ke tahap implementasi.
5.4 Saran
- Tambah variasi paket usaha lain (misal 6+1 atau 20+2) agar lebih fleksibel.
- Kembangkan Capacity Checker ke visual 3D sederhana agar lebih mudah dipahami pembeli.
- Tambahkan dashboard analitik untuk admin memantau paket paling laku dan stok menipis.
- Jika trafik tinggi, pertimbangkan antrean job (BullMQ + Redis) untuk pipeline async agar lebih tahan beban.
- Lanjutkan ke penyusunan
prisma/schema.prismadan spesifikasi endpoint API (OpenAPI) sebagai langkah implementasi berikutnya.