Skip to content
logo

Kotak Kode Pemograman

Sharing tentang bahasa pemograman

  • WordPress
    • Plugin
  • Tutorial
    • PHP
  • Laravel
  • Tools Webbsite
  • Desain
  • Source Code
  • Web Developer
  • Toggle search form

Konsep E-commerce Multi-Vendor Komprehensif

Posted on 14/07/2025 By kotakkode No Comments on Konsep E-commerce Multi-Vendor Komprehensif

Konsep E-commerce Multi-Vendor Komprehensif

Platform e-commerce multi-vendor ini didesain untuk memungkinkan banyak penjual (vendor) menjual produk mereka kepada pembeli, dengan sistem yang mendukung produk single atau multi-varian, manajemen kurir, serta laporan komprehensif untuk vendor dan kurir. Semua jenis pengguna (termasuk kurir dan vendor) dapat melakukan pembelian. Pembeli akan memiliki fleksibilitas dalam mengelola alamat pengiriman hingga detail RT/RW/Dusun di desa yang spesifik (Desa Bukit Lembah Subur, Kecamatan Kerumutan, Kabupaten Pelalawan, Provinsi Riau, Indonesia). Sistem akan dilengkapi dengan saldo/uang digital, kemampuan vendor memiliki moderator/staff, fitur aktif/nonaktif pengguna/vendor/kurir, pengaturan tarif pengiriman oleh kurir, sistem ulasan produk dan kurir, serta fitur diskon/promo voucher termasuk diskon pengiriman.


1. Arsitektur Umum Sistem

Sistem akan memiliki peran pengguna sebagai berikut:

  • Pengguna (User): Peran dasar yang mencakup semua entitas yang berinteraksi dengan platform. Setiap pengguna dapat melakukan pembelian.
  • Pembeli (Customer): Setiap Pengguna secara otomatis dapat bertindak sebagai Pembeli. Mereka mencari produk, melakukan pembelian, mengelola keranjang, mengelola alamat, melihat riwayat pesanan, dan mengelola saldo digital.
  • Vendor (Penjual): Pengguna yang terdaftar dan disetujui untuk menjual produk. Mereka mengelola toko, produk, pesanan, stok, dan melihat laporan penjualan. Vendor dapat memiliki moderator/staff.
  • Moderator/Staff Vendor: Pengguna yang ditambahkan oleh Vendor untuk membantu mengelola toko dengan hak akses terbatas.
  • Admin (Pengelola Platform): Mengelola seluruh aspek platform, termasuk pengguna (aktif/nonaktif), vendor, produk (opsional moderasi), pesanan global, kurir, pengaturan lokasi pengiriman, manajemen saldo digital platform, dan membuat laporan keseluruhan.
  • Kurir (Courier): Pengguna yang bertanggung jawab untuk pengiriman. Mereka menerima tugas, memperbarui status pengiriman, melihat rute, dan melihat riwayat pengiriman. Mereka juga dapat mengatur tarif dan diskon pengiriman sendiri.

2. Fitur Utama Berdasarkan Peran

2.1 Fitur untuk Pembeli (Setiap Pengguna)

  • Pencarian & Penjelajahan Produk: Berdasarkan kategori, nama produk, vendor, harga, filter varian, dll.
  • Halaman Detail Produk: Menampilkan detail, gambar, deskripsi, harga, pilihan varian (ukuran, warna, dll.), dan ulasan.
  • Keranjang Belanja: Menambah/menghapus produk, memperbarui kuantitas.
  • Manajemen Alamat Pengiriman:
    • Dapat menambahkan lebih dari satu alamat dan menentukan satu sebagai alamat utama.
    • Alamat secara otomatis ditetapkan di Indonesia, Provinsi Riau, Kabupaten Pelalawan, Kecamatan Kerumutan, Desa Bukit Lembah Subur. Pembeli mengisi detail spesifik: Blok E/D, Jalan, RT, RW, dan Dusun (memilih dari dropdown atau input yang divalidasi).
  • Checkout:
    • Pemilihan alamat pengiriman dari daftar.
    • Pilihan Metode Pengiriman: Pembeli melihat pilihan kurir yang tersedia beserta tarifnya.
    • Pemilihan metode pembayaran: Transfer Bank, Kartu Kredit, Saldo Digital.
    • Penerapan Voucher Diskon: Memasukkan kode voucher untuk diskon produk atau pengiriman.
  • Riwayat Pesanan: Melihat status dan detail pesanan sebelumnya.
  • Sistem Saldo/Uang Digital: Halaman saldo pribadi (jumlah, riwayat transaksi), fitur top-up saldo, pembayaran menggunakan saldo saat checkout, dan refund bisa masuk ke saldo.
  • Login/Registrasi: Opsi Registrasi email/password dan Login dengan Media Sosial (Google, Facebook, dll.).
  • Ulasan/Review: Memberikan rating bintang dan ulasan untuk produk yang dibeli dan rating bintang dan ulasan untuk kurir yang mengantar pesanan.
  • Notifikasi: Pembaruan status pesanan, notifikasi saldo.

