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('jenisLayanan', 'choice', ['choices' => array_merge(PilihanLayananSms::getDaftarLayananPeriodik()), 'required' => true, 'label' => 'label.layanansms.jenis'])->add('perulangan', 'choice', ['choices' => LayananSmsPeriodik::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'], 'help_block' => 'help.untuk.perulangan.mingguan'])->add('bulananHariKe', 'choice', ['label' => 'label.monthday', 'choices' => JadwalKehadiran::getAngkaHariSebulan(), 'multiple' => false, 'expanded' => false, 'required' => false, 'placeholder' => 'label.selectmonthday', 'attr' => ['class' => 'medium'], 'help_block' => 'help.untuk.perulangan.bulanan.atau.lebih.lama'])->add('bulanAwal', 'choice', ['label' => 'label.bulan.awal', 'choices' => LayananSmsPeriodik::getDaftarNamaBulan(), 'multiple' => false, 'expanded' => false, 'required' => false, 'placeholder' => 'label.pilih.bulan', 'attr' => ['class' => 'medium'], 'help_block' => 'help.untuk.perulangan.triwulan.atau.lebih.lama'])->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' => true, 'property' => 'optionLabel', 'query_builder' => function (EntityRepository $repository) use($sekolah) {
         $qb = $repository->createQueryBuilder('templateSms')->where('templateSms.sekolah = :sekolah')->orderBy('templateSms.nama', 'ASC')->setParameter('sekolah', $sekolah);
         return $qb;
     }, 'attr' => ['class' => 'xlarge']])->add('tingkat', 'entity', ['class' => 'LanggasSisdikBundle:Tingkat', 'label' => 'label.tingkat', 'required' => false, 'property' => 'optionLabel', 'placeholder' => 'label.pilih.tingkat', 'query_builder' => function (EntityRepository $repository) use($sekolah) {
         $qb = $repository->createQueryBuilder('tingkat')->where('tingkat.sekolah = :sekolah')->orderBy('tingkat.urutan', 'ASC')->setParameter('sekolah', $sekolah);
         return $qb;
     }])->add('aktif', 'checkbox', ['label' => 'label.active', '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']);
 }
 /**
  * @Route("/{id}", name="layanan_smsperiodik_show")
  * @Method("GET")
  * @Template()
  */
 public function showAction($id)
 {
     $this->setCurrentMenu();
     $em = $this->getDoctrine()->getManager();
     $entity = $em->getRepository('LanggasSisdikBundle:LayananSmsPeriodik')->find($id);
     if (!$entity) {
         throw $this->createNotFoundException('Entity LayananSmsPeriodik tak ditemukan.');
     }
     if ($this->get('security.authorization_checker')->isGranted('view', $entity) === false) {
         throw new AccessDeniedException($this->get('translator')->trans('akses.ditolak'));
     }
     $deleteForm = $this->createDeleteForm($id);
     return ['entity' => $entity, 'delete_form' => $deleteForm->createView(), 'daftarJenisLayanan' => array_merge(PilihanLayananSms::getDaftarLayananPeriodik()), 'daftarPerulangan' => LayananSmsPeriodik::getDaftarPerulangan(), 'daftarBulan' => LayananSmsPeriodik::getDaftarNamaBulan(), 'daftarHari' => JadwalKehadiran::getNamaHari()];
 }
 protected function execute(InputInterface $input, OutputInterface $output)
 {
     $smsTerproses = 0;
     /* @var $em EntityManager */
     $em = $this->getContainer()->get('doctrine')->getManager();
     $text = '';
     $perulangan = LayananSmsPeriodik::getDaftarPerulangan();
     $daftarLayananPeriodik = PilihanLayananSms::getDaftarLayananPeriodik();
     $waktuSekarang = new \DateTime();
     $mingguanHariKe = $waktuSekarang->format('N');
     $bulananHariKe = $waktuSekarang->format('j');
     $bulanSekarang = $waktuSekarang->format('n');
     $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;
             }
             $pilihanLayananSms = $em->createQueryBuilder()->select('pilihanLayananSms')->from('LanggasSisdikBundle:PilihanLayananSms', 'pilihanLayananSms')->where('pilihanLayananSms.sekolah = :sekolah')->andWhere('pilihanLayananSms.jenisLayanan IN (?1)')->andWhere('pilihanLayananSms.status = :status')->setParameter('sekolah', $sekolah)->setParameter(1, array_keys($daftarLayananPeriodik))->setParameter('status', true)->getQuery()->getResult();
             if (count($pilihanLayananSms) <= 0) {
                 continue;
             }
             /* @var $pilihanLayanan PilihanLayananSms */
             foreach ($pilihanLayananSms as $pilihanLayanan) {
                 $layananSmsPeriodik = $em->getRepository('LanggasSisdikBundle:LayananSmsPeriodik')->findBy(['sekolah' => $sekolah, 'jenisLayanan' => $pilihanLayanan->getJenisLayanan(), 'aktif' => true]);
                 if (count($layananSmsPeriodik) <= 0) {
                     continue;
                 }
                 /* @var $layananSms LayananSmsPeriodik */
                 foreach ($layananSmsPeriodik as $layananSms) {
                     $bulanAwal = $layananSms->getBulanAwal();
                     $timestampWaktuJadwal = strtotime(date('Y-m-d') . " " . $layananSms->getSmsJam());
                     $bedaWaktu = abs($waktuSekarang->getTimestamp() - $timestampWaktuJadwal);
                     if ($input->getOption('paksa')) {
                         $bedaWaktu = 0;
                         $mingguanHariKe = 7;
                         print "[paksa]: Memaksa beda waktu menjadi 0 dan hari menjadi 7 (minggu)\n";
                     }
                     switch ($layananSms->getPerulangan()) {
                         case 'a-harian':
                             if ($bedaWaktu <= self::BEDA_WAKTU_MAKS) {
                                 $smsTerproses = $this->kirimSms($input, $sekolah, $vendorSekolah, $layananSms, $waktuSekarang);
                             }
                             break;
                         case 'b-mingguan':
                             if ($layananSms->getMingguanHariKe() != $mingguanHariKe) {
                                 continue;
                             }
                             if ($bedaWaktu <= self::BEDA_WAKTU_MAKS) {
                                 $smsTerproses = $this->kirimSms($input, $sekolah, $vendorSekolah, $layananSms, $waktuSekarang);
                             }
                             break;
                         case 'c-bulanan':
                             if ($layananSms->getBulananHariKe() != $bulananHariKe) {
                                 continue;
                             }
                             if ($bedaWaktu <= self::BEDA_WAKTU_MAKS) {
                                 $smsTerproses = $this->kirimSms($input, $sekolah, $vendorSekolah, $layananSms, $waktuSekarang);
                             }
                             break;
                         case 'd-triwulan':
                             if ($bulanAwal != $bulanSekarang || $bulanAwal + 3 != $bulanSekarang || $bulanAwal + 6 != $bulanSekarang || $bulanAwal + 9 != $bulanSekarang) {
                                 continue;
                             }
                             if ($layananSms->getBulananHariKe() != $bulananHariKe) {
                                 continue;
                             }
                             if ($bedaWaktu <= self::BEDA_WAKTU_MAKS) {
                                 $smsTerproses = $this->kirimSms($input, $sekolah, $vendorSekolah, $layananSms, $waktuSekarang);
                             }
                             break;
                         case 'e-caturwulan':
                             if ($bulanAwal != $bulanSekarang || $bulanAwal + 4 != $bulanSekarang || $bulanAwal + 8 != $bulanSekarang) {
                                 continue;
                             }
                             if ($layananSms->getBulananHariKe() != $bulananHariKe) {
                                 continue;
                             }
                             if ($bedaWaktu <= self::BEDA_WAKTU_MAKS) {
                                 $smsTerproses = $this->kirimSms($input, $sekolah, $vendorSekolah, $layananSms, $waktuSekarang);
                             }
                             break;
                         case 'f-semester':
                             if ($bulanAwal != $bulanSekarang || $bulanAwal + 6 != $bulanSekarang) {
                                 continue;
                             }
                             if ($layananSms->getBulananHariKe() != $bulananHariKe) {
                                 continue;
                             }
                             if ($bedaWaktu <= self::BEDA_WAKTU_MAKS) {
                                 $smsTerproses = $this->kirimSms($input, $sekolah, $vendorSekolah, $layananSms, $waktuSekarang);
                             }
                             break;
                         case 'g-tahunan':
                             if ($bulanAwal != $bulanSekarang) {
                                 continue;
                             }
                             if ($layananSms->getBulananHariKe() != $bulananHariKe) {
                                 continue;
                             }
                             if ($bedaWaktu <= self::BEDA_WAKTU_MAKS) {
                                 $smsTerproses = $this->kirimSms($input, $sekolah, $vendorSekolah, $layananSms, $waktuSekarang);
                             }
                             break;
                     }
                 }
             }
             if ($input->getOption('debug')) {
                 $text .= "[debug]: SMS periodik terproses = {$smsTerproses}";
             }
             if ($text != '') {
                 $output->writeln($text);
             }
         } else {
             print "proses pengiriman pesan periodik sekolah " . $sekolah->getNama() . " telah dan sedang berjalan\n";
         }
     }
 }