# DUMP PROYEK: 2 BACKEND MODELS MISC
> Diekstrak pada: 2026-10-04 21:45:03

## File: `composer.json`
```json
{
    "$schema": "https://getcomposer.org/schema.json",
    "name": "laravel/laravel",
    "type": "project",
    "description": "The skeleton application for the Laravel framework.",
    "keywords": ["laravel", "framework"],
    "license": "MIT",
    "require": {
        "php": "^8.3",
        "laravel/framework": "^13.8",
        "laravel/tinker": "^3.0",
        "phpoffice/phpspreadsheet": "^5.9"
    },
    "require-dev": {
        "fakerphp/faker": "^1.23",
        "laravel/pail": "^1.2.5",
        "laravel/pao": "^1.0.6",
        "laravel/pint": "^1.27",
        "laravel/sail": "^1.60",
        "mockery/mockery": "^1.6",
        "nunomaduro/collision": "^8.6",
        "phpunit/phpunit": "^12.5.12"
    },
    "autoload": {
        "psr-4": {
            "App\\": "app/",
            "Database\\Factories\\": "database/factories/",
            "Database\\Seeders\\": "database/seeders/"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "Tests\\": "tests/"
        }
    },
    "scripts": {
        "setup": [
            "composer install",
            "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"",
            "@php artisan key:generate",
            "@php artisan migrate --force",
            "npm install --ignore-scripts",
            "npm run build"
        ],
        "dev": [
            "Composer\\Config::disableProcessTimeout",
            "npx concurrently -c \"#93c5fd,#c4b5fd,#fb7185,#fdba74\" \"php artisan serve\" \"php artisan queue:listen --tries=1 --timeout=0\" \"php artisan pail --timeout=0\" \"npm run dev\" --names=server,queue,logs,vite --kill-others"
        ],
        "test": [
            "@php artisan config:clear --ansi @no_additional_args",
            "@php artisan test"
        ],
        "post-autoload-dump": [
            "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
            "@php artisan package:discover --ansi"
        ],
        "post-update-cmd": [
            "@php artisan vendor:publish --tag=laravel-assets --ansi --force"
        ],
        "post-root-package-install": [
            "@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
        ],
        "post-create-project-cmd": [
            "@php artisan key:generate --ansi",
            "@php -r \"file_exists('database/database.sqlite') || touch('database/database.sqlite');\"",
            "@php artisan migrate --graceful --ansi"
        ],
        "pre-package-uninstall": [
            "Illuminate\\Foundation\\ComposerScripts::prePackageUninstall"
        ]
    },
    "extra": {
        "laravel": {
            "dont-discover": []
        }
    },
    "config": {
        "optimize-autoloader": true,
        "preferred-install": "dist",
        "sort-packages": true,
        "allow-plugins": {
            "pestphp/pest-plugin": true,
            "php-http/discovery": true
        }
    },
    "minimum-stability": "stable",
    "prefer-stable": true
}

```

## File: `app/Models/Gender.php`
```php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Gender extends Model
{
    protected $table = 'genders';
    protected $fillable = ['nama_gender'];
}
```

## File: `app/Models/PpdbSetting.php`
```php
<?php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class PpdbSetting extends Model
{
    protected $fillable = ['judul', 'deskripsi', 'jadwal', 'brosur_file', 'gambar_ilustrasi'];

    protected $casts = [
        'jadwal' => 'array',
    ];
}
```

## File: `app/Models/GuruMapel.php`
```php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class GuruMapel extends Model
{
    use HasFactory;

    protected $table = 'guru_mapels';

    protected $guarded = ['id'];

    public function guru()
    {
        return $this->belongsTo(Guru::class, 'guru_id');
    }

    public function mapel()
    {
        return $this->belongsTo(Mapel::class, 'mapel_id');
    }

    public function tahunAjaran()
    {
        return $this->belongsTo(TahunAjaran::class, 'tahun_ajaran_id');
    }
}
```

## File: `app/Models/Absensi.php`
```php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Absensi extends Model
{
    use HasFactory;

    protected $fillable = [
        'siswa_id', 'guru_mapel_id', 'tahun_ajaran_id', 'semester_id', 'tanggal', 'status', 'keterangan'
    ];

    public function siswa() { return $this->belongsTo(Siswa::class); }
    public function guruMapel() { return $this->belongsTo(GuruMapel::class); }
    public function tahunAjaran() { return $this->belongsTo(TahunAjaran::class); }
    public function semester() { return $this->belongsTo(Semester::class); }

    public function getTanggalHijriyahAttribute()
    {
        if (!$this->tanggal) return '-';
        try {
            $date = new \DateTime($this->tanggal);
            $formatter = new \IntlDateFormatter(
                'id_ID@calendar=islamic-umalqura',
                \IntlDateFormatter::LONG,
                \IntlDateFormatter::NONE,
                'Asia/Jakarta',
                \IntlDateFormatter::TRADITIONAL,
                'd MMMM yyyy'
            );
            return $formatter->format($date) . ' H';
        } catch (\Exception $e) {
            return '-';
        }
    }
}
```

## File: `app/Models/WaliKelas.php`
```php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class WaliKelas extends Model
{
    use HasFactory;

    protected $table = 'wali_kelas';

    protected $fillable = [
        'tahun_ajaran_id',
        'semester_id',
        'kelas_id',
        'kelas_detail_id',
        'guru_id',
    ];

    public function tahunAjaran()
    {
        return $this->belongsTo(TahunAjaran::class);
    }

    public function semester()
    {
        return $this->belongsTo(Semester::class);
    }

    public function kelas()
    {
        return $this->belongsTo(Kelas::class);
    }

    public function kelasDetail()
    {
        return $this->belongsTo(KelasDetail::class);
    }

    public function guru()
    {
        return $this->belongsTo(Guru::class);
    }
}
```

## File: `app/Models/Jabatan.php`
```php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Jabatan extends Model
{
    use HasFactory;

    protected $table = 'jabatans';

    protected $fillable = [
        'nama_jabatan',
        'urutan_tingkat',
        'keterangan',
    ];

    public function gurus()
    {
        return $this->hasMany(Guru::class, 'jabatan_id');
    }
}
```

## File: `app/Models/GajiKategori.php`
```php
<?php
// app/Models/GajiKategori.php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class GajiKategori extends Model
{
    use HasFactory;

    protected $table = 'gaji_kategoris';

    protected $fillable = [
        'tahun_ajaran_id',
        'nama',
        'sifat',
        'peruntukan', 
        'tipe_hitungan',
        'sumber_otomasi',
        'integration_id',
        'nominal_dasar',
        'keterangan'
    ];

    public function tahunAjaran()
    {
        return $this->belongsTo(TahunAjaran::class, 'tahun_ajaran_id');
    }
}
```

## File: `app/Models/PembayaranKeuangan.php`
```php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class PembayaranKeuangan extends Model
{
    use HasFactory;
    
    protected $table = 'pembayaran_keuangans';
    protected $fillable = ['siswa_id', 'tarif_keuangan_id', 'nominal_bayar', 'tanggal_bayar', 'keterangan'];

    public function siswa() { return $this->belongsTo(Siswa::class, 'siswa_id'); }
    public function tarif() { return $this->belongsTo(TarifKeuangan::class, 'tarif_keuangan_id'); }

    // BYPASS: Algoritma Konversi Hijriyah murni PHP tanpa ekstensi INTL
    private function convertToHijri($date)
    {
        if (!$date) return '-';
        
        $timestamp = strtotime($date);
        if (!$timestamp) return '-';

        $y = (int)date('Y', $timestamp);
        $m = (int)date('n', $timestamp);
        $d = (int)date('j', $timestamp);

        if (($y > 1582) || (($y == 1582) && ($m > 10)) || (($y == 1582) && ($m == 10) && ($d > 14))) {
            $jd = (int)((1461 * ($y + 4800 + (int)(($m - 14) / 12))) / 4) +
                  (int)((367 * ($m - 2 - 12 * ((int)(($m - 14) / 12)))) / 12) -
                  (int)((3 * ((int)(($y + 4900 + (int)(($m - 14) / 12)) / 100))) / 4) +
                  $d - 32075;
        } else {
            $jd = 367 * $y - (int)((7 * ($y + 5001 + (int)(($m - 9) / 7))) / 4) +
                  (int)((275 * $m) / 9) + $d + 1729777;
        }

        $l = $jd - 1948440 + 10632;
        $n = (int)(($l - 1) / 10631);
        $l = $l - 10631 * $n + 354;
        $j = ((int)((10985 - $l) / 5316)) * ((int)((50 * $l) / 17719)) +
             ((int)($l / 5670)) * ((int)((43 * $l) / 15238));
        $l = $l - ((int)((30 - $j) / 15)) * ((int)((17719 * $j) / 50)) -
             ((int)($j / 16)) * ((int)((15238 * $j) / 43)) + 29;

        $m = (int)((24 * $l) / 709);
        $d = $l - (int)((709 * $m) / 24);
        $y = 30 * $n + $j - 30;

        $bulanHijri = [
            1 => 'Muharram', 'Safar', 'Rabiul Awal', 'Rabiul Akhir',
            'Jumadil Awal', 'Jumadil Akhir', 'Rajab', 'Sya\'ban',
            'Ramadhan', 'Syawal', 'Dzulqa\'dah', 'Dzulhijjah'
        ];

        return $d . ' ' . $bulanHijri[$m] . ' ' . $y . ' H';
    }

    public function getTanggalBayarHijriyahAttribute()
    {
        return $this->convertToHijri($this->tanggal_bayar);
    }
}
```

