diff --git a/app/Http/Controllers/PrintStatementController.php b/app/Http/Controllers/PrintStatementController.php index 858438c..fefa707 100644 --- a/app/Http/Controllers/PrintStatementController.php +++ b/app/Http/Controllers/PrintStatementController.php @@ -107,6 +107,10 @@ // Process statement availability check $this->checkStatementAvailability($statement); + $statement = PrintStatementLog::find($statement->id); + if($statement->email){ + $this->sendEmail($statement->id); + } DB::commit(); return redirect()->route('statements.index') @@ -287,17 +291,145 @@ $filePath = "{$statement->period_from}/{$statement->branch_code}/{$statement->account_number}_{$statement->period_from}.pdf"; if ($statement->is_period_range && $statement->period_to) { - // Handle period range download (existing logic) - // ... existing zip creation logic ... + // Log: Memulai proses download period range + Log::info('Starting period range download', [ + 'statement_id' => $statement->id, + 'period_from' => $statement->period_from, + 'period_to' => $statement->period_to + ]); + + /** + * Handle period range download dengan membuat zip file + * yang berisi semua statement dalam rentang periode + */ + $periodFrom = Carbon::createFromFormat('Ym', $statement->period_from); + $periodTo = Carbon::createFromFormat('Ym', $statement->period_to); + + // Loop through each month in the range + $missingPeriods = []; + $availablePeriods = []; + + for ($period = clone $periodFrom; $period->lte($periodTo); $period->addMonth()) { + $periodFormatted = $period->format('Ym'); + $periodPath = $periodFormatted . "/{$statement->branch_code}/{$statement->account_number}_{$periodFormatted}.pdf"; + + if ($disk->exists($periodPath)) { + $availablePeriods[] = $periodFormatted; + Log::info('Period available for download', [ + 'period' => $periodFormatted, + 'path' => $periodPath + ]); + } else { + $missingPeriods[] = $periodFormatted; + Log::warning('Period not available for download', [ + 'period' => $periodFormatted, + 'path' => $periodPath + ]); + } + } + + // If any period is available, create a zip and download it + if (count($availablePeriods) > 0) { + /** + * Membuat zip file temporary untuk download + * dengan semua statement yang tersedia dalam periode + */ + $zipFileName = "{$statement->account_number}_{$statement->period_from}_to_{$statement->period_to}.zip"; + $zipFilePath = storage_path("app/temp/{$zipFileName}"); + + // Ensure the temp directory exists + if (!file_exists(storage_path('app/temp'))) { + mkdir(storage_path('app/temp'), 0755, true); + Log::info('Created temp directory for zip files'); + } + + // Create a new zip archive + $zip = new ZipArchive(); + if ($zip->open($zipFilePath, ZipArchive::CREATE | ZipArchive::OVERWRITE) === true) { + Log::info('Zip archive created successfully', ['zip_path' => $zipFilePath]); + + // Add each available statement to the zip + foreach ($availablePeriods as $period) { + $periodFilePath = "{$period}/{$statement->branch_code}/{$statement->account_number}_{$period}.pdf"; + $localFilePath = storage_path("app/temp/{$statement->account_number}_{$period}.pdf"); + + try { + // Download the file from SFTP to local storage temporarily + file_put_contents($localFilePath, $disk->get($periodFilePath)); + + // Add the file to the zip + $zip->addFile($localFilePath, "{$statement->account_number}_{$period}.pdf"); + + Log::info('Added file to zip', [ + 'period' => $period, + 'local_path' => $localFilePath + ]); + } catch (Exception $e) { + Log::error('Failed to add file to zip', [ + 'period' => $period, + 'error' => $e->getMessage() + ]); + } + } + + $zip->close(); + Log::info('Zip archive closed successfully'); + + // Return the zip file for download + $response = response()->download($zipFilePath, $zipFileName)->deleteFileAfterSend(true); + + // Clean up temporary PDF files + foreach ($availablePeriods as $period) { + $localFilePath = storage_path("app/temp/{$statement->account_number}_{$period}.pdf"); + if (file_exists($localFilePath)) { + unlink($localFilePath); + Log::info('Cleaned up temporary file', ['file' => $localFilePath]); + } + } + + Log::info('Period range download completed successfully', [ + 'statement_id' => $statement->id, + 'available_periods' => count($availablePeriods), + 'missing_periods' => count($missingPeriods) + ]); + + return $response; + } else { + Log::error('Failed to create zip archive', ['zip_path' => $zipFilePath]); + return back()->with('error', 'Failed to create zip archive for download.'); + } + } else { + Log::warning('No statements available for download in period range', [ + 'statement_id' => $statement->id, + 'missing_periods' => $missingPeriods + ]); + return back()->with('error', 'No statements available for download in the specified period range.'); + } } else if ($disk->exists($filePath)) { + /** + * Handle single period download + * Download file PDF tunggal untuk periode tertentu + */ + Log::info('Single period download', [ + 'statement_id' => $statement->id, + 'file_path' => $filePath + ]); + return $disk->download($filePath, "{$statement->account_number}_{$statement->period_from}.pdf"); + } else { + Log::warning('Statement file not found', [ + 'statement_id' => $statement->id, + 'file_path' => $filePath + ]); + return back()->with('error', 'Statement file not found.'); } } catch (Exception $e) { DB::rollBack(); Log::error('Failed to download statement', [ 'statement_id' => $statement->id, - 'error' => $e->getMessage() + 'error' => $e->getMessage(), + 'trace' => $e->getTraceAsString() ]); return back()->with('error', 'Failed to download statement: ' . $e->getMessage()); @@ -481,6 +613,7 @@ public function sendEmail($id) { $statement = PrintStatementLog::findOrFail($id); + // Check if statement has email if (empty($statement->email)) { return redirect()->back()->with('error', 'No email address provided for this statement.'); diff --git a/app/Http/Requests/PrintStatementRequest.php b/app/Http/Requests/PrintStatementRequest.php index c39803f..afdfe4d 100644 --- a/app/Http/Requests/PrintStatementRequest.php +++ b/app/Http/Requests/PrintStatementRequest.php @@ -104,13 +104,13 @@ class PrintStatementRequest extends FormRequest $this->merge([ 'period_to' => substr($this->period_to, 0, 4) . substr($this->period_to, 5, 2), ]); - } - // Convert is_period_range to boolean if it exists - if ($this->has('period_to')) { - $this->merge([ - 'is_period_range' => true, - ]); + // Only set is_period_range to true if period_to is different from period_from + if ($this->period_to !== $this->period_from) { + $this->merge([ + 'is_period_range' => true, + ]); + } } // Set default request_type if not provided diff --git a/resources/views/statements/index.blade.php b/resources/views/statements/index.blade.php index 88cc931..3da8d4c 100644 --- a/resources/views/statements/index.blade.php +++ b/resources/views/statements/index.blade.php @@ -57,7 +57,7 @@ @enderror -