62 lines
1.3 KiB
PHP
62 lines
1.3 KiB
PHP
<?php
|
|
|
|
namespace App\Traits;
|
|
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
trait HasAutoCode
|
|
{
|
|
/**
|
|
* Boot the trait.
|
|
* Auto-generate code before creating record.
|
|
*/
|
|
protected static function bootHasAutoCode(): void
|
|
{
|
|
static::creating(function ($model) {
|
|
|
|
// Skip if code already set (manual / seeder)
|
|
if (! empty($model->code)) {
|
|
return;
|
|
}
|
|
|
|
$prefix = $model->getCodePrefix();
|
|
$column = $model->getCodeColumn();
|
|
$length = $model->getCodeLength();
|
|
|
|
$lastCode = DB::table($model->getTable())
|
|
->where($column, 'like', $prefix.'%')
|
|
->orderBy($column, 'desc')
|
|
->value($column);
|
|
|
|
$nextNumber = 1;
|
|
|
|
if ($lastCode) {
|
|
$nextNumber = (int) substr($lastCode, strlen($prefix)) + 1;
|
|
}
|
|
|
|
$model->{$column} = $prefix.str_pad($nextNumber, $length, '0', STR_PAD_LEFT);
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Prefix code (WAJIB override di model)
|
|
*/
|
|
abstract protected function getCodePrefix(): string;
|
|
|
|
/**
|
|
* Code column name
|
|
*/
|
|
protected function getCodeColumn(): string
|
|
{
|
|
return 'code';
|
|
}
|
|
|
|
/**
|
|
* Numeric length
|
|
*/
|
|
protected function getCodeLength(): int
|
|
{
|
|
return 3;
|
|
}
|
|
}
|