## File: `app/Models/Hari.php`
```php
<?php
namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Hari extends Model
{
    use HasFactory;
    protected $table = 'haris';
    protected $guarded = ['id'];
}
```

## File: `app/Models/TarifKeuangan.php`
```php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class TarifKeuangan extends Model
{
    use HasFactory;

    protected $table = 'tarif_keuangans';
    
    protected $fillable = [
        'jenjang_id', 
        'kategori_id', 
        'tingkat_kelas_id',
        'tahun_ajaran_id', 
        'semester_id', 
        'nominal',
        'pengali',
        'total_tarif'
    ];

    public function kategori() 
    { 
        return $this->belongsTo(KategoriKeuangan::class, 'kategori_id'); 
    }
    
    public function tingkat()
    {
        return $this->belongsTo(TingkatKelas::class, 'tingkat_kelas_id');
    }
    
    public function tahunAjaran() 
    { 
        return $this->belongsTo(TahunAjaran::class, 'tahun_ajaran_id'); 
    }
    
    public function semester() 
    { 
        return $this->belongsTo(Semester::class, 'semester_id'); 
    }

    // Opsional: Relasi ke tabel jenjang_kelas
    public function jenjang() 
    { 
        return $this->belongsTo(JenjangKelas::class, 'jenjang_id'); 
    }
}
```

## File: `app/Models/AlokasiWaktu.php`
```php
<?php
namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class AlokasiWaktu extends Model
{
    use HasFactory;
    protected $table = 'alokasi_waktus';
    protected $guarded = ['id'];

    public function jenjangKelas() {
        return $this->belongsTo(JenjangKelas::class, 'jenjang_id');
    }
    public function hari() {
        return $this->belongsTo(Hari::class, 'hari_id');
    }
    public function kategori() {
        return $this->belongsTo(KategoriWaktu::class, 'kategori_id');
    }
    public function durasi() {
        return $this->belongsTo(DurasiWaktu::class, 'durasi_id');
    }
}
```

## File: `app/Models/JadwalMapel.php`
```php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class JadwalMapel extends Model
{
    use HasFactory;

    protected $table = 'jadwal_mapels';
    
    protected $guarded = ['id'];

    public function tahunAjaran()
    {
        return $this->belongsTo(TahunAjaran::class, 'tahun_ajaran_id');
    }

    public function semester()
    {
        return $this->belongsTo(Semester::class, 'semester_id');
    }

    public function kelas()
    {
        return $this->belongsTo(Kelas::class, 'kelas_id');
    }

    public function guruMapel()
    {
        return $this->belongsTo(GuruMapel::class, 'guru_mapel_id');
    }
}
```

## File: `app/Models/Semester.php`
```php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Semester extends Model
{
    use HasFactory;

    protected $table = 'semesters';
    
    protected $fillable = [
        'nama',
        'jenis_periode',
        'is_active',
    ];
}
```

## File: `app/Models/KategoriBerita.php`
```php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class KategoriBerita extends Model
{
    use HasFactory;
    protected $table = 'kategori_beritas';
    protected $fillable = ['nama_kategori', 'slug'];

    public function beritas()
    {
        return $this->hasMany(Berita::class);
    }
}
```

## File: `app/Models/ProfilSekolah.php`
```php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;

class ProfilSekolah extends Model {
    protected $table = 'profil_sekolahs';
    protected $fillable = [
        'nama_madrasah','nsm_npsn','tahun_berdiri','logo_path',
        'alamat','google_maps_iframe','telepon','email','website',
        'visi','misi','keunggulan','sejarah',
        'prestasi','program_unggulan','fasilitas'
    ];
    protected $casts = [
        'prestasi' => 'array',
        'program_unggulan' => 'array',
        'fasilitas' => 'array',
    ];
}
```

## File: `app/Models/User.php`
```php
<?php

namespace App\Models;

use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable
{
    use Notifiable;

    protected $fillable = [
        'name',
        'username',
        'password',
        'role',
        'is_active',
    ];

    protected $hidden = [
        'password',
        'remember_token',
    ];

    protected function casts(): array
    {
        return [
            'password' => 'hashed',
        ];
    }

    public function siswa()
    {
        return $this->hasOne(Siswa::class, 'user_id');
    }
}
```

## File: `app/Models/JenjangKelas.php`
```php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class JenjangKelas extends Model
{
    use HasFactory;

    protected $table = 'jenjang_kelas';
    protected $fillable = ['kode', 'nama_jenjang', 'sistem_akademik', 'deskripsi'];

    public function tingkat()
    {
        return $this->hasMany(TingkatKelas::class, 'jenjang_kelas_id', 'id');
    }

    public function tingkats()
    {
        return $this->hasMany(TingkatKelas::class, 'jenjang_kelas_id');
    }

    public function gurus()
    {
        return $this->belongsToMany(Guru::class, 'guru_jenjang', 'jenjang_kelas_id', 'guru_id');
    }
}
```

## File: `app/Models/Nilai.php`
```php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Nilai extends Model
{
    use HasFactory;

    protected $table = 'nilais';
    protected $guarded = ['id']; 

    public function siswa() {
        return $this->belongsTo(Siswa::class, 'siswa_id');
    }

    public function guruMapel() {
        return $this->belongsTo(GuruMapel::class, 'guru_mapel_id');
    }

    public function tahunAjaran() {
        return $this->belongsTo(TahunAjaran::class, 'tahun_ajaran_id');
    }

    public function semester() {
        return $this->belongsTo(Semester::class, 'semester_id');
    }
}
```

## File: `app/Models/Kelas.php`
```php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Kelas extends Model
{
    use HasFactory;
    protected $table = 'kelas';
    protected $fillable = ['tingkat_kelas_id', 'nama_kelas', 'kapasitas'];

    public function tingkat() {
        return $this->belongsTo(TingkatKelas::class, 'tingkat_kelas_id');
    }

    public function details()
    {
        return $this->hasMany(KelasDetail::class, 'kelas_id');
    }

    public function siswa()
    {
        return $this->hasMany(Siswa::class, 'kelas_id');
    }
}
```

## File: `app/Models/KategoriKeuangan.php`
```php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class KategoriKeuangan extends Model
{
    use HasFactory;
    
    protected $table = 'kategori_keuangans';
    
    protected $fillable = [
        'jenjang_id', 
        'nama', 
        'tipe', 
        'keterangan'
    ]; 

    public function jenjang() 
    { 
        return $this->belongsTo(JenjangKelas::class, 'jenjang_id'); 
    }
    
    public function tarifs() 
    { 
        return $this->hasMany(TarifKeuangan::class, 'kategori_id'); 
    }
}
```

## File: `app/Models/Ppdb.php`
```php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Ppdb extends Model
{
    use HasFactory;

    protected $table = 'ppdbs';

    protected $fillable = [
        'no_pendaftaran',
        'tahun_ajaran_id', 
        'jenjang_id',
        'tanggal_daftar',
        'kelas_id',
        'nama_lengkap',
        'tempat_lahir',
        'tanggal_lahir',
        'jenis_kelamin',
        'agama',
        'jenis_pendaftaran',
        'nis', 
        'nisn',
        'asal_sekolah',
        'no_hp',
        'status',
    ];

    public function kelas()
    {
        return $this->belongsTo(Kelas::class, 'kelas_id');
    }

    public function tahunAjaran()
    {
        return $this->belongsTo(TahunAjaran::class, 'tahun_ajaran_id');
    }

    public function jenjang()
    {
        return $this->belongsTo(JenjangKelas::class, 'jenjang_id');
    }


    private function convertToHijri($date)
    {
        if (!$date) return '-';
        
        $timestamp = strtotime($date);
        if (!$timestamp) return '-';

        $y = (int)date('Y', $timestamp);
        $m = (int)date('n', $timestamp);
        $d = (int)date('j', $timestamp);

        if (($y > 1582) || (($y == 1582) && ($m > 10)) || (($y == 1582) && ($m == 10) && ($d > 14))) {
            $jd = (int)((1461 * ($y + 4800 + (int)(($m - 14) / 12))) / 4) +
                  (int)((367 * ($m - 2 - 12 * ((int)(($m - 14) / 12)))) / 12) -
                  (int)((3 * ((int)(($y + 4900 + (int)(($m - 14) / 12)) / 100))) / 4) +
                  $d - 32075;
        } else {
            $jd = 367 * $y - (int)((7 * ($y + 5001 + (int)(($m - 9) / 7))) / 4) +
                  (int)((275 * $m) / 9) + $d + 1729777;
        }

        $l = $jd - 1948440 + 10632;
        $n = (int)(($l - 1) / 10631);
        $l = $l - 10631 * $n + 354;
        $j = ((int)((10985 - $l) / 5316)) * ((int)((50 * $l) / 17719)) +
             ((int)($l / 5670)) * ((int)((43 * $l) / 15238));
        $l = $l - ((int)((30 - $j) / 15)) * ((int)((17719 * $j) / 50)) -
             ((int)($j / 16)) * ((int)((15238 * $j) / 43)) + 29;

        $m = (int)((24 * $l) / 709);
        $d = $l - (int)((709 * $m) / 24);
        $y = 30 * $n + $j - 30;

        $bulanHijri = [
            1 => 'Muharram', 'Safar', 'Rabiul Awal', 'Rabiul Akhir',
            'Jumadil Awal', 'Jumadil Akhir', 'Rajab', 'Sya\'ban',
            'Ramadhan', 'Syawal', 'Dzulqa\'dah', 'Dzulhijjah'
        ];

        return $d . ' ' . $bulanHijri[$m] . ' ' . $y . ' H';
    }

    public function getTanggalDaftarHijriyahAttribute()
    {
        return $this->convertToHijri($this->tanggal_daftar);
    }

    public function getTanggalLahirHijriyahAttribute()
    {
        return $this->convertToHijri($this->tanggal_lahir);
    }
}
```

