Files
lis/htdocs/app/Console/Commands/ExportRegisterApiByDateCommand.php
T
2026-08-01 12:15:25 +07:00

139 lines
4.7 KiB
PHP

<?php
namespace App\Console\Commands;
use App\Periksa;
use Carbon\Carbon;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\File;
class ExportRegisterApiByDateCommand extends Command
{
protected $signature = 'register-api:export
{date : Tanggal data periksa, format YYYY-MM-DD}
{--column=daftar : Kolom tanggal untuk filter, contoh daftar/tanggalregis/tanggalsampel}
{--output= : Simpan hasil JSON ke file}
{--pretty : Format JSON agar mudah dibaca}';
protected $description = 'Export data periksa per tanggal ke format JSON payload registerApi.';
public function handle(): int
{
$date = $this->argument('date');
$column = (string) $this->option('column');
if (!$this->isValidDate($date)) {
$this->error('Format tanggal harus YYYY-MM-DD.');
return Command::FAILURE;
}
if (!in_array($column, ['daftar', 'tanggalregis', 'tanggalsampel'], true)) {
$this->error('Kolom tanggal hanya boleh: daftar, tanggalregis, tanggalsampel.');
return Command::FAILURE;
}
$records = Periksa::with('getPasien')
->whereDate($column, $date)
->orderBy($column)
->orderBy('id')
->get()
->map(fn (Periksa $periksa) => $this->mapPeriksaToRegisterPayload($periksa))
->values();
$payload = [
'tanggal' => $date,
'filter_column' => $column,
'total' => $records->count(),
'data' => $records,
];
$jsonOptions = JSON_UNESCAPED_SLASHES;
if ($this->option('pretty')) {
$jsonOptions |= JSON_PRETTY_PRINT;
}
$json = json_encode($payload, $jsonOptions);
if ($json === false) {
$this->error('Gagal membuat JSON.');
return Command::FAILURE;
}
if ($this->option('output')) {
$output = (string) $this->option('output');
File::ensureDirectoryExists(dirname($output));
File::put($output, $json . PHP_EOL);
$this->info('Export selesai: ' . $output);
$this->info('Total data: ' . $records->count());
return Command::SUCCESS;
}
$this->line($json);
return Command::SUCCESS;
}
private function mapPeriksaToRegisterPayload(Periksa $periksa): array
{
$pasien = $periksa->getPasien;
$tanggalLahir = $this->formatDate($periksa->tgllahirpasien ?? $pasien?->tgl_lahir);
$tanggalRegis = $this->formatDate($periksa->tanggalregis) ?: $this->formatDate($periksa->daftar);
$tanggalSampel = $this->formatDate($periksa->tanggalsampel) ?: $tanggalRegis;
$diagnosa = $periksa->klinis ?: null;
$klinisi = $periksa->klinisi ?: null;
return [
'norm' => $periksa->noregister,
'nama' => $periksa->nmpasien,
'alamat' => $periksa->alamatpasien ?: config('global.addressapps'),
'kota' => $pasien?->kota ?: config('global.subdomainapps'),
'tgllahir' => $tanggalLahir ?: date('Y-m-d'),
'nohap' => $periksa->tlppasien ?: '0000000000',
'kelamin' => $periksa->jkpasien ?: 'L',
'urgensi' => $periksa->urgensi ?: 'Elective',
'beratbadan' => (string) ($periksa->berat ?? '0'),
'nik' => $periksa->ktp ?: '0',
'nobpjs' => $periksa->bpjs ?: '0',
'drpeminta' => $klinisi,
'asalpasien' => $periksa->asalpasien,
'diagnosa' => $diagnosa,
'statusbayar' => null,
'nomor_lab' => $periksa->orderid,
'jenispembayaran' => $periksa->asuransi ?: 'UMM',
'klinisi' => $klinisi,
'jenispemeriksaan' => $periksa->reques,
'spesimen' => $periksa->nm_spesimen,
'kodespesimen' => $periksa->kd_spesimen,
'pengambilan' => $periksa->pengambilan,
'keteranganrujukan' => $periksa->nmrs ?: 'RSSA Malang',
'namarspengirim' => $periksa->nmrs ?: 'RSSA Malang',
'tanggalregis' => $tanggalRegis ?: date('Y-m-d'),
'tanggalsampel' => $tanggalSampel ?: date('Y-m-d'),
'asalpengirim' => $periksa->asalpengirim,
];
}
private function isValidDate(string $date): bool
{
try {
$parsed = Carbon::createFromFormat('Y-m-d', $date);
} catch (\Throwable) {
return false;
}
return $parsed && $parsed->format('Y-m-d') === $date;
}
private function formatDate(mixed $value): ?string
{
if (!$value) {
return null;
}
try {
return Carbon::parse($value)->format('Y-m-d');
} catch (\Throwable) {
return null;
}
}
}