Dokumentasi Aplikasi Tambang Go

v1.0.0 Bahasa: Indonesia  |  Dibuat: Juli 2026
πŸͺ

1. Gambaran Umum Aplikasi

Tambang Go adalah platform e-commerce berbasis mobile (Android/iOS) yang dirancang khusus untuk jual-beli produk tali tambang. Aplikasi ini memungkinkan tiga jenis pengguna β€” Pembeli, Penjual, dan Administrator β€” untuk berinteraksi dalam ekosistem perdagangan yang terintegrasi secara penuh.

3
Role Pengguna
30+
Layar Aplikasi
50+
Endpoint API
15+
Tabel Database

πŸ‘€ Pembeli (Buyer)

Pengguna yang dapat menjelajahi katalog, menambahkan produk ke keranjang, melakukan pemesanan, dan mengelola riwayat transaksi. Mode tamu tersedia untuk menjelajahi tanpa login.

🏬 Penjual (Seller)

Pengguna yang dapat mengelola produk, menerima pesanan, memantau pendapatan, dan melakukan penarikan dana ke rekening bank.

πŸ›‘οΈ Administrator

Mengelola seluruh platform melalui panel web browser (bukan aplikasi mobile). Bertugas mengkonfirmasi pembayaran, memproses penarikan dana, mengelola pengguna, kategori, dan pengaturan sistem.

πŸ“Œ Catatan Penting: Meskipun nama proyeknya adalah "Tambang Go", backend yang digunakan adalah Laravel (PHP), bukan bahasa pemrograman Go. Nama "Go" kemungkinan merupakan nama merek/brand aplikasi.
βš™οΈ

2. Teknologi yang Digunakan

Apa itu Stack Teknologi?

Stack teknologi (tech stack) adalah kumpulan teknologi/bahasa/framework yang digunakan untuk membangun aplikasi. Tambang Go menggunakan stack Flutter + Laravel + MySQL:

  • Flutter β€” framework Google untuk membangun UI aplikasi mobile (Android/iOS) dengan satu codebase Dart
  • Laravel β€” framework PHP untuk membangun backend REST API dan panel admin web
  • MySQL β€” sistem database relasional untuk menyimpan data permanen

Pemilihan stack ini umum untuk aplikasi mobile + backend karena Flutter efisien untuk UI cross-platform, Laravel cepat untuk API, dan MySQL stabil untuk data transaksional e-commerce.

πŸ“± Frontend (Mobile App)

TeknologiVersiKegunaan
Flutter3.xFramework UI multi-platform
Dart SDKβ‰₯ 3.2.6Bahasa pemrograman
Provider^6.1.1State Management
HTTP^1.1.0Komunikasi dengan API
flutter_secure_storage^9.0.0Penyimpanan token aman
google_sign_in^6.2.2Login dengan Google
image_picker^1.0.7Upload foto produk/profil
cached_network_image^3.4.1Cache gambar dari internet
intl^0.20.2Format tanggal & mata uang (id_ID)

πŸ–₯️ Backend (REST API)

TeknologiVersiKegunaan
Laravel10.xFramework PHP REST API
PHPβ‰₯ 8.1Bahasa pemrograman backend
MySQL8.xDatabase relasional
Laravel Sanctum^3.2Autentikasi Bearer Token
Guzzle HTTP^7.2Validasi token Google OAuth
Laravel Bladebuilt-inTemplate HTML panel admin web
VitelatestBuild asset frontend panel admin

πŸ—‚οΈ Platform Target

PlatformStatusCatatan
Androidβœ… UtamaTarget utama pengembangan, ada google-services.json
iOSβœ… TersediaKonfigurasi tersedia, memerlukan Xcode
Web⚠️ TersediaFolder web tersedia, belum dioptimalkan
Windows / Linux / macOS⚠️ TersediaFolder desktop tersedia, belum dioptimalkan
Panel Admin Webβœ… BrowserDiakses melalui browser di /admin/login
πŸ—οΈ

3. Arsitektur Sistem

Sistem Tambang Go menggunakan arsitektur Client-Server dengan pemisahan yang jelas antara frontend (Flutter) dan backend (Laravel). Komunikasi data dilakukan melalui REST API berbasis JSON dengan autentikasi Bearer Token.

Apa itu Arsitektur Client-Server?

Arsitektur adalah cara komponen-komponen sistem diorganisir dan saling berkomunikasi. Pada arsitektur Client-Server, aplikasi dibagi menjadi dua pihak:

  • Client (Klien) β€” aplikasi yang dijalankan pengguna di perangkatnya (aplikasi Flutter di HP). Client bertugas menampilkan UI dan menerima input pengguna.
  • Server (Peladen) β€” program yang berjalan di komputer/server (Laravel). Server memproses logika bisnis, mengakses database, dan mengembalikan data ke client.

Pemisahan ini memungkinkan satu backend melayani banyak client (Android, iOS, web admin) sekaligus. Data disimpan terpusat di server sehingga konsisten untuk semua pengguna.

Analogi: Client seperti pelanggan di restoran (memesan via menu/app), server seperti dapur (memproses pesanan), dan database seperti gudang bahan (menyimpan data produk, pesanan, user).
πŸ“± Mobile App

Flutter (Dart)
Android / iOS

⇄
⚑ REST API

Laravel 10
PHP 8.1+

⇄
πŸ—„οΈ Database

MySQL 8
tambang_go

Panel Admin Web diakses melalui browser secara terpisah dari aplikasi mobile. Panel web menggunakan session cookie Laravel (bukan Bearer Token).

Pola Arsitektur Flutter

πŸ“ Entry point aplikasi: frontend/lib/main.dart β€” mendaftarkan 5 Provider via MultiProvider dan menampilkan SplashScreen.
// Alur data dalam aplikasi Flutter: Screen (Widget UI) β†’ memanggil β†’ Provider (State Management / ChangeNotifier) β†’ memanggil β†’ Service (Business Logic Layer) β†’ memanggil β†’ ApiService (HTTP Client Layer) β†’ request ke β†’ Laravel API (REST Backend) β†’ response β†’ JSON diparse ke β†’ Model (Data Transfer Object) β†’ dikembalikan ke β†’ Provider β†’ Screen diperbarui (notifyListeners)

Struktur Folder Proyek

tambang_go/ β”œβ”€β”€ frontend/ # Aplikasi Flutter β”‚ β”œβ”€β”€ lib/ β”‚ β”‚ β”œβ”€β”€ config/ # api_config.dart, app_assets.dart β”‚ β”‚ β”œβ”€β”€ models/ # DTO: User, Product, Order, Cart, dll. β”‚ β”‚ β”œβ”€β”€ providers/ # AuthProvider, ProductProvider, OrderProvider, dll. β”‚ β”‚ β”œβ”€β”€ screens/ # Layar UI (auth/, buyer/, seller/, admin/, profile/) β”‚ β”‚ β”œβ”€β”€ services/ # HTTP API clients β”‚ β”‚ β”œβ”€β”€ utils/ # auth_guard, shipping calculator, dll. β”‚ β”‚ └── widgets/ # Komponen reusable β”‚ └── pubspec.yaml β”‚ β”œβ”€β”€ backend-laravel/ # Backend Laravel β”‚ β”œβ”€β”€ app/ β”‚ β”‚ β”œβ”€β”€ Http/Controllers/Api/ # Controller API untuk Flutter β”‚ β”‚ β”œβ”€β”€ Http/Controllers/Web/Admin/ # Controller panel admin web β”‚ β”‚ β”œβ”€β”€ Http/Middleware/ # Guard role: buyer, seller, admin β”‚ β”‚ β”œβ”€β”€ Models/ # Eloquent ORM models β”‚ β”‚ └── Support/ # Business logic services β”‚ β”œβ”€β”€ database/ β”‚ β”‚ β”œβ”€β”€ migrations/ # 25 file migrasi database β”‚ β”‚ └── seeders/ # Data awal (admin, kategori, produk) β”‚ β”œβ”€β”€ routes/ β”‚ β”‚ β”œβ”€β”€ api.php # Semua route REST API β”‚ β”‚ └── web.php # Route panel admin web β”‚ └── resources/views/admin/ # Template Blade panel admin β”‚ └── docs/ # Dokumentasi tambahan
πŸ‘€

4. Fitur Pembeli (Buyer)

Pembeli adalah pengguna utama aplikasi mobile. Terdapat dua mode akses: Mode Tamu (tanpa login) dan Mode Login dengan akun terautentikasi.

🌐 Mode Tamu (Guest)

  • Menjelajahi katalog produk tali tambang
  • Melihat detail produk (gambar, spesifikasi, harga)
  • Mencari produk berdasarkan kata kunci
  • Memfilter produk berdasarkan kategori
  • Melihat banner promosi di halaman utama
  • Prompt login otomatis saat mencoba beli/keranjang

πŸ” Mode Terautentikasi

  • Semua fitur mode tamu
  • Menambahkan produk ke keranjang belanja
  • Melakukan proses checkout pesanan
  • Melihat riwayat dan detail pesanan
  • Mengelola profil dan foto
  • Mengakses dompet dan penarikan dana

Fitur Detail Pembeli

πŸ›οΈ Katalog Produk

  • Tampilan daftar produk dengan gambar, nama, harga, dan toko
  • Banner/slider promosi di bagian atas halaman
  • Pencarian real-time berdasarkan nama produk
  • Filter berdasarkan kategori (Tali Nilon, Tali Baja, dll.)
  • Pagination (infinite scroll atau pagination manual)
  • Detail produk: multi-gambar, diameter, material, berat, satuan (meter/roll/kg/pcs)

Kode: frontend/lib/screens/buyer/buyer_home_screen.dart (BuyerProductListPage) β†’ product_detail_screen.dart | Provider: frontend/lib/providers/product_provider.dart | API: backend-laravel/app/Http/Controllers/Api/ProductController.php

πŸ›’ Keranjang Belanja

  • Menambahkan produk dari toko yang berbeda ke satu keranjang
  • Mengubah jumlah item (increment/decrement)
  • Menghapus item dari keranjang
  • Preview ongkos kirim per toko (sebelum checkout)
  • Indikator jumlah item di ikon keranjang

Kode: frontend/lib/screens/buyer/cart_screen.dart | Provider: frontend/lib/providers/cart_provider.dart | Service: frontend/lib/services/cart_service.dart | API: backend-laravel/app/Http/Controllers/Api/CartController.php

