/** * Memeriksa apakah seorang siswa memiliki tunggakan pembayaran rutin * * @param Siswa $siswa * @param \DateTime $tanggalSekarang * * @return boolean */ private function memilikiTunggakan(Siswa $siswa, \DateTime $tanggalSekarang) { $em = $this->getDoctrine()->getManager(); $daftarPerulangan = BiayaRutin::getDaftarPerulangan(); $bulanSekarang = $tanggalSekarang->format('n'); if ($siswa->getPenjurusan() instanceof Penjurusan) { $daftarBiayaRutin = $em->createQueryBuilder()->select('biaya')->from('LanggasSisdikBundle:BiayaRutin', 'biaya')->where('biaya.tahun = :tahun')->andWhere('biaya.penjurusan IS NULL OR biaya.penjurusan = :penjurusan')->orderBy('biaya.perulangan', 'ASC')->setParameter('tahun', $siswa->getTahun())->setParameter('penjurusan', $siswa->getPenjurusan())->getQuery()->getResult(); } else { $daftarBiayaRutin = $em->createQueryBuilder()->select('biaya')->from('LanggasSisdikBundle:BiayaRutin', 'biaya')->where('biaya.tahun = :tahun')->andWhere('biaya.penjurusan IS NULL')->orderBy('biaya.perulangan', 'ASC')->setParameter('tahun', $siswa->getTahun())->getQuery()->getResult(); } $bedaWaktu = $tanggalSekarang->diff($siswa->getPembiayaanSejak()); foreach ($daftarBiayaRutin as $biaya) { $jumlahWajibBayar = 0; $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']; } } $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"); if ($jumlahPembayaran < $jumlahWajibBayar) { return true; } break; case 'b-mingguan': $jumlahWajibBayar = floor($bedaWaktu->format("%a") / 7); if ($jumlahPembayaran < $jumlahWajibBayar) { return true; } break; case 'c-bulanan': $jumlahWajibBayar = $bedaWaktu->format("%m"); if ($bedaWaktu->format("%d") >= $biaya->getBulananHariKe()) { $jumlahWajibBayar++; } if ($jumlahPembayaran < $jumlahWajibBayar) { return true; } 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++; } } if ($jumlahPembayaran < $jumlahWajibBayar) { return true; } 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++; } } if ($jumlahPembayaran < $jumlahWajibBayar) { return true; } 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++; } } if ($jumlahPembayaran < $jumlahWajibBayar) { return true; } 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++; } if ($jumlahPembayaran < $jumlahWajibBayar) { return true; } break; } } return false; }
/** * Mengambil identitas biaya sekali bayar seorang siswa * * @param Siswa $siswa * @return * array['semua'] array id biaya sekali bayar seluruhnya<br> * array['tersimpan'] array id biaya sekali bayar yang tersimpan<br> * array['tersisa'] array id biaya sekali bayar yang tersisa<br> */ private function getBiayaProperties(Siswa $siswa) { $em = $this->getDoctrine()->getManager(); if ($siswa->getPenjurusan() instanceof Penjurusan) { $biayaSekali = $em->createQueryBuilder()->select('biaya')->from('LanggasSisdikBundle:BiayaSekali', 'biaya')->where('biaya.tahun = :tahun')->andWhere('biaya.penjurusan IS NULL OR biaya.penjurusan = :penjurusan')->orderBy('biaya.urutan', 'ASC')->setParameter('tahun', $siswa->getTahun())->setParameter('penjurusan', $siswa->getPenjurusan())->getQuery()->getResult(); } else { $biayaSekali = $em->createQueryBuilder()->select('biaya')->from('LanggasSisdikBundle:BiayaSekali', 'biaya')->where('biaya.tahun = :tahun')->andWhere('biaya.penjurusan IS NULL')->orderBy('biaya.urutan', 'ASC')->setParameter('tahun', $siswa->getTahun())->getQuery()->getResult(); } $idBiayaSemua = []; foreach ($biayaSekali as $biaya) { if ($biaya instanceof BiayaSekali) { $idBiayaSemua[] = $biaya->getId(); } } $querybuilder1 = $em->createQueryBuilder()->select('daftar')->from('LanggasSisdikBundle:DaftarBiayaSekali', 'daftar')->leftJoin('daftar.biayaSekali', 'biaya')->leftJoin('daftar.pembayaranSekali', 'pembayaran')->where('pembayaran.siswa = :siswa')->orderBy('biaya.urutan', 'ASC')->setParameter('siswa', $siswa); $daftarBiaya = $querybuilder1->getQuery()->getResult(); $idBiayaTersimpan = []; foreach ($daftarBiaya as $daftar) { if ($daftar instanceof DaftarBiayaSekali) { $idBiayaTersimpan[] = $daftar->getBiayaSekali()->getId(); } } $idBiayaSisa = array_diff($idBiayaSemua, $idBiayaTersimpan); return ['semua' => $idBiayaSemua, 'tersimpan' => $idBiayaTersimpan, 'tersisa' => $idBiayaSisa]; }