tutorial laravel

Aplikasi Inventory Barang Berbasis Web Dengan Laravel

Pada kesempatan kali ini, saya bermaksud untuk membuat aplikasi inventory barang berbasis web menggunakan laravel. Aplikasi
inventory barang berbasis web dengan laravel ini sangat sederhana sekali karena sebagian besar adalah peng-aplikasian apa yang sudah di bahas pada artikel sebelumnya (https://soft-gain.com/2019/07/21/crud-pada-laravel-mysql/), di artikel sebelumnya ini kita telah membuat table barang dan akan kita lanjutkan dengan table transaksinya.

Goals – mampu membuat aplikasi inventory berbasis web

Tujuan dari pembahasan artikel ini diharapkan kita berhasil men-implementasi-kan dasar-dasar materi seputar frame work laravel kedalam sebuah real study case (dalam hal ini menjadi sebuah aplikasi inventory atau aplikasi stok barang). Dalam tutorial ini kita akan coba implementasi-kan adalah hal-hal umum dan dasar seperti pembuatan form, table, export – import data dalam bentuk excel, pemanfaatan middleware untuk membatasi hak akses user, menyembunyikan parameter id pada url dengan teknik obfuscation dan lain-lain.

Dan jika masih diberikan kesempatan saya juga bermaksud mengembangkannya menjadi sebuah web service serta pen-aplikasian-nya ke dalam aplikasi berbasis android (jadi mari kita belajar bersama-sama langsung dari hulu sampai hilir hanya saja dengan contoh yang sangat sederhana dengan maksud supaya mudah dipahami), kurang lebih seperti ini lah tampilan dari aplikasi berbasis website yang akan kita buat :

Table Transaksi
Form Transaksi

Materi pembuatan aplikasi inventory berbasis web

Tanpa berlama-lama lagi kita langsung saja masuk pada pembuatan aplikasi ini. Pertama-tama kita akan membuat satu table baru yaitu table sg_transaksi, pada table ini kita akan mencatat masuk dan keluarnya barang pada sistem. Langsung saja buat migration seperti ini :

Inventory Barang Berbasis Web

Untuk file migrasi nya di isi seperti ini :

<?php

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

class CreateTableTransaksi extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('sg_transaksi', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->bigInteger('id_barang')->nullable();
            $table->string('jenis_transaksi')->nullable();
            $table->bigInteger('jumlah_barang')->nullable();
            $table->bigInteger('created_by')->nullable();
            $table->bigInteger('updated_by')->nullable();
            $table->timestamps();
        });
    }

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

Berikutnya kita akan membuat model sg_transaksi. Ada kolom id_barang yang akan menjadi relasi antara table barang dan transaksi, jenis transaksi dan jumlah barangnya. Isi dari model sg_transaksi seperti ini :

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class sg_transaksi extends Model
{
    protected $table = 'sg_transaksi';

    protected $fillable = [
    	'id_barang',
    	'jenis_transaksi',
    	'jumlah_barang',
    	'created_by',
    	'updated_by'
    ];

    public function getNamaBarang(){
    	return $this->hasOne(sg_barang::class, 'id', 'id_barang');
    }

    public function getCreatedBy(){
    	return $this->hasOne(User::class, 'id', 'created_by');
    }

    public function getUpdatedBy(){
    	return $this->hasOne(User::class, 'id', 'updated_by');
    }
}

Berikutnya adalah sg_transaksi controller. Isinya seperti ini :

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\sg_transaksi as model;
use App\sg_barang;

class sg_transaksi extends Controller
{
    public function index(){
    	$transaksis = model::with('getNamaBarang','getCreatedBy','getUpdatedBy')->orderBy('id','desc')->get();

    	return view('transaksi.table',compact('transaksis'));
    }

    public function create(){
    	$id_barang = sg_barang::pluck('nama_barang','id');

    	return view('transaksi.form',compact('id_barang'));
    }

    public function store(Request $request){
    	model::create($request->all());

    	$this->updateSgBarang($request);	

    	return redirect('transaksi');
    }

    public function show(){
    	//
    }

    public function edit($id){
    	$editForm = true;
    	$transaksis = model::with('getNamaBarang')->find($id);
    	$id_barang = sg_barang::pluck('nama_barang','id');

    	return view('transaksi.form',compact('transaksis','editForm','id_barang'));
    }

    public function update(Request $request, $id){
    	$this->updateSgBarang($request, $id);

        $data = $request->except('_method', '_token');
    	model::where('id',$id)->update($data);    	

    	return redirect('transaksi');
    }

