Wednesday, 1 July 2026

debug diagnostik rekap reminder

 <?php
define('CLI_SCRIPT', true);
require_once(__DIR__.'/../../../config.php');

require_once(__DIR__.'/../jam_pelajaran_lib.php');
require_once(__DIR__.'/../jadwal_acuan_lib.php');
require_once(__DIR__.'/../lib.php'); 
require_once(__DIR__.'/../lib_notifikasi.php');// fungsi kirim WA

global $DB;

$cohortmap = [];
$cohorts = $DB->get_records('cohort', null, '', 'id,name');
foreach ($cohorts as $c) {
    $cohortmap[$c->id] = $c->name;
}

$today = date('Y-m-d');
$hariIndo = jurnalmengajar_get_hari_ini();
$current = time();
$todayLabel = tanggal_indo(time());

$jamrekap = '19:50';
$jamsekarang = date('H:i');
//$isrekap = ($jamsekarang >= $jamrekap);
$isrekap = true; //test mode rekap

// ===== Cek hari sekolah =====
$hariSekolah = get_config('local_jurnalmengajar', 'harisekolah');

if (empty($hariSekolah)) {
    $hariSekolah = 'Senin,Selasa,Rabu,Kamis,Jumat';
}

$hariSekolah = array_map('trim', explode(',', $hariSekolah));

if (!in_array($hariIndo, $hariSekolah)) {
    mtrace("Hari $hariIndo bukan hari sekolah.");
    exit(0);
}

// ===== Cek tanggal libur =====
if (jurnalmengajar_cek_libur($today)) {
    mtrace("Hari ini tanggal libur.");
    exit(0);
}

// ===== Cek tanggal asesmen =====
$tanggalasesmen = trim(get_config('local_jurnalmengajar', 'tanggalasesmen'));

if (!empty($tanggalasesmen)) {

    if (preg_match('/(\d{4}-\d{2}-\d{2})\s*s\/d\s*(\d{4}-\d{2}-\d{2})/i',
        $tanggalasesmen,
        $match)) {

        $mulai  = strtotime($match[1]);
        $selesai = strtotime($match[2]);
        $hariini = strtotime($today);

        if ($hariini >= $mulai && $hariini <= $selesai) {
            mtrace("Hari ini berada dalam rentang asesmen.");
            exit(0);
        }
    }
}

mtrace("=== Notifikasi Jurnal Rekap ===");
mtrace("Hari: $hariIndo");

// ===== Ambil jam pelajaran =====
$jam_pelajaran = jurnalmengajar_generate_jam();

// ===== Tentukan jam yang sudah selesai =====
$jam_terlewat = [];
foreach ($jam_pelajaran as $jamke => $jam) {
    $selesai = $jam['selesai'];
    if ($current > strtotime("$today $selesai")) {
        $jam_terlewat[] = $jamke;
    }
}

if (empty($jam_terlewat)) {
    mtrace("Belum ada jam pelajaran yang terlewat.");
    exit(0);
}

mtrace("Jam terlewat: " . implode(',', $jam_terlewat));

// ===== Ambil jurnal hari ini =====
$starttoday = strtotime("$today 00:00:00");
$endtoday   = strtotime("$today 23:59:59");

$jurnaltoday = $DB->get_records_sql("
    SELECT id, userid, kelas, jamke
    FROM {local_jurnalmengajar}
    WHERE timecreated BETWEEN :starttoday AND :endtoday
", [
    'starttoday' => $starttoday,
    'endtoday'   => $endtoday
]);

$filled = [];
foreach ($jurnaltoday as $row) {
    foreach (explode(',', $row->jamke) as $j) {
        $j = (int)trim($j);

        // Samakan kelas dengan jadwal
        $kelas = $row->kelas;
        if (isset($cohortmap[$kelas])) {
            $kelas = $cohortmap[$kelas];
        }

        $key = $row->userid . '-' . $kelas . '-' . $j;
        $filled[$key] = true;

        // Debug
        mtrace("FILLED: " . $key);
    }
}
//

