diff --git a/app/Http/Controllers/MigrasiController.php b/app/Http/Controllers/MigrasiController.php index 075d9a6..d5c35cf 100644 --- a/app/Http/Controllers/MigrasiController.php +++ b/app/Http/Controllers/MigrasiController.php @@ -10,6 +10,7 @@ use Modules\Webstatement\Jobs\ProcessAccountDataJob; use Modules\Webstatement\Jobs\ProcessArrangementDataJob; use Modules\Webstatement\Jobs\ProcessBillDetailDataJob; use Modules\Webstatement\Jobs\ProcessCustomerDataJob; +use Modules\Webstatement\Jobs\ProcessFtTxnTypeConditionJob; use Modules\Webstatement\Jobs\ProcessFundsTransferDataJob; use Modules\Webstatement\Jobs\ProcessStmtEntryDataJob; use Modules\Webstatement\Jobs\ProcessStmtNarrFormatDataJob; @@ -102,6 +103,15 @@ class MigrasiController extends Controller } } + public function ProcessFtTxnTypeConditioData($periods){ + try { + ProcessFtTxnTypeConditionJob::dispatch($periods); + return response()->json(['message' => 'Data FtTxnTypeCondition processing job has been successfully']); + } catch (Exception $e) { + return response()->json(['error' => $e->getMessage()], 500); + } + } + public function processStmtEntryData($periods){ try { ProcessStmtEntryDataJob::dispatch($periods); @@ -123,6 +133,7 @@ class MigrasiController extends Controller $this->processStmtNarrParamData(['_parameter']); $this->processStmtNarrFormatData(['_parameter']); + $this->ProcessFtTxnTypeConditioData(['_parameter']); // Filter out the _parameter folder $periods = array_filter($allDirectories, function($dir) { diff --git a/app/Jobs/ProcessFtTxnTypeConditionJob.php b/app/Jobs/ProcessFtTxnTypeConditionJob.php new file mode 100644 index 0000000..cfaac0d --- /dev/null +++ b/app/Jobs/ProcessFtTxnTypeConditionJob.php @@ -0,0 +1,118 @@ +periods = $periods; + $this->filename = $filename; + } + + /** + * Execute the job. + */ + public function handle(): void + { + try { + set_time_limit(24 * 60 * 60); + $disk = Storage::disk('sftpStatement'); + $processedCount = 0; + $errorCount = 0; + + if (empty($this->periods)) { + Log::warning('No periods provided for transaction type condition data processing'); + return; + } + + foreach ($this->periods as $period) { + // Skip the _parameter folder + if ($period === '_parameter') { + Log::info("Skipping _parameter folder"); + continue; + } + + // Construct the filepath based on the period folder name + $filePath = "$period/{$this->filename}"; + + Log::info("Processing transaction type condition file: $filePath"); + + if (!$disk->exists($filePath)) { + Log::warning("File not found: $filePath"); + continue; + } + + // Create a temporary local copy of the file + $tempFilePath = storage_path("app/temp_{$this->filename}"); + file_put_contents($tempFilePath, $disk->get($filePath)); + + $handle = fopen($tempFilePath, "r"); + + if ($handle !== false) { + $headers = ['id', 'date_time', 'transaction_type', 'short_descr', 'txn_code_cr', 'txn_code_dr']; + $rowCount = 0; + + while (($row = fgetcsv($handle, 0, "~")) !== false) { + $rowCount++; + + // Skip header row if it exists + if ($rowCount === 1 && strtolower($row[0]) === 'id') { + continue; + } + + if (count($headers) === count($row)) { + $data = array_combine($headers, $row); + try { + if (!empty($data['id'])) { + FtTxnTypeCondition::updateOrCreate( + ['id' => $data['id']], + $data + ); + $processedCount++; + } + } catch (Exception $e) { + $errorCount++; + Log::error("Error processing Transaction Type Condition at row $rowCount in $filePath: " . $e->getMessage()); + } + } else { + Log::warning("Row $rowCount in $filePath has incorrect column count. Expected: " . count($headers) . ", Got: " . count($row)); + } + } + + fclose($handle); + Log::info("Completed processing $filePath. Processed $processedCount records with $errorCount errors."); + + // Clean up the temporary file + unlink($tempFilePath); + } else { + Log::error("Unable to open file: $filePath"); + } + } + + Log::info("Transaction type condition data processing completed. Total processed: $processedCount, Total errors: $errorCount"); + + } catch (Exception $e) { + Log::error('Error in ProcessFtTxnTypeConditionJob: ' . $e->getMessage()); + throw $e; + } + } +} diff --git a/app/Models/FtTxnTypeCondition.php b/app/Models/FtTxnTypeCondition.php new file mode 100644 index 0000000..9dd7d2c --- /dev/null +++ b/app/Models/FtTxnTypeCondition.php @@ -0,0 +1,61 @@ + + */ + protected $fillable = [ + 'id', + 'date_time', + 'transaction_type', + 'short_descr', + 'txn_code_cr', + 'txn_code_dr', + ]; + + /** + * The attributes that should be cast. + * + * @var array + */ + protected $casts = [ + 'date_time' => 'datetime', + ]; + } diff --git a/database/migrations/2025_05_20_143103_create_ft_txn_type_condition_table.php b/database/migrations/2025_05_20_143103_create_ft_txn_type_condition_table.php new file mode 100644 index 0000000..df9051a --- /dev/null +++ b/database/migrations/2025_05_20_143103_create_ft_txn_type_condition_table.php @@ -0,0 +1,35 @@ +string('id')->primary(); + $table->dateTime('date_time')->nullable(); + $table->string('transaction_type')->nullable(); + $table->string('short_descr')->nullable(); + $table->string('txn_code_cr')->nullable(); + $table->string('txn_code_dr')->nullable(); + $table->timestamps(); + $table->softDeletes(); + }); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('ft_txn_type_condition'); + } +};