diff --git a/AISTANDAR.md b/AISTANDAR.md index 8534275..7a8e76f 100644 --- a/AISTANDAR.md +++ b/AISTANDAR.md @@ -341,6 +341,7 @@ class Lahan extends Model - Pakai `$fillable`, bukan `$guarded = []`. - Pilihan tetap (jawaban survei, status) disimpan sebagai **PHP Enum** di `app/Enums/` dan di-cast di model. Jangan menulis daftar pilihan langsung di Blade. +- **Jejak aktivitas:** setiap model memakai trait `App\Models\Concerns\CatatAktivitas` (spatie/laravel-activitylog). Tambah/ubah/hapus otomatis tercatat di `activity_log` dan tampil di menu Konfigurasi > Log Aktivitas. Kolom audit, `$hidden`, file/foto, dan polygon (`path`) tidak dicatat. Jika domain model baru belum ada, tambahkan labelnya di `LogAktivitasController::JENIS`. Aksi bisnis yang bukan sekadar simpan model (verifikasi, ganti status) dicatat manual dengan `activity('nama_log')->performedOn($model)->log('...')`. Perubahan lewat query massal (`->update()` pada query builder) **tidak** tercatat. ### 5.2 Migration @@ -701,7 +702,7 @@ Status: `Belum` / `Proses` / `Selesai` / `Dikecualikan` - [ ] Pola ditentukan (A/B/C) sesuai 3.3 - [ ] Migration: `id`, kolom audit, `timestamps`, `softDeletes`, `deleted_by`; tanpa unique index -- [ ] Model: `$table` eksplisit, `$fillable`, `SoftDeletes`, `deleted_by` terisi, casts/Enum +- [ ] Model: `$table` eksplisit, `$fillable`, `SoftDeletes`, `deleted_by` terisi, casts/Enum, trait `CatatAktivitas` - [ ] Relasi anak ditambahkan ke cascade `deleting` di model induk - [ ] Form Request `Store`/`Update` dengan pesan Bahasa Indonesia dan unique `withoutTrashed()` - [ ] Controller di `Web/{Domain}/` dengan nama method resmi saja diff --git a/app/Http/Controllers/Web/Konfigurasi/LogAktivitasController.php b/app/Http/Controllers/Web/Konfigurasi/LogAktivitasController.php new file mode 100644 index 0000000..fb1c90c --- /dev/null +++ b/app/Http/Controllers/Web/Konfigurasi/LogAktivitasController.php @@ -0,0 +1,76 @@ + ['label' => 'Login', 'warna' => 'info'], + 'petani' => ['label' => 'Profil Petani', 'warna' => 'primary'], + 'verifikasi' => ['label' => 'Status Petani', 'warna' => 'success'], + 'pertanian' => ['label' => 'Data Pertanian', 'warna' => 'primary'], + 'map' => ['label' => 'Peta & Panen', 'warna' => 'primary'], + 'user' => ['label' => 'Pengguna', 'warna' => 'warning'], + 'profile' => ['label' => 'Profil Pengguna', 'warna' => 'warning'], + 'konfigurasi' => ['label' => 'Konfigurasi', 'warna' => 'warning'], + 'program' => ['label' => 'Program', 'warna' => 'danger'], + 'core' => ['label' => 'Program (Inti)', 'warna' => 'danger'], + 'bumdes' => ['label' => 'BUMDes', 'warna' => 'dark'], + 'koperasi' => ['label' => 'Koperasi', 'warna' => 'dark'], + 'ekosistem' => ['label' => 'Ekosistem', 'warna' => 'dark'], + 'master' => ['label' => 'Master Data', 'warna' => 'secondary'], + 'wilayah' => ['label' => 'Wilayah', 'warna' => 'secondary'], + 'penduduk' => ['label' => 'Penduduk', 'warna' => 'secondary'], + 'distribusi' => ['label' => 'Distribusi', 'warna' => 'secondary'], + 'facilitator' => ['label' => 'Fasilitator', 'warna' => 'secondary'], + ]; + + public const PER_PAGE = [25, 50, 100]; + + public function index(FilterLogAktivitasRequest $request) + { + $filter = $request->validated(); + + // Ambil log sesuai filter + $aktivitas = Activity::query() + ->with(['causer', 'subject']) + ->when($filter['jenis'] ?? null, fn ($q, $jenis) => $q->where('log_name', $jenis)) + ->when($filter['dari'] ?? null, fn ($q, $tgl) => $q->where('created_at', '>=', $tgl)) + ->when($filter['sampai'] ?? null, fn ($q, $tgl) => $q->where('created_at', '<', Carbon::parse($tgl)->addDay())) + ->when($filter['search'] ?? null, fn ($q, $cari) => $this->cari($q, '%' . mb_strtolower($cari) . '%')) + ->latest('id') + ->paginate((int) ($filter['per_page'] ?? self::PER_PAGE[0])) + ->withQueryString(); + + // Nama petani untuk log tab petani (satu query) + $namaPetani = Petani::withoutGlobalScopes()->withTrashed() + ->whereIn('id', $aktivitas->getCollection()->pluck('properties.petani_id')->filter()->unique()) + ->pluck('nama', 'id'); + + return view('konfigurasi.log-aktivitas.index', [ + 'aktivitas' => $aktivitas, + 'jenis' => self::JENIS, + 'perPage' => self::PER_PAGE, + 'namaPetani' => $namaPetani, + ]); + } + + // Cari di aktivitas, nama pengguna, dan nama petani + private function cari($query, string $cari): void + { + $query->where(fn ($q) => $q + ->whereRaw('lower(description) like ?', [$cari]) + ->orWhereHasMorph('causer', [User::class], fn ($q) => $q->whereRaw('lower(name) like ?', [$cari])) + ->orWhereRaw( + "coalesce((properties->>'petani_id')::bigint, case when subject_type = ? then subject_id end) in (select id from petani where lower(nama) like ?)", + [Petani::class, $cari] + )); + } +} diff --git a/app/Http/Controllers/Web/Produktivitas/PetaniStatusController.php b/app/Http/Controllers/Web/Produktivitas/PetaniStatusController.php index bb6ca62..c8fcf0b 100644 --- a/app/Http/Controllers/Web/Produktivitas/PetaniStatusController.php +++ b/app/Http/Controllers/Web/Produktivitas/PetaniStatusController.php @@ -47,10 +47,15 @@ class PetaniStatusController extends Controller return back()->with('status_petani_error', 'Data petani masih berstatus draf.'); } + $dari = $petani->status; $petani->status = $tujuan; $petani->updated_by = $request->user()->id; $petani->save(); + $petani->catatPerubahanStatus($dari, $tujuan === StatusDataPetani::LENGKAP + ? 'Ditandai lengkap oleh enumerator' + : 'Tanda lengkap dibatalkan oleh enumerator'); + return back()->with('status_petani_success', $tujuan === StatusDataPetani::LENGKAP ? 'Data petani berhasil ditandai lengkap.' : 'Tanda lengkap berhasil dibatalkan. Status kembali ke draf.'); diff --git a/app/Http/Controllers/Web/Verifikasi/VerifikasiPetaniController.php b/app/Http/Controllers/Web/Verifikasi/VerifikasiPetaniController.php index 5702082..aed61c0 100644 --- a/app/Http/Controllers/Web/Verifikasi/VerifikasiPetaniController.php +++ b/app/Http/Controllers/Web/Verifikasi/VerifikasiPetaniController.php @@ -96,6 +96,8 @@ class VerifikasiPetaniController extends Controller $petani->updated_by = auth()->id(); $petani->save(); + $petani->catatPerubahanStatus(StatusDataPetani::LENGKAP, 'Diverifikasi'); + return $kembali->with('verifikasi_success', "Data petani {$petani->nama} berhasil diverifikasi."); } @@ -120,11 +122,14 @@ class VerifikasiPetaniController extends Controller return $kembali->with('verifikasi_error', "Data petani {$petani->nama} sudah berstatus Draf."); } + $dari = $petani->status; $petani->status = StatusDataPetani::DRAFT; $petani->catatan = trim($data['catatan']); $petani->updated_by = auth()->id(); $petani->save(); + $petani->catatPerubahanStatus($dari, 'Dikembalikan ke draf oleh verifikator', ['catatan' => $petani->catatan]); + return $kembali->with('verifikasi_success', "Data petani {$petani->nama} dikembalikan ke Draf dengan catatan untuk enumerator."); } } diff --git a/app/Http/Requests/Konfigurasi/FilterLogAktivitasRequest.php b/app/Http/Requests/Konfigurasi/FilterLogAktivitasRequest.php new file mode 100644 index 0000000..60f20e0 --- /dev/null +++ b/app/Http/Requests/Konfigurasi/FilterLogAktivitasRequest.php @@ -0,0 +1,45 @@ + ['nullable', Rule::in(array_keys(LogAktivitasController::JENIS))], + 'search' => ['nullable', 'string', 'max:100'], + 'dari' => ['nullable', 'date'], + 'sampai' => ['nullable', 'date', 'after_or_equal:dari'], + 'per_page' => ['nullable', 'integer', Rule::in(LogAktivitasController::PER_PAGE)], + ]; + } + + public function messages(): array + { + return [ + 'sampai.after_or_equal' => 'Tanggal akhir tidak boleh sebelum tanggal awal.', + 'per_page.in' => 'Jumlah data per halaman tidak valid.', + ]; + } + + public function attributes(): array + { + return [ + 'jenis' => 'jenis aktivitas', + 'search' => 'kata kunci', + 'dari' => 'tanggal awal', + 'sampai' => 'tanggal akhir', + ]; + } +} diff --git a/app/Listeners/CatatAktivitasAuth.php b/app/Listeners/CatatAktivitasAuth.php new file mode 100644 index 0000000..2769b7b --- /dev/null +++ b/app/Listeners/CatatAktivitasAuth.php @@ -0,0 +1,47 @@ +catat('login', $event->remember ? 'Login (ingat saya)' : 'Login', $event->user, $event->guard); + } + + // Log logout + public function handleLogout(Logout $event): void + { + if ($event->user) { + $this->catat('logout', 'Logout', $event->user, $event->guard); + } + } + + // Log login gagal (tanpa password) + public function handleFailed(Failed $event): void + { + $identitas = collect($event->credentials)->except('password')->first(); + + $this->catat('login_gagal', 'Login gagal', $event->user, $event->guard, ['identitas' => $identitas]); + } + + private function catat(string $event, string $keterangan, ?Authenticatable $user, ?string $guard, array $tambahan = []): void + { + activity('auth') + ->causedBy($user) + ->event($event) + ->withProperties([ + 'ip' => request()->ip(), + 'user_agent' => str(request()->userAgent())->limit(250)->toString(), + 'guard' => $guard, + ...$tambahan, + ]) + ->log($keterangan); + } +} diff --git a/app/Models/Bumdes/KelembagaanAktorBumdes.php b/app/Models/Bumdes/KelembagaanAktorBumdes.php index 6c91f8d..d876f05 100644 --- a/app/Models/Bumdes/KelembagaanAktorBumdes.php +++ b/app/Models/Bumdes/KelembagaanAktorBumdes.php @@ -2,6 +2,7 @@ namespace App\Models\Bumdes; +use App\Models\Concerns\CatatAktivitas; use App\Models\User; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -9,7 +10,7 @@ use Illuminate\Database\Eloquent\SoftDeletes; class KelembagaanAktorBumdes extends Model { - use SoftDeletes; + use SoftDeletes, CatatAktivitas; protected $table = 'bumdes_kelembagaan_aktor'; diff --git a/app/Models/Bumdes/PengurusBumdes.php b/app/Models/Bumdes/PengurusBumdes.php index cf8c9c8..890b6de 100644 --- a/app/Models/Bumdes/PengurusBumdes.php +++ b/app/Models/Bumdes/PengurusBumdes.php @@ -2,6 +2,7 @@ namespace App\Models\Bumdes; +use App\Models\Concerns\CatatAktivitas; use App\Enums\Bumdes\JabatanBumdes; use App\Enums\Pendidikan; use App\Models\User; @@ -14,7 +15,7 @@ use Illuminate\Database\Eloquent\SoftDeletes; class PengurusBumdes extends Model { - use SoftDeletes; + use SoftDeletes, CatatAktivitas; protected $table = 'bumdes_pengurus'; diff --git a/app/Models/Concerns/CatatAktivitas.php b/app/Models/Concerns/CatatAktivitas.php new file mode 100644 index 0000000..f046950 --- /dev/null +++ b/app/Models/Concerns/CatatAktivitas.php @@ -0,0 +1,50 @@ + 'ditambahkan', + 'updated' => 'diubah', + 'deleted' => 'dihapus', + 'restored' => 'dipulihkan', + ]; + + // Aturan log: kolom fillable yang berubah saja + public function getActivitylogOptions(): LogOptions + { + $label = property_exists($this, 'labelAktivitas') ? $this->labelAktivitas : Str::headline(class_basename($this)); + $logName = property_exists($this, 'logAktivitas') ? $this->logAktivitas : Str::snake(explode('\\', static::class)[2]); + + return LogOptions::defaults() + ->useLogName($logName) + ->logFillable() + ->logExcept([...self::$kolomTidakDicatat, ...$this->getHidden()]) + ->dontLogIfAttributesChangedOnly(self::$kolomTidakDicatat) + ->logOnlyDirty() + ->dontLogEmptyChanges() + ->setDescriptionForEvent(fn (string $event) => $label . ' ' . (self::$kataEvent[$event] ?? $event)); + } + + // Tandai petani terkait + public function beforeActivityLogged(Model $activity, string $event): void + { + if ($petaniId = $this->getAttribute('petani_id')) { + $activity->properties = $activity->properties->put('petani_id', (int) $petaniId); + } + } +} diff --git a/app/Models/Concerns/KembalikanStatusPetaniKeDraf.php b/app/Models/Concerns/KembalikanStatusPetaniKeDraf.php index 64cea27..b3bd878 100644 --- a/app/Models/Concerns/KembalikanStatusPetaniKeDraf.php +++ b/app/Models/Concerns/KembalikanStatusPetaniKeDraf.php @@ -54,7 +54,15 @@ trait KembalikanStatusPetaniKeDraf ->where('status', StatusDataPetani::LENGKAP->value) ->update(['status' => StatusDataPetani::DRAFT->value]); - if ($diubah && request()->hasSession()) { + if (! $diubah) { + return true; + } + + // Log status (tanpa query ulang petani) + (new Petani)->forceFill(['id' => $petaniId, 'status' => StatusDataPetani::DRAFT]) + ->catatPerubahanStatus(StatusDataPetani::LENGKAP, 'Otomatis kembali ke draf karena data diubah', ['sumber' => class_basename($this)]); + + if (request()->hasSession()) { request()->session()->flash('status_petani_info', 'Data petani diubah, status kembali ke Draf. Tandai lengkap lagi setelah selesai.'); } diff --git a/app/Models/Core/KomoditasProgram.php b/app/Models/Core/KomoditasProgram.php index 62b9596..3ad337f 100644 --- a/app/Models/Core/KomoditasProgram.php +++ b/app/Models/Core/KomoditasProgram.php @@ -2,6 +2,7 @@ namespace App\Models\Core; +use App\Models\Concerns\CatatAktivitas; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -10,7 +11,7 @@ use App\Models\Pertanian\Komoditas; class KomoditasProgram extends Model { - use SoftDeletes; + use SoftDeletes, CatatAktivitas; protected $table = 'core_program_komoditas'; diff --git a/app/Models/Core/LokasiProgram.php b/app/Models/Core/LokasiProgram.php index 99fb321..c2a4081 100644 --- a/app/Models/Core/LokasiProgram.php +++ b/app/Models/Core/LokasiProgram.php @@ -2,6 +2,7 @@ namespace App\Models\Core; +use App\Models\Concerns\CatatAktivitas; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -13,7 +14,7 @@ use App\Models\Wilayah\DesaKelurahan; class LokasiProgram extends Model { - use SoftDeletes; + use SoftDeletes, CatatAktivitas; protected $table = 'core_program_lokasi'; diff --git a/app/Models/Core/Program.php b/app/Models/Core/Program.php index 30f7c1a..47befdf 100644 --- a/app/Models/Core/Program.php +++ b/app/Models/Core/Program.php @@ -2,6 +2,7 @@ namespace App\Models\Core; +use App\Models\Concerns\CatatAktivitas; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\Relations\HasMany; @@ -11,7 +12,7 @@ use App\Models\Core\LokasiProgram; class Program extends Model { - use SoftDeletes; + use SoftDeletes, CatatAktivitas; protected $table = 'core_program'; diff --git a/app/Models/Distribusi/Distribution.php b/app/Models/Distribusi/Distribution.php index 3f609ab..e2cb8fe 100644 --- a/app/Models/Distribusi/Distribution.php +++ b/app/Models/Distribusi/Distribution.php @@ -2,13 +2,14 @@ namespace App\Models\Distribusi; +use App\Models\Concerns\CatatAktivitas; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\Factories\HasFactory; class Distribution extends Model { - use HasFactory, SoftDeletes; + use HasFactory, SoftDeletes, CatatAktivitas; protected $table = 'distribusi'; diff --git a/app/Models/Ekosistem/FormBasisData.php b/app/Models/Ekosistem/FormBasisData.php index 6ce1b7e..189ba92 100644 --- a/app/Models/Ekosistem/FormBasisData.php +++ b/app/Models/Ekosistem/FormBasisData.php @@ -2,6 +2,7 @@ namespace App\Models\Ekosistem; +use App\Models\Concerns\CatatAktivitas; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -15,7 +16,7 @@ use App\Enums\LayoutForm; class FormBasisData extends Model { - use SoftDeletes; + use SoftDeletes, CatatAktivitas; protected $table = 'ekosistem_basis_data_form'; diff --git a/app/Models/Ekosistem/GroupBasisData.php b/app/Models/Ekosistem/GroupBasisData.php index 1482077..2786dfb 100644 --- a/app/Models/Ekosistem/GroupBasisData.php +++ b/app/Models/Ekosistem/GroupBasisData.php @@ -2,6 +2,7 @@ namespace App\Models\Ekosistem; +use App\Models\Concerns\CatatAktivitas; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\Relations\HasMany; @@ -10,7 +11,7 @@ use App\Models\Ekosistem\TabelBasisData; class GroupBasisData extends Model { - use SoftDeletes; + use SoftDeletes, CatatAktivitas; protected $table = 'ekosistem_basis_data_group'; diff --git a/app/Models/Ekosistem/KolomBasisData.php b/app/Models/Ekosistem/KolomBasisData.php index 01f648f..18c4a68 100644 --- a/app/Models/Ekosistem/KolomBasisData.php +++ b/app/Models/Ekosistem/KolomBasisData.php @@ -2,6 +2,7 @@ namespace App\Models\Ekosistem; +use App\Models\Concerns\CatatAktivitas; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -11,7 +12,7 @@ use App\Models\Ekosistem\TabelBasisData; class KolomBasisData extends Model { - use SoftDeletes; + use SoftDeletes, CatatAktivitas; protected $table = 'ekosistem_basis_data_kolom'; diff --git a/app/Models/Ekosistem/LahanCPCL.php b/app/Models/Ekosistem/LahanCPCL.php index f1d614f..4e71414 100644 --- a/app/Models/Ekosistem/LahanCPCL.php +++ b/app/Models/Ekosistem/LahanCPCL.php @@ -2,6 +2,7 @@ namespace App\Models\Ekosistem; +use App\Models\Concerns\CatatAktivitas; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\Factories\HasFactory; @@ -11,7 +12,7 @@ use Enums\StatusLahan; class LahanCPCL extends Model { - use HasFactory, SoftDeletes; + use HasFactory, SoftDeletes, CatatAktivitas; protected $table = 'ekosistem_lahan_cpcl'; diff --git a/app/Models/Ekosistem/PetaniCPM.php b/app/Models/Ekosistem/PetaniCPM.php index 6706f70..2fbf6d1 100644 --- a/app/Models/Ekosistem/PetaniCPM.php +++ b/app/Models/Ekosistem/PetaniCPM.php @@ -2,6 +2,7 @@ namespace App\Models\Ekosistem; +use App\Models\Concerns\CatatAktivitas; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -17,7 +18,7 @@ use App\Enums\HubunganDalamKeluarga; class PetaniCPM extends Model { - use SoftDeletes; + use SoftDeletes, CatatAktivitas; protected $table = 'ekosistem_petani_cpm'; protected $appends = ['umur']; diff --git a/app/Models/Ekosistem/RingkasanBasisData.php b/app/Models/Ekosistem/RingkasanBasisData.php index 77e139e..222ed51 100644 --- a/app/Models/Ekosistem/RingkasanBasisData.php +++ b/app/Models/Ekosistem/RingkasanBasisData.php @@ -2,6 +2,7 @@ namespace App\Models\Ekosistem; +use App\Models\Concerns\CatatAktivitas; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -13,7 +14,7 @@ use App\Models\Core\Program; class RingkasanBasisData extends Model { - use SoftDeletes; + use SoftDeletes, CatatAktivitas; protected $table = 'ekosistem_basis_data_ringkasan'; diff --git a/app/Models/Ekosistem/TabelBasisData.php b/app/Models/Ekosistem/TabelBasisData.php index 5d04b2e..dc573b9 100644 --- a/app/Models/Ekosistem/TabelBasisData.php +++ b/app/Models/Ekosistem/TabelBasisData.php @@ -2,6 +2,7 @@ namespace App\Models\Ekosistem; +use App\Models\Concerns\CatatAktivitas; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\Relations\HasMany; @@ -18,7 +19,7 @@ use App\Models\Ekosistem\FormBasisData; class TabelBasisData extends Model { - use SoftDeletes; + use SoftDeletes, CatatAktivitas; protected $table = 'ekosistem_basis_data_tabel'; diff --git a/app/Models/Ekosistem/ValueBasisData.php b/app/Models/Ekosistem/ValueBasisData.php index a5685fc..5bf2520 100644 --- a/app/Models/Ekosistem/ValueBasisData.php +++ b/app/Models/Ekosistem/ValueBasisData.php @@ -2,6 +2,7 @@ namespace App\Models\Ekosistem; +use App\Models\Concerns\CatatAktivitas; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -11,7 +12,7 @@ use App\Models\Ekosistem\KolomBasisData; class ValueBasisData extends Model { - use SoftDeletes; + use SoftDeletes, CatatAktivitas; protected $table = 'ekosistem_basis_data_value'; diff --git a/app/Models/Facilitator/Facilitator.php b/app/Models/Facilitator/Facilitator.php index e167ba0..a758186 100644 --- a/app/Models/Facilitator/Facilitator.php +++ b/app/Models/Facilitator/Facilitator.php @@ -2,13 +2,14 @@ namespace App\Models\Facilitator; +use App\Models\Concerns\CatatAktivitas; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Str; class Facilitator extends Model { - use HasFactory; + use HasFactory, CatatAktivitas; // Menentukan nama tabel jika tidak jamak (optional) protected $table = 'facilitator'; diff --git a/app/Models/Konfigurasi/KoordinatorKomoditas.php b/app/Models/Konfigurasi/KoordinatorKomoditas.php index 11dbbde..fbca4aa 100644 --- a/app/Models/Konfigurasi/KoordinatorKomoditas.php +++ b/app/Models/Konfigurasi/KoordinatorKomoditas.php @@ -2,6 +2,7 @@ namespace App\Models\Konfigurasi; +use App\Models\Concerns\CatatAktivitas; use App\Models\Concerns\HasDeletedBy; use App\Models\Pertanian\Komoditas; use App\Models\User; @@ -11,7 +12,7 @@ use Illuminate\Database\Eloquent\SoftDeletes; class KoordinatorKomoditas extends Model { - use SoftDeletes, HasDeletedBy; + use SoftDeletes, HasDeletedBy, CatatAktivitas; protected $table = 'koordinator_komoditas'; diff --git a/app/Models/Koperasi/PengurusKoperasi.php b/app/Models/Koperasi/PengurusKoperasi.php index 1539f9e..7b201da 100644 --- a/app/Models/Koperasi/PengurusKoperasi.php +++ b/app/Models/Koperasi/PengurusKoperasi.php @@ -2,10 +2,13 @@ namespace App\Models\Koperasi; +use App\Models\Concerns\CatatAktivitas; use Illuminate\Database\Eloquent\Model; class PengurusKoperasi extends Model { + use CatatAktivitas; + protected $table = 'pengurus_koperasi'; protected $fillable = [ diff --git a/app/Models/Map/InsLahan.php b/app/Models/Map/InsLahan.php index c672167..0c483b0 100644 --- a/app/Models/Map/InsLahan.php +++ b/app/Models/Map/InsLahan.php @@ -2,12 +2,13 @@ namespace App\Models\Map; +use App\Models\Concerns\CatatAktivitas; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Factories\HasFactory; class InsLahan extends Model { - use HasFactory; + use HasFactory, CatatAktivitas; protected $table = 'lahan_inspeksi'; diff --git a/app/Models/Map/Inspeksi.php b/app/Models/Map/Inspeksi.php index d6f35f3..d8d01a6 100644 --- a/app/Models/Map/Inspeksi.php +++ b/app/Models/Map/Inspeksi.php @@ -2,12 +2,13 @@ namespace App\Models\Map; +use App\Models\Concerns\CatatAktivitas; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; class Inspeksi extends Model{ - use SoftDeletes; + use SoftDeletes, CatatAktivitas; protected $table = 'tanaman_inspeksi'; diff --git a/app/Models/Map/Lahan.php b/app/Models/Map/Lahan.php index eeac4fb..c6638d0 100644 --- a/app/Models/Map/Lahan.php +++ b/app/Models/Map/Lahan.php @@ -2,13 +2,14 @@ namespace App\Models\Map; +use App\Models\Concerns\CatatAktivitas; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\Relations\HasMany; class Lahan extends Model { - use SoftDeletes; + use SoftDeletes, CatatAktivitas; protected $table = 'map_lahan'; diff --git a/app/Models/Map/Offtaker.php b/app/Models/Map/Offtaker.php index 8306778..a817f86 100644 --- a/app/Models/Map/Offtaker.php +++ b/app/Models/Map/Offtaker.php @@ -1,13 +1,14 @@ 'draft', ]; + // Log perpindahan status petani + public function catatPerubahanStatus(StatusDataPetani $dari, string $keterangan, array $tambahan = []): void + { + activity('verifikasi') + ->performedOn($this) + ->event('status') + ->withProperties(array_filter(['dari' => $dari->value, 'ke' => $this->status?->value, ...$tambahan])) + ->log($keterangan); + } + public function getUmurAttribute(): ?int { if (! $this->tanggal_lahir) { diff --git a/app/Models/Pertanian/PraktikBudidaya.php b/app/Models/Pertanian/PraktikBudidaya.php index d58c558..c3d93d6 100644 --- a/app/Models/Pertanian/PraktikBudidaya.php +++ b/app/Models/Pertanian/PraktikBudidaya.php @@ -2,6 +2,7 @@ namespace App\Models\Pertanian; +use App\Models\Concerns\CatatAktivitas; use App\Models\Concerns\KembalikanStatusPetaniKeDraf; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; @@ -19,7 +20,7 @@ use App\Models\Pertanian\Lahan; class PraktikBudidaya extends Model { - use SoftDeletes, KembalikanStatusPetaniKeDraf; + use SoftDeletes, KembalikanStatusPetaniKeDraf, CatatAktivitas; protected $table = 'praktik_budidaya'; diff --git a/app/Models/Pertanian/Produksi.php b/app/Models/Pertanian/Produksi.php index 9d54818..2a1036f 100644 --- a/app/Models/Pertanian/Produksi.php +++ b/app/Models/Pertanian/Produksi.php @@ -2,13 +2,14 @@ namespace App\Models\Pertanian; +use App\Models\Concerns\CatatAktivitas; use App\Models\Profile; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; class Produksi extends Model { - use SoftDeletes; + use SoftDeletes, CatatAktivitas; protected $table = 'produksi'; diff --git a/app/Models/Pertanian/SosialEkonomi.php b/app/Models/Pertanian/SosialEkonomi.php index 9febdd6..629e9dc 100644 --- a/app/Models/Pertanian/SosialEkonomi.php +++ b/app/Models/Pertanian/SosialEkonomi.php @@ -2,6 +2,7 @@ namespace App\Models\Pertanian; +use App\Models\Concerns\CatatAktivitas; use App\Models\Concerns\KembalikanStatusPetaniKeDraf; use App\Enums\SosialEkonomi\AlasanKreditDitolak; use App\Enums\SosialEkonomi\BisaBeliPupukBersubsidi; @@ -52,7 +53,7 @@ use Illuminate\Support\Str; class SosialEkonomi extends Model { - use SoftDeletes, KembalikanStatusPetaniKeDraf; + use SoftDeletes, KembalikanStatusPetaniKeDraf, CatatAktivitas; protected $table = 'sosial_ekonomi'; diff --git a/app/Models/Pertanian/SurveyPanen.php b/app/Models/Pertanian/SurveyPanen.php index ca570d2..1ee6d8e 100644 --- a/app/Models/Pertanian/SurveyPanen.php +++ b/app/Models/Pertanian/SurveyPanen.php @@ -2,6 +2,7 @@ namespace App\Models\Pertanian; +use App\Models\Concerns\CatatAktivitas; use App\Models\Concerns\KembalikanStatusPetaniKeDraf; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; @@ -12,7 +13,7 @@ use App\Models\Pertanian\Petani; class SurveyPanen extends Model { - use SoftDeletes, KembalikanStatusPetaniKeDraf; + use SoftDeletes, KembalikanStatusPetaniKeDraf, CatatAktivitas; protected $table = 'survey_panen'; diff --git a/app/Models/Pertanian/SurveyPelatihan.php b/app/Models/Pertanian/SurveyPelatihan.php index ffd9485..3b00dd9 100644 --- a/app/Models/Pertanian/SurveyPelatihan.php +++ b/app/Models/Pertanian/SurveyPelatihan.php @@ -2,6 +2,7 @@ namespace App\Models\Pertanian; +use App\Models\Concerns\CatatAktivitas; use App\Models\Concerns\KembalikanStatusPetaniKeDraf; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Factories\HasFactory; @@ -12,7 +13,7 @@ use App\Models\Pertanian\Petani; class SurveyPelatihan extends Model { - use HasFactory, SoftDeletes, KembalikanStatusPetaniKeDraf; + use HasFactory, SoftDeletes, KembalikanStatusPetaniKeDraf, CatatAktivitas; protected $table = 'survey_pelatihan'; diff --git a/app/Models/Pertanian/SurveyProduktivitas.php b/app/Models/Pertanian/SurveyProduktivitas.php index 52d8f71..4ee599c 100644 --- a/app/Models/Pertanian/SurveyProduktivitas.php +++ b/app/Models/Pertanian/SurveyProduktivitas.php @@ -2,6 +2,7 @@ namespace App\Models\Pertanian; +use App\Models\Concerns\CatatAktivitas; use App\Models\Concerns\KembalikanStatusPetaniKeDraf; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; @@ -10,7 +11,7 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo; class SurveyProduktivitas extends Model { - use SoftDeletes, KembalikanStatusPetaniKeDraf; + use SoftDeletes, KembalikanStatusPetaniKeDraf, CatatAktivitas; protected $table = 'survey_produktivitas'; diff --git a/app/Models/Pertanian/SurveySertifikasi.php b/app/Models/Pertanian/SurveySertifikasi.php index f4cb18a..78d580f 100644 --- a/app/Models/Pertanian/SurveySertifikasi.php +++ b/app/Models/Pertanian/SurveySertifikasi.php @@ -2,6 +2,7 @@ namespace App\Models\Pertanian; +use App\Models\Concerns\CatatAktivitas; use App\Models\Concerns\KembalikanStatusPetaniKeDraf; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Factories\HasFactory; @@ -10,7 +11,7 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo; class SurveySertifikasi extends Model { - use HasFactory, SoftDeletes, KembalikanStatusPetaniKeDraf; + use HasFactory, SoftDeletes, KembalikanStatusPetaniKeDraf, CatatAktivitas; protected $table = 'survey_sertifikasi'; diff --git a/app/Models/Pertanian/Tanaman.php b/app/Models/Pertanian/Tanaman.php index 944b628..1a414ce 100644 --- a/app/Models/Pertanian/Tanaman.php +++ b/app/Models/Pertanian/Tanaman.php @@ -2,6 +2,7 @@ namespace App\Models\Pertanian; +use App\Models\Concerns\CatatAktivitas; use App\Models\Concerns\KembalikanStatusPetaniKeDraf; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; @@ -18,7 +19,7 @@ use App\Enums\KeparahanSerangan; class Tanaman extends Model { - use SoftDeletes, KembalikanStatusPetaniKeDraf; + use SoftDeletes, KembalikanStatusPetaniKeDraf, CatatAktivitas; protected $table = 'map_tanaman'; diff --git a/app/Models/Profile.php b/app/Models/Profile.php index c72fb09..f4c186d 100644 --- a/app/Models/Profile.php +++ b/app/Models/Profile.php @@ -2,6 +2,7 @@ namespace App\Models; +use App\Models\Concerns\CatatAktivitas; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; @@ -11,7 +12,7 @@ use App\Models\Pertanian\Lahan; class Profile extends Model { - use SoftDeletes; + use SoftDeletes, CatatAktivitas; protected $fillable = [ 'user_id', diff --git a/app/Models/Program/Aktivitas.php b/app/Models/Program/Aktivitas.php index 47cd02d..0b4d69a 100644 --- a/app/Models/Program/Aktivitas.php +++ b/app/Models/Program/Aktivitas.php @@ -2,6 +2,7 @@ namespace App\Models\Program; +use App\Models\Concerns\CatatAktivitas; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -12,7 +13,7 @@ use App\Models\Program\Target; class Aktivitas extends Model { - use SoftDeletes; + use SoftDeletes, CatatAktivitas; protected $table = 'program_aktivitas'; diff --git a/app/Models/Program/DetailKelompok.php b/app/Models/Program/DetailKelompok.php index bc3755a..d2f16c5 100644 --- a/app/Models/Program/DetailKelompok.php +++ b/app/Models/Program/DetailKelompok.php @@ -2,11 +2,14 @@ namespace App\Models\Program; +use App\Models\Concerns\CatatAktivitas; use Illuminate\Database\Eloquent\Model; use App\Models\User; class DetailKelompok extends Model { + use CatatAktivitas; + protected $table = 'detail_kelompok'; protected $fillable = [ diff --git a/app/Models/Program/Framework.php b/app/Models/Program/Framework.php index e7d1d2a..cdb4d3e 100644 --- a/app/Models/Program/Framework.php +++ b/app/Models/Program/Framework.php @@ -2,6 +2,7 @@ namespace App\Models\Program; +use App\Models\Concerns\CatatAktivitas; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -12,7 +13,7 @@ use App\Models\Program\Transformasi; class Framework extends Model { - use SoftDeletes; + use SoftDeletes, CatatAktivitas; protected $table = 'program_framework'; diff --git a/app/Models/Program/KelompokBelajarTani.php b/app/Models/Program/KelompokBelajarTani.php index 4726493..5cf23ac 100644 --- a/app/Models/Program/KelompokBelajarTani.php +++ b/app/Models/Program/KelompokBelajarTani.php @@ -2,13 +2,14 @@ namespace App\Models\Program; +use App\Models\Concerns\CatatAktivitas; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; use App\Models\Program\DetailKelompok; class KelompokBelajarTani extends Model { - use SoftDeletes; + use SoftDeletes, CatatAktivitas; protected $table = 'kelompok_belajar_tani'; diff --git a/app/Models/Program/PesertaWorkshop.php b/app/Models/Program/PesertaWorkshop.php index f199f62..5751973 100644 --- a/app/Models/Program/PesertaWorkshop.php +++ b/app/Models/Program/PesertaWorkshop.php @@ -2,6 +2,7 @@ namespace App\Models\Program; +use App\Models\Concerns\CatatAktivitas; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\SoftDeletes; @@ -11,7 +12,7 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo; class PesertaWorkshop extends Model { - use HasFactory, SoftDeletes; + use HasFactory, SoftDeletes, CatatAktivitas; protected $table = 'peserta_workshop'; diff --git a/app/Models/Program/Realisasi.php b/app/Models/Program/Realisasi.php index ba56efa..1b09241 100644 --- a/app/Models/Program/Realisasi.php +++ b/app/Models/Program/Realisasi.php @@ -2,6 +2,7 @@ namespace App\Models\Program; +use App\Models\Concerns\CatatAktivitas; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -11,7 +12,7 @@ use App\Models\Program\Target; class Realisasi extends Model { - use SoftDeletes; + use SoftDeletes, CatatAktivitas; protected $table = 'program_realisasi'; diff --git a/app/Models/Program/SesiWorkshop.php b/app/Models/Program/SesiWorkshop.php index ef696a2..1d43589 100644 --- a/app/Models/Program/SesiWorkshop.php +++ b/app/Models/Program/SesiWorkshop.php @@ -2,6 +2,7 @@ namespace App\Models\Program; +use App\Models\Concerns\CatatAktivitas; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\SoftDeletes; @@ -12,7 +13,7 @@ use Illuminate\Database\Eloquent\Relations\HasMany; class SesiWorkshop extends Model { - use HasFactory, SoftDeletes; + use HasFactory, SoftDeletes, CatatAktivitas; protected $table = 'sesi_workshop'; diff --git a/app/Models/Program/Target.php b/app/Models/Program/Target.php index 8bf0f80..7dd1ec1 100644 --- a/app/Models/Program/Target.php +++ b/app/Models/Program/Target.php @@ -2,6 +2,7 @@ namespace App\Models\Program; +use App\Models\Concerns\CatatAktivitas; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -12,7 +13,7 @@ use App\Models\Program\Aktivitas; class Target extends Model { - use SoftDeletes; + use SoftDeletes, CatatAktivitas; protected $table = 'program_target'; diff --git a/app/Models/Program/Transformasi.php b/app/Models/Program/Transformasi.php index 504c5f8..d16db7b 100644 --- a/app/Models/Program/Transformasi.php +++ b/app/Models/Program/Transformasi.php @@ -2,6 +2,7 @@ namespace App\Models\Program; +use App\Models\Concerns\CatatAktivitas; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -12,7 +13,7 @@ use App\Models\Program\Aktivitas; class Transformasi extends Model { - use SoftDeletes; + use SoftDeletes, CatatAktivitas; protected $table = 'program_transformasi'; diff --git a/app/Models/Program/Verifikasi.php b/app/Models/Program/Verifikasi.php index 837e48b..5b83cec 100644 --- a/app/Models/Program/Verifikasi.php +++ b/app/Models/Program/Verifikasi.php @@ -2,6 +2,7 @@ namespace App\Models\Program; +use App\Models\Concerns\CatatAktivitas; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -10,7 +11,7 @@ use App\Models\Program\Realisasi; class Verifikasi extends Model { - use SoftDeletes; + use SoftDeletes, CatatAktivitas; protected $table = 'program_verifikasi'; diff --git a/app/Models/Program/Workshop.php b/app/Models/Program/Workshop.php index aaba7ac..36b0402 100644 --- a/app/Models/Program/Workshop.php +++ b/app/Models/Program/Workshop.php @@ -2,6 +2,7 @@ namespace App\Models\Program; +use App\Models\Concerns\CatatAktivitas; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\SoftDeletes; @@ -14,7 +15,7 @@ use Illuminate\Database\Eloquent\Relations\HasMany; class Workshop extends Model { - use HasFactory, SoftDeletes; + use HasFactory, SoftDeletes, CatatAktivitas; protected $table = 'workshop'; diff --git a/app/Models/User.php b/app/Models/User.php index 36d45b2..481703f 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -11,13 +11,16 @@ use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\Relations\HasOne; use Illuminate\Database\Eloquent\Relations\HasMany; use Laravel\Sanctum\HasApiTokens; +use App\Models\Concerns\CatatAktivitas; use App\Models\Konfigurasi\KoordinatorKomoditas; use App\Models\Pertanian\Petani; class User extends Authenticatable { - use HasFactory, Notifiable, HasApiTokens, SoftDeletes; + use HasFactory, Notifiable, HasApiTokens, SoftDeletes, CatatAktivitas; + + protected string $labelAktivitas = 'Pengguna'; protected $fillable = [ 'name', @@ -63,6 +66,13 @@ class User extends Authenticatable $user->koordinatorKomoditas()->get()->each->delete(); }); + + // Log ganti password (tanpa isi) + static::updated(function (User $user) { + if ($user->wasChanged('password')) { + activity('user')->performedOn($user)->event('password')->log('Password diubah'); + } + }); } public function koordinatorKomoditas(): HasMany diff --git a/app/Models/Wilayah/DesaKelurahan.php b/app/Models/Wilayah/DesaKelurahan.php index 123a402..f91743f 100644 --- a/app/Models/Wilayah/DesaKelurahan.php +++ b/app/Models/Wilayah/DesaKelurahan.php @@ -2,6 +2,7 @@ namespace App\Models\Wilayah; +use App\Models\Concerns\CatatAktivitas; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; use App\Models\Wilayah\Kecamatan; @@ -12,7 +13,7 @@ use Illuminate\Database\Eloquent\Builder; class DesaKelurahan extends Model { - use SoftDeletes; + use SoftDeletes, CatatAktivitas; protected $table = 'master_desa_kelurahan'; diff --git a/app/Models/Wilayah/KabupatenKota.php b/app/Models/Wilayah/KabupatenKota.php index da4a5b8..6088e97 100644 --- a/app/Models/Wilayah/KabupatenKota.php +++ b/app/Models/Wilayah/KabupatenKota.php @@ -2,6 +2,7 @@ namespace App\Models\Wilayah; +use App\Models\Concerns\CatatAktivitas; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; use App\Models\Wilayah\Provinsi; @@ -12,7 +13,7 @@ use Illuminate\Database\Eloquent\Builder; class KabupatenKota extends Model { - use SoftDeletes; + use SoftDeletes, CatatAktivitas; protected $table = 'master_kabupaten_kota'; diff --git a/app/Models/Wilayah/Kecamatan.php b/app/Models/Wilayah/Kecamatan.php index 18ce66c..ced6fac 100644 --- a/app/Models/Wilayah/Kecamatan.php +++ b/app/Models/Wilayah/Kecamatan.php @@ -2,6 +2,7 @@ namespace App\Models\Wilayah; +use App\Models\Concerns\CatatAktivitas; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; use App\Models\Wilayah\KabupatenKota; @@ -12,7 +13,7 @@ use Illuminate\Database\Eloquent\Builder; class Kecamatan extends Model { - use SoftDeletes; + use SoftDeletes, CatatAktivitas; protected $table = 'master_kecamatan'; diff --git a/app/Models/Wilayah/Provinsi.php b/app/Models/Wilayah/Provinsi.php index 77c8079..6bf90e6 100644 --- a/app/Models/Wilayah/Provinsi.php +++ b/app/Models/Wilayah/Provinsi.php @@ -2,6 +2,7 @@ namespace App\Models\Wilayah; +use App\Models\Concerns\CatatAktivitas; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; use App\Models\Wilayah\KabupatenKota; @@ -11,7 +12,7 @@ use Illuminate\Database\Eloquent\Builder; class Provinsi extends Model { - use SoftDeletes; + use SoftDeletes, CatatAktivitas; protected $table = 'master_provinsi'; diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 86fd286..48f67f4 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -15,6 +15,7 @@ use Dedoc\Scramble\Support\Generator\OpenApi; use Dedoc\Scramble\Support\Generator\SecurityScheme; use App\Models\Ekosistem\TabelBasisData; +use Spatie\Activitylog\Support\ActivityLogStatus; class AppServiceProvider extends ServiceProvider { @@ -31,6 +32,11 @@ class AppServiceProvider extends ServiceProvider */ public function boot(): void { + // Matikan log aktivitas saat seeding + if ($this->app->runningConsoleCommand('db:seed', 'migrate:fresh', 'migrate:refresh', 'migrate:reset')) { + app(ActivityLogStatus::class)->disable(); + } + Scramble::configure() ->withDocumentTransformers(function (OpenApi $openApi) { $openApi->secure( diff --git a/app/Services/Konfigurasi/FormatLogAktivitas.php b/app/Services/Konfigurasi/FormatLogAktivitas.php new file mode 100644 index 0000000..4e6b426 --- /dev/null +++ b/app/Services/Konfigurasi/FormatLogAktivitas.php @@ -0,0 +1,47 @@ + 'No. Telepon', + 'kk' => 'No. KK', + 'ktp' => 'No. KTP', + 'uid' => 'UID', + ]; + + // Nama kolom โ label (desa_kelurahan_id โ Desa Kelurahan (ID)) + public static function kolom(string $kolom): string + { + return self::LABEL_KOLOM[$kolom] + ?? (str_ends_with($kolom, '_id') ? Str::headline(substr($kolom, 0, -3)) . ' (ID)' : Str::headline($kolom)); + } + + // Nilai kolom โ teks tampilan + public static function nilai(string $kolom, mixed $nilai): string + { + return match (true) { + $nilai === null || $nilai === '' => '-', + $kolom === 'jenis_kelamin' => $nilai ? 'Laki-laki' : 'Perempuan', + is_bool($nilai) => $nilai ? 'Ya' : 'Tidak', + self::kolomTanggal($kolom, $nilai) => Carbon::parse($nilai)->translatedFormat('d M Y'), + default => Str::limit(is_scalar($nilai) ? (string) $nilai : json_encode($nilai, JSON_UNESCAPED_UNICODE), 120), + }; + } + + public static function status(?string $nilai): string + { + return StatusDataPetani::tryFrom((string) $nilai)?->label() ?? '-'; + } + + private static function kolomTanggal(string $kolom, mixed $nilai): bool + { + return (str_starts_with($kolom, 'tanggal') || str_starts_with($kolom, 'tgl_')) + && is_string($nilai) && strtotime($nilai) !== false; + } +} diff --git a/config/activitylog.php b/config/activitylog.php new file mode 100644 index 0000000..9c26fc0 --- /dev/null +++ b/config/activitylog.php @@ -0,0 +1,73 @@ + env('ACTIVITYLOG_ENABLED', true), + + /* + * When the clean command is executed, all recording activities older than + * the number of days specified here will be deleted. + */ + 'clean_after_days' => 365, + + /* + * If no log name is passed to the activity() helper + * we use this default log name. + */ + 'default_log_name' => 'default', + + /* + * You can specify an auth driver here that gets user models. + * If this is null we'll use the current Laravel auth driver. + */ + 'default_auth_driver' => null, + + /* + * If set to true, the subject relationship on activities + * will include soft deleted models. + */ + 'include_soft_deleted_subjects' => true, + + /* + * This model will be used to log activity. + * It should implement the Spatie\Activitylog\Contracts\Activity interface + * and extend Illuminate\Database\Eloquent\Model. + */ + 'activity_model' => Activity::class, + + /* + * These attributes will be excluded from logging for all models. + * Model-specific exclusions via logExcept() are merged with these. + */ + 'default_except_attributes' => [], + + /* + * When enabled, activities are buffered in memory and inserted in a + * single bulk query after the response has been sent to the client. + * This can significantly reduce the number of database queries when + * many activities are logged during a single request. + * + * Only enable this if your application logs a high volume of activities + * per request. Buffered activities will not have an ID until the + * buffer is flushed. + */ + 'buffer' => [ + 'enabled' => env('ACTIVITYLOG_BUFFER_ENABLED', true), + ], + + /* + * These action classes can be overridden to customize how activities + * are logged and cleaned. Your custom classes must extend the originals. + */ + 'actions' => [ + 'log_activity' => LogActivityAction::class, + 'clean_log' => CleanActivityLogAction::class, + ], +]; diff --git a/database/migrations/2026_11_05_152339_create_activity_log_table.php b/database/migrations/2026_11_05_152339_create_activity_log_table.php new file mode 100644 index 0000000..615d04d --- /dev/null +++ b/database/migrations/2026_11_05_152339_create_activity_log_table.php @@ -0,0 +1,25 @@ +id(); + $table->string('log_name')->nullable()->index(); + $table->text('description'); + $table->nullableMorphs('subject', 'subject'); + $table->string('event')->nullable(); + $table->nullableMorphs('causer', 'causer'); + $table->json('attribute_changes')->nullable(); + $table->json('properties')->nullable(); + $table->timestamps(); + + $table->index('created_at'); + }); + } +}; diff --git a/resources/views/konfigurasi/log-aktivitas/index.blade.php b/resources/views/konfigurasi/log-aktivitas/index.blade.php new file mode 100644 index 0000000..746eb82 --- /dev/null +++ b/resources/views/konfigurasi/log-aktivitas/index.blade.php @@ -0,0 +1,161 @@ +@extends('layout.main') + +@use('App\Services\Konfigurasi\FormatLogAktivitas', 'Format') +@use('App\Models\Pertanian\Petani') +@use('Illuminate\Support\Str') + +@section('content') +
| Waktu | +Pengguna | +Jenis | +Aktivitas | +Rincian | +
|---|---|---|---|---|
| + {{ $item->created_at->translatedFormat('d M Y') }} + {{ $item->created_at->format('H:i:s') }} + | ++ @if ($item->causer) + {{ $item->causer->name }} + {{ $item->causer->role?->label() }} + @else + Sistem / tamu + @endif + | +{{ $j['label'] }} | ++ {{ $item->description }} + @if ($item->subject_type && $item->subject_type !== Petani::class) + #{{ $item->subject_id }}{{ $namaData ? ' ยท ' . Str::limit($namaData, 40) : '' }} + @endif + @if ($petaniId) + + + {{ $namaPetani[$petaniId] ?? $namaData ?? 'Petani #' . $petaniId }} + + @endif + | +
+ @if ($item->log_name === 'verifikasi')
+ {{ Format::status($prop['dari'] ?? null) }}
+
+ {{ Format::status($prop['ke'] ?? null) }}
+ @if (! empty($prop['catatan']))
+ Catatan: {{ $prop['catatan'] }}
+ @endif
+ @elseif ($item->log_name === 'auth')
+ IP: {{ $prop['ip'] ?? '-' }}
+ @if (! empty($prop['identitas']))
+ Login: {{ $prop['identitas'] }}
+ @endif
+ @elseif ($baru)
+ @php
+ $isian = collect($baru)->when(! $lama, fn ($c) => $c->reject(fn ($v) => $v === null || $v === ''));
+ $batas = $lama ? $isian->count() : 5;
+ @endphp
+
|
+
| Belum ada aktivitas yang tercatat. | +||||