created:
    - database/factories/MadrasahFactory.php
    - database/factories/TahunAjaranFactory.php
    - database/factories/KelasFactory.php
    - database/factories/KamarFactory.php
    - database/factories/SiswaFactory.php
    - database/factories/RiwayatKelasFactory.php
    - database/factories/JenisPresensiMadrasahFactory.php
    - database/factories/PresensiMadrasahFactory.php
    - database/factories/DetailPresensiMadrasahFactory.php
    - database/factories/JenisPresensiAsramaFactory.php
    - database/factories/PresensiAsramaFactory.php
    - database/factories/DetailPresensiAsramaFactory.php
    - database/migrations/2025_11_25_010711_create_madrasahs_table.php
    - database/migrations/2025_11_25_010712_create_tahun_ajarans_table.php
    - database/migrations/2025_11_25_010713_create_kelas_table.php
    - database/migrations/2025_11_25_010714_create_kamars_table.php
    - database/migrations/2025_11_25_010715_create_siswas_table.php
    - database/migrations/2025_11_25_010716_create_riwayat_kelas_table.php
    - database/migrations/2025_11_25_010717_create_jenis_presensi_madrasahs_table.php
    - database/migrations/2025_11_25_010718_create_presensi_madrasahs_table.php
    - database/migrations/2025_11_25_010719_create_detail_presensi_madrasahs_table.php
    - database/migrations/2025_11_25_010720_create_jenis_presensi_asramas_table.php
    - database/migrations/2025_11_25_010721_create_presensi_asramas_table.php
    - database/migrations/2025_11_25_010722_create_detail_presensi_asramas_table.php
    - app/Models/Madrasah.php
    - app/Models/TahunAjaran.php
    - app/Models/Kelas.php
    - app/Models/Kamar.php
    - app/Models/Siswa.php
    - app/Models/RiwayatKelas.php
    - app/Models/JenisPresensiMadrasah.php
    - app/Models/PresensiMadrasah.php
    - app/Models/DetailPresensiMadrasah.php
    - app/Models/JenisPresensiAsrama.php
    - app/Models/PresensiAsrama.php
    - app/Models/DetailPresensiAsrama.php
    - database/seeders/MadrasahSeeder.php
    - database/seeders/TahunAjaranSeeder.php
    - database/seeders/KelasSeeder.php
    - database/seeders/KamarSeeder.php
    - database/seeders/SiswaSeeder.php
    - database/seeders/RiwayatKelasSeeder.php
    - database/seeders/JenisPresensiMadrasahSeeder.php
    - database/seeders/PresensiMadrasahSeeder.php
    - database/seeders/DetailPresensiMadrasahSeeder.php
    - database/seeders/JenisPresensiAsramaSeeder.php
    - database/seeders/PresensiAsramaSeeder.php
    - database/seeders/DetailPresensiAsramaSeeder.php
