Membuat Aplikasi Invoice Laravel 5.7 #5: Manage Invoice & Authentication

Membuat Aplikasi Invoice Laravel 5.7 #5: Manage Invoice & Authentication

Pendahuluan

Setelah sekian lama jeda karena tidak dapat kesempatan untuk menulis, sehingga ada beberapa part konsep dari artikel ini yang hilang begitu saja. Maka pada kesempatan ini saya mencoba merangkai kembali dan mencoba untuk menyelesaikan artikel berseri ini guna menemani teman-teman untuk belajar membuat sebuah aplikasi dengan framework Laravel from scratch.

Dilihat dari artikel sebelumnya yang membahas tentang Membuat Aplikasi Invoice Laravel 5.7: Create Invoice, maka saya berkesimpulan bahwa artikel ini terputus pada bagian membuat invoice saja tanpa kita tahu dimana harus melihat invoice yang telah dibuat sebelumnya. So, pada seri kali ini kita akan menampilkan list dari invoice yang telah dibuat beserta halaman untuk melihat invoice tersebut.

Akan tetapi, ada komentar dari teman-teman pembaca yang bertanya, "fungsi auth apa? kok saya bisa akses halaman apapun tanpa login?" Maka artikel ini saya rangkaikan dengan authentication.

Baca Juga: Membuat Aplikasi Invoice Laravel 5.7 #4: Create Invoice

Manajemen Invoice

Untuk menampilkan list invoice agar dapat dengan mudah dilihat dan dikelola oleh user, maka caranya pun tidak jauh berbeda dari manajemen customer ataupun product. So, buka file InvoiceController.php kemudian tambahkan method berikut:

public function index()
{
    $invoice  = Invoice::with(['customer', 'detail'])->orderBy('created_at', 'DESC')->paginate(10);
    return view('invoice.index', compact('invoice'));
}

Penjelasan: Fungsi with() untuk me-load table yang berelasi dimana customer dan detail adalah nama method yang telah didefinisikan pada model Invoice.php sebelumnya, dan fungsi ini sering disebut dengan eager loading.

Kemudian buat file index.blade.php didalam folder resources/views/invoice, kemudian tambahkan potongan code berikut:

@extends('layouts.app')

@section('content')
    <div class="container">
        <div class="row">
            <div class="col-md-12">
                <div class="card">
                    <div class="card-header">
                        <div class="row">
                            <div class="col-md-6">
                                <h3 class="card-title">Manajemen Invoice</h3>
                            </div>
                        </div>
                    </div>
                    <div class="card-body">
                        @if (session('success'))
                            <div class="alert alert-success">
                                {!! session('success') !!}
                            </div>
                        @endif
                        <table class="table table-hover table-bordered">
                            <thead>
                                <tr>
                                    <th>Invoice ID</th>
                                    <th>Nama Lengkap</th>
                                    <th>No Telp</th>
                                    <th>Total Item</th>
                                    <th>Subtotal</th>
                                    <th>Pajak</th>
                                    <th>Total</th>
                                    <th>Aksi</th>
                                </tr>
                            </thead>
                            <tbody>
                                @forelse ($invoice as $row)
                                    <tr>
                                        <td><strong>#{{ $row->id }}</strong></td>
                                        <td>{{ $row->customer->name }}</td>
                                        <td>{{ $row->customer->phone }}</td>
                                        <td><span class="badge badge-success">{{ $row->detail->count() }} Item</span></td>
                                        <td>Rp {{ number_format($row->total) }}</td>
                                        <td>Rp {{ number_format($row->tax) }}</td>
                                        <td>Rp {{ number_format($row->total_price) }}</td>
                                        <td>
                                            <form action="{{ route('invoice.destroy', $row->id) }}" method="POST">
                                                @csrf
                                                <input type="hidden" name="_method" value="DELETE">
                                                <a href="{{ route('invoice.edit', $row->id) }}" class="btn btn-warning btn-sm">Edit</a>
                                                <button class="btn btn-danger btn-sm">Delete</button>
                                            </form>
                                        </td>
                                    </tr>
                                @empty
                                    <tr>
                                        <td colspan="8" class="text-center">Tidak ada data</td>
                                    </tr> 
                                @endforelse
                            </tbody>
                        </table>
                        <div class="float-right">
                            {{ $invoice->links() }}
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
@endsection

Agar dapat digunakan, definisikan route-nya terlebih dahulu dengan menambahkan code berikut pada routes/web.php:

//[.. CODE SEBELUM ..]

Route::group(['prefix' => 'invoice'], function() {
	//[.. CODE SEBELUM ..]
	
    Route::get('/', 'InvoiceController@index')->name('invoice.index');
});

Jangan lupa tambahkan code berikut agar dapat ditampilkan pada menu navigasi, buka file resources/views/layouts/app.blade.php:

<!-- [.. CODE SEBELUMNYA ..] -->

<li class="nav-item">
    <a href="{{ route('invoice.create') }}" class="nav-link">Buat Invoice</a>
