- **Perbaikan dan Penambahan Komando:**
- Memberikan komando baru `webstatement:check-progress` untuk memantau progres pengiriman email statement.
- Menampilkan informasi seperti `Log ID`, `Batch ID`, `Request Type`, status, hingga persentase progress.
- Menangani secara detail jumlah akun yang diproses, sukses, gagal, dan kalkulasi tingkat keberhasilan.
- Menyediakan penanganan error jika log tidak ditemukan atau terjadi kegagalan lainnya.
- Memperluas komando `webstatement:send-email`:
- Mendukung pengiriman berdasarkan `single account`, `branch`, atau `all branches`.
- Menambahkan validasi parameter `type` (`single`, `branch`, `all`) dan input spesifik seperti `--account` atau `--branch` untuk mode tertentu.
- Melakukan pencatatan log awal dengan metadata lengkap seperti `request_type`, `batch_id`, dan status.
- **Peningkatan Logika Proses Backend:**
- Menambahkan fungsi `createLogEntry` untuk mencatat log pengiriman email statement secara dinamis berdasarkan tipe request.
- Menyediakan reusable method seperti `validateParameters` dan `determineRequestTypeAndTarget` untuk mempermudah pengelolaan parameter pengiriman.
- Memberikan feedback dan panduan kepada pengguna mengenai ID log dan komando monitoring (`webstatement:check-progress`).
- **Penambahan Controller dan Fitur UI:**
- Menambahkan controller baru `EmailStatementLogController`:
- Mendukung pengelolaan log seperti list, detail, dan retry untuk pengiriman ulang email statement.
- Menyediakan fitur pencarian, filter, dan halaman data log yang responsif menggunakan datatable.
- Menambahkan kemampuan resend email untuk log dengan status `completed` atau `failed`.
- Mengimplementasikan UI untuk log pengiriman:
- Halaman daftar monitoring dengan filter berdasarkan branch, account number, request type, status, dan tanggal.
- Menampilkan kemajuan, tingkat keberhasilan, serta tombol aksi seperti detail dan pengiriman ulang.
- **Peningkatan Model dan Validasi:**
- Menyesuaikan model `PrintStatementLog` untuk mendukung lebih banyak atribut seperti `processed_accounts`, `success_count`, `failed_count`, `request_type`, serta metode utilitas seperti `getProgressPercentage()` dan `getSuccessRate()`.
- Memvalidasi parameter input lebih mendalam agar kesalahan dapat diminimalisasi di awal proses.
- **Peningkatan pada View dan Feedback Pengguna:**
- Menambah daftar command berguna untuk user di interface log:
- Status antrian dengan `php artisan queue:work`.
- Monitoring menggunakan komando custom yang baru ditambahkan.
- **Perbaikan Logging dan Error Handling:**
- Menambahkan logging komprehensif pada semua proses, termasuk batch pengiriman ulang.
- Memastikan rollback pada database jika terjadi error melalui transaksi pada critical path.
Signed-off-by: Daeng Deni Mardaeni <ddeni05@gmail.com>
177 lines
8.7 KiB
PHP
177 lines
8.7 KiB
PHP
@extends('layouts.main')
|
|
|
|
@section('title', 'Detail Log Pengiriman Email Statement')
|
|
|
|
@section('breadcrumbs')
|
|
{{ Breadcrumbs::render(request()->route()->getName(), $log) }}
|
|
@endsection
|
|
|
|
@section('content')
|
|
<div class="container-fluid">
|
|
<div class="row">
|
|
<div class="col-md-8">
|
|
<div class="card">
|
|
<div class="card-header">
|
|
<h3 class="card-title">Detail Log Pengiriman Email Statement</h3>
|
|
<div class="card-toolbar">
|
|
<a href="{{ route('email-statement-logs.index') }}" class="btn btn-sm btn-light">
|
|
<i class="text-base ki-filled ki-black-left"></i>
|
|
Kembali
|
|
</a>
|
|
</div>
|
|
</div>
|
|
<div class="card-body">
|
|
<div class="row">
|
|
<div class="col-md-6">
|
|
<table class="table table-borderless">
|
|
<tr>
|
|
<td class="fw-bold">ID Log:</td>
|
|
<td>{{ $log->id }}</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="fw-bold">Branch:</td>
|
|
<td>{{ $log->branch->name ?? 'N/A' }} ({{ $log->branch_code }})</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="fw-bold">No. Rekening:</td>
|
|
<td>{{ $log->account_number }}</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="fw-bold">Periode:</td>
|
|
<td>{{ $log->period_display }}</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="fw-bold">Email Tujuan:</td>
|
|
<td>{{ $log->email }}</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="fw-bold">Status Email:</td>
|
|
<td>
|
|
@if ($log->email_sent_at)
|
|
<span class="badge badge-success">Terkirim</span>
|
|
@else
|
|
<span class="badge badge-warning">Pending</span>
|
|
@endif
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<table class="table table-borderless">
|
|
<tr>
|
|
<td class="fw-bold">Tanggal Kirim:</td>
|
|
<td>{{ $log->email_sent_at ? $log->email_sent_at->format('d/m/Y H:i:s') : '-' }}
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="fw-bold">Status Otorisasi:</td>
|
|
<td>
|
|
@php
|
|
$badgeClass = 'badge-secondary';
|
|
if ($log->authorization_status === 'approved') {
|
|
$badgeClass = 'badge-success';
|
|
} elseif ($log->authorization_status === 'rejected') {
|
|
$badgeClass = 'badge-danger';
|
|
} elseif ($log->authorization_status === 'pending') {
|
|
$badgeClass = 'badge-warning';
|
|
}
|
|
@endphp
|
|
<span
|
|
class="badge {{ $badgeClass }}">{{ ucfirst($log->authorization_status) }}</span>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="fw-bold">Statement Tersedia:</td>
|
|
<td>
|
|
@if ($log->is_available)
|
|
<span class="badge badge-success">Ya</span>
|
|
@else
|
|
<span class="badge badge-danger">Tidak</span>
|
|
@endif
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="fw-bold">User Pembuat:</td>
|
|
<td>{{ $log->user->name ?? 'N/A' }}</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="fw-bold">Tanggal Dibuat:</td>
|
|
<td>{{ $log->created_at->format('d/m/Y H:i:s') }}</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="fw-bold">Terakhir Update:</td>
|
|
<td>{{ $log->updated_at->format('d/m/Y H:i:s') }}</td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
|
|
@if ($log->remarks)
|
|
<div class="mt-4 row">
|
|
<div class="col-12">
|
|
<h5>Catatan:</h5>
|
|
<div class="alert alert-info">
|
|
{{ $log->remarks }}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
@endif
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col-md-4">
|
|
<div class="card">
|
|
<div class="card-header">
|
|
<h3 class="card-title">Aksi</h3>
|
|
</div>
|
|
<div class="card-body">
|
|
@if ($log->is_available && $log->authorization_status === 'approved')
|
|
<button onclick="resendEmail({{ $log->id }})" class="mb-3 btn btn-primary w-100">
|
|
<i class="text-base ki-filled ki-message-text-2"></i>
|
|
Kirim Ulang Email
|
|
</button>
|
|
@endif
|
|
|
|
@if ($log->is_available)
|
|
<a href="{{ route('statements.download', $log->id) }}" class="mb-3 btn btn-success w-100">
|
|
<i class="text-base ki-filled ki-file-down"></i>
|
|
Download Statement
|
|
</a>
|
|
@endif
|
|
|
|
<a href="{{ route('statements.show', $log->id) }}" class="btn btn-info w-100">
|
|
<i class="text-base ki-filled ki-eye"></i>
|
|
Lihat Statement Log
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
@endsection
|
|
|
|
@push('scripts')
|
|
<script>
|
|
// Function untuk resend email
|
|
function resendEmail(logId) {
|
|
if (confirm('Apakah Anda yakin ingin mengirim ulang email statement ini?')) {
|
|
$.ajax({
|
|
url: '{{ route('email-statement-logs.resend-email', ':id') }}'.replace(':id', logId),
|
|
type: 'POST',
|
|
data: {
|
|
_token: '{{ csrf_token() }}'
|
|
},
|
|
success: function(response) {
|
|
alert('Email statement berhasil dijadwalkan untuk dikirim ulang.');
|
|
location.reload();
|
|
},
|
|
error: function(xhr) {
|
|
alert('Gagal mengirim ulang email statement.');
|
|
}
|
|
});
|
|
}
|
|
}
|
|
</script>
|
|
@endpush
|