    public function destroy($id){
    	$value = model::where('id',$id);
    	$sg_barang = sg_barang::where('id',$value->value('id_barang'));

        if( $value->first()->jenis_transaksi == 'Masuk' ){
            $sg_barang->update(["jumlah_barang"=>(int) $sg_barang->value('jumlah_barang') - (int) $value->first()->jumlah_barang]);
        }elseif( $value->first()->jenis_transaksi == 'Keluar' ){
            $sg_barang->update(["jumlah_barang"=>(int) $sg_barang->value('jumlah_barang') + (int) $value->first()->jumlah_barang]);
        }
    	model::destroy($id);

    	return redirect('transaksi');
    }

    public function updateSgBarang($request, $idTrx=''){
    	$sg_barang = sg_barang::where('id',$request->id_barang);
    	$value = $sg_barang->value('jumlah_barang');

        if( $idTrx != '' ){
            $trx = model::where('id',$idTrx)->first();            
            if( $trx->jenis_transaksi == 'Masuk' ){
                $sg_barang->update(["jumlah_barang"=>(int) $value - (int) $trx->jumlah_barang]);
            }elseif( $trx->jenis_transaksi == 'Keluar' ){
                $sg_barang->update(["jumlah_barang"=>(int) $value + (int) $trx->jumlah_barang]);
            }
            $value = sg_barang::where('id',$request->id_barang)->value('jumlah_barang');
        }

    	if( $request->jenis_transaksi == 'Masuk' ){
    		$sg_barang->update(["jumlah_barang"=>(int) $value + (int) $request->jumlah_barang]);
    	}elseif( $request->jenis_transaksi == 'Keluar' ){
    		$sg_barang->update(["jumlah_barang"=>(int) $value - (int) $request->jumlah_barang]);
    	}
    }
}

Pada controller transaksi ini, di luar fungsi-fungsi default bawaan laravel seperti index, create, store dan lain-lain, kita menambahkan satu fungsi baru yaitu updateSgBarang(). Fungsi ini akan kita panggil pada fungsi store dan update, yang akan kita gunakan untuk men-sinkronkan antara data barang yang masuk dan barang yang keluar dari table Barang.

Selanjutnya tambahkan kode berikut ini pada file router :

Route::resource('/transaksi', 'sg_transaksi');
Route::get('/transaksi/destroy/{id}', 'sg_transaksi@destroy');

Untuk view-nya, tambahkan satu buah folder baru yaitu transaksi dan di dalamnya kita buat dua buah file yaitu table.blade.php dan form.blade.php. Untuk list table kita akan pakai table.blade.php. Isi table.blade.php seperti ini :

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header">Table Transaksi</div>

                <div class="card-body">
                    @if (session('status'))
                        <div class="alert alert-success" role="alert">
                            {{ session('status') }}
                        </div>
                    @endif

                    <div class="table-responsive">
                        <a class="btn btn-primary" href="{{ url('transaksi/create') }}">
                            Tambah Data
                        </a>
                        <p></p>
                        <table class="table table-hover table-striped table-bordered">
                            <thead>
                                <tr>
                                    <th class="text-center">Nama Barang</th>
                                    <th class="text-center">Jenis Transaksi</th>
                                    <th class="text-center">Jumlah Transaksi</th>
                                    <th class="text-center">Dibuat Oleh</th>
                                    <th class="text-center">Terakhir Ubah</th>
                                    <th class="text-center"> </th>
                                </tr>
                            </thead>
                            <tbody>
                                @foreach($transaksis as $transaksi)
                                    <tr>
                                        <td>{{ $transaksi->getNamaBarang->nama_barang }}</td>
                                        <td>{{ $transaksi->jenis_transaksi }}</td>
                                        <td>{{ $transaksi->jumlah_barang }}</td>
                                        <td>{{ $transaksi->getCreatedBy->name }}</td>
                                        <td>{{ isset($transaksi->getUpdatedBy) ? $transaksi->getUpdatedBy->name : '-' }}</td>
                                        <td>
                                            <a href="{{ URL::route('transaksi.edit',$transaksi->id) }}"><i class="fas fa-edit"></i></a>
                                            <a href="{{ url('transaksi/destroy/'.$transaksi->id) }}"><i class="fas fa-trash-alt"></i></a>
                                        </td>
                                    </tr>
                                @endforeach
                            </tbody>
                        </table>
                    </div>

                </div>
            </div>
        </div>
    </div>