// ===== Ambil jadwal dari database =====
$jadwal_db = $DB->get_records_sql("
    SELECT j.id, j.userid, j.kelas, j.jamke, u.lastname
    FROM {local_jurnalmengajar_jadwal} j
    JOIN {user} u ON u.id = j.userid
    WHERE j.hari = :hari
", [
    'hari' => $hariIndo
]);

$jadwal = [];

foreach ($jadwal_db as $j) {
    $jadwal[] = [
        'userid'   => $j->userid,
        'lastname' => $j->lastname,
        'kelas'    => $j->kelas,
        'jamke'    => $j->jamke
    ];
}

if (empty($jadwal)) {
    mtrace("Tidak ada jadwal di database untuk hari $hariIndo");
    exit(0);
}
mtrace("=== JADWAL ===");
foreach ($jadwal as $j) {
    $k = $j['userid'].'-'.$j['kelas'].'-'.$j['jamke'];
    mtrace("JADWAL: " . $k);
}

// ===== Group jurnal yang belum diisi =====
$pending = [];
$tidakhadir = [];
$cutoff_cache = [];
foreach ($jadwal as $j) {

// 🔥 FILTER CUT OFF MULTI KELAS
$kelas_level = null;

// deteksi kelas (VI, IX, XII)
if (preg_match('/\b(VI|IX|XII)\b/i', $j['kelas'], $match)) {
    $kelas_level = strtoupper($match[1]);
}

if ($kelas_level) {

    if (!isset($cutoff_cache[$kelas_level])) {
        $cutoff_cache[$kelas_level] = jurnalmengajar_get_cutoff_by_kelas($kelas_level, $current);
    }

    $cutoff = $cutoff_cache[$kelas_level];

    if ($cutoff && $current >= $cutoff) {
        continue;
    }
}

// ===== Lewati jika jam belum selesai =====
if (!in_array((int)$j['jamke'], $jam_terlewat)) {
    continue;
}

// ===== Cek Guru Tidak Hadir =====
$status = jurnalmengajar_get_status_takhadir(
    $j['userid'],
    $today
);

if ($status !== false) {

    if (!isset($tidakhadir[$j['userid']])) {

        $tidakhadir[$j['userid']] = [
            'lastname' => $j['lastname'],
            'status'   => $status
        ];
    }

    // Debug: tampilkan semua kelas yang sudah terlewat
    mtrace(
        "TAKHADIR: {$j['lastname']} | {$j['kelas']} | " .
        ucfirst($status)
    );

    continue;
}
    $key = $j['userid'] . '-' . $j['kelas'] . '-' . (int)$j['jamke'];

if (isset($filled[$key])) {
    continue;
}

    if (!isset($pending[$j['userid']])) {
        $pending[$j['userid']] = [
            'lastname' => $j['lastname'],
            'kelasjam' => []
        ];
    }

    if (!isset($pending[$j['userid']]['kelasjam'][$j['kelas']])) {
        $pending[$j['userid']]['kelasjam'][$j['kelas']] = [];
    }

    $pending[$j['userid']]['kelasjam'][$j['kelas']][] = (int)$j['jamke'];
}

if (empty($pending) && empty($tidakhadir)) {
    mtrace("Semua jurnal sudah diisi.");
    exit(0);
}
// ===== Kirim WA per guru =====
$mengirim = 0;

