/** * Memperbarui kepulangan siswa. * * @param \GearmanJob $job * * @Gearman\Job( * name = "pembaruan", * description = "Memperbarui kepulangan siswa." * ) * * @return boolean */ public function pembaruan(\GearmanJob $job) { $em = $this->entityManager; $data = unserialize($job->workload()); $paksa = $data['paksa']; $perulangan = $data['perulangan']; $logFile = $data['log_file']; /* @var $waktuSekarang \DateTime */ $waktuSekarang = $data['waktu_sekarang']; $jam = $waktuSekarang->format('H:i') . ':00'; $mingguanHariKe = $waktuSekarang->format('N'); $bulananHariKe = $waktuSekarang->format('j'); /* @var $sekolah Sekolah */ $sekolah = $em->getRepository('LanggasSisdikBundle:Sekolah')->find($data['sekolah']); /* @var $prosesLog ProsesLogKepulangan */ $prosesLog = $em->getRepository('LanggasSisdikBundle:ProsesLogKepulangan')->find($data['proses_log']); $prosesLog->setStatusAntrian('b-sedang-dikerjakan'); $em->persist($prosesLog); $em->flush(); $jumlahLogDiproses = 0; $querybuilder = $em->createQueryBuilder()->select('jadwal')->from('LanggasSisdikBundle:JadwalKepulangan', 'jadwal')->leftJoin('jadwal.tahunAkademik', 'tahunAkademik')->andWhere('jadwal.sekolah = :sekolah')->andWhere('jadwal.paramstatusHinggaJam <= :jam')->andWhere('jadwal.perulangan = :perulangan')->andWhere('jadwal.permulaan = :permulaan')->andWhere('jadwal.otomatisTerhubungMesin = :terhubung')->andWhere('tahunAkademik.aktif = :aktif')->setParameter('sekolah', $sekolah)->setParameter('jam', $jam)->setParameter('perulangan', $perulangan)->setParameter('permulaan', false)->setParameter('aktif', true)->setParameter('terhubung', true)->orderBy('jadwal.paramstatusHinggaJam', 'ASC'); if ($perulangan == 'b-mingguan') { $querybuilder->andWhere('jadwal.mingguanHariKe = :harike')->setParameter('harike', $mingguanHariKe); } elseif ($perulangan == 'c-bulanan') { $querybuilder->andWhere('jadwal.bulananHariKe = :tanggalke')->setParameter('tanggalke', $bulananHariKe); } $jadwalKepulangan = $querybuilder->getQuery()->getResult(); foreach ($jadwalKepulangan as $jadwal) { if (!(is_object($jadwal) && $jadwal instanceof JadwalKepulangan)) { continue; } $dariJam = $jadwal->getParamstatusDariJam(); $hinggaJam = $jadwal->getParamstatusHinggaJam(); $tanggalJadwalDari = new \DateTime($waktuSekarang->format('Y-m-d') . " {$dariJam}"); $tanggalJadwalHingga = new \DateTime($waktuSekarang->format('Y-m-d') . " {$hinggaJam}"); $targetFile = self::TMP_DIR . DIRECTORY_SEPARATOR . $sekolah->getId() . '-sisdik-' . uniqid(mt_rand(), true) . '.gz'; if (!@copy($logFile, $targetFile)) { continue; } $siswaTerbarui = $em->createQueryBuilder()->select('siswa.nomorIndukSistem')->from('LanggasSisdikBundle:KepulanganSiswa', 'kepulangan')->leftJoin('kepulangan.siswa', 'siswa')->where('kepulangan.sekolah = :sekolah')->andWhere('kepulangan.tanggal = :tanggal')->andWhere('kepulangan.permulaan = :permulaan OR kepulangan.tervalidasi = :tervalidasi')->setParameter('sekolah', $sekolah)->setParameter('tanggal', $waktuSekarang->format('Y-m-d'))->setParameter('permulaan', false)->setParameter('tervalidasi', true)->getQuery()->getArrayResult(); $nomorTerproses = ''; foreach ($siswaTerbarui as $val) { $nomorTerproses .= $val['nomorIndukSistem'] . '|'; } $nomorTerproses = preg_replace('/\\|$/', '', $nomorTerproses); exec("gunzip --force {$targetFile}"); $extractedFile = substr($targetFile, 0, -3); if (strstr($targetFile, 'json') !== false) { $buffer = file_get_contents($extractedFile); $logKepulangan = json_decode($buffer, true); foreach ($logKepulangan as $item) { $logTanggal = new \DateTime($item['datetime']); // +60 detik perbedaan if (!($logTanggal->getTimestamp() >= $tanggalJadwalDari->getTimestamp() && $logTanggal->getTimestamp() <= $tanggalJadwalHingga->getTimestamp() + 60)) { continue; } if ($logTanggal->format('Ymd') != $waktuSekarang->format('Ymd')) { continue; } $siswa = $em->getRepository('LanggasSisdikBundle:Siswa')->findOneBy(['nomorIndukSistem' => $item['id']]); if (is_object($siswa) && $siswa instanceof Siswa) { $kepulanganSiswa = $em->getRepository('LanggasSisdikBundle:KepulanganSiswa')->findOneBy(['sekolah' => $sekolah, 'tahunAkademik' => $jadwal->getTahunAkademik(), 'kelas' => $jadwal->getKelas(), 'siswa' => $siswa, 'tanggal' => $waktuSekarang, 'permulaan' => true]); if (is_object($kepulanganSiswa) && $kepulanganSiswa instanceof KepulanganSiswa) { try { $em->lock($kepulanganSiswa, LockMode::OPTIMISTIC, $kepulanganSiswa->getVersi()); $kepulanganSiswa->setPermulaan(false); $kepulanganSiswa->setStatusKepulangan($jadwal->getStatusKepulangan()); $kepulanganSiswa->setJam($logTanggal->format('H:i:s')); $kepulanganSiswa->setTerprosesOtomatis(true); $em->persist($kepulanganSiswa); $em->flush(); $jumlahLogDiproses++; } catch (OptimisticLockException $e) { $this->logger->addNotice($e); } } } } $prosesKepulanganSiswa = $em->getRepository('LanggasSisdikBundle:ProsesKepulanganSiswa')->findOneBy(['sekolah' => $sekolah, 'tahunAkademik' => $jadwal->getTahunAkademik(), 'kelas' => $jadwal->getKelas(), 'tanggal' => $waktuSekarang, 'berhasilDiperbaruiMesin' => false]); if (is_object($prosesKepulanganSiswa) && $prosesKepulanganSiswa instanceof ProsesKepulanganSiswa) { $prosesKepulanganSiswa->setBerhasilDiperbaruiMesin(true); $em->persist($prosesKepulanganSiswa); $em->flush(); } } else { if ($nomorTerproses != '') { exec("sed -i -E '/{$nomorTerproses}/d' {$extractedFile}"); } exec("sed -i -n '/<.*>/,\$p' {$extractedFile}"); $buffer = file_get_contents($extractedFile); $buffer = preg_replace("/\\s+/", ' ', trim($buffer)); $xmlstring = "<?xml version='1.0'?>\n" . $buffer; $xmlobject = @simplexml_load_string($xmlstring); if ($xmlobject) { foreach ($xmlobject->xpath('Row') as $item) { $logTanggal = new \DateTime($item->DateTime); // +60 detik perbedaan if (!($logTanggal->getTimestamp() >= $tanggalJadwalDari->getTimestamp() && $logTanggal->getTimestamp() <= $tanggalJadwalHingga->getTimestamp() + 60)) { continue; } if ($logTanggal->format('Ymd') != $waktuSekarang->format('Ymd')) { continue; } $siswa = $em->getRepository('LanggasSisdikBundle:Siswa')->findOneBy(['nomorIndukSistem' => $item->PIN]); if (is_object($siswa) && $siswa instanceof Siswa) { $kepulanganSiswa = $em->getRepository('LanggasSisdikBundle:KepulanganSiswa')->findOneBy(['sekolah' => $sekolah, 'tahunAkademik' => $jadwal->getTahunAkademik(), 'kelas' => $jadwal->getKelas(), 'siswa' => $siswa, 'tanggal' => $waktuSekarang, 'permulaan' => true]); if (is_object($kepulanganSiswa) && $kepulanganSiswa instanceof KepulanganSiswa) { try { $em->lock($kepulanganSiswa, LockMode::OPTIMISTIC, $kepulanganSiswa->getVersi()); $kepulanganSiswa->setPermulaan(false); $kepulanganSiswa->setStatusKepulangan($jadwal->getStatusKepulangan()); $kepulanganSiswa->setJam($logTanggal->format('H:i:s')); $kepulanganSiswa->setTerprosesOtomatis(true); $em->persist($kepulanganSiswa); $em->flush(); $jumlahLogDiproses++; } catch (OptimisticLockException $e) { $this->logger->addNotice($e); } } } } $prosesKepulanganSiswa = $em->getRepository('LanggasSisdikBundle:ProsesKepulanganSiswa')->findOneBy(['sekolah' => $sekolah, 'tahunAkademik' => $jadwal->getTahunAkademik(), 'kelas' => $jadwal->getKelas(), 'tanggal' => $waktuSekarang, 'berhasilDiperbaruiMesin' => false]); if (is_object($prosesKepulanganSiswa) && $prosesKepulanganSiswa instanceof ProsesKepulanganSiswa) { $prosesKepulanganSiswa->setBerhasilDiperbaruiMesin(true); $em->persist($prosesKepulanganSiswa); $em->flush(); } } } @unlink($extractedFile); } $prosesLog->setStatusAntrian('c-selesai'); $prosesLog->setAkhirProses(new \DateTime()); $prosesLog->setJumlahLogDiproses($jumlahLogDiproses); $em->persist($prosesLog); $em->flush(); return true; }