πŸ’³ Checkout & Pembayaran

  • Metode Pengiriman: Kurir (bayar ongkir) atau Ambil di Toko (pickup gratis)
  • Metode Pembayaran: Transfer Bank atau COD (Bayar di Tempat)
  • Tampilkan rekening platform untuk transfer manual
  • Ringkasan harga: subtotal + pajak + komisi + ongkir = total
  • Pengecekan mode maintenance sebelum checkout

Kode: frontend/lib/screens/buyer/checkout_screen.dart, order_success_screen.dart | Widget: frontend/lib/widgets/order_price_breakdown.dart, platform_transfer_instructions.dart | API: backend-laravel/app/Http/Controllers/Api/OrderController.php method store()

πŸ“¦ Manajemen Pesanan

  • Riwayat pesanan dengan filter status
  • Detail pesanan lengkap (item, harga, status, info pengiriman)
  • Upload bukti pembayaran transfer (foto)
  • Konfirmasi penerimaan barang + upload bukti penerimaan
  • Pembatalan pesanan (hanya status tertentu)
  • Statistik ringkasan pembelian (total pesanan, pengeluaran, dll.)

Kode: frontend/lib/screens/buyer/order_history_screen.dart, order_detail_screen.dart, buyer_dashboard_screen.dart | Provider: frontend/lib/providers/order_provider.dart | API: backend-laravel/app/Http/Controllers/Api/OrderController.php

πŸ’° Dompet Pembeli

  • Saldo dompet dari refund pesanan yang dibatalkan
  • Riwayat transaksi dompet (kredit/debit)
  • Menambahkan rekening bank untuk pencairan
  • Pengajuan penarikan saldo ke rekening bank
πŸ“ Lokasi kode fitur dompet pembeli:
  • UI frontend/lib/screens/buyer/buyer_wallet_screen.dart
  • UI frontend/lib/screens/buyer/buyer_payment_account_screen.dart
  • Widget frontend/lib/widgets/buyer_wallet_chip.dart
  • Service frontend/lib/services/buyer_withdrawal_service.dart
  • API backend-laravel/app/Http/Controllers/Api/BuyerWithdrawalController.php
  • Logic backend-laravel/app/Support/BuyerWalletService.php
  • Model backend-laravel/app/Models/WalletTransaction.php
πŸ“ Ringkasan lokasi kode seluruh fitur pembeli: Lihat bagian 24. Implementasi Kode per Fitur untuk penjelasan alur kode lengkap dari UI β†’ Provider β†’ Service β†’ API.
🏬

5. Fitur Penjual (Seller)

Penjual adalah pengguna yang memiliki toko di platform Tambang Go. Pembeli dapat mengupgrade akunnya menjadi penjual langsung dari halaman profil.

πŸ“Š Dashboard Penjual

  • Ringkasan total produk aktif dan stok tersisa
  • Total nilai inventori (stok Γ— harga)
  • Ringkasan pendapatan (setelah komisi platform)
  • Shortcut cepat ke manajemen produk, pesanan, dan penarikan

πŸ“¦ Manajemen Produk

  • Daftar semua produk milik toko dengan status dan stok
  • Tambah produk baru dengan multi-foto, deskripsi, dan spesifikasi
  • Edit produk (nama, harga, deskripsi, gambar, spesifikasi)
  • Update stok secara terpisah (tanpa harus edit seluruh produk)
  • Nonaktifkan/aktifkan tampilan produk
  • Hapus produk
  • Statistik produk: jumlah aktif, stok rendah, nilai total

🚚 Manajemen Pesanan

  • Daftar pesanan masuk dengan filter status dan tanggal
  • Detail setiap pesanan (item, pembeli, metode pengiriman)
  • Update status pesanan: Konfirmasi β†’ Proses β†’ Kirim
  • Informasi alamat pengiriman pembeli

πŸ’° Keuangan Penjual

  • Rekening bank untuk pencairan dana (CRUD)
  • Saldo pendapatan bersih yang dapat dicairkan
  • Riwayat pengajuan penarikan dana
  • Pengajuan penarikan baru ke rekening yang terdaftar
  • Laporan keuangan per periode
πŸ’‘ Upgrade ke Penjual: Pengguna dengan role Pembeli dapat mengupgrade menjadi Penjual melalui halaman Profil β†’ tombol "Jadi Penjual". Kode: frontend/lib/screens/profile/profile_screen.dart memanggil frontend/lib/providers/auth_provider.dart β†’ method updateRole() β†’ endpoint PUT /api/profile/role di backend-laravel/app/Http/Controllers/Api/ProfileController.php.
πŸ“ Ringkasan lokasi kode fitur penjual:
  • Shell frontend/lib/screens/seller/seller_home_screen.dart
  • Dashboard frontend/lib/screens/seller/seller_dashboard_screen.dart
  • Produk frontend/lib/screens/seller/add_product_screen.dart, edit_product_screen.dart
  • Pesanan frontend/lib/screens/seller/seller_order_screen.dart
  • Keuangan frontend/lib/screens/seller/withdrawal_request_screen.dart, payment_account_screen.dart
  • API Produk backend-laravel/app/Http/Controllers/Api/ProductController.php
  • API Penarikan backend-laravel/app/Http/Controllers/Api/SellerWithdrawalController.php
  • Pendapatan backend-laravel/app/Support/SellerEarningsCalculator.php
πŸ›‘οΈ

6. Fitur Administrator

⚠️ Admin Tidak Bisa Login di Mobile! Akun administrator hanya dapat diakses melalui panel web browser di alamat /admin/login. Jika admin mencoba login di aplikasi mobile, sistem akan menolak dan menampilkan layar "Admin Access Denied".

πŸ‘₯ Manajemen Pengguna

  • Melihat dan mencari semua pengguna terdaftar
  • Detail profil setiap pengguna (role, status, kontak)
  • Membuat akun pengguna baru
  • Mengubah data dan role pengguna
  • Menonaktifkan/menghapus akun pengguna

🏷️ Manajemen Kategori

  • Membuat kategori produk baru (misal: Tali Nilon, Tali Baja, Tali Rami)
  • Edit dan hapus kategori
  • Upload gambar kategori
  • Aktifkan/nonaktifkan kategori

πŸ“‹ Manajemen Pesanan

  • Melihat semua pesanan dari seluruh penjual
  • Filter pesanan berdasarkan status dan tanggal
  • Konfirmasi pembayaran transfer (setelah memeriksa bukti bayar pembeli)
  • Mengubah status pesanan secara manual

πŸ’Έ Manajemen Penarikan Dana

  • Daftar pengajuan penarikan dari penjual (Seller Withdrawals)
  • Daftar pengajuan penarikan dari pembeli (Buyer Withdrawals)
  • Approve atau tolak pengajuan penarikan dengan catatan
  • Riwayat lengkap semua transaksi penarikan

βš™οΈ Pengaturan Platform

  • Persentase komisi platform dari setiap transaksi
  • Persentase pajak (opsional)
  • Biaya ongkos kirim kurir (per toko)
  • Nama dan alamat toko untuk pickup
  • Rekening bank platform (untuk pembayaran transfer)
  • Jumlah minimum penarikan dana
  • Aktifkan/nonaktifkan mode maintenance

πŸ–ΌοΈ Banner Promosi

  • Upload banner gambar untuk slider di halaman katalog pembeli
  • Mengelola (hapus) banner yang ada

πŸ“ˆ Laporan Pendapatan

  • Laporan pendapatan platform (total komisi yang diterima)
  • Laporan pendapatan penjual (per penjual)
