syncAtmCards(); // Setelah sync selesai, jadwalkan job untuk memperbarui branch dan currency $this->scheduleUpdateBranchCurrencyJobs(); } /** * Synchronize ATM cards data from Oracle database * * @return void */ private function syncAtmCards(): void { try { $offset = 0; $hasMoreRecords = true; while ($hasMoreRecords) { $cards = $this->fetchCardBatch($offset); $this->processCardBatch($cards); $hasMoreRecords = count($cards) === self::BATCH_SIZE; $offset += self::BATCH_SIZE; } Log::info('Sinkronisasi kartu ATM berhasil diselesaikan'); } catch (Exception $e) { Log::error('BiayaKartu: syncAtmCards: ' . $e->getMessage(), [ 'file' => $e->getFile(), 'line' => $e->getLine() ]); } } /** * Fetch a batch of ATM cards from the database * * @param int $offset * * @return \Illuminate\Support\Collection */ private function fetchCardBatch(int $offset) { return DB::connection('oracle') ->table(self::DB_TABLE) ->where('crsts', 1) ->whereNotNull('ACCFLAG') ->where('ACCFLAG', '>', 0) ->skip($offset) ->take(self::BATCH_SIZE) ->get(); } /** * Process a batch of ATM cards * * @param \Illuminate\Support\Collection $cards * * @return void */ private function processCardBatch($cards): void { foreach ($cards as $card) { try { // Perbarui data kartu dasar $cardData = $this->getCardBaseData($card); Atmcard::updateOrCreate(['crdno' => $card->crdno], $cardData); } catch (Exception $e) { Log::warning("Gagal memproses kartu {$card->crdno}: " . $e->getMessage()); } } } /** * Schedule update branch and currency jobs for cards that need update * * @return void */ private function scheduleUpdateBranchCurrencyJobs(): void { try { // Ambil semua kartu yang perlu diperbarui branch dan currency $cards = Atmcard::where('crsts', 1) ->whereNotNull('accflag') ->where('accflag', '!=', '') ->where(function($query) { $query->whereNull('branch') ->orWhere('branch', '') ->orWhereNull('currency') ->orWhere('currency', ''); }) ->get(); $totalCards = $cards->count(); Log::info("Menjadwalkan {$totalCards} job pembaruan branch dan currency"); foreach ($cards as $card) { // Jadwalkan job dengan delay untuk menghindari terlalu banyak request bersamaan UpdateAtmCardBranchCurrencyJob::dispatch($card) ->delay(now()->addSeconds(rand(1, 300))); // Random delay antara 1-300 detik } Log::info('Semua job pembaruan branch dan currency telah dijadwalkan'); } catch (Exception $e) { Log::error('Gagal menjadwalkan job pembaruan branch dan currency: ' . $e->getMessage(), [ 'file' => $e->getFile(), 'line' => $e->getLine() ]); } } /** * Get base data for card update * * @param object $card * * @return array */ private function getCardBaseData(object $card): array { return [ 'accflag' => $card->accflag, 'cracc1' => $card->cracc1, 'cracc2' => $card->cracc2, 'cracc3' => $card->cracc3, 'cracc4' => $card->cracc4, 'cracc5' => $card->cracc5, 'craccnam1' => $card->craccnam1, 'craccnam2' => $card->craccnam2, 'craccnam3' => $card->craccnam3, 'craccnam4' => $card->craccnam4, 'craccnam5' => $card->craccnam5, 'crsts' => $card->crsts, 'cttype' => $card->cttype, 'ctdesc' => $card->ctdesc, 'crdate' => $card->crdate, 'last_update' => $card->lastupdate, ]; } }