Files
webstatement/resources/views/statements/show.blade.php
daengdeni 8fb16028d9 feat(webstatement): tambah validasi cabang rekening dan update logika penyimpanan statement
### Perubahan Utama
- Tambah validasi untuk memverifikasi bahwa nomor rekening sesuai dengan cabang pengguna.
- Cegah transaksi untuk rekening yang terdaftar di cabang khusus (`ID0019999`).
- Perbaikan sistem untuk menangani kasus rekening yang tidak ditemukan di database.

### Detail Perubahan
1. **Validasi Cabang Rekening**:
   - Tambah pengecekan untuk memastikan rekening yang dimasukkan adalah milik cabang pengguna (non-multi-branch).
   - Blokir transaksi jika rekening terdaftar pada cabang khusus (`ID0019999`) dengan menampilkan pesan error yang relevan.
   - Tambahkan pesan error jika nomor rekening tidak ditemukan dalam sistem.

2. **Update Logika Penyimpanan**:
   - Tambahkan validasi untuk mengisi kolom `branch_code` secara otomatis berdasarkan informasi rekening terkait.
   - Otomatis atur nilai awal `authorization_status` menjadi `approved`.

3. **Penghapusan Atribut Tidak Digunakan**:
   - Hapus form `branch_code` dari view terkait (`index.blade.php`) karena sekarang diisi secara otomatis berdasarkan data rekening.

4. **Perbaikan View dan Logika Terkait Status Otorisasi**:
   - Hapus logic dan elemen UI terkait `authorization_status` di halaman statement (`index.blade.php` dan `show.blade.php`).
   - Simplifikasi tampilan untuk hanya menampilkan informasi yang tersedia dan relevan.

5. **Optimasi Query Data Cabang**:
   - Update query untuk memfilter cabang berdasarkan kondisi `customer_company` dan mengecualikan kode cabang khusus.

6. **Penyesuaian Struktur Request**:
   - Hapus validasi terkait `branch_code` di `PrintStatementRequest` karena tidak lagi relevan.

7. **Log Aktivitas dan Kesalahan**:
   - Tambahkan log untuk mencatat aktivitas seperti validasi rekening dan penyimpanan batch data.
   - Penanganan lebih baik untuk logging jika terjadi error saat validasi nomor rekening atau penyimpanan statement.

### Manfaat Perubahan
- Meningkatkan akurasi data cabang dan validasi rekening sebelum penyimpanan.
- Menyederhanakan antarmuka pengguna dengan menghapus field input redundant.
- Memastikan proses menjadi lebih transparan dengan penanganan error yang lebih baik.

Langkah ini diterapkan untuk meningkatkan keamanan dan keandalan sistem dalam memverifikasi dan memproses pemintaan statement.
2025-06-20 13:59:58 +07:00

207 lines
10 KiB
PHP

