示例#1
0
 public function buildForm(FormBuilderInterface $builder, array $options)
 {
     $sekolah = $options['sekolahSrc'];
     $builder->add('sekolahSrc', 'hidden', ['data' => $options['sekolahSrc']])->add('tahunAkademikSrc', 'hidden', ['data' => $options['tahunAkademikSrc']])->add('kelasSrc', 'hidden', ['data' => $options['kelasSrc']])->add('perulanganSrc', 'hidden', ['data' => $options['perulanganSrc']])->add('requestUri', 'hidden', ['data' => $options['requestUri']])->add('mingguanHariKeSrc', 'hidden', ['data' => $options['mingguanHariKeSrc']])->add('bulananHariKeSrc', 'hidden', ['data' => $options['bulananHariKeSrc']])->add('tahunAkademik', 'entity', ['class' => 'LanggasSisdikBundle:TahunAkademik', 'label' => 'label.year.entry', 'multiple' => false, 'expanded' => false, 'property' => 'nama', 'required' => true, 'query_builder' => function (EntityRepository $repository) use($sekolah) {
         $qb = $repository->createQueryBuilder('tahunAkademik')->where('tahunAkademik.sekolah = :sekolah')->orderBy('tahunAkademik.urutan', 'DESC')->setParameter('sekolah', $sekolah);
         return $qb;
     }, 'attr' => ['class' => 'medium selectyearduplicate'], 'label_render' => false, 'horizontal' => false])->add('kelas', 'entity', ['class' => 'LanggasSisdikBundle:Kelas', 'label' => 'label.class.entry', 'multiple' => false, 'expanded' => false, 'property' => 'nama', 'required' => true, 'query_builder' => function (EntityRepository $repository) use($sekolah) {
         $qb = $repository->createQueryBuilder('kelas')->leftJoin('kelas.tingkat', 'tingkat')->where('kelas.sekolah = :sekolah')->orderBy('tingkat.urutan', 'ASC')->addOrderBy('kelas.urutan')->setParameter('sekolah', $sekolah);
         return $qb;
     }, 'attr' => ['class' => 'medium selectclassduplicate'], 'label_render' => false, 'horizontal' => false])->add('perulangan', 'choice', ['choices' => JadwalKehadiran::getDaftarPerulangan(), 'label' => 'label.selectrepetition', 'multiple' => false, 'expanded' => false, 'required' => true, 'attr' => array('class' => 'small'), 'label_render' => false, 'horizontal' => false])->add('mingguanHariKe', 'choice', ['choices' => JadwalKehadiran::getNamaHari(), 'multiple' => false, 'expanded' => false, 'required' => false, 'placeholder' => 'label.selectweekday', 'attr' => array('class' => 'medium'), 'label_render' => false, 'horizontal' => false])->add('bulananHariKe', 'choice', ['choices' => JadwalKehadiran::getAngkaHariSebulan(), 'multiple' => false, 'expanded' => false, 'required' => false, 'placeholder' => 'label.selectmonthday', 'attr' => ['class' => 'medium'], 'label_render' => false, 'horizontal' => false]);
 }
