{"timestamp":1780257072,"date":"history_2026-05-31","data":[{"timestamp":"2026-05-31 00:02:02","raw_log":"[2026-05-31 00:02:02] \u2717 REJECTED: No schedule found for 749 on 2026-05-31 (strict mode)","message":"\u2717 REJECTED: No schedule found for 749 on 2026-05-31 (strict mode)","category":"unknown","severity":"info"},{"timestamp":"2026-05-31 00:02:02","raw_log":"[2026-05-31 00:02:02] \u26a0 ALLOWING FALLBACK: Schedule coverage only 0% for nama=M. Naufal Abel Rafy, kar_id=749","message":"\u26a0 ALLOWING FALLBACK: Schedule coverage only 0% for nama=M. Naufal Abel Rafy, kar_id=749","category":"fallback-mode","severity":"warning","nama":"M. Naufal Abel Rafy","kar_id":"749"},{"timestamp":"2026-05-31 00:02:02","raw_log":"[2026-05-31 00:02:02] \u26a0 FALLBACK: Using time-based detection malam for 749 (SCHEDULE MISSING!)","message":"\u26a0 FALLBACK: Using time-based detection malam for 749 (SCHEDULE MISSING!)","category":"unknown","severity":"info"},{"timestamp":"2026-05-31 00:02:02","raw_log":"[2026-05-31 00:02:02] \u26a0 SHIFT ASSIGNED: malam (source: fallback) for nama=M. Naufal Abel Rafy, kar_id=749","message":"\u26a0 SHIFT ASSIGNED: malam (source: fallback) for nama=M. Naufal Abel Rafy, kar_id=749","category":"unknown","severity":"info","nama":"M. Naufal Abel Rafy","kar_id":"749"},{"timestamp":"2026-05-31 00:02:02","raw_log":"[2026-05-31 00:02:02] Check-in: keputusan=berhasil, nama=M. Naufal Abel Rafy, kar_id=749, id_absensi=207206707, shift=malam, sumber=fallback","message":"Check-in: keputusan=berhasil, nama=M. Naufal Abel Rafy, kar_id=749, id_absensi=207206707, shift=malam, sumber=fallback","category":"check-in-berhasil","severity":"success","nama":"M. Naufal Abel Rafy","kar_id":"749","shift":"malam","source":"fallback"},{"timestamp":"2026-05-31 06:32:02","raw_log":"[2026-05-31 06:32:02] \u2717 REJECTED: No schedule found for 713 on 2026-05-31 (strict mode)","message":"\u2717 REJECTED: No schedule found for 713 on 2026-05-31 (strict mode)","category":"unknown","severity":"info"},{"timestamp":"2026-05-31 06:32:02","raw_log":"[2026-05-31 06:32:02] \u26a0 ALLOWING FALLBACK: Schedule coverage only 0% for nama=Nandang, kar_id=713","message":"\u26a0 ALLOWING FALLBACK: Schedule coverage only 0% for nama=Nandang, kar_id=713","category":"fallback-mode","severity":"warning","nama":"Nandang","kar_id":"713"},{"timestamp":"2026-05-31 06:32:02","raw_log":"[2026-05-31 06:32:02] \u26a0 FALLBACK: Using time-based detection pagi for 713 (SCHEDULE MISSING!)","message":"\u26a0 FALLBACK: Using time-based detection pagi for 713 (SCHEDULE MISSING!)","category":"unknown","severity":"info"},{"timestamp":"2026-05-31 06:32:02","raw_log":"[2026-05-31 06:32:02] \u26a0 SHIFT ASSIGNED: pagi (source: fallback) for nama=Nandang, kar_id=713","message":"\u26a0 SHIFT ASSIGNED: pagi (source: fallback) for nama=Nandang, kar_id=713","category":"unknown","severity":"info","nama":"Nandang","kar_id":"713"},{"timestamp":"2026-05-31 06:32:02","raw_log":"[2026-05-31 06:32:02] Check-in: keputusan=berhasil, nama=Nandang, kar_id=713, id_absensi=207206709, shift=pagi, sumber=fallback","message":"Check-in: keputusan=berhasil, nama=Nandang, kar_id=713, id_absensi=207206709, shift=pagi, sumber=fallback","category":"check-in-berhasil","severity":"success","nama":"Nandang","kar_id":"713","shift":"pagi","source":"fallback"},{"timestamp":"2026-05-31 07:04:01","raw_log":"[2026-05-31 07:04:01] Checkout: keputusan=berhasil, nama=Hidayat, kar_id=1324, id_absensi=207206705, shift=malam, jam_kerja=12.95 jam, sumber=schedule","message":"Checkout: keputusan=berhasil, nama=Hidayat, kar_id=1324, id_absensi=207206705, shift=malam, jam_kerja=12.95 jam, sumber=schedule","category":"checkout-berhasil","severity":"success","nama":"Hidayat","kar_id":"1324","shift":"malam","source":"schedule"},{"timestamp":"2026-05-31 07:46:01","raw_log":"[2026-05-31 07:46:01] \u2717 REJECTED: No schedule found for 550 on 2026-05-31 (strict mode)","message":"\u2717 REJECTED: No schedule found for 550 on 2026-05-31 (strict mode)","category":"unknown","severity":"info"},{"timestamp":"2026-05-31 07:46:01","raw_log":"[2026-05-31 07:46:01] \u26a0 ALLOWING FALLBACK: Schedule coverage only 0% for nama=Ilham Indra Illyasa, kar_id=550","message":"\u26a0 ALLOWING FALLBACK: Schedule coverage only 0% for nama=Ilham Indra Illyasa, kar_id=550","category":"fallback-mode","severity":"warning","nama":"Ilham Indra Illyasa","kar_id":"550"},{"timestamp":"2026-05-31 07:46:01","raw_log":"[2026-05-31 07:46:01] \u26a0 FALLBACK: Using time-based detection pagi for 550 (SCHEDULE MISSING!)","message":"\u26a0 FALLBACK: Using time-based detection pagi for 550 (SCHEDULE MISSING!)","category":"unknown","severity":"info"},{"timestamp":"2026-05-31 07:46:01","raw_log":"[2026-05-31 07:46:01] \u26a0 SHIFT ASSIGNED: pagi (source: fallback) for nama=Ilham Indra Illyasa, kar_id=550","message":"\u26a0 SHIFT ASSIGNED: pagi (source: fallback) for nama=Ilham Indra Illyasa, kar_id=550","category":"unknown","severity":"info","nama":"Ilham Indra Illyasa","kar_id":"550"},{"timestamp":"2026-05-31 07:46:01","raw_log":"[2026-05-31 07:46:01] Check-in: keputusan=berhasil, nama=Ilham Indra Illyasa, kar_id=550, id_absensi=207206711, shift=pagi, sumber=fallback","message":"Check-in: keputusan=berhasil, nama=Ilham Indra Illyasa, kar_id=550, id_absensi=207206711, shift=pagi, sumber=fallback","category":"check-in-berhasil","severity":"success","nama":"Ilham Indra Illyasa","kar_id":"550","shift":"pagi","source":"fallback"},{"timestamp":"2026-05-31 07:54:01","raw_log":"[2026-05-31 07:54:01] \u2717 REJECTED: No schedule found for 1754 on 2026-05-31 (strict mode)","message":"\u2717 REJECTED: No schedule found for 1754 on 2026-05-31 (strict mode)","category":"unknown","severity":"info"},{"timestamp":"2026-05-31 07:54:01","raw_log":"[2026-05-31 07:54:01] \u26a0 ALLOWING FALLBACK: Schedule coverage only 0% for nama=Muhammad Zidan Munggaran, kar_id=1754","message":"\u26a0 ALLOWING FALLBACK: Schedule coverage only 0% for nama=Muhammad Zidan Munggaran, kar_id=1754","category":"fallback-mode","severity":"warning","nama":"Muhammad Zidan Munggaran","kar_id":"1754"},{"timestamp":"2026-05-31 07:54:01","raw_log":"[2026-05-31 07:54:01] \u26a0 FALLBACK: Using time-based detection pagi for 1754 (SCHEDULE MISSING!)","message":"\u26a0 FALLBACK: Using time-based detection pagi for 1754 (SCHEDULE MISSING!)","category":"unknown","severity":"info"},{"timestamp":"2026-05-31 07:54:01","raw_log":"[2026-05-31 07:54:01] \u26a0 SHIFT ASSIGNED: pagi (source: fallback) for nama=Muhammad Zidan Munggaran, kar_id=1754","message":"\u26a0 SHIFT ASSIGNED: pagi (source: fallback) for nama=Muhammad Zidan Munggaran, kar_id=1754","category":"unknown","severity":"info","nama":"Muhammad Zidan Munggaran","kar_id":"1754"},{"timestamp":"2026-05-31 07:54:01","raw_log":"[2026-05-31 07:54:01] Check-in: keputusan=berhasil, nama=Muhammad Zidan Munggaran, kar_id=1754, id_absensi=207206714, shift=pagi, sumber=fallback","message":"Check-in: keputusan=berhasil, nama=Muhammad Zidan Munggaran, kar_id=1754, id_absensi=207206714, shift=pagi, sumber=fallback","category":"check-in-berhasil","severity":"success","nama":"Muhammad Zidan Munggaran","kar_id":"1754","shift":"pagi","source":"fallback"},{"timestamp":"2026-05-31 07:59:01","raw_log":"[2026-05-31 07:59:01] \u26a0 FALLBACK: Using time-based detection malam for 749 (SCHEDULE MISSING!)","message":"\u26a0 FALLBACK: Using time-based detection malam for 749 (SCHEDULE MISSING!)","category":"unknown","severity":"info"},{"timestamp":"2026-05-31 07:59:01","raw_log":"[2026-05-31 07:59:01] \u26a0 FALLBACK checkout validation for 749 (no schedule found)","message":"\u26a0 FALLBACK checkout validation for 749 (no schedule found)","category":"unknown","severity":"info"},{"timestamp":"2026-05-31 07:59:01","raw_log":"[2026-05-31 07:59:01] Checkout: keputusan=berhasil, nama=M. Naufal Abel Rafy, kar_id=749, id_absensi=207206707, shift=malam, jam_kerja=7.94 jam, sumber=fallback","message":"Checkout: keputusan=berhasil, nama=M. Naufal Abel Rafy, kar_id=749, id_absensi=207206707, shift=malam, jam_kerja=7.94 jam, sumber=fallback","category":"checkout-berhasil","severity":"success","nama":"M. Naufal Abel Rafy","kar_id":"749","shift":"malam","source":"fallback"},{"timestamp":"2026-05-31 07:59:02","raw_log":"[2026-05-31 07:59:02] \u2717 REJECTED: No schedule found for 1703 on 2026-05-31 (strict mode)","message":"\u2717 REJECTED: No schedule found for 1703 on 2026-05-31 (strict mode)","category":"unknown","severity":"info"},{"timestamp":"2026-05-31 07:59:02","raw_log":"[2026-05-31 07:59:02] \u26a0 ALLOWING FALLBACK: Schedule coverage only 0% for nama=Arka Nugraha, kar_id=1703","message":"\u26a0 ALLOWING FALLBACK: Schedule coverage only 0% for nama=Arka Nugraha, kar_id=1703","category":"fallback-mode","severity":"warning","nama":"Arka Nugraha","kar_id":"1703"},{"timestamp":"2026-05-31 07:59:02","raw_log":"[2026-05-31 07:59:02] \u26a0 FALLBACK: Using time-based detection pagi for 1703 (SCHEDULE MISSING!)","message":"\u26a0 FALLBACK: Using time-based detection pagi for 1703 (SCHEDULE MISSING!)","category":"unknown","severity":"info"},{"timestamp":"2026-05-31 07:59:02","raw_log":"[2026-05-31 07:59:02] \u26a0 SHIFT ASSIGNED: pagi (source: fallback) for nama=Arka Nugraha, kar_id=1703","message":"\u26a0 SHIFT ASSIGNED: pagi (source: fallback) for nama=Arka Nugraha, kar_id=1703","category":"unknown","severity":"info","nama":"Arka Nugraha","kar_id":"1703"},{"timestamp":"2026-05-31 07:59:02","raw_log":"[2026-05-31 07:59:02] Check-in: keputusan=berhasil, nama=Arka Nugraha, kar_id=1703, id_absensi=207206715, shift=pagi, sumber=fallback","message":"Check-in: keputusan=berhasil, nama=Arka Nugraha, kar_id=1703, id_absensi=207206715, shift=pagi, sumber=fallback","category":"check-in-berhasil","severity":"success","nama":"Arka Nugraha","kar_id":"1703","shift":"pagi","source":"fallback"},{"timestamp":"2026-05-31 08:03:01","raw_log":"[2026-05-31 08:03:01] \u2717 REJECTED: No schedule found for 668 on 2026-05-31 (strict mode)","message":"\u2717 REJECTED: No schedule found for 668 on 2026-05-31 (strict mode)","category":"unknown","severity":"info"},{"timestamp":"2026-05-31 08:03:01","raw_log":"[2026-05-31 08:03:01] \u26a0 ALLOWING FALLBACK: Schedule coverage only 0% for nama=Muhammad Ikbal Al Ghiffari, kar_id=668","message":"\u26a0 ALLOWING FALLBACK: Schedule coverage only 0% for nama=Muhammad Ikbal Al Ghiffari, kar_id=668","category":"fallback-mode","severity":"warning","nama":"Muhammad Ikbal Al Ghiffari","kar_id":"668"},{"timestamp":"2026-05-31 08:03:01","raw_log":"[2026-05-31 08:03:01] \u26a0 FALLBACK: Using time-based detection pagi for 668 (SCHEDULE MISSING!)","message":"\u26a0 FALLBACK: Using time-based detection pagi for 668 (SCHEDULE MISSING!)","category":"unknown","severity":"info"},{"timestamp":"2026-05-31 08:03:01","raw_log":"[2026-05-31 08:03:01] \u26a0 SHIFT ASSIGNED: pagi (source: fallback) for nama=Muhammad Ikbal Al Ghiffari, kar_id=668","message":"\u26a0 SHIFT ASSIGNED: pagi (source: fallback) for nama=Muhammad Ikbal Al Ghiffari, kar_id=668","category":"unknown","severity":"info","nama":"Muhammad Ikbal Al Ghiffari","kar_id":"668"},{"timestamp":"2026-05-31 08:03:01","raw_log":"[2026-05-31 08:03:01] Check-in: keputusan=berhasil, nama=Muhammad Ikbal Al Ghiffari, kar_id=668, id_absensi=207206716, shift=pagi, sumber=fallback","message":"Check-in: keputusan=berhasil, nama=Muhammad Ikbal Al Ghiffari, kar_id=668, id_absensi=207206716, shift=pagi, sumber=fallback","category":"check-in-berhasil","severity":"success","nama":"Muhammad Ikbal Al Ghiffari","kar_id":"668","shift":"pagi","source":"fallback"},{"timestamp":"2026-05-31 08:03:02","raw_log":"[2026-05-31 08:03:02] \u2717 REJECTED: No schedule found for 1142 on 2026-05-31 (strict mode)","message":"\u2717 REJECTED: No schedule found for 1142 on 2026-05-31 (strict mode)","category":"unknown","severity":"info"},{"timestamp":"2026-05-31 08:03:02","raw_log":"[2026-05-31 08:03:02] \u26a0 ALLOWING FALLBACK: Schedule coverage only 0% for nama=Fauzi Rahman, kar_id=1142","message":"\u26a0 ALLOWING FALLBACK: Schedule coverage only 0% for nama=Fauzi Rahman, kar_id=1142","category":"fallback-mode","severity":"warning","nama":"Fauzi Rahman","kar_id":"1142"},{"timestamp":"2026-05-31 08:03:02","raw_log":"[2026-05-31 08:03:02] \u26a0 FALLBACK: Using time-based detection pagi for 1142 (SCHEDULE MISSING!)","message":"\u26a0 FALLBACK: Using time-based detection pagi for 1142 (SCHEDULE MISSING!)","category":"unknown","severity":"info"},{"timestamp":"2026-05-31 08:03:02","raw_log":"[2026-05-31 08:03:02] \u26a0 SHIFT ASSIGNED: pagi (source: fallback) for nama=Fauzi Rahman, kar_id=1142","message":"\u26a0 SHIFT ASSIGNED: pagi (source: fallback) for nama=Fauzi Rahman, kar_id=1142","category":"unknown","severity":"info","nama":"Fauzi Rahman","kar_id":"1142"},{"timestamp":"2026-05-31 08:03:02","raw_log":"[2026-05-31 08:03:02] Check-in: keputusan=berhasil, nama=Fauzi Rahman, kar_id=1142, id_absensi=207206717, shift=pagi, sumber=fallback","message":"Check-in: keputusan=berhasil, nama=Fauzi Rahman, kar_id=1142, id_absensi=207206717, shift=pagi, sumber=fallback","category":"check-in-berhasil","severity":"success","nama":"Fauzi Rahman","kar_id":"1142","shift":"pagi","source":"fallback"},{"timestamp":"2026-05-31 08:19:02","raw_log":"[2026-05-31 08:19:02] \u2717 REJECTED: No schedule found for 1723 on 2026-05-31 (strict mode)","message":"\u2717 REJECTED: No schedule found for 1723 on 2026-05-31 (strict mode)","category":"unknown","severity":"info"},{"timestamp":"2026-05-31 08:19:02","raw_log":"[2026-05-31 08:19:02] \u26a0 ALLOWING FALLBACK: Schedule coverage only 0% for nama=Angga Nur Rizki, kar_id=1723","message":"\u26a0 ALLOWING FALLBACK: Schedule coverage only 0% for nama=Angga Nur Rizki, kar_id=1723","category":"fallback-mode","severity":"warning","nama":"Angga Nur Rizki","kar_id":"1723"},{"timestamp":"2026-05-31 08:19:02","raw_log":"[2026-05-31 08:19:02] \u26a0 FALLBACK: Using time-based detection pagi for 1723 (SCHEDULE MISSING!)","message":"\u26a0 FALLBACK: Using time-based detection pagi for 1723 (SCHEDULE MISSING!)","category":"unknown","severity":"info"},{"timestamp":"2026-05-31 08:19:02","raw_log":"[2026-05-31 08:19:02] \u26a0 SHIFT ASSIGNED: pagi (source: fallback) for nama=Angga Nur Rizki, kar_id=1723","message":"\u26a0 SHIFT ASSIGNED: pagi (source: fallback) for nama=Angga Nur Rizki, kar_id=1723","category":"unknown","severity":"info","nama":"Angga Nur Rizki","kar_id":"1723"},{"timestamp":"2026-05-31 08:19:02","raw_log":"[2026-05-31 08:19:02] Check-in: keputusan=berhasil, nama=Angga Nur Rizki, kar_id=1723, id_absensi=207206719, shift=pagi, sumber=fallback","message":"Check-in: keputusan=berhasil, nama=Angga Nur Rizki, kar_id=1723, id_absensi=207206719, shift=pagi, sumber=fallback","category":"check-in-berhasil","severity":"success","nama":"Angga Nur Rizki","kar_id":"1723","shift":"pagi","source":"fallback"},{"timestamp":"2026-05-31 08:19:02","raw_log":"[2026-05-31 08:19:02] \u26a0 FALLBACK: Using time-based detection malam for 485 (SCHEDULE MISSING!)","message":"\u26a0 FALLBACK: Using time-based detection malam for 485 (SCHEDULE MISSING!)","category":"unknown","severity":"info"},{"timestamp":"2026-05-31 08:19:02","raw_log":"[2026-05-31 08:19:02] \u26a0 FALLBACK checkout validation for 485 (no schedule found)","message":"\u26a0 FALLBACK checkout validation for 485 (no schedule found)","category":"unknown","severity":"info"},{"timestamp":"2026-05-31 08:19:02","raw_log":"[2026-05-31 08:19:02] Checkout: keputusan=berhasil, nama=Andre Saputra, kar_id=485, id_absensi=207206706, shift=malam, jam_kerja=8.36 jam, sumber=fallback","message":"Checkout: keputusan=berhasil, nama=Andre Saputra, kar_id=485, id_absensi=207206706, shift=malam, jam_kerja=8.36 jam, sumber=fallback","category":"checkout-berhasil","severity":"success","nama":"Andre Saputra","kar_id":"485","shift":"malam","source":"fallback"},{"timestamp":"2026-05-31 16:32:01","raw_log":"[2026-05-31 16:32:01] \u26a0 FALLBACK: Using time-based detection sore for 480 (SCHEDULE MISSING!)","message":"\u26a0 FALLBACK: Using time-based detection sore for 480 (SCHEDULE MISSING!)","category":"unknown","severity":"info"},{"timestamp":"2026-05-31 16:32:01","raw_log":"[2026-05-31 16:32:01] \u26a0 FALLBACK checkout validation for 480 (no schedule found)","message":"\u26a0 FALLBACK checkout validation for 480 (no schedule found)","category":"unknown","severity":"info"},{"timestamp":"2026-05-31 16:32:01","raw_log":"[2026-05-31 16:32:01] Tutup otomatis: keputusan=ditutup_otomatis, nama=Cahyadi Saputra, kar_id=480, id_absensi=207206701, shift=sore, waktu_pulang=2026-05-31 09:47:50, alasan=jam kerja melebihi batas maksimal; fallback berdasarkan max_hours","message":"Tutup otomatis: keputusan=ditutup_otomatis, nama=Cahyadi Saputra, kar_id=480, id_absensi=207206701, shift=sore, waktu_pulang=2026-05-31 09:47:50, alasan=jam kerja melebihi batas maksimal; fallback berdasarkan max_hours","category":"tutup-otomatis","severity":"warning","nama":"Cahyadi Saputra","kar_id":"480","shift":"sore","alasan":"jam kerja melebihi batas maksimal; fallback berdasarkan max_hours"},{"timestamp":"2026-05-31 16:32:01","raw_log":"[2026-05-31 16:32:01] \u2717 REJECTED: No schedule found for 480 on 2026-05-31 (strict mode)","message":"\u2717 REJECTED: No schedule found for 480 on 2026-05-31 (strict mode)","category":"unknown","severity":"info"},{"timestamp":"2026-05-31 16:32:01","raw_log":"[2026-05-31 16:32:01] \u26a0 ALLOWING FALLBACK: Schedule coverage only 0% for nama=Cahyadi Saputra, kar_id=480","message":"\u26a0 ALLOWING FALLBACK: Schedule coverage only 0% for nama=Cahyadi Saputra, kar_id=480","category":"fallback-mode","severity":"warning","nama":"Cahyadi Saputra","kar_id":"480"},{"timestamp":"2026-05-31 16:32:01","raw_log":"[2026-05-31 16:32:01] \u26a0 FALLBACK: Using time-based detection sore for 480 (SCHEDULE MISSING!)","message":"\u26a0 FALLBACK: Using time-based detection sore for 480 (SCHEDULE MISSING!)","category":"unknown","severity":"info"},{"timestamp":"2026-05-31 16:32:01","raw_log":"[2026-05-31 16:32:01] Check-in: keputusan=berhasil (auto setelah tutup otomatis), nama=Cahyadi Saputra, kar_id=480, id_absensi=207206723, shift=sore, sumber=fallback","message":"Check-in: keputusan=berhasil (auto setelah tutup otomatis), nama=Cahyadi Saputra, kar_id=480, id_absensi=207206723, shift=sore, sumber=fallback","category":"check-in-berhasil","severity":"success","nama":"Cahyadi Saputra","kar_id":"480","shift":"sore","source":"fallback"},{"timestamp":"2026-05-31 17:26:02","raw_log":"[2026-05-31 17:26:02] \u26a0 FALLBACK: Using time-based detection pagi for 1142 (SCHEDULE MISSING!)","message":"\u26a0 FALLBACK: Using time-based detection pagi for 1142 (SCHEDULE MISSING!)","category":"unknown","severity":"info"},{"timestamp":"2026-05-31 17:26:02","raw_log":"[2026-05-31 17:26:02] \u26a0 FALLBACK checkout validation for 1142 (no schedule found)","message":"\u26a0 FALLBACK checkout validation for 1142 (no schedule found)","category":"unknown","severity":"info"},{"timestamp":"2026-05-31 17:26:02","raw_log":"[2026-05-31 17:26:02] Checkout: keputusan=berhasil, nama=Fauzi Rahman, kar_id=1142, id_absensi=207206717, shift=pagi, jam_kerja=9.39 jam, sumber=fallback","message":"Checkout: keputusan=berhasil, nama=Fauzi Rahman, kar_id=1142, id_absensi=207206717, shift=pagi, jam_kerja=9.39 jam, sumber=fallback","category":"checkout-berhasil","severity":"success","nama":"Fauzi Rahman","kar_id":"1142","shift":"pagi","source":"fallback"},{"timestamp":"2026-05-31 17:28:01","raw_log":"[2026-05-31 17:28:01] Check-in: keputusan=ditolak, nama=M. Naufal Abel Rafy, kar_id=749, alasan=sudah ada shift selesai hari ini; tidak ada insert ke trs_absensi","message":"Check-in: keputusan=ditolak, nama=M. Naufal Abel Rafy, kar_id=749, alasan=sudah ada shift selesai hari ini; tidak ada insert ke trs_absensi","category":"check-in-ditolak","severity":"error","nama":"M. Naufal Abel Rafy","kar_id":"749","alasan":"sudah ada shift selesai hari ini; tidak ada insert ke trs_absensi"},{"timestamp":"2026-05-31 17:45:01","raw_log":"[2026-05-31 17:45:01] \u26a0 FALLBACK: Using time-based detection pagi for 550 (SCHEDULE MISSING!)","message":"\u26a0 FALLBACK: Using time-based detection pagi for 550 (SCHEDULE MISSING!)","category":"unknown","severity":"info"},{"timestamp":"2026-05-31 17:45:01","raw_log":"[2026-05-31 17:45:01] \u26a0 FALLBACK checkout validation for 550 (no schedule found)","message":"\u26a0 FALLBACK checkout validation for 550 (no schedule found)","category":"unknown","severity":"info"},{"timestamp":"2026-05-31 17:45:01","raw_log":"[2026-05-31 17:45:01] Checkout: keputusan=berhasil, nama=Ilham Indra Illyasa, kar_id=550, id_absensi=207206711, shift=pagi, jam_kerja=9.99 jam, sumber=fallback","message":"Checkout: keputusan=berhasil, nama=Ilham Indra Illyasa, kar_id=550, id_absensi=207206711, shift=pagi, jam_kerja=9.99 jam, sumber=fallback","category":"checkout-berhasil","severity":"success","nama":"Ilham Indra Illyasa","kar_id":"550","shift":"pagi","source":"fallback"},{"timestamp":"2026-05-31 17:50:02","raw_log":"[2026-05-31 17:50:02] Check-in: keputusan=berhasil, nama=Hidayat, kar_id=1324, id_absensi=207206726, shift=malam, sumber=schedule","message":"Check-in: keputusan=berhasil, nama=Hidayat, kar_id=1324, id_absensi=207206726, shift=malam, sumber=schedule","category":"check-in-berhasil","severity":"success","nama":"Hidayat","kar_id":"1324","shift":"malam","source":"schedule"},{"timestamp":"2026-05-31 19:03:02","raw_log":"[2026-05-31 19:03:02] \u26a0 FALLBACK: Using time-based detection pagi for 713 (SCHEDULE MISSING!)","message":"\u26a0 FALLBACK: Using time-based detection pagi for 713 (SCHEDULE MISSING!)","category":"unknown","severity":"info"},{"timestamp":"2026-05-31 19:03:02","raw_log":"[2026-05-31 19:03:02] \u26a0 FALLBACK checkout validation for 713 (no schedule found)","message":"\u26a0 FALLBACK checkout validation for 713 (no schedule found)","category":"unknown","severity":"info"},{"timestamp":"2026-05-31 19:03:02","raw_log":"[2026-05-31 19:03:02] Tutup otomatis: keputusan=ditutup_otomatis, nama=Nandang, kar_id=713, id_absensi=207206709, shift=pagi, waktu_pulang=2026-05-31 18:29:52, alasan=jam kerja melebihi batas maksimal; fallback berdasarkan max_hours","message":"Tutup otomatis: keputusan=ditutup_otomatis, nama=Nandang, kar_id=713, id_absensi=207206709, shift=pagi, waktu_pulang=2026-05-31 18:29:52, alasan=jam kerja melebihi batas maksimal; fallback berdasarkan max_hours","category":"tutup-otomatis","severity":"warning","nama":"Nandang","kar_id":"713","shift":"pagi","alasan":"jam kerja melebihi batas maksimal; fallback berdasarkan max_hours"},{"timestamp":"2026-05-31 19:03:02","raw_log":"[2026-05-31 19:03:02] \u2717 REJECTED: No schedule found for 713 on 2026-05-31 (strict mode)","message":"\u2717 REJECTED: No schedule found for 713 on 2026-05-31 (strict mode)","category":"unknown","severity":"info"},{"timestamp":"2026-05-31 19:03:02","raw_log":"[2026-05-31 19:03:02] \u26a0 ALLOWING FALLBACK: Schedule coverage only 0% for nama=Nandang, kar_id=713","message":"\u26a0 ALLOWING FALLBACK: Schedule coverage only 0% for nama=Nandang, kar_id=713","category":"fallback-mode","severity":"warning","nama":"Nandang","kar_id":"713"},{"timestamp":"2026-05-31 19:03:02","raw_log":"[2026-05-31 19:03:02] \u26a0 WARNING: No schedule AND outside shift hours for 713 on 2026-05-31 at 2026-05-31 19:02:12","message":"\u26a0 WARNING: No schedule AND outside shift hours for 713 on 2026-05-31 at 2026-05-31 19:02:12","category":"unknown","severity":"info"},{"timestamp":"2026-05-31 19:03:02","raw_log":"[2026-05-31 19:03:02] Check-in: keputusan=ditolak, nama=Nandang, kar_id=713, alasan=outside shift hours (Undefined); tidak ada insert ke trs_absensi","message":"Check-in: keputusan=ditolak, nama=Nandang, kar_id=713, alasan=outside shift hours (Undefined); tidak ada insert ke trs_absensi","category":"check-in-ditolak","severity":"error","nama":"Nandang","kar_id":"713","alasan":"outside shift hours (Undefined); tidak ada insert ke trs_absensi"},{"timestamp":"2026-05-31 21:36:02","raw_log":"[2026-05-31 21:36:02] \u2717 REJECTED: No schedule found for 347 on 2026-05-31 (strict mode)","message":"\u2717 REJECTED: No schedule found for 347 on 2026-05-31 (strict mode)","category":"unknown","severity":"info"},{"timestamp":"2026-05-31 21:36:02","raw_log":"[2026-05-31 21:36:02] \u26a0 ALLOWING FALLBACK: Schedule coverage only 0% for nama=Wildan Azhar, kar_id=347","message":"\u26a0 ALLOWING FALLBACK: Schedule coverage only 0% for nama=Wildan Azhar, kar_id=347","category":"fallback-mode","severity":"warning","nama":"Wildan Azhar","kar_id":"347"},{"timestamp":"2026-05-31 21:36:02","raw_log":"[2026-05-31 21:36:02] \u26a0 WARNING: No schedule AND outside shift hours for 347 on 2026-05-31 at 2026-05-31 21:35:05","message":"\u26a0 WARNING: No schedule AND outside shift hours for 347 on 2026-05-31 at 2026-05-31 21:35:05","category":"unknown","severity":"info"},{"timestamp":"2026-05-31 21:36:02","raw_log":"[2026-05-31 21:36:02] \u2717 FINAL REJECT: No valid shift determination for PIN=2020004, event_time=2026-05-31 21:35:05","message":"\u2717 FINAL REJECT: No valid shift determination for PIN=2020004, event_time=2026-05-31 21:35:05","category":"unknown","severity":"info"},{"timestamp":"2026-05-31 21:36:02","raw_log":"[2026-05-31 21:36:02] Check-in: keputusan=ditolak, nama=Wildan Azhar, kar_id=347, alasan=shift tidak dapat ditentukan; tidak ada insert ke trs_absensi","message":"Check-in: keputusan=ditolak, nama=Wildan Azhar, kar_id=347, alasan=shift tidak dapat ditentukan; tidak ada insert ke trs_absensi","category":"check-in-ditolak","severity":"error","nama":"Wildan Azhar","kar_id":"347","alasan":"shift tidak dapat ditentukan; tidak ada insert ke trs_absensi"}]}