2.2 Fitur untuk Vendor

  • Dashboard Vendor: Ringkasan penjualan, pesanan tertunda, produk terlaris.
  • Manajemen Produk:
    • Tambah/Edit produk: nama, deskripsi, harga, kategori.
    • Mendukung produk single dan produk multi-varian (dengan atribut varian seperti warna, ukuran, SKU, harga, stok, dan gambar per varian).
    • Manajemen Stok: Otomatis berkurang, notifikasi stok rendah.
  • Manajemen Pesanan: Melihat pesanan masuk, mengubah status pesanan (diproses, siap kirim, dll.), dan memilih kurir.
  • Laporan Vendor: Laporan penjualan (berdasarkan tanggal, produk, status), kinerja produk, laporan keuangan (pendapatan, biaya komisi, pembayaran), dan detail diskon voucher yang diterapkan.
  • Pengaturan Toko: Profil toko, logo, deskripsi, kebijakan pengiriman/pengembalian.
  • Manajemen Staff/Moderator Vendor: Menambahkan akun moderator/staff dan menentukan hak akses (misal: mengelola produk, melihat pesanan).

2.3 Fitur untuk Admin

  • Dashboard Admin: Statistik platform (penjualan total, jumlah vendor, pembeli, pesanan).
  • Manajemen Pengguna: CRUD untuk Vendor, Pembeli, Kurir, Moderator Vendor. Fitur Aktif/Nonaktif: Admin dapat mengaktifkan atau menonaktifkan akun pengguna, vendor, dan kurir (menghentikan akses login dan interaksi).
  • Manajemen Vendor: Persetujuan vendor baru, nonaktifkan/aktifkan, lihat detail.
  • Manajemen Produk (Moderasi): Melihat, mengedit, atau menghapus produk yang diunggah vendor (opsional).
  • Manajemen Pesanan Global: Melihat semua pesanan di platform.
  • Manajemen Kategori/Atribut: Membuat dan mengelola kategori produk, atribut varian.
  • Manajemen Kurir: Menambah/mengelola akun kurir, menetapkan pesanan, melihat status pengiriman.
  • Manajemen Saldo Digital Platform: Melihat total saldo yang beredar, mengelola proses top-up dan refund, laporan transaksi saldo.
  • Manajemen Lokasi Pengiriman: Mengelola daftar Blok E/D, Nama Jalan, RT, RW, dan Dusun yang valid untuk Desa Bukit Lembah Subur.
  • Manajemen Voucher Diskon/Promo: Membuat dan mengelola berbagai jenis voucher (diskon produk/belanja, diskon pengiriman) dengan parameter seperti kode, tanggal berlaku, kuota, minimum belanja, dan scope (produk/kategori/vendor tertentu). Mengatur apakah kurir bisa membuat diskon pengiriman.
  • Laporan Admin: Penjualan keseluruhan, keuangan platform (komisi, biaya operasional, transaksi saldo), performa kurir, produk populer, penggunaan voucher, dan review produk/kurir.

