82 lines
3.1 KiB
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.');
|
|
}
|
|
}
|