<?php
namespace App\Controller\Setting;
use DateInterval;
use Knp\Snappy\Pdf;
use App\Entity\User;
use DateTimeImmutable;
use App\Entity\SettingFee;
use App\Entity\SettingLevel;
use App\Entity\SettingFeeShedul;
use App\Repository\UserRepository;
use App\Form\Setting\SettingFeeType;
use App\Repository\SchoolYearRepository;
use App\Repository\SettingFeeRepository;
use Doctrine\ORM\EntityManagerInterface;
use App\Form\Setting\SettingFeeShedulType;
use App\Repository\SettingLevelRepository;
use App\Repository\EstablishmentRepository;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Component\HttpFoundation\Request;
use App\Repository\SettingClassroomRepository;
use App\Repository\SettingFeeShedulRepository;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use App\Repository\RegistrationStudentRegistrationRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
/**
* @Route("/setting/fee")
*/
class SettingFeeController extends AbstractController
{
/**
* @Route("/index", name="setting_fee_index", methods={"GET"})
*/
public function index(Request $request, PaginatorInterface $paginator, SettingFeeRepository $settingFeeRepository, SchoolYearRepository $schoolYearRepository, EstablishmentRepository $establishmentRepository, UserRepository $userRepository): Response
{
/**@var User $user */
$user = $this->getUser();
$schoolYear = $user->getSchoolYear();
$establishment = $user->getEstablishment();
$setting_fees = $paginator->paginate(
$settingFeeRepository->createQueryBuilder('entity')
->andWhere('entity.establishment = :establishment')
->setParameter('establishment', $establishment)
->andWhere('entity.schoolYear = :schoolYear')
->setParameter('schoolYear', $schoolYear)
->orderBy('entity.id', 'DESC')
->getQuery(),
$request->query->getInt('page', 1),
1000
);
$establishments = $establishmentRepository->createQueryBuilder('entity')
->andWhere('entity.establishmentGroup = :establishmentGroup')
->setParameter('establishmentGroup', $establishment->getEstablishmentGroup())
->orderBy('entity.name', 'ASC')
->getQuery()
->getResult();
return $this->render('setting/setting_fee/index.html.twig', [
'userRepository' => $userRepository,
'setting_fees' => $setting_fees,
'school_year' => $schoolYear,
'school_years' => $schoolYearRepository->findBy([], ['id' => 'DESC']),
'establishments' => $establishments
]);
}
/**
* @Route("/new", name="setting_fee_new", methods={"GET","POST"})
*/
public function new(Request $request, SettingLevelRepository $settingLevelRepository): Response
{
/**@var User $user */
$user = $this->getUser();
$schoolYear = $user->getSchoolYear();
$establishment = $this->getUser()->getEstablishment();
$settingFee = new SettingFee();
$levels = $settingLevelRepository->findBy(['establishment' => $establishment]);
$form = $this->createForm(SettingFeeType::class, $settingFee);
if ($establishment->getType() != $establishment::ESTABLISHMENT_PRESCOLAIRE_PRIMAIRE_TYPES) {
$form
->add('is_for_non_affected')
->add('is_for_affected');
}
$form
->add('levels', EntityType::class, [
'class' => SettingLevel::class,
'choices' => $levels,
'multiple' => true,
'required' => false
]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$entityManager = $this->getDoctrine()->getManager();
$settingFee->setEstablishment($this->getUser()->getEstablishment());
$settingFee->setSchoolYear($schoolYear);
$entityManager->persist($settingFee);
try {
$entityManager->flush();
$this->addFlash('success', "Un frais à été ajouté.");
} catch (\Throwable $th) {
$this->addFlash('warning', "Une erreure est survenue lors de l'ajout du frais.");
$this->addFlash('info', $th->getMessage());
}
return $this->redirectToRoute('setting_fee_edit', ['id' => $settingFee->getId()]);
}
return $this->renderForm('setting/setting_fee/new.html.twig', [
'setting_fee' => $settingFee,
'form' => $form,
]);
}
/**
* @Route("/import", name="setting_fee_import", methods={"GET"})
*/
public function import(Request $request, SettingFeeRepository $settingFeeRepository, SchoolYearRepository $schoolYearRepository): Response
{
/**@var User $user */
$user = $this->getUser();
$schoolYear = $schoolYearRepository->findOneBy(['id' => $request->get('school_year')], []);
$establishment = $user->getEstablishment();
if (null != $schoolYear) {
$settingFees = $settingFeeRepository->findBy(['schoolYear' => $schoolYear, 'establishment' => $establishment], []);
$entityManager = $this->getDoctrine()->getManager();
foreach ($settingFees as $key => $fee) {
$settingFee = new SettingFee;
$settingFee->setEstablishment($fee->getEstablishment());
$settingFee->setSchoolYear($user->getSchoolYear());
$settingFee->setAccountingAccount($fee->getAccountingAccount());
$settingFee->setAmount($fee->getAmount());
$settingFee->setLabel($fee->getLabel());
$settingFee->setCategory($fee->getCategory());
$settingFee->setDuration($fee->getDuration());
$settingFee->setFeeProvider($fee->getFeeProvider());
$settingFee->setIsForAffected($fee->getIsForAffected());
$settingFee->setIsForAll($fee->getIsForAll());
$settingFee->setIsForNonAffected($fee->getIsForNonAffected());
$settingFee->setQuantityAvailable($fee->getQuantityAvailable());
foreach ($fee->getLevels() as $key => $level) {
$settingFee->addLevel($level);
}
foreach ($fee->getTransportZones() as $key => $transportZone) {
$settingFee->addTransportZone($transportZone);
}
foreach ($fee->getSettingFeeSheduls() as $key => $feeShedul) {
$settingFeeShedul = new SettingFeeShedul();
$settingFeeShedul->setFee($settingFee);
$settingFeeShedul->setAmount($feeShedul->getAmount());
$settingFeeShedul->setDateDue($feeShedul->getDateDue()->add(new DateInterval("P1Y")));
$settingFeeShedul->setOrderNum($feeShedul->getOrderNum());
$settingFeeShedul->setEstablishment($feeShedul->getEstablishment());
$entityManager->persist($settingFeeShedul);
}
$entityManager->persist($settingFee);
}
}
try {
$entityManager->flush();
$this->addFlash('success', "Importation effectuée.");
} catch (\Throwable $th) {
$this->addFlash('warning', "Une erreure est survenue lors de l'importation.");
$this->addFlash('info', $th->getMessage());
}
return $this->redirectToRoute('setting_fee_index', [], Response::HTTP_SEE_OTHER);
}
/**
* @Route("/{id}/edit", name="setting_fee_edit", methods={"GET","POST"})
*/
public function edit(Request $request, SettingFee $settingFee, SettingFeeShedulRepository $settingFeeShedulRepository, SettingLevelRepository $settingLevelRepository): Response
{
$establishment = $this->getUser()->getEstablishment();
$levels = $settingLevelRepository->findBy(['establishment' => $establishment]);
$form = $this->createForm(SettingFeeType::class, $settingFee);
if ($establishment->getType() != $establishment::ESTABLISHMENT_PRESCOLAIRE_PRIMAIRE_TYPES) {
$form
->add('is_for_non_affected')
->add('is_for_affected')
->add('is_for_all');
}
$form
->add('levels', EntityType::class, [
'class' => SettingLevel::class,
'choices' => $levels,
'multiple' => true,
'required' => false
]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
try {
$this->getDoctrine()->getManager()->flush();
$this->addFlash('success', "le frais à été édité.");
} catch (\Throwable $th) {
$this->addFlash('warning', "Une erreure est survenue lors de l'édition du frais.");
$this->addFlash('info', $th->getMessage());
}
return $this->redirectToRoute('setting_fee_index', [], Response::HTTP_SEE_OTHER);
}
/* Ajout des echeancies */
$settingFeeShedul = new SettingFeeShedul();
$settingFeeShedul->setOrderNum(count($settingFee->getSettingFeeSheduls()) + 1);
$ShedulForm = $this->createForm(SettingFeeShedulType::class, $settingFeeShedul);
$ShedulForm->handleRequest($request);
if ($ShedulForm->isSubmitted() && $ShedulForm->isValid()) {
if ($settingFeeShedulRepository->findOneBy([],['id' => 'DESC']) != null) {
if ($settingFeeShedulRepository->findOneBy(['fee' => $settingFee],['id' => 'DESC']) != null) {
if ($settingFeeShedul->getDateDue() <= $settingFeeShedulRepository->findOneBy(['fee' => $settingFee],['id' => 'DESC'])->getDateDue()) {
$this->addFlash('warning', "date invalide.");
return $this->redirectToRoute('setting_fee_edit', ['id' => $settingFee->getId()]);
}
}
}
if (($settingFee->getSheduledAmount() + $settingFeeShedul->getAmount()) > $settingFee->getAmount()) {
$this->addFlash('warning', "le montant est trop élévé.");
return $this->redirectToRoute('setting_fee_edit', ['id' => $settingFee->getId()]);
}
$entityManager = $this->getDoctrine()->getManager();
$settingFeeShedul->setEstablishment($settingFee->getEstablishment());
$settingFeeShedul->setFee($settingFee);
$entityManager->persist($settingFeeShedul);
try {
$entityManager->flush();
$this->addFlash('success', "un écheancier à été ajouté.");
} catch (\Throwable $th) {
$this->addFlash('warning', "Une erreur est survenue lors de l'ajout de l'échéancier.");
$this->addFlash('info', $th->getMessage());
}
return $this->redirectToRoute('setting_fee_edit', ['id' => $settingFee->getId()]);
}
return $this->renderForm('setting/setting_fee/edit.html.twig', [
'setting_fee' => $settingFee,
'setting_fee_shedul' => $settingFeeShedul,
'form' => $form,
'ShedulForm' => $ShedulForm,
]);
}
/**
* @Route("/delete-selection", name="setting_fees_selected_delete", methods={"GET"})
*/
public function deleteSelected(Request $request, SettingFeeRepository $entityRepository): Response
{
$list = $request->get('entities');
$entityManager = $this->getDoctrine()->getManager();
$errors = 0;
foreach ($list as $key => $id) {
$entity = $entityRepository->findOneBy(['id' => intval($id)], []);
if ($entity != null) {
if (count($entity->getAccountingStudentRegistrationFees()) <= 0) {
foreach ($entity->getSettingFeeSheduls() as $key => $settingFeeShedul) {
$entityManager->remove($settingFeeShedul);
}
$entityManager->remove($entity);
}
}
}
try {
$entityManager->flush();
$this->addFlash('success', "Traitement effectué");
return $this->json(['code' => 200, 'message' => "Traitement effectué :)"], 200);
} catch (\Throwable $th) {
//$th->getMessage()
$this->addFlash('warning', $th->getMessage());
}
$this->addFlash('warning', "Traitement non effectué");
return $this->json(['code' => 500, 'message' => "Traitement non effectué"], 200);
}
/**
* @Route("/{id}/printStudent", name="setting_fee_print_student", methods={"GET"})
*/
public function printStudent(Pdf $knpSnappyPdf, SettingFee $settingFee, RegistrationStudentRegistrationRepository $registrationStudentRegistrationRepository)
{
/**@var User $user */
$user = $this->getUser();
$schoolYear = $user->getSchoolYear();
$setting = $settingFee->getEstablishment();
$registrationStudentRegistrations = $registrationStudentRegistrationRepository->createQueryBuilder('entity')
->innerJoin('entity.student', 'student')
->addSelect('student')
->innerJoin('entity.accountingStudentRegistrationFees', 'accountingStudentRegistrationFee')
->addSelect('accountingStudentRegistrationFee')
->innerJoin('accountingStudentRegistrationFee.fee', 'fee')
->addSelect('fee')
->andWhere('entity.schoolYear = :schoolYear')
->setParameter('schoolYear', $schoolYear)
->andWhere('fee.id = :feeId')
->setParameter('feeId', $settingFee->getId())
->orderBy('student.last_name', 'ASC')
->getQuery()
->getResult();
$html = $this->renderView('setting/print/studentRegistrationFee.html.twig', [
'setting_fee' => $settingFee,
'registration_student_registrations' => $registrationStudentRegistrations,
'school_year' => $schoolYear,
'setting' => $setting,
]);
$file_name = 'ABONNES_FRAIS_'.$settingFee->getId().".pdf";
$footer = $this->renderView('print/footer.html.twig', ['setting' => $setting,]);
$header = $this->renderView('print/header.html.twig', ['setting' => $setting,]);
$options = [
'orientation' => 'Landscape',
'header-html' => $header,
'footer-html' => $footer
];
$knpSnappyPdf->generateFromHtml($html, $this->getParameter('app.app_directory').'/downloads/setting/' . $file_name, $options, true);
return $this->redirectToRoute('preview', [
'file' => $file_name,
'dir' => 'setting',
]);
}
/**
* @Route("/api/has-duration", name="api_setting_fee_has_duration", methods={"GET"})
*/
public function api_has_duration(Request $request, SettingFeeRepository $entityRepository): Response
{
$id = $request->get('id');
$entity = $entityRepository->findOneBy(['id' => intval($id)], []);
if ($entity != null) {
if (strlen($entity->getDuration()) > 3) {
return $this->json(['code' => 200, 'message' => $entity->getDuration()], 200);
}
}
return $this->json(['code' => 500, 'message' => "Cette abonnement n' est pas periodique."], 200);
}
/**
* @Route("/print-student-by-classroom", name="setting_fee_print_student_by_classroom", methods={"GET"})
*/
public function print_student_by_classroom(Pdf $knpSnappyPdf, SettingFeeRepository $settingFeeRepository, SettingClassroomRepository $settingClassroomRepository)
{
/**@var User $user */
$user = $this->getUser();
$schoolYear = $user->getSchoolYear();
$setting = $this->getUser()->getEstablishment();
$settingFees = $settingFeeRepository->createQueryBuilder('entity')
->andWhere('entity.schoolYear = :schoolYear')
->setParameter('schoolYear', $schoolYear)
->andWhere('entity.establishment = :establishment')
->setParameter('establishment', $setting)
->orderBy('entity.label', 'ASC')
->getQuery()
->getResult();
$settingClassrooms = $settingClassroomRepository->createQueryBuilder('entity')
->andWhere('entity.schoolYear = :schoolYear')
->setParameter('schoolYear', $schoolYear)
->andWhere('entity.establishment = :establishment')
->setParameter('establishment', $setting)
->orderBy('entity.label', 'ASC')
->getQuery()
->getResult();
$html = $this->renderView('setting/print/student_fee_by_classrooms.html.twig', [
'setting_fees' => $settingFees,
'setting_classrooms' => $settingClassrooms,
'school_year' => $schoolYear,
'create_date' => new DateTimeImmutable(),
'setting' => $setting,
]);
$file_name = 'ABONNES_FRAIS_PAR_CLASSE_'.".pdf";
$footer = $this->renderView('print/footer.html.twig', ['setting' => $setting,]);
$header = $this->renderView('print/header.html.twig', ['setting' => $setting,]);
$options = [
'orientation' => 'Portrait',
'header-html' => $header
//'footer-html' => $footer
];
$knpSnappyPdf->generateFromHtml($html, $this->getParameter('app.app_directory').'/downloads/setting/' . $file_name, $options, true);
return $this->redirectToRoute('preview', [
'file' => $file_name,
'dir' => 'setting',
]);
}
/**
* @Route("/print/{id}/student-by-classroom", name="setting_fee_print_by_classroom", methods={"GET"})
*/
public function print_by_classroom(Pdf $knpSnappyPdf, SettingFee $settingFee, SettingClassroomRepository $settingClassroomRepository)
{
/**@var User $user */
$user = $this->getUser();
$schoolYear = $user->getSchoolYear();
$setting = $this->getUser()->getEstablishment();
$settingClassrooms = $settingClassroomRepository->createQueryBuilder('entity')
->andWhere('entity.schoolYear = :schoolYear')
->setParameter('schoolYear', $schoolYear)
->andWhere('entity.establishment = :establishment')
->setParameter('establishment', $setting)
->orderBy('entity.label', 'ASC')
->getQuery()
->getResult();
$html = $this->renderView('setting/print/fee_by_classroom.html.twig', [
'setting_fee' => $settingFee,
'setting_classrooms' => $settingClassrooms,
'school_year' => $schoolYear,
'create_date' => new DateTimeImmutable(),
'setting' => $setting,
]);
$file_name = 'ABONNES_FRAIS_PAR_CLASSE_'.".pdf";
$footer = $this->renderView('print/footer.html.twig', ['setting' => $setting,]);
$header = $this->renderView('print/header.html.twig', ['setting' => $setting,]);
$options = [
'orientation' => 'Portrait',
'header-html' => $header
//'footer-html' => $footer
];
$knpSnappyPdf->generateFromHtml($html, $this->getParameter('app.app_directory').'/downloads/setting/' . $file_name, $options, true);
return $this->redirectToRoute('preview', [
'file' => $file_name,
'dir' => 'setting',
]);
}
/**
* @Route("/add-year", name="setting_fee_add_year", methods={"GET"})
*/
public function add_year(SettingFeeShedulRepository $entityRepository): Response
{
$entityManager = $this->getDoctrine()->getManager();
foreach ($entityRepository->findBy([], []) as $key => $entity) {
$entity->setDateDue($entity->getDateDue()->add(new DateInterval("P1Y")));
}
try {
$entityManager->flush();
$this->addFlash('success', "Traitement effectué");
return $this->json(['code' => 200, 'message' => "Traitement effectué :)"], 200);
} catch (\Throwable $th) {
//$th->getMessage()
$this->addFlash('warning', $th->getMessage());
}
$this->addFlash('warning', "Traitement non effectué");
return $this->json(['code' => 500, 'message' => "Traitement non effectué"], 200);
}
/**
* @Route("/sub-year", name="setting_fee_sub_year", methods={"GET"})
*/
public function sub_year(SettingFeeShedulRepository $entityRepository): Response
{
$entityManager = $this->getDoctrine()->getManager();
foreach ($entityRepository->findBy([], []) as $key => $entity) {
$entity->setDateDue($entity->getDateDue()->sub(new DateInterval("P1Y")));
}
try {
$entityManager->flush();
$this->addFlash('success', "Traitement effectué");
return $this->json(['code' => 200, 'message' => "Traitement effectué :)"], 200);
} catch (\Throwable $th) {
//$th->getMessage()
$this->addFlash('warning', $th->getMessage());
}
$this->addFlash('warning', "Traitement non effectué");
return $this->json(['code' => 500, 'message' => "Traitement non effectué"], 200);
}
/**
* @Route("/api/set-establishment/{id}", name="api_setting_fee_set_establishment", methods={"GET"})
*/
public function api_set_establishment(Request $request, EstablishmentRepository $establishmentRepositoryRepository, SettingFee $settingFee, EntityManagerInterface $entityManager): Response
{
$id = $request->get('establishment');
$establishment = $establishmentRepositoryRepository->findOneBy(['id' => $id], []);
if ($establishment != null) {
$settingFee->setEstablishment($establishment);
}
try {
$entityManager->flush();
return $this->json(['code' => 200, 'message' => "Traitement effectué :)"], 200);
} catch (\Throwable $th) {
$this->addFlash('warning', $th->getMessage());
}
$this->addFlash('warning', "Traitement non effectué");
return $this->json(['code' => 500, 'message' => "Traitement non effectué"], 200);
}
}