Aplikasi Laundry (Laravel 5.8 - Vue.js - SPA) #1: Schema Database

Aplikasi Laundry (Laravel 5.8 - Vue.js - SPA) #1: Schema Database

Pendahuluan

Hadirnya beragam jenis aplikasi yang semakin modern dengan berbagai macam tools yang digunakan guna memuaskan kebutuhkan penggunanya menjadikan hobby programming menjadi pekerjaan yang mungkin saja tidak ada "mati"-nya, karena perkembangan teknologi yang terus mengalami evolusi dari waktu ke waktu.

Awal bulan April kemarin, jagat maya dihebohkan dengan tampilan salah satu web yang cukup fenomenal bagi developer, yakni Stackoverflow dengan menyuguhkan tampilan website beberapa tahun silam yang masih klasik. Berbeda halnya dengan hari-hari ini, dimana website yang ada sudah sangat modern dengan beragam style-nya guna membuat nyaman penggunanya, salah satunya yang akan dibahas adalah style Single Page Application (SPA).

SPA merupakan istilah yang digunakan untuk sebuah aplikasi berbasis website yang menggunakan satu halaman web saja sebagai tampilan utamanya. Teknologi SPA menggunakan Javascript sebagai pemeran utamanya dan teknologi lainnya sebagai pendukungnya, adapun metode yang digunakan untuk berkomunikasi dengan server adalah AJAX.

Kali ini Daengweb hadir kembali dengan serial belajar pemrograman bahasa Indonesia, dimana pada seri ini kita akan belajar bagaimana Membuat Aplikasi Laundry Menggunakan Laravel 5.8 & Vue.js.

Baca Juga: Google Authentication With Laravel 5.8

Database Structure

Schema dari aplikasi laundry yang akan dibuat adalah sebuah aplikasi untuk mencatat pemasukan dan pengeluaran dari sebuah usaha laundry, dimana terdapat beberapa role users diantaranya: superadmin, admin, keuangan, dan kurir. Fitur lainnya adalah sistem point & deposit dari customer, sehingga customer bisa mendapatkan reward berupa diskon jika point telah terpenuhi, selain itu deposit juga memiliki peran untuk menyimpan kembalian customer yang nantinya dapat digunakan untuk membayar laundry-an selanjutnya.

Sudah menjadi kebiasaan saya sebelum memulai mengerjakan sebuah aplikasi adalah dengan memberikan gambaran struktur database-nya terlebih dahulu, agar kamu memiliki gambaran akan seperti apa aplikasi ini kedepannya.

app laundry database structure

Pengguna aplikasi ini juga dapat memasukkan list outlet yang dimilikinya, sehingga user dapat membandingkan antar outlet yang ada. Sebuah kerangka kerja yang sederhana namun cukup lengkap untuk digunakan dalam usaha laundry, sehingga case diatas juga menjadi case yang cocok untuk digunakan dalam proses belajar karena alur bisnisnya yang mudah untuk dipahami.

Mengikuti perkembangan dari versi Laravel sejak artikel ini dibuat, maka kita akan menggunakan Laravel versi 5.8, pada command line, install Laravel dengan command:

composer create-project --prefer-dist laravel/laravel dw-laundry

Buka file .env kemudian masukkan informasi database yang kamu miliki pada bagian berikut:

DB_DATABASE=NAMADBKAMU
DB_USERNAME=USERDBKAMU
DB_PASSWORD=PASSDBKAMU

Create Table With Migrations

Salah satu fitur yang menarik dari Laravel adalah Migrations, dengan fitur ini memungkin kita untuk mengontrol seluruh perubahan dari struktur database melalui code. Secara default migration dari table users telah tersedia, buka file tersebut yang terletak di dalam folder database/migrations dan modifikasi menjadi:

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->string('photo')->nullable();
            $table->string('api_token')->nullable();
            $table->char('role', 1)->comment('0: superadmin, 1: admin, 2: finance, 3: courier');
            $table->unsignedBigInteger('outlet_id')->nullable();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('users');
    }
}

Note: api_token nantinya akan berisi string random yang berfungsi sebagai token dari ajax request, sedangkan outlet_id di-set nullable karena hanya user dengan status courier yang memiliki outlet. Adapun relasinya belum dibuat karena table induk dalam hal ini table outlets belum tersedia.

Pada command line, generate migration baru beserta model-nya untuk table outlets dengan command:

php artisan make:model Outlet -m

Buka file migration baru yang telah di-generate dan modifikasi menjadi:

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateOutletsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('outlets', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('code')->unique();
            $table->string('name');
            $table->boolean('status')->default(false);
            $table->string('address');
            $table->string('phone');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('outlets');
    }
}

Note: Table ini akan menampung seluruh data outlet, outlet yang dimaksud adalah cabang atau spot laundry yang dimiliki.

Tugas selanjutnya adalah membuat relasi antar table users dan outlets, generate migration baru dengan command:

php artisan make:migration add_relationships_users_to_outlets_table

Kemudian buka file migration dengan nama prefixdate_add_relationships_users_to_outlets_table dan tambahkan code:

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class AddRelationshipsUsersToOutletsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->foreign('outlet_id')->references('id')->on('outlets');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->dropForeign(['outlet_id']);
        });
    }
}

Melanjutkan table selanjutnya yang berfungsi untuk menyimpan data customer, pada command line jalankan command:

php artisan make:model Customer -m

Sebuah migration baru untuk meng-handle table customers telah di-generate, buka file tersebut dan modifikasi menjadi:

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateCustomersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('customers', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('nik')->unique();
            $table->string('name');
            $table->string('address');
            $table->string('phone');
            $table->unsignedBigInteger('courier_id');
            $table->integer('point');
            $table->integer('deposit');
            $table->timestamps();
          
            $table->foreign('courier_id')->references('id')->on('users');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('customers');
    }
}

