From 4b889da5a5d5bdfb3a4988a0eeb7c20828688b62 Mon Sep 17 00:00:00 2001 From: Daeng Deni Mardaeni Date: Fri, 13 Jun 2025 15:06:37 +0700 Subject: [PATCH] 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 --- app/Jobs/UpdateAtmCardBranchCurrencyJob.php | 19 +++--- app/Models/Atmcard.php | 58 +++++++++++++++++ ...827_add_product_code_to_atmcards_table.php | 63 +++++++++++++++++++ 3 files changed, 132 insertions(+), 8 deletions(-) create mode 100644 database/migrations/2025_06_13_075827_add_product_code_to_atmcards_table.php diff --git a/app/Jobs/UpdateAtmCardBranchCurrencyJob.php b/app/Jobs/UpdateAtmCardBranchCurrencyJob.php index 7b6a1ab..acedd9b 100644 --- a/app/Jobs/UpdateAtmCardBranchCurrencyJob.php +++ b/app/Jobs/UpdateAtmCardBranchCurrencyJob.php @@ -4,13 +4,14 @@ 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; -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 { @@ -86,7 +87,7 @@ class UpdateAtmCardBranchCurrencyJob implements ShouldQueue { try { // Coba dapatkan data dari model Account terlebih dahulu - $account = \Modules\Webstatement\Models\Account::where('account_number', $accountNumber)->first(); + $account = Account::where('account_number', $accountNumber)->first(); if ($account) { // Jika account ditemukan, format data sesuai dengan format response dari API @@ -94,7 +95,7 @@ class UpdateAtmCardBranchCurrencyJob implements ShouldQueue 'responseCode' => '00', 'acctCompany' => $account->branch_code, 'acctCurrency' => $account->currency, - 'openCategory' => $account->open_category + 'acctType' => $account->open_category // Tambahkan field lain yang mungkin diperlukan ]; } @@ -103,7 +104,8 @@ class UpdateAtmCardBranchCurrencyJob implements ShouldQueue $url = env('FIORANO_URL') . self::API_BASE_PATH; $path = self::API_INQUIRY_PATH; $data = [ - 'accountNo' => $accountNumber + 'accountNo' => $accountNumber, + ]; $response = Http::post($url . $path, $data); @@ -125,6 +127,7 @@ class UpdateAtmCardBranchCurrencyJob implements ShouldQueue $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); diff --git a/app/Models/Atmcard.php b/app/Models/Atmcard.php index 7bcdc04..d81f41a 100644 --- a/app/Models/Atmcard.php +++ b/app/Models/Atmcard.php @@ -4,6 +4,7 @@ namespace Modules\Webstatement\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Factories\HasFactory; +use Illuminate\Support\Facades\Log; // use Modules\Webstatement\Database\Factories\AtmcardFactory; class Atmcard extends Model @@ -15,7 +16,64 @@ class Atmcard extends Model */ protected $guarded = ['id']; + /** + * Relasi ke tabel JenisKartu untuk mendapatkan informasi biaya kartu + * + * @return \Illuminate\Database\Eloquent\Relations\BelongsTo + */ public function biaya(){ + Log::info('Mengakses relasi biaya untuk ATM card', ['card_id' => $this->id]); return $this->belongsTo(JenisKartu::class,'ctdesc','code'); } + + /** + * Scope untuk mendapatkan kartu ATM yang aktif + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @return \Illuminate\Database\Eloquent\Builder + */ + public function scopeActive($query) + { + Log::info('Menggunakan scope active untuk filter kartu ATM aktif'); + return $query->where('crsts', 1); + } + + /** + * Scope untuk mendapatkan kartu berdasarkan product_code + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @param string $productCode + * @return \Illuminate\Database\Eloquent\Builder + */ + public function scopeByProductCode($query, $productCode) + { + Log::info('Menggunakan scope byProductCode', ['product_code' => $productCode]); + return $query->where('product_code', $productCode); + } + + /** + * Accessor untuk mendapatkan product_code dengan format yang konsisten + * + * @param string $value + * @return string|null + */ + public function getProductCodeAttribute($value) + { + return $value ? strtoupper(trim($value)) : null; + } + + /** + * Mutator untuk menyimpan product_code dengan format yang konsisten + * + * @param string $value + * @return void + */ + public function setProductCodeAttribute($value) + { + $this->attributes['product_code'] = $value ? strtoupper(trim($value)) : null; + Log::info('Product code diset untuk ATM card', [ + 'card_id' => $this->id ?? 'new', + 'product_code' => $this->attributes['product_code'] + ]); + } } diff --git a/database/migrations/2025_06_13_075827_add_product_code_to_atmcards_table.php b/database/migrations/2025_06_13_075827_add_product_code_to_atmcards_table.php new file mode 100644 index 0000000..91dd4ff --- /dev/null +++ b/database/migrations/2025_06_13_075827_add_product_code_to_atmcards_table.php @@ -0,0 +1,63 @@ +string('product_code')->nullable()->after('ctdesc')->comment('Kode produk kartu ATM'); + }); + + DB::commit(); + Log::info('Migration berhasil: field product_code telah ditambahkan ke tabel atmcards'); + + } catch (Exception $e) { + DB::rollback(); + Log::error('Migration gagal: ' . $e->getMessage()); + throw $e; + } + } + + /** + * Membalikkan migration dengan menghapus field product_code dari tabel atmcards + * + * @return void + */ + public function down(): void + { + Log::info('Memulai rollback migration: menghapus field product_code dari tabel atmcards'); + + DB::beginTransaction(); + + try { + Schema::table('atmcards', function (Blueprint $table) { + $table->dropColumn('product_code'); + }); + + DB::commit(); + Log::info('Rollback migration berhasil: field product_code telah dihapus dari tabel atmcards'); + + } catch (Exception $e) { + DB::rollback(); + Log::error('Rollback migration gagal: ' . $e->getMessage()); + throw $e; + } + } +};