query("SHOW COLUMNS FROM kebutuhan"); while ($row = $r->fetch_assoc()) $cols[] = $row['Field']; check('kebutuhan.id exists', in_array('id', $cols)); check('kebutuhan.penduduk_id exists', in_array('penduduk_id', $cols)); check('kebutuhan.kategori exists', in_array('kategori', $cols)); check('kebutuhan.deskripsi exists', in_array('deskripsi', $cols)); check('kebutuhan.status exists', in_array('status', $cols)); check('kebutuhan.created_by exists', in_array('created_by', $cols)); // ── Tabel riwayat_kebutuhan ──────────────────────────────────────────────── $cols2 = []; $r2 = $conn->query("SHOW COLUMNS FROM riwayat_kebutuhan"); while ($row = $r2->fetch_assoc()) $cols2[] = $row['Field']; check('riwayat_kebutuhan.kebutuhan_id exists', in_array('kebutuhan_id', $cols2)); check('riwayat_kebutuhan.operator_id exists', in_array('operator_id', $cols2)); check('riwayat_kebutuhan.status_baru exists', in_array('status_baru', $cols2)); // ── Tabel kontak_donatur ─────────────────────────────────────────────────── $cols3 = []; $r3 = $conn->query("SHOW COLUMNS FROM kontak_donatur"); while ($row = $r3->fetch_assoc()) $cols3[] = $row['Field']; check('kontak_donatur.nama exists', in_array('nama', $cols3)); check('kontak_donatur.kontak exists', in_array('kontak', $cols3)); check('kontak_donatur.is_read exists', in_array('is_read', $cols3)); // ── Index kebutuhan ──────────────────────────────────────────────────────── $idx = $conn->query("SHOW INDEX FROM kebutuhan"); $idx_names = []; while ($row = $idx->fetch_assoc()) $idx_names[] = $row['Key_name']; check('kebutuhan penduduk index exists', in_array('idx_k_penduduk', $idx_names) || in_array('idx_penduduk', $idx_names)); check('kebutuhan status index exists', in_array('idx_k_status', $idx_names) || in_array('idx_status', $idx_names)); // ── Default status = Belum Terpenuhi ───────────────────────────────────── $default_status = $conn->query( "SELECT COLUMN_DEFAULT FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='kebutuhan' AND COLUMN_NAME='status'" )->fetch_assoc()['COLUMN_DEFAULT']; $default_status = trim((string)$default_status, "'"); check("kebutuhan.status default = 'Belum Terpenuhi'", $default_status === 'Belum Terpenuhi'); // ── kontak_donatur.is_read default = 0 ─────────────────────────────────── $default_read = $conn->query( "SELECT COLUMN_DEFAULT FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='kontak_donatur' AND COLUMN_NAME='is_read'" )->fetch_assoc()['COLUMN_DEFAULT']; check("kontak_donatur.is_read default = 0", $default_read === '0'); // ── ambil.php LEFT JOIN returns kebutuhan_open column ───────────────────── $test_sql = " SELECT pm.id, COALESCE(kstat.kebutuhan_open, 0) AS kebutuhan_open FROM penduduk_miskin pm LEFT JOIN ( SELECT penduduk_id, SUM(CASE WHEN status='Belum Terpenuhi' THEN 1 ELSE 0 END) AS kebutuhan_open FROM kebutuhan GROUP BY penduduk_id ) kstat ON kstat.penduduk_id = pm.id WHERE pm.is_active = 1 AND pm.deleted_at IS NULL LIMIT 1 "; $q = $conn->query($test_sql); check('kebutuhan LEFT JOIN query executes without error', $q !== false); echo "\n--- $pass passed, $fail failed ---\n";