Membuat aplikasi kasir atau Point of Sales (POS) sering kali dianggap rumit karena membutuhkan manajemen basis data yang kompleks dan antarmuka (UI) yang responsif. Namun, dengan kombinasi Laravel sebagai motor penggerak backend dan Tailwind CSS sebagai penata gaya antarmuka, proses development bisa menjadi sangat cepat, efisien, bahkan di laptop dengan spesifikasi rendah.
Pada artikel sebelumnya, kita telah berhasil melakukan setup lingkungan pengembangan lokal menggunakan Laragon 2025 v8.1.0, menginstal framework Laravel terbaru, serta mengonfigurasi database MySQL. Sekarang, saatnya kita masuk ke tahap inti: merancang arsitektur database dan membangun fondasi struktur tabel yang solid agar aplikasi kasir kita dapat berjalan dengan cepat tanpa lag.
Mengapa Arsitektur Database Sangat Vital untuk Aplikasi Kasir (POS)?
Aplikasi kasir adalah jenis aplikasi web yang memiliki intensitas transaksi tinggi. Setiap detik, kasir akan melakukan pencarian produk, mencatat baris transaksi baru, dan mengurangi jumlah stok di saat yang bersamaan. Jika struktur database Anda berantakan, aplikasi akan mengalami kendala atau bottleneck saat data transaksi sudah mulai menumpuk hingga ribuan baris.
Gambar 1: Skema Relasi Database (ERD) Aplikasi Kasir Sederhana
Untuk tutorial POS sederhana ini, kita akan menerapkan teknik Database Normalization minimal hingga tingkat 3NF (Third Normal Form). Tujuannya adalah untuk menghindari duplikasi data dan memastikan setiap relasi tabel terjaga keakuratannya (Data Integrity).
Catatan Penting: Jangan pernah menyimpan data total harga transaksi akhir secara dinamis hanya berdasarkan hitungan matematika di frontend. Semua nilai keuangan wajib dikunci dan dicatat secara permanen di dalam tabel database guna menghindari manipulasi data atau selisih pembukuan.
Langkah 1: Merancang Skema Relasi Tabel (Entity Relationship)
Aplikasi kasir minimal membutuhkan 4 tabel utama yang saling terhubung satu sama lain. Berikut adalah rancangan tabel yang akan kita buat menggunakan fitur Laravel Migration:
- Tabel Categories: Menyimpan kelompok produk (misal: Makanan, Minuman, Elektronik).
- Tabel Products: Menyimpan informasi detail barang, harga jual, dan jumlah stok tersisa.
- Tabel Transactions: Menyimpan data induk transaksi, seperti nomor nota, total belanja, nominal bayar, dan tanggal.
- Tabel Transaction_Details: Menyimpan baris detail barang apa saja yang dibeli dalam satu nomor nota (relasi Many-to-Many).
Langkah 2: Membuat File Migration Menggunakan Artisan CLI
Buka terminal Laragon Anda, pastikan posisi direktori sudah berada di dalam folder project (C:\laragon\www\Pos-Api), lalu jalankan perintah Artisan terintegrasi berikut untuk membuat model sekaligus file migration secara instan:
php artisan make:model Category -m
php artisan make:model Product -m
php artisan make:model Transaction -m
Tips: Parameter -m berfungsi menyuruh Laravel untuk otomatis membuatkan file blueprint database (migration) bersamaan dengan file Model-nya, sehingga Anda tidak perlu mengetik perintah dua kali.
Langkah 3: Mengonfigurasi Blueprint Struktur Tabel di Laravel
Sekarang, buka kode project Anda menggunakan VS Code. Kita akan mengisi struktur field pada masing-masing file migration yang terletak di dalam folder database/migrations/.
1. Mengisi Tabel Categories
Buka file migration kategori (create_categories_table.php), lalu ubah fungsi up() menjadi seperti berikut:
public function up(): void
{
Schema::create('categories', function (Blueprint $table) {
$table->id();
$table->string('name')->unique();
$table->string('slug')->unique();
$table->timestamps();
});
}
2. Mengisi Tabel Products
Buka file migration produk (create_products_table.php). Di sini kita menggunakan tipe data unsignedInteger untuk stok agar nilainya tidak pernah minus, dan tipe data decimal untuk harga agar mendukung nominal rupiah secara presisi.
public function up(): void
{
Schema::create('products', function (Blueprint $table) {
$table->id();
$table->foreignId('category_id')->constrained()->onDelete('cascade');
$table->string('name');
$table->string('code')->unique(); // Untuk scan barcode kasir
$table->decimal('price', 12, 2); // Mendukung nominal hingga ratusan miliar
$table->unsignedInteger('stock')->default(0);
$table->timestamps();
});
}
3. Mengisi Tabel Transactions & Details
Buka file migration transaksi (create_transactions_table.php). Kita akan menggabungkan pembuatan tabel induk dan tabel detail baris transaksi di dalam satu file ini agar manajemen kodenya lebih rapi.
public function up(): void
{
// Tabel Induk Nota
Schema::create('transactions', function (Blueprint $table) {
$table->id();
$table->string('invoice_number')->unique();
$table->decimal('total_price', 12, 2);
$table->decimal('cash_received', 12, 2);
$table->decimal('cash_return', 12, 2);
$table->timestamps();
});
// Tabel Detail Item Belanjaan
Schema::create('transaction_details', function (Blueprint $table) {
$table->id();
$table->foreignId('transaction_id')->constrained()->onDelete('cascade');
$table->foreignId('product_id')->constrained();
$table->unsignedInteger('quantity');
$table->decimal('price_at_transaction', 12, 2); // Mengunci harga saat transaksi terjadi
$table->timestamps();
});
}
Langkah 4: Mengeksekusi php artisan migrate
Setelah seluruh file blueprint migration di atas selesai dikonfigurasi dan disimpan, kembali ke terminal Anda. Mari kita suntikkan skema arsitektur database tersebut ke dalam server MySQL Laragon dengan menjalankan perintah berikut:
php artisan migrate
Jika konsol terminal Anda memunculkan teks berwarna hijau dengan status DONE, artinya tabel database Anda telah sukses terbentuk dengan struktur indeks yang sangat optimal di dalam database pos_db.
Kesimpulan & Langkah Pengembangan Selanjutnya
Selamat! Fondasi paling krusial dalam membangun aplikasi kasir (POS) telah selesai kita bangun. Dengan struktur database yang terelasi secara baik menggunakan Foreign Key Constraints, sistem kasir Anda dijamin akan memiliki performa yang kencang, aman dari kebocoran integritas data, serta sangat terstruktur.
Di artikel tutorial bagian selanjutnya, kita akan mulai masuk ke bagian frontend yang menyenangkan, yaitu merancang antarmuka grid kasir yang interaktif, bersih, dan modern menggunakan elemen utilitas dari Tailwind CSS.