feat(webstatement): tambahkan fitur monitoring dan peningkatan pengiriman email statement

- **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>
This commit is contained in:
Daeng Deni Mardaeni
2025-06-11 09:56:43 +07:00
parent f3c649572b
commit 9199a4d748
15 changed files with 1972 additions and 644 deletions

View File

@@ -0,0 +1,54 @@
<?php
namespace Modules\Webstatement\Console;
use Illuminate\Console\Command;
use Modules\Webstatement\Models\PrintStatementLog;
class CheckEmailProgressCommand extends Command
{
protected $signature = 'webstatement:check-progress {log-id : ID log untuk dicek progressnya}';
protected $description = 'Cek progress pengiriman email statement';
public function handle()
{
$logId = $this->argument('log-id');
try {
$log = PrintStatementLog::findOrFail($logId);
$this->info("📊 Progress Pengiriman Email Statement");
$this->line("Log ID: {$log->id}");
$this->line("Batch ID: {$log->batch_id}");
$this->line("Request Type: {$log->request_type}");
$this->line("Status: {$log->status}");
if ($log->total_accounts) {
$this->line("Total Accounts: {$log->total_accounts}");
$this->line("Processed: {$log->processed_accounts}");
$this->line("Success: {$log->success_count}");
$this->line("Failed: {$log->failed_count}");
$this->line("Progress: {$log->getProgressPercentage()}%");
$this->line("Success Rate: {$log->getSuccessRate()}%");
}
if ($log->started_at) {
$this->line("Started: {$log->started_at}");
}
if ($log->completed_at) {
$this->line("Completed: {$log->completed_at}");
}
if ($log->error_message) {
$this->error("Error: {$log->error_message}");
}
} catch (\Exception $e) {
$this->error("Log dengan ID {$logId} tidak ditemukan.");
return Command::FAILURE;
}
return Command::SUCCESS;
}
}