2.4 Fitur untuk Kurir

  • Dashboard Kurir: Daftar tugas pengiriman, riwayat pengiriman.
  • Detail Pesanan Pengiriman: Alamat pembeli, kontak, detail produk, peta rute.
  • Pembaruan Status Pengiriman: Menandai pesanan sebagai “diambil”, “dalam perjalanan”, “tiba”, “berhasil terkirim”, “gagal”.
  • Konfirmasi Pengiriman: Tanda tangan digital atau foto saat pengiriman berhasil.
  • Pengaturan Tarif Pengiriman: Menentukan tarif pengiriman mereka sendiri (per kilometer, per berat, atau flat per wilayah/dusun). Admin dapat menyetujui atau memberikan batasan.
  • Pengaturan Diskon Pengiriman (Jika Diizinkan Admin): Membuat voucher diskon pengiriman sendiri untuk promosi pribadi atau area tertentu.
  • Laporan Kurir: Jumlah pesanan diselesaikan, pendapatan (termasuk diskon), performa pengiriman, dan rating serta ulasan dari pembeli.

3. Asumsi Teknologi

  • Framework: Laravel (versi terbaru).
  • Database: MySQL (untuk relasi kompleks).
  • Front-end: Blade Templating Engine Laravel, atau framework JS seperti Vue.js/React.js (untuk dinamis).
  • API: Laravel Sanctum/Passport untuk otentikasi API.
  • Login Media Sosial: Laravel Socialite (Google, Facebook).
  • Antrian (Queue): Laravel Queue untuk tugas berat (notifikasi, laporan, pembaruan saldo).
  • Penyimpanan (Storage): Laravel Storage (Lokal/AWS S3) untuk gambar produk, dokumen.
  • Payment Gateway: Integrasi dengan penyedia layanan pembayaran lokal (Midtrans, Xendit).

4. Rancangan Database

Berikut adalah skema tabel utama dengan penyesuaian yang memungkinkan semua user melakukan pembelian:

SQL

-- users table (Tabel utama untuk semua jenis pengguna, termasuk saldo dan status aktif)
CREATE TABLE `users` (
    `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `name` VARCHAR(255) NOT NULL,
    `email` VARCHAR(255) UNIQUE NOT NULL,
    `email_verified_at` TIMESTAMP NULL,
    `password` VARCHAR(255) NULL, -- Nullable for social login
    `phone` VARCHAR(20) NULL,
    `role` ENUM('customer', 'vendor', 'admin', 'courier', 'vendor_moderator') NOT NULL,
    `avatar` VARCHAR(255) NULL,
    `is_active` BOOLEAN NOT NULL DEFAULT TRUE, -- Untuk fitur aktif/nonaktif
    `balance` DECIMAL(15, 2) NOT NULL DEFAULT 0.00, -- Saldo digital, semua user bisa punya
    `remember_token` VARCHAR(100) NULL,
    `created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    `updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

-- social_accounts table (Untuk integrasi login media sosial)
CREATE TABLE `social_accounts` (
    `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `user_id` BIGINT UNSIGNED NOT NULL,
    `provider_name` VARCHAR(255) NOT NULL,
    `provider_id` VARCHAR(255) NOT NULL,
    `created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    `updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    UNIQUE (`provider_name`, `provider_id`),
    FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE CASCADE
);

-- vendors table (Detail profil vendor)
CREATE TABLE `vendors` (
    `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `user_id` BIGINT UNSIGNED UNIQUE NOT NULL,
    `store_name` VARCHAR(255) NOT NULL,
    `store_description` TEXT NULL,
    `store_logo` VARCHAR(255) NULL,
    `bank_details` JSON NULL, -- Nomor rekening, nama bank, dll.
    `approval_status` ENUM('pending', 'approved', 'rejected') NOT NULL DEFAULT 'pending',
    `created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    `updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE CASCADE
);

-- vendor_moderators table (Untuk staf/moderator vendor)
CREATE TABLE `vendor_moderators` (
    `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `user_id` BIGINT UNSIGNED NOT NULL,
    `vendor_id` BIGINT UNSIGNED NOT NULL, -- ID user dari vendor pemilik
    `permissions` JSON NULL, -- Menyimpan hak akses spesifik (e.g., {"manage_products": true, "view_orders": true})
    `created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    `updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE CASCADE,
    FOREIGN KEY (`vendor_id`) REFERENCES `users`(`id`) ON DELETE CASCADE
);

