Pada artikel kali ini kita akan membahas bagaimana membuat kode otomatis menggunakan Laravel. Kode otomatis disini adalah sebuah kode yang mengandung format tertentu, misalnya nomor invoice 2019.11.27/INV/0001.
2019.11.27 | Tanggal pembuatan invoice dalam format Y.m.d |
INV | Kode perihal |
0001 | Urutan transaksi yang terjadi pada tanggal tersebut |
AutoNumber package
Untuk membuat kode otomatis menggunakan Laravel, pada tutorial kali ini kita akan menggunakan sebuah package yaitu AutoNumber.
laravel-autonumber (this link opens in a new window) by alfa6661 (this link opens in a new window)
Laravel package to create autonumber for Eloquent model
Instalasi
Kita bisa menginstal package ini dengan perintah composer.
composer require alfa6661/laravel-autonumber
Setelah itu, daftarkan package service provider pada file config/app.php.
'providers' => [
// ...
Alfa6661\AutoNumber\AutoNumberServiceProvider::class,
],
Publish config dan migration yang ada pada package ini.
php artisan vendor:publish --provider="Alfa6661\AutoNumber\AutoNumberServiceProvider"
Karena dalam package ini terdapat sebuah migration untuk membuat sebuah table, maka jalankan juga perintah migrate untuk membuat table tersebut.
php artisan migrate
Penggunaan
Untuk konfigurasi AutoNumber ada beberapa langkah yang harus kita gunakan pada model yang akan kita gunakan. Model yang akan kita gunakan harus mengimport sebuah trait yang sudah disediakan pada package ini Alfa6661\AutoNumber\AutoNumberTrait
. Trait ini juga mengandung sebuah abstract method getAutoNumberOptions
untuk mendefinisikan pengaturan format kode dan kolom yang mana yang akan kita gunakan untuk menyimpan kode otomatis ini, sehingga kita harus mengimplementasikan method ini pada model yang kita gunakan secara manual.
Contoh
use Alfa6661\AutoNumber\AutoNumberTrait;
class Order extends Model
{
use AutoNumberTrait;
/**
* Return the autonumber configuration array for this model.
*
* @return array
*/
public function getAutoNumberOptions()
{
return [
'code' => [
'format' => 'SO.?', // Format kode yang akan digunakan.
'length' => 5 // Jumlah digit yang akan digunakan sebagai nomor urut
]
];
}
}
code | Kolom pada database yang digunakan untuk menyimpan kode otomatis. |
format | Format kode yang akan digunakan ? akan di replace dengan nomor urut data. |
length | Jumlah digit yang akan digunakan sebagai nomor urut data. |
Format kode akan otomatis digenerate pada saat kita menyimpan data menggunakan eloquent model.
$order = Order::create([
'customer' => 'Alfa Adhitya',
]);
echo $order->code;
// SO.00001
Advanced Format
Terkadang kita diharuskan menggunakan format penomoran kode yang sedikit lebih rumit dibanding contoh diatas. Misalnya, SO/2019.11.27/BDG/00001
SO | Kode unik yang digunakan untuk menandakan penjualan. |
2019.11.27 | Tanggal saat transaksi dibuat dengan format Y.m.d |
BDG | Kode cabang dimana penjualan dilakukan |
00001 | Nomor urut penjualan yang terjadi pada tanggal tersebut |
Untuk memenuhi format diatas, kita bisa menggunakan Closure
pada value format.
public function getAutoNumberOptions()
{
return [
'code' => [
'format' => function () {
return 'SO/' . date('Y.m.d') . '/' . $this->branch . '/?';
}
'length' => 5,
]
];
}
Sama seperti contoh sebelumnya, kode penjualan akan otomatis digenerate pada saat data disimpan menggunakan eloquent model hanya saja dengan format yang berbeda.
Pada method getAutoNumberOptions
, kita menggunakan Closure
untuk konfigurasi format kode.
SO | Kode unik yang digunakan untuk menandakan penjualan. |
date(āY.m.dā) | Untuk mengambil tanggal hari ini |
$this->branch | Mengambil cabang dari penjualan. Didefinisikan pada saat penjualan dibuat. |
? | Nomor urut penjualan yang terjadi pada tanggal tersebut dan di cabang yang telah didefinisikan. |
$order = Order::create([
'customer' => 'Alfa Adhitya',
'branch' => 'BDG',
]);
echo $order->code;
// SO/2019.11.27/BDG/00001
Dengan pengaturan penomoran kode diatas, ketika terjadi penjualan di cabang yang berbeda, nomor urut akan dimulai kembali dari 1.
$order = Order::create([
'customer' => 'Alfa Adhitya',
'branch' => 'JKT',
]);
echo $order->code;
// SO/2019.11.27/JKT/00001
Contoh lain
Pada pengantar artikel ini, telah di contohkan sebuah kasus untuk generate nomor invoice. Pada contoh ini, akan dijelaskan bagaimana implementasi package ini dari awal. Berdasarkan skenario ini, kita buat dahulu tabel invoices
dengan data sederhana saja misalnya:
Column | Format |
id | increment |
code | string |
amount | decimal |
Setelah itu, kita buat model Invoice dengan menggunakan perintah dibawah ini:
php artisan make:model Invoice
Dengan perintah diatas, sekarang kita sudah memiliki sebuah model class baru pada directory app.
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Invoice extends Model
{
//
}
Setup Model
Langkah selanjutnya adalah setup model yang akan digunakan, kita akan menggunakan model Invoice yang telah kita buat pada langkah sebelumnya.
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Alfa6661\AutoNumber\AutoNumberTrait;
class Invoice extends Model
{
use AutoNumberTrait;
/**
* Return the autonumber configuration array for this model.
*
* @return array
*/
public function getAutoNumberOptions()
{
return [
'code' => [
'format' => function () {
return date('Y.m.d') . '/INV/?';
},
'length' => 5
]
];
}
}
Save Data
Format kode akan otomatis tergenerate ketika kita menyimpan data pada model berdasarkan pengaturan diatas.
$invoice = Invoice::create([
'amount' => 5000,
]);
echo $order->code;
// 2019.11.27/INV/0001
People reacted to this story.
Show comments Hide comments1. pada waktu run php artisan vendor:publish –provider=\’Alfa6661\\AutoNumber\\AutoNumberServiceProvider\’
muncul :
Unable to locate publishable resources.
Publishing complete.
2. pada waktu run php artisan migrate
muncul :
Nothing to migrate.
Tolong bisa dijelaskan?
packagenya udah di install?
composer require alfa6661/laravel-autonumber
Nothing to migrate karena packagenya belum di publish.
Package manifest generated successfully.
bahkan sukses diinstal sampai muncul :
Package manifest generated successfully.
oh ya..sy menggunakan laravel 6.
dengan kegagalan terutama no 1…waktu saya test: muncul error :
Call to undefined function Alfa6661\\AutoNumber\\array_except()
kode:
model :
controller :
5000,
]);
return dd($test);
}
}
Helper array_ dan str_ di Laravel versi 6. Untuk sementara bisa install package laravel/helpers
https://github.com/laravel/helpers
Saya akan update packagenya agar support di Laravel versi 6.
Ok…terima kasih banyak…
kalau sy install package https://github.com/laravel/helpers, apakah package autonumber alfa6661 bisa jalan?
package autonumber sudah diupdate.
tidak perlu lagi package laravel/helpers.
jalankan composer update untuk update ke versi terbaru.
Ok..terima kasih banyak…package udah jalan.
mau tanya kl field name yg diencrypt di table auto_numbers, isinya sebenarnya apa mas
mau tanya lagi…
package ini sudah ada fitur reset no urut berdasarkan cabang dan tahun? kl ada gimana caranya?
ma kasih
field name pada table auto_numbers itu menyimpan nama unik untuk setiap konfigurasi yang di deskripsikan di method getAutoNumberOptions.
Misalnya.
Konfigurasi diatas akan di konversi ke dalam md5 dan disimpan didalam field name pada table
auto_numbers
. Setiap ada perubahan nilai pada konfigurasi diatas, maka package ini akan membuat record baru pada tableauto_numbers
.Misal, tanggal hari ini 2020.02.06 (Karena konfigurasi diatas menggunakan tanggal
date('Y.m.d')
), besok nilai dari konfigurasi diatas akan berubah 2020.02.07, maka package ini akan membuat record baru lagi pada table auto_numbers.Pada dasarnya, table ini digunakan untuk menentukan nomor urut selanjutnya berdasarkan konfigurasi yang ditetapkan.
Untuk reset berdasarkan cabang dan tahun sudah dicontohkan pada artikel ini dibagian Advanced Format.
pada konfigurasi ini :
return [
ācodeā => [
āformatā => function () {
return date(āY.m.dā) . ā/INV/?ā;
},
ālengthā => 5
]
];
berarti no urut direset setiap ganti hari(tanggal) ya ?
Ya.
Kalo misal perlu kondisi tambahan untuk reset no urut, bisa ditambahkan pada bagian
format
di konfigurasi.Dengan format diatas, no urut akan di reset setiap ganti hari dan branch / cabang berbeda.
Mis code: SRT-00001/BDG/I/2020
formatnya sprti apa kl cab dan bulannya bisa berubah tp no urut direset berdasarkan ganti tahun
Untuk sekarang package ini belum bisa memenuhi kasus tersebut. Saya akan coba pikirkan solusinya dan update package ini agar bisa memenuhi kasus ini.
Maaf mau tanya lagi :
Kalau dalam 1 table ada 2 kode , terus ketika 1 kode di create, kode yg lainnya tidak berubah(tdk dicreate ulang krn sudah terisi dgn format lain), gimn oftion/format nya?
terima kasiih
Untuk kasus ini sementara masih belum support. Saya akan coba update package nya untuk memenuhi kasus ini.
sy msh blm faham knp harus ada table baru lagi? knp ga biarkan model yg ngecek sendiri ada di posisi keberapa numbering nya?
Memang memungkinkan untuk menggunakan modelnya sendiri untuk cek posisi numberingnya. Table baru digunakan untuk memudahkan query saja.
Penomoran kode tentu saja akan berbeda-beda sesuai kebutuhan, terkadang nomor urut disimpan di awal atau bahkan di tengah format.
Contoh kasus:
Format yang di inginkan SO/NO_URUT-TANGGAL-ABC
Jika di tulis sesuai konfigurasi pada package ini kurang lebih seperti ini:
Pada contoh diatas, jika menggunakan model target untuk generate numberingnya, kita harus memecah dulu format diatas untuk mendapatkan dimana posisi nomor urut ditempatkan, kemudian query ke database untuk dengan kondisi 2 digit = SO, dimulai karakter ke 10 sampai dengan terakhir = Tanggal Hari ini + “-ABC”
apakah metode ini sudah tdak bisa digunakan lagi, soalnya saya coba install di composer berhasil, tetapi tidak muncul table migrate nya?? mohon informasinya
Masih bisa.
Sudah di publish? php artisan vendor:publish
Setelah publish baru migrate.
pada saat saya ingin publish, tidak bisa
muncul pesan
Unable to locate publishable resources.
Publishing complete.
muncul seperti ini, apa ada solusinya??
Dari errornya package ini belum terinstall.
coba cek ada folder alfa6661/laravel-autonumber ga di folder vendor?
di vendor ada folder nya
Coba gunakan tanda kutip 2.
atau kalo masih tidak bisa, jalankan perintah publish tanpa parameter.
terima kasih, berhasil menggunakan php artisan vendor:publish
mohon solusinya
maaf mau nanya lagi, autonumber ini bisa di save ke dua database skaligus kah?? misal 1 ke table invoice , 1 lagi ke table penerima? kalo bisa contoh code nya gimana ya?
koreksi, maksudnya dua table
Maksudnya dengan kode yg sama?
gan saya udah ikutin dari awal lancar, tapi saya bingung nerapin ke view nya gimana ya kalo di contoh kan
echo $order->code;
// 2019.11.27/INV/0001
code nya itu taruh dimana gan?
Terima Kasih
Kalo udah ada object dari modelnya, tinggal passing param aja dari controller ke view.
misal di controller:
di view
mau tanya, yang saya kan dalam satu transaksi ada 2 barang yg diinput. nah masalahnya ketika saya simpan, no pembelian itu jadi bertambah nomornya
contoh : 2021.01.09/NT/0000, barang1
2021.01.09/NT/00002, barang 2
seharusnya : 2021.01.09/NT/00001,barang1
2021.01.09/NT/00001,barang2
Mohon solusinya, Terimakasih
Skema database nya seperti apa? Kalo autonumber disimpan di master tablenya seharusnya hanya ada 1 nomor transaksi.