## File: `app/Models/Berita.php`
```php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Berita extends Model
{
    use HasFactory;
    protected $table = 'beritas';
    protected $fillable = [
        'kategori_berita_id', 'user_id', 'judul', 'slug', 'excerpt', 
        'konten', 'thumbnail', 'status', 'seo_title', 'seo_keywords', 'seo_description', 'views'
    ];

    public function kategori()
    {
        return $this->belongsTo(KategoriBerita::class, 'kategori_berita_id');
    }

    public function author()
    {
        return $this->belongsTo(User::class, 'user_id');
    }
}
```

## File: `app/Models/Galeri.php`
```php
<?php
namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Galeri extends Model
{
    use HasFactory;

    protected $table = 'galeris';

    protected $fillable = [
        'judul', 
        'deskripsi', 
        'tipe',
        'batch_id', 
        'file_path', 
        'video_url'
    ];
}
```

## File: `app/Models/Staff.php`
```php
<?php
// app/Models/Staff.php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Staff extends Model
{
    use HasFactory;

    protected $table = 'staffs';

    protected $guarded = ['id'];

    public function jabatans()
    {
        return $this->belongsToMany(Jabatan::class, 'staff_jabatan', 'staff_id', 'jabatan_id');
    }

    public function tabungan()
    {
        return $this->hasOne(NasabahTabungan::class, 'staff_id');
    }

    private function convertToHijri($dateString)
    {
        if (!$dateString) return '-';
        try {
            $date = new \DateTime($dateString);
            $formatter = new \IntlDateFormatter(
                'id_ID@calendar=islamic-umalqura',
                \IntlDateFormatter::LONG,
                \IntlDateFormatter::NONE,
                'Asia/Jakarta',
                \IntlDateFormatter::TRADITIONAL,
                'd MMMM yyyy'
            );
            return $formatter->format($date) . ' H';
        } catch (\Exception $e) {
            return '-';
        }
    }

    public function getTanggalLahirHijriyahAttribute()
    {
        return $this->convertToHijri($this->tanggal_lahir);
    }

    public function getTanggalCpnsHijriyahAttribute()
    {
        return $this->convertToHijri($this->tanggal_cpns);
    }

    public function getTmtPnsHijriyahAttribute()
    {
        return $this->convertToHijri($this->tmt_pns);
    }
}
```

## File: `app/Models/Mapel.php`
```php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Mapel extends Model
{
    use HasFactory;

    protected $table = 'mapels';
    protected $fillable = ['jenjang_kelas_id', 'kategori_mapel_id', 'nama_mapel'];

    public function jenjang()
    {
        return $this->belongsTo(JenjangKelas::class, 'jenjang_kelas_id');
    }

    public function kategori()
    {
        return $this->belongsTo(KategoriMapel::class, 'kategori_mapel_id');
    }
}
```

## File: `app/Models/Testimoni.php`
```php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;

class Testimoni extends Model {
    protected $fillable = ['siswa_id', 'nama', 'peran', 'foto', 'pesan'];

    public function siswa() {
        return $this->belongsTo(Siswa::class, 'siswa_id');
    }
}
```

## File: `app/Models/DurasiWaktu.php`
```php
<?php
namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class DurasiWaktu extends Model
{
    use HasFactory;
    protected $table = 'durasi_waktus';
    protected $guarded = ['id'];
}
```

## File: `app/Models/Guru.php`
```php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Guru extends Model
{
    use HasFactory;

    protected $table = 'gurus';
    protected $guarded = ['id'];

    public function jabatans()
    {
        return $this->belongsToMany(Jabatan::class, 'guru_jabatan', 'guru_id', 'jabatan_id');
    }

    public function tabungan()
    {
        return $this->hasOne(NasabahTabungan::class, 'guru_id');
    }

    public function jenjangKelas()
    {
        return $this->belongsToMany(JenjangKelas::class, 'guru_jenjang', 'guru_id', 'jenjang_kelas_id');
    }

    private function convertToHijri($dateString)
    {
        // 1. Cek validitas data dasar
        if (empty($dateString) || $dateString === '0000-00-00' || $dateString === '1970-01-01') {
            return '-';
        }

        try {
            $timestamp = strtotime($dateString);
            if (!$timestamp) {
                return '-';
            }

            $d = (int)date('j', $timestamp);
            $m = (int)date('n', $timestamp);
            $y = (int)date('Y', $timestamp);

            // 4. Logika Algoritma Kuwaiti
            if (($y > 1582) || (($y == 1582) && ($m > 10)) || (($y == 1582) && ($m == 10) && ($d > 14))) {
                $jd = (int)((1461 * ($y + 4800 + (int)(($m - 14) / 12))) / 4) +
                      (int)((367 * ($m - 2 - 12 * ((int)(($m - 14) / 12)))) / 12) -
                      (int)((3 * ((int)(($y + 4900 + (int)(($m - 14) / 12)) / 100))) / 4) + $d - 32075;
            } else {
                $jd = 367 * $y - (int)((7 * ($y + 5001 + (int)(($m - 9) / 7))) / 4) +
                      (int)((275 * $m) / 9) + $d + 1729777;
            }

            $l = $jd - 1948440 + 10632;
            $n = (int)(($l - 1) / 10631);
            $l = $l - 10631 * $n + 354;
            $j = ((int)((10985 - $l) / 5316)) * ((int)((50 * $l) / 17719)) +
                 ((int)($l / 5670)) * ((int)((43 * $l) / 15238));
            $l = $l - ((int)((30 - $j) / 15)) * ((int)((17719 * $j) / 50)) -
                 ((int)($j / 16)) * ((int)((15238 * $j) / 43)) + 29;
            
            $m_hijri = (int)((24 * $l) / 709);
            $d_hijri = $l - (int)((709 * $m_hijri) / 24);
            $y_hijri = 30 * $n + $j - 30;

            $bulanHijriah = [
                1 => 'Muharram', 2 => 'Safar', 3 => 'Rabiul Awal', 4 => 'Rabiul Akhir',
                5 => 'Jumadil Awal', 6 => 'Jumadil Akhir', 7 => 'Rajab', 8 => 'Sya\'ban',
                9 => 'Ramadhan', 10 => 'Syawal', 11 => 'Dzulqa\'idah', 12 => 'Dzulhijjah'
            ];

            return $d_hijri . ' ' . $bulanHijriah[$m_hijri] . ' ' . $y_hijri . ' H';

        } catch (\Exception $e) {
            return '-';
        }
    }

    public function getTanggalLahirHijriyahAttribute() {
        return $this->convertToHijri($this->tanggal_lahir);
    }

    public function getTanggalCpnsHijriyahAttribute() {
        return $this->convertToHijri($this->tanggal_cpns);
    }

    public function getTmtPnsHijriyahAttribute() {
        return $this->convertToHijri($this->tmt_pns);
    }
}
```

## File: `app/Models/KelasDetail.php`
```php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class KelasDetail extends Model
{
    use HasFactory;
    protected $table = 'kelas_details';
    protected $fillable = ['kelas_id', 'gender_id', 'kapasitas'];

    public function kelas() {
        return $this->belongsTo(Kelas::class, 'kelas_id');
    }
    public function gender() {
        return $this->belongsTo(Gender::class, 'gender_id');
    }
}
```

## File: `app/Models/PresensiGuru.php`
```php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class PresensiGuru extends Model
{
    use HasFactory;

    protected $table = 'presensi_gurus';
    
    protected $guarded = ['id'];

    public function guru()
    {
        return $this->belongsTo(Guru::class, 'guru_id');
    }
}
```