-- couriers table (Detail profil kurir)
CREATE TABLE `couriers` (
    `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `user_id` BIGINT UNSIGNED UNIQUE NOT NULL,
    `vehicle_type` VARCHAR(255) NULL,
    `license_number` VARCHAR(255) NULL,
    `shipping_rates` JSON NULL, -- Menyimpan struktur tarif kurir (misal: {"per_km": 5000, "base_fare": 10000})
    `can_create_shipping_voucher` BOOLEAN NOT NULL DEFAULT FALSE, -- Admin bisa mengizinkan kurir membuat diskon
    `created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    `updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE CASCADE
);

-- villages table (Hanya akan ada 1 entri: Bukit Lembah Subur)
CREATE TABLE `villages` (
    `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `name` VARCHAR(255) NOT NULL UNIQUE,
    `district` VARCHAR(255) DEFAULT 'Kerumutan',
    `regency` VARCHAR(255) DEFAULT 'Pelalawan',
    `province` VARCHAR(255) DEFAULT 'Riau',
    `country` VARCHAR(255) DEFAULT 'Indonesia',
    `created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    `updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

-- dusuns table (Dusun yang diizinkan di Desa Bukit Lembah Subur)
CREATE TABLE `dusuns` (
    `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `village_id` BIGINT UNSIGNED NOT NULL,
    `name` VARCHAR(255) NOT NULL,
    `created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    `updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (`village_id`) REFERENCES `villages`(`id`) ON DELETE CASCADE,
    UNIQUE (`village_id`, `name`)
);

-- addresses table (Alamat pengiriman milik pengguna)
CREATE TABLE `addresses` (
    `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `user_id` BIGINT UNSIGNED NOT NULL, -- Merujuk langsung ke users.id
    `label` VARCHAR(255) NULL, -- (e.g., 'Rumah', 'Kantor')
    `recipient_name` VARCHAR(255) NOT NULL,
    `phone` VARCHAR(20) NOT NULL,
    `blok_ed` VARCHAR(50) NULL, -- Blok E/D
    `jalan` VARCHAR(255) NOT NULL,
    `rt` VARCHAR(10) NOT NULL,
    `rw` VARCHAR(10) NOT NULL,
    `dusun_id` BIGINT UNSIGNED NOT NULL, -- Foreign key ke tabel dusuns
    `postal_code` VARCHAR(10) NULL,
    `is_default` BOOLEAN NOT NULL DEFAULT FALSE,
    `created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    `updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE CASCADE,
    FOREIGN KEY (`dusun_id`) REFERENCES `dusuns`(`id`) ON DELETE RESTRICT
);

-- categories table
CREATE TABLE `categories` (
    `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `name` VARCHAR(255) NOT NULL,
    `slug` VARCHAR(255) UNIQUE NOT NULL,
    `parent_id` BIGINT UNSIGNED NULL, -- Untuk sub-kategori
    `created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    `updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (`parent_id`) REFERENCES `categories`(`id`) ON DELETE SET NULL
);

-- products table
CREATE TABLE `products` (
    `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `vendor_id` BIGINT UNSIGNED NOT NULL, -- ID user dari vendor
    `category_id` BIGINT UNSIGNED NOT NULL,
    `name` VARCHAR(255) NOT NULL,
    `slug` VARCHAR(255) UNIQUE NOT NULL,
    `description` TEXT NULL,
    `base_price` DECIMAL(15, 2) NOT NULL,
    `status` ENUM('draft', 'published', 'archived') NOT NULL DEFAULT 'draft',
    `type` ENUM('single', 'variable') NOT NULL DEFAULT 'single', -- Produk tunggal atau bervarian
    `created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    `updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (`vendor_id`) REFERENCES `users`(`id`) ON DELETE CASCADE,
    FOREIGN KEY (`category_id`) REFERENCES `categories`(`id`) ON DELETE RESTRICT
);

-- product_images table
CREATE TABLE `product_images` (
    `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `product_id` BIGINT UNSIGNED NOT NULL,
    `path` VARCHAR(255) NOT NULL,
    `is_thumbnail` BOOLEAN NOT NULL DEFAULT FALSE,
    `created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    `updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (`product_id`) REFERENCES `products`(`id`) ON DELETE CASCADE
);

-- attributes table (Misal: Warna, Ukuran, Material)
CREATE TABLE `attributes` (
    `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `name` VARCHAR(255) NOT NULL UNIQUE,
    `created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    `updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

-- attribute_values table (Misal: Merah, Biru, S, M, L)
CREATE TABLE `attribute_values` (
    `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `attribute_id` BIGINT UNSIGNED NOT NULL,
    `value` VARCHAR(255) NOT NULL,
    `created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    `updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (`attribute_id`) REFERENCES `attributes`(`id`) ON DELETE CASCADE,
    UNIQUE (`attribute_id`, `value`)
);

-- product_variants table (Jika product.type = 'variable')
CREATE TABLE `product_variants` (
    `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `product_id` BIGINT UNSIGNED NOT NULL,
    `sku` VARCHAR(255) UNIQUE NULL, -- Stock Keeping Unit
    `price` DECIMAL(15, 2) NOT NULL,
    `stock` INT UNSIGNED NOT NULL DEFAULT 0,
    `image` VARCHAR(255) NULL, -- Gambar spesifik untuk varian
    `created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    `updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (`product_id`) REFERENCES `products`(`id`) ON DELETE CASCADE
);

-- product_variant_attribute_value (Pivot table untuk menghubungkan varian dengan nilai atributnya)
CREATE TABLE `product_variant_attribute_value` (
    `product_variant_id` BIGINT UNSIGNED NOT NULL,
    `attribute_value_id` BIGINT UNSIGNED NOT NULL,
    PRIMARY KEY (`product_variant_id`, `attribute_value_id`),
    FOREIGN KEY (`product_variant_id`) REFERENCES `product_variants`(`id`) ON DELETE CASCADE,
    FOREIGN KEY (`attribute_value_id`) REFERENCES `attribute_values`(`id`) ON DELETE CASCADE
);

-- orders table (Pesanan yang dibuat oleh pengguna mana pun)
CREATE TABLE `orders` (
    `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `user_id` BIGINT UNSIGNED NOT NULL, -- ID user yang melakukan pembelian
    `address_id` BIGINT UNSIGNED NOT NULL,
    `order_number` VARCHAR(255) UNIQUE NOT NULL,
    `total_amount` DECIMAL(15, 2) NOT NULL,
    `shipping_cost` DECIMAL(15, 2) NOT NULL DEFAULT 0.00,
    `discount_amount` DECIMAL(15, 2) NOT NULL DEFAULT 0.00, -- Total diskon dari voucher
    `payment_status` ENUM('pending', 'paid', 'failed', 'refunded') NOT NULL DEFAULT 'pending',
    `order_status` ENUM('pending', 'processing', 'ready_to_ship', 'shipped', 'delivered', 'cancelled', 'returned') NOT NULL DEFAULT 'pending',
    `shipping_method` VARCHAR(255) NULL, -- Nama metode pengiriman (misal: Kurir A, Pengambilan Sendiri)
    `courier_id` BIGINT UNSIGNED NULL, -- ID user dari kurir yang mengantar
    `created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    `updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE RESTRICT,
    FOREIGN KEY (`address_id`) REFERENCES `addresses`(`id`) ON DELETE RESTRICT,
    FOREIGN KEY (`courier_id`) REFERENCES `users`(`id`) ON DELETE SET NULL
);

-- order_items table (Detail produk dalam pesanan)
CREATE TABLE `order_items` (
    `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `order_id` BIGINT UNSIGNED NOT NULL,
    `product_id` BIGINT UNSIGNED NOT NULL,
    `product_variant_id` BIGINT UNSIGNED NULL, -- Jika produk bervarian
    `vendor_id` BIGINT UNSIGNED NOT NULL, -- ID user dari vendor produk ini
    `quantity` INT UNSIGNED NOT NULL,
    `price_per_unit` DECIMAL(15, 2) NOT NULL,
    `subtotal` DECIMAL(15, 2) NOT NULL,
    `created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    `updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (`order_id`) REFERENCES `orders`(`id`) ON DELETE CASCADE,
    FOREIGN KEY (`product_id`) REFERENCES `products`(`id`) ON DELETE RESTRICT,
    FOREIGN KEY (`product_variant_id`) REFERENCES `product_variants`(`id`) ON DELETE RESTRICT,
    FOREIGN KEY (`vendor_id`) REFERENCES `users`(`id`) ON DELETE RESTRICT
);

-- payments table (Log transaksi pembayaran)
CREATE TABLE `payments` (
    `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `order_id` BIGINT UNSIGNED UNIQUE NULL, -- Nullable jika ini transaksi top-up saldo
    `user_id` BIGINT UNSIGNED NOT NULL, -- ID user yang melakukan pembayaran/top-up
    `transaction_id` VARCHAR(255) UNIQUE NOT NULL, -- ID dari payment gateway
    `method` ENUM('bank_transfer', 'credit_card', 'digital_balance', 'other') NOT NULL,
    `amount` DECIMAL(15, 2) NOT NULL,
    `status` ENUM('pending', 'completed', 'failed', 'refunded') NOT NULL,
    `paid_at` TIMESTAMP NULL,
    `created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    `updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (`order_id`) REFERENCES `orders`(`id`) ON DELETE SET NULL,
    FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE RESTRICT
);

-- transactions table (Log semua transaksi saldo digital)
CREATE TABLE `transactions` (
    `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `user_id` BIGINT UNSIGNED NOT NULL, -- user_id yang terlibat
    `type` ENUM('topup', 'payment', 'refund', 'withdrawal', 'commission_payout') NOT NULL,
    `amount` DECIMAL(15, 2) NOT NULL,
    `current_balance` DECIMAL(15, 2) NOT NULL, -- Saldo setelah transaksi ini
    `reference_id` BIGINT UNSIGNED NULL, -- Bisa order_id, payment_id, dll.
    `description` TEXT NULL,
    `created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    `updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE RESTRICT
);

-- shipments table (Detail pengiriman per pesanan)
CREATE TABLE `shipments` (
    `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `order_id` BIGINT UNSIGNED UNIQUE NOT NULL,
    `courier_id` BIGINT UNSIGNED NULL, -- ID user dari kurir yang bertanggung jawab
    `tracking_number` VARCHAR(255) NULL,
    `status` ENUM('pending', 'picked_up', 'in_transit', 'delivered', 'failed_delivery', 'returned') NOT NULL DEFAULT 'pending',
    `pickup_address` TEXT NULL,
    `delivery_address` TEXT NULL,
    `estimated_delivery_at` TIMESTAMP NULL,
    `actual_delivery_at` TIMESTAMP NULL,
    `created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    `updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (`order_id`) REFERENCES `orders`(`id`) ON DELETE CASCADE,
    FOREIGN KEY (`courier_id`) REFERENCES `users`(`id`) ON DELETE SET NULL
);

-- shipment_history table (Log status perubahan pengiriman)
CREATE TABLE `shipment_history` (
    `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `shipment_id` BIGINT UNSIGNED NOT NULL,
    `status` VARCHAR(255) NOT NULL, -- Detail status (e.g., "Picked up by courier", "Arrived at sorting center")
    `location` VARCHAR(255) NULL,
    `description` TEXT NULL,
    `created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    `updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (`shipment_id`) REFERENCES `shipments`(`id`) ON DELETE CASCADE
);

-- reviews table
CREATE TABLE `reviews` (
    `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `user_id` BIGINT UNSIGNED NOT NULL, -- ID user yang memberikan review
    `product_id` BIGINT UNSIGNED NULL, -- Nullable jika review untuk kurir
    `courier_id` BIGINT UNSIGNED NULL, -- Nullable jika review untuk produk
    `order_id` BIGINT UNSIGNED NOT NULL, -- Melacak dari pesanan mana review ini berasal
    `rating` TINYINT UNSIGNED NOT NULL, -- Bintang 1-5
    `comment` TEXT NULL,
    `created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    `updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE CASCADE,
    FOREIGN KEY (`product_id`) REFERENCES `products`(`id`) ON DELETE SET NULL,
    FOREIGN KEY (`courier_id`) REFERENCES `users`(`id`) ON DELETE SET NULL,
    FOREIGN KEY (`order_id`) REFERENCES `orders`(`id`) ON DELETE CASCADE,
    CHECK (`product_id` IS NOT NULL OR `courier_id` IS NOT NULL) -- Pastikan setidaknya satu foreign key tidak null
);

-- commissions table (Komisi platform dari penjualan vendor)
CREATE TABLE `comissions` (
    `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `vendor_id` BIGINT UNSIGNED NOT NULL, -- ID user dari vendor
    `order_item_id` BIGINT UNSIGNED NOT NULL, -- Komisi dihitung per item pesanan
    `commission_percentage` DECIMAL(5, 2) NOT NULL,
    `commission_amount` DECIMAL(15, 2) NOT NULL,
    `status` ENUM('pending', 'paid', 'cancelled') NOT NULL DEFAULT 'pending',
    `payout_transaction_id` BIGINT UNSIGNED NULL, -- Jika dibayarkan ke vendor
    `created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    `updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (`vendor_id`) REFERENCES `users`(`id`) ON DELETE RESTRICT,
    FOREIGN KEY (`order_item_id`) REFERENCES `order_items`(`id`) ON DELETE RESTRICT
);

-- vouchers table
CREATE TABLE `vouchers` (
    `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `code` VARCHAR(255) UNIQUE NOT NULL,
    `name` VARCHAR(255) NULL,
    `description` TEXT NULL,
    `type` ENUM('product_discount', 'shipping_discount') NOT NULL,
    `value` DECIMAL(15, 2) NOT NULL, -- Nilai diskon (misal: 10000 atau 10.00 untuk 10%)
    `value_type` ENUM('fixed', 'percentage') NOT NULL,
    `start_date` TIMESTAMP NOT NULL,
    `end_date` TIMESTAMP NOT NULL,
    `usage_limit` INT UNSIGNED NULL, -- Total berapa kali bisa digunakan (global)
    `used_count` INT UNSIGNED NOT NULL DEFAULT 0, -- Jumlah yang sudah digunakan
    `min_order_amount` DECIMAL(15, 2) NULL,
    `applies_to` JSON NULL, -- Bisa menyimpan [product_ids], [category_ids], [vendor_ids]
    `created_by_user_id` BIGINT UNSIGNED NOT NULL, -- ID user yang membuat voucher (admin atau courier)
    `created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    `updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (`created_by_user_id`) REFERENCES `users`(`id`) ON DELETE RESTRICT
);

-- order_vouchers table (Pivot table untuk melacak voucher yang digunakan pada pesanan)
CREATE TABLE `order_vouchers` (
    `order_id` BIGINT UNSIGNED NOT NULL,
    `voucher_id` BIGINT UNSIGNED NOT NULL,
    `discount_amount` DECIMAL(15, 2) NOT NULL, -- Jumlah diskon yang benar-benar diterapkan pada pesanan ini
    PRIMARY KEY (`order_id`, `voucher_id`),
    FOREIGN KEY (`order_id`) REFERENCES `orders`(`id`) ON DELETE CASCADE,
    FOREIGN KEY (`voucher_id`) REFERENCES `vouchers`(`id`) ON DELETE RESTRICT
);

Dengan konsep dan rancangan database yang terperinci ini, Anda memiliki fondasi yang kuat untuk memulai pengembangan e-commerce multi-vendor Anda menggunakan Laravel. Apakah ada detail lain yang ingin Anda bahas sebelum melangkah ke tahap implementasi?

BLSNIAGA

Post navigation

Previous Post: Panduan untuk membuat dashboard sederhana untuk setting SMTP email di Laravel 11
Next Post: Langkah-Langkah Pembuatan E-commerce

Related Posts

Konsep E-commerce Multi-Vendor Komprehensif V2 BLSNIAGA
Tahap Pengembangan 16 BLSNIAGA
Langkah-Langkah Pembuatan E-commerce BLSNIAGA
Tahap Pengembangan 10 BLSNIAGA
Tahap Pengembangan 8 BLSNIAGA
Tahap Pengembangan 13-14 BLSNIAGA

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

Copyright © 2026 Kotak Kode Pemograman.

Powered by PressBook Grid Blogs theme