# Memori Sistem: Overhaul Platform Manajemen Magang Terintegrasi

Dokumen ini mencatat seluruh arsitektur, proses bisnis, struktur data, dan desain visual yang telah diimplementasikan dalam overhaul sistem manajemen magang.

---

## 1. Tujuan & Konsep Bisnis Utama
Sistem ini bertransformasi dari **absensi-sentris** menjadi **Platform Manajemen Magang Terintegrasi (Task-Centric Workspace)**.
- Absensi (Presensi) tetap dipertahankan, namun diposisikan sebagai aktivitas pendukung.
- Setiap presensi masuk (`Hadir`/`WFH`) wajib diasosiasikan dengan sebuah **Task Aktif**.
- Pengerjaan tugas menerapkan konsep **Focused Workflow (Satu Fokus Pekerjaan)**: peserta magang harus menyelesaikan/mengajukan review atas task aktif yang sedang dikerjakannya sebelum diperbolehkan mengambil tugas baru.

---

## 2. Struktur Data & Hierarki Proyek
Sistem menggunakan struktur hierarki berikut:
```text
Project (Proyek Utama)
│
├── Rencana (Planning Progress - Linear) vs Aktual (Actual Progress - Bobot Modul)
│
├── Module (Modul Proyek, memiliki Bobot Persentase)
│      │
│      ├── Task (Tugas Detail, memiliki PIC Tunggal / user_id)
│      │
│      └── Progress Module (Rasio Task Selesai terhadap Total Task)
│
└── Progress Project (Akumulasi Bobot Modul Selesai)
```

### Penambahan Kolom Database:
1. `md_project_modules`:
   - `bobot` (float/double): Bobot modul terhadap total proyek (jumlah bobot per proyek maksimal 100%).
2. `md_project_tasks`:
   - `user_id` (foreign key): PIC tunggal yang mengerjakan tugas.
   - `catatan_revisi` (text): Masukan/catatan perbaikan dari admin saat tugas ditolak.
   - `file_lampiran` (string): Path file bukti pengerjaan yang diunggah peserta.
   - `laporan_kerja` (text): Detail/link hasil pekerjaan dari peserta magang.
   - `tanggal_selesai_kerja` (timestamp): Waktu penyelesaian pengerjaan tugas.
3. `md_activity_logs` (Tabel Baru):
   - Mencatat log kronologis aktivitas tim (seperti penugasan, approval, pengiriman laporan, revisi, dll).

---

## 3. Logika & Alur Bisnis (Focused Workflow)

### Aturan Pengambilan Tugas:
- User tidak memiliki task aktif -> Bagian **Tugas yang Tersedia (Available Tasks)** muncul di dashboard (dikelompokkan per modul). User dapat mengeklik **Ambil Tugas**.
- User mengambil tugas -> Status tugas berubah menjadi `sedang_dikerjakan` and PIC (`user_id`) diset ke user tersebut.
- User memiliki task aktif -> Seluruh daftar **Available Tasks** disembunyikan. Banner peringatan agar menyelesaikan task aktif akan muncul. Tombol "Ambil Tugas" dikunci baik di UI maupun di validasi backend (`selfAssignTask`).

### Alur Presensi Kehadiran:
- **Absen Masuk (Check-in)**:
  - Dropdown pemilihan tugas dihapus sepenuhnya.
  - Sistem otomatis mengambil ID dari task yang sedang dikerjakan (`task_id`) menggunakan input tersembunyi.
  - Jika peserta tidak memiliki tugas aktif, pilihan status Hadir/WFH di-disable di UI disertai banner imbauan agar mengambil tugas terlebih dahulu. Status Sakit/Izin tetap dapat diajukan tanpa tugas aktif.
- **Absen Pulang (Check-out)**:
  - Wajib menyertakan deskripsi laporan hasil pekerjaan hari itu dan mengunggah dokumen/lampiran jika status absennya Hadir/WFH.

---

## 4. Desain & Arsitektur Informasi Dashboard User
Dashboard disusun kembali menjadi workspace satu halaman modern untuk desktop:
1. **Project Overview (Top - Full Width)**:
   - Menampilkan Proyek Aktif, detail tanggal proyek, komparasi visual progress bar **Rencana vs Aktual**, dan widget Progress Ring SVG aktual proyek.
2. **Workspace Grid (Middle - Two Column Layout)**:
   - **Kolom Kiri (col-lg-8)**:
     - **Task Saya Hari Ini**: Card utama fokus tugas. Menyediakan form collapsible untuk mengirimkan laporan/bukti pekerjaan ke admin. Jika tidak ada tugas aktif, menampilkan **Empty State** interaktif.
     - **Available Tasks & Warnings**: Menampilkan list tugas modular jika kosong, atau banner workflow terfokus jika memiliki task.
     - **Form Presensi Kehadiran**: Berada di bagian bawah kolom kiri untuk mendukung workflow harian.
   - **Kolom Kanan (col-lg-4)**:
     - **Ringkasan Kehadiran**: Widget ringkas berisi persentase kehadiran circular ring dan baris list pill akumulasi hari kehadiran (Hadir, WFH, Sakit, Izin) secara vertikal.
3. **Riwayat Presensi (Bottom - Full Width)**:
   - Tabel historis lengkap catatan kehadiran dan link lampiran foto kamera/berkas pendukung kerja.

---

## 5. Pembaruan & Perbaikan Terbaru (Per 1 Agustus 2026)

### A. Perbaikan Alur Edit Proyek (Admin)
- **Masalah**: Membuka modal pemilih anggota (`#editProjectMembersModal`) di atas modal edit proyek (`#editProjectModal`) merusak *backdrop* Bootstrap dan menyembunyikan modal utama. Saat tombol "Selesai" ditekan, modal edit proyek tidak muncul kembali sehingga perubahan gagal disimpan.
- **Solusi**: Ditambahkan *event listener* pada modal anggota. Ketika modal anggota ditampilkan, modal utama edit proyek secara terprogram disembunyikan. Ketika modal anggota ditutup/diselesaikan, modal utama edit proyek ditampilkan kembali dengan mulus untuk memastikan formulir dapat disimpan menggunakan tombol "Simpan Project".

### B. Dukungan Absensi Pengguna Baru (Tanpa Proyek)
- **Masalah**: Pengguna baru yang baru dibuat belum terdaftar di proyek apa pun dan tidak memiliki tugas. Alur kerja terfokus menonaktifkan status Hadir/WFH jika tidak ada tugas aktif, dan validator mewajibkan pengiriman `task_id` untuk status Hadir/WFH, membuat pengguna baru tidak bisa absen.
- **Solusi**: 
  - **Backend (`AttendanceController`)**: Mengubah validasi `task_id` menjadi opsional (`nullable`) jika pengguna belum terdaftar di proyek (`md_project_user`).
  - **Frontend (`index.blade.php`)**: Memeriksa status keanggotaan proyek. Jika pengguna tidak terdaftar di proyek mana pun, pilihan status Hadir/WFH tetap diaktifkan (*enabled*) dan dapat dikirim tanpa memilih tugas aktif.

