Compare commits
4 Commits
836cdfc49d
...
47bf23302f
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
47bf23302f | ||
|
|
d85954bdf2 | ||
|
|
db99465690 | ||
|
|
df5d0c420b |
@@ -5,9 +5,11 @@ namespace Modules\Webstatement\Http\Controllers;
|
|||||||
use App\Http\Controllers\Controller;
|
use App\Http\Controllers\Controller;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Illuminate\Support\Facades\File;
|
use Illuminate\Support\Facades\File;
|
||||||
|
use Illuminate\Support\Facades\Storage;
|
||||||
use Illuminate\Support\Facades\Log;
|
use Illuminate\Support\Facades\Log;
|
||||||
use Modules\Webstatement\Jobs\CombinePdfJob;
|
use Modules\Webstatement\Jobs\CombinePdfJob;
|
||||||
use Modules\Webstatement\Models\Account;
|
use Modules\Webstatement\Models\Account;
|
||||||
|
use Carbon\Carbon;
|
||||||
|
|
||||||
class CombinePdfController extends Controller
|
class CombinePdfController extends Controller
|
||||||
{
|
{
|
||||||
@@ -27,11 +29,17 @@ class CombinePdfController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function combinePdfs($period)
|
public function combinePdfs($period)
|
||||||
{
|
{
|
||||||
|
// Configuration: Set r23 file source - 'local' or 'sftp'
|
||||||
|
$file_r23 = 'local'; // Change this to 'sftp' to use SFTP for r23 files
|
||||||
|
|
||||||
|
// Configuration: Set output destination - 'local' or 'sftp'
|
||||||
|
$output_destination = 'local'; // Change this to 'sftp' to upload combined PDFs to SFTP
|
||||||
|
|
||||||
// Get period from request or use current period
|
// Get period from request or use current period
|
||||||
$period = $period ?? date('Ym');
|
$period = $period ?? date('Ym');
|
||||||
|
|
||||||
// Get all accounts
|
// Get all accounts with customer relation
|
||||||
$accounts = Account::where('branch_code','ID0010001')->get();
|
$accounts = Account::where('branch_code','ID0010052')->get();
|
||||||
$processedCount = 0;
|
$processedCount = 0;
|
||||||
$skippedCount = 0;
|
$skippedCount = 0;
|
||||||
$errorCount = 0;
|
$errorCount = 0;
|
||||||
@@ -41,41 +49,76 @@ class CombinePdfController extends Controller
|
|||||||
$accountNumber = $account->account_number;
|
$accountNumber = $account->account_number;
|
||||||
|
|
||||||
// Define file paths
|
// Define file paths
|
||||||
$r14Path = storage_path("app/STMT/r14/{$period}/{$branchCode}/{$accountNumber}_{$period}.pdf");
|
$r14Path = storage_path("app/r14/{$accountNumber}_{$period}.pdf");
|
||||||
$r23Path = storage_path("app/STMT/r23/{$period}/{$branchCode}/{$accountNumber}_{$period}.pdf");
|
|
||||||
|
// Define r23 paths based on configuration
|
||||||
|
$r23LocalPath = storage_path("app/r23/{$accountNumber}.1.pdf");
|
||||||
|
$r23SftpPath = "r23/{$accountNumber}.1.pdf";
|
||||||
|
|
||||||
|
// Define temporary path for r23 file downloaded from SFTP
|
||||||
|
$tempDir = storage_path("app/temp/{$period}");
|
||||||
|
if (!File::exists($tempDir)) {
|
||||||
|
File::makeDirectory($tempDir, 0755, true);
|
||||||
|
}
|
||||||
|
$r23TempPath = "{$tempDir}/{$accountNumber}_r23.pdf";
|
||||||
|
|
||||||
$outputDir = storage_path("app/combine/{$period}/{$branchCode}");
|
$outputDir = storage_path("app/combine/{$period}/{$branchCode}");
|
||||||
$outputFilename = "{$accountNumber}_{$period}.pdf";
|
$outputFilename = "{$accountNumber}_{$period}.pdf";
|
||||||
|
|
||||||
// Check if files exist
|
// Check if r14 file exists locally
|
||||||
$r14Exists = File::exists($r14Path);
|
$r14Exists = File::exists($r14Path);
|
||||||
$r23Exists = File::exists($r23Path);
|
|
||||||
|
// Check for r23 file based on configuration
|
||||||
|
$r23Exists = false;
|
||||||
|
$r23FinalPath = null;
|
||||||
|
|
||||||
|
if ($file_r23 === 'local') {
|
||||||
|
// Use local r23 files
|
||||||
|
if (File::exists($r23LocalPath)) {
|
||||||
|
$r23Exists = true;
|
||||||
|
$r23FinalPath = $r23LocalPath;
|
||||||
|
Log::info("Found r23 file locally for account {$accountNumber}");
|
||||||
|
}
|
||||||
|
} elseif ($file_r23 === 'sftp') {
|
||||||
|
// Use SFTP r23 files
|
||||||
|
try {
|
||||||
|
if (Storage::disk('sftpStatement')->exists($r23SftpPath)) {
|
||||||
|
$r23Content = Storage::disk('sftpStatement')->get($r23SftpPath);
|
||||||
|
File::put($r23TempPath, $r23Content);
|
||||||
|
$r23Exists = true;
|
||||||
|
$r23FinalPath = $r23TempPath;
|
||||||
|
Log::info("Downloaded r23 file for account {$accountNumber} from SFTP");
|
||||||
|
}
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
Log::error("Error downloading r23 file from SFTP for account {$accountNumber}: {$e->getMessage()}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Skip if neither file exists
|
// Skip if neither file exists
|
||||||
if (!$r14Exists && !$r23Exists) {
|
if (!$r14Exists && !$r23Exists) {
|
||||||
Log::warning("No PDF files found for account {$accountNumber}");
|
//Log::warning("No PDF files found for account {$accountNumber}");
|
||||||
$skippedCount++;
|
$skippedCount++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If both files exist, combine them
|
// Prepare file list for processing
|
||||||
if ($r14Exists && $r23Exists) {
|
$pdfFiles = [];
|
||||||
Log::info("Combining PDFs for account {$accountNumber}");
|
if ($r14Exists) {
|
||||||
$pdfFiles = [$r14Path, $r23Path];
|
$pdfFiles[] = $r14Path;
|
||||||
}
|
}
|
||||||
// If only one file exists, just apply password protection
|
if ($r23Exists) {
|
||||||
else {
|
$pdfFiles[] = $r23FinalPath;
|
||||||
Log::info("Applying password protection to single PDF for account {$accountNumber}");
|
|
||||||
$pdfFile = $r14Exists ? $r14Path : $r23Path;
|
|
||||||
$pdfFiles = [$pdfFile];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Use the account number as password
|
// Generate password based on customer relation data
|
||||||
$password = $accountNumber;
|
$password = $this->generatePassword($account);
|
||||||
|
|
||||||
// Dispatch job to combine PDFs or apply password protection
|
// Dispatch job to combine PDFs or apply password protection
|
||||||
CombinePdfJob::dispatch($pdfFiles, $outputDir, $outputFilename, $password);
|
CombinePdfJob::dispatch($pdfFiles, $outputDir, $outputFilename, $password, $output_destination, $branchCode, $period);
|
||||||
$processedCount++;
|
$processedCount++;
|
||||||
|
|
||||||
|
Log::info("Queued PDF processing for account {$accountNumber} - r14: local, r23: {$file_r23}, output: {$output_destination}, password: {$password}");
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
Log::error("Error processing PDF for account {$accountNumber}: {$e->getMessage()}");
|
Log::error("Error processing PDF for account {$accountNumber}: {$e->getMessage()}");
|
||||||
$errorCount++;
|
$errorCount++;
|
||||||
@@ -83,11 +126,65 @@ class CombinePdfController extends Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
return response()->json([
|
return response()->json([
|
||||||
'message' => 'PDF combination process has been queued',
|
'message' => "PDF combination process has been queued (r14: local, r23: {$file_r23}, output: {$output_destination})",
|
||||||
'processed' => $processedCount,
|
'processed' => $processedCount,
|
||||||
'skipped' => $skippedCount,
|
'skipped' => $skippedCount,
|
||||||
'errors' => $errorCount,
|
'errors' => $errorCount,
|
||||||
'period' => $period
|
'period' => $period
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate password based on customer relation data
|
||||||
|
* Format: date+end 2 digit account_number
|
||||||
|
* Example: 05Oct202585
|
||||||
|
*
|
||||||
|
* @param Account $account
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
private function generatePassword(Account $account)
|
||||||
|
{
|
||||||
|
$customer = $account->customer;
|
||||||
|
$accountNumber = $account->account_number;
|
||||||
|
|
||||||
|
// Get last 2 digits of account number
|
||||||
|
$lastTwoDigits = substr($accountNumber, -2);
|
||||||
|
|
||||||
|
// Determine which date to use based on sector
|
||||||
|
$dateToUse = null;
|
||||||
|
|
||||||
|
if ($customer && $customer->sector) {
|
||||||
|
$firstDigitSector = substr($customer->sector, 0, 1);
|
||||||
|
|
||||||
|
if ($firstDigitSector === '1') {
|
||||||
|
// Use date_of_birth if available, otherwise birth_incorp_date
|
||||||
|
$dateToUse = $customer->date_of_birth ?: $customer->birth_incorp_date;
|
||||||
|
} else {
|
||||||
|
// Use birth_incorp_date for sector > 1
|
||||||
|
$dateToUse = $customer->birth_incorp_date;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If no date found, fallback to account number
|
||||||
|
if (!$dateToUse) {
|
||||||
|
Log::warning("No date found for account {$accountNumber}, using account number as password");
|
||||||
|
return $accountNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Parse the date and format it
|
||||||
|
$date = Carbon::parse($dateToUse);
|
||||||
|
$day = $date->format('d');
|
||||||
|
$month = $date->format('M'); // 3-letter month abbreviation
|
||||||
|
$year = $date->format('Y');
|
||||||
|
|
||||||
|
// Format: ddMmmyyyyXX (e.g., 05Oct202585)
|
||||||
|
$password = $day . $month . $year . $lastTwoDigits;
|
||||||
|
|
||||||
|
return $password;
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
Log::error("Error parsing date for account {$accountNumber}: {$e->getMessage()}");
|
||||||
|
return $accountNumber; // Fallback to account number
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ use Illuminate\Queue\InteractsWithQueue;
|
|||||||
use Illuminate\Queue\SerializesModels;
|
use Illuminate\Queue\SerializesModels;
|
||||||
use Illuminate\Support\Facades\Log;
|
use Illuminate\Support\Facades\Log;
|
||||||
use Illuminate\Support\Facades\Storage;
|
use Illuminate\Support\Facades\Storage;
|
||||||
|
use Illuminate\Support\Facades\File;
|
||||||
use Owenoj\PDFPasswordProtect\Facade\PDFPasswordProtect;
|
use Owenoj\PDFPasswordProtect\Facade\PDFPasswordProtect;
|
||||||
use Webklex\PDFMerger\Facades\PDFMergerFacade as PDFMerger;
|
use Webklex\PDFMerger\Facades\PDFMergerFacade as PDFMerger;
|
||||||
|
|
||||||
@@ -21,6 +22,9 @@ class CombinePdfJob implements ShouldQueue
|
|||||||
protected $outputPath;
|
protected $outputPath;
|
||||||
protected $outputFilename;
|
protected $outputFilename;
|
||||||
protected $password;
|
protected $password;
|
||||||
|
protected $outputDestination;
|
||||||
|
protected $branchCode;
|
||||||
|
protected $period;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new job instance.
|
* Create a new job instance.
|
||||||
@@ -29,13 +33,19 @@ class CombinePdfJob implements ShouldQueue
|
|||||||
* @param string $outputPath Directory where the combined PDF will be saved
|
* @param string $outputPath Directory where the combined PDF will be saved
|
||||||
* @param string $outputFilename Filename for the combined PDF
|
* @param string $outputFilename Filename for the combined PDF
|
||||||
* @param string $password Password to protect the PDF
|
* @param string $password Password to protect the PDF
|
||||||
|
* @param string $outputDestination Output destination: 'local' or 'sftp'
|
||||||
|
* @param string $branchCode Branch code for SFTP path
|
||||||
|
* @param string $period Period for SFTP path
|
||||||
*/
|
*/
|
||||||
public function __construct(array $pdfFiles, string $outputPath, string $outputFilename, string $password)
|
public function __construct(array $pdfFiles, string $outputPath, string $outputFilename, string $password, string $outputDestination = 'local', string $branchCode = '', string $period = '')
|
||||||
{
|
{
|
||||||
$this->pdfFiles = $pdfFiles;
|
$this->pdfFiles = $pdfFiles;
|
||||||
$this->outputPath = $outputPath;
|
$this->outputPath = $outputPath;
|
||||||
$this->outputFilename = $outputFilename;
|
$this->outputFilename = $outputFilename;
|
||||||
$this->password = $password;
|
$this->password = $password;
|
||||||
|
$this->outputDestination = $outputDestination;
|
||||||
|
$this->branchCode = $branchCode;
|
||||||
|
$this->period = $period;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -86,10 +96,43 @@ class CombinePdfJob implements ShouldQueue
|
|||||||
Log::info("PDF password protection applied successfully.");
|
Log::info("PDF password protection applied successfully.");
|
||||||
}
|
}
|
||||||
|
|
||||||
Log::info("PDFs combined successfully. Output file: {$fullPath}");
|
// Handle output destination
|
||||||
|
if ($this->outputDestination === 'sftp') {
|
||||||
|
$this->uploadToSftp($fullPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
Log::info("PDFs combined successfully. Output file: {$fullPath}, Destination: {$this->outputDestination}");
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
Log::error("Error combining PDFs: " . $e->getMessage());
|
Log::error("Error combining PDFs: " . $e->getMessage());
|
||||||
throw $e;
|
throw $e;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Upload the combined PDF to SFTP server
|
||||||
|
*
|
||||||
|
* @param string $localFilePath
|
||||||
|
*/
|
||||||
|
private function uploadToSftp(string $localFilePath): void
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
// Define SFTP path: combine/{period}/{branchCode}/{filename}
|
||||||
|
$sftpPath = "combine/{$this->period}/{$this->branchCode}/{$this->outputFilename}";
|
||||||
|
|
||||||
|
// Read the local file content
|
||||||
|
$fileContent = File::get($localFilePath);
|
||||||
|
|
||||||
|
// Upload to SFTP
|
||||||
|
Storage::disk('sftpStatement')->put($sftpPath, $fileContent);
|
||||||
|
|
||||||
|
Log::info("Combined PDF uploaded to SFTP: {$sftpPath}");
|
||||||
|
|
||||||
|
// Optionally, remove the local file after successful upload
|
||||||
|
// File::delete($localFilePath);
|
||||||
|
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
Log::error("Error uploading combined PDF to SFTP: {$e->getMessage()}");
|
||||||
|
throw $e;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||||
use Spatie\Activitylog\LogOptions;
|
use Spatie\Activitylog\LogOptions;
|
||||||
use Spatie\Activitylog\Traits\LogsActivity;
|
use Spatie\Activitylog\Traits\LogsActivity;
|
||||||
use Wildside\Userstamps\Userstamps;
|
use Mattiverse\Userstamps\Traits\Userstamps;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user