/**
  * @Route("/{id}/show", name="fee_recur_show")
  * @Template()
  * @Secure(roles="ROLE_BENDAHARA")
  */
 public function showAction($id)
 {
     $this->setCurrentMenu();
     $em = $this->getDoctrine()->getManager();
     $entity = $em->getRepository('LanggasSisdikBundle:BiayaRutin')->find($id);
     if (!$entity) {
         throw $this->createNotFoundException('Entity BiayaRutin 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(), 'daftarPerulangan' => BiayaRutin::getDaftarPerulangan(), 'daftarBulan' => BiayaRutin::getDaftarNamaBulan(), 'daftarHari' => JadwalKehadiran::getNamaHari()];
 }
 /**
  * @Route("/{sid}/{bid}", name="pembayaran_biaya_rutin__summary")
  * @Template()
  */
 public function summaryAction($sid, $bid)
 {
     $sekolah = $this->getSekolah();
     $this->setCurrentMenu();
     $em = $this->getDoctrine()->getManager();
     $translator = $this->get('translator');
     $siswa = $em->getRepository('LanggasSisdikBundle:Siswa')->find($sid);
     if (!$siswa instanceof Siswa) {
         throw $this->createNotFoundException('Entity Siswa tak ditemukan.');
     }
     if ($this->get('security.authorization_checker')->isGranted('view', $siswa) === false) {
         throw new AccessDeniedException($this->get('translator')->trans('akses.ditolak'));
     }
     $biaya = $em->getRepository('LanggasSisdikBundle:BiayaRutin')->find($bid);
     if (!$biaya instanceof BiayaRutin) {
         throw $this->createNotFoundException('Entity BiayaRutin tak ditemukan.');
     }
     $pembayaranRutin = $em->getRepository('LanggasSisdikBundle:PembayaranRutin')->findBy(['siswa' => $siswa, 'biayaRutin' => $biaya], ['waktuSimpan' => 'DESC'], self::PERIODE_AWAL);
     $daftarPerulangan = BiayaRutin::getDaftarPerulangan();
     $daftarBulan = BiayaRutin::getDaftarNamaBulan();
     $daftarHari = JadwalKehadiran::getNamaHari();
     $tanggalSekarang = new \DateTime();
     $bulanSekarang = $tanggalSekarang->format('n');
     /* @var $bedaWaktu \DateInterval */
     $bedaWaktu = $tanggalSekarang->diff($siswa->getPembiayaanSejak());
     $pembayaranLunas = $em->createQueryBuilder()->select('COUNT(DISTINCT pembayaran.id) AS jumlah')->from('LanggasSisdikBundle:PembayaranRutin', 'pembayaran')->leftJoin('pembayaran.transaksiPembayaranRutin', 'transaksi')->where('pembayaran.siswa = :siswa')->andWhere('pembayaran.biayaRutin = :biayaRutin')->setParameter('siswa', $siswa)->setParameter('biayaRutin', $biaya)->groupBy('pembayaran.id')->having('SUM(transaksi.nominalPembayaran) >= (SUM(DISTINCT pembayaran.nominalBiaya) - (SUM(DISTINCT pembayaran.nominalPotongan) + SUM(DISTINCT pembayaran.persenPotonganDinominalkan)))')->getQuery()->getResult();
     if (count($pembayaranLunas) == 0) {
         $pembayaranLunas[0]['jumlah'] = 0;
     }
     $jumlahPembayaran = 0;
     if (is_array($pembayaranLunas)) {
         foreach ($pembayaranLunas as $pembayaran) {
             $jumlahPembayaran += $pembayaran['jumlah'];
         }
     }
     $pembayaranBelumLunas = $em->createQueryBuilder()->select('DISTINCT pembayaran.id')->from('LanggasSisdikBundle:PembayaranRutin', 'pembayaran')->leftJoin('pembayaran.transaksiPembayaranRutin', 'transaksi')->where('pembayaran.siswa = :siswa')->andWhere('pembayaran.biayaRutin = :biayaRutin')->orderBy('pembayaran.waktuSimpan', 'DESC')->setParameter('siswa', $siswa)->setParameter('biayaRutin', $biaya)->groupBy('pembayaran.id')->having('SUM(transaksi.nominalPembayaran) < (SUM(DISTINCT pembayaran.nominalBiaya) - (SUM(DISTINCT pembayaran.nominalPotongan) + SUM(DISTINCT pembayaran.persenPotonganDinominalkan)))')->getQuery()->getResult();
     $jumlahPembayaranBelumLunas = count($pembayaranBelumLunas);
     $jumlahWajibBayar = 0;
     $jatuhTempo = $translator->trans($daftarPerulangan[$biaya->getPerulangan()]);
     if ($biaya->getBulanAwal() == 0) {
         $tmpTanggal = new \DateTime($tanggalSekarang->format('Y') . '-01-01');
     } else {
         $tmpTanggal = new \DateTime($tanggalSekarang->format('Y') . '-' . $biaya->getBulanAwal() . '-01');
     }
     $tmpHariKe = $biaya->getBulananHariKe() && $biaya->getBulananHariKe() <= 28 ? $biaya->getBulananHariKe() : '01';
     $tanggalAwalBayar = new \DateTime($siswa->getPembiayaanSejak()->format('Y-m-') . $tmpHariKe);
     $bedaBulan = abs($biaya->getBulanAwal() - $siswa->getPembiayaanSejak()->format('n'));
     switch ($biaya->getPerulangan()) {
         case 'a-harian':
             $jumlahWajibBayar = $bedaWaktu->format("%a");
             break;
         case 'b-mingguan':
             $jumlahWajibBayar = floor($bedaWaktu->format("%a") / 7);
             $jatuhTempo .= ': ' . $translator->trans($daftarHari[$biaya->getMingguanHariKe()]);
             break;
         case 'c-bulanan':
             $jumlahWajibBayar = $bedaWaktu->format("%m");
             if ($bedaWaktu->format("%d") >= $biaya->getBulananHariKe()) {
                 $jumlahWajibBayar++;
             }
             $jatuhTempo .= ': ' . $translator->trans('tanggal') . ' ' . $biaya->getBulananHariKe();
             break;
         case 'd-triwulan':
             if ($biaya->getBulanAwal() < $siswa->getPembiayaanSejak()->format('n')) {
                 $tanggalAwalBayar->modify("+1 year");
                 $tanggalAwalBayar->modify("-{$bedaBulan} months");
             } else {
                 $tanggalAwalBayar->modify("+{$bedaBulan} months");
             }
             $bedaWaktu = $tanggalSekarang->diff($tanggalAwalBayar);
             $jumlahWajibBayar = ceil($bedaWaktu->format("%m") / 3);
             if ($bedaWaktu->format('%m') % 3 == 0) {
                 if ($bedaWaktu->format("%r%d") < 0) {
                     $jumlahWajibBayar++;
                 }
             }
             $jatuhTempo .= ': ' . $translator->trans('tanggal') . ' ' . $biaya->getBulananHariKe();
             $jatuhTempo .= ' (';
             $jatuhTempo .= $translator->trans($daftarBulan[$tmpTanggal->format('n')]);
             $tmpTanggal->modify('+3 months');
             $jatuhTempo .= '/' . $translator->trans($daftarBulan[$tmpTanggal->format('n')]);
             $tmpTanggal->modify('+3 months');
             $jatuhTempo .= '/' . $translator->trans($daftarBulan[$tmpTanggal->format('n')]);
             $tmpTanggal->modify('+3 months');
             $jatuhTempo .= '/' . $translator->trans($daftarBulan[$tmpTanggal->format('n')]);
             $jatuhTempo .= ')';
             break;
         case 'e-caturwulan':
             if ($biaya->getBulanAwal() < $siswa->getPembiayaanSejak()->format('n')) {
                 $tanggalAwalBayar->modify("+1 year");
                 $tanggalAwalBayar->modify("-{$bedaBulan} months");
             } else {
                 $tanggalAwalBayar->modify("+{$bedaBulan} months");
             }
             $bedaWaktu = $tanggalSekarang->diff($tanggalAwalBayar);
             $jumlahWajibBayar = ceil($bedaWaktu->format("%m") / 4);
             if ($bedaWaktu->format('%m') % 4 == 0) {
                 if ($bedaWaktu->format("%r%d") < 0) {
                     $jumlahWajibBayar++;
                 }
             }
             $jatuhTempo .= ': ' . $translator->trans('tanggal') . ' ' . $biaya->getBulananHariKe();
             $jatuhTempo .= ' (';
             $jatuhTempo .= $translator->trans($daftarBulan[$tmpTanggal->format('n')]);
             $tmpTanggal->modify('+4 months');
             $jatuhTempo .= '/' . $translator->trans($daftarBulan[$tmpTanggal->format('n')]);
             $tmpTanggal->modify('+4 months');
             $jatuhTempo .= '/' . $translator->trans($daftarBulan[$tmpTanggal->format('n')]);
             $jatuhTempo .= ')';
             break;
         case 'f-semester':
             if ($biaya->getBulanAwal() < $siswa->getPembiayaanSejak()->format('n')) {
                 $tanggalAwalBayar->modify("+1 year");
                 $tanggalAwalBayar->modify("-{$bedaBulan} months");
             } else {
                 $tanggalAwalBayar->modify("+{$bedaBulan} months");
             }
             $bedaWaktu = $tanggalSekarang->diff($tanggalAwalBayar);
             $jumlahWajibBayar = ceil($bedaWaktu->format("%m") / 6);
             if ($bedaWaktu->format('%m') % 6 == 0) {
                 if ($bedaWaktu->format("%r%d") < 0) {
                     $jumlahWajibBayar++;
                 }
             }
             $jatuhTempo .= ': ' . $translator->trans('tanggal') . ' ' . $biaya->getBulananHariKe();
             $jatuhTempo .= ' (';
             $jatuhTempo .= $translator->trans($daftarBulan[$tmpTanggal->format('n')]);
             $tmpTanggal->modify('+6 months');
             $jatuhTempo .= '/' . $translator->trans($daftarBulan[$tmpTanggal->format('n')]);
             $jatuhTempo .= ')';
             break;
         case 'g-tahunan':
             if ($biaya->getBulanAwal() < $siswa->getPembiayaanSejak()->format('n')) {
                 $tanggalAwalBayar->modify("+1 year");
                 $tanggalAwalBayar->modify("-{$bedaBulan} months");
             } else {
                 $tanggalAwalBayar->modify("+{$bedaBulan} months");
             }
             $bedaWaktu = $tanggalSekarang->diff($tanggalAwalBayar);
             if ($bedaWaktu->format("%r%a") < 0) {
                 $jumlahWajibBayar++;
             }
             $jatuhTempo .= ': ' . $translator->trans('tanggal') . ' ' . $biaya->getBulananHariKe() . ' ' . $translator->trans($daftarBulan[$biaya->getBulanAwal()]);
             break;
     }
     if ($this->getRequest()->getMethod() == "POST") {
         if ($siswa->getPenjurusan() instanceof Penjurusan) {
             $biayaBisaDibayar = $em->createQueryBuilder()->select('biaya')->from('LanggasSisdikBundle:BiayaRutin', 'biaya')->where('biaya.id = :id')->andWhere('biaya.tahun = :tahun')->andWhere('biaya.penjurusan IS NULL OR biaya.penjurusan = :penjurusan')->orderBy('biaya.perulangan', 'ASC')->setParameter('id', $biaya->getId())->setParameter('tahun', $siswa->getTahun())->setParameter('penjurusan', $siswa->getPenjurusan())->getQuery()->getOneOrNullResult();
         } else {
             $biayaBisaDibayar = $em->createQueryBuilder()->select('biaya')->from('LanggasSisdikBundle:BiayaRutin', 'biaya')->where('biaya.id = :id')->andWhere('biaya.tahun = :tahun')->andWhere('biaya.penjurusan IS NULL')->orderBy('biaya.perulangan', 'ASC')->setParameter('id', $biaya->getId())->setParameter('tahun', $siswa->getTahun())->getQuery()->getOneOrNullResult();
         }
         if (!$biayaBisaDibayar instanceof BiayaRutin) {
             throw $this->createNotFoundException('BiayaRutin yang dipilih tidak bisa dibayar oleh siswa tersebut.');
         }
         // if ($jumlahPembayaranBelumLunas != 0) {
         //     throw new AccessDeniedException($this->get('translator')->trans('exception.pembayaran.sebelumnya.harus.lunas'));
         // }
         $entity = new PembayaranRutin();
         $form = $this->createForm('sisdik_pembayaranrutin', $entity);
         $form->submit($this->getRequest());
         $nominalBayar = 0;
         $nominalBiaya = $biaya->getNominal();
         $transaksiCollection = $form->get('transaksiPembayaranRutin')->getData();
         if ($form->get('jenisPotongan')->getData() == 'nominal') {
             $nominalBiaya = $nominalBiaya - $form->get('nominalPotongan')->getData();
         } elseif ($form->get('jenisPotongan')->getData() == 'persentase') {
             $nominalBiaya = $nominalBiaya - $form->get('persenPotongan')->getData() / 100 * $nominalBiaya;
         }
         /* @var $transaksi TransaksiPembayaranRutin */
         foreach ($transaksiCollection as $transaksi) {
             $nominalBayar += $transaksi->getNominalPembayaran();
         }
         if ($nominalBayar > $nominalBiaya) {
             if ($form->get('jenisPotongan')->getData()) {
                 $message = $this->get('translator')->trans('shortinfo.pay.notbiggerthan.fee.discounted');
             } else {
                 $message = $this->get('translator')->trans('shortinfo.pay.notbiggerthan.fee');
             }
             $form->get('transaksiPembayaranRutin')->addError(new FormError($message));
         }
         if ($form->isValid()) {
             $entity->setSiswa($siswa);
             $entity->setBiayaRutin($biaya);
             $entity->setNominalBiaya($biaya->getNominal());
             $entity->setNamaBiaya($biaya->getJenisbiaya()->getNama());
             $biaya->setTerpakai(true);
             $now = new \DateTime();
             $entity->setTanggal($now);
             $qbmaxnum = $em->createQueryBuilder()->select('MAX(transaksi.nomorUrutTransaksiPerbulan)')->from('LanggasSisdikBundle:TransaksiPembayaranRutin', 'transaksi')->where("YEAR(transaksi.waktuSimpan) = :tahunsimpan")->andWhere("MONTH(transaksi.waktuSimpan) = :bulansimpan")->andWhere('transaksi.sekolah = :sekolah')->setParameter('tahunsimpan', $now->format('Y'))->setParameter('bulansimpan', $now->format('m'))->setParameter('sekolah', $sekolah);
             $nomormax = intval($qbmaxnum->getQuery()->getSingleScalarResult());
             $nomormax++;
             $totalPayment = 0;
             $nomorTransaksi = "";
             $transaksi = $entity->getTransaksiPembayaranRutin()->first();
             if ($transaksi instanceof TransaksiPembayaranRutin) {
                 $transaksi->setNomorUrutTransaksiPerbulan($nomormax);
                 if ($sekolah->getAtributNomorTransaksiBiayaBerulang() !== null) {
                     $nomorTransaksiRutin = $sekolah->getAtributNomorTransaksiBiayaBerulang();
                     $nomorTransaksiRutin = str_replace("%tahun%", $now->format('Y'), $nomorTransaksiRutin);
                     $nomorTransaksiRutin = str_replace("%bulan%", $now->format('m'), $nomorTransaksiRutin);
                     $nomorTransaksiRutin = str_replace("%tanggal%", $now->format('d'), $nomorTransaksiRutin);
                     $tmpNomorTransaksi = $nomormax;
                     $matches = [];
                     $penambah = preg_match('/{\\+(\\d+)}/', $nomorTransaksiRutin, $matches);
                     if ($penambah === 1) {
                         $tmpNomorTransaksi = $tmpNomorTransaksi + $matches[1];
                     }
                     $nomorTransaksiRutin = preg_replace('/{\\+\\d+}/', '', $nomorTransaksiRutin);
                     if (preg_match('/#+%nomor-urut-perbulan%/', $nomorTransaksiRutin) === 1) {
                         $placeholder = preg_match_all('/#/', $nomorTransaksiRutin);
                         if ($placeholder >= 1 && strlen($tmpNomorTransaksi) <= $placeholder) {
                             $tmpNomorTransaksi = str_repeat('0', $placeholder - strlen($tmpNomorTransaksi) + 1) . $tmpNomorTransaksi;
                         }
                     }
                     $nomorTransaksiRutin = str_replace('#', '', $nomorTransaksiRutin);
                     $nomorTransaksiRutin = str_replace("%nomor-urut-perbulan%", $tmpNomorTransaksi, $nomorTransaksiRutin);
                     $transaksi->setNomorTransaksi($nomorTransaksiRutin);
                 } else {
                     $transaksi->setNomorTransaksi(TransaksiPembayaranRutin::tandakwitansi . $now->format('Y') . $now->format('m') . $nomormax);
                 }
                 $totalPayment = $transaksi->getNominalPembayaran();
                 $nomorTransaksi = $transaksi->getNomorTransaksi();
             }
             if ($entity->getAdaPotongan() === false) {
                 $entity->setJenisPotongan(null);
                 $entity->setNominalPotongan(0);
                 $entity->setPersenPotongan(0);
                 $entity->setPersenPotonganDinominalkan(0);
             }
             if ($entity->getAdaPotongan() && $entity->getPersenPotongan() != 0) {
                 $persenPotonganDinominalkan = $entity->getNominalBiaya() * ($entity->getPersenPotongan() / 100);
                 $entity->setPersenPotonganDinominalkan($persenPotonganDinominalkan);
                 $entity->setNominalPotongan(0);
             } else {
                 $entity->setPersenPotongan(0);
                 $entity->setPersenPotonganDinominalkan(0);
             }
             $em->persist($entity);
             $em->persist($biaya);
             $em->flush();
             $vendorSekolah = $em->getRepository('LanggasSisdikBundle:VendorSekolah')->findOneBy(['sekolah' => $sekolah]);
             $pilihanLayananSms = $em->getRepository('LanggasSisdikBundle:PilihanLayananSms')->findOneBy(['sekolah' => $sekolah, 'jenisLayanan' => 'zda-biaya-rutin-bayar', 'status' => true]);
             if ($pilihanLayananSms instanceof PilihanLayananSms) {
                 if ($pilihanLayananSms->getStatus()) {
                     $layanan = $em->getRepository('LanggasSisdikBundle:LayananSms')->findOneBy(['sekolah' => $sekolah, 'jenisLayanan' => 'zda-biaya-rutin-bayar']);
                     if ($layanan instanceof LayananSms) {
                         $tekstemplate = $layanan->getTemplatesms()->getTeks();
                         $namaOrtuWali = "";
                         $ponselOrtuWali = "";
                         $orangtuaWaliAktif = $siswa->getOrangtuaWaliAktif();
                         if ($orangtuaWaliAktif instanceof OrangtuaWali) {
                             $namaOrtuWali = $orangtuaWaliAktif->getNama();
                             $ponselOrtuWali = $orangtuaWaliAktif->getPonsel();
                         }
                         $tekstemplate = str_replace("%nama-ortuwali%", $namaOrtuWali, $tekstemplate);
                         $tekstemplate = str_replace("%nama-siswa%", $siswa->getNamaLengkap(), $tekstemplate);
                         $tekstemplate = str_replace("%nis%", $siswa->getNomorInduk(), $tekstemplate);
                         $tekstemplate = str_replace("%nomor-kwitansi%", $nomorTransaksi, $tekstemplate);
                         $tekstemplate = str_replace("%nama-biaya%", $entity->getNamaBiaya(), $tekstemplate);
                         $formatter = new \NumberFormatter($this->container->getParameter('locale'), \NumberFormatter::CURRENCY);
                         $symbol = $formatter->getSymbol(\NumberFormatter::CURRENCY_SYMBOL);
                         $tekstemplate = str_replace("%besar-pembayaran%", $symbol . ". " . number_format($totalPayment, 0, ',', '.'), $tekstemplate);
                         if ($ponselOrtuWali != "") {
                             $nomorponsel = preg_split("/[\\s,\\/]+/", $ponselOrtuWali);
                             foreach ($nomorponsel as $ponsel) {
                                 $messenger = $this->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);
                                     $messenger->sendMessage($sekolah);
                                 }
                             }
                         }
                     }
                 }
             }
             $this->get('session')->getFlashBag()->add('success', $this->get('translator')->trans('flash.pembayaran.biaya.berulang.tersimpan'));
             return $this->redirect($this->generateUrl('pembayaran_biaya_rutin__summary', ['sid' => $sid, 'bid' => $bid]));
         }
         $this->get('session')->getFlashBag()->add('error', $this->get('translator')->trans('flash.pembayaran.biaya.berulang.gagal.disimpan'));
     }
     // if ($jumlahPembayaranBelumLunas > 0) {
     //     return [
     //         'siswa' => $siswa,
     //         'biaya' => $biaya,
     //         'pembayaranRutin' => $pembayaranRutin,
     //         'jumlahWajibBayar' => $jumlahWajibBayar,
     //         'jumlahPembayaran' => $jumlahPembayaran,
     //         'jumlahPembayaranBelumLunas' => $jumlahPembayaranBelumLunas,
     //         'jatuhTempo' => $jatuhTempo,
     //         'daftarPerulangan' => $daftarPerulangan,
     //         'daftarBulan' => $daftarBulan,
     //         'daftarHari' => $daftarHari,
     //     ];
     // } else {
     // }
     $entity = new PembayaranRutin();
     $entity->setJenisPotongan("nominal");
     $transaksiPembayaranRutin = new TransaksiPembayaranRutin();
     $entity->getTransaksiPembayaranRutin()->add($transaksiPembayaranRutin);
     $entity->setSiswa($siswa);
     $form = $this->createForm('sisdik_pembayaranrutin', $entity);
     return ['siswa' => $siswa, 'biaya' => $biaya, 'pembayaranRutin' => $pembayaranRutin, 'jumlahWajibBayar' => $jumlahWajibBayar, 'jumlahPembayaran' => $jumlahPembayaran, 'jumlahPembayaranBelumLunas' => $jumlahPembayaranBelumLunas, 'jumlahPeriode' => $jumlahPembayaran + $jumlahPembayaranBelumLunas, 'jatuhTempo' => $jatuhTempo, 'tanggalAwalBayar' => $tanggalAwalBayar, 'daftarPerulangan' => $daftarPerulangan, 'daftarBulan' => $daftarBulan, 'daftarHari' => $daftarHari, 'form' => $form->createView(), 'tambahPeriode' => self::PERIODE_TAMBAH];
 }