Tags

, , ,

Pada umumnya kita terbiasa menggunakan autoincrement sebagai primari key dokumen. Tetapi ada beberapa dokumen yang memerlukan penomoran khusus dengan format tertentu sesuai dengan jenis dokumen. Misalnya mengandung informasi tanggal, mengandung kode tertentu untuk membedakan jenis dokumen dan lain-lain.

Screenshot from 2016-02-06 09:51:06

Untuk keperluan tersebut, kita bisa memanfaatkan ekstensi yang sudah ada yaitu mdmsoft/yii2-autonumber. Cara pemakaiannya akan dijelaskan sebagai berikut

Cara Install

Dengan menggunakan composer cukup jalankan

php composer.phar require --prefer-dist mdmsoft/yii2-autonumber "~1.0"

Atau tambahkan manual di composer.json

"mdmsoft/yii2-autonumber": "~1.0"

lalu jalankan composer update

Untuk install tanpa composer, silakan download sourcenya dari sini. Ekstrak, kemudian tambahkan konfigurasi untuk path alias

'aliases' => [
    ...
    '@mdm/autonumber' => 'path/to/your/yii2-autonumber'
]

Setelah selesai install, jangan lupa menjalankan proses migrasi

yii migrate --migrationPath=@mdm/autonumber/migrations

Bisa juga membuat tabelnya secara manual dengan format

CREATE TABLE auto_number (
    "group" varchar(32) NOT NULL,
    "number" int,
    optimistic_lock int,
    update_time int,
    PRIMARY KEY ("group")
);

Penggunaan

Ada 2 cara menggunakan ekstensi ini, yaitu sebagai validator(filter) atau sebagai behavior yang dua-duanya kita terapkan pada ActiveRecord yang kita inginkan.

Sebagai validator tambahkan pada method rules() dari model

public function rules()
{
    return [
       ...
       [['sales_num'], 'autonumber', 'format'=>date('Ymd').'-?', 'digit'=>4],
    ];
}

Sedangkan sebagai behavior, tambahkan di method behaviors()

public function behaviors()
{
    return [
        ...,
        [
            'class' => 'mdm\autonumber\Behavior',
            'attribute' => 'sales_num', // required
            'value' => date('Ymd') . '-?' , 
            'digit' => 4 
        ]
    ];
}

** format di validator adalah sama dengan value di behavior.

Dari contoh di atas. Misalkan tanggal sekarang adalah 6 Februari 2016, maka kode tersebut akan menggenerate nomor dengan format 20160216-xxxx. Tentu saja kita bisa menggunakan format lain seperti menyatakan bulan dalam angka romawi.

Contoh:

public function rules()
{
    return [
       ...
       [['sales_num'], 'autonumber', 'format'=>'formatRomawi'],
    ];
}

public function formatRomawi()
{
    $romawi = ['I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX', 'X', 'XI', 'XII'];
    $bulan = $romawi[date('n')-1];
    return date('Y') . "/{$bulan}/?";
}

Kode di atas akan menghasilkan nomor dengan format 2016/II/x

Advertisements