Files
webstatement/app/Jobs/UpdateAtmCardBranchCurrencyJob.php
Daeng Deni Mardaeni dbdeceb4c0 feat(webstatement): optimalkan pengambilan informasi account untuk UpdateAtmCardBranchCurrencyJob
- **Penambahan Logika Pengambilan Data:**
  - Menambahkan proses pengambilan data account dari model `Account` sebelum memanggil API Fiorano.
  - Melakukan pencarian data berdasarkan nomor rekening (`account_number`) melalui query pada model.
  - Jika data ditemukan, mengembalikan informasi account berupa response format yang menyerupai hasil dari API.

- **Optimisasi Response:**
  - Menyusun data response lengkap dari model `Account`, seperti kode cabang (`branch_code`), mata uang (`currency`), kategori pembukaan (`open_category`), dan properti lain yang relevan.
  - Field response menyertakan nilai default atau diisi dengan data lain yang ada dalam model.

- **Fallback API Fiorano:**
  - Jika data dari database tidak ditemukan, tetap menggunakan mekanisme existing untuk melakukan request ke API Fiorano.
  - Tidak ada perubahan lain pada struktur permintaan atau penanganan response Fiorano.

- **Komentar dan Dokumentasi:**
  - Memperbarui komentar pada fungsi `getAccountInfo` untuk mencerminkan logika terbaru.
  - Menjelaskan fallback ke API jika data model tidak tersedia melalui komentar inline agar lebih mudah dipahami.

- **Peningkatan Efisiensi:**
  - Mengurangi frekuensi panggilan API Fiorano dengan memanfaatkan data lokal terlebih dahulu, sehingga mempercepat proses eksekusi job.

Signed-off-by: Daeng Deni Mardaeni <ddeni05@gmail.com>
2025-06-13 14:33:47 +07:00

133 lines
4.1 KiB
PHP

<?php
namespace Modules\Webstatement\Jobs;
use Exception;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
use Modules\Webstatement\Models\Atmcard;
class UpdateAtmCardBranchCurrencyJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* API constants
*/
private const API_BASE_PATH = '/restgateway/services/IGATEToCoreBankingServices';
private const API_INQUIRY_PATH = '/InquiryBalanceService';
/**
* The ATM card to update.
*
* @var Atmcard
*/
protected $card;
/**
* Create a new job instance.
*
* @param Atmcard $card
* @return void
*/
public function __construct(Atmcard $card)
{
$this->card = $card;
}
/**
* Execute the job.
*
* @return void
*/
public function handle(): void
{
try {
if ($this->needBranchAndCurrencyUpdate()) {
$accountInfo = $this->getAccountInfo($this->card->accflag);
if ($accountInfo && isset($accountInfo['responseCode']) && $accountInfo['responseCode'] === '00') {
$this->updateBranchAndCurrency($accountInfo);
Log::info("Berhasil memperbarui branch dan currency untuk kartu {$this->card->crdno}");
} else {
Log::warning("Gagal mendapatkan informasi akun untuk kartu {$this->card->crdno}. Response: " .
json_encode($accountInfo ?? ['error' => 'No response']));
}
}
} catch (Exception $e) {
Log::error("Error saat memperbarui branch dan currency untuk kartu {$this->card->crdno}: " . $e->getMessage(), [
'file' => $e->getFile(),
'line' => $e->getLine()
]);
}
}
/**
* Check if branch and currency update is needed
*
* @return bool
*/
private function needBranchAndCurrencyUpdate(): bool
{
return empty($this->card->branch) || empty($this->card->currency);
}
/**
* Get account information from Account model or API
*
* @param string $accountNumber
* @return array|null
*/
private function getAccountInfo(string $accountNumber): ?array
{
try {
// Coba dapatkan data dari model Account terlebih dahulu
$account = \Modules\Webstatement\Models\Account::where('account_number', $accountNumber)->first();
if ($account) {
// Jika account ditemukan, format data sesuai dengan format response dari API
return [
'responseCode' => '00',
'acctCompany' => $account->branch_code,
'acctCurrency' => $account->currency,
'openCategory' => $account->open_category
// Tambahkan field lain yang mungkin diperlukan
];
}
// Jika tidak ditemukan di database, ambil dari Fiorano API
$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();
} catch (Exception $e) {
Log::error("Gagal mendapatkan informasi akun: " . $e->getMessage());
return null;
}
}
/**
* Update branch and currency information for the card
*
* @param array $accountInfo
* @return void
*/
private function updateBranchAndCurrency(array $accountInfo): void
{
$cardData = [
'branch' => !empty($accountInfo['acctCompany']) ? $accountInfo['acctCompany'] : null,
'currency' => !empty($accountInfo['acctCurrency']) ? $accountInfo['acctCurrency'] : null,
];
$this->card->update($cardData);
}
}