Note: nik atau Nomor Induk Kependudukan untuk memastikan customer yang terdata unik agar dapat meng-claim deposit atau point yang dimilikinya.

Table selanjutnya adalah table yang berperan untuk mencatat data pengeluaran yang meliputi, sabun, bensin, listrik dan lain sebagainya. Buka command line, jalankan artisan command berikut:

php artisan make:model Expense -m

Modifikasi migration dari table expenses dengan menambahkan beberapa field berikut:

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateExpensesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('expenses', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('description');
            $table->integer('price');
            $table->text('note')->nullable();
            $table->unsignedBigInteger('user_id');
            $table->timestamps();
          
            $table->foreign('user_id')->references('id')->on('users');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('expenses');
    }
}

Note: Setiap pengeluaran akan di identifikasi berdasarkan user_id sehingga dapat diidentifikasi user yang bertanggung jawab untuk biaya pengeluaran tersebut.

Tak lengkap rasanya jika rincian biaya dari jenis layanan laundry-nya tidak tersedia, karena dari data inilah yang akan menjadi patokan untuk menentukan tarif dari setiap transaksi nantinya. Pada command line generate migration baru:

php artisan make:model LaundryType -m

Table ini hanya berisi kategori atau type dari jenis laundry-an yang tersedia, seperti Laundry, Dry Clean dan lain sebagainya. Modifikasi migration dari table laundry_types dan tambahkan kolom name:

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateLaundryTypesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('laundry_types', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('laundry_types');
    }
}

Yang berkaitan dengan table diatas adalah table laundry_prices dengan fungsi untuk menyimpan data harga layanan yang tersedia sebagai mana yang telah dijelaskan sebelumnya. Generate migration untuk table tersebut dengan command:

php artisan make:model LaundryPrice -m

Buka file migration untuk table laundry_prices dan modifikasi menjadi:

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateLaundryPricesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('laundry_prices', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->string('unit_type');
            $table->unsignedBigInteger('laundry_type_id');
            $table->integer('price');
            $table->unsignedBigInteger('user_id');
            $table->timestamps();

            $table->foreign('laundry_type_id')->references('id')->on('laundry_types');
            $table->foreign('user_id')->references('id')->on('users');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('laundry_prices');
    }
}

Hal terakhir yang tentunya menjadi data penting adalah table transactions beserta detail_transactions karena kedua table ini berfungsi untuk mencatat segala jenis transaksi yang telah berlangsung. Dan dengan menggunakan table ini jugalah kita akan merangkum seluruh pemasukan yang telah didapatkan. Pada command line, generate migration untuk table transactions terlebih dahulu dengan command:

php artisan make:model Transaction -m

Buka file migration dari table transactions dan modifikasi menjadi:

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateTransactionsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('transactions', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->unsignedBigInteger('courier_id');
            $table->unsignedBigInteger('customer_id');
            $table->unsignedBigInteger('user_id');
            $table->integer('amount');
            $table->date('start_date');
            $table->date('end_date');
            $table->boolean('status')->default(false);
            $table->timestamps();

            $table->foreign('courier_id')->references('id')->on('users');
            $table->foreign('customer_id')->references('id')->on('customers');
            $table->foreign('user_id')->references('id')->on('users');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('transactions');
    }
}

Penjelasan: courier_id berfungsi untuk memastikan bahwa pesanan tersebut dikerjakan oleh outlet yang mana karena setiap kurir memiliki outlet-nya masing-masing, sedangkan user_id berfungsi untuk memastikan siapa user yang bertanggung jawab atas transaksi tersebut.

Terakhir adalah table untuk detail_transactions untuk mencatat jenis layanan yang digunakan dan berapa banyak item yang masuk. Generate migration dari table tersebut dengan command:

php artisan make:model DetailTransaction -m

Buka file migration yang telah di-generate dan tambahkan code:

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateDetailTransactionsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('detail_transactions', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->unsignedBigInteger('transaction_id');
            $table->unsignedBigInteger('laundry_price_id');
            $table->unsignedBigInteger('laundry_type_id');
            $table->integer('qty');
            $table->integer('price');
            $table->integer('subtotal');
            $table->timestamps();

            $table->foreign('transaction_id')->references('id')->on('transactions');
            $table->foreign('laundry_price_id')->references('id')->on('laundry_prices');
            $table->foreign('laundry_type_id')->references('id')->on('laundry_types');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('detail_transactions');
    }
}

Semua table yang dibutuhkan telah dibuat, adapun jika terjadi perubahan kedepannya akan menyesuaikan seiring dengan berjalannya proses development. Jika file .env telah kamu setting dengan benar sesuai informasi database yang kamu miliki, pada command line jalankan command berikut untuk mengeksekusi seluruh migration yang telah dibuat.

php artisan migrate

Adapun hasil yang akan kita peroleh akan terlihat seperti berikut.

database app laundry Laravel 5.8

Baca Juga: Membuat Repository Pattern Laravel 5.7

Kesimpulan

Sepanjang artikel ini kita telah belajar bagaimana cara membuat struktur database menggunakan migration, setiap table tersebut telah memiliki relasinya masing-masing yang juga telah di-handle menggunakan migrations. Dalam artikel ini tidak dijelaskan secara detail fungsi dari masing-masing code yang ada karena telah dibahas untuk ketiga kalinya, dimana pada seri Membuat Aplikasi POS (Point of Sales) Laravel 5.6 dan Membuat Aplikasi Invoice Laravel 5.7.

Adapun dokumentasi code dari serial ini dapat kamu lihat di Github.

Category:
Share:

Comments