@extends('layouts.main')
@section('content')
<div class="card">
<div class="card-header">
<h3 class="card-title">Statement Request Details</h3>
<div class="card-toolbar">
<a href="{{ route('statements.index') }}" class="btn btn-sm btn-info me-2">
<i class="ki-duotone ki-arrow-left fs-2"></i>Back to List
</a>
@if($statement->is_available && $statement->authorization_status === 'approved')
<a href="{{ route('statements.download', $statement->id) }}" class="btn btn-sm btn-primary">
<i class="ki-duotone ki-document fs-2"></i>Download Statement
</a>
@endif
</div>
</div>
<div class="card-body">
@if(session('success'))
<div class="alert alert-success">
{{ session('success') }}
</div>
@endif
@if(session('error'))
<div class="alert alert-danger">
{{ session('error') }}
</div>
@endif
<div class="grid grid-cols-2 gap-5 g-5">
<!-- Left Column - Statement Information -->
<div class="card card-flush h-xl-100 shadow-sm">
<div class="card-header">
<div class="card-title">
<h2>Statement Information</h2>
</div>
</div>
<div class="card-body py-5">
<div class="d-flex flex-column gap-5">
<div class="d-flex flex-column">
<div class="text-gray-500 fw-semibold">Branch</div>
<div class="fw-bold fs-5">{{ $statement->branch->name ?? 'N/A' }} ({{ $statement->branch_code }})</div>
</div>
<div class="d-flex flex-column">
<div class="text-gray-500 fw-semibold">Account Number</div>
<div class="fw-bold fs-5">{{ $statement->account_number }}</div>
</div>
<div class="d-flex flex-column">
<div class="text-gray-500 fw-semibold">Period</div>
<div class="fw-bold fs-5">
@php
// Convert format YYYYMM to Month Year
$fromYear = substr($statement->period_from, 0, 4);
$fromMonth = substr($statement->period_from, 4, 2);
$fromMonthName = date('F', mktime(0, 0, 0, $fromMonth, 1));
$periodText = $fromMonthName . ' ' . $fromYear;
if($statement->is_period_range && $statement->period_to) {
$toYear = substr($statement->period_to, 0, 4);
$toMonth = substr($statement->period_to, 4, 2);
$toMonthName = date('F', mktime(0, 0, 0, $toMonth, 1));
$periodText .= ' - ' . $toMonthName . ' ' . $toYear;
}
@endphp
{{ $periodText }}
</div>
</div>
<div class="d-flex flex-column">
<div class="text-gray-500 fw-semibold">Availability</div>
<div>
@if($statement->is_available)
<span class="badge badge-success">Available</span>
@else
<span class="badge badge-danger">Not Available</span>
@endif
</div>
</div>
<div class="d-flex flex-column">
<div class="text-gray-500 fw-semibold">Downloaded</div>
<div>
@if($statement->is_downloaded)
<span class="badge badge-success">Yes</span>
<div class="text-muted mt-1">
Downloaded at: {{ $statement->downloaded_at ? $statement->downloaded_at->format('d M Y H:i:s') : 'N/A' }}
</div>
@else
<span class="badge badge-light-primary">No</span>
@endif
</div>
</div>
</div>
</div>
</div>
<!-- Right Column - Request Information -->
<div class="card card-flush h-xl-100 shadow-sm">
<div class="card-header">
<div class="card-title">
<h2>Request Information</h2>
</div>
</div>
<div class="card-body py-5">
<div class="d-flex flex-column gap-5">
<div class="d-flex flex-column">
<div class="text-gray-500 fw-semibold">Requested By</div>
<div class="fw-bold fs-5">{{ $statement->user->name ?? 'N/A' }}</div>
</div>
<div class="d-flex flex-column">
<div class="text-gray-500 fw-semibold">Requested At</div>
<div class="fw-bold fs-5">{{ dateFormat($statement->created_at,1,1) }}</div>
</div>
<div class="d-flex flex-column">
<div class="text-gray-500 fw-semibold">IP Address</div>
<div class="fw-bold fs-5">{{ $statement->ip_address }}</div>
</div>
<div class="d-flex flex-column">
<div class="text-gray-500 fw-semibold">User Agent</div>
<div class="text-muted small">{{ $statement->user_agent }}</div>
</div>
@if($statement->authorization_status !== 'pending')
<div class="d-flex flex-column">
<div class="text-gray-500 fw-semibold">Authorized By</div>
<div class="fw-bold fs-5">{{ $statement->authorizer->name ?? 'N/A' }}</div>
</div>
<div class="d-flex flex-column">
<div class="text-gray-500 fw-semibold">Authorized At</div>
<div class="fw-bold fs-5">{{ $statement->authorized_at ? $statement->authorized_at->format('d M Y H:i:s') : 'N/A' }}</div>
</div>
@if($statement->remarks)
<div class="d-flex flex-column">
<div class="text-gray-500 fw-semibold">Remarks</div>
<div class="fw-bold fs-5">{{ $statement->remarks }}</div>
</div>
@endif
@endif
</div>
</div>
</div>
</div>
@if($statement->authorization_status === 'pending' && auth()->user()->can('authorize_statements'))
<div class="card shadow-sm mt-7">
<div class="card-header">
<h3 class="card-title">Authorization</h3>
</div>
<div class="card-body">
<form action="{{ route('webstatement.statements.authorize', $statement->id) }}" method="POST">
@csrf
<div class="mb-5">
<label class="form-label required">Authorization Decision</label>
<div class="d-flex">
<div class="form-check form-check-custom form-check-solid me-5">
<input class="form-check-input" type="radio" name="authorization_status" value="approved" id="status_approved" required/>
<label class="form-check-label" for="status_approved">
Approve
</label>
</div>
<div class="form-check form-check-custom form-check-solid">
<input class="form-check-input" type="radio" name="authorization_status" value="rejected" id="status_rejected" required/>
<label class="form-check-label" for="status_rejected">
Reject
</label>
</div>
</div>
</div>
<div class="mb-5">
<label class="form-label">Remarks</label>
<textarea class="form-control" name="remarks" rows="3" placeholder="Enter any remarks or reasons for your decision"></textarea>
</div>
<div class="text-end">
<button type="submit" class="btn btn-primary">Submit Authorization</button>
</div>
</form>
</div>
</div>
@endif
</div>
</div>
@endsection
@push('scripts')
<script>
// Any additional JavaScript for this page
document.addEventListener('DOMContentLoaded', function () {
// Initialize any components if needed
});
</script>
@endpush