if (!$isrekap) {

    mtrace("Mode: Reminder Guru");

    foreach ($pending as $userid => $info) {

//    $user = $DB->get_record('user', ['id'=>$userid], 'id, firstname, lastname');

    // Ambil nomor WA
    $nowa = $DB->get_field_sql("
        SELECT d.data
        FROM {user_info_data} d
        JOIN {user_info_field} f ON f.id = d.fieldid
        WHERE d.userid = :userid AND f.shortname = 'nowa'
    ", ['userid' => $userid]);

    if (empty($nowa)) {
        mtrace("Tidak ada nomor WA untuk {$info['lastname']}");
        continue;
    }

    $nomor = preg_replace('/[^0-9]/', '', $nowa);

    // Urutkan berdasarkan jam pertama
$urut = [];

foreach ($info['kelasjam'] as $kelas => $jamlist) {
    $jamlist = array_unique($jamlist);
    sort($jamlist);
    $urut[$kelas] = $jamlist;
}

// Sort berdasarkan jam pertama
uasort($urut, function($a, $b) {
    return $a[0] <=> $b[0];
});

$listkelas = "";
$ringkasParts = [];

foreach ($urut as $kelas => $jamlist) {
    $listkelas .= "$kelas jam ke " . implode(',', $jamlist) . "\n";
    $ringkasParts[] = $kelas . ':' . implode(',', $jamlist);
}

    $ringkas = implode('; ', $ringkasParts);

    $datawa = [
        '{guru}'     => $info['lastname'],
        '{tanggal}'  => $todayLabel,
        '{kelasjam}' => trim($listkelas)
    ];

        $res = jm_kirim_template(
        'reminder_jurnal',
        $nomor,
        $datawa
    );

    $pending[$userid]['ringkas'] = $ringkas;
    
    mtrace("Kirim ke $nomor ({$info['lastname']}) -> $res");
    if ($res) {
    $mengirim++;
}

    // ===== Log TXT =====
$logtxt = __DIR__ . '/notif_log_' . date('Y-m-d') . '.txt';

$logstatus = $res ? 'BERHASIL' : 'GAGAL';

$line = date('Y-m-d H:i:s')
      . " | Guru: {$info['lastname']}"
      . " | Nomor: $nomor"
      . " | Kelas/Jam: $ringkas"
      . " | Status: $logstatus"
      . "\n";

file_put_contents($logtxt, $line, FILE_APPEND);
}

} else {

    // Mode rekap: tidak kirim WA ke guru,
    // hanya membuat ringkasan.
    mtrace("Mode: Rekap Admin");

    foreach ($pending as $userid => $info) {

        $urut = [];

        foreach ($info['kelasjam'] as $kelas => $jamlist) {
            $jamlist = array_unique($jamlist);
            sort($jamlist);
            $urut[$kelas] = $jamlist;
        }

        uasort($urut, function($a, $b) {
            return $a[0] <=> $b[0];
        });

        $ringkasParts = [];

        foreach ($urut as $kelas => $jamlist) {
            $ringkasParts[] = $kelas . ':' . implode(',', $jamlist);
        }

        $pending[$userid]['ringkas'] = implode('; ', $ringkasParts);
    }
}

if ($isrekap) {

$daftar = '';
$daftartakhadir = '';

if (empty($tidakhadir)) {
    $daftartakhadir = '-';
}
    
    foreach ($pending as $info) {
        $daftar .= "• {$info['lastname']} - {$info['ringkas']}\n";
    }

foreach ($tidakhadir as $info) {

    $daftartakhadir .=
        "• {$info['lastname']} - " .
        ucfirst($info['status']) .
        "\n";
}

    $datawa = [
        '{tanggal}' => $todayLabel,
        '{daftar}'  => trim($daftar),
        '{jumlah}'  => count($pending),
        '{tidakhadir}'  => trim($daftartakhadir)
    ];

// DEBUG
$config = get_config(
    'local_jurnalmengajar',
    'tujuan_rekap_reminder'
);

mtrace("CONFIG TUJUAN : " . $config);

$nomor = jm_get_nomor_tujuan(
    'rekap_reminder',
    $datawa
);

mtrace("NOMOR TUJUAN:");
print_r($nomor);

$template = jm_get_template('rekap_reminder');

mtrace("TEMPLATE:");
mtrace(empty($template) ? "(KOSONG)" : "ADA");

$res = jm_kirim_template_auto(
    'rekap_reminder',
    $datawa
);

if ($res) {
    mtrace("Rekap reminder dikirim.");
} else {
    mtrace("Rekap reminder gagal.");
}
}

mtrace("Selesai. Total notifikasi dikirim: $mengirim");

Share:

0 comments:

Post a Comment