> For the complete documentation index, see [llms.txt](https://learn.devlabss.my.id/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://learn.devlabss.my.id/laravel/bab-11-logika-transaksi-peminjaman/11.2-membuat-logika-pengurangan-stok.md).

# 11.2 Membuat Logika Pengurangan Stok

## Membuat logika pengurangan stok

Sekarang kita masuk ke praktik inti BAB 11.

Target subbab ini sederhana.

Saat user meminjam buku, sistem harus:

* menyimpan transaksi peminjaman
* mengecek stok buku
* mengurangi stok buku

### Struktur data yang dibutuhkan

Sebelum menulis controller, pastikan data pendukungnya ada.

Minimal kita butuh:

* kolom `stok` pada tabel `buku`
* tabel `peminjaman`
* model `Buku`
* model `Peminjaman`

Kalau kolom `stok` belum ada, tambahkan dulu migration baru.

```bash
php artisan make:migration add_stok_to_buku_table --table=buku
```

Isi migration secara sederhana seperti ini:

```php
Schema::table('buku', function (Blueprint $table) {
    $table->integer('stok')->default(0);
});
```

Lalu jalankan:

```bash
php artisan migrate
```

### Membuat tabel peminjaman

Berikutnya, buat tabel untuk mencatat transaksi pinjam.

```bash
php artisan make:migration create_peminjaman_table
```

Contoh isi migration:

```php
Schema::create('peminjaman', function (Blueprint $table) {
    $table->id();
    $table->foreignId('user_id')->constrained()->cascadeOnDelete();
    $table->foreignId('buku_id')->constrained('buku')->cascadeOnDelete();
    $table->date('tanggal_pinjam');
    $table->timestamps();
});
```

Setelah itu jalankan lagi:

```bash
php artisan migrate
```

### Membuat model peminjaman

Kalau model `Peminjaman` belum ada, buat dengan Artisan.

```bash
php artisan make:model Peminjaman
```

Isi properti `fillable` agar data bisa disimpan lebih mudah:

```php
protected $table = 'peminjaman';

protected $fillable = [
    'user_id',
    'buku_id',
    'tanggal_pinjam',
];
```

Baris `protected $table = 'peminjaman';` penting karena pada modul ini nama tabel tidak mengikuti tebakan default Laravel.

### Logika inti di controller

Sekarang fokus ke proses saat tombol pinjam dikirim.

Contoh logikanya bisa seperti ini:

```php
use App\Models\Buku;
use App\Models\Peminjaman;
use Illuminate\Support\Facades\Auth;

public function pinjam($id)
{
    $buku = Buku::findOrFail($id);

    if ($buku->stok < 1) {
        return redirect()->back()->with('error', 'Stok buku habis.');
    }

    Peminjaman::create([
        'user_id' => Auth::id(),
        'buku_id' => $buku->id,
        'tanggal_pinjam' => now()->toDateString(),
    ]);

    $buku->decrement('stok');

    return redirect()->back()->with('success', 'Buku berhasil dipinjam.');
}
```

Logika ini sudah memenuhi alur dasar:

* ambil buku
* cek stok
* simpan peminjaman
* kurangi stok

### Kenapa `decrement()` enak dipakai

Method `decrement()` membuat kode lebih ringkas.

Anda tidak perlu menulis:

```php
$buku->stok = $buku->stok - 1;
$buku->save();
```

Laravel sudah menyiapkan cara yang lebih cepat:

```php
$buku->decrement('stok');
```

### Menambahkan route peminjaman

Supaya method di controller bisa dipanggil, buat route POST.

Contoh sederhana:

```php
Route::post('/peminjaman/{id}', [BukuController::class, 'pinjam'])->middleware('auth');
```

Karena ini aksi perubahan data, gunakan `POST`.

Jangan gunakan `GET` untuk proses peminjaman.

### Urutan praktik yang aman

Ikuti urutan ini supaya tidak lompat-lompat.

{% stepper %}
{% step %}

### Tambahkan kolom stok

Pastikan setiap buku punya nilai `stok`.

Tanpa ini, sistem tidak punya dasar untuk menentukan buku masih tersedia atau tidak.
{% endstep %}

{% step %}

### Buat tabel peminjaman

Tabel ini akan menyimpan riwayat transaksi.

Jadi data pinjam tidak bercampur dengan data master buku.
{% endstep %}

{% step %}

### Tulis method pinjam di controller

Method ini menjadi pusat keputusan.

Di sini stok dicek dan transaksi diproses.
{% endstep %}

{% step %}

### Uji dengan data nyata

Coba pinjam buku yang stoknya lebih dari `0`.

Lalu cek apakah tabel `peminjaman` bertambah dan stok buku berkurang.
{% endstep %}
{% endstepper %}

### Sebelum dites di browser

Pastikan server lokal Anda sedang berjalan.

Kalau perlu, jalankan:

```bash
php artisan serve
```

Lalu login dulu sebelum menguji tombol pinjam.

Karena data `user_id` diambil dari user yang sedang masuk.

### Output yang harus terlihat

Setelah subbab ini selesai, hasil berikut seharusnya sudah terlihat:

* kolom `stok` tersedia pada tabel `buku`
* tabel `peminjaman` berhasil dibuat
* route `POST /peminjaman/{id}` aktif
* saat buku dipinjam, tabel `peminjaman` bertambah satu data
* nilai stok buku berkurang satu setelah transaksi berhasil

### Error yang paling sering muncul

Beberapa masalah yang sering terjadi:

* model `Peminjaman` belum dibuat
* tabel `peminjaman` belum dimigrate
* kolom `stok` belum ada
* route masih `GET`
* user belum login saat proses pinjam

{% hint style="warning" %}
Jangan hanya mengunci tombol di tampilan. Tetap cek stok lagi di controller. Ini lapisan keamanan utama.
{% endhint %}

### Poin evaluasi bab 11.2

Pastikan Anda sudah bisa menjelaskan hal berikut:

* kenapa stok dicek sebelum `create()`
* kenapa data peminjaman disimpan terpisah dari tabel `buku`
* kenapa `decrement('stok')` dipanggil setelah transaksi disimpan
* kenapa route peminjaman sebaiknya memakai `POST`

Jika sudah beres, lanjut ke [11.3 Mengunci Tombol Jika Stok Habis](/laravel/bab-11-logika-transaksi-peminjaman/11.3-mengunci-tombol-jika-stok-habis.md).


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://learn.devlabss.my.id/laravel/bab-11-logika-transaksi-peminjaman/11.2-membuat-logika-pengurangan-stok.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
