0;
}
function qcount($konek, $sql) {
$r = @mysqli_query($konek, $sql);
if (!$r) return 0;
$row = mysqli_fetch_row($r);
return $row ? (int)$row[0] : 0;
}
function qval($konek, $sql) {
$r = @mysqli_query($konek, $sql);
if (!$r) return null;
$row = mysqli_fetch_row($r);
return $row ? $row[0] : null;
}
function qall($konek, $sql) {
$out = [];
$r = @mysqli_query($konek, $sql);
if (!$r) return $out;
while ($row = mysqli_fetch_assoc($r)) $out[] = $row;
return $out;
}
function tcount($konek, $table) {
if (!tableExists($konek, $table)) return 0;
return qcount($konek, "SELECT COUNT(*) FROM `$table`");
}
function fmtNum($n) { return number_format((float)$n, 0, ',', '.'); }
function fmtTgl($s) {
if (!$s) return '-';
$t = strtotime($s);
if (!$t) return h($s);
return date('d M Y, H:i', $t);
}
function badgeSex($j) {
$j = strtolower(trim((string)$j));
if (strpos($j, 'l') === 0) return 'Laki-laki';
if (strpos($j, 'p') === 0) return 'Perempuan';
return ''.h($j ?: '-').'';
}
/* ---------------------------------------------------------------------
KPI — RINGKASAN SISTEM
--------------------------------------------------------------------- */
$kpi_atlet_terdaftar = tcount($konek, 'dataatlet');
$kpi_akun_atlet = tcount($konek, 'data_atlet');
$kpi_akun_atlet_aktif = tableExists($konek,'data_atlet') ? qcount($konek, "SELECT COUNT(*) FROM data_atlet WHERE status_kartu=1") : 0;
$kpi_cabor = tcount($konek, 'mastercabor');
$kpi_kabkota = tcount($konek, 'dataprokota');
$kpi_provinsi = tcount($konek, 'dataprovinsi');
$kpi_absensi = tcount($konek, 'absensi_atlet');
$kpi_pemindaian = tcount($konek, 'tb_pemindaian_atlet');
$kpi_aktivasi_qr = tcount($konek, 'log_aktivasi_qr');
$kpi_laporan_performa = tcount($konek, 'laporan_performa_kirim');
$kpi_pesan = tcount($konek, 'pesan_pelatih_atlet');
$kpi_sertifikat = tcount($konek, 'sertifikat_pelatih');
$kpi_tes_dase = tcount($konek, 'hasil_tes_dase');
$kpi_riwayat_melatih = tcount($konek, 'riwayat_melatih');
$kpi_pemindaian_hariini = tableExists($konek,'tb_pemindaian_atlet')
? qcount($konek, "SELECT COUNT(*) FROM tb_pemindaian_atlet WHERE DATE(waktu_scan)=CURDATE()") : 0;
$kpi_absensi_hariini = tableExists($konek,'absensi_atlet')
? qcount($konek, "SELECT COUNT(*) FROM absensi_atlet WHERE DATE(waktu_scan)=CURDATE()") : 0;
$kpi_aktivasi_hariini = tableExists($konek,'log_aktivasi_qr')
? qcount($konek, "SELECT COUNT(*) FROM log_aktivasi_qr WHERE DATE(waktu_aktivasi)=CURDATE()") : 0;
/* Total pelatih unik (gabungan dari beberapa tabel referensi) */
$kpi_pelatih = 0;
$pelatihUnionParts = [];
if (tableExists($konek,'dataatlet')) $pelatihUnionParts[] = "SELECT kode_pelatih k FROM dataatlet WHERE kode_pelatih IS NOT NULL AND kode_pelatih<>''";
if (tableExists($konek,'riwayat_melatih')) $pelatihUnionParts[] = "SELECT kode_pelatih k FROM riwayat_melatih WHERE kode_pelatih IS NOT NULL AND kode_pelatih<>''";
if (tableExists($konek,'sertifikat_pelatih')) $pelatihUnionParts[] = "SELECT kode_pelatih k FROM sertifikat_pelatih WHERE kode_pelatih IS NOT NULL AND kode_pelatih<>''";
if (tableExists($konek,'datakelompok')) $pelatihUnionParts[] = "SELECT kode_pelatih k FROM datakelompok WHERE kode_pelatih IS NOT NULL AND kode_pelatih<>''";
if (tableExists($konek,'tb_pemindaian_atlet')) $pelatihUnionParts[] = "SELECT id_pelatih k FROM tb_pemindaian_atlet WHERE id_pelatih IS NOT NULL AND id_pelatih<>''";
if (!empty($pelatihUnionParts)) {
$kpi_pelatih = qcount($konek, "SELECT COUNT(*) FROM (SELECT DISTINCT k FROM (".implode(" UNION ALL ", $pelatihUnionParts).") u) t");
}
/* Total pengawas unik */
$kpi_pengawas = tableExists($konek,'tb_pemindaian_atlet')
? qcount($konek, "SELECT COUNT(DISTINCT kode_pengawas) FROM tb_pemindaian_atlet WHERE kode_pengawas IS NOT NULL AND kode_pengawas<>''") : 0;
/* ---------------------------------------------------------------------
DATA CHART
--------------------------------------------------------------------- */
// 1) Jenis kelamin atlet
$c_gender = qall($konek, tableExists($konek,'dataatlet')
? "SELECT COALESCE(NULLIF(TRIM(jenisklmin),''),'Tidak diisi') lbl, COUNT(*) jml FROM dataatlet GROUP BY lbl ORDER BY jml DESC" : "SELECT 1 lbl WHERE 1=0");
// 2) Kategori atlet (senior/yunior/prayunior/youth)
$c_kategori = qall($konek, tableExists($konek,'dataatlet')
? "SELECT COALESCE(NULLIF(TRIM(kategriat),''),'Tidak diisi') lbl, COUNT(*) jml FROM dataatlet GROUP BY lbl ORDER BY jml DESC" : "SELECT 1 lbl WHERE 1=0");
// 3) Atlet per cabang olahraga (top 12, dari log pemindaian pengawasan)
$c_cabor = qall($konek, tableExists($konek,'tb_pemindaian_atlet')
? "SELECT COALESCE(NULLIF(TRIM(cabor),''),'Tidak diisi') lbl, COUNT(DISTINCT nik) jml FROM tb_pemindaian_atlet GROUP BY lbl ORDER BY jml DESC LIMIT 12" : "SELECT 1 lbl WHERE 1=0");
if (empty($c_cabor) && tableExists($konek,'absensi_atlet')) {
$c_cabor = qall($konek, "SELECT COALESCE(NULLIF(TRIM(cabor),''),'Tidak diisi') lbl, COUNT(DISTINCT nik) jml FROM absensi_atlet GROUP BY lbl ORDER BY jml DESC LIMIT 12");
}
// 4) Trend pemantauan pengawasan 14 hari terakhir
$c_trend_pemindaian = qall($konek, tableExists($konek,'tb_pemindaian_atlet')
? "SELECT DATE(waktu_scan) tgl, COUNT(*) jml FROM tb_pemindaian_atlet WHERE waktu_scan >= DATE_SUB(CURDATE(), INTERVAL 13 DAY) GROUP BY tgl ORDER BY tgl ASC" : "SELECT 1 tgl WHERE 1=0");
// 5) Trend absensi latihan 14 hari terakhir
$c_trend_absensi = qall($konek, tableExists($konek,'absensi_atlet')
? "SELECT DATE(waktu_scan) tgl, COUNT(*) jml FROM absensi_atlet WHERE waktu_scan >= DATE_SUB(CURDATE(), INTERVAL 13 DAY) GROUP BY tgl ORDER BY tgl ASC" : "SELECT 1 tgl WHERE 1=0");
// 6) Aktivasi QR: Pelatih vs Atlet
$c_qr_jenis = qall($konek, tableExists($konek,'log_aktivasi_qr')
? "SELECT jenis_user lbl, COUNT(*) jml FROM log_aktivasi_qr GROUP BY jenis_user ORDER BY jml DESC" : "SELECT 1 lbl WHERE 1=0");
// 7) Top 10 lokasi pemantauan pengawasan (hasil reverse-geocoding / nama lokasi)
$c_lokasi_pengawasan = qall($konek, tableExists($konek,'tb_pemindaian_atlet')
? "SELECT COALESCE(NULLIF(TRIM(lokasi),''),'Lokasi tidak tercatat') lbl, COUNT(*) jml FROM tb_pemindaian_atlet GROUP BY lbl ORDER BY jml DESC LIMIT 10" : "SELECT 1 lbl WHERE 1=0");
// 8) Top 10 pelatih paling aktif (berdasar jumlah pemantauan atlet binaannya)
$c_pelatih_aktif = qall($konek, tableExists($konek,'tb_pemindaian_atlet')
? "SELECT COALESCE(NULLIF(TRIM(pelatih),''),'Tidak diketahui') lbl, COUNT(*) jml FROM tb_pemindaian_atlet GROUP BY lbl ORDER BY jml DESC LIMIT 10" : "SELECT 1 lbl WHERE 1=0");
// 9) Top 10 pengawas paling aktif
$c_pengawas_aktif = qall($konek, tableExists($konek,'tb_pemindaian_atlet')
? "SELECT COALESCE(NULLIF(TRIM(nama_pengawas),''),'Tidak diketahui') lbl, COUNT(*) jml FROM tb_pemindaian_atlet GROUP BY lbl ORDER BY jml DESC LIMIT 10" : "SELECT 1 lbl WHERE 1=0");
// 10) Rata-rata hasil tes DASE per cabor (top 10 berdasar jumlah peserta)
$c_dase = qall($konek, tableExists($konek,'hasil_tes_dase')
? "SELECT COALESCE(NULLIF(TRIM(cabor),''),'Tidak diisi') lbl, COUNT(*) jml, AVG(hasil_akhir) rata FROM hasil_tes_dase GROUP BY lbl ORDER BY jml DESC LIMIT 10" : "SELECT 1 lbl WHERE 1=0");
// 11) Provinsi -> jumlah kab/kota
$c_wilayah = qall($konek, (tableExists($konek,'dataprovinsi') && tableExists($konek,'dataprokota'))
? "SELECT p.namaprovinsi lbl, COUNT(k.idkota) jml FROM dataprovinsi p LEFT JOIN dataprokota k ON k.idprov=p.kdpro GROUP BY p.kdpro, p.namaprovinsi ORDER BY jml DESC" : "SELECT 1 lbl WHERE 1=0");
// 12) Sertifikat pelatih per jenis sertifikat
$c_sertifikat = qall($konek, tableExists($konek,'sertifikat_pelatih')
? "SELECT COALESCE(NULLIF(TRIM(nama_sertifikat),''),'Tidak diisi') lbl, COUNT(*) jml FROM sertifikat_pelatih GROUP BY lbl ORDER BY jml DESC LIMIT 10" : "SELECT 1 lbl WHERE 1=0");
/* ---------------------------------------------------------------------
DATA TABEL (dibatasi agar halaman tetap ringan; total asli tetap ditampilkan)
--------------------------------------------------------------------- */
$LIMIT = 300;
$t_atlet = qall($konek, tableExists($konek,'dataatlet')
? "SELECT nik, namaatlet, jenisklmin, kategriat, tempatlahir, tgllahir, nowa, kode_pelatih, kode_atlet FROM dataatlet ORDER BY nik DESC LIMIT $LIMIT" : "SELECT 1 WHERE 1=0");
$t_pemindaian = qall($konek, tableExists($konek,'tb_pemindaian_atlet')
? "SELECT nama, nik, kategori, jns_klmn, cabor, pelatih, nama_pengawas, lokasi, waktu_scan FROM tb_pemindaian_atlet ORDER BY waktu_scan DESC LIMIT $LIMIT" : "SELECT 1 WHERE 1=0");
$t_absensi = qall($konek, tableExists($konek,'absensi_atlet')
? "SELECT nama, nik, kategori, jenis_kelamin, cabor, pelatih, lokasi, waktu_scan FROM absensi_atlet ORDER BY waktu_scan DESC LIMIT $LIMIT" : "SELECT 1 WHERE 1=0");
$t_qr = qall($konek, tableExists($konek,'log_aktivasi_qr')
? "SELECT jenis_user, nama, jenis_kartu, nomor_identitas, nama_lokasi, waktu_aktivasi FROM log_aktivasi_qr ORDER BY waktu_aktivasi DESC LIMIT $LIMIT" : "SELECT 1 WHERE 1=0");
$t_laporan = qall($konek, tableExists($konek,'laporan_performa_kirim')
? "SELECT kode_pelatih, nik_atlet, label_periode, tgl_awal, tgl_akhir, waktu_kirim, sudah_dibaca FROM laporan_performa_kirim ORDER BY waktu_kirim DESC LIMIT $LIMIT" : "SELECT 1 WHERE 1=0");
$t_riwayat = qall($konek, tableExists($konek,'riwayat_melatih')
? "SELECT kode_pelatih, nama_klub, tahun_mulai, tahun_selesai, keterangan FROM riwayat_melatih ORDER BY tahun_mulai DESC LIMIT $LIMIT" : "SELECT 1 WHERE 1=0");
$t_sertifikat = qall($konek, tableExists($konek,'sertifikat_pelatih')
? "SELECT kode_pelatih, nama_sertifikat, uploaded_at FROM sertifikat_pelatih ORDER BY uploaded_at DESC LIMIT $LIMIT" : "SELECT 1 WHERE 1=0");
$t_dase = qall($konek, tableExists($konek,'hasil_tes_dase')
? "SELECT nama_peserta, umur, cabor, asal_daerah, nama_pelatih, nama_club, hasil_akhir, tanggal_tes FROM hasil_tes_dase ORDER BY tanggal_tes DESC LIMIT $LIMIT" : "SELECT 1 WHERE 1=0");
$t_pesan = qall($konek, tableExists($konek,'pesan_pelatih_atlet')
? "SELECT kode_pelatih, nik_atlet, isi_pesan, sudah_dibaca, waktu_kirim FROM pesan_pelatih_atlet ORDER BY waktu_kirim DESC LIMIT $LIMIT" : "SELECT 1 WHERE 1=0");
$t_wilayah = qall($konek, (tableExists($konek,'dataprovinsi') && tableExists($konek,'dataprokota'))
? "SELECT p.namaprovinsi, k.namakota FROM dataprokota k LEFT JOIN dataprovinsi p ON p.kdpro=k.idprov ORDER BY p.namaprovinsi, k.namakota" : "SELECT 1 WHERE 1=0");
$t_cabor = qall($konek, tableExists($konek,'mastercabor') ? "SELECT namcabor FROM mastercabor ORDER BY namcabor ASC" : "SELECT 1 WHERE 1=0");
$updated_at = date('d F Y, H:i:s');
?>
SPORTISU — Pusat Pemantauan & Pengawasan
Pusat Pemantauan & Pengawasan SPORTISU
Rekap menyeluruh seluruh aktivitas pembinaan atlet — kehadiran latihan, pemantauan pengawas lapangan, aktivasi kartu digital, hingga laporan performa — mencakup seluruh kabupaten/kota dan provinsi terdaftar.