### C. Overhaul Antarmuka Dashboard User (`index.blade.php`)
- Pembangunan ulang `@section('content')` dan `@section('scripts')` untuk ruang kerja absensi peserta magang harian. Layout ditata lebih rapi, modern, dan responsif.
- Integrasi fungsionalitas penguncian lokasi GPS dan pengambilan foto kamera web yang dioptimalkan baik untuk check-in maupun check-out.

### D. Integrasi Dropdown Pemilihan Tugas (Task Selection) pada Absensi Masuk
- **Masalah**: Pengguna biasa tidak memiliki cara yang mudah untuk memilih tugas yang ingin mereka kerjakan langsung dari formulir absensi masuk. Mereka sebelumnya harus mengambil tugas secara manual dari daftar tugas terlebih dahulu sebelum Hadir/WFH diaktifkan.
- **Solusi**: 
  - Jika pengguna belum memiliki tugas aktif tetapi ada tugas tersedia (*available*) di proyek mereka, pilihan status Hadir/WFH akan tetap aktif.
  - Dropdown **Pilih Tugas yang Akan Dikerjakan** akan muncul di formulir absensi masuk saat opsi Hadir/WFH dipilih (dropdown ini disembunyikan jika memilih Sakit/Izin).
  - Ketika formulir dikirimkan, sistem secara otomatis mendaftarkan pengguna tersebut ke tugas terpilih di backend dan memproses absensi masuk dalam satu langkah.
  - Jika pengguna sudah memiliki tugas aktif, informasi tugas tersebut akan ditampilkan sebagai info baca-saja (*read-only*) dan ID tugas dikirim sebagai input tersembunyi.

### E. Fleksibilitas Pengelolaan Tugas (Task) & PIC oleh Admin (Dual-Mode)
- **Konsep Dual-Mode Penugasan**: Sistem mendukung dua opsi pengerjaan tugas:
  1. *Self-Assignment*: Peserta magang memilih/mengambil tugas secara mandiri lewat dashboard absensi mereka.
  2. *Admin-Assisted*: Admin menugaskan tugas tertentu langsung ke salah satu peserta magang dari dashboard admin.
- **Tambah Task Baru**: Admin kini dapat menambahkan tugas detail ke dalam modul tertentu langsung menggunakan tombol dan modal **Tambah Task Baru** (`#addTaskModal`). Form ini menyediakan dropdown pilihan modul proyek, input judul/deskripsi, tanggal mulai/selesai, serta pilihan opsional PIC (anggota proyek) yang ingin ditugaskan.
- **Kelola PIC Mandiri vs Ditugaskan**: Pada Kanban Board proyek:
  - Di kolom *Tugas Tersedia (Belum Diambil / Unassigned)*, disediakan form dropdown untuk memilih nama anggota proyek dan tombol "Set" untuk menugaskan PIC secara langsung.
  - Di kolom *Sedang Dikerjakan*, disediakan tombol "Lepas PIC" (user-minus icon) agar admin dapat membatalkan penugasan tugas tersebut kembali menjadi *unassigned* (sehingga dapat diambil secara mandiri oleh peserta magang kembali).
- **Penghapusan Tugas Terproteksi**: Admin dapat menghapus tugas langsung dari Kanban Board. Backend akan menangani penghapusan dependensi tugas (seperti kiriman laporan, balasan catatan, data partisipan) secara aman dan menaikkan recalculation progress proyek/modul secara otomatis.

### G. Opsi Keanggotaan Proyek Opsional & Alur Auto-Join User ke Proyek
- **Keanggotaan Proyek Opsional oleh Admin**:
  - Validasi backend (`storeProject` dan `updateProject`) diubah agar input `user_ids` bersifat `nullable|array` (opsional). Project owner `user_id` diatur default ke ID admin pembuat jika tidak ada anggota yang dipilih.
  - Pembatasan frontend di dashboard admin (`requireCheckedProjectUsers`) dan tanda bintang merah (*) dihapus dari form pembuatan/edit proyek.
- **Alur Auto-Join Peserta Magang**:
  - Di dashboard user biasa, jika peserta belum tergabung dalam proyek apa pun (`$hasProjects` bernilai false), daftar tugas tersedia (`$allAvailableTasks`) dimuat dari **semua proyek yang berstatus aktif**.
  - Dropdown pemilihan tugas pada form absen masuk tetap dirender jika terdapat tugas tersedia di sistem.
  - Di backend, fungsi `joinTaskForUser` diubah agar otomatis menyinkronkan/menambahkan user tersebut ke dalam keanggotaan proyek (`md_project_user`) ketika user mengambil/menyelesaikan tugas proyek tersebut melalui absen masuk. Hal ini mencegah error 403 Forbidden dan memudahkan alur mandiri bagi user.

### F. Perbaikan Bug Geolocation pada Absen Masuk (Check-in)
- **Masalah**: Pada formulir absen masuk, ketika pengguna memilih status selain WFH (`hadir`, `sakit`, `izin`), fungsi Javascript `hideLocationSection()` secara otomatis menyembunyikan kontainer GPS dan memanggil `setLocationError()` yang menghapus nilai latitude dan longitude. Padahal, validator backend secara ketat mewajibkan `lokasi_latitude` dan `lokasi_longitude` untuk semua status absensi. Hal ini mengakibatkan absen masuk selain WFH selalu gagal dengan error "Lokasi GPS wajib dikunci".
- **Solusi**:
  - Mengubah fungsi `hideLocationSection()` agar selalu memanggil `showLocationSection()` tanpa menyembunyikan atau menghapus koordinat yang telah dideteksi otomatis maupun dikunci secara manual oleh pengguna.
  - Memperbarui validasi Javascript pada saat kirim form agar `needsLocation` bernilai `true` untuk semua status (mencerminkan aturan validasi backend).
  - Menyesuaikan label dan teks status lokasi secara dinamis berdasarkan status absensi yang dipilih (misalnya: "Lokasi Hadir (Kantor)" untuk Hadir, "Lokasi WFH" untuk WFH, dan "Lokasi Presensi" untuk Sakit/Izin).

### H. Pengambilan Modul Mandiri & Tombol Tambah Task Langsung (Admin)
- **Pengambilan Modul Mandiri (Self-Assign Module)**: Menambahkan route `/absensi/module/ambil/{module}`. Peserta magang dapat langsung mengeklik "Ambil Modul Pekerjaan" dari dashboard untuk mengambil modul secara utuh. Sistem otomatis melakukan auto-join ke proyek terkait, membuat task baru berjudul `Pengerjaan Modul: [Nama Modul]`, mengeset PIC-nya ke peserta tersebut, dan memperbarui progres modul/proyek.
- **Tombol Tambah Task di Modul**: Menambahkan tombol "Tambah Task" pada daftar modul di detail proyek admin, yang secara otomatis memicu pembukaan modal penambahan tugas dengan modul terkait yang langsung terpilih (*pre-selected*).