## File: `app/Models/TingkatKelas.php`
```php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class TingkatKelas extends Model
{
    use HasFactory;
    protected $table = 'tingkat_kelas';
    protected $fillable = ['jenjang_kelas_id', 'nama_tingkat', 'deskripsi'];

    public function jenjang() {
        return $this->belongsTo(JenjangKelas::class, 'jenjang_kelas_id');
    }

    public function kelas()
    {
        return $this->hasMany(Kelas::class, 'tingkat_kelas_id');
    }

    public function kelases()
    {
        return $this->hasMany(Kelas::class, 'tingkat_kelas_id');
    }
}
```

## File: `app/Models/PesanKontak.php`
```php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;

class PesanKontak extends Model {
    protected $fillable = ['nama', 'email', 'no_hp', 'subjek', 'pesan', 'is_read'];
}
```

## File: `app/Models/KategoriWaktu.php`
```php
<?php
namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class KategoriWaktu extends Model
{
    use HasFactory;
    protected $table = 'kategori_waktus';
    protected $guarded = ['id'];
}
```

## File: `app/Models/NasabahTabungan.php`
```php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class NasabahTabungan extends Model
{
    use HasFactory;

    protected $table = 'nasabah_tabungans';
    protected $guarded = ['id']; 

    public function guru()
    {
        return $this->belongsTo(Guru::class, 'guru_id');
    }

    public function staff()
    {
        return $this->belongsTo(Staff::class, 'staff_id');
    }

    public function siswa()
    {
        return $this->belongsTo(Siswa::class, 'siswa_id');
    }

    public function mutasi()
    {
        return $this->hasMany(TransaksiTabungan::class, 'nasabah_tabungan_id');
    }

    public function getEntitasProfilAttribute()
    {
        if ($this->kode_kategori == '01') return 'Guru & Staff';
        if ($this->kode_kategori == '02') return 'Siswa / Santri';
        return 'Masyarakat Umum';
    }
}
```

## File: `app/Models/TahunAjaran.php`
```php
<?php
// app/Models/TahunAjaran.php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class TahunAjaran extends Model
{
    use HasFactory;

    protected $table = 'tahun_ajarans';

    protected $fillable = [
        'tahun_ajaran',
        'tahun_ajaran_hijriyah',
        'tahun_ppdb',
        'tahun_ppdb_hijriyah', 
        'kode',
        'status_akademik',
        'status_ppdb',
        'tgl_mulai',
        'tgl_mulai_hijriyah', 
        'tgl_akhir',
        'tgl_akhir_hijriyah', 
        'kuota',
    ];
}
```

## File: `app/Models/Ekstrakurikuler.php`
```php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;

class Ekstrakurikuler extends Model {
    protected $fillable = ['nama', 'deskripsi', 'foto', 'jadwal', 'pembina'];
}
```

## File: `app/Models/TransaksiTabungan.php`
```php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class TransaksiTabungan extends Model
{
    use HasFactory;

    protected $table = 'transaksi_tabungans';
    protected $guarded = ['id'];

    public function nasabah()
    {
        return $this->belongsTo(NasabahTabungan::class, 'nasabah_tabungan_id');
    }

    private function convertToHijri($date)
    {
        if (!$date) return '-';
        
        $timestamp = strtotime($date);
        if (!$timestamp) return '-';

        $y = (int)date('Y', $timestamp);
        $m = (int)date('n', $timestamp);
        $d = (int)date('j', $timestamp);

        if (($y > 1582) || (($y == 1582) && ($m > 10)) || (($y == 1582) && ($m == 10) && ($d > 14))) {
            $jd = (int)((1461 * ($y + 4800 + (int)(($m - 14) / 12))) / 4) +
                  (int)((367 * ($m - 2 - 12 * ((int)(($m - 14) / 12)))) / 12) -
                  (int)((3 * ((int)(($y + 4900 + (int)(($m - 14) / 12)) / 100))) / 4) +
                  $d - 32075;
        } else {
            $jd = 367 * $y - (int)((7 * ($y + 5001 + (int)(($m - 9) / 7))) / 4) +
                  (int)((275 * $m) / 9) + $d + 1729777;
        }

        $l = $jd - 1948440 + 10632;
        $n = (int)(($l - 1) / 10631);
        $l = $l - 10631 * $n + 354;
        $j = ((int)((10985 - $l) / 5316)) * ((int)((50 * $l) / 17719)) +
             ((int)($l / 5670)) * ((int)((43 * $l) / 15238));
        $l = $l - ((int)((30 - $j) / 15)) * ((int)((17719 * $j) / 50)) -
             ((int)($j / 16)) * ((int)((15238 * $j) / 43)) + 29;

        $m = (int)((24 * $l) / 709);
        $d = $l - (int)((709 * $m) / 24);
        $y = 30 * $n + $j - 30;

        $bulanHijri = [
            1 => 'Muharram', 'Safar', 'Rabiul Awal', 'Rabiul Akhir',
            'Jumadil Awal', 'Jumadil Akhir', 'Rajab', 'Sya\'ban',
            'Ramadhan', 'Syawal', 'Dzulqa\'dah', 'Dzulhijjah'
        ];

        return $d . ' ' . $bulanHijri[$m] . ' ' . $y . ' H';
    }

    public function getTanggalHijriyahAttribute()
    {
        return $this->convertToHijri($this->tanggal_transaksi);
    }
}
```

## File: `app/Models/Siswa.php`
```php
<?php
// app/Models/Siswa.php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Siswa extends Model
{
    use HasFactory;

    protected $table = 'siswas';

    protected $fillable = [
        'user_id', 
        'kelas_id', 
        'tahun_ajaran_id', 
        'jenis_pendaftaran', 
        'status_siswa', 
        'foto',
        'nisn', 
        'nis', 
        'nama_lengkap', 
        'tempat_lahir', 
        'tanggal_lahir', 
        'jenis_kelamin', 
        'nik', 
        'agama', 
        'status_keluarga', 
        'anak_ke', 
        'jumlah_saudara_kandung', 
        'no_reg_akta_lahir', 
        'hobi', 
        'cita_cita',
        'no_kk', 
        'no_kip', 
        'no_pkh', 
        'no_kks',
        'nama_jalan', 
        'dusun', 
        'rt', 
        'rw', 
        'desa', 
        'kecamatan', 
        'kabupaten', 
        'propinsi', 
        'kode_pos',
        'asal_sekolah', 
        'no_seri_ijazah',
        'nama_ayah', 
        'nik_ayah', 
        'pekerjaan_ayah', 
        'penghasilan_ayah', 
        'pendidikan_akhir_ayah', 
        'tanggal_lahir_ayah', 
        'nama_ibu', 
        'nik_ibu', 
        'pekerjaan_ibu', 
        'penghasilan_ibu', 
        'pendidikan_akhir_ibu', 
        'tanggal_lahir_ibu', 
        'no_hp',
        'file_ktp',
        'file_kk',
        'file_kip',
        'file_pkh',
        'file_kks'
    ];

    public function akun()
    {
        return $this->belongsTo(User::class, 'user_id');
    }

    public function kelas()
    {
        return $this->belongsTo(Kelas::class, 'kelas_id');
    }

    public function tahunAjaran()
    {
        return $this->belongsTo(TahunAjaran::class, 'tahun_ajaran_id');
    }

    public function testimoni()
    {
        return $this->hasOne(Testimoni::class, 'siswa_id');
    }

    // RELASI BARU: Tabungan Siswa
    public function tabungan()
    {
        return $this->hasOne(NasabahTabungan::class, 'siswa_id');
    }

    private function convertToHijri($date)
    {
        if (!$date) return '-';
        
        $timestamp = strtotime($date);
        if (!$timestamp) return '-';

        $y = (int)date('Y', $timestamp);
        $m = (int)date('n', $timestamp);
        $d = (int)date('j', $timestamp);

        if (($y > 1582) || (($y == 1582) && ($m > 10)) || (($y == 1582) && ($m == 10) && ($d > 14))) {
            $jd = (int)((1461 * ($y + 4800 + (int)(($m - 14) / 12))) / 4) +
                  (int)((367 * ($m - 2 - 12 * ((int)(($m - 14) / 12)))) / 12) -
                  (int)((3 * ((int)(($y + 4900 + (int)(($m - 14) / 12)) / 100))) / 4) +
                  $d - 32075;
        } else {
            $jd = 367 * $y - (int)((7 * ($y + 5001 + (int)(($m - 9) / 7))) / 4) +
                  (int)((275 * $m) / 9) + $d + 1729777;
        }

        $l = $jd - 1948440 + 10632;
        $n = (int)(($l - 1) / 10631);
        $l = $l - 10631 * $n + 354;
        $j = ((int)((10985 - $l) / 5316)) * ((int)((50 * $l) / 17719)) +
             ((int)($l / 5670)) * ((int)((43 * $l) / 15238));
        $l = $l - ((int)((30 - $j) / 15)) * ((int)((17719 * $j) / 50)) -
             ((int)($j / 16)) * ((int)((15238 * $j) / 43)) + 29;

        $m = (int)((24 * $l) / 709);
        $d = $l - (int)((709 * $m) / 24);
        $y = 30 * $n + $j - 30;

        $bulanHijri = [
            1 => 'Muharram', 'Safar', 'Rabiul Awal', 'Rabiul Akhir',
            'Jumadil Awal', 'Jumadil Akhir', 'Rajab', 'Sya\'ban',
            'Ramadhan', 'Syawal', 'Dzulqa\'dah', 'Dzulhijjah'
        ];

        return $d . ' ' . $bulanHijri[$m] . ' ' . $y . ' H';
    }

    public function getTanggalLahirHijriyahAttribute()
    {
        return $this->convertToHijri($this->tanggal_lahir);
    }
    
    public function getTanggalLahirAyahHijriyahAttribute()
    {
        return $this->convertToHijri($this->tanggal_lahir_ayah);
    }

    public function getTanggalLahirIbuHijriyahAttribute()
    {
        return $this->convertToHijri($this->tanggal_lahir_ibu);
    }
}
```

