67 lines
2.1 KiB
PHP
67 lines
2.1 KiB
PHP
<?php
|
|
namespace App\Console\Commands;
|
|
|
|
use App\Models\Patient;
|
|
use Illuminate\Console\Command;
|
|
|
|
class GeneratePatientMedicalRecordNumbers extends Command
|
|
{
|
|
/**
|
|
* Perintah yang nanti dijalankan di terminal.
|
|
*/
|
|
protected $signature = 'patients:generate-rm';
|
|
|
|
/**
|
|
* Deskripsi perintah.
|
|
*/
|
|
protected $description = 'Generate medical_record_number untuk pasien lama yang masih NULL';
|
|
|
|
public function handle()
|
|
{
|
|
// Ambil semua pasien yang belum punya nomor RM, diurutkan berdasarkan waktu dibuat
|
|
$patients = Patient::whereNull('medical_record_number')
|
|
->orWhere('medical_record_number', '')
|
|
->orderBy('created_at', 'asc')
|
|
->get();
|
|
|
|
if ($patients->isEmpty()) {
|
|
$this->info('Semua pasien sudah memiliki nomor Rekam Medis!');
|
|
return Command::SUCCESS;
|
|
}
|
|
|
|
$this->info("Menemukan {$patients->count()} pasien tanpa No. RM. Memulai proses...");
|
|
|
|
$bar = $this->output->createProgressBar($patients->count());
|
|
$bar->start();
|
|
|
|
foreach ($patients as $patient) {
|
|
// Gunakan tanggal buat pasien (created_at) agar prefix tahun-bulan sesuai waktu daftar
|
|
$prefix = 'RM' . $patient->created_at->format('ym');
|
|
|
|
// Cari nomor RM terakhir berdasarkan prefix bulan/tahun pasien tersebut
|
|
$latestNumber = Patient::where('medical_record_number', 'like', $prefix . '%')
|
|
->orderByDesc('medical_record_number')
|
|
->value('medical_record_number');
|
|
|
|
if ($latestNumber) {
|
|
$nextNumber = ((int) substr($latestNumber, -4)) + 1;
|
|
} else {
|
|
$nextNumber = 1;
|
|
}
|
|
|
|
// Simpan tanpa memicu event 'creating' lagi
|
|
$patient->medical_record_number = $prefix . str_pad($nextNumber, 4, '0', STR_PAD_LEFT);
|
|
$patient->saveQuietly(); // saveQuietly mencegah trigger event model
|
|
|
|
$bar->advance();
|
|
}
|
|
|
|
$bar->finish();
|
|
$this->newLine();
|
|
$this->info('Berhasil menggenerate semua No. RM untuk pasien lama!');
|
|
|
|
return Command::SUCCESS;
|
|
}
|
|
}
|
|
|