### I. Alur Ketergantungan Modul & Tugas (Module-First Task Visibility)
- **Modul belum dipilih**: Jika suatu modul belum memiliki pengerjaan terdaftar (tidak ada tugas dalam modul tersebut yang memiliki PIC/`user_id` tidak null), maka tugas-tugas detail di dalamnya disembunyikan dari daftar tugas tersedia. Sistem hanya menampilkan entri **Modul** di daftar *"Modul Pekerjaan yang Tersedia"*. Hal ini mencegah peserta mengambil sub-tugas sebelum modul utamanya dideklarasikan/diambil terlebih dahulu.
- **Modul sudah dipilih**: Setelah modul diambil (baik langsung oleh user maupun setelah tugas pertamanya diberi PIC oleh admin), modul tersebut hilang dari daftar modul tersedia, dan semua sisa tugas unassigned di dalam modul tersebut akan muncul di daftar *"Tugas yang Tersedia"*.
- **Dropdown Absen Masuk Sederhana (Tasks-Only)**: Pilihan tugas di form absen masuk disederhanakan kembali agar hanya menampilkan Tugas (Tasks) yang sudah aktif/tersedia (tanpa pilihan modul langsung), menjaga kesederhanaan alur presensi harian.
- **Null Safety Batas Waktu Tugas**: Menambahkan penanganan fallback jika tugas tidak memiliki batas waktu selesai (`tanggal_selesai` bernilai null) untuk mencegah kegagalan rendering (*Call to a member function translatedFormat() on null*).

### J. Penyelesaian Tugas Otomatis pada Modul (Auto-Complete Module Tasks)
- **Logika Otomatis Selesai**: Jika admin menyetujui (*approve*) tugas tingkat modul utama (tugas yang memiliki judul ber-prefix `Pengerjaan Modul: `), maka **seluruh tugas-tugas (tasks) lain di dalam modul tersebut akan otomatis ikut selesai (`status = selesai`)** dan status partisipan diset menjadi `approved`.
- **Kecuali Tugas Mandiri**: Jika admin menyetujui tugas biasa (sub-task) yang dikirimkan terpisah (bukan tugas pengerjaan modul utama), maka tugas lainnya di dalam modul tetap tidak terpengaruh (tetap belum selesai).

### K. Perubahan Visual Timeline Proyek & Tombol Form (Admin)
- **Tombol Form Modul**: Mengubah warna tombol "Simpan Modul" (dan "Tambah Task Baru") pada form proyek admin agar berwarna hitam pekat (`btn-dark` dengan background `#000` dan border hitam), menggantikan warna putih bawaan unstyled agar terlihat solid dan kontras.
- **Bar Progress Timeline Dinamis**: Mengubah bar visualisasi modul pada timeline agar berfungsi penuh sebagai **progress bar** (tanpa potongan offset tanggal di sebelah kiri). Bar durasi sekarang dimulai dari `left: 0` dan memiliki `width: 100%` di dalam row kontainer abu-abu (`#e2e8f0`). Panjang isian gradasi warna biru/indigo (`#6366f1` ke `#8b5cf6`) secara dinamis merepresentasikan persentase progres aktual modul (0% - 100%). Ketika progres modul mencapai **100%**, warna biru gradasi akan terisi penuh secara merata ke seluruh bar dari ujung kiri hingga ujung kanan, tanpa ada sisa bagian abu-abu di kiri. Label teks modul di atas bar menampilkan nama modul beserta detail tanggal mulainya secara kontras.


- **Penghapusan Tombol Tambah Task Baru Umum di Header**: Menghapus tombol umum "Tambah Task Baru" dari deretan header switcher proyek secara permanen (sehingga tidak muncul baik saat melihat timeline maupun Kanban Board). Dengan ini, pembuatan tugas (tasks) didelegasikan sepenuhnya secara kontekstual menggunakan tombol "+ Tambah Task" yang berada di samping baris tiap modul di Timeline View. Hal ini menjamin bahwa setiap tugas baru yang dibuat akan selalu secara eksplisit terasosiasi ke dalam suatu modul kerja proyek.

### L. Aturan Kalkulasi Progress: Rencana (Plan) vs Aktual (Real)
- **Rencana (Plan)**: Target kemajuan proyek yang dihitung secara otomatis oleh sistem (real-time harian) murni berdasarkan **kalender rentang tanggal modul** (`tanggal_mulai` s/d `tanggal_selesai`).
  - *Jika modul dijadwalkan hari ini s/d hari ini*: Sepanjang hari ini Rencana modul dibaca `0%` (karena hari kerja hari ini masih berjalan). Mulai besok pagi (saat tanggal selesai terlampaui), Rencana otomatis dibaca `100%`.
- **Aktual (Real)**: Kemajuan nyata pengerjaan proyek yang dihitung berdasarkan **bobot modul-modul yang tugasnya telah disetujui (approved) oleh admin**.
  - *Jika modul diselesaikan hari ini*: Begitu admin mengklik setujui (approve) pengerjaan modul hari ini, progress Aktual langsung bernilai `100%` saat itu juga, tanpa menunggu pergantian hari.
### M. Perbaikan Geolocation & UI Absen Masuk (Check-in)
- **Pembatasan Panjang Karakter Koordinat & Akurasi**: 
  - Nilai koordinat lintang (`lokasi_latitude`) dan bujur (`lokasi_longitude`) yang dikirim ke backend diformat menjadi maksimal **5 angka di belakang koma** (`toFixed(5)`) untuk kepraktisan penyimpanan data dan tampilan UI tanpa mengurangi akurasi (sangat akurat hingga radius ~1,1 meter).
  - Nilai tingkat akurasi GPS (`lokasi_akurasi`) kini dibulatkan menjadi **bilangan bulat terdekat** (`Math.round(accuracy)`) demi estetika dan keterbacaan yang ringkas.
- **Lokasi Presensi Wajib Disemua Status**: Memastikan panel input GPS selalu tampil secara *default* (`show` class terpasang langsung di HTML kontainer `location_section`) dan wajib diisi oleh pengguna untuk seluruh jenis status kehadiran (Hadir, WFH, Sakit, maupun Izin) baik di form check-in maupun check-out.
- **Visual & Logika Status Hadir/WFH Nonaktif**:
  - Menambahkan gaya visual khusus (`opacity: 0.5; cursor: not-allowed; pointer-events: none;`) pada pilihan kartu status (`.status-card`) ketika opsi Hadir/WFH dinonaktifkan (karena tidak ada task tersedia).
  - Memperbaiki bug logika bawaan agar jika status Hadir/WFH nonaktif, pilihan *default* awal langsung berpindah ke status **Sakit** (bukan Hadir yang sedang di-disable), mencegah kegagalan validasi *task* kosong saat form dikirimkan langsung.

