<?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");
Wednesday, 1 July 2026
BOOKMARK ONE
- ALIas Perintah di terminal
- BACKUP MOODLE
- BACKUP MOODLE CBT
- BACKUP MOODLE LAPTOP
- CEK FILE YANG DIRUBAH HARI INI
- enable disable WARP
- INSTALL Driver Printer di Ubuntu
- INSTALL MOODLE DEBIAN 10
- Jalankan cloudflared immich laptop
- Jalankan Service Tailscale
- Jalankan web quran lokal
- Matikah hidupkan nginx php
- SET MIKROTIK TKA ONLINE 2 RUANG
Search This Blog
Categories
0ad
(1)
3a
(1)
aac
(1)
adb
(2)
agc
(1)
alias
(1)
alien
(1)
amr
(1)
Android
(14)
Antivirus
(45)
AnyDesk
(1)
appimage
(2)
armbian
(8)
audacity
(1)
autoclean
(1)
autoremove
(18)
backup
(1)
Bahan Ajar
(3)
Bank Soal
(1)
base
(1)
Baterai
(1)
bingai
(1)
bitnami
(1)
Blueman
(1)
Bluetooth
(1)
booklet
(1)
boomaga
(1)
boot
(2)
Booting
(2)
bootstrap
(1)
Boxes
(3)
Brasero
(1)
Brave
(2)
browser
(2)
C++
(2)
Calc
(2)
Calculator
(1)
Calibre
(1)
camera
(1)
canon
(1)
CBT
(2)
CD
(3)
certbot
(1)
chatgpt
(1)
chatting
(1)
chmod
(2)
Chrome
(1)
cli
(1)
clock
(1)
cloudflare
(7)
cloudflared
(4)
colab
(1)
colibre
(1)
color
(1)
Compiz
(2)
composer
(1)
conky
(1)
cron
(2)
crossover
(2)
csf
(1)
cups
(7)
curl
(1)
custom
(6)
datamurid
(1)
dcclock
(1)
dconf-editor
(1)
debian
(24)
decoder
(1)
dhcp
(2)
disk
(4)
dns
(1)
Docker
(6)
Downloads
(83)
dpkg
(1)
draw
(1)
droidcam
(2)
dunst
(1)
dupeguru
(1)
duplex
(1)
DVD
(1)
Ebook
(1)
echo
(1)
Edge
(5)
eduactiv8
(1)
Emerald
(1)
Epson
(5)
error
(1)
exam
(1)
exambro
(1)
exelearning
(4)
exfat
(1)
exfat-utils
(1)
extension
(3)
face-unclok
(1)
face-unlock
(1)
fastboot
(1)
favicon
(2)
fet
(4)
ffmpeg
(5)
file
(3)
firefly
(4)
firefox
(4)
firewall
(1)
firewall log
(2)
flameshot
(4)
flash
(2)
flatpak
(4)
flux
(1)
folder
(3)
Font
(2)
Fonts
(2)
foto
(1)
Foxitreader
(1)
Franz
(1)
Free Office
(3)
fsck
(1)
ftp
(2)
fuse
(2)
gallery
(2)
Game
(13)
gcam
(3)
gdm3
(1)
gedit
(1)
Geogebra
(1)
gespeaker
(1)
ghostscript
(4)
gimp
(9)
git
(3)
github
(3)
Giveaway
(117)
glaxnimate
(1)
globalmenu
(5)
Gnome
(7)
Gnome Box
(3)
Gnome Boxes
(2)
gnome-remote-desktop
(1)
gnome-shell-extension-manager
(1)
gnome-tweaks
(4)
golang
(1)
google cloud
(5)
google drive
(2)
gps
(1)
grep
(2)
Gromit-MPX
(1)
grub
(4)
grub-customizer
(1)
GSConnect
(2)
gstreamer
(1)
Gutenprint
(3)
h.264
(1)
Handphone
(11)
hapus
(1)
hardisk
(2)
hdd
(7)
hide
(2)
Hikmah
(1)
homepage
(1)
hp
(7)
html
(2)
i3wm
(12)
icons
(1)
image
(1)
imagemagick
(15)
Immich
(2)
inkscape
(5)
Internet
(45)
ip
(2)
Iriun
(1)
Itel
(2)
itools
(1)
jq
(1)
json
(1)
jurnalmengajar
(17)
KDEnlive
(5)
kernel
(4)
key
(1)
Key-Mon
(1)
keyworder
(1)
kitty
(1)
Klavaro
(1)
Kolourpaint
(1)
kvm
(1)
Laptop
(15)
libdvd-pkg
(2)
LibreOffice
(30)
libssl. so.3
(1)
lightdm
(1)
live-build
(1)
lock
(1)
log
(2)
lowlatency
(3)
lscpu
(1)
lshw
(2)
lsposed
(1)
lsposes
(2)
magisk
(5)
mail
(1)
malware
(1)
manual duplex
(1)
mariadb
(10)
mediainfo
(1)
mesa-utils
(1)
meson
(1)
meta
(1)
micloud
(1)
mikrotik
(4)
miui
(3)
mlt
(1)
mocp
(2)
modem
(3)
mojave
(1)
Moodle
(144)
motorola
(1)
mp280
(1)
mp3
(1)
mpc
(1)
mpd
(1)
mpeg-4
(1)
mpv
(8)
mysql
(14)
nautilus
(1)
navidrome
(2)
ncmpcpp
(1)
net-tools
(1)
netstat
(1)
network-manager
(3)
nextcloud
(3)
nextDNS
(1)
nginx
(14)
OBS
(5)
Office
(2)
Office 2013
(1)
okular
(2)
optipng
(1)
Orbit Star2
(1)
output
(1)
ownership
(1)
Paint
(1)
panel
(1)
pdf
(13)
pdfcpu
(2)
pdftopmm
(1)
Pengalaman
(6)
photo
(1)
php
(22)
pidgin
(1)
pihole
(1)
pipewire
(2)
pix
(1)
pixel
(3)
PixelLab
(1)
Plank Dock
(3)
playonlinux
(2)
playwright
(3)
plymouth
(1)
Polybar
(1)
PPPoE
(1)
print
(3)
printer
(11)
Printing
(6)
proftpd
(1)
prompt
(1)
Proxy
(2)
pulseaudio
(2)
purge
(1)
PWA
(1)
PyMuPDF
(1)
python
(1)
qemu
(1)
QT app
(1)
quiz
(2)
rar
(1)
recorder
(1)
redshift
(1)
rename
(1)
Review
(6)
rkhunter
(1)
rofi
(1)
root
(4)
rootkit
(1)
ruby
(4)
Ruffle
(1)
samba
(1)
scanner
(2)
scorm
(2)
scratux
(1)
scrcpy
(7)
screen
(2)
screenfetch
(1)
screenshot
(9)
Scribus
(1)
script
(1)
server
(49)
setting
(1)
sgx
(1)
shorcut
(2)
shutterstock
(5)
SiM
(20)
simmarkaz
(1)
simplrescreenrecorder
(1)
situs
(1)
SLIMS
(1)
smalipatcher
(3)
Snap
(5)
Snapd
(2)
Softmaker
(4)
Software
(87)
Sonzi
(1)
sound
(1)
speedtest
(2)
Spotify
(3)
SSD
(2)
ssh
(11)
statusbar
(1)
stb
(5)
steam
(3)
swap
(1)
synaptic
(1)
Systemd-analyze
(8)
tailscale
(2)
targz
(1)
tela
(1)
Telegram
(1)
terminal
(4)
termpdf.py
(2)
theme
(2)
thinkpad
(1)
thumbnail
(1)
thunar
(1)
timetable
(1)
Tips
(36)
TKA
(4)
tmp
(1)
tmpfs
(1)
TRIM
(1)
tunnel
(3)
Tutorial
(22)
tuxtype
(2)
tweak
(1)
TWRP
(1)
Ubuntu
(78)
Ubuntu studio
(1)
ubuntu-restricted-extras
(2)
universalAuth
(1)
unoconv
(2)
unrar
(1)
unzip
(1)
update
(4)
upgradable
(8)
upgrade
(41)
upscale
(2)
usr
(1)
v4l2loopback-utils
(1)
vcdimager
(1)
ventoy
(1)
vercel
(2)
video
(3)
vlc
(1)
vps
(1)
wablas
(2)
warp
(2)
WebKitWebProcess
(1)
wget
(2)
WhatsApp
(8)
WhiteSur
(1)
whyred
(1)
wifi
(6)
wireless
(3)
wordpress
(11)
Workspace
(1)
WPS Office
(8)
xautolock
(1)
xchm
(2)
xclip
(2)
xfce4
(3)
xl
(1)
xlsx
(1)
xorg
(2)
xpad
(2)
xrandr
(1)
youtube-dl
(2)
yt-dlp
(4)
zathura
(2)
Zekr
(1)
zip
(1)
Zoom
(3)
Fisikaku. Powered by Blogger.
Blog Archive
Popular Posts
-
Apabila ada posting link dengan konten video porno di Facebook (FB), sebaiknya jangan diklik. Apalagi Anda menggunakan aplikasi Facebook di...
-
Kali ini saya melakukan ujicoba deteksi virus atau malware untuk sistem Android Kitkat. Ponsel yang saya gunakan New Andromax G2 besutan Sm...
-
Rabu 18 Maret 2026 find /var/www/html/moodle/local/jurnalmengajar/ -type f -daystart -mtime 0 /var/www/html/moodle/local/jurnalmengajar/ind...
0 comments:
Post a Comment