models:
    Book: { title: string, author: string, description: text }
    Contact: { name: string }
    Post: { title: string, content: text }
    User: { name: string, email: string, email_verified_at: 'timestamp nullable', password: 'string nullable', remember_token: 'string:100 nullable', avatar_url: 'string nullable' }
    Madrasah: { kode: 'string:10 unique index', nama: string, alamat: 'text nullable', logo: 'string nullable', timestamps: timestamps, softdeletes: softDeletes, relationships: { hasMany: 'Kelas, Kamar, Siswa, User' } }
    TahunAjaran: { nama: 'string:20', tanggal_mulai: date, tanggal_selesai: date, is_aktif: 'boolean default:false', timestamps: timestamps, softdeletes: softDeletes, relationships: { hasMany: 'RiwayatKelas, PresensiMadrasah, PresensiAsrama' } }
    Kelas: { madrasah_id: 'id foreign:madrasah', tingkat: 'string:10', nama: 'string:50', wali_kelas_id: 'id foreign:users nullable', timestamps: timestamps, softdeletes: softDeletes, relationships: { belongsTo: 'Madrasah, WaliKelas:User', hasMany: 'Siswa, PresensiMadrasah, RiwayatKelas' } }
    Kamar: { madrasah_id: 'id foreign:madrasah', nama_kamar: 'string:50', jenis_kelamin: 'enum:L,P', kapasitas: 'integer unsigned default:10', wali_kamar_id: 'id foreign:users nullable', timestamps: timestamps, softdeletes: softDeletes, relationships: { belongsTo: 'Madrasah, WaliKamar:User', hasMany: 'Siswa, PresensiAsrama' } }
    Siswa: { madrasah_id: 'id foreign:madrasah', kelas_id: 'id foreign:kelas', nisn: 'string:20 unique index', nis: 'string:20 nullable index', nik: 'string:20 nullable index', nama: string, jenis_kelamin: 'enum:L,P', tempat_lahir: 'string nullable', tanggal_lahir: 'date nullable', status_tempat_tinggal: 'enum:asrama,non_asrama', kamar_id: 'id foreign:kamar nullable', no_kk: 'string:20 nullable', nama_ayah: 'string nullable', nik_ayah: 'string:20 nullable', pendidikan_ayah: 'string nullable', pekerjaan_ayah: 'string nullable', nama_ibu: 'string nullable', nik_ibu: 'string:20 nullable', pendidikan_ibu: 'string nullable', pekerjaan_ibu: 'string nullable', no_hp_ortu: 'string:20 nullable', alamat: 'text nullable', provinsi: 'string nullable', kabupaten_kota: 'string nullable', kecamatan: 'string nullable', desa_kelurahan: 'string nullable', kode_pos: 'string:10 nullable', timestamps: timestamps, softdeletes: softDeletes, relationships: { belongsTo: 'Madrasah, Kelas, Kamar', hasMany: 'DetailPresensiMadrasah, DetailPresensiAsrama, RiwayatKelas' } }
    RiwayatKelas: { siswa_id: 'id foreign:siswa', kelas_id: 'id foreign:kelas', tahun_ajaran_id: 'id foreign:tahun_ajaran', status: 'enum:aktif,lulus,pindah,do', keterangan: 'text nullable', timestamps: timestamps, relationships: { belongsTo: 'Siswa, Kelas, TahunAjaran' } }
    JenisPresensiMadrasah: { nama: string, kategori: 'enum:kbm,upacara,literasi,ekskul,lainnya', deskripsi: 'text nullable', madrasah_id: 'id foreign:madrasah nullable', is_active: 'boolean default:true', timestamps: timestamps, softdeletes: softDeletes, relationships: { belongsTo: Madrasah, hasMany: PresensiMadrasah } }
    PresensiMadrasah: { tanggal: date, tahun_ajaran_id: 'id foreign:tahun_ajaran', jenis_presensi_madrasah_id: 'id foreign:jenis_presensi_madrasah', kelas_id: 'id foreign:kelas', user_id: 'id foreign:users', keterangan: 'text nullable', is_locked: 'boolean default:false', timestamps: timestamps, softdeletes: softDeletes, relationships: { belongsTo: 'TahunAjaran, JenisPresensiMadrasah, Kelas, User', hasMany: DetailPresensiMadrasah } }
    DetailPresensiMadrasah: { presensi_madrasah_id: 'id foreign:presensi_madrasah', siswa_id: 'id foreign:siswa', status: 'enum:hadir,sakit,izin,alpha', keterangan: 'text nullable', timestamps: timestamps, relationships: { belongsTo: 'PresensiMadrasah, Siswa' } }
    JenisPresensiAsrama: { nama: string, kategori: 'enum:ibadah,bahasa,kebersihan,olahraga,makan,lainnya', sifat: 'enum:wajib,opsional', deskripsi: 'text nullable', is_active: 'boolean default:true', timestamps: timestamps, softdeletes: softDeletes, relationships: { hasMany: PresensiAsrama } }
    PresensiAsrama: { tanggal: date, tahun_ajaran_id: 'id foreign:tahun_ajaran', jenis_presensi_asrama_id: 'id foreign:jenis_presensi_asrama', kamar_id: 'id foreign:kamar', user_id: 'id foreign:users', keterangan: 'text nullable', is_locked: 'boolean default:false', timestamps: timestamps, softdeletes: softDeletes, relationships: { belongsTo: 'TahunAjaran, JenisPresensiAsrama, Kamar, User', hasMany: DetailPresensiAsrama } }
    DetailPresensiAsrama: { presensi_asrama_id: 'id foreign:presensi_asrama', siswa_id: 'id foreign:siswa', status: 'enum:hadir,sakit,izin,alpha', keterangan: 'text nullable', timestamps: timestamps, relationships: { belongsTo: 'PresensiAsrama, Siswa' } }
