diff --git a/app/Jobs/BiayaKartu.php b/app/Jobs/BiayaKartu.php index 4b1f454..21fe2c1 100644 --- a/app/Jobs/BiayaKartu.php +++ b/app/Jobs/BiayaKartu.php @@ -1,153 +1,163 @@ syncAtmCards(); - } + use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; - /** - * Get account information from the API - * - * @param string $accountNumber - * @return array - */ - private function getAccountInfo(string $accountNumber): array - { - $url = env('FIORANO_URL') . self::API_BASE_PATH; - $path = self::API_INQUIRY_PATH; - $data = [ - 'accountNo' => $accountNumber - ]; + /** + * API dan database constants + */ + private const API_BASE_PATH = '/restgateway/services/IGATEToCoreBankingServices'; + private const API_INQUIRY_PATH = '/InquiryBalanceService'; + private const DB_TABLE = 'IST77.VW_CMS_VCARD'; + private const BATCH_SIZE = 100; + private const MAX_EXECUTION_TIME = 86400; // 24 jam dalam detik - $response = Http::post($url . $path, $data); - - return $response->json(); - } - - /** - * 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() - ]); + /** + * Execute the job. + */ + public function handle() + : void + { + set_time_limit(self::MAX_EXECUTION_TIME); + $this->syncAtmCards(); } - } - /** - * 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) { + /** + * Synchronize ATM cards data from Oracle database + * + * @return void + */ + private function syncAtmCards() + : void + { try { - $accountInfo = $this->getAccountInfo($card->accflag); - $this->updateOrCreateAtmCard($card, $accountInfo); + $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::warning("Gagal memproses kartu {$card->crdno}: " . $e->getMessage()); + Log::error('BiayaKartu: syncAtmCards: ' . $e->getMessage(), [ + 'file' => $e->getFile(), + 'line' => $e->getLine() + ]); } } - } - /** - * Update or create ATM card record - * - * @param object $card - * @param array $accountInfo - * @return void - */ - private function updateOrCreateAtmCard(object $card, array $accountInfo): void - { - Atmcard::updateOrCreate( - ['crdno' => $card->crdno], - [ - '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, - 'last_update' => $card->lastupdate, - 'branch' => $accountInfo['acctCompany'], - 'currency' => $accountInfo['acctCurrency'], - ] - ); + /** + * 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 { + $accountInfo = $this->getAccountInfo($card->accflag); + $this->updateOrCreateAtmCard($card, $accountInfo); + } catch (Exception $e) { + Log::warning("Gagal memproses kartu {$card->crdno}: " . $e->getMessage()); + } + } + } + + /** + * Get account information from the API + * + * @param string $accountNumber + * + * @return array + */ + private function getAccountInfo(string $accountNumber) + : array + { + $url = env('FIORANO_URL') . self::API_BASE_PATH; + $path = self::API_INQUIRY_PATH; + $data = [ + 'accountNo' => $accountNumber + ]; + + $response = Http::post($url . $path, $data); + + return $response->json(); + } + + /** + * Update or create ATM card record + * + * @param object $card + * @param array $accountInfo + * + * @return void + */ + private function updateOrCreateAtmCard(object $card, array $accountInfo) + : void + { + Atmcard::updateOrCreate( + ['crdno' => $card->crdno], + [ + '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, + 'last_update' => $card->lastupdate, + 'crdate' => $card->crdate, + 'branch' => $accountInfo['acctCompany'], + 'currency' => $accountInfo['acctCurrency'], + ] + ); + } } -} diff --git a/database/migrations/2025_05_08_025605_create_atmcards_table.php b/database/migrations/2025_05_08_025605_create_atmcards_table.php index cfd6385..7171772 100644 --- a/database/migrations/2025_05_08_025605_create_atmcards_table.php +++ b/database/migrations/2025_05_08_025605_create_atmcards_table.php @@ -28,6 +28,7 @@ return new class extends Migration $table->string('crsts')->nullable(); $table->string('cttype')->nullable(); $table->string('ctdesc')->nullable(); + $table->string('crdate')->nullable(); $table->string('branch')->nullable(); $table->string('currency')->nullable(); $table->decimal('fee', 10, 2)->nullable();