- **Penambahan Field Baru:**
- Menambahkan field baru `product_code` pada tabel `atmcards` melalui migrasi database.
- Field bersifat nullable dan memiliki komentar deskriptif untuk dokumentasi skema database.
- **Refaktor Logika pada UpdateAtmCardBranchCurrencyJob:**
- Menambahkan assignment data `product_code` untuk update kartu ATM berdasarkan informasi account.
- Mengoptimalkan proses query dengan memperbaiki penggunaan namespace model `Account`.
- **Peningkatan Model Atmcard:**
- Menambahkan relasi baru `biaya` untuk mendapatkan informasi terkait jenis kartu (`JenisKartu`).
- Menambah **scope** baru:
- `active` untuk memfilter kartu ATM yang aktif.
- `byProductCode` untuk memfilter berdasarkan kode produk (`product_code`).
- Memperkenalkan accessor dan mutator untuk memastikan format `product_code` konsisten (uppercase, trimmed).
- Menambahkan logging pada setiap akses relasi atau perubahan terkait field `product_code`.
- **Penyesuaian Logging:**
- Memperbanyak log untuk monitoring aktivitas, termasuk:
- Akses dan perubahan data `product_code`.
- Scope query pada model `Atmcard`.
- **Migrasi Database:**
- Menambahkan proses safe migration dengan transaksi pada operasi `up` dan `down`.
- Mencatat log saat migrasi berhasil atau rollback diperlukan jika terjadi kesalahan.
- **Optimisasi dan Perbaikan Format:**
- Mengorganisasi ulang import pada file `UpdateAtmCardBranchCurrencyJob` sesuai standar PSR-12.
- Membenahi key output response dari `openCategory` menjadi `acctType` untuk dukungan data baru `product_code`.
Signed-off-by: Daeng Deni Mardaeni <ddeni05@gmail.com>
136 lines
4.2 KiB
PHP
136 lines
4.2 KiB
PHP
<?php
|
|
|
|
namespace Modules\Webstatement\Jobs;
|
|
|
|
use Exception;
|
|
use Illuminate\Bus\Queueable;
|
|
use Illuminate\Support\Facades\Log;
|
|
use Illuminate\Support\Facades\Http;
|
|
use Illuminate\Queue\SerializesModels;
|
|
use Illuminate\Queue\InteractsWithQueue;
|
|
use Modules\Webstatement\Models\Account;
|
|
use Modules\Webstatement\Models\Atmcard;
|
|
use Illuminate\Contracts\Queue\ShouldQueue;
|
|
use Illuminate\Foundation\Bus\Dispatchable;
|
|
|
|
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 = 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,
|
|
'acctType' => $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,
|
|
'product_code' => !empty($accountInfo['acctType']) ? $accountInfo['acctType'] : null,
|
|
];
|
|
|
|
$this->card->update($cardData);
|
|
}
|
|
}
|