### N. Perapihan Desain Kelola Magang (Admin Dashboard)
- **Penghapusan Kolom Pembimbing Magang yang Redundan**: Karena tabel peserta magang pada halaman Kelola Magang sudah dikelompokkan secara visual menggunakan baris header pembimbing (misalnya: `Budi Santoso (1 peserta)`), penayangan nama pembimbing yang sama di dalam kolom baris tabel dihapus.
- **Penyelarasan Kolom**: Header `"PEMBIMBING MAGANG"` dan kolom `<td>` pembimbing telah dihilangkan secara penuh. Lebar kolom (`colspan`) untuk baris header pembimbing disesuaikan dari `9` menjadi `8` agar ukuran tabel tetap proporsional dan tidak terjadi distorsi tata letak.

### O. Penyederhanaan Panel Statistik Dashboard Admin
- **Penghapusan Kartu Statistik Kehadiran Harian**: Kartu statistik keempat (`Stats Card 4: Attendance Today` yang menampilkan *"Hadir: X | WFH: Y | Belum: Z | Kehadiran"* ) telah **dihapus sepenuhnya** dari panel statistik dashboard admin.
- **Tampilan Responsif**: Dengan dihapusnya kartu tersebut, sisa 3 kartu statistik utama (Proyek, Modul/Tugas, dan Butuh Review) secara otomatis akan merentang mengisi lebar halaman secara proporsional.

### P. Perbaikan Bug Kontainer Tab Kelola Bidang (Superadmin Dashboard)
- **Masalah Structural Nesting HTML**: Sebelumnya, tag pembuka div `panel-timeline` tidak memiliki tag penutup `</div>` yang sesuai pada akhir bagian Timeline Project. Hal ini menyebabkan tab panel berikutnya, yaitu `panel-bidang`, bersarang (nested) di dalam `panel-timeline`. Akibatnya, saat tab Kelola Bidang dipilih, konten di dalamnya tersembunyi (`d-none`) karena mewarisi status sembunyi dari kontainer timeline.
- **Solusi**: Menambahkan tag penutup `</div>` yang hilang di akhir panel timeline (tepat sebelum tab Kelola Bidang dimulai). Struktur HTML tab-panel kini terpisah secara independen sehingga tab Kelola Bidang, daftar Bidang Magang, tombol Tambah Bidang, serta Daftar Pembimbing Magang dapat dimuat dan ditampilkan dengan sempurna.

### Q. Penyesuaian Kelengkungan Sudut Kartu (Card Border-Radius)
- **Desain Sudut Lebih Tegas & Profesional**: Berdasarkan masukan pengguna untuk membuat kartu-kartu tidak terlalu melengkung (*less rounded*), nilai `border-radius` yang sebelumnya berukuran besar (`16px`, `18px`, `20px`, hingga `24px`) kini telah diturunkan menjadi **`10px` hingga `12px`** di seluruh proyek.
- **Komponen yang Disesuaikan**:
  - **Dashboard Admin & Layouts**: `.admin-card`, `.admin-stat-card`, `.kanban-col`, `.gantt-chart`, `.modal-clean .modal-content`, `.member-selector`, `.monitor-item`.
  - **Halaman Login & Landing Page**: `.login-card`, `.auth-switch`, `.dev-credentials-info`, `.feature-card`, `.schedule-card`.
  - **Workspace & Form Presensi Peserta**: `.ws-card`, `--radius` (CSS variable untuk workspace), `.status-card`, `.upload-zone`, `.camera-panel`, `.camera-start-actions`, `.status-option`.

### R. Penanganan & Pencegahan Error 419 Page Expired (CSRF / Sesi Kedaluwarsa)
- **Latar Belakang Masalah**: Ketika pengguna membuka tab presensi atau dashboard dalam waktu lama tanpa aktivitas atau setelah sesi browser terputus, pengiriman formulir menghasilkan halaman bawaan Laravel `419 | Page Expired` yang kaku dan menghilangkan isian data pengguna.
- **Solusi & Pencegahan Menyeluruh**:
  1. **Graceful Exception Handling (`bootstrap/app.php`)**: Menangkap `TokenMismatchException`. Jika terjadi kegagalan token CSRF pada form submission biasa, pengguna dialihkan kembali (`redirect()->back()`) dengan mempertahankan input yang sudah diketik (`withInput()`) dan menampilkan notifikasi SweetAlert peringatan bahwa sesi telah disegarkan secara mulus tanpa layar error 419.
  2. **Endpoint Refresh Token Asynchronous (`/refresh-csrf`)**: Menambahkan endpoint ringan untuk mengambil token CSRF baru kapan saja tanpa reload halaman penuh.
  3. **Auto CSRF Keep-Alive & Sync (`layouts/app.blade.php` & `layouts/admin.blade.php`)**:
     - Menambahkan `<meta name="csrf-token" content="{{ csrf_token() }}">` pada `<head>`.
     - Menambahkan skrip JavaScript otomatis yang memperbarui token CSRF di background setiap 10 menit dan secara instan saat pengguna beralih kembali ke tab (*visibility change* / *window focus*), memperbarui seluruh `input[name="_token"]` pada halaman secara otomatis.
  4. **Custom 419 Error Page Modern (`resources/views/errors/419.blade.php`)**: Menyediakan halaman error khusus bertema modern dan rapi dalam bahasa Indonesia lengkap dengan tombol "Muat Ulang Halaman" dan hitung mundur reload otomatis 5 detik.

### S. Penataan Jadwal Mingguan & Mode Tampilan Ganda (Dual-View Schedule)
- **Tampilan Perorangan (Individual View)**:
  - Mengubah penamaan dari "Tampilan Normal" menjadi **Tampilan Perorangan**.
  - Menyajikan tabel jadwal peserta magang murni secara perorangan/individual tanpa pengelompokan header tim atau badge tim. Dilengkapi avatar inisial berwarna ungu lembut, nama tebal, subjudul bidang magang, dropdown status kehadiran hari kerja (Senin–Kamis), dan status badge **WFH** tetap pada hari Jumat.
  - Tombol aksi difokuskan pada **"Acak Normal"** dan **"Simpan Jadwal"**, disertai kolom pencarian (*search bar*) instan berdasarkan nama peserta atau bidang magang.