## File: `app/Models/BerandaSetting.php`
```php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;

class BerandaSetting extends Model {
    protected $table = 'beranda_settings';
    protected $fillable = [
        'hero_title', 'hero_subtitle', 'hero_images', 'stat_siswa', 'stat_guru', 'stat_lulusan',
        'kepsek_nama', 'kepsek_foto', 'kepsek_sambutan'
    ];
    protected $casts = [
        'hero_images' => 'array',
    ];
}
```

## File: `app/Models/KategoriMapel.php`
```php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class KategoriMapel extends Model
{
    use HasFactory;

    protected $table = 'kategori_mapels';

    protected $fillable = [
        'nama_kategori',
    ];

    public function mapels()
    {
        return $this->hasMany(Mapel::class, 'kategori_mapel_id');
    }
}
```

## File: `app/Exports/TemplateSiswaExport.php`
```php
<?php

namespace App\Exports;

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xls; // KITA GUNAKAN XLS (Excel 97-2003) YANG TIDAK BUTUH XMLWRITER
use PhpOffice\PhpSpreadsheet\Style\Fill;

class TemplateSiswaExport
{
    public static function createTemplate($tingkatStr, $dummyHijriyah, $dummyMasehi)
    {
        $spreadsheet = new Spreadsheet();
        $sheet = $spreadsheet->getActiveSheet();

        $columns = [
            'Nama Lengkap', 'Jenis Kelamin (L/P)', 'Tempat Lahir', 'Tanggal Lahir (YYYY-MM-DD)', 
            'NISN', 'Asal Sekolah', 'No HP/WA', 'Jenis Pendaftaran (Baru/Pindahan)', 
            'Tingkat Kelas Tujuan', 'Nama Ruang Kelas Tujuan', 'Target Slot Gender', 
            'Tahun Ajaran Aktif (Hijriah)', 'Tahun Ajaran Aktif (Masehi)'
        ];
        $sheet->fromArray($columns, NULL, 'A1');

        $dummy = [
            ['Ahmad Fauzi', 'L', 'Cirebon', '2010-05-14', '0012345678', 'SMPN 1 Kuningan', '08123456789', 'Baru', $tingkatStr, 'A', 'Putra', $dummyHijriyah, $dummyMasehi],
            ['Siti Aminah', 'P', 'Kuningan', '2010-08-20', '0012345679', 'MTs Al Ikhlas', '08123456780', 'Pindahan', $tingkatStr, 'B', 'Putri', $dummyHijriyah, $dummyMasehi],
            ['Budi Raharjo', 'L', 'Jakarta', '2011-01-05', '', '', '', 'Baru', $tingkatStr, 'C', 'Campuran', $dummyHijriyah, $dummyMasehi]
        ];
        $sheet->fromArray($dummy, NULL, 'A2');

        foreach (range('A', 'M') as $col) {
            $sheet->getColumnDimension($col)->setAutoSize(true);
        }
        $sheet->getStyle('A1:M1')->getFont()->setBold(true);
        $sheet->getStyle('A1:H1')->getFill()->setFillType(Fill::FILL_SOLID)->getStartColor()->setARGB('FFF2F2F2');
        $sheet->getStyle('I1:K1')->getFill()->setFillType(Fill::FILL_SOLID)->getStartColor()->setARGB('FFFFE599');
        $sheet->getStyle('L1:M1')->getFill()->setFillType(Fill::FILL_SOLID)->getStartColor()->setARGB('FFD9EAD3');

        $fileName = "Template_Import_Siswa_Tingkat_{$tingkatStr}.xls";
        $tempPath = storage_path('app/' . $fileName);
        
        $writer = new Xls($spreadsheet);
        $writer->save($tempPath);

        return $tempPath;
    }
}
```

## File: `app/Providers/AppServiceProvider.php`
```php
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     */
    public function register(): void
    {
        //
    }

    /**
     * Bootstrap any application services.
     */
    public function boot(): void
    {
        //
    }
}

```

## File: `routes/web.php`
```php
<?php
// routes/web.php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Public\HomeController;
use App\Http\Controllers\Public\PpdbController as PublicPpdbController;
use App\Http\Controllers\Public\DirektoriController;
use App\Http\Controllers\Public\EkstrakurikulerController as PublicEkskulController;
use App\Http\Controllers\Public\BeritaController as PublicBeritaController;
use App\Http\Controllers\Public\GaleriController as PublicGaleriController;
use App\Http\Controllers\Public\KontakController;
use App\Http\Controllers\AuthController;
use App\Models\ProfilSekolah;

use App\Http\Controllers\Siswa\DashboardController as SiswaDashboardController;

// Halaman utama
Route::get('/', [HomeController::class, 'index'])->name('home');

// Tentang Kami (Statis)
Route::get('/about', function () {
    $profil = ProfilSekolah::first();
    return view('public.about', compact('profil'));
})->name('about');

// Program Unggulan (Statis)
Route::get('/programs', function () {
    $profil = ProfilSekolah::first();
    return view('public.programs', compact('profil'));
})->name('programs');

// Fasilitas (Statis)
Route::get('/facilities', function () {
    $profil = ProfilSekolah::first();
    return view('public.facilities', compact('profil'));
})->name('facilities');

// ROUTE HALAMAN PUBLIK DINAMIS
// Direktori Guru & Staff
Route::get('/direktori-guru', [DirektoriController::class, 'index'])->name('public.guru');

// Direktori Santri / Siswa
Route::get('/direktori-siswa', [DirektoriController::class, 'siswa'])->name('public.siswa');

// Ekstrakurikuler
Route::get('/ekstrakurikuler', [PublicEkskulController::class, 'index'])->name('public.ekskul');

// Berita & Pengumuman Publik
Route::get('/berita', [PublicBeritaController::class, 'index'])->name('public.berita');
Route::get('/berita/{slug}', [PublicBeritaController::class, 'show'])->name('public.berita.show');

// Galeri Publik
Route::get('/galeri', [PublicGaleriController::class, 'index'])->name('public.galeri');

// Kontak & Pesan
Route::get('/kontak', [KontakController::class, 'index'])->name('public.kontak');
Route::post('/kontak/kirim', [KontakController::class, 'store'])->name('public.kontak.store');

// ROUTE PPDB PUBLIK
Route::get('/ppdb', [PublicPpdbController::class, 'landing'])->name('public.ppdb');
Route::get('/ppdb/info', [PublicPpdbController::class, 'index'])->name('public.ppdb.info');
Route::get('/ppdb/daftar', [PublicPpdbController::class, 'create'])->name('public.ppdb.create');
Route::post('/ppdb/daftar', [PublicPpdbController::class, 'store'])->name('public.ppdb.store');
Route::get('/ppdb/berhasil/{no_pendaftaran}', [PublicPpdbController::class, 'success'])->name('public.ppdb.success');

// ROUTE AUTENTIKASI (LOGIN & LOGOUT)
Route::get('/login', [AuthController::class, 'showLoginForm'])->name('login')->middleware('guest');
Route::post('/login', [AuthController::class, 'login'])->middleware('guest');
Route::post('/logout', [AuthController::class, 'logout'])->name('logout')->middleware('auth');

// ROUTE PORTAL MANDIRI SISWA (SIAKAD)
Route::prefix('siswa')->name('siswa.')->middleware(['auth'])->group(function () {
    Route::get('/dashboard', [SiswaDashboardController::class, 'index'])->name('dashboard');
    Route::put('/update-profil', [SiswaDashboardController::class, 'updateProfil'])->name('update-profil');
    Route::post('/update-testimoni', [SiswaDashboardController::class, 'updateTestimoni'])->name('update-testimoni');
});


```

