Files
webstatement/app/Jobs/UpdateAtmCardBranchCurrencyJob.php
Daeng Deni Mardaeni 4b889da5a5 feat(webstatement): tambahkan pengelolaan product_code pada ATM Card
- **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>
2025-06-13 15:06:37 +07:00

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);
}
}