Add scheduled due reminders, readonly middleware, and landing help/changelog
This commit is contained in:
52
app/Console/Commands/SendAssetDueNotifications.php
Normal file
52
app/Console/Commands/SendAssetDueNotifications.php
Normal file
@@ -0,0 +1,52 @@
|
||||
<?php
|
||||
|
||||
namespace App\Console\Commands;
|
||||
|
||||
use App\Models\Asset;
|
||||
use App\Models\AssetAudit;
|
||||
use App\Models\AssetMaintenance;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Console\Command;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
|
||||
class SendAssetDueNotifications extends Command
|
||||
{
|
||||
protected $signature = 'asset:notify-due';
|
||||
|
||||
protected $description = 'Kirim notifikasi aset yang mendekati garansi habis, maintenance jatuh tempo, dan audit overdue.';
|
||||
|
||||
public function handle(): int
|
||||
{
|
||||
$today = Carbon::today();
|
||||
|
||||
$warrantyDays = (int) config('system.asset.warranty_reminder_days', 30);
|
||||
$warrantyDue = Asset::whereNotNull('warranty_end')
|
||||
->whereBetween('warranty_end', [$today, $today->clone()->addDays($warrantyDays)])
|
||||
->count();
|
||||
|
||||
$maintenanceDue = AssetMaintenance::whereIn('status', ['planned', 'in_progress'])
|
||||
->whereDate('performed_at', '<=', $today)
|
||||
->count();
|
||||
|
||||
$auditThresholdDays = 90;
|
||||
$auditOverdue = Asset::whereDoesntHave('audits', function ($q) use ($today, $auditThresholdDays) {
|
||||
$q->whereDate('audited_at', '>=', $today->clone()->subDays($auditThresholdDays));
|
||||
})->count();
|
||||
|
||||
$message = sprintf(
|
||||
'Reminder: warranty due %d, maintenance due %d, audit overdue %d',
|
||||
$warrantyDue,
|
||||
$maintenanceDue,
|
||||
$auditOverdue
|
||||
);
|
||||
|
||||
Log::channel('asset_activity')->info($message, [
|
||||
'warranty_due_in_days' => $warrantyDays,
|
||||
'audit_threshold_days' => $auditThresholdDays,
|
||||
]);
|
||||
|
||||
$this->info($message);
|
||||
|
||||
return self::SUCCESS;
|
||||
}
|
||||
}
|
||||
@@ -7,6 +7,7 @@ use Spatie\Permission\Middleware\PermissionMiddleware;
|
||||
use Spatie\Permission\Middleware\RoleMiddleware;
|
||||
use Spatie\Permission\Middleware\RoleOrPermissionMiddleware;
|
||||
use App\Http\Middleware\MaintenanceReadOnly;
|
||||
use Illuminate\Console\Scheduling\Schedule;
|
||||
|
||||
return Application::configure(basePath: dirname(__DIR__))
|
||||
->withRouting(
|
||||
@@ -22,6 +23,9 @@ return Application::configure(basePath: dirname(__DIR__))
|
||||
'maintenance.readonly' => MaintenanceReadOnly::class,
|
||||
]);
|
||||
})
|
||||
->withSchedule(function (Schedule $schedule) {
|
||||
$schedule->command('asset:notify-due')->daily();
|
||||
})
|
||||
->withExceptions(function (Exceptions $exceptions) {
|
||||
//
|
||||
})->create();
|
||||
|
||||
23
resources/views/pages/landing/changelog.blade.php
Normal file
23
resources/views/pages/landing/changelog.blade.php
Normal file
@@ -0,0 +1,23 @@
|
||||
@extends('layouts.landing-master')
|
||||
|
||||
@section('content')
|
||||
<section class="section" id="changelog">
|
||||
<div class="container">
|
||||
<div class="heading-section">
|
||||
<div class="heading-subtitle">Changelog</div>
|
||||
<div class="heading-title">Ringkasan perubahan</div>
|
||||
</div>
|
||||
<div class="card custom-card">
|
||||
<div class="card-body">
|
||||
<ul class="mb-0">
|
||||
<li class="mb-2">QR publik untuk setiap aset, galeri foto, dan aksi transaksi di dashboard.</li>
|
||||
<li class="mb-2">Fitur movement, disposal, reverse, maintenance, audit, serta laporan Excel/PDF multi-sheet.</li>
|
||||
<li class="mb-2">RBAC lengkap (super-admin, asset-manager, auditor, maintenance, viewer).</li>
|
||||
<li class="mb-2">Setting sistem: prefix kode aset, batas upload, audit log toggle, read-only mode.</li>
|
||||
<li>Landing diperbarui dengan CTA login/dashboard dan halaman bantuan.</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@endsection
|
||||
40
resources/views/pages/landing/help.blade.php
Normal file
40
resources/views/pages/landing/help.blade.php
Normal file
@@ -0,0 +1,40 @@
|
||||
@extends('layouts.landing-master')
|
||||
|
||||
@section('content')
|
||||
<section class="section" id="help">
|
||||
<div class="container">
|
||||
<div class="heading-section">
|
||||
<div class="heading-subtitle">Help & FAQ</div>
|
||||
<div class="heading-title">Panduan singkat penggunaan sistem</div>
|
||||
<div class="heading-description">Cara cepat menjalankan modul utama.</div>
|
||||
</div>
|
||||
<div class="row g-3">
|
||||
<div class="col-lg-6">
|
||||
<div class="card custom-card">
|
||||
<div class="card-body">
|
||||
<h6 class="fw-semibold">Registrasi & QR</h6>
|
||||
<p class="text-muted mb-2">Tambah aset dari dashboard, QR otomatis mengarah ke halaman publik untuk scan.</p>
|
||||
<h6 class="fw-semibold">Movement/Disposal/Maintenance</h6>
|
||||
<p class="text-muted mb-2">Gunakan tombol aksi di detail aset (login & izin diperlukan).</p>
|
||||
<h6 class="fw-semibold">Audit</h6>
|
||||
<p class="text-muted mb-0">Catat hasil audit matched/missing/damaged, lihat laporan di menu laporan audit.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-6">
|
||||
<div class="card custom-card">
|
||||
<div class="card-body">
|
||||
<h6 class="fw-semibold">FAQ Singkat</h6>
|
||||
<ul class="list-unstyled mb-0 text-muted">
|
||||
<li class="mb-2"><strong>Bagaimana mengganti batas upload?</strong> Ubah `asset.attachment_max_size_mb` di setting.</li>
|
||||
<li class="mb-2"><strong>Bagaimana mengaktifkan QR?</strong> Pastikan `asset.qr_enabled` = true di setting.</li>
|
||||
<li class="mb-2"><strong>Mode read-only?</strong> Set `maintenance.readonly_mode` = true agar semua write ditolak.</li>
|
||||
<li><strong>Laporan?</strong> Menu Laporan menyediakan export Excel/PDF multi-sheet.</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@endsection
|
||||
@@ -30,6 +30,8 @@ use App\Http\Controllers\Controller;
|
||||
Route::view('/', 'pages.landing.index')->name('landing');
|
||||
Route::view('/landing', 'pages.landing.index');
|
||||
Route::get('asset-view/{asset}', [PublicAssetController::class, 'show'])->name('assets.public.show');
|
||||
Route::view('help', 'pages.landing.help')->name('landing.help');
|
||||
Route::view('changelog', 'pages.landing.changelog')->name('landing.changelog');
|
||||
|
||||
Route::middleware(['auth','maintenance.readonly'])->prefix('dashboard')->group(function () {
|
||||
Route::get('index', [DashboardsController::class, 'index'])->name('index');
|
||||
|
||||
Reference in New Issue
Block a user