Tutorial 23 Aug 2026 2 Kali Dibaca

Cara Membuat Invoice PDF Laravel dengan Nomor Otomatis

Gugun Nurdiansyah
Penulis
Cara Membuat Invoice PDF Laravel dengan Nomor Otomatis

Apa Itu Invoice PDF Laravel?

Invoice PDF adalah dokumen tagihan yang dibuat secara otomatis oleh aplikasi Laravel dan dapat diunduh atau dikirim kepada pelanggan.

Informasi yang biasanya terdapat dalam invoice:

  1. Nomor invoice.

  2. Tanggal invoice.

  3. Data pelanggan.

  4. Daftar produk atau layanan.

  5. Subtotal.

  6. Diskon.

  7. Pajak.

  8. Total pembayaran.

  9. Metode pembayaran.

  10. Informasi perusahaan.

Membuat Tabel Invoice

Buat migration:

php artisan make:model Invoice -m

Contoh struktur tabel:

Schema::create('invoices', function (Blueprint $table) {
    $table->id();
    $table->string('invoice_number')->unique();
    $table->foreignId('customer_id');
    $table->date('invoice_date');
    $table->decimal('subtotal', 15, 2);
    $table->decimal('discount', 15, 2)->default(0);
    $table->decimal('tax', 15, 2)->default(0);
    $table->decimal('total', 15, 2);
    $table->string('status')->default('unpaid');
    $table->timestamps();
});

Kemudian jalankan:

php artisan migrate

Gunakan unique() pada invoice_number agar nomor invoice tidak boleh sama.

Membuat Nomor Invoice Otomatis

Format nomor invoice dapat dibuat seperti:

INV/2026/08/000001
INV/2026/08/000002
INV/2026/08/000003

Contoh fungsi sederhana:

public function generateInvoiceNumber(): string
{
    $prefix = 'INV/' . now()->format('Y/m') . '/';

    $lastInvoice = Invoice::where(
        'invoice_number',
        'like',
        $prefix . '%'
    )
    ->orderByDesc('id')
    ->first();

    $number = $lastInvoice
        ? ((int) substr($lastInvoice->invoice_number, -6)) + 1
        : 1;

    return $prefix . str_pad(
        $number,
        6,
        '0',
        STR_PAD_LEFT
    );
}

Hasilnya:

INV/2026/08/000001
INV/2026/08/000002
INV/2026/08/000003

Membuat Invoice

Pada controller:

public function store(Request $request)
{
    $invoice = Invoice::create([
        'invoice_number' => $this->generateInvoiceNumber(),
        'customer_id' => $request->customer_id,
        'invoice_date' => now(),
        'subtotal' => $request->subtotal,
        'discount' => $request->discount ?? 0,
        'tax' => $request->tax ?? 0,
        'total' => $request->total,
    ]);

    return redirect()
        ->route('invoices.show', $invoice);
}

Dengan cara ini, nomor invoice dibuat ketika transaksi disimpan.

Membuat Template Invoice

Buat file:

resources/views/invoices/pdf.blade.php

Contoh sederhana:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">

    <style>
        body {
            font-family: Arial, sans-serif;
            font-size: 12px;
        }

        .header {
            margin-bottom: 30px;
        }

        .invoice-title {
            font-size: 24px;
            font-weight: bold;
        }

        table {
            width: 100%;
            border-collapse: collapse;
        }

        th,
        td {
            padding: 8px;
            border-bottom: 1px solid #ddd;
        }

        .text-right {
            text-align: right;
        }

        .total {
            font-size: 16px;
            font-weight: bold;
        }
    </style>
</head>

<body>

    <div class="header">
        <div class="invoice-title">
            INVOICE
        </div>

        <p>
            No: {{ $invoice->invoice_number }}<br>
            Tanggal:
            {{ $invoice->invoice_date->format('d/m/Y') }}
        </p>
    </div>

    <h3>Bill To</h3>

    <p>
        {{ $invoice->customer->name }}
    </p>

    <table>
        <thead>
            <tr>
                <th>Produk</th>
                <th>Qty</th>
                <th>Harga</th>
                <th>Total</th>
            </tr>
        </thead>

        <tbody>
            @foreach ($invoice->items as $item)
                <tr>
                    <td>{{ $item->product_name }}</td>
                    <td>{{ $item->quantity }}</td>
                    <td>
                        Rp {{ number_format($item->price, 0, ',', '.') }}
                    </td>
                    <td>
                        Rp {{ number_format($item->total, 0, ',', '.') }}
                    </td>
                </tr>
            @endforeach
        </tbody>
    </table>

    <br>

    <table>
        <tr>
            <td>Subtotal</td>
            <td class="text-right">
                Rp {{ number_format($invoice->subtotal, 0, ',', '.') }}
            </td>
        </tr>

        <tr>
            <td>Diskon</td>
            <td class="text-right">
                Rp {{ number_format($invoice->discount, 0, ',', '.') }}
            </td>
        </tr>

        <tr>
            <td>Pajak</td>
            <td class="text-right">
                Rp {{ number_format($invoice->tax, 0, ',', '.') }}
            </td>
        </tr>

        <tr class="total">
            <td>Total</td>
            <td class="text-right">
                Rp {{ number_format($invoice->total, 0, ',', '.') }}
            </td>
        </tr>
    </table>

</body>
</html>

Menggunakan DomPDF

Salah satu package yang dapat digunakan untuk menghasilkan PDF dari Blade adalah DomPDF.

Install:

composer require barryvdh/laravel-dompdf

Kemudian buat method PDF:

use Barryvdh\DomPDF\Facade\Pdf;

public function pdf(Invoice $invoice)
{
    $invoice->load([
        'customer',
        'items',
    ]);

    $pdf = Pdf::loadView(
        'invoices.pdf',
        compact('invoice')
    );

    return $pdf->download(
        $invoice->invoice_number . '.pdf'
    );
}

File yang dihasilkan dapat menggunakan nama seperti:

INV-2026-08-000001.pdf

Menambahkan Route PDF

Tambahkan:

Route::get(
    '/invoices/{invoice}/pdf',
    [InvoiceController::class, 'pdf']
)->name('invoices.pdf');

Kemudian tombol pada halaman invoice:

<a
    href="{{ route('invoices.pdf', $invoice) }}"
>
    Download PDF
</a>

Preview PDF di Browser

Jika tidak ingin langsung mengunduh file:

return $pdf->stream(
    $invoice->invoice_number . '.pdf'
);

Dengan stream(), PDF akan ditampilkan langsung pada browser.

Nomor Invoice yang Aman dari Duplikasi

Pada aplikasi dengan banyak pengguna, dua proses dapat terjadi hampir bersamaan.

Contohnya:

User A → generate nomor 000005
User B → generate nomor 000005

Karena itu, jangan hanya mengandalkan pengecekan pada kode PHP.

Tetap gunakan:

$table->string('invoice_number')->unique();

Untuk sistem dengan transaksi tinggi, proses pembuatan nomor sebaiknya menggunakan database transaction dan mekanisme locking agar nomor tidak bertabrakan.

Contoh Alur Lengkap

Pelanggan melakukan transaksi
↓
Laravel membuat invoice
↓
Generate nomor otomatis
↓
Simpan invoice
↓
Simpan item invoice
↓
Generate PDF
↓
PDF dapat di-download
↓
PDF dapat dikirim ke pelanggan

Invoice juga dapat dikembangkan agar otomatis dikirim melalui email atau WhatsApp setelah transaksi berhasil.

Fitur Tambahan

Invoice PDF dapat dikembangkan dengan:

  1. Logo perusahaan.

  2. Alamat perusahaan.

  3. NPWP.

  4. Data pelanggan.

  5. QR Code.

  6. Tanda tangan digital.

  7. Terbilang.

  8. Watermark.

  9. Status pembayaran.

  10. Informasi rekening bank.

  11. QRIS.

  12. Link pembayaran.

  13. Nomor invoice otomatis.

  14. Riwayat pembayaran.

Untuk aplikasi multi-cabang, nomor invoice juga dapat dibuat berdasarkan cabang.

Contohnya:

INV-BKS/2026/08/000001
INV-KRW/2026/08/000001
INV-BDG/2026/08/000001

Dengan demikian, invoice lebih mudah dikelompokkan berdasarkan lokasi atau cabang.

Kesalahan yang Perlu Dihindari

Nomor Invoice Tidak Unik

Gunakan unique constraint pada database.

Nomor Invoice Dibuat dari ID Saja

ID database memang unik, tetapi format invoice biasanya membutuhkan struktur nomor yang lebih mudah dibaca.

Tidak Menggunakan Transaction

Pembuatan invoice dan item sebaiknya dilakukan dalam database transaction agar tidak menghasilkan invoice setengah jadi.

PDF Terlalu Kompleks

Gunakan HTML dan CSS yang kompatibel dengan PDF engine yang digunakan.

Tidak Menyimpan Data Invoice

Jangan hanya membuat PDF tanpa menyimpan data transaksi pada database.

Invoice harus tetap dapat ditemukan dan dibuat ulang ketika dibutuhkan.

Invoice Laravel Bersama Ovla Media

Ovla Media dapat membantu mengembangkan sistem invoice dan billing Laravel untuk kebutuhan:

  1. Invoice otomatis.

  2. PDF invoice.

  3. Nomor invoice otomatis.

  4. Pembayaran online.

  5. QRIS.

  6. Payment gateway.

  7. WhatsApp invoice.

  8. Email invoice.

  9. Sistem multi-cabang.

  10. Dashboard transaksi.

Invoice juga dapat diintegrasikan dengan Point of Sales, CRM, sistem klinik, inventory, dan aplikasi bisnis lainnya.

Kesimpulan

Membuat invoice PDF di Laravel dapat dilakukan dengan menggabungkan database invoice, generator nomor otomatis, Blade template, dan PDF library.

Alur sederhananya:

Transaksi
↓
Generate Nomor Invoice
↓
Simpan Database
↓
Render Blade
↓
Generate PDF
↓
Download / Kirim ke Pelanggan

Untuk sistem sederhana, format nomor seperti:

INV/2026/08/000001

sudah cukup mudah digunakan.

Untuk aplikasi bisnis yang lebih kompleks, nomor invoice dapat disesuaikan dengan cabang, periode, jenis transaksi, atau kebutuhan akuntansi.

#Invoice Laravel #PDF Laravel #Laravel Invoice #Generate PDF Laravel #Nomor Invoice Otomatis #Laravel DomPDF #Laravel Excel #Laravel Billing #Sistem Invoice #Invoice Otomatis #Invoice PDF #Payment Gateway Laravel #QRIS Laravel #Laravel Multi-Cabang #Point of Sales #Sistem Pembayaran #Web Development #Aplikasi Bisnis #Ovla Media #Jasa Laravel
Beranda Produk Artikel
Konsultasi
OVLA

Navigasi Utama

Hubungi Kami

Mulai Konsultasi Sekarang