示例#2
0
 public function buildForm(FormBuilderInterface $builder, array $options)
 {
     $sekolah = $this->getSekolah();
     $builder->addEventSubscriber(new SekolahSubscriber($sekolah));
     $builder->add('sekolah', 'sisdik_entityhidden', ['required' => true, 'class' => 'LanggasSisdikBundle:Sekolah', 'data' => $sekolah->getId()])->add('tahunAkademik', 'entity', ['class' => 'LanggasSisdikBundle:TahunAkademik', 'label' => 'label.year.entry', 'multiple' => false, 'expanded' => false, 'property' => 'nama', 'required' => true, 'query_builder' => function (EntityRepository $repository) use($sekolah) {
         $qb = $repository->createQueryBuilder('tahunAkademik')->where('tahunAkademik.sekolah = :sekolah')->orderBy('tahunAkademik.urutan', 'DESC')->setParameter('sekolah', $sekolah);
         return $qb;
     }, 'attr' => ['class' => 'medium selectyear']])->add('kelas', 'entity', ['class' => 'LanggasSisdikBundle:Kelas', 'label' => 'label.class.entry', 'multiple' => false, 'expanded' => false, 'property' => 'nama', 'required' => true, 'query_builder' => function (EntityRepository $repository) use($sekolah) {
         $qb = $repository->createQueryBuilder('kelas')->leftJoin('kelas.tingkat', 'tingkat')->where('kelas.sekolah = :sekolah')->orderBy('tingkat.urutan', 'ASC')->addOrderBy('kelas.urutan')->setParameter('sekolah', $sekolah);
         return $qb;
     }, 'attr' => ['class' => 'large selectclass']])->add('statusKehadiran', 'choice', ['choices' => JadwalKehadiran::getDaftarStatusKehadiran(), 'label' => 'label.status.kehadiran', 'multiple' => false, 'expanded' => false, 'required' => true, 'attr' => ['class' => 'medium']])->add('perulangan', 'choice', ['choices' => JadwalKehadiran::getDaftarPerulangan(), 'label' => 'label.perulangan', 'multiple' => false, 'expanded' => false, 'required' => true, 'attr' => ['class' => 'small']])->add('mingguanHariKe', 'choice', ['label' => 'label.day', 'choices' => JadwalKehadiran::getNamaHari(), 'multiple' => false, 'expanded' => false, 'required' => false, 'placeholder' => 'label.selectweekday', 'attr' => ['class' => 'medium']])->add('bulananHariKe', 'choice', ['label' => 'label.monthday', 'choices' => JadwalKehadiran::getAngkaHariSebulan(), 'multiple' => false, 'expanded' => false, 'required' => false, 'placeholder' => 'label.selectmonthday', 'attr' => ['class' => 'medium']])->add('paramstatusDariJam', 'time', ['label' => 'label.paramstatusfrom', 'required' => false, 'input' => 'string', 'widget' => 'single_text', 'with_seconds' => false, 'attr' => ['class' => 'mini']])->add('paramstatusHinggaJam', 'time', ['label' => 'label.paramstatusto', 'required' => false, 'input' => 'string', 'widget' => 'single_text', 'with_seconds' => false, 'attr' => ['class' => 'mini']])->add('kirimSms', 'checkbox', ['label' => 'label.kirim.sms', 'required' => false, 'label_render' => true, 'widget_checkbox_label' => 'widget', 'horizontal_input_wrapper_class' => 'col-sm-offset-4 col-sm-8 col-md-offset-4 col-md-7 col-lg-offset-3 col-lg-9'])->add('smsJam', 'time', ['label' => 'label.kirim.sms.jam', 'required' => false, 'input' => 'string', 'widget' => 'single_text', 'with_seconds' => false, 'attr' => ['class' => 'mini']])->add('templatesms', 'entity', ['class' => 'LanggasSisdikBundle:Templatesms', 'label' => 'label.sms.template.entry', 'multiple' => false, 'expanded' => false, 'required' => false, 'property' => 'optionLabel', 'query_builder' => function (EntityRepository $repository) use($sekolah) {
         $qb = $repository->createQueryBuilder('template')->where('template.sekolah = :sekolah')->orderBy('template.nama', 'ASC')->setParameter('sekolah', $sekolah);
         return $qb;
     }, 'attr' => ['class' => 'xlarge'], 'placeholder' => 'label.pilih.template.sms'])->add('otomatisTerhubungMesin', 'checkbox', ['label' => 'label.otomatis.terhubung.mesin.kehadiran', 'required' => false, 'label_render' => true, 'widget_checkbox_label' => 'widget', 'horizontal_input_wrapper_class' => 'col-sm-offset-4 col-sm-8 col-md-offset-4 col-md-7 col-lg-offset-3 col-lg-9'])->add('permulaan', 'checkbox', ['label' => 'label.awal.kehadiran', 'required' => false, 'help_block' => 'help.awal.kehadiran', 'label_render' => true, 'widget_checkbox_label' => 'widget', 'horizontal_input_wrapper_class' => 'col-sm-offset-4 col-sm-8 col-md-offset-4 col-md-7 col-lg-offset-3 col-lg-9']);
 }
 /**
  * @param FormEvent $event
  */
 public function preSubmit(FormEvent $event)
 {
     $data = $event->getData();
     $form = $event->getForm();
     $form->add('perulangan', 'choice', ['choices' => JadwalKehadiran::getDaftarPerulangan(), 'label' => 'label.selectrepetition', 'multiple' => false, 'expanded' => false, 'required' => true, 'attr' => ['class' => 'medium pilih-perulangan'], 'label_render' => false, 'horizontal' => false]);
     if (array_key_exists('perulangan', $data)) {
         if ($data['perulangan'] == 'a-harian') {
             $form->add('mingguanHariKe', 'hidden');
             $form->add('bulananHariKe', 'hidden');
         } elseif ($data['perulangan'] == 'b-mingguan') {
             $form->add('bulananHariKe', 'hidden');
             $form->add('mingguanHariKe', 'choice', ['choices' => JadwalKehadiran::getNamaHari(), 'multiple' => false, 'expanded' => false, 'required' => true, 'attr' => ['class' => 'medium'], 'label_render' => false, 'horizontal' => false]);
         } elseif ($data['perulangan'] == 'c-bulanan') {
             $form->add('mingguanHariKe', 'hidden');
             $form->add('bulananHariKe', 'choice', ['choices' => JadwalKehadiran::getAngkaHariSebulan(), 'multiple' => false, 'expanded' => false, 'required' => true, 'attr' => ['class' => 'medium'], 'label_render' => false, 'horizontal' => false]);
         }
     }
 }
 protected function execute(InputInterface $input, OutputInterface $output)
 {
     /* @var $em EntityManager */
     $em = $this->getContainer()->get('doctrine')->getManager();
     $waktuSekarang = new \DateTime();
     $perulangan = JadwalKehadiran::getDaftarPerulangan();
     $workload['waktu_sekarang'] = $waktuSekarang;
     $workload['paksa'] = $input->getOption('paksa');
     $semuaSekolah = $em->getRepository('LanggasSisdikBundle:Sekolah')->findAll();
     foreach ($semuaSekolah as $sekolah) {
         if (!(is_object($sekolah) && $sekolah instanceof Sekolah)) {
             continue;
         }
         $workload['sekolah'] = $sekolah->getId();
         if (!$input->getOption('paksa')) {
             $kalenderPendidikan = $em->getRepository('LanggasSisdikBundle:KalenderPendidikan')->findOneBy(['sekolah' => $sekolah, 'tanggal' => $waktuSekarang, 'kbm' => true]);
             if (!(is_object($kalenderPendidikan) && $kalenderPendidikan instanceof KalenderPendidikan)) {
                 continue;
             }
         }
         $mesinKehadiran = $em->getRepository('LanggasSisdikBundle:MesinKehadiran')->findBy(['sekolah' => $sekolah, 'aktif' => true]);
         foreach ($perulangan as $key => $value) {
             $workload['perulangan'] = $key;
             $logDirectory = $this->getContainer()->get('kernel')->getRootDir() . DIRECTORY_SEPARATOR . 'fingerprintlogs' . DIRECTORY_SEPARATOR . $sekolah->getId() . DIRECTORY_SEPARATOR . 'log' . DIRECTORY_SEPARATOR . $key . DIRECTORY_SEPARATOR . $waktuSekarang->format('Y-m-d');
             if (!is_dir($logDirectory)) {
                 continue;
             }
             foreach ($mesinKehadiran as $mesin) {
                 if (!(is_object($mesin) && $mesin instanceof MesinKehadiran)) {
                     continue;
                 }
                 if ($mesin->getAlamatIp() == '') {
                     continue;
                 }
                 $logFiles = [];
                 exec("cd {$logDirectory} && ls -1t {$mesin->getAlamatIp()}*", $logFiles);
                 $logFile = '';
                 foreach ($logFiles as $logFile) {
                     if ($logFile == '') {
                         continue;
                     }
                     if (!$input->getOption('paksa')) {
                         $prosesLog = $em->createQueryBuilder()->select('COUNT(prosesLog.id)')->from('LanggasSisdikBundle:ProsesLogKehadiran', 'prosesLog')->where('prosesLog.sekolah = :sekolah')->andWhere('prosesLog.namaFile = :namaFile')->setParameter('sekolah', $sekolah)->setParameter('namaFile', $logFile)->getQuery()->getSingleScalarResult();
                         if ($prosesLog > 0) {
                             continue;
                         }
                     }
                     $workload['log_file'] = $logDirectory . DIRECTORY_SEPARATOR . $logFile;
                     /* @var $logger Logger */
                     $logger = $this->getContainer()->get('monolog.logger.attendance');
                     $gearman = new \GearmanClient();
                     $gearman->addServer();
                     $jobFunction = "LanggasSisdikBundleWorkerPembaruanKehadiranWorker~pembaruan";
                     $proses = new ProsesLogKehadiran();
                     $proses->setAwalProses($waktuSekarang);
                     $proses->setNamaFile($logFile);
                     $proses->setSekolah($sekolah);
                     $proses->setStatusAntrian('a-masuk-antrian');
                     $proses->setPrioritas($input->getOption('prioritas'));
                     $em->persist($proses);
                     $em->flush();
                     $workload['proses_log'] = $proses->getId();
                     switch ($input->getOption('prioritas')) {
                         case "tinggi":
                             $gearman->doHighBackground($jobFunction, serialize($workload));
                             $logger->addInfo($sekolah->getId() . ' | ' . $sekolah->getNama() . ' | kehadiran | prioritas-tinggi | ' . $workload['log_file']);
                             break;
                         case "normal":
                             $gearman->doBackground($jobFunction, serialize($workload));
                             $logger->addInfo($sekolah->getId() . ' | ' . $sekolah->getNama() . ' | kehadiran | prioritas-normal | ' . $workload['log_file']);
                             break;
                         case "rendah":
                             $gearman->doLowBackground($jobFunction, serialize($workload));
                             $logger->addInfo($sekolah->getId() . ' | ' . $sekolah->getNama() . ' | kehadiran | prioritas-rendah | ' . $workload['log_file']);
                             break;
                     }
                 }
             }
         }
     }
 }
 /**
  * Memperbarui kehadiran siswa berdasarkan data yang diambil secara manual.
  *
  * @Route("/pembaruan-manual/{urutan}/{daftarJadwal}", name="kehadiran-siswa_manual")
  * @Secure(roles="ROLE_GURU_PIKET")
  */
 public function pembaruanManualAction($urutan = 0, $daftarJadwal = "0")
 {
     $sekolah = $this->getSekolah();
     /* @var $em EntityManager */
     $em = $this->getDoctrine()->getManager();
     $retval = [];
     $response = new Response('', 200, ['Content-Type' => 'application/json']);
     $daftarStatusKehadiran = JadwalKehadiran::getDaftarStatusKehadiran();
     $perulangan = JadwalKehadiran::getDaftarPerulangan();
     $waktuSekarang = new \DateTime();
     $tanggalSekarang = $waktuSekarang->format('Y-m-d');
     $jam = $waktuSekarang->format('H:i') . ':00';
     $mingguanHariKe = $waktuSekarang->format('N');
     $bulananHariKe = $waktuSekarang->format('j');
     $kalenderPendidikan = $em->getRepository('LanggasSisdikBundle:KalenderPendidikan')->findOneBy(['sekolah' => $sekolah, 'tanggal' => $waktuSekarang, 'kbm' => true]);
     if (!(is_object($kalenderPendidikan) && $kalenderPendidikan instanceof KalenderPendidikan)) {
         $retval['selesai'] = 1;
         $retval['pesan'][] = "Hari sekarang bukan hari yang ditandai sebagai KBM aktif";
         $response->setContent(json_encode($retval));
         return $response;
     }
     $qbJadwalTotal = $em->createQueryBuilder()->select('COUNT(jadwal.id)')->from('LanggasSisdikBundle:JadwalKehadiran', 'jadwal')->leftJoin('jadwal.tahunAkademik', 'tahunAkademik')->andWhere('jadwal.sekolah = :sekolah')->andWhere('jadwal.paramstatusHinggaJam <= :jam')->andWhere('tahunAkademik.aktif = :aktif')->setParameter('sekolah', $sekolah)->setParameter('jam', $jam)->setParameter('aktif', true);
     $jadwalTotal = $qbJadwalTotal->getQuery()->getSingleScalarResult();
     if ($urutan >= $jadwalTotal) {
         $retval['selesai'] = 1;
         $retval['pesan'][] = "Selesai memperbarui kehadiran siswa";
         $response->setContent(json_encode($retval));
         return $response;
     }
     $querybuilder = $em->createQueryBuilder()->select('jadwal')->from('LanggasSisdikBundle:JadwalKehadiran', 'jadwal')->leftJoin('jadwal.tahunAkademik', 'tahunAkademik')->andWhere('jadwal.sekolah = ?1')->andWhere('jadwal.paramstatusHinggaJam <= ?2')->andWhere('tahunAkademik.aktif = ?3')->andWhere('jadwal.id NOT IN (?4)')->andWhere("jadwal.perulangan = ?5 OR (jadwal.perulangan = ?6 AND jadwal.mingguanHariKe = ?8) OR (jadwal.perulangan = ?7 AND jadwal.bulananHariKe = ?9)")->andWhere("jadwal.paramstatusDariJam != '' OR jadwal.paramstatusHinggaJam != ''")->setParameter(1, $sekolah)->setParameter(2, $jam)->setParameter(3, true)->setParameter(4, preg_split('/,/', $daftarJadwal))->orderBy('jadwal.paramstatusHinggaJam', 'ASC');
     $tempCounter = 5;
     foreach ($perulangan as $key => $value) {
         $querybuilder->setParameter($tempCounter, $key);
         $tempCounter++;
         if ($key == 'b-mingguan') {
             $querybuilder->setParameter(8, $mingguanHariKe);
         } elseif ($key == 'c-bulanan') {
             $querybuilder->setParameter(9, $bulananHariKe);
         }
     }
     $jadwalKehadiran = $querybuilder->getQuery()->getResult();
     foreach ($jadwalKehadiran as $jadwal) {
         if (!(is_object($jadwal) && $jadwal instanceof JadwalKehadiran)) {
             continue;
         }
         if ($jadwal->getParamstatusHinggaJam() == '') {
             continue;
         }
         $dariJam = $jadwal->getParamstatusDariJam();
         $hinggaJam = $jadwal->getParamstatusHinggaJam();
         $tanggalJadwalDari = new \DateTime(date("Y-m-d {$dariJam}"));
         $tanggalJadwalHingga = new \DateTime(date("Y-m-d {$hinggaJam}"));
         $logDirectory = $this->container->get('kernel')->getRootDir() . DIRECTORY_SEPARATOR . "fingerprintlogs" . DIRECTORY_SEPARATOR . $sekolah->getId() . DIRECTORY_SEPARATOR . 'log' . DIRECTORY_SEPARATOR . 'manual' . DIRECTORY_SEPARATOR . $tanggalSekarang;
         if (!is_dir($logDirectory)) {
             continue;
         }
         $retval['pesan'][] = "Memproses kehadiran siswa untuk jadwal " . $jadwal->getTahunAkademik()->getNama() . ", " . $jadwal->getKelas()->getNama() . ", " . $perulangan[$jadwal->getPerulangan()] . ", " . $this->get('translator')->trans($daftarStatusKehadiran[$jadwal->getStatusKehadiran()]) . ", " . $jadwal->getParamstatusDariJam(false) . " - " . $jadwal->getParamstatusHinggaJam(false);
         $retval['daftarJadwal'] = $daftarJadwal == '' ? $jadwal->getId() : $daftarJadwal . ',' . $jadwal->getId();
         $retval['urutan'] = ++$urutan;
         $mesinFingerprint = $em->getRepository('LanggasSisdikBundle:MesinKehadiran')->findBy(['sekolah' => $sekolah, 'aktif' => true]);
         $counterJumlahTerproses = 0;
         foreach ($mesinFingerprint as $mesin) {
             if (!(is_object($mesin) && $mesin instanceof MesinKehadiran)) {
                 continue;
             }
             if ($mesin->getAlamatIp() == '') {
                 continue;
             }
             $logFile = exec("cd {$logDirectory} && ls -1 {$mesin->getAlamatIp()}* | tail -1");
             $sourceFile = $logDirectory . DIRECTORY_SEPARATOR . $logFile;
             $targetFile = self::TMP_DIR . DIRECTORY_SEPARATOR . $sekolah->getId() . '-sisdik-' . uniqid(mt_rand(), true) . $logFile;
             if (!@copy($sourceFile, $targetFile)) {
                 continue;
             }
             $output = [];
             exec("gunzip --force {$targetFile}", $output);
             $extractedFile = substr($targetFile, 0, -3);
             if (strstr($targetFile, 'json') !== false) {
                 $buffer = file_get_contents($extractedFile);
                 $logKehadiran = json_decode($buffer, true);
                 foreach ($logKehadiran 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) {
                         $kehadiranSiswa = $em->getRepository('LanggasSisdikBundle:KehadiranSiswa')->findOneBy(['sekolah' => $sekolah, 'tahunAkademik' => $jadwal->getTahunAkademik(), 'kelas' => $jadwal->getKelas(), 'siswa' => $siswa, 'tanggal' => $waktuSekarang, 'permulaan' => true]);
                         if (is_object($kehadiranSiswa) && $kehadiranSiswa instanceof KehadiranSiswa) {
                             /**$retval['pesan'][] = "··· Memperbarui kehadiran siswa "
                                    . $kehadiranSiswa->getSiswa()->getNamaLengkap()
                                    . " ("
                                    . $kehadiranSiswa->getSiswa()->getNomorIndukSistem()
                                    . ")"
                                ;**/
                             $counterJumlahTerproses++;
                             $kehadiranSiswa->setPermulaan(false);
                             $kehadiranSiswa->setStatusKehadiran($jadwal->getStatusKehadiran());
                             $kehadiranSiswa->setJam($logTanggal->format('H:i:s'));
                             $kehadiranSiswa->setTerprosesManual(true);
                             $em->persist($kehadiranSiswa);
                             $em->flush();
                         }
                     }
                 }
                 $prosesKehadiranSiswa = $em->getRepository('LanggasSisdikBundle:ProsesKehadiranSiswa')->findOneBy(['sekolah' => $sekolah, 'tahunAkademik' => $jadwal->getTahunAkademik(), 'kelas' => $jadwal->getKelas(), 'tanggal' => $waktuSekarang, 'berhasilDiperbaruiMesin' => false]);
                 if (is_object($prosesKehadiranSiswa) && $prosesKehadiranSiswa instanceof ProsesKehadiranSiswa) {
                     $prosesKehadiranSiswa->setBerhasilDiperbaruiMesin(true);
                     $em->persist($prosesKehadiranSiswa);
                 }
             } else {
                 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) {
                             $kehadiranSiswa = $em->getRepository('LanggasSisdikBundle:KehadiranSiswa')->findOneBy(['sekolah' => $sekolah, 'tahunAkademik' => $jadwal->getTahunAkademik(), 'kelas' => $jadwal->getKelas(), 'siswa' => $siswa, 'tanggal' => $waktuSekarang, 'permulaan' => true]);
                             if (is_object($kehadiranSiswa) && $kehadiranSiswa instanceof KehadiranSiswa) {
                                 /**$retval['pesan'][] = "··· Memperbarui kehadiran siswa "
                                        . $kehadiranSiswa->getSiswa()->getNamaLengkap()
                                        . " ("
                                        . $kehadiranSiswa->getSiswa()->getNomorIndukSistem()
                                        . ")"
                                    ;**/
                                 $counterJumlahTerproses++;
                                 $kehadiranSiswa->setPermulaan(false);
                                 $kehadiranSiswa->setStatusKehadiran($jadwal->getStatusKehadiran());
                                 $kehadiranSiswa->setJam($logTanggal->format('H:i:s'));
                                 $kehadiranSiswa->setTerprosesManual(true);
                                 $em->persist($kehadiranSiswa);
                                 $em->flush();
                             }
                         }
                     }
                     $prosesKehadiranSiswa = $em->getRepository('LanggasSisdikBundle:ProsesKehadiranSiswa')->findOneBy(['sekolah' => $sekolah, 'tahunAkademik' => $jadwal->getTahunAkademik(), 'kelas' => $jadwal->getKelas(), 'tanggal' => $waktuSekarang, 'berhasilDiperbaruiMesin' => false]);
                     if (is_object($prosesKehadiranSiswa) && $prosesKehadiranSiswa instanceof ProsesKehadiranSiswa) {
                         $prosesKehadiranSiswa->setBerhasilDiperbaruiMesin(true);
                         $em->persist($prosesKehadiranSiswa);
                     }
                 }
             }
             @unlink($extractedFile);
         }
         $em->flush();
         $retval['pesan'][] = "»»» Jumlah kehadiran siswa terbarui: {$counterJumlahTerproses}";
         $response->setContent(json_encode($retval));
         return $response;
     }
     $response->setContent(json_encode($retval));
     return $response;
 }
 protected function execute(InputInterface $input, OutputInterface $output)
 {
     /* @var $em EntityManager */
     $em = $this->getContainer()->get('doctrine')->getManager();
     $text = '';
     $perulangan = JadwalKehadiran::getDaftarPerulangan();
     $waktuSekarang = new \DateTime();
     $jam = $waktuSekarang->format('H:i') . ':00';
     $mingguanHariKe = $waktuSekarang->format('N');
     $bulananHariKe = $waktuSekarang->format('j');
     if ($input->getOption('paksa')) {
         $jam = '13:00:00';
         $waktuSekarang = new \DateTime(date("Y-m-d {$jam}"));
         $mingguanHariKe = 1;
         // 1 = senin
         $bulananHariKe = 1;
         print "[paksa]: periksa jadwal jam:{$jam}, mingguanHariKe:{$mingguanHariKe}, bulananHariKe:{$bulananHariKe}\n";
     }
     $semuaSekolah = $em->getRepository('LanggasSisdikBundle:Sekolah')->findAll();
     foreach ($semuaSekolah as $sekolah) {
         if (!(is_object($sekolah) && $sekolah instanceof Sekolah)) {
             continue;
         }
         if ($input->getOption('paksa')) {
             print "[paksa]: " . $sekolah->getNama() . "\n";
         }
         $kalenderPendidikan = $em->getRepository('LanggasSisdikBundle:KalenderPendidikan')->findOneBy(['sekolah' => $sekolah, 'tanggal' => $waktuSekarang, 'kbm' => true]);
         if (!(is_object($kalenderPendidikan) && $kalenderPendidikan instanceof KalenderPendidikan)) {
             continue;
         }
         if (!$this->isLocked($sekolah->getNomorUrut())) {
             foreach ($perulangan as $key => $value) {
                 $querybuilder = $em->createQueryBuilder()->select('jadwal')->from('LanggasSisdikBundle:JadwalKepulangan', 'jadwal')->leftJoin('jadwal.tahunAkademik', 'tahunAkademik')->andWhere('jadwal.sekolah = :sekolah')->andWhere('jadwal.paramstatusDariJam <= :jam')->andWhere('jadwal.perulangan = :perulangan')->andWhere('jadwal.permulaan = :permulaan')->andWhere('tahunAkademik.aktif = :aktif')->setParameter('sekolah', $sekolah)->setParameter('jam', $jam)->setParameter('perulangan', $key)->setParameter('permulaan', true)->setParameter('aktif', true);
                 if ($key == 'b-mingguan') {
                     $querybuilder->andWhere('jadwal.mingguanHariKe = :harike')->setParameter('harike', $mingguanHariKe);
                 } elseif ($key == '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;
                     }
                     $prosesKepulanganSiswa = $em->getRepository('LanggasSisdikBundle:ProsesKepulanganSiswa')->findOneBy(['sekolah' => $sekolah, 'tahunAkademik' => $jadwal->getTahunAkademik(), 'kelas' => $jadwal->getKelas(), 'tanggal' => $waktuSekarang]);
                     if (is_object($prosesKepulanganSiswa) && $prosesKepulanganSiswa instanceof ProsesKepulanganSiswa) {
                         if ($prosesKepulanganSiswa->isBerhasilInisiasi()) {
                             continue;
                         }
                     }
                     $dariJam = $jadwal->getParamstatusDariJam();
                     if ($input->getOption('paksa')) {
                         $dariJam = $jam;
                     }
                     $waktuJadwal = strtotime(date('Y-m-d') . " {$dariJam}");
                     $bedaWaktu = $waktuSekarang->getTimestamp() - $waktuJadwal;
                     if ($input->getOption('paksa')) {
                         print "[paksa]: param status dari jam = " . $jadwal->getParamstatusDariJam() . "\n";
                         print "[paksa]: waktu jadwal menjadi = " . date("Y-m-d H:i:s", $waktuJadwal) . "\n";
                         print "[paksa]: waktu sekarang menjadi = " . $waktuSekarang->format("Y-m-d H:i:s") . "\n";
                         print "[paksa]: beda waktu = " . $bedaWaktu . "\n";
                     }
                     if ($bedaWaktu >= 0 && $bedaWaktu <= self::BEDA_WAKTU_MAKS) {
                         $qbKehadiran = $em->createQueryBuilder()->select('kehadiran')->from('LanggasSisdikBundle:KehadiranSiswa', 'kehadiran')->where('kehadiran.sekolah = :sekolah')->andWhere('kehadiran.tahunAkademik = :tahunAkademik')->andWhere('kehadiran.kelas = :kelas')->andWhere('kehadiran.tanggal = :tanggal')->andWhere('kehadiran.statusKehadiran = :tepat OR kehadiran.statusKehadiran = :telat')->setParameter('sekolah', $sekolah)->setParameter('tahunAkademik', $jadwal->getTahunAkademik())->setParameter('kelas', $jadwal->getKelas())->setParameter('tanggal', $waktuSekarang->format('Y-m-d'))->setParameter('tepat', 'a-hadir-tepat')->setParameter('telat', 'b-hadir-telat');
                         $entitiesKehadiran = $qbKehadiran->getQuery()->getResult();
                         foreach ($entitiesKehadiran as $kehadiran) {
                             if (!(is_object($kehadiran) && $kehadiran instanceof KehadiranSiswa)) {
                                 continue;
                             }
                             $qbKepulangan = $em->createQueryBuilder()->select('kepulangan')->from('LanggasSisdikBundle:KepulanganSiswa', 'kepulangan')->where('kepulangan.sekolah = :sekolah')->andWhere('kepulangan.siswa = :siswa')->andWhere('kepulangan.tanggal = :tanggal')->setParameter('sekolah', $sekolah)->setParameter('siswa', $kehadiran->getSiswa())->setParameter('tanggal', $waktuSekarang->format('Y-m-d'));
                             $entityKepulangan = $qbKepulangan->getQuery()->getResult();
                             if (count($entityKepulangan) >= 1) {
                                 continue;
                             }
                             $kepulangan = new KepulanganSiswa();
                             $kepulangan->setSekolah($jadwal->getSekolah());
                             $kepulangan->setTahunAkademik($jadwal->getTahunAkademik());
                             $kepulangan->setKelas($jadwal->getKelas());
                             $kepulangan->setSiswa($kehadiran->getSiswa());
                             $kepulangan->setStatusKepulangan($jadwal->getStatusKepulangan());
                             $kepulangan->setPermulaan($jadwal->isPermulaan());
                             $kepulangan->setTervalidasi(false);
                             $kepulangan->setTanggal($waktuSekarang);
                             $kepulangan->setSmsTerproses(false);
                             $kepulangan->setKehadiranSiswa($kehadiran);
                             $em->persist($kepulangan);
                         }
                         if (is_object($prosesKepulanganSiswa) && $prosesKepulanganSiswa instanceof ProsesKepulanganSiswa) {
                             $prosesKepulanganSiswa->setBerhasilInisiasi(true);
                         } else {
                             $prosesKepulanganSiswa = new ProsesKepulanganSiswa();
                             $prosesKepulanganSiswa->setSekolah($jadwal->getSekolah());
                             $prosesKepulanganSiswa->setTahunAkademik($jadwal->getTahunAkademik());
                             $prosesKepulanganSiswa->setKelas($jadwal->getKelas());
                             $prosesKepulanganSiswa->setTanggal($waktuSekarang);
                             $prosesKepulanganSiswa->setBerhasilInisiasi(true);
                         }
                         $em->persist($prosesKepulanganSiswa);
                         $em->flush();
                     }
                 }
             }
             if ($text != '') {
                 $output->writeln($text);
             }
         } else {
             print "proses inisiasi kepulangan sekolah " . $sekolah->getNama() . " telah dan sedang berjalan\n";
         }
     }
 }
 /**
  * API untuk mengunduh jadwal kehadiran berdasarkan token mesin wakil
  *
  * @Route("/_api/jadwal-kehadiran/{token}.{_format}", name="jadwal_kehadiran_unduh-jadwal", defaults={"_format"="json"}, requirements={"_format"="(xml|json)"})
  * @Method("GET")
  */
 public function unduhJadwalKehadiranAction($token)
 {
     /* @var $em EntityManager */
     $em = $this->getDoctrine()->getManager();
     $entity = $em->getRepository('LanggasSisdikBundle:TokenSekolah')->findByMesinProxy($token);
     if (count($entity) == 1) {
         $tokenSekolah = $entity[0];
         if ($tokenSekolah instanceof TokenSekolah) {
             $sekolah = $tokenSekolah->getSekolah();
             $jadwal = [];
             foreach (JadwalKehadiran::getDaftarPerulangan() as $key => $value) {
                 $querybuilder = $em->createQueryBuilder()->select('jadwalKehadiran')->from('LanggasSisdikBundle:JadwalKehadiran', 'jadwalKehadiran')->leftJoin('jadwalKehadiran.tahunAkademik', 'tahunAkademik')->where('jadwalKehadiran.sekolah = :sekolah')->andWhere('tahunAkademik.aktif = :aktif')->andWhere('jadwalKehadiran.perulangan = :perulangan')->andWhere("jadwalKehadiran.paramstatusDariJam != '' OR jadwalKehadiran.paramstatusHinggaJam != ''")->addOrderBy('jadwalKehadiran.mingguanHariKe', 'ASC')->addOrderBy('jadwalKehadiran.paramstatusDariJam', 'ASC')->addOrderBy('jadwalKehadiran.paramstatusHinggaJam', 'DESC')->addOrderBy('jadwalKehadiran.bulananHariKe')->setParameter('sekolah', $sekolah)->setParameter('aktif', true)->setParameter('perulangan', $key);
                 $result = $querybuilder->getQuery()->getResult();
                 if ($result) {
                     $jadwal[$key] = $result;
                 }
             }
             $querybuilder2 = $em->createQueryBuilder()->select('mesinKehadiran')->from('LanggasSisdikBundle:MesinKehadiran', 'mesinKehadiran')->where('mesinKehadiran.sekolah = :sekolah')->setParameter('sekolah', $sekolah->getId());
             $mesinKehadiran = $querybuilder2->getQuery()->getResult();
             $userAdmin = $em->getRepository('LanggasSisdikBundle:User')->findByRole($sekolah, 'ROLE_ADMIN');
             return ['jadwal' => $jadwal, 'mesinKehadiran' => $mesinKehadiran, 'userAdmin' => $userAdmin];
         }
     } else {
         throw new NotFoundHttpException($this->get('translator')->trans('exception.token.tak.sahih'));
     }
 }
 protected function execute(InputInterface $input, OutputInterface $output)
 {
     $smsTerproses = 0;
     /* @var $em EntityManager */
     $em = $this->getContainer()->get('doctrine')->getManager();
     $translator = $this->getContainer()->get('translator');
     $translator->setLocale("id_ID");
     $text = '';
     $perulangan = JadwalKehadiran::getDaftarPerulangan();
     $namaNamaHari = JadwalKehadiran::getNamaHari();
     $waktuSekarang = new \DateTime();
     $mingguanHariKe = $waktuSekarang->format('N');
     $bulananHariKe = $waktuSekarang->format('j');
     $semuaSekolah = $em->getRepository('LanggasSisdikBundle:Sekolah')->findAll();
     foreach ($semuaSekolah as $sekolah) {
         if (!(is_object($sekolah) && $sekolah instanceof Sekolah)) {
             continue;
         }
         if (!$this->isLocked($sekolah->getNomorUrut())) {
             $vendorSekolah = $em->getRepository('LanggasSisdikBundle:VendorSekolah')->findOneBy(['sekolah' => $sekolah]);
             if (!$vendorSekolah instanceof VendorSekolah) {
                 continue;
             }
             $layananSms = $em->getRepository('LanggasSisdikBundle:PilihanLayananSms')->findOneBy(['sekolah' => $sekolah, 'jenisLayanan' => 'zza-ringkasan-kehadiran', 'status' => true]);
             if (!$layananSms instanceof PilihanLayananSms) {
                 continue;
             }
             $tahunAkademikAktif = $em->getRepository('LanggasSisdikBundle:TahunAkademik')->findOneBy(['sekolah' => $sekolah, 'aktif' => true]);
             if (!$tahunAkademikAktif instanceof TahunAkademik) {
                 continue;
             }
             $kalenderPendidikan = $em->getRepository('LanggasSisdikBundle:KalenderPendidikan')->findOneBy(['sekolah' => $sekolah, 'tanggal' => $waktuSekarang, 'kbm' => true]);
             if (!$kalenderPendidikan instanceof KalenderPendidikan) {
                 continue;
             }
             $waliKelasAktif = $em->createQueryBuilder()->select('waliKelas')->from('LanggasSisdikBundle:WaliKelas', 'waliKelas')->leftJoin('waliKelas.user', 'user')->where('waliKelas.tahunAkademik = :tahunAkademik')->andWhere('waliKelas.kirimIkhtisarKehadiran = :kirimIkhtisar')->andWhere('waliKelas.templatesmsIkhtisarKehadiran IS NOT NULL')->andWhere("user.nomorPonsel <> ''")->setParameter('tahunAkademik', $tahunAkademikAktif)->setParameter('kirimIkhtisar', true)->getQuery()->useQueryCache(true)->getResult();
             /* @var $waliKelas WaliKelas */
             foreach ($waliKelasAktif as $waliKelas) {
                 /* @var $jadwalKehadiranTerawal JadwalKehadiran */
                 $jadwalKehadiranTerawal = null;
                 $jamTerawal = 0;
                 if ($input->getOption('debug')) {
                     print $waliKelas->getUser()->getName() . "\n";
                 }
                 foreach ($perulangan as $key => $value) {
                     $qbJadwalKehadiran = $em->createQueryBuilder()->select('jadwal')->from('LanggasSisdikBundle:JadwalKehadiran', 'jadwal')->where('jadwal.sekolah = :sekolah')->andWhere('jadwal.tahunAkademik = :tahunAkademik')->andWhere('jadwal.kelas = :kelas')->andWhere('jadwal.perulangan = :perulangan')->andWhere('jadwal.kirimSms = 1')->andWhere('jadwal.smsJam IS NOT NULL')->andWhere("jadwal.smsJam <> ''")->setParameter('sekolah', $sekolah)->setParameter('tahunAkademik', $tahunAkademikAktif)->setParameter('kelas', $waliKelas->getKelas())->setParameter('perulangan', $key)->addOrderBy('jadwal.smsJam', 'ASC');
                     if ($key == 'b-mingguan') {
                         $qbJadwalKehadiran->andWhere('jadwal.mingguanHariKe = :harike')->setParameter('harike', $mingguanHariKe);
                     } elseif ($key == 'c-bulanan') {
                         $qbJadwalKehadiran->andWhere('jadwal.bulananHariKe = :tanggalke')->setParameter('tanggalke', $bulananHariKe);
                     }
                     $jadwalKehadiran = $qbJadwalKehadiran->getQuery()->useQueryCache(true)->getResult();
                     if (count($jadwalKehadiran) > 0) {
                         /* @var $jadwal JadwalKehadiran */
                         foreach ($jadwalKehadiran as $jadwal) {
                             $jamSms = intval(str_replace(':', '', $jadwal->getSmsJam()));
                             if ($jamTerawal == 0 || $jamTerawal > $jamSms) {
                                 $jamTerawal = $jamSms;
                                 $jadwalKehadiranTerawal = $jadwal;
                             }
                         }
                     }
                 }
                 if ($jamTerawal != 0 || $jadwalKehadiranTerawal instanceof JadwalKehadiran) {
                     $timestampWaktuJadwal = strtotime(date('Y-m-d') . " " . $jadwalKehadiranTerawal->getSmsJam());
                     $bedaWaktu = abs($waktuSekarang->getTimestamp() - $timestampWaktuJadwal - $waliKelas->getJadwalKirimIkhtisarKehadiran() * 60);
                     $prosesKehadiranSiswa = $em->getRepository('LanggasSisdikBundle:ProsesKehadiranSiswa')->findOneBy(['sekolah' => $sekolah, 'tahunAkademik' => $tahunAkademikAktif, 'kelas' => $waliKelas->getKelas(), 'tanggal' => $waktuSekarang, 'berhasilKirimSmsRingkasan' => false]);
                     if (!$prosesKehadiranSiswa instanceof ProsesKehadiranSiswa) {
                         continue;
                     }
                     if ($input->getOption('paksa')) {
                         $bedaWaktu = 0;
                     }
                     if ($input->getOption('debug')) {
                         print $waliKelas->getJadwalKirimIkhtisarKehadiran() . "\n";
                         print $jadwalKehadiranTerawal->getSmsJam() . "\n";
                         print $bedaWaktu . "\n";
                     }
                     if ($bedaWaktu <= self::BEDA_WAKTU_MAKS) {
                         $kehadiranSiswa = $em->createQueryBuilder()->select('kehadiran')->from('LanggasSisdikBundle:KehadiranSiswa', 'kehadiran')->where('kehadiran.sekolah = :sekolah')->andWhere('kehadiran.tahunAkademik = :tahunakademik')->andWhere('kehadiran.kelas = :kelas')->andWhere('kehadiran.tanggal = :tanggal')->setParameter('sekolah', $sekolah)->setParameter('tahunakademik', $tahunAkademikAktif)->setParameter('kelas', $waliKelas->getKelas())->setParameter('tanggal', $waktuSekarang->format("Y-m-d"))->getQuery()->useQueryCache(true)->getResult();
                         if (count($kehadiranSiswa) <= 0) {
                             continue;
                         }
                         $jumlahTepat = 0;
                         $jumlahTelat = 0;
                         $jumlahAlpa = 0;
                         $jumlahIzin = 0;
                         $jumlahSakit = 0;
                         /* @var $kehadiran KehadiranSiswa */
                         foreach ($kehadiranSiswa as $kehadiran) {
                             switch ($kehadiran->getStatusKehadiran()) {
                                 case 'a-hadir-tepat':
                                     $jumlahTepat++;
                                     break;
                                 case 'b-hadir-telat':
                                     $jumlahTelat++;
                                     break;
                                 case 'c-alpa':
                                     $jumlahAlpa++;
                                     break;
                                 case 'd-izin':
                                     $jumlahIzin++;
                                     break;
                                 case 'e-sakit':
                                     $jumlahSakit++;
                                     break;
                             }
                         }
                         $teksRingkasan = $waliKelas->getTemplatesmsIkhtisarKehadiran()->getTeks();
                         $teksRingkasan = str_replace("%nama%", $waliKelas->getUser()->getName(), $teksRingkasan);
                         $teksRingkasan = str_replace("%kelas%", $waliKelas->getKelas()->getNama(), $teksRingkasan);
                         $indeksHari = $waktuSekarang->format('N');
                         $teksRingkasan = str_replace("%hari%", $translator->trans($namaNamaHari[$indeksHari]), $teksRingkasan);
                         $teksRingkasan = str_replace("%tanggal%", $waktuSekarang->format('d/m/Y'), $teksRingkasan);
                         $teksRingkasan = str_replace("%jumlah-tepat%", $jumlahTepat, $teksRingkasan);
                         $teksRingkasan = str_replace("%jumlah-telat%", $jumlahTelat, $teksRingkasan);
                         $teksRingkasan = str_replace("%jumlah-alpa%", $jumlahAlpa, $teksRingkasan);
                         $teksRingkasan = str_replace("%jumlah-izin%", $jumlahIzin, $teksRingkasan);
                         $teksRingkasan = str_replace("%jumlah-sakit%", $jumlahSakit, $teksRingkasan);
                         $terkirim = false;
                         $nomorponsel = preg_split("/[\\s,\\/]+/", $waliKelas->getUser()->getNomorPonsel());
                         foreach ($nomorponsel as $ponsel) {
                             $messenger = $this->getContainer()->get('sisdik.messenger');
                             if ($messenger instanceof Messenger) {
                                 if ($vendorSekolah->getJenis() == 'khusus') {
                                     $messenger->setUseVendor(true);
                                     $messenger->setVendorURL($vendorSekolah->getUrlPengirimPesan());
                                 }
                                 $messenger->setPhoneNumber($ponsel);
                                 $messenger->setMessage($teksRingkasan);
                                 if ($input->getOption('debug')) {
                                     $messenger->populateMessage();
                                     print "[debug]: " . $messenger->getMessageCommand() . "\n";
                                 } else {
                                     $messenger->sendMessage($sekolah);
                                 }
                                 $smsTerproses++;
                                 $terkirim = true;
                             }
                         }
                         if ($terkirim) {
                             if ($prosesKehadiranSiswa instanceof ProsesKehadiranSiswa) {
                                 if (!$input->getOption('debug')) {
                                     $prosesKehadiranSiswa->setBerhasilKirimSmsRingkasan(true);
                                     $em->persist($prosesKehadiranSiswa);
                                 }
                             }
                         }
                         if (!$input->getOption('debug')) {
                             $em->flush();
                         }
                     }
                 }
             }
             if ($input->getOption('debug')) {
                 $text .= "[debug]: SMS ringkasan kehadiran terproses = {$smsTerproses}";
             }
             if ($text != '') {
                 $output->writeln($text);
             }
         } else {
             print "proses pengiriman pesan ringkasan kehadiran sekolah " . $sekolah->getNama() . " telah dan sedang berjalan\n";
         }
     }
 }
 protected function execute(InputInterface $input, OutputInterface $output)
 {
     $smsKehadiranTerproses = 0;
     /* @var $em EntityManager */
     $em = $this->getContainer()->get('doctrine')->getManager();
     $translator = $this->getContainer()->get('translator');
     $translator->setLocale("id_ID");
     $text = '';
     $perulangan = JadwalKehadiran::getDaftarPerulangan();
     $namaNamaHari = JadwalKehadiran::getNamaHari();
     $waktuSekarang = new \DateTime();
     $jam = $waktuSekarang->format('H:i') . ':00';
     $mingguanHariKe = $waktuSekarang->format('N');
     $bulananHariKe = $waktuSekarang->format('j');
     if ($input->getOption('paksa')) {
         $jam = '09:00:00';
         $waktuSekarang = new \DateTime(date("Y-m-d {$jam}"));
         $mingguanHariKe = 1;
         // 1 = senin
         $bulananHariKe = 1;
         print "[paksa]: periksa jadwal jam:{$jam}, mingguanHariKe:{$mingguanHariKe}, bulananHariKe:{$bulananHariKe}\n";
     }
     $qbSekolah = $em->createQueryBuilder()->select('sekolah')->from('LanggasSisdikBundle:Sekolah', 'sekolah');
     $semuaSekolah = $qbSekolah->getQuery()->getResult();
     foreach ($semuaSekolah as $sekolah) {
         if (!(is_object($sekolah) && $sekolah instanceof Sekolah)) {
             continue;
         }
         if (!$this->isLocked($sekolah->getNomorUrut())) {
             $vendorSekolah = $em->getRepository('LanggasSisdikBundle:VendorSekolah')->findOneBy(['sekolah' => $sekolah]);
             $tahunAkademikAktif = $em->getRepository('LanggasSisdikBundle:TahunAkademik')->findOneBy(['sekolah' => $sekolah, 'aktif' => true]);
             $kalenderPendidikan = $em->getRepository('LanggasSisdikBundle:KalenderPendidikan')->findOneBy(['sekolah' => $sekolah, 'tanggal' => $waktuSekarang, 'kbm' => true]);
             if (!(is_object($kalenderPendidikan) && $kalenderPendidikan instanceof KalenderPendidikan)) {
                 continue;
             }
             $qbKehadiranSemua = $em->createQueryBuilder()->select('COUNT(kehadiran.id)')->from('LanggasSisdikBundle:KehadiranSiswa', 'kehadiran')->where('kehadiran.sekolah = :sekolah')->andWhere('kehadiran.tahunAkademik = :tahunakademik')->andWhere('kehadiran.tanggal = :tanggal')->setParameter('sekolah', $sekolah)->setParameter('tahunakademik', $tahunAkademikAktif)->setParameter('tanggal', $waktuSekarang->format("Y-m-d"));
             $jumlahKehadiranSemua = $qbKehadiranSemua->getQuery()->getSingleScalarResult();
             $qbKehadiranPermulaan = $em->createQueryBuilder()->select('COUNT(kehadiran.id)')->from('LanggasSisdikBundle:KehadiranSiswa', 'kehadiran')->where('kehadiran.sekolah = :sekolah')->andWhere('kehadiran.tahunAkademik = :tahunakademik')->andWhere('kehadiran.tanggal = :tanggal')->andWhere('kehadiran.permulaan = :permulaan')->setParameter('sekolah', $sekolah)->setParameter('tahunakademik', $tahunAkademikAktif)->setParameter('tanggal', $waktuSekarang->format("Y-m-d"))->setParameter('permulaan', true);
             $jumlahKehadiranPermulaan = $qbKehadiranPermulaan->getQuery()->getSingleScalarResult();
             // jangan kirim pesan jika semua data kehadiran masih berstatus permulaan
             if ($jumlahKehadiranSemua == $jumlahKehadiranPermulaan) {
                 continue;
             }
             foreach ($perulangan as $key => $value) {
                 $querybuilder = $em->createQueryBuilder()->select('jadwal')->from('LanggasSisdikBundle:JadwalKehadiran', 'jadwal')->leftJoin('jadwal.tahunAkademik', 'tahunAkademik')->where('jadwal.sekolah = :sekolah')->andWhere('jadwal.smsJam <= :jam')->andWhere('jadwal.perulangan = :perulangan')->andWhere('jadwal.kirimSms = :kirimsms')->andWhere('tahunAkademik.aktif = :aktif')->setParameter('sekolah', $sekolah->getId())->setParameter('jam', $jam)->setParameter('perulangan', $key)->setParameter('kirimsms', true)->setParameter('aktif', true);
                 if ($key == 'b-mingguan') {
                     $querybuilder->andWhere('jadwal.mingguanHariKe = :harike')->setParameter('harike', $mingguanHariKe);
                 } elseif ($key == 'c-bulanan') {
                     $querybuilder->andWhere('jadwal.bulananHariKe = :tanggalke')->setParameter('tanggalke', $bulananHariKe);
                 }
                 $jadwalKehadiran = $querybuilder->getQuery()->getResult();
                 foreach ($jadwalKehadiran as $jadwal) {
                     if (!(is_object($jadwal) && $jadwal instanceof JadwalKehadiran)) {
                         continue;
                     }
                     $jenisLayananSms = 'tak-terdefinisi';
                     switch ($jadwal->getStatusKehadiran()) {
                         case 'a-hadir-tepat':
                             $jenisLayananSms = 'l-kehadiran-tepat';
                             break;
                         case 'b-hadir-telat':
                             $jenisLayananSms = 'm-kehadiran-telat';
                             break;
                         case 'c-alpa':
                             $jenisLayananSms = 'k-kehadiran-alpa';
                             break;
                         case 'd-izin':
                             $jenisLayananSms = 'n-kehadiran-izin';
                             break;
                         case 'e-sakit':
                             $jenisLayananSms = 'o-kehadiran-sakit';
                             break;
                     }
                     $layananSms = $em->getRepository('LanggasSisdikBundle:PilihanLayananSms')->findOneBy(['sekolah' => $sekolah, 'jenisLayanan' => $jenisLayananSms, 'status' => true]);
                     if (!(is_object($layananSms) && $layananSms instanceof PilihanLayananSms)) {
                         continue;
                     }
                     $smsJam = $jadwal->getSmsJam();
                     if ($input->getOption('paksa')) {
                         $smsJam = $jam;
                     }
                     $waktuJadwal = strtotime(date('Y-m-d') . " {$smsJam}");
                     $bedaWaktu = $waktuSekarang->getTimestamp() - $waktuJadwal;
                     if ($input->getOption('paksa')) {
                         print "[paksa]: kirim sms jam = " . $jadwal->getSmsJam() . "\n";
                         print "[paksa]: waktu jadwal menjadi = " . date("Y-m-d H:i:s", $waktuJadwal) . "\n";
                         print "[paksa]: waktu sekarang menjadi = " . $waktuSekarang->format("Y-m-d H:i:s") . "\n";
                         print "[paksa]: beda waktu = " . $bedaWaktu . "\n";
                     }
                     if ($bedaWaktu >= 0 && $bedaWaktu <= self::BEDA_WAKTU_MAKS) {
                         $qbKehadiran = $em->createQueryBuilder()->select('kehadiran')->from('LanggasSisdikBundle:KehadiranSiswa', 'kehadiran')->where('kehadiran.sekolah = :sekolah')->andWhere('kehadiran.tahunAkademik = :tahunakademik')->andWhere('kehadiran.kelas = :kelas')->andWhere('kehadiran.tanggal = :tanggal')->andWhere('kehadiran.statusKehadiran = :statuskehadiran')->andWhere('kehadiran.smsTerproses = :terproses')->setParameter('sekolah', $sekolah)->setParameter('tahunakademik', $jadwal->getTahunAkademik())->setParameter('kelas', $jadwal->getKelas())->setParameter('tanggal', $waktuSekarang->format("Y-m-d"))->setParameter('statuskehadiran', $jadwal->getStatusKehadiran())->setParameter('terproses', false);
                         $entitiesKehadiran = $qbKehadiran->getQuery()->getResult();
                         foreach ($entitiesKehadiran as $kehadiran) {
                             if (!(is_object($kehadiran) && $kehadiran instanceof KehadiranSiswa)) {
                                 continue;
                             }
                             $ortuWaliAktif = $em->getRepository('LanggasSisdikBundle:OrangtuaWali')->findOneBy(['siswa' => $kehadiran->getSiswa(), 'aktif' => true]);
                             if (is_object($ortuWaliAktif) && $ortuWaliAktif instanceof OrangtuaWali) {
                                 $ponselOrtuWaliAktif = $ortuWaliAktif->getPonsel();
                                 if ($ponselOrtuWaliAktif != "") {
                                     $tekstemplate = $jadwal->getTemplatesms()->getTeks();
                                     $tekstemplate = str_replace("%nama%", $kehadiran->getSiswa()->getNamaLengkap(), $tekstemplate);
                                     $tekstemplate = str_replace("%nis%", $kehadiran->getSiswa()->getNomorInduk(), $tekstemplate);
                                     $indeksHari = $kehadiran->getTanggal()->format('N');
                                     $tekstemplate = str_replace("%hari%", $translator->trans($namaNamaHari[$indeksHari]), $tekstemplate);
                                     $tekstemplate = str_replace("%tanggal%", $kehadiran->getTanggal()->format('d/m/Y'), $tekstemplate);
                                     if ($kehadiran->isTervalidasi() && str_replace(':', '', $kehadiran->getJam()) <= str_replace(':', '', $jadwal->getParamstatusDariJam())) {
                                         $tekstemplate = str_replace("%jam%", "", $tekstemplate);
                                     } else {
                                         $tekstemplate = str_replace("%jam%", $kehadiran->getJam(), $tekstemplate);
                                     }
                                     $tekstemplate = str_replace("%keterangan%", $kehadiran->getKeteranganStatus(), $tekstemplate);
                                     $terkirim = false;
                                     $nomorponsel = preg_split("/[\\s,\\/]+/", $ponselOrtuWaliAktif);
                                     foreach ($nomorponsel as $ponsel) {
                                         $messenger = $this->getContainer()->get('sisdik.messenger');
                                         if ($messenger instanceof Messenger) {
                                             if ($vendorSekolah instanceof VendorSekolah) {
                                                 if ($vendorSekolah->getJenis() == 'khusus') {
                                                     $messenger->setUseVendor(true);
                                                     $messenger->setVendorURL($vendorSekolah->getUrlPengirimPesan());
                                                 }
                                             }
                                             $messenger->setPhoneNumber($ponsel);
                                             $messenger->setMessage($tekstemplate);
                                             if ($input->getOption('debug')) {
                                                 $messenger->populateMessage();
                                                 print "[debug]: " . $messenger->getMessageCommand() . "\n";
                                             } else {
                                                 $messenger->sendMessage($sekolah);
                                             }
                                             $smsKehadiranTerproses++;
                                             if ($input->getOption('paksa')) {
                                                 print $smsKehadiranTerproses . ", ";
                                             }
                                             $terkirim = true;
                                         }
                                     }
                                     if ($terkirim) {
                                         if (!$input->getOption('debug')) {
                                             $kehadiran->setSmsTerproses($terkirim);
                                             $em->persist($kehadiran);
                                         }
                                     }
                                 }
                             }
                         }
                         $prosesKehadiranSiswa = $em->getRepository('LanggasSisdikBundle:ProsesKehadiranSiswa')->findOneBy(['sekolah' => $sekolah, 'tahunAkademik' => $jadwal->getTahunAkademik(), 'kelas' => $jadwal->getKelas(), 'tanggal' => $waktuSekarang, 'berhasilKirimSms' => false]);
                         if (is_object($prosesKehadiranSiswa) && $prosesKehadiranSiswa instanceof ProsesKehadiranSiswa) {
                             if (!$input->getOption('debug')) {
                                 $prosesKehadiranSiswa->setBerhasilKirimSms(true);
                                 $em->persist($prosesKehadiranSiswa);
                             }
                         }
                         if (!$input->getOption('debug')) {
                             $em->flush();
                         }
                     }
                 }
             }
             if ($input->getOption('debug')) {
                 $text .= "[debug]: SMS kehadiran terproses = {$smsKehadiranTerproses}";
             }
             if ($text != '') {
                 $output->writeln($text);
             }
         } else {
             print "proses pengiriman pesan kehadiran sekolah " . $sekolah->getNama() . " telah dan sedang berjalan\n";
         }
     }
 }