1. Laravel
  2. PHP

Membuat Penomoran Kode Otomatis di Laravel

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.27Tanggal pembuatan invoice dalam format Y.m.d
INVKode perihal
0001Urutan 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.

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
            ]
        ];
    }
}
codeKolom pada database yang digunakan untuk menyimpan kode otomatis.
formatFormat kode yang akan digunakan
? akan di replace dengan nomor urut data.
lengthJumlah 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

SOKode unik yang digunakan untuk menandakan penjualan.
2019.11.27Tanggal saat transaksi dibuat dengan format Y.m.d
BDGKode cabang dimana penjualan dilakukan
00001Nomor 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.

SOKode unik yang digunakan untuk menandakan penjualan.
date(‘Y.m.d’)Untuk mengambil tanggal hari ini
$this->branchMengambil 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:

ColumnFormat
idincrement
codestring
amountdecimal

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 comments
Comments to: Membuat Penomoran Kode Otomatis di Laravel
  • February 6, 2020

    1. 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?

    Reply
    • February 6, 2020

      packagenya udah di install? composer require alfa6661/laravel-autonumber

      Nothing to migrate karena packagenya belum di publish.

      Reply
      • February 6, 2020

        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 :

        [
            'format' => function () {
                return date('Y.m.d') . '/INV/?';
            },
            'length' => 5
        ]
        

        controller :
        5000,
        ]);

        return dd($test);
        }
        }

        Reply
        • February 6, 2020

          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.

          Reply
        • February 6, 2020

          package autonumber sudah diupdate.
          tidak perlu lagi package laravel/helpers.
          jalankan composer update untuk update ke versi terbaru.

          Reply
          • February 6, 2020

            Ok..terima kasih banyak…package udah jalan.

            mau tanya kl field name yg diencrypt di table auto_numbers, isinya sebenarnya apa mas

          • February 6, 2020

            mau tanya lagi…

            package ini sudah ada fitur reset no urut berdasarkan cabang dan tahun? kl ada gimana caranya?

            ma kasih

          • February 6, 2020

            field name pada table auto_numbers itu menyimpan nama unik untuk setiap konfigurasi yang di deskripsikan di method getAutoNumberOptions.
            Misalnya.

            return [
                'code' => [
                    'format' => function () {
                        return date('Y.m.d') . '/INV/?';
                    },
                    'length' => 5
                ]
            ];
            

            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 table auto_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.

  • February 6, 2020

    pada konfigurasi ini :

    return [
    ‘code’ => [
    ‘format’ => function () {
    return date(‘Y.m.d’) . ‘/INV/?’;
    },
    ‘length’ => 5
    ]
    ];

    berarti no urut direset setiap ganti hari(tanggal) ya ?

    Reply
    • February 6, 2020

      Ya.
      Kalo misal perlu kondisi tambahan untuk reset no urut, bisa ditambahkan pada bagian format di konfigurasi.

      return [
          'code' => [
              'format' => function () {
                  return date('Y.m.d') . '/INV/' . $this->branch . '/?'; 
              }
              'length' => 5,
          ]
      ];
      

      Dengan format diatas, no urut akan di reset setiap ganti hari dan branch / cabang berbeda.

      Reply
      • February 6, 2020

        Mis code: SRT-00001/BDG/I/2020

        formatnya sprti apa kl cab dan bulannya bisa berubah tp no urut direset berdasarkan ganti tahun

        Reply
        • February 6, 2020

          Untuk sekarang package ini belum bisa memenuhi kasus tersebut. Saya akan coba pikirkan solusinya dan update package ini agar bisa memenuhi kasus ini.

          Reply
  • February 8, 2020

    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

    Reply
    • February 9, 2020

      Untuk kasus ini sementara masih belum support. Saya akan coba update package nya untuk memenuhi kasus ini.

      Reply
  • March 17, 2020

    sy msh blm faham knp harus ada table baru lagi? knp ga biarkan model yg ngecek sendiri ada di posisi keberapa numbering nya?

    Reply
    • March 26, 2020

      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:

      return [
          'code' => [
              'format' => function () {
                  return 'SO/?-' . date('Ymd') . '-ABC'; 
              }
              'length' => 5,
          ]
      ];
      

      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”

      Reply
  • May 5, 2020

    apakah metode ini sudah tdak bisa digunakan lagi, soalnya saya coba install di composer berhasil, tetapi tidak muncul table migrate nya?? mohon informasinya

    Reply
    • May 5, 2020

      Masih bisa.
      Sudah di publish? php artisan vendor:publish
      Setelah publish baru migrate.

      Reply
      • May 5, 2020

        pada saat saya ingin publish, tidak bisa
        muncul pesan

        Unable to locate publishable resources.
        Publishing complete.

        Reply
  • May 5, 2020

    muncul seperti ini, apa ada solusinya??

    Reply
    • May 5, 2020

      Dari errornya package ini belum terinstall.
      coba cek ada folder alfa6661/laravel-autonumber ga di folder vendor?

      Reply
  • May 5, 2020

    di vendor ada folder nya

    Reply
    • May 5, 2020

      Coba gunakan tanda kutip 2.

      php artisan vendor:publish --provider="Alfa6661\AutoNumber\AutoNumberServiceProvider"
      

      atau kalo masih tidak bisa, jalankan perintah publish tanpa parameter.

      php artisan vendor:publish
      
      Reply
      • May 5, 2020

        terima kasih, berhasil menggunakan php artisan vendor:publish

        Reply
    • May 5, 2020

      mohon solusinya

      Reply
  • May 5, 2020

    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?

    Reply
  • May 5, 2020

    koreksi, maksudnya dua table

    Reply
    • May 6, 2020

      Maksudnya dengan kode yg sama?

      Reply
  • June 18, 2020

    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

    Reply
    • June 18, 2020

      Kalo udah ada object dari modelnya, tinggal passing param aja dari controller ke view.
      misal di controller:

      return view('show', ['order' => $order]
      

      di view

      {{ $order->code }}
      
      Reply
Write a response

Your email address will not be published. Required fields are marked *

Attach images - Only PNG, JPG, JPEG and GIF are supported.