</li>

<!-- TAMBAHKAN CODE INI -->
<li class="nav-item">
    <a href="{{ route('invoice.index') }}" class="nav-link">List Invoice</a>
</li>
<!-- TAMBAHKAN CODE INI -->

<li class="nav-item">
    <a href="{{ url('/customer') }}" class="nav-link">Manajemen Pelanggan</a>
</li>

<!-- [.. CODE SETELAHNYA ..] -->

Karena route invoice.destroy sudah digunakan, maka kita buat terlebih dahulu agar tidak terjadi error saat page di-load karena route name tidak terdefinisikan. Buka kembali file InvoiceController.php kemudian tambahkan code berikut:

public function destroy($id)
{
    $invoice = Invoice::find($id);
    $invoice->delete();
    return redirect()->back()->with(['success' => 'Data telah dihapus']);
}

Kemudian buka file routes/web.php dan tambahkan code berikut:

//[.. CODE SEBELUM ..]

Route::group(['prefix' => 'invoice'], function() {
	//[.. CODE SEBELUM ..]
	
    Route::delete('/{id}/delete', 'InvoiceController@destroy')->name('invoice.destroy');
});

Baca Juga: Membuat Aplikasi Invoice Laravel 5.7 #3: Manajemen Customer

Protect with Authentication

Secara otomatis Laravel telah menyediakan fitur authentication sesuai standar yang telah ditetapkan oleh Laravel dengan menggunakan command: php artisan make:auth. Command ini telah kita jalankan pada part sebelumnya akan tetapi saya lupa tepatnya berada pada part berapa. So, tugas kita sekarang hanya membuat fungsi untuk mem-protect page sehingga hanya bisa diakses oleh user yang telah login.

Buka file routes/web.php kemudian masukkan semua code dari route yang ingin dilindungi dengan proses otentikasi terlebih dahulu kedalam route berikut:

Route::group(['middleware' => 'auth'], function() {
    //[.. MASUKKAN CODE-NYA DISINI ..]
});

Sehingga hasil akhirnya akan tampak seperti berikut:

<?php

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/', function () {
    return view('welcome');
});

Auth::routes();

Route::get('/home', 'HomeController@index')->name('home');

//NEW CODE
Route::group(['middleware' => 'auth'], function() {
    Route::group(['prefix' => 'product'], function() {
        Route::get('/', 'ProductController@index');
        Route::get('/new', 'ProductController@create');
        Route::post('/', 'ProductController@save');
        Route::get('/{id}', 'ProductController@edit');
        Route::put('/{id}', 'ProductController@update');
        Route::delete('/{id}', 'ProductController@destroy');
    });
    
    Route::group(['prefix' => 'customer'], function() {
        Route::get('/', 'CustomerController@index');
        Route::get('/new', 'CustomerController@create');
        Route::post('/', 'CustomerController@save');
        Route::get('/{id}', 'CustomerController@edit');
        Route::put('/{id}', 'CustomerController@update');
        Route::delete('/{id}', 'CustomerController@destroy');
    });
    
    Route::group(['prefix' => 'invoice'], function() {
        Route::get('/', 'InvoiceController@index')->name('invoice.index');
        Route::get('/new', 'InvoiceController@create')->name('invoice.create');
        Route::post('/', 'InvoiceController@save')->name('invoice.store');
        Route::get('/{id}', 'InvoiceController@edit')->name('invoice.edit');
        Route::put('/{id}', 'InvoiceController@update')->name('invoice.update');
        Route::delete('/{id}', 'InvoiceController@deleteProduct')->name('invoice.delete_product');
        Route::delete('/{id}/delete', 'InvoiceController@destroy')->name('invoice.destroy');
    });
});

Karena kita belum membuat fitur manajemen user, maka untuk sementara user yang akan digunakan untuk login kita buat terlebih dahulu menggunakan seeder. Untuk membuat seeds, jalankan command berikut:

php artisan make:seeder UsersTableSeeder

Kemudian buka file database/seeds/UsersTableSeeder.php, dan tambahkan code berikut:

<?php

use Illuminate\Database\Seeder;
use App\User;

class UsersTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        User::create([
            'name' => 'anugrah sandi',
            'email' => '[email protected]',
            'password' => bcrypt('secret')
        ]);
    }
}

Terakhir, jalankan command berikut untuk mengesekusi seeds diatas:

php artisan db:seed --class=UsersTableSeeder

Kesimpulan

Sepanjang artikel ini kita telah mengulas kembali bagaimana melakukan query kedatabase menggunakan Eloquent serta penggunaan eager loading. Kita juga telah belajar bagaimana menggunakan middleware, dalam hal ini adalah middleware bawaan Laravel yakni: auth. Juga kita telah belajar bagaimana membuat seeds untuk membuat dummy data.

Untuk melihat dokumentasi dari artikel ini kamu dapat dapat mengunjungi Github.

Category:
Share:

Comments