</div>
@endsection

Untuk tampilan form inputan kita akan membuat file baru yaitu form.blade.php. Isi file form.blade.php seperti ini :

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header">Table Transaksi</div>

                <div class="card-body">
                    @if (session('status'))
                        <div class="alert alert-success" role="alert">
                            {{ session('status') }}
                        </div>
                    @endif

                    @if(isset($editForm))
                        {!! Form::model('', ['url' => url('/transaksi/'.$transaksis->id), 'method' => 'put']) !!}
                        {{ Form::hidden('updated_by', Auth::user()->id, ['class' => 'form-control']) }}
                    @else
                        {!! Form::model('', ['url' => url('/transaksi'), 'method' => 'post']) !!}
                        {{ Form::hidden('created_by', Auth::user()->id, ['class' => 'form-control']) }}
                    @endif
                        {{ csrf_field() }}
                        
                        <div class="form-group col-xs-12 col-lg-12">
                            <label class="control-label">Nama Barang</label>
                            {{ Form::select('id_barang', $id_barang, isset($transaksis->id_barang) ? $transaksis->id_barang : null, ['class' => 'form-control', 'placeholder'=>'Pilih']) }}
                        </div>
                        <div class="form-group col-xs-12 col-lg-12">
                            <label class="control-label">Jenis Transaksi</label>
                            {{ Form::select('jenis_transaksi', ['Masuk'=>'Masuk','Keluar'=>'Keluar'], isset($transaksis->jenis_transaksi) ? $transaksis->jenis_transaksi : null, ['class' => 'form-control', 'placeholder'=>'Pilih']) }}
                        </div>
                        <div class="form-group col-xs-12 col-lg-12">
                            <label class="control-label">Jumlah Transaksi</label>
                            {{ Form::number('jumlah_barang', isset($transaksis->jumlah_barang) ? $transaksis->jumlah_barang : null, ['class' => 'form-control']) }}
                        </div>

                        <div class="form-group col-xs-12 col-lg-12">
                            <button type="submit" class="btn btn-success">
                                Simpan
                            </button>
                        </div>
                    {!! Form::close() !!}

                </div>
            </div>
        </div>
    </div>
</div>
@endsection

Penutup

Selesai sudah pembuatan table transaksi pada aplikasi stok barang ini, pada artikel berikutnya kita akan membuat module untuk membatasi hak akses user sebagai tahap selanjutnya. Source code utuhnya seperti biasa bisa di ambil di git milik saya (https://github.com/ImmanuelJL/belajar-laravel/tree/aplikasi-stok-barang), silahkan ambil dari cabang aplikasi-stok-barang. Demikian, terima kasih.

Update :

Part 2 : https://soft-gain.com/2020/05/29/hak-akses-user-menggunakan-laravel-aplikasi-stok-barang-part-2/

Part 3 : https://soft-gain.com/2020/05/30/tutorial-laravel-menggunakan-seeder-aplikasi-inventory-part-3/

Part 4 : https://soft-gain.com/2020/06/05/design-website-dengan-bootstrap-aplikasi-inventory-part-4/

Part 5 : https://soft-gain.com/2020/06/07/kirim-email-menggunakan-laravel-dan-smtp-gmail/

Part 6 : https://soft-gain.com/2020/06/10/tutorial-export-excel-laravel-aplikasi-inventory-part-6/

Part 7 (Pengembangan REST API) : https://soft-gain.com/2020/06/12/tutorial-laravel-rest-api-menggunakan-otentikasi-passport/

Part 8 (Pengembangan REST API) : https://soft-gain.com/2020/06/13/tutorial-laravel-membuat-aplikasi-web-service/

Part 9 (Pengembangan Aplikasi Berbasis Android) : https://soft-gain.com/2020/06/19/cara-membuat-aplikasi-android-rest-api-menggunakan-retrofit/

Part 10 : https://soft-gain.com/2020/06/19/tutorial-laravel-import-excel-ke-database/

Part 11 : https://soft-gain.com/2020/06/20/menyembunyikan-id-pada-url-tutorial-laravel-obfuscation/

Part 12 (Pengembangan Aplikasi Berbasis Android) : https://soft-gain.com/2020/06/23/contoh-sederhana-recyclerview-cardview-dengan-implementasi-retrofit/

Part 13 (Pengembangan Aplikasi Berbasis Android) : https://soft-gain.com/2020/06/28/aplikasi-crud-android-database-mysql-menggunakan-retrofit-dan-laravel/

Leave a Reply

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