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:
Nomor invoice.
Tanggal invoice.
Data pelanggan.
Daftar produk atau layanan.
Subtotal.
Diskon.
Pajak.
Total pembayaran.
Metode pembayaran.
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:
Logo perusahaan.
Alamat perusahaan.
NPWP.
Data pelanggan.
QR Code.
Tanda tangan digital.
Terbilang.
Watermark.
Status pembayaran.
Informasi rekening bank.
QRIS.
Link pembayaran.
Nomor invoice otomatis.
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:
Invoice otomatis.
PDF invoice.
Nomor invoice otomatis.
Pembayaran online.
QRIS.
Payment gateway.
WhatsApp invoice.
Email invoice.
Sistem multi-cabang.
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.
Artikel Terkait
Cara Membuat Webhook Laravel yang Aman dengan Signature Verification
Webhook memungkinkan aplikasi menerima data secara otomatis dari layanan lain, seperti payment gateway, WhatsApp, marketplace, atau sistem pihak ketiga. Agar webhook tidak mudah dipalsukan, Laravel dapat menggunakan signature verification untuk memastikan request benar-benar berasal dari sumber yang dipercaya.
Cara Membuat Export Excel dengan Filter Tanggal di Laravel
Export Excel dengan filter tanggal memungkinkan pengguna mengunduh data berdasarkan periode tertentu. Fitur ini cocok untuk laporan transaksi, penjualan, pasien, pembayaran, absensi, dan data operasional lainnya di aplikasi Laravel.
Cara Membuat QR Code untuk Verifikasi Invoice Laravel
QR Code pada invoice dapat digunakan untuk membantu pelanggan memverifikasi keaslian dan status dokumen secara online. Dengan Laravel, QR Code dapat diarahkan ke halaman verifikasi yang menampilkan nomor invoice, tanggal, nominal, dan status pembayaran tanpa perlu membuka database secara langsung.