- **Tampilan Tim (Team View)**:
  - Menyajikan jadwal dan penugasan peserta berdasarkan kelompok tim (Tim A, Tim B, dst.) lengkap dengan badge warna dan ikon identitas masing-masing tim.
  - Penataan tombol header yang rapi: **"Tambah Tim Baru"** (kiri), **"Acak Anggota Tim"** (tengah), dan **"Acak Pola Tim"** (kanan).
  - **Live Auto-Save Penugasan Tim (AJAX)**: Mengubah dropdown penugasan tim peserta langsung menyimpan perubahan ke server melalui AJAX tanpa memerlukan reload halaman atau tombol "Simpan Perubahan" manual. Baris tabel secara dinamis berpindah ke kelompok tim yang dipilih, badge ringkasan jumlah anggota diperbarui secara instan, dan notifikasi toast SweetAlert dimunculkan.
  - Modal **Tambah Tim Baru** memungkinkan superadmin membuat nama tim baru secara dinamis.
- **Pengaturan Tampilan Jadwal di Halaman Utama (Landing Page Setting)**:
  - Card pengaturan tampilan jadwal di halaman utama user biasa ditempatkan di bagian paling atas tab Jadwal Mingguan secara menetap (*persistent*), sehingga tidak ikut tersembunyi saat admin beralih antar subview Tim dan Perorangan.
  - Pengaturan disimpan secara instan via AJAX dan halaman depan (`home.blade.php`) secara otomatis menampilkan format jadwal sesuai konfigurasi superadmin (Mode Tim vs Mode Perorangan).

### T. Penyederhanaan Tab Kelola Magang (Admin Dashboard)
- **Penghapusan Tombol Tambah Peserta**: Tombol "Tambah Peserta" pada header Kelola Magang dihilangkan karena pendaftaran peserta ditangani melalui form registrasi mandiri akun pengguna.
- **Fokus Aksi Edit & Hapus**: Tabel peserta magang dikhususkan secara eksklusif untuk melihat daftar peserta, melakukan perubahan data (Edit), serta penghapusan akun (Hapus).
- **Penyatuan Status Akun**: Menghapus teks duplikat status aktif/nonaktif yang sebelumnya tampil bertumpuk, digantikan oleh satu badge monitor (*pill*) yang rapi.
- **Pembersihan Tampilan Tim**: Keterangan/badge tim di samping nama peserta magang pada tab Kelola Magang dihilangkan agar tabel bersih dan manajemen tim terpusat di tab Jadwal Mingguan.

### U. Optimasi Filter & Pencarian Kelola Bidang
- Menambahkan fungsionalitas pencarian (*search bar*) dan scrolling otomatis jika daftar bidang atau pembimbing melebihi 5 entri, menjaga tata letak tetap ringkas dan memudahkan superadmin dalam menemukan bidang/pembimbing.

### V. Persistensi Tab Aktif Admin Dashboard pada Refresh
- **Sinkronisasi Tab & URL State**: Setiap kali admin berpindah tab (*Kelola Magang*, *Timeline Project*, *Jadwal Mingguan*, *Kelola Bidang*, *Sertifikat*, *Rekap Absensi*), fungsi `switchTab` otomatis memperbarui parameter URL browser (`?tab=...`) via `history.replaceState` serta menyimpannya di `sessionStorage` dan `localStorage`.
- **Pertahankan Tab Terakhir Saat Reload**: Ketika halaman di-*refresh* (F5 atau reload browser), sistem secara otomatis mendeteksi dan membuka kembali tab terakhir yang sedang diakses pengguna, mencegah halaman melompat kembali ke Jadwal Mingguan atau Rekap Absensi.

### W. Pemilihan Proyek Aktif Eksplisit & Kunci Alur Tugas (User Workspace)
- **Pemilihan Proyek dengan Tombol Konfirmasi (Checklist)**:
  - Pada akun pengguna biasa, proyek aktif tidak langsung berganti saat dropdown dipilih, melainkan peserta harus menekan tombol centang biru konfirmasi terlebih dahulu untuk mengunci pilihan proyek.
  - Jika peserta belum memilih proyek aktif, formulir absensi Hadir/WFH dinonaktifkan disertai banner peringatan ramah agar memilih proyek terlebih dahulu.
- **Proteksi Penguncian Proyek Saat Task Aktif**:
  - Ketika peserta sudah memilih proyek dan telah mengambil/mengerjakan tugas/modul, dropdown pemilih proyek dikunci (*disabled*) sehingga peserta tidak dapat berpindah proyek di tengah pengerjaan.
  - Untuk berpindah proyek, peserta harus membatalkan modul atau menyelesaikan tugas terlebih dahulu.
- **Tombol Kembali / Batal pada Modul**:
  - Disediakan tombol batal/kembali pada kartu "Task Saya Hari Ini" yang memungkinkan peserta melepaskan penugasan modul jika salah pilih, mengembalikan status menjadi *unassigned* dan membuka kembali pemilih proyek.
- **Pembersihan UI Informasi Task Duplikat**:
  - Menghilangkan bagian rendering task aktif redundan di bagian bawah dashboard karena informasi tugas telah ditampilkan secara eksklusif dan lengkap pada kartu fokus utama di bagian atas.

### X. Penyempurnaan Alur Laporan Harian (Absen Masuk vs Pulang)
- **Absen Masuk (Check-in)**: Kolom isian laporan harian dihilangkan untuk status Hadir/WFH agar proses check-in berlangsung cepat dan fokus pada penugasan tugas serta verifikasi lokasi & kamera.
- **Absen Pulang (Checkout)**: Kolom isian laporan hasil pekerjaan dan unggah gambar bukti pengerjaan hanya dimunculkan dan diwajibkan saat melakukan absen pulang.
- **Perbaikan Alur Submit Checkout**: Memperbaiki bug pengiriman data checkout yang sebelumnya menyebabkan proses *stuck*, memastikan *redirect* dan notifikasi tersimpan dengan mulus.

### Y. Peningkatan Akurasi Geolocation & Penyederhanaan Visual Lokasi
- **High-Precision Geolocation Tracking**:
  - Mengimplementasikan `navigator.geolocation.watchPosition` dengan opsi `enableHighAccuracy: true` dan kalibrasi satelit bertahap untuk mengunci koordinat dengan toleransi radius terkecil.
  - Koordinat lintang dan bujur disimpan hingga tingkat presisi 7 desimal (~1,1 cm) pada *hidden input*.
- **Penyederhanaan Antarmuka (UI/UX)**:
  - **Teks Status Ringkas**: Pesan sukses disederhanakan menjadi **"Lokasi terkunci"**.
  - **Penyembunyian Badge Angka**: Angka koordinat (*lat, lng*) dan radius akurasi (misal *±182m*) disembunyikan dari tampilan layar agar antarmuka bersih dan minimalis, namun data tetap tersimpan penuh untuk verifikasi backend.
  - **Ikon Tunggal**: Ikon centang hijau duplikat dihapus, sehingga kartu verifikasi lokasi hanya menampilkan **satu logo lokasi biru utama** di sebelah kiri.
