MIF_E31230887/database/seeders/LokasiRakSeeder.php

82 lines
3.1 KiB
PHP

<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
class LokasiRakSeeder extends Seeder
{
/**
* Mapping kode_rak → koordinat pusat (x%, y%) pada gambar denah.
* Diambil dari array $shelves yang sudah ada di show.blade.php.
*/
private function getKoordinatRak(): array
{
return [
'rak_000' => ['x' => 23.25, 'y' => 53], // Rak 01-05 Umum
'rak_100' => ['x' => 30.25, 'y' => 53], // Rak 06-14 Filsafat
'rak_200' => ['x' => 23.25, 'y' => 69], // Rak 15-32 Agama
'rak_300' => ['x' => 30.25, 'y' => 69], // Rak 33-44 Sosial
'rak_400' => ['x' => 43.5, 'y' => 50.25], // Rak 45 Bahasa
'rak_500' => ['x' => 43.5, 'y' => 56.25], // Rak 46-48 Murni
'rak_600' => ['x' => 43.5, 'y' => 62.25], // Rak 49-68 Terapan
'rak_700' => ['x' => 43.5, 'y' => 68.75], // Rak 71-74 Seni
'rak_800' => ['x' => 43.5, 'y' => 75.25], // Rak 77-79 Sastra
'rak_900' => ['x' => 43.5, 'y' => 81.75], // Rak 69-84 Sejarah
'rak_baru' => ['x' => 28.5, 'y' => 88.75], // Rak 75-76 Baru
];
}
/**
* Prediksi kode rak berdasarkan nomor panggil (duplikasi logika controller).
*/
private function getKodeRak(?string $nomor_panggil): string
{
if (empty($nomor_panggil)) {
return 'none';
}
$kode_utama = (int) substr(trim($nomor_panggil), 0, 3);
return match (true) {
$kode_utama >= 0 && $kode_utama <= 99 => 'rak_000',
$kode_utama >= 100 && $kode_utama <= 199 => 'rak_100',
$kode_utama >= 200 && $kode_utama <= 299 => 'rak_200',
$kode_utama >= 300 && $kode_utama <= 399 => 'rak_300',
$kode_utama >= 400 && $kode_utama <= 499 => 'rak_400',
$kode_utama >= 500 && $kode_utama <= 599 => 'rak_500',
$kode_utama >= 600 && $kode_utama <= 699 => 'rak_600',
$kode_utama >= 700 && $kode_utama <= 799 => 'rak_700',
$kode_utama >= 800 && $kode_utama <= 899 => 'rak_800',
$kode_utama >= 900 && $kode_utama <= 999 => 'rak_900',
default => 'rak_baru',
};
}
public function run(): void
{
$koordinat = $this->getKoordinatRak();
$bukus = DB::table('buku')->get();
foreach ($bukus as $buku) {
$kodeRak = $this->getKodeRak($buku->nomor_panggil);
if ($kodeRak !== 'none' && isset($koordinat[$kodeRak])) {
// Tambahkan sedikit random offset agar pin tidak menumpuk
$offsetX = (rand(-15, 15) / 10);
$offsetY = (rand(-10, 10) / 10);
DB::table('buku')
->where('id_buku', $buku->id_buku)
->update([
'lokasi_x' => round($koordinat[$kodeRak]['x'] + $offsetX, 2),
'lokasi_y' => round($koordinat[$kodeRak]['y'] + $offsetY, 2),
]);
}
}
$this->command->info('Koordinat lokasi rak berhasil di-seed untuk ' . $bukus->count() . ' buku.');
}
}