πŸ“ Lokasi kode fitur admin (panel web browser):
  • Routes backend-laravel/routes/web.php β€” prefix /admin/*
  • Login backend-laravel/app/Http/Controllers/Web/Admin/AuthController.php
  • Dashboard backend-laravel/app/Http/Controllers/Web/Admin/DashboardController.php
  • User backend-laravel/app/Http/Controllers/Web/Admin/UserController.php
  • Pesanan backend-laravel/app/Http/Controllers/Web/Admin/OrderController.php
  • Penarikan backend-laravel/app/Http/Controllers/Web/Admin/WithdrawalController.php, BuyerWithdrawalController.php
  • Pengaturan backend-laravel/app/Http/Controllers/Web/Admin/SettingsController.php
  • Middleware backend-laravel/app/Http/Middleware/IsWebAdmin.php
  • Blokir Mobile frontend/lib/screens/auth/admin_access_denied_screen.dart
πŸ“±

7. Layar Aplikasi Flutter

Aplikasi menggunakan MaterialPageRoute untuk navigasi antar layar (push/pop). Setiap role memiliki halaman utama dengan Bottom Navigation Bar berisi 4 tab. Semua path file relatif terhadap frontend/lib/screens/.

πŸ“ Lokasi kode navigasi & routing:
  • frontend/lib/main.dart β€” SplashScreen memuat auth + banner, lalu navigasi ke HomeScreen
  • frontend/lib/screens/home_screen.dart β€” router berdasarkan role (Consumer<AuthProvider>)
  • frontend/lib/screens/buyer/buyer_home_screen.dart β€” bottom nav pembeli (4 tab)
  • frontend/lib/screens/seller/seller_home_screen.dart β€” bottom nav penjual (4 tab)
  • frontend/lib/utils/auth_guard.dart β€” proteksi aksi yang memerlukan login

πŸ”‘ Layar Autentikasi

FileNama LayarDeskripsi
main.dart β†’ SplashScreenLayar SplashDitampilkan saat aplikasi pertama kali dibuka. Memuat status autentikasi dan prefetch data banner, lalu redirect ke layar yang sesuai.
home_screen.dartHome RouterLayar pengarah yang menentukan destinasi berdasarkan role pengguna: buyer β†’ BuyerHomeScreen, seller β†’ SellerHomeScreen, admin β†’ AdminAccessDeniedScreen, tamu β†’ BuyerHomeScreen.
auth/login_screen.dartLoginForm login dengan email/password dan tombol Login dengan Google. Validasi input sebelum mengirim request.
auth/register_screen.dartRegistrasiForm pendaftaran akun baru. Pengguna dapat memilih role awal: Pembeli atau Penjual.
auth/admin_access_denied_screen.dartAdmin DitolakLayar informasi bahwa admin tidak dapat login di aplikasi mobile. Menampilkan instruksi untuk menggunakan panel web.

πŸ‘€ Layar Pembeli (Buyer)

FileNama LayarTabDeskripsi
buyer/buyer_home_screen.dartHome PembeliBottom NavContainer utama dengan 4 tab: Katalog, Pesanan, Dashboard, Profil.
buyer/product_detail_screen.dartDetail Produkβ€”Tampilan lengkap satu produk: galeri foto carousel, nama, harga, stok, spesifikasi (diameter, material, berat, satuan), deskripsi, dan tombol Tambah ke Keranjang.
buyer/cart_screen.dartKeranjang Belanjaβ€”Daftar semua item di keranjang, dikelompokkan per toko. Edit jumlah, hapus item, preview ongkir, dan tombol Checkout.
buyer/checkout_screen.dartCheckoutβ€”Pilih metode pengiriman (kurir/pickup) dan metode pembayaran (transfer/COD). Tampilkan rincian harga dan rekening tujuan transfer.
buyer/order_success_screen.dartPesanan Berhasilβ€”Konfirmasi pesanan sukses dengan nomor pesanan dan instruksi pembayaran (untuk transfer).
buyer/order_history_screen.dartRiwayat PesananTab 2Daftar semua pesanan dengan filter status. Bisa tap untuk melihat detail.
buyer/order_detail_screen.dartDetail Pesananβ€”Informasi lengkap pesanan: item, harga, status, metode bayar/kirim, dan aksi (upload bukti bayar, konfirmasi terima, batalkan).
buyer/buyer_dashboard_screen.dartDashboard StatistikTab 3Statistik ringkasan belanja: total pesanan, total pengeluaran, jumlah per status pesanan.
buyer/buyer_wallet_screen.dartDompet Pembeliβ€”Saldo dompet dari refund, riwayat transaksi dompet, dan aksi penarikan saldo.
buyer/buyer_payment_account_screen.dartRekening Bank Pembeliβ€”Daftar rekening bank yang terdaftar untuk pencairan saldo dompet. CRUD rekening.

🏬 Layar Penjual (Seller)

FileNama LayarTabDeskripsi
seller/seller_home_screen.dartHome PenjualBottom NavContainer utama penjual dengan 4 tab: Dashboard, Produk, Pesanan, Profil.
seller/seller_dashboard_screen.dartDashboard PenjualTab 1Ringkasan KPI toko: total produk, stok, nilai inventori, pendapatan. Tombol shortcut ke fitur utama.
seller/add_product_screen.dartTambah Produkβ€”Form lengkap untuk menambahkan produk baru: nama, kategori, harga, stok, deskripsi, spesifikasi (diameter/material/berat/satuan), upload multi-foto.
seller/edit_product_screen.dartEdit Produkβ€”Form edit produk yang sudah ada. Data terisi otomatis dari API.
seller/seller_order_screen.dartPesanan MasukTab 3Daftar pesanan yang mengandung produk milik toko ini. Filter berdasarkan status dan rentang tanggal.
seller/payment_account_screen.dartRekening Penjualβ€”Manajemen rekening bank penjual untuk pencairan pendapatan.
seller/withdrawal_request_screen.dartPenarikan Danaβ€”Form pengajuan penarikan pendapatan ke rekening yang terdaftar. Tampilkan saldo yang tersedia.
financial_report_screen.dartLaporan Keuanganβ€”Laporan pendapatan penjual per periode waktu.

πŸ‘€ Layar Profil (Semua Role)

FileNama LayarDeskripsi
profile/profile_screen.dartProfil UtamaTampilkan foto, nama, email, role. Menu: Edit Profil, Ganti Password, Jadi Penjual (khusus buyer), Dompet (khusus buyer), Logout.
profile/edit_profile_screen.dartEdit ProfilForm untuk mengubah nama, nomor telepon, alamat, dan foto profil.
profile/change_password_screen.dartGanti PasswordForm ganti password dengan verifikasi password lama.

🧩 Widget Reusable

FileNama WidgetFungsi
widgets/guest_auth_prompt.dartGuest Auth PromptOverlay/dialog yang muncul saat tamu mencoba aksi yang memerlukan login (checkout, lihat pesanan, dll.)
widgets/google_sign_in_button.dartTombol Google Sign-InTombol login dengan Google yang sudah diformat sesuai panduan Google.
widgets/buyer_wallet_chip.dartChip DompetKomponen kecil yang menampilkan saldo dompet pembeli. Bisa di-tap untuk membuka layar dompet.
widgets/product_banner_slider.dartSlider BannerCarousel/slider otomatis yang menampilkan banner promosi dari API.
widgets/order_price_breakdown.dartRincian HargaKomponen yang menampilkan breakdown harga pesanan: subtotal, pajak, komisi, ongkir, total.
widgets/platform_transfer_instructions.dartInstruksi TransferTampilkan rekening bank platform dan instruksi cara bayar via transfer.
πŸ”

9. Sistem Autentikasi

Apa itu Autentikasi dan Otorisasi?

Autentikasi (Authentication) adalah proses memverifikasi identitas pengguna β€” menjawab pertanyaan "Siapa Anda?". Contoh: login dengan email/password atau Google Sign-In. Jika kredensial benar, sistem mengenali siapa pengguna tersebut.

Otorisasi (Authorization) adalah proses menentukan apa yang boleh dilakukan pengguna setelah teridentifikasi β€” menjawab pertanyaan "Apa yang Anda boleh akses?". Contoh: pembeli boleh checkout, penjual boleh kelola produk, admin boleh konfirmasi pembayaran.

Di Tambang Go, autentikasi mobile menggunakan Bearer Token (token Sanctum dari Laravel). Setiap request ke API membawa token ini sebagai "kartu identitas digital". Middleware backend (buyer, seller, admin) mengecek role sebelum mengizinkan akses endpoint tertentu.

Contoh di aplikasi: Saat pembeli login, AuthProvider menyimpan token. Saat menambah item ke keranjang, token dikirim ke server. Server memverifikasi token valid dan role = buyer sebelum memproses request.

Mekanisme Autentikasi API

Backend menggunakan Laravel Sanctum untuk menghasilkan Bearer Token. Token ini disimpan di sisi klien menggunakan flutter_secure_storage (penyimpanan aman berbasis Keystore/Keychain).

πŸ“ Lokasi kode autentikasi:
  • UI Login frontend/lib/screens/auth/login_screen.dart
  • UI Register frontend/lib/screens/auth/register_screen.dart
  • State frontend/lib/providers/auth_provider.dart β€” method: login(), register(), loginWithGoogle(), logout()
  • Service frontend/lib/services/auth_service.dart
  • Google OAuth frontend/lib/services/google_auth_service.dart
  • HTTP + Token frontend/lib/services/api_service.dart β€” saveToken(), getToken()
  • Controller backend-laravel/app/Http/Controllers/Api/AuthController.php
  • Routes backend-laravel/routes/api.php β€” baris 35–37, 57–58
  • Model backend-laravel/app/Models/User.php
// Header yang disertakan di setiap request ter-autentikasi: Authorization: Bearer {token} Content-Type: application/json // Kunci penyimpanan di klien: auth_token // Token Sanctum user_data // Data user (JSON)

Metode Login yang Tersedia

MetodeEndpointRequest BodyKeterangan
Email/Password POST /api/login {"email": "...", "password": "..."} Hanya untuk role buyer dan seller. Admin ditolak.
Registrasi POST /api/register {"name", "email", "password", "role"} Role bisa buyer atau seller.
Google OAuth POST /api/auth/google {"access_token": "google_token"} Menggunakan package google_sign_in. Token Google divalidasi oleh backend via Guzzle.

Response Autentikasi

{ "user": { "id": 1, "name": "John Doe", "email": "john@example.com", "role": "buyer", "profile_photo": "/storage/photos/1.jpg" }, "token": "1|abc123xyz...", "token_type": "Bearer" }

Middleware Proteksi Route

MiddlewarePengecekanBerlaku Pada
auth:sanctumToken valid di tabel personal_access_tokensSemua route proteksi
buyeruser.role === 'buyer'Route /buyer/*
selleruser.role === 'seller'Route /seller/*
adminuser.role === 'admin'Route /admin/* (API)
admin.webSession admin aktifRoute /admin/* (Web Panel)
🌐

10. API Endpoint Publik

Apa itu REST API?

API (Application Programming Interface) adalah antarmuka yang memungkinkan dua program saling berkomunikasi. REST (Representational State Transfer) adalah gaya arsitektur API yang populer, menggunakan protokol HTTP dengan operasi standar:

  • GET β€” mengambil/membaca data (contoh: daftar produk)
  • POST β€” membuat data baru (contoh: registrasi, checkout)
  • PUT β€” memperbarui data (contoh: edit profil)
  • DELETE β€” menghapus data (contoh: hapus item keranjang)

Data dipertukarkan dalam format JSON (teks terstruktur yang mudah dibaca mesin). Endpoint adalah URL spesifik, misalnya GET /api/products untuk mengambil daftar produk.

Analogi: REST API seperti menu restoran dengan nomor pesanan. Client memesan "GET /products" (lihat daftar makanan), server mengembalikan daftar dalam format JSON. Client tidak perlu tahu bagaimana dapur (backend) menyiapkan data β€” cukup tahu cara memesan.

Endpoint berikut dapat diakses tanpa autentikasi. Cocok untuk fitur browse produk mode tamu.

Base URL: http://10.0.2.2:8001/api (Android Emulator) β€” didefinisikan di frontend/lib/config/api_config.dart baris 6. Route backend: backend-laravel/routes/api.php.
MethodEndpointFungsiQuery Parameter
POST /register Daftar akun baru β€”
POST /login Login email & password β€”
POST /auth/google Login dengan Google β€”
GET /products Daftar produk (katalog) search, category_id, page
GET /products/{id} Detail satu produk β€”
GET /categories Daftar semua kategori β€”
GET /categories/{id} Detail satu kategori β€”
GET /settings/storefront Data banner slider & info toko β€”

Contoh Response: GET /products

{ "data": [ { "id": 1, "name": "Tali Nilon 10mm", "price": 15000, "stock": 500, "unit": "meter", "diameter": "10mm", "material": "Nilon", "image": "/storage/products/1.jpg", "seller": { "id": 2, "name": "Toko Tambang Jaya" }, "category": { "id": 1, "name": "Tali Nilon" } } ], "meta": { "current_page": 1, "total": 45, "per_page": 15 } }
πŸ‘€

11. API Endpoint Pembeli

πŸ”’ Endpoint Umum (Semua Role Terautentikasi)

MethodEndpointFungsi
POST/logoutHapus token & logout
GET/meData user yang sedang login
GET/profileTampilkan profil lengkap
PUT/profileUpdate data profil (nama, telepon, alamat)
PUT/profile/roleUpgrade role dari buyer ke seller
PUT/profile/passwordGanti password
POST/profile/photoUpload foto profil (multipart/form-data)
GET/settings/checkoutPengaturan checkout: pajak, ongkir, mode maintenance

πŸ›’ Keranjang Belanja (/cart)

MethodEndpointFungsiRequest Body
GET/cartAmbil isi keranjang + info lokasi pickup + preview ongkirβ€”
POST/cartTambah item ke keranjang{"product_id": 1, "quantity": 2}
PUT/cart/{id}Update jumlah item{"quantity": 3}
DELETE/cart/{id}Hapus satu itemβ€”
DELETE/cartKosongkan seluruh keranjangβ€”
GET/cart/countJumlah total item di keranjangβ€”

πŸ“¦ Pesanan (/orders)

MethodEndpointFungsiRequest/Query
GET/ordersDaftar pesanan pembeliQuery: status
GET/orders/statisticsStatistik ringkasan pesananβ€”
POST/ordersBuat pesanan baru (checkout dari keranjang){"shipping_method", "payment_method", "address", ...}
GET/orders/{id}Detail pesanan beserta itemβ€”
POST/orders/{id}/cancelBatalkan pesananβ€”
POST/orders/{id}/payment-proofUpload bukti pembayaran transfermultipart: proof (file gambar)
POST/orders/{id}/confirm-receiptKonfirmasi barang diterima + upload bukti penerimaanmultipart: proof (file gambar)

πŸ’° Dompet & Penarikan Pembeli (/buyer/*)

MethodEndpointFungsi
GET/buyer/wallet/balanceSaldo dompet + riwayat transaksi
GET/buyer/payment-accountsDaftar rekening bank buyer
POST/buyer/payment-accountsTambah rekening bank baru
PUT/buyer/payment-accounts/{id}Update data rekening
DELETE/buyer/payment-accounts/{id}Hapus rekening
GET/buyer/withdrawalsRiwayat pengajuan penarikan
POST/buyer/withdrawalsAjukan penarikan saldo dompet
🏬

12. API Endpoint Penjual

Semua endpoint berikut memerlukan autentikasi Sanctum + middleware seller (role harus seller). Prefix: /seller/

πŸ“¦ Manajemen Produk (/seller/products)

MethodEndpointFungsiKeterangan
GET/seller/productsDaftar produk milik toko iniFilter/pagination tersedia
GET/seller/products/statisticsStatistik produk (total, stok rendah, nilai)β€”
POST/seller/products/upload-imageUpload gambar produkmultipart/form-data, field: image
POST/seller/productsBuat produk baruJSON dengan semua field produk
PUT/seller/products/{id}Update produkHanya pemilik produk
DELETE/seller/products/{id}Hapus produkHanya pemilik produk
PUT/seller/products/{id}/stockUpdate stok sajaBody: {"stock": 100}

πŸ“‹ Pesanan Masuk (/seller/orders)

MethodEndpointFungsiRequest
GET/seller/ordersDaftar pesanan yang berisi produk toko iniQuery: status, date_from, date_to
PUT/seller/orders/{id}/statusUpdate status pesananBody: {"status": "confirmed"|"processing"|"shipped"}

🏦 Rekening & Penarikan Penjual

MethodEndpointFungsi
GET/seller/payment-accountsDaftar rekening bank penjual
POST/seller/payment-accountsTambah rekening baru
PUT/seller/payment-accounts/{id}Update data rekening
DELETE/seller/payment-accounts/{id}Hapus rekening
GET/seller/withdrawals/balanceSaldo pendapatan bersih yang bisa dicairkan
GET/seller/withdrawalsRiwayat pengajuan penarikan
POST/seller/withdrawalsAjukan penarikan pendapatan
πŸ›‘οΈ

13. API Endpoint Admin

Semua endpoint berikut memerlukan autentikasi Sanctum + middleware admin. Prefix: /admin/. Endpoint ini digunakan oleh panel web admin (browser).

MethodEndpointFungsi
GET/admin/settingsAmbil pengaturan platform saat ini
PUT/admin/settingsUpdate pengaturan platform
GET/admin/product-bannersDaftar banner promosi
POST/admin/product-bannersUpload banner baru (multipart)
DELETE/admin/product-banners/{id}Hapus banner
GET/admin/usersDaftar semua pengguna
POST/admin/usersBuat pengguna baru
GET/admin/users/{id}Detail pengguna
PUT/admin/users/{id}Update data pengguna
DELETE/admin/users/{id}Hapus pengguna
GET/admin/ordersSemua pesanan di platform
PUT/admin/orders/{id}/statusUpdate status pesanan
PUT/admin/orders/{id}/paymentUpdate status pembayaran (konfirmasi transfer)
GET/admin/withdrawalsSemua pengajuan penarikan penjual
PUT/admin/withdrawals/{id}Approve/tolak penarikan penjual
GET/admin/buyer-withdrawalsSemua pengajuan penarikan pembeli
PUT/admin/buyer-withdrawals/{id}Approve/tolak penarikan pembeli
πŸ—„οΈ

14. Skema Database

Apa itu Database dan Skema?

Database adalah tempat penyimpanan data aplikasi secara permanen. Tanpa database, data hilang setiap kali aplikasi ditutup. Tambang Go menggunakan MySQL, database relasional yang menyimpan data dalam bentuk tabel (seperti spreadsheet Excel).

Skema database adalah struktur/definisi tabel: nama kolom, tipe data, dan relasi antar tabel. Contoh: tabel products punya kolom name, price, stock; tabel orders terhubung ke users (pembeli) via buyer_id.

  • Migrasi β€” file PHP yang mendefinisikan/mengubah struktur tabel secara terkontrol
  • Seeder β€” script untuk mengisi data awal (admin, kategori sample, produk demo)
  • Foreign Key (FK) β€” relasi antar tabel (misal: product.seller_id β†’ users.id)
Contoh di Tambang Go: Saat checkout, backend menulis ke tabel orders dan order_items, lalu mengurangi stock di tabel products β€” semua dalam satu transaksi database agar data konsisten.

Database menggunakan MySQL dengan nama database tambang_go. Struktur tabel didefinisikan di backend-laravel/database/migrations/ (25 file migrasi). Data awal diisi oleh backend-laravel/database/seeders/.

Tabel users

KolomTipeNullableKeterangan
idbigint UNSIGNEDNoPrimary Key, Auto Increment
namevarchar(255)NoNama lengkap
emailvarchar(255)NoUnique, digunakan untuk login
google_idvarchar(255)YesID akun Google (OAuth), Unique
email_verified_attimestampYesWaktu verifikasi email
passwordvarchar(255)YesHash bcrypt (null untuk akun Google-only)
phonevarchar(255)YesNomor telepon
addresstextYesAlamat (juga digunakan sebagai alamat toko penjual)
profile_photovarchar(255)YesPath foto profil di storage
roleenum('admin','seller','buyer')NoRole pengguna
statusenum('active','inactive')NoDefault: active
remember_tokenvarchar(100)YesToken "ingat saya"
created_at / updated_attimestampYesTimestamps otomatis

Tabel categories

KolomTipeKeterangan
idbigint PKPrimary Key
namevarchar(255)Nama kategori (contoh: Tali Nilon, Tali Baja)
slugvarchar(255) UNIQUEURL-friendly identifier
descriptiontext nullableDeskripsi kategori
imagevarchar(255) nullablePath gambar kategori
is_activebooleanStatus aktif/nonaktif kategori

Tabel products

KolomTipeKeterangan
idbigint PKβ€”
seller_idbigint FK β†’ usersPenjual pemilik produk
category_idbigint FK β†’ categoriesKategori produk
namevarchar(255)Nama produk
slugvarchar(255) UNIQUEURL-friendly identifier
descriptiontext nullableDeskripsi lengkap produk
pricedecimal(12,2)Harga satuan
stockintegerStok tersedia
imagevarchar(255) nullableGambar utama
imagesJSON nullableArray path gambar tambahan (multi-foto)
unitenum('meter','roll','kg','pcs')Satuan produk
weightdecimal nullableBerat produk (kg)
diametervarchar(50) nullableDiameter tali (contoh: "10mm")
materialvarchar(100) nullableMaterial tali (contoh: "Nilon", "Baja")
is_activebooleanStatus tampil di katalog

Tabel orders

KolomTipeKeterangan
idbigint PKβ€”
order_numbervarchar UNIQUEFormat: ORD-YYYYMMDD-XXXXXX
buyer_idbigint FK β†’ usersPembeli yang memesan
subtotaldecimal(15,2)Total harga barang (sebelum pajak/komisi/ongkir)
tax_amountdecimal(15,2)Nominal pajak
commission_amountdecimal(15,2)Nominal komisi platform
commission_percentdecimal(5,2)Persentase komisi saat transaksi
total_amountdecimal(15,2)subtotal + pajak + komisi
shipping_costdecimal(15,2)Ongkos kirim
shipping_methodenum('pickup','courier')Metode pengiriman
statusenumpending/confirmed/processing/shipped/delivered/cancelled
payment_statusenumunpaid/pending_payment/pending_confirmation/paid/refunded
payment_methodenum('transfer','cod')Metode pembayaran
shipping_namevarchar nullableNama penerima
shipping_phonevarchar nullableTelepon penerima
shipping_addresstext nullableAlamat pengiriman
payment_proof_imagevarchar nullablePath bukti pembayaran transfer
receipt_proof_imagevarchar nullablePath bukti penerimaan barang
paid_attimestamp nullableWaktu pembayaran dikonfirmasi
shipped_attimestamp nullableWaktu pesanan dikirim
delivered_attimestamp nullableWaktu pesanan diterima

Tabel order_items

KolomTipeKeterangan
idbigint PKβ€”
order_idbigint FK β†’ ordersPesanan terkait
product_idbigint FK β†’ productsProduk yang dipesan
seller_idbigint FK β†’ usersPenjual produk (disimpan untuk history)
product_namevarcharSnapshot nama produk saat pembelian
product_pricedecimalSnapshot harga saat pembelian
quantityintegerJumlah unit yang dipesan
subtotaldecimalproduct_price Γ— quantity

Tabel platform_settings

KolomTipeKeterangan
commission_percentdecimal(5,2)Persentase komisi (contoh: 5.00)
tax_percentdecimal(5,2)Persentase pajak (0 jika tidak ada)
shipping_courier_costdecimal(15,2)Biaya kurir per toko
min_withdrawal_amountdecimal(15,2)Minimum saldo untuk penarikan
pickup_store_namevarcharNama toko/lokasi pickup
pickup_store_addresstextAlamat lengkap pickup
payment_bank_namevarcharNama bank platform (untuk transfer buyer)
payment_account_numbervarcharNomor rekening platform
payment_account_holder_namevarcharNama pemilik rekening platform
maintenance_modebooleanAktifkan mode maintenance (blokir checkout)
maintenance_messagetext nullablePesan yang ditampilkan saat maintenance

Tabel-tabel Lainnya

Nama TabelFungsiKolom Utama
cartsItem keranjang belanjauser_id, product_id, quantity β€” UNIQUE(user_id, product_id)
seller_payment_accountsRekening bank penjual untuk pencairanuser_id, bank_name, account_number, account_holder_name, is_default
withdrawal_requestsPengajuan penarikan penjualseller_id, amount, bank info, status (pending/approved/rejected/completed), admin_note, processed_by
buyer_payment_accountsRekening bank pembeli untuk pencairan dompetuser_id, bank_name, account_number, account_holder_name, is_default
buyer_withdrawal_requestsPengajuan penarikan pembelibuyer_id, amount, bank info, status, admin_note
wallet_transactionsRiwayat transaksi dompet pembeliuser_id, type (credit/debit), amount, source_type, source_id, description
product_bannersBanner promosi untuk slider katalogimage (path file)
personal_access_tokensToken Sanctum (dikelola Laravel otomatis)tokenable_type, tokenable_id, token (hashed)
πŸ“

15. Model Data Flutter

Apa itu Model Data (DTO)?

Model adalah kelas/kelas data yang merepresentasikan entitas bisnis dalam kode. Di Flutter, model berfungsi sebagai DTO (Data Transfer Object) β€” objek perantara yang mengubah data JSON dari API menjadi struktur Dart yang mudah digunakan di UI.

Tanpa model, developer harus mengakses data mentah seperti json['name'] di setiap tempat. Dengan model, cukup product.name β€” lebih aman, terbaca, dan terhindar dari typo.

  • fromJson() β€” method untuk memparse JSON β†’ objek Dart
  • toJson() β€” method untuk mengubah objek Dart β†’ JSON (saat kirim ke API)
  • Model Flutter (frontend/lib/models/) ↔ Model Laravel/Eloquent (backend-laravel/app/Models/) merepresentasikan entitas yang sama
Contoh: Response API GET /products/1 berupa JSON. Class Product.fromJson() di product.dart mengubahnya menjadi objek Product dengan properti name, price, stock yang bisa langsung ditampilkan di ProductDetailScreen.

Model Flutter berfungsi sebagai Data Transfer Object (DTO) β€” yaitu kelas yang memetakan data JSON dari API ke objek Dart. Semua model berada di folder frontend/lib/models/. Model backend (Eloquent) ada di backend-laravel/app/Models/.

File ModelKelasField Utama
models/user.dart User id, name, email, role, phone, address, profilePhoto, status, googleId
models/product.dart Product id, sellerId, categoryId, name, slug, description, price, stock, image, images (List), unit, weight, diameter, material, isActive, seller, category
models/category.dart Category id, name, slug, description, image, isActive
models/cart_item.dart CartItem, Cart id, productId, quantity, product (nested); Cart juga berisi pickupLocations, shippingPreview
models/order.dart Order, OrderItem id, orderNumber, buyerId, subtotal, taxAmount, commissionAmount, totalAmount, shippingCost, shippingMethod, status, paymentStatus, paymentMethod, items (List<OrderItem>)
models/payment_account.dart PaymentAccount id, userId, bankName, accountNumber, accountHolderName, isDefault
models/withdrawal_request.dart WithdrawalRequest id, sellerId, amount, bankName, accountNumber, accountHolderName, status, adminNote, processedBy, createdAt
models/buyer_withdrawal_request.dart BuyerWithdrawalRequest id, buyerId, amount, bankInfo, status, adminNote, createdAt
models/product_banner.dart ProductBanner id, image (path)
models/api_response.dart ApiResponse<T> Generik wrapper: success (bool), message (String), data (T nullable), errors (Map nullable)

Contoh Model: Product

class Product { final int id; final int sellerId; final String name; final double price; final int stock; final String unit; // 'meter' | 'roll' | 'kg' | 'pcs' final String? diameter; final String? material; final List<String> images; Product.fromJson(Map<String, dynamic> json) : id = json['id'], name = json['name'], price = double.parse(json['price'].toString()), // ... dan seterusnya images = List<String>.from(json['images'] ?? []); }
πŸ”„

16. Alur Bisnis Utama

Apa itu Alur Bisnis (Business Flow)?

Alur bisnis adalah rangkaian langkah/logika yang harus dilalui untuk menyelesaikan proses bisnis dari awal sampai akhir. Di e-commerce, alur bisnis mendefinisikan siapa melakukan apa, kapan, dan dalam kondisi apa.

Memahami alur bisnis penting karena kode aplikasi seharusnya merefleksikan proses bisnis nyata. Setiap langkah alur biasanya diimplementasikan oleh kombinasi layar UI, API endpoint, dan perubahan status di database.

Contoh alur checkout di Tambang Go: Pembeli pilih barang β†’ checkout β†’ upload bukti bayar β†’ admin konfirmasi β†’ penjual kirim β†’ pembeli konfirmasi terima. Setiap panah adalah aksi yang memicu perubahan kode di frontend dan backend.

Alur Pembelian Lengkap (Transfer Bank)

πŸ“ File kode terkait alur checkout transfer: frontend/lib/screens/buyer/checkout_screen.dart β†’ frontend/lib/providers/order_provider.dart β†’ backend-laravel/app/Http/Controllers/Api/OrderController.php (store, uploadPaymentProof, confirmReceipt, cancel)
Tambah ke Keranjang
β†’
Checkout
(pilih metode)
β†’
POST /orders
stok berkurang
β†’
Status: pending
keranjang bersih
Upload Bukti Bayar
payment-proof
β†’
pending_confirmation
menunggu admin
β†’
Admin Konfirmasi
status: paid
β†’
Seller Proses
confirmed β†’ shipped
Buyer Konfirmasi
confirm-receipt
β†’
Status: delivered
Selesai βœ“

Alur Pembelian COD (Bayar di Tempat)

Checkout COD
β†’
Status: pending
payment: unpaid
β†’
Seller Kirim Barang
status: shipped
β†’
Bayar + Terima Barang
status: delivered

Alur Pembatalan & Refund

Buyer Batalkan
POST /cancel
β†’
Cek: Ada Bukti Bayar?
YA: Refund ke Dompet
payment: refunded
TIDAK: Batalkan Langsung
status: cancelled

Alur Penarikan Dana Penjual

Seller Ajukan
POST /withdrawals
β†’
Status: pending
menunggu admin
β†’
Admin Review
β†’
approved/completed
atau
rejected
πŸ“‹

17. Status Pesanan & Pembayaran

Apa itu Status Pesanan dan Status Pembayaran?

Dalam sistem e-commerce, setiap pesanan memiliki dua dimensi status yang melacak progres berbeda:

  • Status Pesanan (Order Status) β€” melacak progres pengiriman barang: pending β†’ confirmed β†’ processing β†’ shipped β†’ delivered (atau cancelled).
  • Status Pembayaran (Payment Status) β€” melacak progres pembayaran uang: unpaid β†’ pending_payment β†’ pending_confirmation β†’ paid β†’ refunded.

Kedua status berjalan paralel. Misalnya pesanan bisa sudah confirmed (penjual siap kirim) sementara pembayaran masih pending_confirmation (menunggu admin cek bukti transfer).

Analogi: Status pesanan seperti pelacakan paket JNE (sudah dikirim/belum). Status pembayaran seperti status tagihan (sudah lunas/belum). Keduanya perlu dipantau terpisah.

Status Pesanan (Order Status)

pending
β†’
confirmed
β†’
processing
β†’
shipped
β†’
delivered
|
cancelled
StatusDitetapkan OlehKondisi
pendingSistem otomatisSaat checkout berhasil. Menunggu konfirmasi seller.
confirmedSellerSeller telah mengkonfirmasi pesanan dan siap diproses.
processingSellerPesanan sedang dikemas/disiapkan.
shippedSellerBarang sudah diserahkan ke kurir/siap diambil.
deliveredBuyerBuyer mengkonfirmasi barang sudah diterima (via confirm-receipt).
cancelledBuyer/AdminPesanan dibatalkan. Stok dikembalikan.

Status Pembayaran (Payment Status)

StatusKeteranganMetode
unpaidBelum dibayarCOD β€” menunggu pembayaran saat barang tiba
pending_paymentMenunggu pembayaranTransfer β€” buyer belum upload bukti bayar
pending_confirmationMenunggu konfirmasi adminTransfer β€” bukti bayar sudah diupload, admin belum konfirmasi
paidSudah dibayarTransfer (dikonfirmasi admin) atau COD (barang diterima)
refundedDana dikembalikan ke dompetTransfer yang sudah dikonfirmasi lalu pesanan dibatalkan
πŸ’°

18. Perhitungan Harga Pesanan

Apa itu Struktur Harga E-Commerce?

Harga yang dibayar pembeli tidak hanya harga barang. Platform e-commerce seperti Tambang Go memecah total transaksi menjadi beberapa komponen agar transparan:

  • Subtotal β€” total harga semua barang (harga Γ— jumlah)
  • Pajak β€” persentase dari subtotal (jika diaktifkan admin)
  • Komisi Platform β€” biaya layanan platform (% dari subtotal), sumber pendapatan admin
  • Ongkos Kirim β€” biaya pengiriman kurir per toko (gratis jika pickup/ambil di toko)
  • Grand Total β€” jumlah akhir yang harus dibayar pembeli

Perhitungan ini dilakukan di backend saat checkout (OrderController.php β†’ store()) agar tidak bisa dimanipulasi dari sisi client.

Setiap pesanan memiliki struktur harga yang transparan dengan beberapa komponen yang dikonfigurasi oleh admin.

πŸ“ Lokasi kode perhitungan harga:
  • UI frontend/lib/widgets/order_price_breakdown.dart β€” tampilan breakdown di checkout & detail pesanan
  • Checkout backend-laravel/app/Http/Controllers/Api/OrderController.php β€” method store()
  • Ongkir backend-laravel/app/Support/CourierShippingCalculator.php
  • Settings backend-laravel/app/Models/PlatformSetting.php β€” commission_percent, tax_percent, shipping_courier_cost

Rumus Perhitungan

// 1. Subtotal = Total harga barang subtotal = Ξ£ (harga_produk Γ— jumlah) untuk semua item // 2. Pajak (jika tax_percent > 0) tax_amount = subtotal Γ— (tax_percent / 100) // 3. Komisi Platform (diambil dari subtotal) commission_amount = subtotal Γ— (commission_percent / 100) // 4. Total Merchandise total_amount = subtotal + tax_amount + commission_amount // 5. Ongkos Kirim (hanya untuk metode 'courier') shipping_cost = courier_cost_per_toko Γ— jumlah_toko_unik_di_keranjang // Untuk 'pickup': shipping_cost = 0 // 6. Grand Total yang Harus Dibayar Buyer grand_total = total_amount + shipping_cost

Contoh Perhitungan Nyata

KomponenPerhitunganNilai
Tali Nilon 10mm Γ— 50 meterRp 15.000 Γ— 50Rp 750.000
Tali Baja 8mm Γ— 1 rollRp 350.000 Γ— 1Rp 350.000
Subtotalβ€”Rp 1.100.000
Pajak (2%)Rp 1.100.000 Γ— 2%Rp 22.000
Komisi Platform (5%)Rp 1.100.000 Γ— 5%Rp 55.000
Total Merchandiseβ€”Rp 1.177.000
Ongkir Kurir (2 toko Γ— Rp 20.000)β€”Rp 40.000
GRAND TOTALβ€”Rp 1.217.000
πŸ“Œ Catatan Komisi: Komisi platform bukan diambil dari penjual setelah transaksi, melainkan sudah termasuk dalam harga yang dibayar pembeli. Penjual menerima pendapatan bersih setelah dikurangi komisi.
πŸ’³

19. Sistem Dompet & Penarikan Dana

Apa itu Dompet Digital dan Penarikan Dana?

Dompet digital (wallet) di aplikasi e-commerce adalah saldo virtual pengguna yang tersimpan di platform. Saldo ini bisa diisi dari refund (pengembalian dana) dan dicairkan ke rekening bank.

Penarikan dana (withdrawal) adalah proses pemindahan saldo dari platform ke rekening bank pengguna. Di Tambang Go ada dua jenis:

  • Dompet Pembeli β€” saldo dari refund pesanan transfer yang dibatalkan, bisa ditarik ke rekening bank buyer
  • Pendapatan Penjual β€” akumulasi penjualan produk (setelah komisi), bisa ditarik ke rekening bank seller

Penarikan memerlukan persetujuan admin karena transfer dilakukan secara manual ke rekening bank. Status: pending β†’ approved/rejected β†’ completed.

Contoh: Pembeli bayar transfer Rp 500.000, lalu batalkan pesanan. Sistem otomatis mengkredit Rp 500.000 ke dompet via BuyerWalletService.php. Pembeli ajukan penarikan β†’ admin transfer manual β†’ status completed.

πŸ’° Dompet Pembeli (Buyer Wallet)

Dompet pembeli diisi secara otomatis ketika pesanan transfer yang sudah dikonfirmasi pembayarannya kemudian dibatalkan. Kode refund: backend-laravel/app/Support/BuyerWalletService.php.

  • Saldo awal = 0
  • Kredit: dari refund pesanan yang dibatalkan
  • Debit: saat penarikan ke rekening bank
  • Minimum penarikan: sesuai pengaturan admin

🏦 Pendapatan Penjual

Penjual mendapatkan pendapatan setiap kali pesanan berstatus delivered. Perhitungan: backend-laravel/app/Support/SellerEarningsCalculator.php.

pendapatan_bersih = subtotal_item - komisi_platform
  • Saldo terakumulasi dari setiap pesanan selesai
  • Ajukan penarikan dengan memilih rekening terdaftar
  • Admin memproses transfer manual

Alur Penarikan Dana

TahapAktorAksiStatus
1Seller/BuyerPilih jumlah dan rekening β†’ POST withdrawalpending
2AdminReview di panel webβ€”
3aAdminApprove β†’ transfer manual ke rekeningapproved β†’ completed
3bAdminTolak dengan catatan alasanrejected
⚑

20. State Management

Apa itu State Management?

State (keadaan) adalah data yang dapat berubah seiring waktu dan memengaruhi tampilan UI aplikasi. Contoh state di Tambang Go:

  • Apakah pengguna sudah login atau belum?
  • Berapa jumlah item di keranjang belanja?
  • Daftar produk yang sedang ditampilkan di katalog
  • Status loading saat menunggu response API
  • Detail pesanan yang sedang dilihat

State Management adalah cara mengelola, menyimpan, dan membagikan data (state) ini agar seluruh bagian aplikasi bisa mengaksesnya dengan konsisten. Tanpa state management yang baik, data harus "dikirim" manual antar widget (prop drilling) dan UI tidak otomatis diperbarui saat data berubah.

Masalah tanpa state management:

  • Data duplikat di banyak widget β€” sulit disinkronkan
  • UI tidak refresh otomatis setelah data berubah
  • Logika bisnis tercampur dengan kode tampilan (UI)
  • Sulit melacak dari mana data berasal

Solusi di Tambang Go β€” Provider: Package Provider (v6.1.1) menggunakan pola ChangeNotifier. Provider menyimpan state di satu tempat terpusat. Saat state berubah, Provider memanggil notifyListeners() sehingga semua widget yang "mendengarkan" otomatis di-rebuild (diperbarui tampilannya).

Analogi: State Management seperti papan skor di pertandingan basket. Semua pemain (widget) melihat skor yang sama dari papan (Provider). Ketika skor berubah, papan diperbarui dan semua pemain langsung tahu β€” tidak perlu satu per satu memberitahu.
Contoh konkret di Tambang Go: Pembeli menambah produk ke keranjang β†’ CartProvider.addToCart() dipanggil β†’ API berhasil β†’ Provider update jumlah item β†’ notifyListeners() β†’ ikon keranjang di header otomatis menampilkan angka baru tanpa perlu refresh manual halaman.

Implementasi Provider di Tambang Go

Aplikasi Flutter menggunakan package Provider (versi 6.1.1) sebagai solusi state management. Provider dipasang di level root aplikasi menggunakan MultiProvider di frontend/lib/main.dart baris 25–32.

// Di main.dart β€” MultiProvider di root app MultiProvider( providers: [ ChangeNotifierProvider(create: (_) => AuthProvider()), ChangeNotifierProvider(create: (_) => ProductProvider()), ChangeNotifierProvider(create: (_) => CartProvider()), ChangeNotifierProvider(create: (_) => OrderProvider()), ChangeNotifierProvider(create: (_) => StorefrontProvider()), ], child: MaterialApp(...), )
ProviderFileState yang Dikelola
AuthProvider providers/auth_provider.dart User terautentikasi, token, status login/logout, operasi Google Sign-In, update profil & password, upgrade role
ProductProvider providers/product_provider.dart Daftar produk publik, produk seller, kategori, loading state, pagination, filter/search
CartProvider providers/cart_provider.dart Isi keranjang, jumlah item, operasi add/update/remove, preview ongkir
OrderProvider providers/order_provider.dart Daftar pesanan buyer/seller, detail pesanan, checkout, update status, statistik, upload bukti
StorefrontProvider providers/storefront_provider.dart Data banner katalog (ProductBanner[]), prefetch gambar banner saat splash

Pola Penggunaan Provider di Screen

// Membaca state (tanpa subscribe ulang saat berubah) final authProvider = Provider.of<AuthProvider>(context, listen: false); // Membaca state (widget direbuild saat state berubah) final cartProvider = context.watch<CartProvider>(); // Shortcut Consumer widget Consumer<ProductProvider>( builder: (context, productProvider, child) { if (productProvider.isLoading) return CircularProgressIndicator(); return ProductGrid(products: productProvider.products); } )
πŸ“Œ Tidak ada database lokal: Semua data diambil dari API setiap kali dibutuhkan. Hanya token autentikasi dan data user yang disimpan secara persisten menggunakan flutter_secure_storage.
πŸ“¦

21. Dependensi Lengkap

Apa itu Dependensi (Dependencies)?

Dependensi adalah library/paket pihak ketiga yang digunakan proyek agar developer tidak perlu menulis ulang fungsi umum dari nol. Alih-alih membuat HTTP client sendiri, proyek ini memakai package http. Alih-alih membuat sistem state sendiri, memakai provider.

Dependensi dideklarasikan di:

  • Flutter: frontend/pubspec.yaml β€” diinstall via flutter pub get
  • Laravel: backend-laravel/composer.json β€” diinstall via composer install

Setiap dependensi memiliki versi spesifik (misal provider: ^6.1.1) untuk memastikan kompatibilitas dan reproduksibilitas proyek di komputer lain.

Flutter Dependencies (pubspec.yaml)

PackageVersiFungsi Detail
http^1.1.0 HTTP client untuk request GET, POST, PUT, DELETE ke Laravel API. Menangani header, body JSON, dan multipart upload.
provider^6.1.1 State management dengan pola ChangeNotifier. Memungkinkan widget merespons perubahan data secara reaktif.
flutter_secure_storage^9.0.0 Menyimpan token Sanctum dan data user secara aman menggunakan Android Keystore / iOS Keychain. Tidak bisa diakses oleh app lain.
shared_preferences^2.2.2 Penyimpanan key-value sederhana untuk preferensi aplikasi. Digunakan sebagai fallback atau untuk data non-sensitif.
intl^0.20.2 Internationalization dan formatting. Digunakan untuk format mata uang Rupiah (Rp 15.000) dan format tanggal bahasa Indonesia.
image_picker^1.0.7 Memilih foto dari galeri atau mengambil foto baru dari kamera. Digunakan untuk upload foto produk, profil, dan bukti pembayaran.
cached_network_image^3.4.1 Menampilkan gambar dari URL dengan cache lokal. Meningkatkan performa karena gambar tidak perlu didownload ulang setiap render.
google_sign_in^6.2.2 Integrasi Google OAuth. Mendapatkan access_token dari Google untuk dikirim ke backend (POST /auth/google).
flutter_localizationsSDK Dukungan multi-bahasa Flutter. Memungkinkan penggunaan locale id_ID untuk format tanggal dan angka dalam bahasa Indonesia.
cupertino_icons^1.0.2 Icon set gaya iOS (Cupertino). Pelengkap Material Icons untuk tampilan yang lebih native di iOS.

Laravel Dependencies (composer.json)

PackageVersiFungsi
laravel/framework^10.0Framework PHP utama: routing, middleware, Eloquent ORM, Blade templating
laravel/sanctum^3.2Autentikasi API berbasis Bearer Token untuk SPA dan mobile app
guzzlehttp/guzzle^7.2HTTP client PHP untuk verifikasi access token Google ke Google API
laravel/tinker^2.8REPL (Read-Eval-Print Loop) untuk berinteraksi dengan aplikasi via command line
fakerphp/faker^1.9.1Generate data palsu untuk seeder database
laravel/pint^1.0Code style fixer untuk PHP (berbasis PHP-CS-Fixer)
phpunit/phpunit^10.1Testing framework untuk unit dan feature test
βš™οΈ

22. File Konfigurasi

Apa itu File Konfigurasi?

Konfigurasi adalah pengaturan aplikasi yang bisa diubah tanpa harus mengubah kode logika bisnis. File konfigurasi memisahkan "setting" dari "kode program" sehingga aplikasi bisa dijalankan di lingkungan berbeda (development, production) dengan pengaturan berbeda.

Contoh pengaturan konfigurasi di Tambang Go:

  • URL server API (emulator vs perangkat fisik)
  • Kredensial database (host, username, password)
  • Port server Laravel (8001)
  • Pengaturan CORS (izin akses cross-origin)
Contoh: Saat development di emulator Android, api_config.dart menggunakan http://10.0.2.2:8001/api. Saat deploy ke perangkat fisik, URL diganti ke IP komputer. Kode aplikasi tidak berubah β€” hanya konfigurasi.

Frontend: api_config.dart

File konfigurasi paling penting di sisi Flutter. Berisi base URL API dan semua endpoint URL sebagai konstanta statis.

// frontend/lib/config/api_config.dart class ApiConfig { // ⚠️ Ganti URL ini sesuai environment pengembangan: // Android Emulator : http://10.0.2.2:8001/api // iOS Simulator : http://localhost:8001/api // Perangkat Fisik : http://YOUR_COMPUTER_IP:8001/api static const String baseUrl = 'http://10.0.2.2:8001/api'; // Storage keys (flutter_secure_storage) static const String tokenKey = 'auth_token'; static const String userKey = 'user_data'; }

Backend: File .env

VariableNilai DefaultKeterangan
APP_NAME"Tali Tambang Go"Nama aplikasi
APP_URLhttp://localhost:8001URL backend (port 8001)
DB_CONNECTIONmysqlDriver database
DB_HOST127.0.0.1Host database
DB_PORT3306Port MySQL
DB_DATABASEtambang_goNama database
DB_USERNAMErootUsername MySQL
DB_PASSWORD(kosong)Password MySQL

CORS (config/cors.php)

Backend Laravel dikonfigurasi untuk menerima request dari semua origin (*) pada path api/*. Ini memungkinkan Flutter di berbagai device mengakses API.

Data Awal (Seeders)

DataEmail/InfoPassword
Akun Adminadmin@example.compassword
Akun Seller Contohseller@example.compassword
Akun Buyer Contohbuyer@example.compassword
KategoriTali Nilon, Tali Baja, Tali Rami, dll.
Produk SampleBeberapa produk tali tambang dengan variasi spesifikasi
πŸš€

23. Cara Menjalankan Aplikasi

Prasyarat

SoftwareVersi MinimumKeterangan
Flutter SDK3.xTermasuk Dart SDK β‰₯ 3.2.6
Android Studio / VS CodeLatestIDE dengan plugin Flutter
PHP8.1+Untuk menjalankan backend Laravel
Composer2.xPackage manager PHP
MySQL8.xDatabase server
Android Emulator / DeviceAPI 21+Untuk testing aplikasi mobile

Langkah 1: Setup Backend Laravel

# 1. Masuk ke folder backend cd tambang_go/backend-laravel # 2. Install dependensi PHP composer install # 3. Salin file environment cp .env.example .env # 4. Edit .env β€” sesuaikan konfigurasi database # DB_DATABASE=tambang_go, DB_USERNAME=root, DB_PASSWORD= # 5. Generate application key php artisan key:generate # 6. Buat database 'tambang_go' di MySQL, lalu jalankan migrasi php artisan migrate # 7. Isi data awal (admin, kategori, produk sample) php artisan db:seed # 8. Buat symlink storage (untuk akses file yang diupload) php artisan storage:link # 9. Jalankan server di port 8001 php artisan serve --port=8001
Backend sekarang berjalan di http://localhost:8001. Panel admin web dapat diakses di http://localhost:8001/admin/login menggunakan kredensial: admin@example.com / password

Langkah 2: Setup Flutter Frontend

# 1. Masuk ke folder frontend cd tambang_go/frontend # 2. Install dependensi Flutter flutter pub get # 3. (Opsional) Verifikasi konfigurasi flutter doctor # 4. Jalankan aplikasi (pastikan emulator/device sudah aktif) flutter run # Atau untuk build APK release: flutter build apk --release
⚠️ Konfigurasi URL API: Jika menggunakan perangkat fisik, buka file frontend/lib/config/api_config.dart dan ganti baseUrl dengan IP komputer Anda (bukan 10.0.2.2 yang hanya berlaku untuk Android Emulator).

Langkah 3: Akses Panel Admin Web

# Panel admin dapat diakses melalui browser URL : http://localhost:8001/admin/login Email: admin@example.com Pass : password

Troubleshooting Umum

MasalahSolusi
Gambar tidak tampil di appPastikan php artisan storage:link sudah dijalankan
Koneksi API gagal di emulatorGunakan 10.0.2.2 sebagai host, bukan localhost
Error CORS di webPeriksa config/cors.php β€” pastikan allowed_origins sudah *
Login Google gagalPastikan google-services.json ada di android/app/ dan SHA-1 sudah terdaftar
Database migration errorPastikan database tambang_go sudah dibuat di MySQL sebelum migrate
πŸ’»

24. Implementasi Kode per Fitur

Bagian ini menjelaskan kode sumber aktual yang digunakan untuk setiap fitur aplikasi. Setiap fitur mengikuti pola yang sama: Screen (UI) β†’ Provider (state) β†’ Service (API client) β†’ Laravel Controller β†’ Model/Database. Semua path file relatif terhadap folder root proyek tambang_go/.

πŸ“Œ Pola umum: Flutter tidak menyimpan data bisnis secara lokal (kecuali token auth). Setiap aksi pengguna memicu request HTTP ke backend Laravel, response JSON diparse ke Model Dart, lalu Provider memanggil notifyListeners() agar UI diperbarui.

24.1 πŸ” Autentikasi (Login, Register, Google Sign-In)

login_screen.dart β†’ AuthProvider.login() β†’ AuthService.login() β†’ ApiService.post() β†’ AuthController.php β†’ User::createToken()
LayerFileFungsi Utama
UIfrontend/lib/screens/auth/login_screen.dartForm email/password, tombol Google Sign-In, validasi input
UIfrontend/lib/screens/auth/register_screen.dartForm registrasi dengan pilihan role buyer/seller
Widgetfrontend/lib/widgets/google_sign_in_button.dartTombol login Google yang terintegrasi dengan GoogleAuthService
Statefrontend/lib/providers/auth_provider.dartlogin(), register(), loginWithGoogle(), logout(), loadUser()
Servicefrontend/lib/services/auth_service.dartWrapper HTTP untuk endpoint auth; menyimpan token via ApiService
Servicefrontend/lib/services/google_auth_service.dartMendapatkan access_token dari Google SDK
Modelfrontend/lib/models/user.dartDTO user dengan getter isBuyer, isSeller, isAdmin
Controllerbackend-laravel/app/Http/Controllers/Api/AuthController.phpregister(), login(), googleAuth(), logout(), me()
Middlewarebackend-laravel/app/Http/Middleware/IsAdmin.phpMenolak akses non-admin ke route /admin/*
Routesbackend-laravel/routes/api.phpPOST /register, /login, /auth/google

Cuplikan kode β€” Routing berdasarkan role setelah login (frontend/lib/screens/home_screen.dart):

class HomeScreen extends StatelessWidget { // Consumer<AuthProvider> membaca user yang sedang login if (user == null) return BuyerHomeScreen(); // mode tamu if (user.isAdmin) return AdminAccessDeniedScreen(); if (user.isBuyer) return BuyerHomeScreen(); if (user.isSeller) return SellerHomeScreen(); }

Cuplikan kode β€” Backend membuat token Sanctum (backend-laravel/app/Http/Controllers/Api/AuthController.php, method register):

$user = User::create([...]); $token = $user->createToken('auth_token')->plainTextToken; return response()->json(['data' => ['user' => $user, 'token' => $token]]);

24.2 πŸ›οΈ Katalog Produk, Kategori & Banner

buyer_home_screen.dart β†’ ProductProvider.loadProducts() β†’ ProductService.getProducts() β†’ ProductController.php β†’ Product::query()
LayerFileFungsi Utama
UIfrontend/lib/screens/buyer/buyer_home_screen.dartBuyerProductListPage: search, filter kategori, infinite scroll, ikon keranjang
UIfrontend/lib/screens/buyer/product_detail_screen.dartDetail produk, galeri foto, tombol tambah ke keranjang
Widgetfrontend/lib/widgets/product_banner_slider.dartCarousel banner promosi dari API storefront
Statefrontend/lib/providers/product_provider.dartloadProducts(), loadCategories(), getProduct()
Statefrontend/lib/providers/storefront_provider.dartloadBanners(), prefetchBannerImages()
Servicefrontend/lib/services/product_service.dartGET /products, /categories
Servicefrontend/lib/services/settings_service.dartGET /settings/storefront untuk banner
Modelfrontend/lib/models/product.dart, category.dart, product_banner.dartDTO produk, kategori, banner
Configfrontend/lib/config/api_config.dartfullImageUrl() β€” menyesuaikan URL gambar untuk emulator/device
Controllerbackend-laravel/app/Http/Controllers/Api/ProductController.phpindex() (publik), show() (detail)
Controllerbackend-laravel/app/Http/Controllers/Api/StorefrontSettingsController.phpshow() β€” banner slider
Modelbackend-laravel/app/Models/Product.php, Category.php, ProductBanner.phpEloquent ORM dengan relasi seller & category

Cuplikan kode β€” Prefetch banner saat splash (frontend/lib/main.dart, SplashScreen):

// Saat app start, muat auth + banner bersamaan await authProvider.loadUser(); await storefrontProvider.loadBanners(); await storefrontProvider.prefetchBannerImages();

24.3 πŸ›’ Keranjang Belanja

cart_screen.dart β†’ CartProvider.addToCart() β†’ CartService.addToCart() β†’ CartController.php β†’ Cart::updateOrCreate()
LayerFileFungsi Utama
UIfrontend/lib/screens/buyer/cart_screen.dartDaftar item, ubah quantity, hapus, tombol checkout
Statefrontend/lib/providers/cart_provider.dartloadCart(), addToCart(), updateQuantity(), removeFromCart()
Servicefrontend/lib/services/cart_service.dartCRUD keranjang via REST API
Modelfrontend/lib/models/cart_item.dartCartItem + Cart (total, shipping preview, pickup locations)
Utilfrontend/lib/utils/shipping_preview.dartHelper tampilan preview ongkir per toko
Controllerbackend-laravel/app/Http/Controllers/Api/CartController.phpindex() (termasuk shipping preview), store(), update(), destroy()
Supportbackend-laravel/app/Support/CourierShippingCalculator.phpHitung ongkir: biaya Γ— jumlah toko unik
Supportbackend-laravel/app/Support/SellerPickupResolver.phpResolve alamat pickup dari profil penjual
Modelbackend-laravel/app/Models/Cart.phpRelasi user + product, unique constraint per user+product

Cuplikan kode β€” CartProvider memanggil service (frontend/lib/providers/cart_provider.dart):

Future<bool> addToCart(int productId, {int quantity = 1}) async { final response = await _cartService.addToCart(productId, quantity: quantity); if (response.success) { await loadCart(); return true; } }

24.4 πŸ’³ Checkout & Pembayaran

checkout_screen.dart β†’ OrderProvider.createOrder() β†’ OrderService.createOrder() β†’ OrderController.store() β†’ DB transaction
LayerFileFungsi Utama
UIfrontend/lib/screens/buyer/checkout_screen.dartForm alamat, pilih shipping (courier/pickup) & payment (transfer/COD)
UIfrontend/lib/screens/buyer/order_success_screen.dartKonfirmasi sukses + instruksi transfer
Widgetfrontend/lib/widgets/order_price_breakdown.dartBreakdown: subtotal, pajak, komisi, ongkir, total
Widgetfrontend/lib/widgets/platform_transfer_instructions.dartTampilkan rekening bank platform
Statefrontend/lib/providers/order_provider.dartcreateOrder()
Utilfrontend/lib/utils/pickup_location.dartHelper lokasi pickup dari data keranjang
Controllerbackend-laravel/app/Http/Controllers/Api/OrderController.phpstore() β€” buat order, kurangi stok, kosongkan keranjang
Controllerbackend-laravel/app/Http/Controllers/Api/CheckoutSettingsController.phpshow() β€” pengaturan pajak, ongkir, maintenance
Concernbackend-laravel/app/Http/Controllers/Concerns/EnrichesOrdersWithPlatformPayment.phpLampirkan rekening platform ke response order transfer
Modelbackend-laravel/app/Models/PlatformSetting.phpSingleton: commission_percent, tax_percent, shipping_courier_cost

Cuplikan kode β€” Perhitungan harga di backend (backend-laravel/app/Http/Controllers/Api/OrderController.php, method store):

$subtotal = sum(harga Γ— quantity); $taxAmount = $subtotal Γ— ($settings->tax_percent / 100); $commissionAmount = $subtotal Γ— ($settings->commission_percent / 100); $shippingCost = CourierShippingCalculator::totalForCart($cartItems, $settings); // Generate nomor: ORD-YYYYMMDD-XXXXXX

24.5 πŸ“¦ Manajemen Pesanan (Buyer & Seller)

order_detail_screen.dart β†’ OrderProvider β†’ OrderService β†’ OrderController.php β†’ Order + OrderItem models
FiturFile FlutterFile BackendEndpoint
Riwayat pesanan buyerorder_history_screen.dartOrderController.php β†’ index()GET /orders
Detail pesananorder_detail_screen.dartOrderController.php β†’ show()GET /orders/{id}
Upload bukti bayarorder_detail_screen.dartOrderController.php β†’ uploadPaymentProof()POST /orders/{id}/payment-proof
Konfirmasi terima barangorder_detail_screen.dartOrderController.php β†’ confirmReceipt()POST /orders/{id}/confirm-receipt
Batalkan pesananorder_detail_screen.dartOrderController.php β†’ cancel()POST /orders/{id}/cancel
Pesanan masuk sellerseller_order_screen.dartOrderController.php β†’ sellerOrders()GET /seller/orders
Update status sellerseller_order_screen.dartOrderController.php β†’ updateStatus()PUT /seller/orders/{id}/status
Statistik buyerbuyer_dashboard_screen.dartOrderController.php β†’ statistics()GET /orders/statistics
Util status sellerfrontend/lib/utils/seller_order_status.dartβ€”Label & warna status pesanan

Cuplikan kode β€” Refund ke dompet saat cancel (backend-laravel/app/Support/BuyerWalletService.php):

public static function creditOrderRefundIfEligible(Order $order): bool { if (!self::isEligibleForWalletRefund($order)) return false; WalletTransaction::create([ 'user_id' => $order->buyer_id, 'type' => WalletTransaction::TYPE_CREDIT, 'amount' => $order->grand_total, 'description' => 'Pengembalian dana pesanan #' . $order->order_number, ]); }

24.6 🏬 Fitur Penjual (Produk, Pesanan, Keuangan)

Manajemen Produk

add_product_screen.dart β†’ ProductProvider.createProduct() β†’ ProductService β†’ ProductController.store()
LayerFileMethod / Fungsi
UI Tambahfrontend/lib/screens/seller/add_product_screen.dartForm produk + upload multi-foto via image_picker
UI Editfrontend/lib/screens/seller/edit_product_screen.dartEdit produk & update stok
UI Daftarfrontend/lib/screens/seller/seller_home_screen.dartSellerProductManagementPage β€” tab produk
Statefrontend/lib/providers/product_provider.dartcreateProduct(), updateProduct(), updateStock(), uploadProductImage()
Controllerbackend-laravel/app/Http/Controllers/Api/ProductController.phpmyProducts(), store(), update(), updateStock(), uploadImage()

Keuangan & Penarikan Dana

LayerFileFungsi
Dashboardfrontend/lib/screens/seller/seller_dashboard_screen.dartRingkasan KPI + shortcut ke fitur keuangan
Penarikanfrontend/lib/screens/seller/withdrawal_request_screen.dartForm ajukan penarikan pendapatan
Rekeningfrontend/lib/screens/seller/payment_account_screen.dartCRUD rekening bank penjual
Laporanfrontend/lib/screens/financial_report_screen.dartLaporan pendapatan per periode
Servicefrontend/lib/services/withdrawal_service.dart, payment_account_service.dartAPI penarikan & rekening
Controllerbackend-laravel/app/Http/Controllers/Api/SellerWithdrawalController.phpbalance(), store()
Logicbackend-laravel/app/Support/SellerEarningsCalculator.phpHitung pendapatan bersih setelah komisi

24.7 πŸ’° Dompet Pembeli & Penarikan

buyer_wallet_screen.dart β†’ BuyerWithdrawalService β†’ BuyerWithdrawalController.php β†’ WalletTransaction
LayerFileFungsi
UI Dompetfrontend/lib/screens/buyer/buyer_wallet_screen.dartSaldo, riwayat transaksi, ajukan penarikan
UI Rekeningfrontend/lib/screens/buyer/buyer_payment_account_screen.dartCRUD rekening bank buyer
Widgetfrontend/lib/widgets/buyer_wallet_chip.dartChip saldo di header katalog
Servicefrontend/lib/services/buyer_withdrawal_service.dartgetBalance(), createRequest()
Modelfrontend/lib/models/buyer_withdrawal_request.dartBuyerWalletBalance, BuyerWithdrawalRequest
Controllerbackend-laravel/app/Http/Controllers/Api/BuyerWithdrawalController.phpbalance(), store()
Logicbackend-laravel/app/Support/BuyerWalletService.phpKredit refund otomatis ke dompet
Modelbackend-laravel/app/Models/WalletTransaction.phpLedger kredit/debit dompet buyer

24.8 🌐 Layer HTTP & Konfigurasi API

Semua komunikasi Flutter ↔ Laravel melewati ApiService (singleton). Token Sanctum disimpan di secure storage dan otomatis dilampirkan ke setiap request ter-autentikasi.

FilePeran
frontend/lib/config/api_config.dartBase URL + semua endpoint URL sebagai konstanta statis
frontend/lib/services/api_service.dartSingleton HTTP client: get(), post(), put(), delete(), uploadImage()
frontend/lib/models/api_response.dartWrapper generik ApiResponse<T> untuk success/error
backend-laravel/routes/api.phpDefinisi semua route REST API + middleware group
backend-laravel/config/sanctum.phpKonfigurasi token authentication
backend-laravel/config/cors.phpCORS policy untuk akses dari mobile app

Cuplikan kode β€” ApiService menambahkan Bearer Token (frontend/lib/services/api_service.dart):

Future<Map<String, String>> _getHeaders({bool includeAuth = false}) async { final headers = {'Accept': 'application/json', 'Content-Type': 'application/json'}; if (includeAuth) { final token = await getToken(); // dari flutter_secure_storage if (token != null) headers['Authorization'] = 'Bearer $token'; } return headers; }

Daftar Lengkap Provider, Service & Model Flutter

ProviderFile
AuthProviderproviders/auth_provider.dart
ProductProviderproviders/product_provider.dart
CartProviderproviders/cart_provider.dart
OrderProviderproviders/order_provider.dart
StorefrontProviderproviders/storefront_provider.dart
ServiceFile
ApiServiceservices/api_service.dart
AuthServiceservices/auth_service.dart
ProductServiceservices/product_service.dart
CartServiceservices/cart_service.dart
OrderServiceservices/order_service.dart
SettingsServiceservices/settings_service.dart
WithdrawalServiceservices/withdrawal_service.dart
BuyerWithdrawalServiceservices/buyer_withdrawal_service.dart

πŸ“‹ Ringkasan Dokumentasi

Aplikasi Tambang Go adalah platform e-commerce multi-role yang komprehensif untuk produk tali tambang. Dibangun dengan arsitektur modern menggunakan Flutter untuk antarmuka mobile dan Laravel sebagai backend REST API. Sistem mendukung tiga jenis pengguna dengan workflow bisnis yang lengkap mulai dari browsing produk, pemesanan, pembayaran, pengiriman, hingga manajemen keuangan penjual dan pembeli.

Flutter
Frontend Mobile
Laravel
Backend REST API
MySQL
Database