From 1e1120d29bfa0d2f99044125aeecd919e517422e Mon Sep 17 00:00:00 2001 From: daengdeni Date: Mon, 26 May 2025 13:40:37 +0700 Subject: [PATCH] refactor(migrasi): simplify and centralize data processing logic - Menghapus metode proses data individual untuk setiap tipe data dengan menggantinya menjadi metode `processData`. - Mengintegrasikan semua tipe proses data ke dalam konstanta `PROCESS_TYPES` untuk mempermudah pengelolaan dan memperluas tipe proses. - Menambahkan konstanta `PARAMETER_PROCESSES` dan `DATA_PROCESSES` untuk memisahkan proses data parameter dan data utama. - Mengimplementasikan metode `__call` untuk mendukung pemanggilan metode dinamis berdasarkan tipe proses data. - Memperbaiki metode `index` untuk mendukung pemrosesan otomatis data parameter dan data utama dalam urutan yang ditentukan. - Menambahkan logging untuk setiap proses data agar memudahkan debugging dan monitoring. - Memastikan pengembalian respons JSON seragam untuk keberhasilan dan kegagalan setiap proses data. --- app/Http/Controllers/MigrasiController.php | 307 +++++---------------- 1 file changed, 73 insertions(+), 234 deletions(-) diff --git a/app/Http/Controllers/MigrasiController.php b/app/Http/Controllers/MigrasiController.php index 91cc3f8..da3804c 100644 --- a/app/Http/Controllers/MigrasiController.php +++ b/app/Http/Controllers/MigrasiController.php @@ -4,6 +4,7 @@ use App\Http\Controllers\Controller; use Exception; + use Illuminate\Http\JsonResponse; use Illuminate\Support\Facades\Storage; use Log; use Modules\Webstatement\Jobs\ProcessAccountDataJob; @@ -24,259 +25,97 @@ class MigrasiController extends Controller { + private const PROCESS_TYPES = [ + 'transaction' => ProcessTransactionDataJob::class, + 'stmtNarrParam' => ProcessStmtNarrParamDataJob::class, + 'stmtNarrFormat' => ProcessStmtNarrFormatDataJob::class, + 'ftTxnTypeCondition' => ProcessFtTxnTypeConditionJob::class, + 'category' => ProcessCategoryDataJob::class, + 'company' => ProcessCompanyDataJob::class, + 'customer' => ProcessCustomerDataJob::class, + 'account' => ProcessAccountDataJob::class, + 'stmtEntry' => ProcessStmtEntryDataJob::class, + 'dataCapture' => ProcessDataCaptureDataJob::class, + 'fundsTransfer' => ProcessFundsTransferDataJob::class, + 'teller' => ProcessTellerDataJob::class, + 'atmTransaction' => ProcessAtmTransactionJob::class, + 'arrangement' => ProcessArrangementDataJob::class, + 'billDetail' => ProcessBillDetailDataJob::class + ]; - public function processTransactionData($period) + private const PARAMETER_PROCESSES = [ + 'transaction', + 'stmtNarrParam', + 'stmtNarrFormat', + 'ftTxnTypeCondition' + ]; + + private const DATA_PROCESSES = [ + 'category', + 'company', + 'customer', + 'account', + 'stmtEntry', + 'dataCapture', + 'fundsTransfer', + 'teller', + 'atmTransaction', + 'arrangement', + 'billDetail' + ]; + + private function processData(string $type, string $period) + : JsonResponse { try { - ProcessTransactionDataJob::dispatch($period); - Log::info('Data Transaction processing job has been successfully'); - return response()->json(['message' => 'Data Transaction processing job has been successfully']); + $jobClass = self::PROCESS_TYPES[$type]; + $jobClass::dispatch($period); + + $message = sprintf('%s data processing job has been queued successfully', ucfirst($type)); + Log::info($message); + + return response()->json(['message' => $message]); } catch (Exception $e) { + Log::error(sprintf('Error in %s processing: %s', $type, $e->getMessage())); return response()->json(['error' => $e->getMessage()], 500); } } - public function processStmtNarrParamData($period) + public function __call($method, $parameters) { - try { - ProcessStmtNarrParamDataJob::dispatch($period); - return response()->json(['message' => 'Data TempStmtNarrParam processing job has been successfully']); - } catch (Exception $e) { - return response()->json(['error' => $e->getMessage()], 500); + if (strpos($method, 'process') === 0) { + $type = lcfirst(substr($method, 7)); + if (isset(self::PROCESS_TYPES[$type])) { + return $this->processData($type, $parameters[0] ?? ''); + } } + throw new BadMethodCallException("Method {$method} does not exist."); } - public function processStmtNarrFormatData($period) - { - try { - ProcessStmtNarrFormatDataJob::dispatch($period); - return response()->json(['message' => 'Data TempStmtNarrFormat processing job has been successfully']); - } catch (Exception $e) { - return response()->json(['error' => $e->getMessage()], 500); - } - } - - public function ProcessFtTxnTypeConditioData($period) - { - try { - ProcessFtTxnTypeConditionJob::dispatch($period); - return response()->json(['message' => 'FtTxnTypeCondition processing job has been successfully']); - } catch (Exception $e) { - return response()->json(['error' => $e->getMessage()], 500); - } - } - - public function index_manual() - { - //$disk = Storage::disk('sftpStatement'); - - // Get all directories (periods) in the SFTP disk - //$allDirectories = $disk->directories(); - - //$this->processTransactionData('_parameter'); - //$this->processStmtNarrParamData('_parameter'); - //$this->processStmtNarrFormatData('_parameter'); - //$this->ProcessFtTxnTypeConditioData('_parameter'); - - // Filter out the _parameter folder - /*$periods = array_filter($allDirectories, function($dir) { - return $dir !== '_parameter'; - });*/ - - $periods = [ - /*'20250510', - '20250512', - '20250513', - '20250514', - '20250515', - '20250516', - '20250517', - '20250518', - '20250519',*/ - '20250520', - '20250521', - '20250522' - ]; - - // Sort periods by date (descending) - usort($periods, function ($a, $b) { - return strcmp($b, $a); // Reverse comparison for descending order - }); - - if (empty($periods)) { - return response()->json(['message' => 'No valid period folders found in SFTP storage'], 404); - } - - foreach ($periods as $period) { - $this->ProcessCategoryData($period); - $this->ProcessCompanyData($period); - - $this->processCustomerData($period); - $this->processAccountData($period); - - $this->processStmtEntryData($period); - $this->ProcessDataCaptureData($period); - $this->processFundsTransferData($period); - $this->ProcessTellerData($period); - $this->ProcessAtmTransaction($period); - - $this->processArrangementData($period); - $this->processBillDetailData($period); - } - - return response()->json(['message' => 'Data processing job has been successfully']); - } - - public function ProcessCategoryData($period) - { - try { - ProcessCategoryDataJob::dispatch($period); - return response()->json(['message' => 'Category processing job has been successfully']); - } catch (Exception $e) { - return response()->json(['error' => $e->getMessage()], 500); - } - } - - public function ProcessCompanyData($period) - { - try { - ProcessCompanyDataJob::dispatch($period); - return response()->json(['message' => 'Company processing job has been successfully']); - } catch (Exception $e) { - return response()->json(['error' => $e->getMessage()], 500); - } - } - - public function processCustomerData($period) - { - try { - // Pass the period to the job for processing - ProcessCustomerDataJob::dispatch($period); - - return response()->json([ - 'message' => 'Data Customer processing job has been successfully queued', - 'period' => $period - ]); - } catch (Exception $e) { - Log::error('Error in processCustomerData: ' . $e->getMessage()); - return response()->json(['error' => $e->getMessage()], 500); - } - } - - public function processAccountData($period) - { - try { - ProcessAccountDataJob::dispatch($period); - return response()->json(['message' => 'Data Account processing job has been successfully']); - } catch (Exception $e) { - return response()->json(['error' => $e->getMessage()], 500); - } - } - - public function processStmtEntryData($period) - { - try { - ProcessStmtEntryDataJob::dispatch($period); - return response()->json(['message' => 'Stmt Entry processing job has been successfully']); - } catch (Exception $e) { - return response()->json(['error' => $e->getMessage()], 500); - } - } - - public function ProcessDataCaptureData($period) - { - try { - ProcessDataCaptureDataJob::dispatch($period); - return response()->json(['message' => 'Data Capture processing job has been successfully']); - } catch (Exception $e) { - return response()->json(['error' => $e->getMessage()], 500); - } - } - - public function processFundsTransferData($period) - { - try { - ProcessFundsTransferDataJob::dispatch($period); - return response()->json(['message' => 'Data Funds Transfer processing job has been successfully']); - } catch (Exception $e) { - return response()->json(['error' => $e->getMessage()], 500); - } - } - - public function ProcessTellerData($period) - { - try { - ProcessTellerDataJob::dispatch($period); - return response()->json(['message' => 'Teller processing job has been successfully']); - } catch (Exception $e) { - return response()->json(['error' => $e->getMessage()], 500); - } - } - - public function ProcessAtmTransaction($period) - { - try { - ProcessAtmTransactionJob::dispatch($period); - return response()->json(['message' => 'AtmTransaction processing job has been successfully']); - } catch (Exception $e) { - return response()->json(['error' => $e->getMessage()], 500); - } - } - - public function processArrangementData($period) - { - try { - ProcessArrangementDataJob::dispatch($period); - return response()->json(['message' => 'Data Arrangement processing job has been successfully']); - } catch (Exception $e) { - return response()->json(['error' => $e->getMessage()], 500); - } - } - - public function processBillDetailData($period) - { - try { - ProcessBillDetailDataJob::dispatch($period); - return response()->json(['message' => 'Data Bill Details processing job has been successfully']); - } catch (Exception $e) { - return response()->json(['error' => $e->getMessage()], 500); - } - } - - /** - * Process data migration for the previous day's period. - * - * This method automatically determines the period based on yesterday's date, - * checks if the corresponding folder exists in SFTP storage, and then - * processes all required data types in the correct sequence. - * - * @return \Illuminate\Http\JsonResponse A JSON response indicating success or failure - * @throws \Exception If the period folder doesn't exist or if any processing job fails - */ public function index() { $disk = Storage::disk('sftpStatement'); - $period = date('Ymd', strtotime('-1 day')); - if (!$disk->exists($period)) { - return response()->json(["message" => "Period {$period} folder not found in SFTP storage"], 404); + if (request('process_parameter')) { + foreach (self::PARAMETER_PROCESSES as $process) { + $this->processData($process, '_parameter'); + } + return response()->json(['message' => 'Parameter processes completed successfully']); } - $this->ProcessCategoryData($period); - $this->ProcessCompanyData($period); + $period = date('Ymd', strtotime('-1 day')); + if (!$disk->exists($period)) { + return response()->json([ + "message" => "Period {$period} folder not found in SFTP storage" + ], 404); + } - $this->processCustomerData($period); - $this->processAccountData($period); + foreach (self::DATA_PROCESSES as $process) { + $this->processData($process, $period); + } - $this->processStmtEntryData($period); - $this->ProcessDataCaptureData($period); - $this->processFundsTransferData($period); - $this->ProcessTellerData($period); - $this->ProcessAtmTransaction($period); - - $this->processArrangementData($period); - $this->processBillDetailData($period); - - return response()->json(['message' => "Data processing {$period} job has been successfully"]); + return response()->json([ + 'message' => "Data processing for period {$period} has been queued successfully" + ]); } }