- **Pembersihan Form Edit Magang (Admin)**:
  - Bagian pilihan Tim pada form edit peserta magang dihilangkan agar form ringkas dan manajemen tim terpusat di tab Jadwal Mingguan.

### Z. Batasan Tanggal Timeline Project & Komponen Buka-Tutup (Envelope) Tambah Modul
- **Validasi Tanggal Proyek (Start Date vs End Date)**:
  - Tanggal berakhir project (`tanggal_selesai`) diproteksi agar tidak bisa mendahului tanggal mulai (`tanggal_mulai`), baik saat pembuatan proyek baru maupun saat edit proyek.
  - Validasi diterapkan dua lapis:
    - **Frontend (JS)**: Atribut `min` pada input tanggal selesai otomatis disinkronkan saat tanggal mulai dipilih, dan form submit dicegah dengan alert SweetAlert2 jika tanggal tidak valid.
    - **Backend (Laravel)**: Rule validasi `'tanggal_selesai' => 'required|date|after_or_equal:tanggal_mulai'` pada `ProjectTimelineController::storeProject` dan `ProjectTimelineController::updateProject`.
- **Pembatasan Tanggal Modul dalam Rentang Waktu Proyek**:
  - Tanggal mulai dan selesai modul (`tanggal_mulai` & `tanggal_selesai`) dibatasi secara ketat hanya bisa diisi di dalam kurun waktu proyek yang telah ditentukan (`project.tanggal_mulai` s/d `project.tanggal_selesai`).
  - Modul tidak dapat dibuat atau diedit melebihi ataupun mendahului rentang waktu proyek terkait.
  - Tanggal selesai modul diproteksi agar tidak lebih awal dari tanggal mulai modul.
  - **Frontend & Modal Edit**: Dilengkapi atribut `min` & `max` dinamis, info banner rentang tanggal proyek pada modal edit modul, serta normalisasi otomatis dengan pesan peringatan SweetAlert2.
  - **Backend (Laravel)**: Rule validasi komprehensif pada `ProjectTimelineController::storeModule` dan `ProjectTimelineController::updateModule` untuk memverifikasi `after_or_equal:project_mulai` dan `before_or_equal:project_selesai`.
- **Komponen Buka-Tutup (Surat / Envelope Collapsible) Form Tambah Modul Baru**:
  - Formulir "Tambah Modul Baru" pada setiap kartu proyek di tab Timeline Project dikemas dalam komponen buka-tutup bergaya amplop surat (*envelope accordion*).
  - Tampilan dilengkapi tombol ringkas berikon surat interaktif yang berubah menjadi amplop terbuka saat dibuka, rotasi chevron halus, dan teks pemandu "Buka / Tutup Form".
  - Menjaga tampilan kartu proyek tetap rapi, ringkas, dan nyaman dilihat tanpa memakan ruang vertikal yang terlalu panjang.

### AA. Penataan Breakdown Sub-Task pada Modul (Admin & User Workspace)
- **Admin Timeline & Manajemen Modul**:
  - Di setiap kartu modul pada *List Modul Detil*, daftar sub-task yang menjadi pecahan modul langsung dirender rapi dengan status badge (*Tersedia, Dikerjakan, Review, Revisi, Selesai*), nama PIC penanggung jawab, batas tanggal pengerjaan, dan tombol hapus sub-task.
  - Tombol duplikat `+ Tambah Task` (hijau) di bagian bawah kartu modul dihapus, dan difokuskan secara eksklusif pada tombol biru **`+ Task`** di baris header *Daftar Task / Sub-tugas*.
  - **Form Tambah Task Eksklusif per Modul**: Saat tombol `+ Task` pada modul tertentu diklik (misal modul "backend"), modal tambah task secara otomatis mengunci dan menampilkan nama **Modul Terpilih** tanpa menampilkan dropdown daftar modul lain. Batas tanggal mulai dan tanggal selesai task juga otomatis terkunci sesuai rentang tanggal modul yang dipilih.
- **User Workspace (Pembagian Tugas Tim Mandiri)**:
  - Bagian *Tugas & Modul yang Tersedia* menampilkan setiap modul proyek secara terstruktur beserta seluruh daftar sub-task di dalamnya.
  - Setiap sub-task yang belum memiliki penanggung jawab (unassigned) dilengkapi tombol mandiri **"Ambil Tugas Ini"** agar anggota tim magang dapat membagi beban kerja secara adil dan transparan.
  - Sub-task yang telah diambil oleh rekan tim lain menampilkan nama PIC penanggung jawab dan status pengerjaannya.
  - Jika modul belum dipecah menjadi sub-task oleh admin, sistem menyediakan opsi **"Ambil Modul Pekerjaan Utuh"**.

### AB. Penyederhanaan Bahasa Notifikasi & Panduan Pengguna (User-Friendly Copywriting)
- Pesan peringatan saat pengguna mencoba mengganti proyek ketika masih memiliki tugas aktif disederhanakan dari bahasa kaku sistem menjadi kalimat yang ramah dan langsung memandu aksi pengguna:
  > *"Anda masih memiliki tugas yang sedang dikerjakan. Silakan klik 'Batal Pilih' pada tugas di atas jika ingin mengganti proyek."*
- Banner alur kerja di halaman absensi disesuaikan menjadi judul **"Tugas Sedang Dikerjakan"** dengan instruksi yang jelas bagi pengguna awam.

### AC. Pembaruan UI Login, Forgot Password, dan Workspace User (2 Agustus 2026)
- **Alur Forgot Password Dua Tahap**:
  - Fitur lupa password untuk peserta dibuat menjadi dua langkah.
  - Langkah pertama hanya meminta **Nama Lengkap** dan **Email Terdaftar** sesuai data registrasi.
  - Jika nama dan email cocok dengan akun peserta (`role = user`), sistem menyimpan verifikasi sementara di session dan baru menampilkan form **Password Baru** serta **Konfirmasi Password Baru**.
  - Password tidak dapat diubah jika pengguna belum lolos verifikasi nama dan email.
  - Fitur ini dibatasi untuk peserta biasa; akun admin dan superadmin tidak dapat menggunakan alur forgot password peserta.

- **Pembersihan Tampilan Login**:
  - Blok **Informasi Akun Contoh** dihapus dari halaman login.
  - Teks contoh akun berikut dihapus dari UI:
    - Peserta Baru: Pilih tab Daftar di atas untuk registrasi akun.
    - Akun Admin: admin / admin123.
    - Akun Super Admin: superadmin / superadmin123.
    - Peserta Dummy: username dari nama peserta, password password123.
  - Subjudul login **"Masuk sebagai peserta magang, admin, atau super admin"** dihapus agar halaman login lebih bersih.

