diff --git a/app/Http/Controllers/PrintStatementController.php b/app/Http/Controllers/PrintStatementController.php index 46ff571..ff88fc0 100644 --- a/app/Http/Controllers/PrintStatementController.php +++ b/app/Http/Controllers/PrintStatementController.php @@ -6,6 +6,7 @@ use App\Http\Controllers\Controller; use Carbon\Carbon; use Exception; use Illuminate\Http\Request; +use Illuminate\Validation\Rule; use Illuminate\Support\Facades\{Auth, DB, Log, Mail, Storage}; use Modules\Basicdata\Models\Branch; use Modules\Webstatement\{ @@ -91,7 +92,7 @@ use ZipArchive; $validated['processed_accounts'] = 0; $validated['success_count'] = 0; $validated['failed_count'] = 0; - $validated['stmt_sent_type'] = implode(',', $request->input('stmt_sent_type')); + $validated['stmt_sent_type'] = $request->input('stmt_sent_type') ? implode(',', $request->input('stmt_sent_type')) : ''; $validated['branch_code'] = $branch_code; // Awal tidak tersedia // Create the statement log @@ -478,6 +479,7 @@ use ZipArchive; // Retrieve data from the database $query = PrintStatementLog::query(); + $query->whereNotNull('user_id'); if (!auth()->user()->hasRole('administrator')) { $query->where(function($q) { @@ -800,7 +802,7 @@ use ZipArchive; $clientName = 'client1'; try { - \Log::info("Starting statement export for account: {$accountNumber}, period: {$period}, client: {$clientName}"); + Log::info("Starting statement export for account: {$accountNumber}, period: {$period}, client: {$clientName}"); // Validate inputs if (empty($accountNumber) || empty($period) || empty($clientName)) { @@ -810,7 +812,7 @@ use ZipArchive; // Dispatch the job $job = ExportStatementPeriodJob::dispatch($accountNumber, $period, $balance, $clientName); - \Log::info("Statement export job dispatched successfully", [ + Log::info("Statement export job dispatched successfully", [ 'job_id' => $job->job_id ?? null, 'account' => $accountNumber, 'period' => $period, @@ -829,7 +831,7 @@ use ZipArchive; ]); } catch (\Exception $e) { - \Log::error("Failed to export statement", [ + Log::error("Failed to export statement", [ 'error' => $e->getMessage(), 'account' => $accountNumber, 'period' => $period diff --git a/app/Http/Requests/PrintStatementRequest.php b/app/Http/Requests/PrintStatementRequest.php index afdfe4d..45a78c1 100644 --- a/app/Http/Requests/PrintStatementRequest.php +++ b/app/Http/Requests/PrintStatementRequest.php @@ -21,7 +21,22 @@ class PrintStatementRequest extends FormRequest public function rules(): array { $rules = [ - 'account_number' => ['required', 'string'], + // account_number required jika stmt_sent_type tidak diisi atau kosong + 'account_number' => [ + function ($attribute, $value, $fail) { + $stmtSentType = $this->input('stmt_sent_type'); + + // Jika stmt_sent_type kosong atau tidak ada, maka account_number wajib diisi + if (empty($stmtSentType) || (is_array($stmtSentType) && count(array_filter($stmtSentType)) === 0)) { + if (empty($value)) { + $fail('Account number is required when statement type is not specified.'); + } + } + }, + 'string' + ], + 'stmt_sent_type' => ['nullable', 'array'], + 'stmt_sent_type.*' => ['string', 'in:ALL,BY.EMAIL,BY.MAIL.TO.DOM.ADDR,BY.MAIL.TO.KTP.ADDR,NO.PRINT,PRINT'], 'is_period_range' => ['sometimes', 'boolean'], 'email' => ['nullable', 'email'], 'email_sent_at' => ['nullable', 'timestamp'], @@ -33,26 +48,33 @@ class PrintStatementRequest extends FormRequest 'regex:/^\d{6}$/', // YYYYMM format // Prevent duplicate requests with same account number and period function ($attribute, $value, $fail) { - $query = Statement::where('account_number', $this->input('account_number')) - ->where('authorization_status', '!=', 'rejected') - ->where('is_available', true) - ->where('period_from', $value); + // Hanya cek duplikasi jika account_number ada + if (!empty($this->input('account_number'))) { + $query = Statement::where('account_number', $this->input('account_number')) + ->where('authorization_status', '!=', 'rejected') + ->where(function($query) { + $query->where('is_available', true) + ->orWhere('is_generated', true); + }) + ->where('user_id', $this->user()->id) + ->where('period_from', $value); - // If this is an update request, exclude the current record - if ($this->route('statement')) { - $query->where('id', '!=', $this->route('statement')); - } + // If this is an update request, exclude the current record + if ($this->route('statement')) { + $query->where('id', '!=', $this->route('statement')); + } - // If period_to is provided, check for overlapping periods - if ($this->input('period_to')) { - $query->where(function ($q) use ($value) { - $q->where('period_from', '<=', $this->input('period_to')) - ->where('period_to', '>=', $value); - }); - } + // If period_to is provided, check for overlapping periods + if ($this->input('period_to')) { + $query->where(function ($q) use ($value) { + $q->where('period_from', '<=', $this->input('period_to')) + ->where('period_to', '>=', $value); + }); + } - if ($query->exists()) { - $fail('A statement request with this account number and period already exists.'); + if ($query->exists()) { + $fail('A statement request with this account number and period already exists.'); + } } } ], @@ -77,7 +99,8 @@ class PrintStatementRequest extends FormRequest public function messages(): array { return [ - 'account_number.required' => 'Account number is required', + 'account_number.required' => 'Account number is required when statement type is not specified', + 'stmt_sent_type.*.in' => 'Invalid statement type selected', 'period_from.required' => 'Period is required', 'period_from.regex' => 'Period must be in YYYYMM format', 'period_to.required' => 'End period is required for period range', diff --git a/resources/views/statements/index.blade.php b/resources/views/statements/index.blade.php index bcf6052..2862cb4 100644 --- a/resources/views/statements/index.blade.php +++ b/resources/views/statements/index.blade.php @@ -23,7 +23,8 @@ @if ($multiBranch)
- @error('branch_id') -
{{ $message }}
+
{{ $message }}
@enderror
@else @@ -47,9 +48,10 @@ @endif
- - @error('stmt_sent_type') -
{{ $message }}
+
{{ $message }}
@enderror
- - Account Number + + value="{{ old('account_number', $statement->account_number ?? '') }}"> @error('account_number') -
{{ $message }}
+
{{ $message }}
@enderror
- @error('email') -
{{ $message }}
+
{{ $message }}
@enderror
@@ -369,6 +373,22 @@ return fromPeriod + toPeriod; }, }, + authorization_status: { + title: 'Status', + render: (item, data) => { + let statusClass = 'badge badge-light-primary'; + + if (data.authorization_status === 'approved') { + statusClass = 'badge badge-light-success'; + } else if (data.authorization_status === 'rejected') { + statusClass = 'badge badge-light-danger'; + } else if (data.authorization_status === 'pending') { + statusClass = 'badge badge-light-warning'; + } + + return `${data.authorization_status}`; + }, + }, is_available: { title: 'Available', render: (item, data) => {