si-klinik/sk-klinik.my.id/app/Console/Commands/GeneratePatientMedicalRecor...

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;
}
}