- **Penyederhanaan Absen Masuk**:
  - Kolom dropdown **"Pilih Tugas yang Akan Dikerjakan"** pada form absen masuk dihapus karena daftar tugas sudah ditampilkan di bagian atas workspace.
  - Alur yang berlaku: peserta harus memilih tugas melalui tombol **Ambil Tugas** pada daftar tugas/modul yang tersedia.
  - Setelah tugas diambil, form absen masuk mengirim `task_id` tugas aktif melalui input tersembunyi.
  - Jika peserta belum mengambil tugas, pilihan **Hadir/WFH** dikunci dan sistem menampilkan pesan agar peserta mengambil satu tugas terlebih dahulu.
  - Catatan ini menggantikan catatan lama yang masih menyebut integrasi dropdown pemilihan tugas pada absen masuk.

- **Penyederhanaan Tombol Batal Tugas**:
  - Label gabungan **"Kembali / Batal Pilih"** pada kartu **Tugas Saya Hari Ini** disederhanakan menjadi satu aksi: **"Batal Pilih"**.
  - Teks bantuan pada banner tugas aktif juga disesuaikan agar hanya menyebut tombol **Batal Pilih**.
  - Label dropdown proyek **"Batalkan Pilihan / Pilih Proyek Lain"** disederhanakan menjadi **"Batalkan Pilihan"**.

### AD. Akun Admin per Bidang
- Sistem admin dibagi berdasarkan 5 bidang resmi:
  - Bidang Pengelolaan Informasi dan Komunikasi Publik
  - Bidang Aplikasi Informatika
  - Bidang Infrastruktur Teknologi
  - Bidang Persandian dan Statistik
  - Kepala UPT Radio dan Televisi
- Akun admin bidang yang disiapkan:
  - `admin.pikp` / `K7mQ2vLp`
  - `admin.aplikasi` / `R9xT4nBa`
  - `admin.infrastruktur` / `P6hZ8cWu`
  - `admin.persandian` / `V3sL7qNd`
  - `admin.upt-rtv` / `M8rY5pXe`
- Password admin bidang dibuat acak, tidak memakai pola `admin123`, dan maksimal 8 karakter.

### AE. Dummy Peserta Magang per Bidang
- Ditambahkan dummy peserta magang untuk 5 bidang resmi, masing-masing maksimal 20 peserta:
  - Bidang Pengelolaan Informasi dan Komunikasi Publik: 20 peserta
  - Bidang Aplikasi Informatika: 20 peserta
  - Bidang Infrastruktur Teknologi: 20 peserta
  - Bidang Persandian dan Statistik: 20 peserta
  - Kepala UPT Radio dan Televisi: 20 peserta
- Dummy peserta dibuat berbasis email saja agar berbeda dari admin:
  - `peserta.pikp.01@example.test` s/d `peserta.pikp.20@example.test`
  - `peserta.aplikasi.01@example.test` s/d `peserta.aplikasi.20@example.test`
  - `peserta.infrastruktur.01@example.test` s/d `peserta.infrastruktur.20@example.test`
  - `peserta.persandian.01@example.test` s/d `peserta.persandian.20@example.test`
  - `peserta.upt-rtv.01@example.test` s/d `peserta.upt-rtv.20@example.test`
- Username dummy peserta dikosongkan (`null`) dan tidak dipakai untuk login peserta.
- Password dummy peserta tetap mengikuti pola dummy user lama: `password123`.
- Seeder dan migration dibuat idempotent: jika suatu bidang sudah memiliki peserta, sistem hanya menambah sampai total peserta bidang tersebut mencapai 20.

### AF. Login Peserta Berbasis Email
- Tampilan login peserta hanya menampilkan field **Email** dan **Password**.
- Teks **Email atau Username** dihapus dari login peserta.
- Login peserta wajib menggunakan email terdaftar; username tidak diterima pada jalur login peserta.
- Field username tetap dipakai pada tampilan login khusus admin dan superadmin.

### AG. Timeline Project untuk Admin Bidang
- Tab **Timeline Proyek** yang sebelumnya hanya tampil di Super Admin kini ditampilkan juga pada akun Admin biasa.
- Admin bidang dapat membuka dan mengelola timeline project dari dashboard admin.
- Data timeline pada Admin biasa tetap dibatasi sesuai bidang admin tersebut:
  - daftar peserta proyek hanya berasal dari bidang admin;
  - project lintas bidang tidak ditampilkan pada dashboard admin bidang;
  - request manual untuk memilih peserta dari bidang lain ditolak oleh backend.
- Route pengelolaan timeline project (`admin.project.*`) dipindahkan dari akses khusus superadmin ke akses admin umum, lalu diproteksi di `ProjectTimelineController` dengan validasi scope bidang.
- Bug tombol **Timeline Proyek** pada admin biasa tidak bisa diklik diperbaiki dengan memasukkan `panel-timeline` ke daftar panel JavaScript untuk semua admin, bukan hanya superadmin.

### AH. Sertifikat Magang Resmi & Template Upload (3 Agustus 2026)
- Tampilan sertifikat (`resources/views/sertifikat/show.blade.php`) dirombak menjadi layout sertifikat resmi ukuran tetap **1600 x 1131 px** yang kompatibel untuk preview browser dan export PDF DomPDF.
- Sertifikat memakai desain formal bernuansa biru tua dan emas, dengan logo Diskominfo serta lambang Kabupaten Bogor dari aset lokal:
  - `public/assets/certificate/logo_diskominfo.svg`
  - `public/assets/certificate/lambang_kabupaten_bogor.svg`
  - fallback PNG `public/assets/certificate/lambang_kabupaten_bogor.png`
- Ditambahkan helper `App\Support\CertificatePayload` untuk menyusun data sertifikat peserta secara konsisten:
  - nomor sertifikat;
  - nama peserta;
  - bidang magang;
  - tanggal mulai dan selesai magang;
  - predikat;
  - tanggal terbit;
  - pembimbing/penandatangan.
- Ditambahkan helper `App\Support\CertificateTemplate` untuk mengelola template sertifikat HTML upload-an admin:
  - path dan nama template disimpan di tabel pengaturan (`md_pengaturan`);
  - template lama dihapus ketika template baru diupload;
  - placeholder `{{ nama }}`, `{{ bidang }}`, `{{ tanggal_mulai }}`, dan data lain otomatis diganti dari payload peserta;
  - path aset lokal dalam template diganti ke data URI agar aman dipakai saat generate PDF.
- Pada tab **Sertifikat** admin, admin dapat melihat template aktif, mengupload template HTML baru, preview sertifikat peserta, dan download PDF.
- Generate PDF sertifikat memprioritaskan template upload-an admin. Jika belum ada template upload, sistem memakai template default dari `sertifikat.show`.