## File: `routes/console.php`
```php
<?php

use Illuminate\Foundation\Inspiring;
use Illuminate\Support\Facades\Artisan;

Artisan::command('inspire', function () {
    $this->comment(Inspiring::quote());
})->purpose('Display an inspiring quote');

```

## File: `routes/admin.php`
```php
<?php
// routes/admin.php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Admin\DashboardController;
use App\Http\Controllers\Admin\ProfilController;
use App\Http\Controllers\Admin\BerandaController;
use App\Http\Controllers\Admin\TahunAjaranController; 
use App\Http\Controllers\Admin\SemesterController;
use App\Http\Controllers\Admin\KategoriMapelController;
use App\Http\Controllers\Admin\MapelController;
use App\Http\Controllers\Admin\GenderController;
use App\Http\Controllers\Admin\JenjangKelasController;
use App\Http\Controllers\Admin\TingkatKelasController; 
use App\Http\Controllers\Admin\KelasController;
use App\Http\Controllers\Admin\KelasDetailController;
use App\Http\Controllers\Admin\WaliKelasController; 
use App\Http\Controllers\Admin\JabatanController;
use App\Http\Controllers\Admin\GuruController;
use App\Http\Controllers\Admin\PresensiGuruController;
use App\Http\Controllers\Admin\StaffController;
use App\Http\Controllers\Admin\GuruMapelController;
use App\Http\Controllers\Admin\AlokasiWaktuController;
use App\Http\Controllers\Admin\HariController;
use App\Http\Controllers\Admin\KategoriWaktuController;
use App\Http\Controllers\Admin\DurasiWaktuController;
use App\Http\Controllers\Admin\JadwalMapelController;
use App\Http\Controllers\Admin\SiswaController;
use App\Http\Controllers\Admin\AbsensiController;
use App\Http\Controllers\Admin\PpdbController;
use App\Http\Controllers\Admin\KeuanganKategoriController;
use App\Http\Controllers\Admin\KeuanganTarifController;
use App\Http\Controllers\Admin\KeuanganSiswaController;
use App\Http\Controllers\Admin\GajiKategoriController;
use App\Http\Controllers\Admin\TabunganController;
use App\Http\Controllers\Admin\UserController;
use App\Http\Controllers\Admin\KategoriBeritaController;
use App\Http\Controllers\Admin\BeritaController;
use App\Http\Controllers\Admin\GaleriController;
use App\Http\Controllers\Admin\EkstrakurikulerController;
use App\Http\Controllers\Admin\TestimoniController;
use App\Http\Controllers\Admin\PesanKontakController;
use App\Http\Controllers\Admin\PpdbSettingController;
use App\Http\Controllers\Admin\NilaiController;

Route::prefix('admin')->name('admin.')->middleware(['auth'])->group(function () {

    // Dashboard
    Route::get('/', [DashboardController::class, 'index'])->name('dashboard');
    
    // Menu Utama
    Route::get('/beranda', [BerandaController::class, 'edit'])->name('beranda');
    Route::post('/beranda', [BerandaController::class, 'update'])->name('beranda.update');
    Route::delete('/beranda/slider/{index}', [BerandaController::class, 'deleteSlider'])->name('beranda.slider.destroy');
    
    // Profil Sekolah 
    Route::get('/profil', [ProfilController::class, 'edit'])->name('profil');
    Route::put('/profil', [ProfilController::class, 'update'])->name('profil.update');

    // Menu Utama - Kategori Berita
    Route::get('/kategori-berita', [KategoriBeritaController::class, 'index'])->name('kategori-berita');
    Route::post('/kategori-berita', [KategoriBeritaController::class, 'store'])->name('kategori-berita.store');
    Route::put('/kategori-berita/{id}', [KategoriBeritaController::class, 'update'])->name('kategori-berita.update');
    Route::delete('/kategori-berita/{id}', [KategoriBeritaController::class, 'destroy'])->name('kategori-berita.destroy');

    // Menu Utama - Berita & Artikel
    Route::get('/berita', [BeritaController::class, 'index'])->name('berita.index');
    Route::get('/berita/create', [BeritaController::class, 'create'])->name('berita.create');
    Route::post('/berita', [BeritaController::class, 'store'])->name('berita.store');
    Route::get('/berita/{id}/edit', [BeritaController::class, 'edit'])->name('berita.edit');
    Route::put('/berita/{id}', [BeritaController::class, 'update'])->name('berita.update');
    Route::delete('/berita/{id}', [BeritaController::class, 'destroy'])->name('berita.destroy');
    
    // API Summernote Image (Untuk Berita)
    Route::post('/berita/upload-image', [BeritaController::class, 'uploadImage'])->name('berita.uploadImage');
    Route::post('/berita/delete-image', [BeritaController::class, 'deleteImage'])->name('berita.deleteImage');

    // Galeri Foto & Video
    Route::get('/galeri', [GaleriController::class, 'index'])->name('galeri.index');
    Route::get('/galeri/create', [GaleriController::class, 'create'])->name('galeri.create');
    Route::post('/galeri', [GaleriController::class, 'store'])->name('galeri.store');
    Route::get('/galeri/{id}/edit', [GaleriController::class, 'edit'])->name('galeri.edit');
    Route::put('/galeri/{id}', [GaleriController::class, 'update'])->name('galeri.update');
    Route::delete('/galeri/{id}', [GaleriController::class, 'destroy'])->name('galeri.destroy');

    // Ekstrakurikuler
    Route::resource('ekstrakurikuler', EkstrakurikulerController::class)->except(['create', 'show', 'edit']);
    
    // Testimoni Publik
    Route::resource('testimoni', TestimoniController::class)->except(['create', 'show', 'edit']);
    
    // Pesan Masuk / Inbox
    Route::get('/pesan-kontak', [PesanKontakController::class, 'index'])->name('pesan-kontak.index');
    Route::post('/pesan-kontak/{id}/read', [PesanKontakController::class, 'read'])->name('pesan-kontak.read');
    Route::delete('/pesan-kontak/{id}', [PesanKontakController::class, 'destroy'])->name('pesan-kontak.destroy');

    // Data Tahun Ajaran
    Route::get('/tahun-ajaran', [TahunAjaranController::class, 'index'])->name('tahun-ajaran');
    Route::post('/tahun-ajaran', [TahunAjaranController::class, 'store'])->name('tahun-ajaran.store');
    Route::put('/tahun-ajaran/{id}', [TahunAjaranController::class, 'update'])->name('tahun-ajaran.update');
    
    // Data Semester
    Route::get('/semester', [SemesterController::class, 'index'])->name('semester');
    Route::post('/semester', [SemesterController::class, 'store'])->name('semester.store');
    Route::put('/semester/{id}', [SemesterController::class, 'update'])->name('semester.update');
    Route::delete('/semester/{id}', [SemesterController::class, 'destroy'])->name('semester.destroy');
    Route::post('/semester/{id}/aktif', [SemesterController::class, 'toggleAktif'])->name('semester.aktif');
    
    // Kategori Mapel
    Route::get('/kategori-mapel', [KategoriMapelController::class, 'index'])->name('kategori-mapel');
    Route::post('/kategori-mapel', [KategoriMapelController::class, 'store'])->name('kategori-mapel.store');
    Route::put('/kategori-mapel/{id}', [KategoriMapelController::class, 'update'])->name('kategori-mapel.update');
    Route::delete('/kategori-mapel/{id}', [KategoriMapelController::class, 'destroy'])->name('kategori-mapel.destroy');

    // Data Gender
    Route::get('/gender', [GenderController::class, 'index'])->name('gender');
    Route::put('/gender/{id}', [GenderController::class, 'update'])->name('gender.update');

    // Data Jenjang Kelas
    Route::get('/jenjang-kelas', [JenjangKelasController::class, 'index'])->name('jenjang-kelas');
    Route::post('/jenjang-kelas', [JenjangKelasController::class, 'store'])->name('jenjang-kelas.store');
    Route::put('/jenjang-kelas/{id}', [JenjangKelasController::class, 'update'])->name('jenjang-kelas.update');
    Route::delete('/jenjang-kelas/{id}', [JenjangKelasController::class, 'destroy'])->name('jenjang-kelas.destroy');

    // Data Tingkat Kelas 
    Route::get('/jenjang-kelas/{jenjang_id}/tingkat', [TingkatKelasController::class, 'index'])->name('tingkat-kelas.index');
    Route::post('/jenjang-kelas/{jenjang_id}/tingkat', [TingkatKelasController::class, 'store'])->name('tingkat-kelas.store');
    Route::put('/tingkat-kelas/{id}', [TingkatKelasController::class, 'update'])->name('tingkat-kelas.update');
    Route::delete('/tingkat-kelas/{id}', [TingkatKelasController::class, 'destroy'])->name('tingkat-kelas.destroy');

    // Data Ruang Kelas
    Route::get('/tingkat-kelas/{tingkat_id}/kelas', [KelasController::class, 'index'])->name('kelas.index');
    Route::post('/tingkat-kelas/{tingkat_id}/kelas', [KelasController::class, 'store'])->name('kelas.store');
    Route::put('/kelas/{id}', [KelasController::class, 'update'])->name('kelas.update');
    Route::delete('/kelas/{id}', [KelasController::class, 'destroy'])->name('kelas.destroy');

    // Data Detail Kelas (Gender & Kapasitas)
    Route::get('/kelas/{kelas_id}/detail', [KelasDetailController::class, 'index'])->name('kelas-detail.index');
    Route::post('/kelas/{kelas_id}/detail', [KelasDetailController::class, 'store'])->name('kelas-detail.store');
    Route::put('/kelas-detail/{id}', [KelasDetailController::class, 'update'])->name('kelas-detail.update');
    Route::delete('/kelas-detail/{id}', [KelasDetailController::class, 'destroy'])->name('kelas-detail.destroy');

    // Wali Kelas 
    Route::get('/wali-kelas/jenjang/{jenjang_id}', [WaliKelasController::class, 'jenjang'])->name('wali-kelas.jenjang');
    Route::post('/wali-kelas/store-or-update', [WaliKelasController::class, 'storeOrUpdate'])->name('wali-kelas.store_or_update');

    // Mata Pelajaran Dinamis berdasarkan Jenjang
    Route::get('/jenjang-kelas/{jenjang_id}/mapel', [MapelController::class, 'index'])->name('mapel.index');
    Route::post('/jenjang-kelas/{jenjang_id}/mapel', [MapelController::class, 'store'])->name('mapel.store');
    Route::put('/mapel/{id}', [MapelController::class, 'update'])->name('mapel.update');
    Route::delete('/mapel/{id}', [MapelController::class, 'destroy'])->name('mapel.destroy');

    // Data Jabatan
    Route::get('/jabatan', [JabatanController::class, 'index'])->name('jabatan');
    Route::post('/jabatan', [JabatanController::class, 'store'])->name('jabatan.store');
    Route::put('/jabatan/{id}', [JabatanController::class, 'update'])->name('jabatan.update');
    Route::delete('/jabatan/{id}', [JabatanController::class, 'destroy'])->name('jabatan.destroy');
    
    // PPDB (Penerimaan Peserta Didik Baru)
    Route::get('/ppdb/pengaturan', [PpdbSettingController::class, 'edit'])->name('ppdb.pengaturan');
    Route::put('/ppdb/pengaturan', [PpdbSettingController::class, 'update'])->name('ppdb.pengaturan.update');
    
    // Data Calon Siswa (PPDB)
    Route::get('/ppdb', [PpdbController::class, 'index'])->name('ppdb');
    Route::get('/ppdb/tambah', [PpdbController::class, 'create'])->name('ppdb.create');
    Route::post('/ppdb', [PpdbController::class, 'store'])->name('ppdb.store');
    Route::get('/ppdb/get-no-pendaftaran/{tahun_ajaran_id}/{jenjang_id}', [PpdbController::class, 'getNoPendaftaran'])->name('ppdb.getNoPendaftaran');
    Route::get('/ppdb/{id}/edit', [PpdbController::class, 'edit'])->name('ppdb.edit');
    Route::put('/ppdb/{id}', [PpdbController::class, 'update'])->name('ppdb.update');
    Route::delete('/ppdb/{id}', [PpdbController::class, 'destroy'])->name('ppdb.destroy');
    
    // DATA SISWA (HUB & SUB-MENU)
    Route::get('/siswa/rekap', [SiswaController::class, 'rekap'])->name('siswa.rekap');
    Route::get('/siswa', [SiswaController::class, 'index'])->name('siswa');
    Route::get('/siswa/jenjang/{jenjang_id}/tingkat/{tingkat_id}', [SiswaController::class, 'indexTingkat'])->name('siswa.tingkat'); 
    Route::get('/siswa/tambah', [SiswaController::class, 'create'])->name('siswa.create');
    Route::post('/siswa', [SiswaController::class, 'store'])->name('siswa.store');
    Route::get('/siswa/get-nis-lokal/{tahun_ajaran_id}/{jenjang_id}', [SiswaController::class, 'getNisLokal'])->name('siswa.getNisLokal');
    Route::delete('/siswa/{id}', [SiswaController::class, 'destroy'])->name('siswa.destroy');

    Route::get('/siswa/template-import', [SiswaController::class, 'templateImport'])->name('siswa.template-import');
    Route::post('/siswa/import', [SiswaController::class, 'importData'])->name('siswa.import');

    // Sub-Menu / Halaman Profil Siswa
    Route::get('/siswa/{id}/edit', [SiswaController::class, 'edit'])->name('siswa.edit'); 
    Route::put('/siswa/{id}', [SiswaController::class, 'update'])->name('siswa.update');
    Route::post('/siswa/{id}/toggle-akun', [SiswaController::class, 'toggleAkun'])->name('siswa.toggle-akun');
    Route::post('/siswa/{id}/generate-akun', [SiswaController::class, 'generateAkun'])->name('siswa.generate-akun');
    Route::get('/siswa/{id}/jadwal', [SiswaController::class, 'jadwal'])->name('siswa.jadwal');
    Route::get('/siswa/{id}/absensi', [SiswaController::class, 'absensi'])->name('siswa.absensi');
    Route::get('/siswa/{id}/nilai', [SiswaController::class, 'nilai'])->name('siswa.nilai');
    Route::get('/siswa/{id}/keuangan', [SiswaController::class, 'keuangan'])->name('siswa.keuangan');
    Route::get('/siswa/{id}/testimoni', [SiswaController::class, 'testimoni'])->name('siswa.testimoni');
    Route::post('/siswa/{id}/testimoni', [SiswaController::class, 'storeTestimoni'])->name('siswa.testimoni.store');

    // Modul Absensi (Action)
    Route::post('/absensi', [AbsensiController::class, 'store'])->name('absensi.store');
    Route::put('/absensi/{id}', [AbsensiController::class, 'update'])->name('absensi.update');
    Route::delete('/absensi/{id}', [AbsensiController::class, 'destroy'])->name('absensi.destroy');

    // Modul Nilai Akademik (Action)
    Route::post('/nilai/store-or-update', [NilaiController::class, 'storeOrUpdate'])->name('nilai.store_or_update');
    Route::delete('/nilai/{id}', [NilaiController::class, 'destroy'])->name('nilai.destroy');

    // Data Guru 
    Route::get('/guru', [GuruController::class, 'index'])->name('guru');

    // --- TAMBAHAN RUTE BARU: PRESENSI GURU ---
    // PERBAIKAN: Urutan route diperbaiki untuk menghindari error parameter.
    Route::get('/presensi-guru', [PresensiGuruController::class, 'index'])->name('presensi-guru');
    Route::post('/presensi-guru/store-bulk', [PresensiGuruController::class, 'storeBulk'])->name('presensi-guru.store-bulk');
    Route::get('/presensi-guru/rekap', [PresensiGuruController::class, 'rekap'])->name('presensi-guru.rekap');
    Route::get('/presensi-guru/jenjang/{jenjang_id}', [PresensiGuruController::class, 'jenjang'])->name('presensi-guru.jenjang');
    Route::get('/presensi-guru/rekap/jenjang/{jenjang_id}', [PresensiGuruController::class, 'rekap'])->name('presensi-guru.rekap.jenjang');
    
    // --- TAMBAHAN RUTE BARU: KELOLA GURU PER JENJANG ---
    Route::get('/guru/jenjang/{id}', [GuruController::class, 'byJenjang'])->name('guru.jenjang');
    Route::post('/guru/jenjang/{id}/assign', [GuruController::class, 'assignJenjang'])->name('guru.jenjang.assign');
    Route::delete('/guru/jenjang/{jenjang_id}/remove/{guru_id}', [GuruController::class, 'removeJenjang'])->name('guru.jenjang.remove');
    
    Route::get('/guru/template-import', [GuruController::class, 'templateImport'])->name('guru.template-import');
    Route::post('/guru/import', [GuruController::class, 'importData'])->name('guru.import');
    Route::get('/guru/tambah', [GuruController::class, 'create'])->name('guru.create');
    Route::post('/guru', [GuruController::class, 'store'])->name('guru.store');
    Route::get('/guru/{id}/edit', [GuruController::class, 'edit'])->name('guru.edit');
    Route::put('/guru/{id}', [GuruController::class, 'update'])->name('guru.update');
    Route::delete('/guru/{id}', [GuruController::class, 'destroy'])->name('guru.destroy');

    // Data Staff 
    Route::get('/staff', [StaffController::class, 'index'])->name('staff');
    Route::get('/staff/template-import', [StaffController::class, 'templateImport'])->name('staff.template-import');
    Route::post('/staff/import', [StaffController::class, 'importData'])->name('staff.import');
    Route::get('/staff/tambah', [StaffController::class, 'create'])->name('staff.create');
    Route::post('/staff', [StaffController::class, 'store'])->name('staff.store');
    Route::get('/staff/{id}/edit', [StaffController::class, 'edit'])->name('staff.edit');
    Route::put('/staff/{id}', [StaffController::class, 'update'])->name('staff.update');
    Route::delete('/staff/{id}', [StaffController::class, 'destroy'])->name('staff.destroy');

    // Guru Mapel (Dibuat Dinamis via Modal & Tahun Ajaran)
    Route::get('/guru-mapel', [GuruMapelController::class, 'index'])->name('guru-mapel');
    Route::get('/guru-mapel/jenjang-tab/{id}', [GuruMapelController::class, 'byJenjang'])->name('guru-mapel.jenjang');
    Route::get('/guru-mapel/get-guru-mapel-data/{guru_id}', [GuruMapelController::class, 'getGuruMapelData']);
    Route::post('/guru-mapel/sync', [GuruMapelController::class, 'syncMapel'])->name('guru-mapel.sync');
    Route::post('/guru-mapel/salin-data', [GuruMapelController::class, 'copyPenugasan'])->name('guru-mapel.copy');

    // MASTER DATA UNTUK ALOKASI WAKTU (Hari, Kategori, Durasi)
    Route::resource('hari', HariController::class)->except(['create', 'show', 'edit']);
    Route::resource('kategori-waktu', KategoriWaktuController::class)->except(['create', 'show', 'edit']);
    Route::resource('durasi-waktu', DurasiWaktuController::class)->except(['create', 'show', 'edit']);

    // Alokasi Waktu Master (Dinamis Per Jenjang)
    Route::get('/alokasi-waktu', [AlokasiWaktuController::class, 'redirectIndex'])->name('alokasi-waktu.index');
    Route::get('/alokasi-waktu/jenjang/{jenjang_id}', [AlokasiWaktuController::class, 'index'])->name('alokasi-waktu.jenjang');
    Route::post('/alokasi-waktu', [AlokasiWaktuController::class, 'store'])->name('alokasi-waktu.store');
    Route::put('/alokasi-waktu/{id}', [AlokasiWaktuController::class, 'update'])->name('alokasi-waktu.update');
    Route::delete('/alokasi-waktu/{id}', [AlokasiWaktuController::class, 'destroy'])->name('alokasi-waktu.destroy');
    Route::get('/alokasi-waktu/hari/{hari}/jenjang/{jenjang_id}', [AlokasiWaktuController::class, 'getByHari']);

    // Jadwal Mapel
    Route::get('/jadwal-mapel/rekap', [JadwalMapelController::class, 'rekap'])->name('jadwal-mapel.rekap');
    Route::get('/jadwal-mapel/jenjang/{jenjang_id}', [JadwalMapelController::class, 'jenjang'])->name('jadwal-mapel.jenjang');
    Route::post('/jadwal-mapel/store', [JadwalMapelController::class, 'store'])->name('jadwal-mapel.store');
    Route::delete('/jadwal-mapel/{id}', [JadwalMapelController::class, 'destroy'])->name('jadwal-mapel.destroy');
    Route::post('/jadwal-mapel/copy', [JadwalMapelController::class, 'copy'])->name('jadwal-mapel.copy');

    // Menu Keuangan
    Route::get('/keuangan/siswa/rekap', [KeuanganSiswaController::class, 'rekap'])->name('keuangan.siswa.rekap');
    
    // RUTE MODUL PENGGAJIAN PEGAWAI
    Route::get('/keuangan/gaji/kategori', [GajiKategoriController::class, 'index'])->name('keuangan.gaji.kategori');
    Route::post('/keuangan/gaji/kategori', [GajiKategoriController::class, 'store'])->name('keuangan.gaji.kategori.store');
    Route::put('/keuangan/gaji/kategori/{id}', [GajiKategoriController::class, 'update'])->name('keuangan.gaji.kategori.update');
    Route::delete('/keuangan/gaji/kategori/{id}', [GajiKategoriController::class, 'destroy'])->name('keuangan.gaji.kategori.destroy');
    
    // Rute Dummy Halaman Gaji Guru (Sementara me-render view langsung)
    Route::view('/keuangan/gaji/guru', 'admin.keuangan.gajih.guru.index')->name('keuangan.gaji.guru');

    Route::get('/keuangan/kategori/jenjang/{jenjang_id}', [KeuanganKategoriController::class, 'index'])->name('keuangan.kategori');
    Route::post('/keuangan/kategori/jenjang/{jenjang_id}', [KeuanganKategoriController::class, 'store'])->name('keuangan.kategori.store');
    Route::put('/keuangan/kategori/{id}', [KeuanganKategoriController::class, 'update'])->name('keuangan.kategori.update');
    Route::delete('/keuangan/kategori/{id}', [KeuanganKategoriController::class, 'destroy'])->name('keuangan.kategori.destroy');

    Route::get('/keuangan/tarif/jenjang/{jenjang_id}', [KeuanganTarifController::class, 'index'])->name('keuangan.tarif');
    Route::post('/keuangan/tarif/jenjang/{jenjang_id}', [KeuanganTarifController::class, 'store'])->name('keuangan.tarif.store');
    Route::put('/keuangan/tarif/{id}', [KeuanganTarifController::class, 'update'])->name('keuangan.tarif.update');
    Route::delete('/keuangan/tarif/{id}', [KeuanganTarifController::class, 'destroy'])->name('keuangan.tarif.destroy');

    Route::get('/keuangan/siswa/jenjang/{jenjang_id}/tingkat/{tingkat_id}', [KeuanganSiswaController::class, 'indexTingkat'])->name('keuangan.siswa.tingkat');
    Route::get('/keuangan/siswa/{id}/transaksi', [KeuanganSiswaController::class, 'transaksi'])->name('keuangan.siswa.transaksi');
    
    Route::post('/keuangan/siswa/{id}/bayar', [KeuanganSiswaController::class, 'storePembayaran'])->name('keuangan.siswa.bayar'); 
    Route::put('/keuangan/siswa/bayar/{id}', [KeuanganSiswaController::class, 'updatePembayaran'])->name('keuangan.siswa.bayar.update');
    Route::delete('/keuangan/siswa/bayar/{id}', [KeuanganSiswaController::class, 'destroyPembayaran'])->name('keuangan.siswa.bayar.destroy');
    
    // --- KEUANGAN TABUNGAN ---
    Route::prefix('tabungan')->name('tabungan.')->group(function () {
        Route::get('/rekap', [TabunganController::class, 'rekapTabungan'])->name('rekap');

        // Tabungan Siswa
        Route::get('/siswa/jenjang/{jenjang_id}/tingkat/{tingkat_id}', [TabunganController::class, 'indexSiswa'])->name('siswa.tingkat');
        Route::post('/siswa/buka-rekening', [TabunganController::class, 'bukaRekeningSiswa'])->name('buka_rekening_siswa');
        
        // Tabungan Pegawai
        Route::get('/pegawai/guru', [TabunganController::class, 'indexGuru'])->name('pegawai.guru');
        Route::post('/pegawai/guru/buka-rekening', [TabunganController::class, 'bukaRekeningGuru'])->name('buka_rekening_guru');
        Route::get('/pegawai/staff', [TabunganController::class, 'indexStaff'])->name('pegawai.staff');
        Route::post('/pegawai/staff/buka-rekening', [TabunganController::class, 'bukaRekeningStaff'])->name('buka_rekening_staff');

        // Tabungan Umum (Masyarakat)
        Route::get('/umum', [TabunganController::class, 'indexUmum'])->name('umum.index');
        Route::post('/umum', [TabunganController::class, 'storeUmum'])->name('umum.store');
        Route::put('/umum/{id}', [TabunganController::class, 'updateUmum'])->name('umum.update');
        Route::delete('/umum/{id}', [TabunganController::class, 'destroyUmum'])->name('umum.destroy');

        // Global Profil & Mutasi Tabungan
        Route::get('/nasabah/{id}', [TabunganController::class, 'show'])->name('show');
        Route::post('/nasabah/{id}/transaksi', [TabunganController::class, 'storeTransaksi'])->name('transaksi');
        Route::put('/nasabah/{id}/profil', [TabunganController::class, 'updateProfilNasabah'])->name('nasabah.update_profil');
        
        Route::get('/nasabah/{id}/cetak-koran', [TabunganController::class, 'cetakRekeningKoran'])->name('cetak_koran');
        Route::get('/nasabah/{id}/cetak-buku', [TabunganController::class, 'cetakBukuTabungan'])->name('cetak_buku');

        Route::put('/mutasi/{id}', [TabunganController::class, 'updateTransaksi'])->name('mutasi.update');
        Route::delete('/mutasi/{id}', [TabunganController::class, 'destroyTransaksi'])->name('mutasi.destroy');
    });

    // Sistem
    Route::view('/pengaturan', 'admin.sistem.pengaturan')->name('pengaturan');
    
    // Rute Profil
    Route::get('/profile-akun', [UserController::class, 'profile'])->name('user.profile');
    Route::put('/profile-akun', [UserController::class, 'updateProfile'])->name('user.profile.update');
});
```

