feat(webstatement): tambahkan fitur retry dengan handling timeout pada laporan transaksi ATM

- Memperbarui logika retry pada `AtmTransactionReportController`:
  - Memperbolehkan retry jika status laporan adalah `failed`, `pending`, atau laporan dengan status `processing` yang telah melebihi batas waktu (1 jam).
  - Menambahkan atribut baru seperti `processing_hours` dan `is_processing_timeout` pada data untuk menampilkan informasi durasi proses dan flag timeout.
  - Mengubah status laporan menjadi `failed` jika melebihi batas waktu sebelum dilakukan retry.
  - Memperbarui error message untuk mencatat alasan timeout.

- Menambahkan metode baru `canRetry` pada controller:
  - Mengembalikan boolean jika laporan dapat di-retry berdasarkan status dan kondisi laporan.

- Memperbarui tampilan untuk bagian daftar laporan (`atm-reports/index.blade.php`):
  - Menambahkan tombol retry dengan warna yang disesuaikan (kuning/oranye untuk `failed`/`pending`, merah untuk timeout).
  - Memperbarui tampilan status laporan menjadi lebih informatif, termasuk keterangan durasi proses jika timeout.

- Memperbarui tampilan detail laporan (`atm-reports/show.blade.php`):
  - Menambahkan tombol retry dengan label tambahan "Retry (Timeout)" jika melebihi batas waktu proses.
  - Menampilkan informasi tambahan seperti waktu proses jika laporan dalam status `processing`.

- Menyediakan fungsi JavaScript baru `retryReport` untuk handling retry via AJAX:
  - Menyertakan konfirmasi sebelum retry.
  - Memperbarui tombol retry agar lebih reaktif terhadap perubahan status laporan.

Signed-off-by: Daeng Deni Mardaeni <ddeni05@gmail.com>
This commit is contained in:
Daeng Deni Mardaeni
2025-06-10 11:17:17 +07:00
parent 8a7d4f351c
commit 55313fb0b0
3 changed files with 119 additions and 35 deletions

View File

@@ -15,11 +15,22 @@
</a>
@endif
@if (in_array($atmReport->status, ['failed', 'pending']) || ($atmReport->status === 'completed' && !$atmReport->file_path))
@php
$canRetry = in_array($atmReport->status, ['failed', 'pending']) ||
($atmReport->status === 'processing' && $atmReport->updated_at->diffInHours(now()) >= 1) ||
($atmReport->status === 'completed' && !$atmReport->file_path);
@endphp
@if ($canRetry)
<form action="{{ route('atm-reports.retry', $atmReport->id) }}" method="POST" class="d-inline" onsubmit="return confirm('Are you sure you want to retry generating this report?')">
@csrf
<button type="submit" class="btn btn-sm btn-warning me-2">
<i class="ki-duotone ki-arrows-circle fs-2"></i>Retry Job
<i class="ki-duotone ki-arrows-circle fs-2"></i>
@if($atmReport->status === 'processing' && $atmReport->updated_at->diffInHours(now()) >= 1)
Retry (Timeout)
@else
Retry Job
@endif
</button>
</form>
@endif
@@ -72,7 +83,20 @@
@if ($atmReport->status === 'pending')
<span class="badge badge-info">Pending</span>
@elseif($atmReport->status === 'processing')
<span class="badge badge-warning">Processing</span>
@php
$processingHours = $atmReport->updated_at->diffInHours(now());
@endphp
<span class="badge {{ $processingHours >= 1 ? 'badge-danger' : 'badge-warning' }}">
Processing
@if($processingHours >= 1)
({{ $processingHours }}h - Timeout)
@endif
</span>
@if($processingHours >= 1)
<div class="mt-1 text-danger small">
Processing for more than 1 hour. You can retry this job.
</div>
@endif
@elseif($atmReport->status === 'completed')
<span class="badge badge-success">Completed</span>
@elseif($atmReport->status === 'failed')