whereNotNull('catatan_admin') ->get(); $this->info("Ditemukan {$penugasans->count()} data lama yang perlu dimigrasi..."); $updated = 0; foreach ($penugasans as $p) { $catatan = $p->catatan_admin; $nama = null; $alamat = null; $noSamb = null; // ── Cari Nama ────────────────────────────────── // Pola: "Nama : ...", "Nama DR ...", "Nama: ..." if (preg_match('/Nama\s*[:\-]?\s*(.+?)(?=Alamat|Pekerjaan|No\.?|$)/is', $catatan, $m)) { $nama = trim($m[1]); } // ── Cari Alamat ───────────────────────────────── // Pola: "Alamat: ...", "Alamat BR. ..." if (preg_match('/Alamat\s*[:\-]?\s*(.+?)(?=Pekerjaan|No\.?|Nama|$)/is', $catatan, $m)) { $alamat = trim($m[1]); } // ── Cari No Sambungan ─────────────────────────── // Pola: "no sambungan 0032", "No sambungannya 0008", "no samb 0032" if (preg_match('/no\.?\s*samb(?:ungan(?:nya)?)?\s*[:\-]?\s*([0-9]+)/is', $catatan, $m)) { $noSamb = trim($m[1]); } // Bersihkan trailing punct dari hasil parsing $nama = $nama ? rtrim($nama, ' ,;.') : null; $alamat = $alamat ? rtrim($alamat, ' ,;.') : null; // Hanya update kalau minimal ada salah satu yang berhasil di-parse if ($nama || $alamat || $noSamb) { $p->update([ 'nama_pelanggan' => $nama, 'alamat_lokasi' => $alamat, 'no_sambungan' => $noSamb, ]); $updated++; $this->line(" ✅ ID #{$p->id_penugasan} → Nama: $nama | Alamat: $alamat | No: $noSamb"); } else { $this->line(" ⚠️ ID #{$p->id_penugasan} → Format tidak dikenali: \"{$catatan}\""); } } $this->info("\n✅ Selesai! $updated dari {$penugasans->count()} data berhasil dimigrasi."); return 0; } }