### AI. Scope Admin Bidang untuk Dashboard, Rekap, dan Sertifikat
- Query dashboard admin sekarang memakai scope bidang aktif (`adminBidangScope`) agar admin bidang hanya melihat data sesuai bidangnya.
- Scope bidang diterapkan pada:
  - daftar peserta magang;
  - pilihan pembimbing magang;
  - rekap absensi;
  - daftar proyek, modul, dan task;
  - statistik proyek/tugas/peserta aktif;
  - task yang menunggu review;
  - activity log;
  - daftar peserta pada tab sertifikat.
- Superadmin tetap dapat melihat lintas bidang dan diberi opsi filter bidang eksplisit lewat parameter `bidang_id`.
- Admin bidang otomatis memakai `bidang_id` dari akun admin yang sedang login, tanpa perlu memilih bidang manual.
- Form dan link dashboard mempertahankan `bidang_id` aktif agar filter tidak hilang saat berpindah tab, mencari data, export Excel, atau export PDF.
- Export Excel rekap absensi (`AbsensiExport`) menerima parameter opsional `bidang_id`, sehingga file Excel hanya berisi peserta bidang terkait ketika filter/scope aktif.
- Export PDF rekap absensi juga mengikuti scope bidang yang sama dari controller.
- Validasi backend menolak admin bidang yang mencoba mengelola peserta di luar bidangnya.

### AJ. Snapshot Worktree Saat Memori Disimpan (3 Agustus 2026)
- Status saat catatan ini dibuat: worktree belum bersih dan berisi perubahan besar yang belum dicatat sebagai commit.
- File tracked yang sedang berubah mencakup:
  - `app/Exports/AbsensiExport.php`
  - `app/Http/Controllers/AdminController.php`
  - `app/Http/Controllers/AttendanceController.php`
  - `app/Http/Controllers/AuthController.php`
  - `app/Http/Controllers/ProjectTimelineController.php`
  - `app/Models/User.php`
  - `bootstrap/app.php`
  - `database/factories/UserFactory.php`
  - `database/seeders/DatabaseSeeder.php`
  - `resources/views/absensi/form.blade.php`
  - `resources/views/absensi/index.blade.php`
  - `resources/views/admin/dashboard.blade.php`
  - `resources/views/admin/login.blade.php`
  - `resources/views/home.blade.php`
  - `resources/views/layouts/admin.blade.php`
  - `resources/views/layouts/app.blade.php`
  - `resources/views/sertifikat/show.blade.php`
  - `routes/web.php`
  - `tests/Feature/AttendanceTest.php`
- File/folder baru yang muncul dan perlu diperhatikan saat commit/deploy:
  - `app/Support/CertificatePayload.php`
  - `app/Support/CertificateTemplate.php`
  - `resources/views/errors/419.blade.php`
  - `tests/Feature/CsrfSessionTest.php`
  - migration seed/scope bidang tanggal 29 Juli sampai 3 Agustus 2026;
  - aset sertifikat di `public/assets/certificate/`;
  - artefak hosting `.hosting_build/` dan `system_laporanabsensi_hosting.zip`.
- Test belum dijalankan ulang pada saat penyimpanan memori ini. Test baru yang tersedia mencakup `CsrfSessionTest` untuk endpoint `/refresh-csrf` dan view custom `errors.419`; `AttendanceTest` juga sudah diperluas untuk alur absensi/task terbaru.

### AK. Branding Website SIMALAM (3 Agustus 2026)
- Nama resmi website ditetapkan menjadi **SIMALAM**.
- Kepanjangan resmi SIMALAM adalah **Sistem Informasi Monitoring Absensi dan Laporan Magang**.
- Branding lama seperti `AbsensiKita`, `Absensi Harian`, dan `Employee Attendance System` pada file sumber view diganti agar konsisten dengan SIMALAM.
- Titik yang diperbarui:
  - default title layout publik (`layouts/app.blade.php`);
  - default title layout admin (`layouts/admin.blade.php`);
  - navbar brand publik;
  - hero halaman utama (`home.blade.php`);
  - title dashboard admin, form absensi, dan rekap peserta;
  - footer layout publik dan footer layout admin;
  - header/footer PDF rekap absensi.
- `APP_NAME` pada `.env` dan `.env.example` disesuaikan menjadi `SIMALAM`.

### AL. Pengaturan Tampilan Jadwal Mingguan per Admin/Bidang (3 Agustus 2026)
- Pengaturan tampilan **Jadwal Kerja Minggu Ini** di halaman awal (`/`) tidak lagi hanya memakai satu mode global untuk semua bidang.
- Mode tampilan sekarang mendukung override per bidang/admin:
  - key global lama `jadwal_landing_view` tetap dipakai sebagai default;
  - admin bidang menyimpan pilihan ke key `jadwal_landing_view_bidang_{bidang_id}`;
  - halaman awal membaca mode tiap bidang secara terpisah.
- Dampak tampilan halaman awal:
  - satu bidang dapat tampil sebagai **Tampilan Tim**;
  - bidang lain dapat tampil sebagai **Tampilan Perorangan**;
  - badge header menampilkan **Sesuai Bidang** jika mode antar bidang berbeda.
- Tab **Jadwal Mingguan** kini dibuka juga untuk admin bidang, bukan hanya superadmin.
- Aksi jadwal untuk admin bidang discope ke peserta pada bidang admin tersebut:
  - simpan jadwal perorangan;
  - acak jadwal perorangan;
  - jadwal berbasis tim;
  - acak jadwal tim;
  - acak anggota tim;
  - update anggota tim via AJAX.
- Superadmin tetap dapat menyimpan default global. Jika superadmin sedang memakai filter bidang (`bidang_id`), pengaturan yang disimpan berlaku untuk bidang tersebut.
- Test terkait ditambahkan/diperbarui:
  - superadmin update mode global;
  - admin bidang update mode bidangnya;
  - halaman awal menampilkan mode global;
  - halaman awal menampilkan mode campuran per bidang.

### AM. Pembedaan Warna Badge WFH dan Highlight Hari (3 Agustus 2026)
- Pada komponen **Jadwal Kerja Minggu Ini**, badge **WFH** diubah dari warna ungu/primary menjadi warna amber/coklat muda.
- Tujuannya agar badge WFH tidak terlihat sama dengan highlight kolom hari aktif yang tetap memakai warna primary.
- Perubahan diterapkan di:
  - badge WFH pada jadwal halaman awal (`home.blade.php`);
  - badge Jumat WFH tetap pada tab Jadwal Mingguan admin (`admin/dashboard.blade.php`).

### AN. Pembersihan Teks Status Hero Landing Page (3 Agustus 2026)
- Teks kecil **"SIMALAM aktif - Hari ini"** pada hero halaman utama dihapus.
- CSS pendukung yang sudah tidak dipakai juga dihapus:
  - `.status-dot`;
  - `.status-dot::before`;
  - `@keyframes pulse-dot`.
- Hero landing page sekarang langsung menampilkan judul **SIMALAM** dan deskripsi kepanjangan sistem tanpa badge status di atasnya.
