src/Controller/FamilyController.php line 151

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Family;
  4. use App\Entity\FamilyMember;
  5. use App\Entity\Rechnungen;
  6. use App\Entity\Gesundheit;
  7. use App\Entity\Bildung;
  8. use App\Entity\Offices;
  9. use App\Entity\Contact;
  10. use App\Form\FamilyType;
  11. use App\Form\FamilyMemberType;
  12. use App\Form\OfficesType;
  13. use App\Repository\FamilyRepository;
  14. use App\Repository\FamilyMemberRepository;
  15. use App\Repository\JugendamtRepository;
  16. use App\Repository\BildungRepository;
  17. use App\Repository\LeistungstragerRepository;
  18. use App\Repository\GesundheitRepository;
  19. use App\Repository\CalendarRepository;
  20. use App\Repository\RechnungenRepository;
  21. use App\Repository\SituationsberichteRepository;
  22. use App\Repository\ZieleRepository;
  23. use App\Repository\OfficesRepository;
  24. use App\Repository\ContactRepository;
  25. use App\Repository\FileTypeRepository;
  26. use App\Repository\UserRepository;
  27. use DateTime;
  28. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  29. use Symfony\Component\HttpFoundation\Request;
  30. use Symfony\Component\HttpFoundation\Response;
  31. use Symfony\Component\Routing\Annotation\Route;
  32. use Doctrine\ORM\EntityManagerInterface;
  33. use Symfony\Component\Validator\Validator\ValidatorInterface;
  34. use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
  35. use Symfony\Component\String\Slugger\SluggerInterface;
  36. use Symfony\Component\Security\Core\Security;
  37. use Dompdf\Dompdf;
  38. use Dompdf\Options;
  39. use Symfony\Component\Mailer\MailerInterface;
  40. use Symfony\Component\Mime\Email;
  41. use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
  42. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  43. use Symfony\Component\Filesystem\Filesystem;
  44. /**
  45.  * @Route("/family")
  46.  */
  47. class FamilyController extends AbstractController
  48. {
  49.     private EntityManagerInterface $em;
  50.     private $tokenManager;
  51.     private $security;
  52.     public function __construct(CsrfTokenManagerInterface $tokenManagerEntityManagerInterface $emSecurity $Security)
  53.     {
  54.         $this->tokenManager $tokenManager;
  55.         $this->em $em;
  56.         $this->security $Security;
  57.     }
  58.     /**
  59.      * @Route("/searchGlob", name="searchGlob", methods={"POST"})
  60.      */
  61.     public function searchGlob(FamilyRepository $familyRepository): Response
  62.     {
  63.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  64.         return $this->render('family/search.html.twig');
  65.     }
  66.     /**
  67.      * @Route("/serverSearch", name="serverSearch", methods={"POST","GET"} , options = {"expose"= true })
  68.      */
  69.     public function serverSearch(Request $requestEntityManagerInterface $entityManagerFamilyRepository $FamilyRepository): Response
  70.     {
  71.         $search_glob str_replace(' '''$request->get('search_glob'));
  72.         $families $entityManager->createQuery(
  73.             'SELECT p
  74.             FROM App\Entity\Family p
  75.             
  76.             WHERE 1=1 AND ( p.date_of_birth LIKE \'%' date('Y-m-d'strtotime(str_replace('/''-'$search_glob))) . '%\' OR concat(p.firstname,p.lastname) LIKE \'%' $search_glob '%\' OR concat(p.lastname,p.firstname) LIKE \'%' $search_glob '%\'  )
  77.              
  78.             '
  79.         )
  80.             ->getResult();
  81.         $results $entityManager->createQuery(
  82.             'SELECT p
  83.             FROM App\Entity\FamilyMember p
  84.             JOIN p.family f
  85.             WHERE 1=1 AND ( p.date_of_birth LIKE \'%' date('Y-m-d'strtotime(str_replace('/''-'$search_glob))) . '%\' OR concat(p.firstname,p.lastname) LIKE \'%' $search_glob '%\' OR concat(p.lastname,p.firstname) LIKE \'%' $search_glob '%\' OR f.date_of_birth LIKE \'%' date('Y-m-d'strtotime(str_replace('/''-'$search_glob))) . '%\' OR concat(f.firstname,f.lastname) LIKE \'%' $search_glob '%\' OR concat(f.lastname,f.firstname) LIKE \'%' $search_glob '%\'  ) GROUP BY f.id
  86.              
  87.             '
  88.         )
  89.             ->getResult();
  90.         $output = [];
  91.         foreach ($results as $result) {
  92.             $output[] = [
  93.                 'name' => $result->getFamily()->getFirstname() . ' ' $result->getFamily()->getLastname(),
  94.                 'id' => $result->getFamily()->getId(),
  95.             ];
  96.         }
  97.         $JSON json_encode($output);
  98.         $JSON '{"draw": ' $request->get('draw') . ',"recordsTotal":' count($output) . ',"recordsFiltered":' count($output) . ',"data":' $JSON '}';
  99.         $response   = new Response($JSON200, ['Content-Type' => 'application/json']);
  100.         return $response;
  101.     }
  102.     /**
  103.      * @Route("/getFamilyInfos/{id}/{token}", name="getFamilyInfos", methods={"GET"} , options = {"expose" = true } )
  104.      */
  105.     public function getFamilyInfos(Request $requestEntityManagerInterface $entityManagerFamilyRepository $FamilyRepository): Response
  106.     {
  107.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  108.         $family null;
  109.         if ($this->isCsrfTokenValid('getFamily3pTLcc5m2MQ4'$request->get('token'))) {
  110.             $family $FamilyRepository->find($request->get('id'));
  111.         }
  112.         $output = [
  113.             'stadt' => 'Römerberg - ' $family->getStadt() . ' - Römerberg',
  114.             'km' => $family->getKm()
  115.         ];
  116.         $JSON json_encode($output);
  117.         $response   = new Response($JSON200, ['Content-Type' => 'application/json']);
  118.         return $response;
  119.     }
  120.     /**
  121.      * @Route("/", name="app_family_index", methods={"GET"})
  122.      * @Route("/uma/{uma}", name="app_uma_index", methods={"GET"})
  123.      * @Route("/clearing/{clearing}", name="app_clearing_index", methods={"GET"})
  124.      * 
  125.      */
  126.     public function index(FamilyRepository $familyRepository): Response
  127.     {
  128.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  129.         return $this->render('family/index.html.twig', [
  130.             'families' => $familyRepository->findAll(),
  131.             'status' => 1,
  132.             'particular' => 0,
  133.         ]);
  134.     }
  135.     /**
  136.      * @Route("/archive_index", name="app_family_archive_index", methods={"GET"})
  137.      */
  138.     public function archive(FamilyRepository $familyRepository): Response
  139.     {
  140.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  141.         return $this->render('family/index.html.twig', [
  142.             'families' => $familyRepository->findAll(),
  143.             'status' => 0,
  144.         ]);
  145.     }
  146.     /**
  147.      * @Route("/sonstige_falle_index", name="app_family_sonstige_falle_index", methods={"GET"})
  148.      */
  149.     public function sonstige_falle(FamilyRepository $familyRepository): Response
  150.     {
  151.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  152.         return $this->render('family/index.html.twig', [
  153.             'families' => $familyRepository->findAll(),
  154.             'particular' => 1,
  155.         ]);
  156.     }
  157.     /**
  158.      * @Route("/office_new", name="app_office_new", methods={"GET", "POST"} , options={"expose"=true})
  159.      */
  160.     public function office_new(Request $requestSluggerInterface $sluggerFamilyRepository $familyRepositoryOfficesRepository $officesRepositoryValidatorInterface $validator): Response
  161.     {
  162.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  163.         $error null;
  164.         $offices = new Offices();
  165.         $form $this->createForm(OfficesType::class, $offices);
  166.         $form->handleRequest($request);
  167.         if ($form->isSubmitted() && !$form->isValid()) {
  168.             $errors $validator->validate($familyMember);
  169.             if (count($errors) > 0) {
  170.                 $error $errors[0]['constraint']['message'];
  171.             } else {
  172.                 $error 'Technisches Problem .';
  173.             }
  174.             return new Response($error);
  175.         } else if ($form->isSubmitted() && $form->isValid()) {
  176.             $family $familyRepository->find($request->get('family_id'));
  177.             $offices->setFamily($family);
  178.             $officesRepository->add($officestrue);
  179.             return new Response('OK');
  180.         }
  181.         return $this->renderForm('family/office_new.html.twig', [
  182.             'offices' => $offices,
  183.             'form' => $form,
  184.             'error' => $error,
  185.         ]);
  186.     }
  187.     /**
  188.      * @Route("/member_new", name="app_family_member_new", methods={"GET", "POST"} , options={"expose"=true})
  189.      */
  190.     public function member_new(Request $requestSluggerInterface $sluggerFamilyRepository $familyRepositoryFamilyMemberRepository $familyMemberRepositoryValidatorInterface $validator): Response
  191.     {
  192.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  193.         $error null;
  194.         $familyMember = new FamilyMember();
  195.         $form $this->createForm(FamilyMemberType::class, $familyMember);
  196.         $form->handleRequest($request);
  197.         if ($form->isSubmitted() && !$form->isValid()) {
  198.             $errors $validator->validate($familyMember);
  199.             if (count($errors) > 0) {
  200.                 $error $errors[0]['constraint']['message'];
  201.             } else {
  202.                 $error 'Technisches Problem .';
  203.             }
  204.             return new Response($error);
  205.         } else if ($form->isSubmitted() && $form->isValid()) {
  206.             //dd($familyMember) ;
  207.             /** @var UploadedFile $brochureFile */
  208.             $photo $form->get('photo')->getData();
  209.             if ($photo) {
  210.                 $originalFilename pathinfo($photo->getClientOriginalName(), PATHINFO_FILENAME);
  211.                 // this is needed to safely include the file name as part of the URL
  212.                 $safeFilename $slugger->slug($originalFilename);
  213.                 $newFilename $safeFilename '-' uniqid() . '.' $photo->guessExtension();
  214.                 try {
  215.                     $photo->move(
  216.                         $this->getParameter('photos_family'),
  217.                         $newFilename
  218.                     );
  219.                 } catch (FileException $e) {
  220.                     // ... handle exception if something happens during file upload
  221.                 }
  222.                 $familyMember->setPhoto($newFilename);
  223.             }
  224.             $family $familyRepository->find($request->get('family_id'));
  225.             $familyMember->setFamily($family);
  226.             //$familyMember->setGesundheit()
  227.             $familyMemberRepository->add($familyMembertrue);
  228.             return new Response('OK');
  229.         }
  230.         return $this->renderForm('family/member_new.html.twig', [
  231.             'family' => $familyMember,
  232.             'form' => $form,
  233.             'error' => $error,
  234.         ]);
  235.     }
  236.     /**
  237.      * @Route("/new_sonstige_fall/{particular}", name="app_family_sonstige_fall_new", methods={"GET", "POST"})
  238.      * @Route("/new", name="app_family_new", methods={"GET", "POST"})
  239.      * @Route("/new/uma/{uma}", name="app_family_uma_new", methods={"GET", "POST"})
  240.      * @Route("/new/clearing/{clearing}", name="app_family_clearing_new", methods={"GET", "POST"})
  241.      * 
  242.      */
  243.     public function new(Request $requestSluggerInterface $sluggerFamilyRepository $familyRepositoryValidatorInterface $validator): Response
  244.     {
  245.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  246.         $error null;
  247.         $family = new Family();
  248.         $form $this->createForm(FamilyType::class, $family);
  249.         $form->handleRequest($request);
  250.         if ($form->isSubmitted() && !$form->isValid()) {
  251.             $errors $validator->validate($family);
  252.             if (count($errors) > 0) {
  253.                 $error $errors[0];
  254.             } else {
  255.                 $error['constraint']['message'] = 'Technisches Problem .';
  256.             }
  257.         } else if ($form->isSubmitted() && $form->isValid()) {
  258.             /** @var UploadedFile $brochureFile */
  259.             $photo $form->get('photo')->getData();
  260.             if ($photo) {
  261.                 $originalFilename pathinfo($photo->getClientOriginalName(), PATHINFO_FILENAME);
  262.                 // this is needed to safely include the file name as part of the URL
  263.                 $safeFilename $slugger->slug($originalFilename);
  264.                 $newFilename $safeFilename '-' uniqid() . '.' $photo->guessExtension();
  265.                 try {
  266.                     $photo->move(
  267.                         $this->getParameter('photos_family'),
  268.                         $newFilename
  269.                     );
  270.                 } catch (FileException $e) {
  271.                     // ... handle exception if something happens during file upload
  272.                 }
  273.                 $family->setPhoto($newFilename);
  274.             }
  275.             if ($request->get('particular') == 'particular') {
  276.                 $family->setParticular(1);
  277.             } else {
  278.                 $family->setParticular(0);
  279.             }
  280.             if ($request->get('uma') == '1') {
  281.                 $family->setUma(1);
  282.             } else {
  283.                 $family->setUma(0);
  284.             }
  285.             if ($request->get('clearing') == '1') {
  286.                 $family->setClearing(1);
  287.             } else {
  288.                 $family->setClearing(0);
  289.             }
  290.             $family->setStatus(1);
  291.             $familyRepository->add($familytrue);
  292.             if ($request->get('particular') == 'particular') {
  293.                 return $this->redirectToRoute('app_family_sonstige_falle_index', [], Response::HTTP_SEE_OTHER);
  294.             } else if ($request->get('uma') == '1') {
  295.                 return $this->redirectToRoute('app_uma_index', ['uma' => 1], Response::HTTP_SEE_OTHER);
  296.             } else if ($request->get('clearing') == '1') {
  297.                 return $this->redirectToRoute('app_clearing_index', ['clearing' => 1], Response::HTTP_SEE_OTHER);
  298.             } else {
  299.                 return $this->redirectToRoute('app_family_index', [], Response::HTTP_SEE_OTHER);
  300.             }
  301.         }
  302.         return $this->renderForm('family/new.html.twig', [
  303.             'family' => $family,
  304.             'form' => $form,
  305.             'error' => $error,
  306.             'particular' => $request->get('particular') ? 'particular' '',
  307.         ]);
  308.     }
  309.     /**
  310.      * @Route("/{id}/sonstige_fall_show", name="app_family_sonstige_fall_show", methods={"GET"} , options = {"expose" = true})
  311.      * @Route("/{id}/show", name="app_family_show", methods={"GET"} , options = {"expose" = true})
  312.      * @Route("/{id}/show/uma/{uma}", name="app_family_uma_show", methods={"GET"} , options = {"expose" = true})
  313.      * @Route("/{id}/show/clearing/{clearing}", name="app_family_clearing_show", methods={"GET"} , options = {"expose" = true})
  314.      * 
  315.      * 
  316.      */
  317.     public function show(EntityManagerInterface $entityManagerFamily $familyFileTypeRepository $fileTypeRepositoryJugendamtRepository $JugendamtRepositoryZieleRepository $ZieleRepositorySituationsberichteRepository $SituationsberichteRepositoryBildungRepository $BildungRepositoryLeistungstragerRepository $LeistungstragerRepositoryGesundheitRepository $GesundheitRepositoryRechnungenRepository $RechnungenRepository): Response
  318.     {
  319.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  320.         $jugendamt $JugendamtRepository->findOneBy(['family' => $family]);
  321.         $bildung $BildungRepository->findOneBy(['family' => $family]);
  322.         $leistungstrager $LeistungstragerRepository->findOneBy(['family' => $family]);
  323.         $gesundheit $GesundheitRepository->findOneBy(['family' => $family]);
  324.         $Rechnungen $RechnungenRepository->findOneBy(['family' => $family->getId()], ['id' => 'DESC']);
  325.         $situationsberichte $SituationsberichteRepository->findOneBy(['family' => $family'status' => 0], ['id' => 'desc']);
  326.         $ziele $ZieleRepository->findOneBy(['family' => $family]);
  327.         if (!$this->security->isGranted('ROLE_ADMIN')) {
  328.             $fileTypes $fileTypeRepository->findAll() ;
  329.         } else {
  330.             $fileTypes $entityManager->createQuery(
  331.             'SELECT p
  332.             FROM App\Entity\FileType p
  333.             
  334.             WHERE p.id != 8
  335.              
  336.             '
  337.             )
  338.             ->getResult();
  339.         }
  340.         return $this->render('family/show.html.twig', [
  341.             'family' => $family,
  342.             'fileTypes' => $fileTypes,
  343.             'id' => sha1($family->getId()),
  344.             'jugendamt' => $jugendamt,
  345.             'bildung' => $bildung,
  346.             'leistungstrager' => $leistungstrager,
  347.             'gesundheit' => $gesundheit,
  348.             'situationsberichte' => $situationsberichte,
  349.             'ziele' => $ziele,
  350.             'file' => $Rechnungen != null '/uploads/docs_family/' sha1($family->getId()) . '/Rechnung-' $Rechnungen->getNum() . '.pdf' ''
  351.         ]);
  352.     }
  353.     /**
  354.      * @Route("/edit_sonstige_fall/{id}", name="app_family_sonstige_fall_edit", methods={"GET", "POST"}, options = {"expose"=true})
  355.      * @Route("/{id}/edit", name="app_family_edit", methods={"GET", "POST"} , options = {"expose"=true})
  356.      */
  357.     public function edit(Request $requestSluggerInterface $sluggerFamily $familyJugendamtRepository $JugendamtRepositoryBildungRepository $BildungRepositoryLeistungstragerRepository $LeistungstragerRepositoryGesundheitRepository $GesundheitRepositoryFamilyRepository $familyRepositoryValidatorInterface $validator): Response
  358.     {
  359.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  360.         $user $this->security->getToken()->getUser();
  361.         if ((!$this->security->isGranted('ROLE_ADMIN')) && (!$this->security->isGranted('ROLE_SUPERVISOR'))) {
  362.             if (!$user->getFamilies()->contains($family)) {
  363.                 // Si la famille n'appartient pas à l'utilisateur, on le déconnecte
  364.                 return $this->redirectToRoute('app_logout');
  365.             }
  366.         }
  367.         $form $this->createForm(FamilyType::class, $family);
  368.         $form->handleRequest($request);
  369.         $error null;
  370.         if ($form->isSubmitted() && !$form->isValid()) {
  371.             $errors $validator->validate($family);
  372.             if (count($errors) > 0) {
  373.                 $error $errors[0];
  374.             } else {
  375.                 $error['constraint']['message'] = 'Technisches Problem .';
  376.             }
  377.         } else if ($form->isSubmitted() && $form->isValid()) {
  378.             /** @var UploadedFile $brochureFile */
  379.             $photo $form->get('photo')->getData();
  380.             if ($photo != null) {
  381.                 $originalFilename pathinfo($photo->getClientOriginalName(), PATHINFO_FILENAME);
  382.                 // this is needed to safely include the file name as part of the URL
  383.                 $safeFilename $slugger->slug($originalFilename);
  384.                 $newFilename $safeFilename '-' uniqid() . '.' $photo->guessExtension();
  385.                 try {
  386.                     $photo->move(
  387.                         $this->getParameter('photos_family'),
  388.                         $newFilename
  389.                     );
  390.                     $family->setPhoto($newFilename);
  391.                 } catch (FileException $e) {
  392.                     // ... handle exception if something happens during file upload
  393.                 }
  394.             }
  395.             $familyRepository->add($familytrue);
  396.             // return $this->redirectToRoute('app_family_index', [], Response::HTTP_SEE_OTHER);
  397.         }
  398.         $Jugendamt $JugendamtRepository->findOneBy(['family' => $family]);
  399.         $bildung $BildungRepository->findOneBy(['family' => $family]);
  400.         $leistungstrager $LeistungstragerRepository->findOneBy(['family' => $family]);
  401.         $gesundheit $GesundheitRepository->findOneBy(['family' => $family]);
  402.         return $this->renderForm('family/edit.html.twig', [
  403.             'family' => $family,
  404.             'form' => $form,
  405.             'error' => $error,
  406.             'jugendamt' => $Jugendamt,
  407.             'bildung' => $bildung,
  408.             'leistungstrager' => $leistungstrager,
  409.             'gesundheit' => $gesundheit,
  410.         ]);
  411.     }
  412.     /**
  413.      * @Route("/{id}", name="app_family_delete", methods={"POST"} , options = {"expose" = true})
  414.      */
  415.     public function delete(Request $requestFamily $familyFamilyRepository $familyRepository): Response
  416.     {
  417.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  418.         $user $this->security->getToken()->getUser();
  419.         if ((!$this->security->isGranted('ROLE_ADMIN')) && (!$this->security->isGranted('ROLE_SUPERVISOR'))) {
  420.             if (!$user->getFamilies()->contains($family)) {
  421.                 // Si la famille n'appartient pas à l'utilisateur, on le déconnecte
  422.                 return $this->redirectToRoute('app_logout');
  423.             }
  424.         }
  425.         if ($this->isCsrfTokenValid('delete' $family->getId(), $request->request->get('_token'))) {
  426.             $familyRepository->remove($familytrue);
  427.         }
  428.         return new Response('OK');
  429.     }
  430.     /**
  431.      * @Route("/convert/uma/{id}", name="app_family_convert_clearing", methods={"POST"} , options = {"expose" = true})
  432.      */
  433.     public function convertUmaToClearing(Request $requestFamily $familyFamilyRepository $familyRepository): Response
  434.     {
  435.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  436.         $user $this->security->getToken()->getUser();
  437.         if ((!$this->security->isGranted('ROLE_ADMIN')) && (!$this->security->isGranted('ROLE_SUPERVISOR'))) {
  438.             if (!$user->getFamilies()->contains($family)) {
  439.                 // Si la famille n'appartient pas à l'utilisateur, on le déconnecte
  440.                 return $this->redirectToRoute('app_logout');
  441.             }
  442.         }
  443.         $family->setUma(0);
  444.         $family->setClearing(1);
  445.         $familyRepository->add($familytrue);
  446.         return new Response('OK');
  447.     }
  448.     /**
  449.      * @Route("/sonstige_fall_recup/{id}", name="app_family_sonstige_fall_recup", methods={"POST"} , options = {"expose" = true})
  450.      */
  451.     public function sonstige_fall_recup(Request $requestFamily $familyFamilyRepository $familyRepository): Response
  452.     {
  453.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  454.         $user $this->security->getToken()->getUser();
  455.         if ((!$this->security->isGranted('ROLE_ADMIN')) && (!$this->security->isGranted('ROLE_SUPERVISOR'))) {
  456.             if (!$user->getFamilies()->contains($family)) {
  457.                 // Si la famille n'appartient pas à l'utilisateur, on le déconnecte
  458.                 return $this->redirectToRoute('app_logout');
  459.             }
  460.         }
  461.         if ($this->isCsrfTokenValid('particular' $family->getId(), $request->request->get('_tokenParticular'))) {
  462.             $family->setParticular($request->get('particular'));
  463.             $familyRepository->add($familytrue);
  464.         }
  465.         return new Response('OK');
  466.     }
  467.     /**
  468.      * @Route("/archive/{id}", name="app_family_archive", methods={"POST"} , options = {"expose" = true})
  469.      */
  470.     public function confirm_archive(Request $requestFamily $familyFamilyRepository $familyRepository): Response
  471.     {
  472.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  473.         $user $this->security->getToken()->getUser();
  474.         if ((!$this->security->isGranted('ROLE_ADMIN')) && (!$this->security->isGranted('ROLE_SUPERVISOR'))) {
  475.             if (!$user->getFamilies()->contains($family)) {
  476.                 // Si la famille n'appartient pas à l'utilisateur, on le déconnecte
  477.                 return $this->redirectToRoute('app_logout');
  478.             }
  479.         }
  480.         if ($this->isCsrfTokenValid('archive' $family->getId(), $request->request->get('_tokenStatus'))) {
  481.             $family->setStatus($request->get('status'));
  482.             $familyRepository->add($familytrue);
  483.         }
  484.         return new Response('OK');
  485.     }
  486.     /**
  487.      * @Route("/{id}/office", name="app_office_delete", methods={"POST"} , options = {"expose" = true})
  488.      */
  489.     public function delete_office(Request $requestOffices $officesOfficesRepository $officesRepository): Response
  490.     {
  491.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  492.         $user $this->security->getToken()->getUser();
  493.         if ((!$this->security->isGranted('ROLE_ADMIN')) && (!$this->security->isGranted('ROLE_SUPERVISOR'))) {
  494.             if (!$user->getFamilies()->contains($family)) {
  495.                 // Si la famille n'appartient pas à l'utilisateur, on le déconnecte
  496.                 return $this->redirectToRoute('app_logout');
  497.             }
  498.         }
  499.         if ($this->isCsrfTokenValid('delete' $offices->getId(), $request->request->get('_office_token'))) {
  500.             $officesRepository->remove($officestrue);
  501.         }
  502.         return new Response('OK');
  503.     }
  504.     /**
  505.      * @Route("/{id}/member", name="app_family_member_delete", methods={"POST"} , options = {"expose" = true})
  506.      */
  507.     public function delete_member(Request $requestFamilyMember $familyMemberFamilyMemberRepository $familyMemberRepository): Response
  508.     {
  509.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  510.         $user $this->security->getToken()->getUser();
  511.         if ((!$this->security->isGranted('ROLE_ADMIN')) && (!$this->security->isGranted('ROLE_SUPERVISOR'))) {
  512.             if (!$user->getFamilies()->contains($family)) {
  513.                 // Si la famille n'appartient pas à l'utilisateur, on le déconnecte
  514.                 return $this->redirectToRoute('app_logout');
  515.             }
  516.         }
  517.         if ($this->isCsrfTokenValid('delete' $familyMember->getId(), $request->request->get('_token'))) {
  518.             $familyMemberRepository->remove($familyMembertrue);
  519.         }
  520.         return new Response('OK');
  521.     }
  522.     /**
  523.      * @Route("/serverOffices", name="serverOffices", methods={"GET"} , options = {"expose" = true } )
  524.      */
  525.     public function serverOffices(Request $requestEntityManagerInterface $entityManager): Response
  526.     {
  527.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  528.         $sql_where '';
  529.         if (($request->get('searchByEtat') != "all") && ($request->get('searchByEtat') != "")) {
  530.             $sql_where .= ' AND p.etat = ' $request->get('searchByEtat');
  531.         }
  532.         if (($request->get('family') != "")) {
  533.             $sql_where .= ' AND p.family = ' $request->get('family');
  534.         }
  535.         if (($request->get('searchByEtat') != "all") && ($request->get('searchByEtat') != "")) {
  536.             $sql_where .= ' AND p.etat = ' $request->get('searchByEtat');
  537.         }
  538.         /*if ( (!$this->security->isGranted('ROLE_ADMIN')) && (!$this->security->isGranted('ROLE_SUPERVISOR')) ) {
  539.             $sql_where .= ' AND p.user IS NULL OR p.user ='.$this->security->getToken()->getUser()->getId().' ' ;
  540.         }*/
  541.         if (($request->get('searchByStatus') != "")) {
  542.             $sql_where .= ' AND p.status = ' $request->get('searchByStatus');
  543.         }
  544.         if (($request->get('searchByParticular') != "")) {
  545.             $sql_where .= ' AND p.particular = ' $request->get('searchByParticular');
  546.         }
  547.         $columns = ['p.id''p.firstname''p.lastname''p.address''p.office''p.tel''p.email''p.id'];
  548.         $sql_search '';
  549.         if ($request->get('search')['value'] != "") {
  550.             $sql_where_glob_arr = [];
  551.             foreach ($columns as $column) {
  552.                 $sql_where_glob_arr[] = ' ' $column ' LIKE \'%' $request->get('search')['value'] . '%\' ';
  553.             }
  554.             if (count($sql_where_glob_arr) > 0) {
  555.                 $sql_search ' AND ( ' implode(' OR '$sql_where_glob_arr) . ' ) ';
  556.             }
  557.         }
  558.         $orders = [];
  559.         for ($i 0$i count($request->get('order')); $i++) {
  560.             $orders[] = $columns[$request->get('order')[$i]['column']] . ' ' $request->get('order')[$i]['dir'];
  561.         }
  562.         if (count($orders) > 0) {
  563.             $order " ORDER BY " implode(' , '$orders);
  564.         } else {
  565.             $order "";
  566.         }
  567.         $existance $entityManager->createQuery(
  568.             'SELECT p
  569.             FROM App\Entity\Offices p
  570.             
  571.             WHERE 1=1 ' $sql_where ' ' $sql_search '
  572.              
  573.             '
  574.         )
  575.             ->getResult();
  576.         $I_nbResultatsTotal count($existance);
  577.         $limit =  $request->get('length');
  578.         $offset $request->get('start');
  579.         $array_search = array();
  580.         //->setParameter('nom', '%'.$request->get('searchByNom').'%')
  581.         //p.nom LIKE :nom
  582.         $offices $entityManager->createQuery(
  583.             'SELECT p
  584.             FROM App\Entity\Offices p
  585.             
  586.             WHERE 1=1  ' $sql_where ' ' $sql_search ' ' $order '
  587.             
  588.             
  589.             '
  590.         )
  591.             ->setMaxResults($limit)
  592.             ->setFirstResult($offset)
  593.             ->getResult();
  594.         $output = [];
  595.         foreach ($offices as $office) {
  596.             $token $this->tokenManager->getToken('delete' $office->getId())->getValue();
  597.             //$tokenStatus = $this->tokenManager->getToken('archive'.$family->getId())->getValue();
  598.             $output[] = [
  599.                 'lastname' => $office->getLastname(),
  600.                 'firstname' => $office->getFirstname(),
  601.                 'id' => $office->getId(),
  602.                 'address' => $office->getAddress(),
  603.                 'office' => $office->getOffice(),
  604.                 'tel' => $office->getTel(),
  605.                 'email' => $office->getEmail(),
  606.                 'token' => $token,
  607.             ];
  608.         }
  609.         $JSON json_encode($output);
  610.         $JSON '{"draw": ' $request->get('draw') . ',"recordsTotal":' $I_nbResultatsTotal ',"recordsFiltered":' $I_nbResultatsTotal ',"data":' $JSON '}';
  611.         $response   = new Response($JSON200, ['Content-Type' => 'application/json']);
  612.         return $response;
  613.     }
  614.     /**
  615.      * @Route("/serverFamily", name="serverFamily", methods={"GET"} , options = {"expose" = true } )
  616.      */
  617.     public function serverFamily(Request $requestEntityManagerInterface $entityManagerUserRepository $userRepository): Response
  618.     {
  619.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  620.         $user $userRepository->find($this->security->getToken()->getUser()->getId());
  621.         $sql_where '';
  622.         if (($request->get('searchByEtat') != "all") && ($request->get('searchByEtat') != "")) {
  623.             $sql_where .= ' AND p.etat = ' $request->get('searchByEtat');
  624.         }
  625.         if ((!$this->security->isGranted('ROLE_ADMIN')) && (!$this->security->isGranted('ROLE_SUPERVISOR'))) {
  626.             $authorizedFamilies $user->getFamilies();
  627.             
  628.             $familieIds = [];
  629.             foreach($authorizedFamilies as $authorizedFamily){
  630.                 $familieIds[] = $authorizedFamily->getId();
  631.             }
  632.             
  633.             if(count($familieIds)>0) { 
  634.                 $sql_where .= ' AND  p.id IN ('.implode(','$familieIds).')';
  635.             } else {
  636.                 $sql_where .= ' AND p.id = 0 ';
  637.             }
  638.             
  639.         }
  640.         if (($request->get('searchByStatus') == '0')) {
  641.             $sql_where .= ' AND p.status =  ' $request->get('searchByStatus');
  642.         } else {
  643.             $sql_where .= ' AND p.status = 1  ';
  644.             if (($request->get('searchByParticular') != "")) {
  645.                 $sql_where .= ' AND p.particular = ' $request->get('searchByParticular');
  646.             }
  647.             if (($request->get('searchByUma') == "1")) {
  648.                 $sql_where .= ' AND p.uma = 1 ';
  649.             } else {
  650.                 $sql_where .= ' AND p.uma = 0 ';
  651.             }
  652.             if (($request->get('searchByClearing') == "1")) {
  653.                 $sql_where .= ' AND p.clearing = 1 ';
  654.             } else {
  655.                 $sql_where .= ' AND p.clearing = 0 ';
  656.             }
  657.         }
  658.         
  659.         $columns = ['p.id''p.firstname''p.lastname''p.place_of_birth''p.date_of_birth''p.country''p.address''p.language''p.tel''p.id'];
  660.         $columnsSearch = ['p.firstname''p.lastname''p.date_of_birth'];
  661.         $sql_search '';
  662.         if ($request->get('search')['value'] != "") {
  663.             $sql_where_glob_arr = [];
  664.             foreach ($columnsSearch as $column) {
  665.                 if($column == 'p.date_of_birth'){
  666.                     $date DateTime::createFromFormat('d.m.Y'$request->get('search')['value']);
  667.                     
  668.                     if ($date === false) {
  669.                         continue;
  670.                     }
  671.                     $newDateString $date->format('Y-m-d');
  672.                     $sql_where_glob_arr[] = ' ' $column ' = \''.$newDateString.'\' ';
  673.                 } else {
  674.                     $sql_where_glob_arr[] = ' ' $column ' LIKE \'%' $request->get('search')['value'] . '%\' ';
  675.                 }
  676.             }
  677.             if (count($sql_where_glob_arr) > 0) {
  678.                 $sql_search ' AND ( ' implode(' OR '$sql_where_glob_arr) . ' ) ';
  679.             }
  680.         }
  681.         $orders = [];
  682.         for ($i 0$i count($request->get('order')); $i++) {
  683.             $orders[] = $columns[$request->get('order')[$i]['column']] . ' ' $request->get('order')[$i]['dir'];
  684.         }
  685.         if (count($orders) > 0) {
  686.             $order " ORDER BY " implode(' , '$orders);
  687.         } else {
  688.             $order "";
  689.         }
  690.         $existance $entityManager->createQuery(
  691.             'SELECT p
  692.             FROM App\Entity\Family p
  693.             
  694.             WHERE 1=1 ' $sql_where ' ' $sql_search '
  695.              
  696.             '
  697.         )
  698.             ->getResult();
  699.         $I_nbResultatsTotal count($existance);
  700.         $limit =  $request->get('length');
  701.         $offset $request->get('start');
  702.         $array_search = array();
  703.         //->setParameter('nom', '%'.$request->get('searchByNom').'%')
  704.         //p.nom LIKE :nom
  705.         $families $entityManager->createQuery(
  706.             'SELECT p
  707.             FROM App\Entity\Family p
  708.             WHERE 1=1 ' $sql_where ' ' $sql_search ' ' $order '
  709.             
  710.             '
  711.         )
  712.             ->setMaxResults($limit)
  713.             ->setFirstResult($offset)
  714.             ->getResult();
  715.         $output = [];
  716.         foreach ($families as $family) {
  717.             $token $this->tokenManager->getToken('delete' $family->getId())->getValue();
  718.             $tokenStatus $this->tokenManager->getToken('archive' $family->getId())->getValue();
  719.             $tokenParticular $this->tokenManager->getToken('particular' $family->getId())->getValue();
  720.             $output[] = [
  721.                 'lastname' => $family->getLastname(),
  722.                 'firstname' => $family->getFirstname(),
  723.                 'hpg' => !is_null($family->getBerichtszeitraumDate2()) ? date_format($family->getBerichtszeitraumDate2(), 'd.m.Y') : '',
  724.                 'date_of_birth' => date_format($family->getDateOfBirth(), 'd.m.Y'),
  725.                 'country' => $family->getCountry(),
  726.                 'id' => $family->getId(),
  727.                 'address' => $family->getAddress(),
  728.                 'place_of_birth' => $family->getStadt(),
  729.                 'language' => $family->getLanguage(),
  730.                 'tel' => $family->getTel(),
  731.                 'jugendamt_hilf_beginn' => !is_null($family->getJugendamts()[0]) ? $family->getJugendamts()[0]->getHilfBeginn() : '',
  732.                 'token' => $token,
  733.                 'status' => $family->getStatus(),
  734.                 'tokenStatus' => $tokenStatus,
  735.                 'particular' => $family->getParticular(),
  736.                 'tokenParticular' => $tokenParticular,
  737.                 'uma' => $family->isUma() ? 0,
  738.                 'clearing' => $family->isClearing() ? 0,
  739.             ];
  740.         }
  741.         $JSON json_encode($output);
  742.         $JSON '{"draw": ' $request->get('draw') . ',"recordsTotal":' $I_nbResultatsTotal ',"recordsFiltered":' $I_nbResultatsTotal ',"data":' $JSON '}';
  743.         $response   = new Response($JSON200, ['Content-Type' => 'application/json']);
  744.         return $response;
  745.     }
  746.     /**
  747.      * @Route("/serverFamilyMembers", name="serverFamilyMembers", methods={"GET"} , options = {"expose" = true } )
  748.      */
  749.     public function serverFamilyMembers(Request $requestUserRepository $userRepositoryEntityManagerInterface $entityManager): Response
  750.     {
  751.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  752.         $user $userRepository->find($this->security->getToken()->getUser()->getId());
  753.         
  754.         $sql_where '';
  755.         if (($request->get('searchByEtat') != "all") && ($request->get('searchByEtat') != "")) {
  756.             $sql_where .= ' AND p.etat = ' $request->get('searchByEtat');
  757.         }
  758.         if (($request->get('searchByEtat') != "all") && ($request->get('searchByEtat') != "")) {
  759.             $sql_where .= ' AND p.etat = ' $request->get('searchByEtat');
  760.         }
  761.         if ((!$this->security->isGranted('ROLE_ADMIN')) && (!$this->security->isGranted('ROLE_SUPERVISOR'))) {
  762.             $authorizedFamilies $user->getFamilies();
  763.             $familieIds = [];
  764.             foreach($authorizedFamilies as $authorizedFamily){
  765.                 $familieIds[] = $authorizedFamily->getId();
  766.             }
  767.             
  768.             if(count($familieIds)>0) { 
  769.                 $sql_where .= ' AND  f.id IN ('.implode(','$familieIds).')';
  770.             } else {
  771.                 $sql_where .= ' AND f.id = 0 ';
  772.             }
  773.             
  774.         }
  775.         $columns = ['p.id''p.firstname''p.lastname''p.date_of_birth''p.id'];
  776.         $sql_search '';
  777.         if ($request->get('search')['value'] != "") {
  778.             $sql_where_glob_arr = [];
  779.             foreach ($columns as $column) {
  780.                 $sql_where_glob_arr[] = ' ' $column ' LIKE \'%' $request->get('search')['value'] . '%\' ';
  781.             }
  782.             if (count($sql_where_glob_arr) > 0) {
  783.                 $sql_search ' AND ( ' implode(' OR '$sql_where_glob_arr) . ' ) ';
  784.             }
  785.         }
  786.         $orders = [];
  787.         for ($i 0$i count($request->get('order')); $i++) {
  788.             $orders[] = $columns[$request->get('order')[$i]['column']] . ' ' $request->get('order')[$i]['dir'];
  789.         }
  790.         if (count($orders) > 0) {
  791.             $order " ORDER BY " implode(' , '$orders);
  792.         } else {
  793.             $order "";
  794.         }
  795.         $existance $entityManager->createQuery(
  796.             'SELECT p
  797.             FROM App\Entity\FamilyMember p
  798.             JOIN p.family f
  799.             
  800.             WHERE ( 1=1 AND f.id = ' $request->get('family') . ' )  ' $sql_where ' ' $sql_search '
  801.              
  802.             '
  803.         )
  804.             ->getResult();
  805.         $I_nbResultatsTotal count($existance);
  806.         $limit =  $request->get('length');
  807.         $offset $request->get('start');
  808.         $array_search = array();
  809.         //->setParameter('nom', '%'.$request->get('searchByNom').'%')
  810.         //p.nom LIKE :nom
  811.         $members $entityManager->createQuery(
  812.             'SELECT p
  813.             FROM App\Entity\FamilyMember p
  814.             JOIN p.family f
  815.             
  816.             WHERE ( 1=1 AND f.id = ' $request->get('family') . ' ) ' $sql_where ' ' $sql_search ' ' $order '
  817.             
  818.             
  819.             '
  820.         )
  821.             ->setMaxResults($limit)
  822.             ->setFirstResult($offset)
  823.             ->getResult();
  824.         $output = [];
  825.         foreach ($members as $member) {
  826.             $token $this->tokenManager->getToken('delete' $member->getId())->getValue();
  827.             $output[] = [
  828.                 'lastname' => $member->getLastname(),
  829.                 'firstname' => $member->getFirstname(),
  830.                 'date_of_birth' => $member->getDateOfBirth() != "" date_format($member->getDateOfBirth(), 'd/m/Y') : '',
  831.                 'id' => $member->getId(),
  832.                 'token' => $token
  833.             ];
  834.         }
  835.         $JSON json_encode($output);
  836.         $JSON '{"draw": ' $request->get('draw') . ',"recordsTotal":' $I_nbResultatsTotal ',"recordsFiltered":' $I_nbResultatsTotal ',"data":' $JSON '}';
  837.         $response   = new Response($JSON200, ['Content-Type' => 'application/json']);
  838.         return $response;
  839.     }
  840.     /**
  841.      * @Route("/{id}/edit_office", name="app_office_edit", methods={"GET", "POST"} , options = {"expose"=true})
  842.      */
  843.     public function edit_office(Request $requestOffices $officesSluggerInterface $sluggerOfficesRepository $officesRepositoryValidatorInterface $validator): Response
  844.     {
  845.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  846.         $form $this->createForm(OfficesType::class, $offices);
  847.         $form->handleRequest($request);
  848.         $error null;
  849.         if ($form->isSubmitted() && !$form->isValid()) {
  850.             $errors $validator->validate($familyMember);
  851.             if (count($errors) > 0) {
  852.                 $error $errors[0]['constraint']['message'];
  853.             } else {
  854.                 $error 'Technisches Problem .';
  855.             }
  856.             return new Response($error);
  857.         } else if ($form->isSubmitted() && $form->isValid()) {
  858.             $officesRepository->add($officestrue);
  859.             return new Response('OK');
  860.         }
  861.         return $this->renderForm('family/office_new.html.twig', [
  862.             'form' => $form,
  863.             'error' => $error
  864.         ]);
  865.     }
  866.     /**
  867.      * @Route("/{id}/edit_member", name="app_family_member_edit", methods={"GET", "POST"} , options = {"expose"=true})
  868.      */
  869.     public function edit_member(Request $requestFamilyMember $familyMemberGesundheitRepository $GesundheitRepositoryBildungRepository $BildungRepositorySluggerInterface $sluggerFamilyMemberRepository $familyMemberRepositoryValidatorInterface $validator): Response
  870.     {
  871.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  872.         $form $this->createForm(FamilyMemberType::class, $familyMember);
  873.         $form->handleRequest($request);
  874.         $error null;
  875.         if ($form->isSubmitted() && !$form->isValid()) {
  876.             $errors $validator->validate($familyMember);
  877.             if (count($errors) > 0) {
  878.                 $error $errors[0]['constraint']['message'];
  879.             } else {
  880.                 $error 'Technisches Problem .';
  881.             }
  882.             return new Response($error);
  883.         } else if ($form->isSubmitted() && $form->isValid()) {
  884.             if ($form['gesundheit']['name']->getData() != "") {
  885.                 $gesundheit = new Gesundheit();
  886.                 $gesundheit->setType($form['gesundheit']['type']->getData());
  887.                 $gesundheit->setName($form['gesundheit']['name']->getData());
  888.                 $gesundheit->setAnschrift($form['gesundheit']['anschrift']->getData());
  889.                 $gesundheit->setTel($form['gesundheit']['tel']->getData());
  890.                 $GesundheitRepository->add($gesundheittrue);
  891.                 $familyMember->setGesundheit($gesundheit);
  892.             }
  893.             if ($form['bildung']['name']->getData() != "") {
  894.                 $bildung = new Bildung();
  895.                 $bildung->setType($form['bildung']['type']->getData());
  896.                 $bildung->setName($form['bildung']['name']->getData());
  897.                 $bildung->setKlasse($form['bildung']['klasse']->getData());
  898.                 $bildung->setAddress($form['bildung']['address']->getData());
  899.                 $bildung->setSchulsozialarbeiter($form['bildung']['schulsozialarbeiter']->getData());
  900.                 $bildung->setSchulsozialarbeiterTel($form['bildung']['schulsozialarbeiter_tel']->getData());
  901.                 $bildung->setSchulsozialarbeiterEmail($form['bildung']['schulsozialarbeiter_email']->getData());
  902.                 $bildung->setKlassenlehrer($form['bildung']['klassenlehrer']->getData());
  903.                 $bildung->setKlassenlehrerTel($form['bildung']['klassenlehrer_tel']->getData());
  904.                 $bildung->setKlassenlehrerEmail($form['bildung']['klassenlehrer_email']->getData());
  905.                 $BildungRepository->add($bildungtrue);
  906.                 $familyMember->setBildung($bildung);
  907.             }
  908.             /** @var UploadedFile $brochureFile */
  909.             $photo $form->get('photo')->getData();
  910.             if ($photo) {
  911.                 $originalFilename pathinfo($photo->getClientOriginalName(), PATHINFO_FILENAME);
  912.                 // this is needed to safely include the file name as part of the URL
  913.                 $safeFilename $slugger->slug($originalFilename);
  914.                 $newFilename $safeFilename '-' uniqid() . '.' $photo->guessExtension();
  915.                 try {
  916.                     $photo->move(
  917.                         $this->getParameter('photos_family'),
  918.                         $newFilename
  919.                     );
  920.                 } catch (FileException $e) {
  921.                     // ... handle exception if something happens during file upload
  922.                 }
  923.                 $familyMember->setPhoto($newFilename);
  924.             }
  925.             $familyMemberRepository->add($familyMembertrue);
  926.             return new Response('OK');
  927.         }
  928.         return $this->renderForm('family/member_new.html.twig', [
  929.             'family' => $familyMember,
  930.             'form' => $form,
  931.             'error' => $error
  932.         ]);
  933.     }
  934.     /**
  935.      * @Route("/reisekosten", name="app_reisekosten_index", methods={"GET"})
  936.      */
  937.     public function index_reisekosten(CalendarRepository $CalendarRepositoryFamilyRepository $FamilyRepository): Response
  938.     {
  939.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  940.         if (!$this->security->isGranted('ROLE_ADMIN')) {
  941.             return $this->redirectToRoute('app_logout');
  942.         }
  943.         $families $FamilyRepository->findAll();
  944.         return $this->render('family/index_reisekosten.html.twig', [
  945.             'calendars' => $CalendarRepository->findAll(),
  946.             'families' => $families,
  947.         ]);
  948.     }
  949.     /**
  950.      * @Route("/serverReisekosten", name="serverReisekosten", methods={"GET"} , options = {"expose" = true } )
  951.      */
  952.     public function serverReisekosten(Request $requestEntityManagerInterface $entityManager): Response
  953.     {
  954.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  955.         $sql_where '';
  956.         if ($request->get('searchByFamily') != "") {
  957.             $sql_where .= ' AND p.family = ' $request->get('searchByFamily');
  958.         }
  959.         if ($request->get('searchByMonth') != "") {
  960.             $sql_where .= ' AND MONTH(p.start) = ' $request->get('searchByMonth');
  961.         }
  962.         if ($request->get('searchByYear') != "") {
  963.             $sql_where .= ' AND YEAR(p.start) = ' $request->get('searchByYear');
  964.         }
  965.         $columns = ['p.id''p.firstname''p.lastname''p.place_of_birth''p.date_of_birth''p.country''p.address''p.language''p.tel''p.id'];
  966.         $sql_search '';
  967.         if ($request->get('search')['value'] != "") {
  968.             $sql_where_glob_arr = [];
  969.             foreach ($columns as $column) {
  970.                 $sql_where_glob_arr[] = ' ' $column ' LIKE \'%' $request->get('search')['value'] . '%\' ';
  971.             }
  972.             if (count($sql_where_glob_arr) > 0) {
  973.                 $sql_search ' AND ( ' implode(' OR '$sql_where_glob_arr) . ' ) ';
  974.             }
  975.         }
  976.         $orders[] = ' p.start ASC ';
  977.         for ($i 0$i count($request->get('order')); $i++) {
  978.             $orders[] = $columns[$request->get('order')[$i]['column']] . ' ' $request->get('order')[$i]['dir'];
  979.         }
  980.         if (count($orders) > 0) {
  981.             $order " ORDER BY " implode(' , '$orders);
  982.         } else {
  983.             $order "";
  984.         }
  985.         $existance $entityManager->createQuery(
  986.             'SELECT p
  987.             FROM App\Entity\Calendar p
  988.             
  989.             WHERE 1=1 ' $sql_where ' ' $sql_search '
  990.              
  991.             '
  992.         )
  993.             ->getResult();
  994.         $I_nbResultatsTotal count($existance);
  995.         $limit =  $request->get('length');
  996.         $offset $request->get('start');
  997.         $array_search = array();
  998.         //->setParameter('nom', '%'.$request->get('searchByNom').'%')
  999.         //p.nom LIKE :nom
  1000.         $calndars $entityManager->createQuery(
  1001.             'SELECT p
  1002.             FROM App\Entity\Calendar p
  1003.             
  1004.             WHERE 1=1 AND p.status = 2 ' $sql_where ' ' $sql_search ' ' $order '
  1005.             
  1006.             
  1007.             '
  1008.         )
  1009.             ->setMaxResults($limit)
  1010.             ->setFirstResult($offset)
  1011.             ->getResult();
  1012.         $calndar_global $entityManager->createQuery(
  1013.             'SELECT SUM(p.km) as total_km
  1014.             FROM App\Entity\Calendar p
  1015.             
  1016.             WHERE 1=1 AND p.status = 2 ' $sql_where '
  1017.             
  1018.             
  1019.             '
  1020.         )
  1021.             ->getOneOrNullResult();
  1022.         $output = [];
  1023.         if ($calndar_global != null) {
  1024.             $total_km $calndar_global['total_km'];
  1025.         } else {
  1026.             $total_km 0;
  1027.         }
  1028.         foreach ($calndars as $calndar) {
  1029.             $output[] = [
  1030.                 'tag' => date_format($calndar->getStart(), 'd/m/Y'),
  1031.                 'beginn' => date_format($calndar->getStart(), 'H:i'),
  1032.                 'ende' => date_format($calndar->getEnd(), 'H:i'),
  1033.                 'itinerary' => $calndar->getItinerary(),
  1034.                 'reise' => $calndar->getDescription(),
  1035.                 'km' => $calndar->getKm(),
  1036.             ];
  1037.         }
  1038.         $JSON json_encode($output);
  1039.         $JSON '{"draw": ' $request->get('draw') . ',"recordsTotal":' $I_nbResultatsTotal ',"recordsFiltered":' $I_nbResultatsTotal ',"total_km":"' $total_km '","data":' $JSON '}';
  1040.         $response   = new Response($JSON200, ['Content-Type' => 'application/json']);
  1041.         return $response;
  1042.     }
  1043.     /**
  1044.      * @Route("/confirm/paid/{id}/{token}", name="app_rechnungen_confirm_paid", methods={"POST"}, options={"expose"=true})
  1045.      */
  1046.     public function confirm_paid(Request $requestEntityManagerInterface $entityManagerJugendamtRepository $JugendamtRepositoryRechnungenRepository $RechnungenRepositoryFamilyRepository $FamilyRepository): Response
  1047.     {
  1048.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  1049.         if (!$this->security->isGranted('ROLE_ADMIN')) {
  1050.             return $this->redirectToRoute('app_logout');
  1051.         }
  1052.         $Rechnungen $RechnungenRepository->find($request->get('id'));
  1053.         $Rechnungen->setTotalAmount($request->get('amount'));
  1054.         $Rechnungen->setPaid(1);
  1055.         $Rechnungen->setPaidAt( !empty($request->get('paid_at')) ? \DateTime::createFromFormat('Y-m-d',$request->get('paid_at')) : null);
  1056.         $this->em->persist($Rechnungen);
  1057.         $this->em->flush();
  1058.         return new Response('OK');
  1059.     }
  1060.     /**
  1061.      * @Route("/send/office/alle_rechnungen_pdf", name="app_rechnungen_office_send", methods={"GET","POST"}, options={"expose"=true})
  1062.      */
  1063.     public function alle_rechnungen_office_send(Request $requestMailerInterface $mailerEntityManagerInterface $entityManagerJugendamtRepository $JugendamtRepositoryRechnungenRepository $RechnungenRepositoryFamilyRepository $FamilyRepositoryContactRepository $contactRepository): Response
  1064.     {
  1065.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  1066.         if (!$this->security->isGranted('ROLE_ADMIN')) {
  1067.             return $this->redirectToRoute('app_logout');
  1068.         }
  1069.         if ((($request->get('other') != '1') && ($request->get('destination') == '')) || (($request->get('other') == '1') && ($request->get('other_destination') == ''))) {
  1070.             return new Response('KO');
  1071.         }
  1072.         $filesystem = new Filesystem();
  1073.         $sql_where '';
  1074.         $family null;
  1075.         if ($request->get('searchByFamily') != "") {
  1076.             $sql_where .= ' AND f.id = ' $request->get('searchByFamily');
  1077.             $family $FamilyRepository->find($request->get('searchByFamily'));
  1078.         }
  1079.         $sql_search '';
  1080.         /*if( $request->get('search')['value']!=""){
  1081.             $sql_where_glob_arr = [];
  1082.             foreach($columns as $column){
  1083.             $sql_where_glob_arr[] = ' '.$column.' LIKE \'%'.$request->get('search')['value'].'%\' ' ;
  1084.             }
  1085.             if(count($sql_where_glob_arr)>0){
  1086.                 $sql_search = ' AND ( '.implode(' OR ', $sql_where_glob_arr ).' ) ' ;
  1087.             }
  1088.         }*/
  1089.         //->setParameter('nom', '%'.$request->get('searchByNom').'%')
  1090.         //p.nom LIKE :nom
  1091.         $filename $request->get('filename');
  1092.         try {
  1093.             if (($request->get('other') == '1') && ($request->get('other_destination') != '')) {
  1094.                 $email = (new TemplatedEmail())
  1095.                     ->from('Nizar Trabelsi <nizar.trabelsi@wep-erziehungshilfe.de>')
  1096.                     ->to($request->get('other_destination'))
  1097.                     ->cc('verwaltung@wep-erziehungshilfe.de')
  1098.                     ->attachFromPath($filename)
  1099.                     ->subject('Rechnung')
  1100.                     ->htmlTemplate('email/rechnung.html.twig')
  1101.                     ->context([
  1102.                         'email_text' => $request->get('email_text'),
  1103.                     ]);
  1104.                 $existanceContact $contactRepository->findOneBy(['email' => $request->get('other_destination')]);
  1105.                 if (is_null($existanceContact)) {
  1106.                     $contact = new Contact();
  1107.                     $contact->setEmail($request->get('other_destination'));
  1108.                     $this->em->persist($contact);
  1109.                 }
  1110.             } else {
  1111.                 $email = (new TemplatedEmail())
  1112.                     ->from('Nizar Trabelsi <nizar.trabelsi@wep-erziehungshilfe.de>')
  1113.                     ->to(...$request->get('destination'))
  1114.                     ->cc('nizar.trabelsi@wep-erziehungshilfe.de')
  1115.                     ->attachFromPath($filename)
  1116.                     ->subject('Rechnung')
  1117.                     ->htmlTemplate('email/rechnung.html.twig')
  1118.                     ->context([
  1119.                         'email_text' => $request->get('email_text'),
  1120.                     ]);
  1121.             }
  1122.             $mailer->send($email);
  1123.             $filesystem->remove($filename);
  1124.             foreach ($request->get('ids') as $id) {
  1125.                 $Rechnungen $RechnungenRepository->find($id);
  1126.                 if (!is_null($Rechnungen)) {
  1127.                     $Rechnungen->setSent(1);
  1128.                     $this->em->persist($Rechnungen);
  1129.                     $this->em->flush();
  1130.                 }
  1131.             }
  1132.             $this->em->flush();
  1133.             return new Response('OK');
  1134.         } catch (TransportExceptionInterface $e) {
  1135.             return new Response($e->getMessage());
  1136.         }
  1137.     }
  1138.     /**
  1139.      * @Route("/send/alle_rechnungen_pdf", name="app_rechnungen_send", methods={"GET","POST"}, options={"expose"=true})
  1140.      */
  1141.     public function alle_rechnungen_send(Request $requestMailerInterface $mailerEntityManagerInterface $entityManagerJugendamtRepository $JugendamtRepositoryRechnungenRepository $RechnungenRepositoryFamilyRepository $FamilyRepository): Response
  1142.     {
  1143.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  1144.         if (!$this->security->isGranted('ROLE_ADMIN')) {
  1145.             return $this->redirectToRoute('app_logout');
  1146.         }
  1147.         if ((($request->get('other') != '1') && ($request->get('destination') == '')) || (($request->get('other') == '1') && ($request->get('other_destination') == ''))) {
  1148.             return new Response('KO');
  1149.         }
  1150.         $filesystem = new Filesystem();
  1151.         $sql_where '';
  1152.         
  1153.         if (!empty($request->get('ids'))) {
  1154.             $sqlId = [];
  1155.             foreach($request->get('ids') as $id) {
  1156.                 $sqlId[] = ' r.id = '.$id ;
  1157.             }
  1158.             if(!empty($sqlId)){
  1159.                 $sql_where .= ' AND ' implode(' OR '$sqlId) ;
  1160.             }
  1161.         }
  1162.         $files $entityManager->createQuery(
  1163.             'SELECT r
  1164.             FROM App\Entity\Rechnungen r
  1165.             JOIN r.family f
  1166.             
  1167.             WHERE 1=1 ' $sql_where '
  1168.             '
  1169.         )
  1170.         ->getResult();
  1171.         $filePaths = [];
  1172.         foreach($files as $file) {
  1173.             $file->setSent(1);
  1174.             $filePaths[] = $this->getParameter('docs_family') . '/' sha1($file->getFamily()->getId()) . '/' .$file->getFileName(); 
  1175.         }
  1176.     
  1177.         try {
  1178.             if (($request->get('other') == '1') && ($request->get('other_destination') != '')) {
  1179.                 $email = (new TemplatedEmail())
  1180.                     ->from('Nizar Trabelsi <nizar.trabelsi@wep-erziehungshilfe.de>')
  1181.                     ->to($request->get('other_destination'))
  1182.                     ->cc('info@wep-erziehungshilfe.de')
  1183.                     ->subject('Rechnung')
  1184.                     ->htmlTemplate('email/rechnung.html.twig')
  1185.                     ->context([
  1186.                         'email_text' => $request->get('email_text'),
  1187.                     ]);
  1188.                     foreach($filePaths as $path) {
  1189.                         if (file_exists($path)) {
  1190.                             $email->attachFromPath($path);
  1191.                         }
  1192.                     }
  1193.                 $contact = new Contact();
  1194.                 $contact->setEmail($request->get('other_destination'));
  1195.                 $this->em->persist($contact);
  1196.             } else {
  1197.                 $email = (new TemplatedEmail())
  1198.                     ->from('Nizar Trabelsi <nizar.trabelsi@wep-erziehungshilfe.de>')
  1199.                     ->to(...$request->get('destination'))
  1200.                     ->cc('info@wep-erziehungshilfe.de')
  1201.                     ->subject('Rechnung')
  1202.                     ->htmlTemplate('email/rechnung.html.twig')
  1203.                     ->context([
  1204.                         'email_text' => $request->get('email_text'),
  1205.                     ]);
  1206.                     foreach($filePaths as $path) {
  1207.                         if (file_exists($path)) {
  1208.                             $email->attachFromPath($path);
  1209.                         }
  1210.                     }
  1211.             }
  1212.             $mailer->send($email);
  1213.             $this->em->flush();
  1214.             return new Response('OK');
  1215.         } catch (TransportExceptionInterface $e) {
  1216.             return new Response($e->getOriginalMessage());
  1217.         }
  1218.     }
  1219.     /**
  1220.      * @Route("/send/alle_rechnungen_pdf_old", name="app_rechnungen_send_old", methods={"GET","POST"}, options={"expose"=true})
  1221.      */
  1222.     public function alle_rechnungen_send_old(Request $requestMailerInterface $mailerEntityManagerInterface $entityManagerJugendamtRepository $JugendamtRepositoryRechnungenRepository $RechnungenRepositoryFamilyRepository $FamilyRepository): Response
  1223.     {
  1224.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  1225.         if (!$this->security->isGranted('ROLE_ADMIN')) {
  1226.             return $this->redirectToRoute('app_logout');
  1227.         }
  1228.         if ((($request->get('other') != '1') && ($request->get('destination') == '')) || (($request->get('other') == '1') && ($request->get('other_destination') == ''))) {
  1229.             return new Response('KO');
  1230.         }
  1231.         $filesystem = new Filesystem();
  1232.         $sql_where '';
  1233.         $family null;
  1234.         if ($request->get('searchByFamily') != "") {
  1235.             $sql_where .= ' AND f.id = ' $request->get('searchByFamily');
  1236.             $family $FamilyRepository->find($request->get('searchByFamily'));
  1237.         }
  1238.         $sql_search '';
  1239.         /*if( $request->get('search')['value']!=""){
  1240.             $sql_where_glob_arr = [];
  1241.             foreach($columns as $column){
  1242.             $sql_where_glob_arr[] = ' '.$column.' LIKE \'%'.$request->get('search')['value'].'%\' ' ;
  1243.             }
  1244.             if(count($sql_where_glob_arr)>0){
  1245.                 $sql_search = ' AND ( '.implode(' OR ', $sql_where_glob_arr ).' ) ' ;
  1246.             }
  1247.         }*/
  1248.         $array_search = array();
  1249.         //->setParameter('nom', '%'.$request->get('searchByNom').'%')
  1250.         //p.nom LIKE :nom
  1251.         $hourPrice 55;
  1252.         if ($request->get('searchByYear') . $request->get('searchByMonth') >= 202308) {
  1253.             $hourPrice 70;
  1254.         }
  1255.         $families $entityManager->createQuery(
  1256.             'SELECT f.id as id , f.firstname , f.lastname, concat(f.id , MONTH(p.start) , YEAR(p.start)) as family , SUM(p.km) as total_km , SUM(p.km)*0.30 as total_km_price , SUM( ( TimestampDiff(SECOND ,p.start , p.end) / 3600 ) ) as total_hours , SUM( ( TimestampDiff(SECOND ,p.start , p.end) / 3600 ) ) * ' $hourPrice '  as total_price_hours , MONTH(p.start) as m , YEAR(p.start) as y
  1257.             FROM App\Entity\Calendar p
  1258.             JOIN p.family f
  1259.             
  1260.             WHERE 1=1 AND p.status = 2 AND MONTH(p.start) >= ' $request->get('searchByMonth') . ' AND YEAR(p.start) >= ' $request->get('searchByYear') . ' AND MONTH(p.start) <= ' $request->get('searchByMonth2') . ' AND YEAR(p.start) <= ' $request->get('searchByYear2') . ' ' $sql_where ' ' $sql_search ' GROUP BY family 
  1261.             
  1262.             
  1263.             '
  1264.         )
  1265.             ->getResult();
  1266.         $months = ['01' => 'Januar''02' => 'Februar''03' => 'März''04' => 'April''05' => 'Mai''06' => 'Juni''07' => 'Juli''08' => 'August''09' => 'September''10' => 'Oktober''11' => 'November''12' => 'Dezember'];
  1267.         $output = [];
  1268.         foreach ($families as $family) {
  1269.             $Rechnungen $RechnungenRepository->findOneBy(['family' => $family['id'], 'month' => $family['m'], 'year' => $family['y']]);
  1270.             if (!is_null($Rechnungen)) {
  1271.                 if ((($request->get('ids') != '') && (in_array($Rechnungen->getId(), $request->get('ids')))) || ($request->get('ids') == '')) {
  1272.                     $jugendamt $JugendamtRepository->findOneBy(['family' => $family['id']]);
  1273.                     $output[] = [
  1274.                         'family' => $family['firstname'] . ' ' $family['lastname'],
  1275.                         'period' => $months[$family['m'] < 10 '0' $family['m'] : $family['m']] . ' ' $family['y'],
  1276.                         'total_km' => $family['total_km'],
  1277.                         'total_hours' => $family['total_hours'],
  1278.                         'steigend' => $family['total_km_price'] +  $family['total_price_hours'],
  1279.                         'id' => $family['id'],
  1280.                         'month' => $family['m'],
  1281.                         'year' => $family['y'],
  1282.                         'num' => substr($Rechnungen->getYear('Y'), -2) . str_pad($Rechnungen->getNum(), 30STR_PAD_LEFT),
  1283.                         'jugendamt' => $jugendamt,
  1284.                         'date_invoice' => date_format($Rechnungen->getCreatedAt(), 'd.m.Y'),
  1285.                     ];
  1286.                 }
  1287.             }
  1288.         }
  1289.         array_multisort(array_column($output'num'), SORT_ASC$output);
  1290.         $pdfOptions = new Options();
  1291.         //$pdfOptions->set('defaultFont', 'Arial');
  1292.         $pdfOptions->setIsRemoteEnabled(true);
  1293.         $pdfOptions->isHtml5ParserEnabled(true);
  1294.         // Instantiate Dompdf with our options
  1295.         $dompdf = new Dompdf($pdfOptions);
  1296.         $html $this->renderView('files/alle_rechnungen_pdf.html.twig', [
  1297.             'output' => $output,
  1298.             'family' => $family
  1299.         ]);
  1300.         // Load HTML to Dompdf
  1301.         $dompdf->loadHtml($html);
  1302.         // (Optional) Setup the paper size and orientation 'portrait' or 'portrait'
  1303.         $dompdf->setPaper('A4''portrait');
  1304.         // Render the HTML as PDF
  1305.         $dompdf->render();
  1306.         $output $dompdf->output();
  1307.         $dir $this->getParameter('uploads');
  1308.         $filename 'rechnung' time() . '.pdf';
  1309.         file_put_contents($dir $filename$output);
  1310.         try {
  1311.             if (($request->get('other') == '1') && ($request->get('other_destination') != '')) {
  1312.                 $email = (new TemplatedEmail())
  1313.                     ->from('Nizar Trabelsi <nizar.trabelsi@wep-erziehungshilfe.de>')
  1314.                     ->to($request->get('other_destination'))
  1315.                     ->cc('info@wep-erziehungshilfe.de')
  1316.                     ->attachFromPath($dir $filename)
  1317.                     ->subject('Rechnung')
  1318.                     ->htmlTemplate('email/rechnung.html.twig')
  1319.                     ->context([
  1320.                         'email_text' => $request->get('email_text'),
  1321.                     ]);
  1322.                 $contact = new Contact();
  1323.                 $contact->setEmail($request->get('other_destination'));
  1324.                 $this->em->persist($contact);
  1325.             } else {
  1326.                 $email = (new TemplatedEmail())
  1327.                     ->from('Nizar Trabelsi <nizar.trabelsi@wep-erziehungshilfe.de>')
  1328.                     ->to(...$request->get('destination'))
  1329.                     ->cc('info@wep-erziehungshilfe.de')
  1330.                     ->attachFromPath($dir $filename)
  1331.                     ->subject('Rechnung')
  1332.                     ->htmlTemplate('email/rechnung.html.twig')
  1333.                     ->context([
  1334.                         'email_text' => $request->get('email_text'),
  1335.                     ]);
  1336.             }
  1337.             $mailer->send($email);
  1338.             $filesystem->remove($dir $filename);
  1339.             foreach ($families as $family) {
  1340.                 $Rechnungen $RechnungenRepository->findOneBy(['family' => $family['id'], 'month' => $family['m'], 'year' => $family['y']]);
  1341.                 if (!is_null($Rechnungen)) {
  1342.                     if ((($request->get('ids') != '') && (in_array($Rechnungen->getId(), $request->get('ids')))) || ($request->get('ids') == '')) {
  1343.                         $Rechnungen->setSent(1);
  1344.                         $this->em->persist($Rechnungen);
  1345.                         $this->em->flush();
  1346.                     }
  1347.                 }
  1348.             }
  1349.             $this->em->flush();
  1350.             return new Response('OK');
  1351.         } catch (TransportExceptionInterface $e) {
  1352.             return new Response($e->getOriginalMessage());
  1353.         }
  1354.     }
  1355.     /**
  1356.      * @Route("/send/rechnungen_pdf", name="app_rechnungen_pdf_send", methods={"GET","POST"}, options={"expose"=true})
  1357.      */
  1358.     public function rechnungen_send(Request $requestMailerInterface $mailerContactRepository $contactRepositoryEntityManagerInterface $entityManagerJugendamtRepository $JugendamtRepositoryRechnungenRepository $RechnungenRepositoryFamilyRepository $FamilyRepository): Response
  1359.     {
  1360.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  1361.         if (!$this->security->isGranted('ROLE_ADMIN')) {
  1362.             return $this->redirectToRoute('app_logout');
  1363.         }
  1364.         if ((($request->get('other') != '1') && ($request->get('destination') == '')) || (($request->get('other') == '1') && ($request->get('other_destination') == ''))) {
  1365.             return new Response('KO');
  1366.         }
  1367.         $filesystem = new Filesystem();
  1368.         $sql_where '';
  1369.         $family null;
  1370.         if ($request->get('searchByFamily') != "") {
  1371.             $sql_where .= ' AND f.id = ' $request->get('searchByFamily');
  1372.             $family $FamilyRepository->find($request->get('searchByFamily'));
  1373.         }
  1374.         $sql_search '';
  1375.         /*if( $request->get('search')['value']!=""){
  1376.             $sql_where_glob_arr = [];
  1377.             foreach($columns as $column){
  1378.             $sql_where_glob_arr[] = ' '.$column.' LIKE \'%'.$request->get('search')['value'].'%\' ' ;
  1379.             }
  1380.             if(count($sql_where_glob_arr)>0){
  1381.                 $sql_search = ' AND ( '.implode(' OR ', $sql_where_glob_arr ).' ) ' ;
  1382.             }
  1383.         }*/
  1384.         $array_search = array();
  1385.         //->setParameter('nom', '%'.$request->get('searchByNom').'%')
  1386.         //p.nom LIKE :nom
  1387.         $hourPrice 55;
  1388.         if ($request->get('searchByYear') . $request->get('searchByMonth') >= 202308) {
  1389.             $hourPrice 70;
  1390.         }
  1391.         $families $entityManager->createQuery(
  1392.             'SELECT f.id as id , f.firstname , f.lastname, concat(f.id , MONTH(p.start) , YEAR(p.start)) as family , SUM(p.km) as total_km , SUM(p.km)*0.30 as total_km_price , SUM( ( TimestampDiff(SECOND ,p.start , p.end) / 3600 ) ) as total_hours , SUM( ( TimestampDiff(SECOND ,p.start , p.end) / 3600 ) ) * ' $hourPrice '  as total_price_hours , MONTH(p.start) as m , YEAR(p.start) as y
  1393.             FROM App\Entity\Calendar p
  1394.             JOIN p.family f
  1395.             
  1396.             WHERE 1=1 AND p.status = 2 AND MONTH(p.start) >= ' $request->get('searchByMonth') . ' AND YEAR(p.start) >= ' $request->get('searchByYear') . ' AND MONTH(p.start) <= ' $request->get('searchByMonth2') . ' AND YEAR(p.start) <= ' $request->get('searchByYear2') . ' ' $sql_where ' ' $sql_search ' GROUP BY family 
  1397.             
  1398.             
  1399.             '
  1400.         )
  1401.             ->getResult();
  1402.         $months = ['01' => 'Januar''02' => 'Februar''03' => 'März''04' => 'April''05' => 'Mai''06' => 'Juni''07' => 'Juli''08' => 'August''09' => 'September''10' => 'Oktober''11' => 'November''12' => 'Dezember'];
  1403.         $output = [];
  1404.         foreach ($families as $family) {
  1405.             $Rechnungen $RechnungenRepository->findOneBy(['family' => $family['id'], 'month' => $family['m'], 'year' => $family['y']]);
  1406.             if (!is_null($Rechnungen)) {
  1407.                 if ((($request->get('ids') != '') && (in_array($Rechnungen->getId(), $request->get('ids')))) || ($request->get('ids') == '')) {
  1408.                     $jugendamt $JugendamtRepository->findOneBy(['family' => $family['id']]);
  1409.                     $output[] = [
  1410.                         'family' => $family['firstname'] . ' ' $family['lastname'],
  1411.                         'period' => $months[$family['m'] < 10 '0' $family['m'] : $family['m']] . ' ' $family['y'],
  1412.                         'total_km' => $family['total_km'],
  1413.                         'total_hours' => $family['total_hours'],
  1414.                         'steigend' => $family['total_km_price'] +  $family['total_price_hours'],
  1415.                         'id' => $family['id'],
  1416.                         'month' => $family['m'],
  1417.                         'year' => $family['y'],
  1418.                         'num' => substr($Rechnungen->getYear('Y'), -2) . str_pad($Rechnungen->getNum(), 30STR_PAD_LEFT),
  1419.                         'jugendamt' => $jugendamt,
  1420.                         'date_invoice' => date_format($Rechnungen->getCreatedAt(), 'd.m.Y'),
  1421.                     ];
  1422.                 }
  1423.             }
  1424.         }
  1425.         array_multisort(array_column($output'num'), SORT_ASC$output);
  1426.         $pdfOptions = new Options();
  1427.         //$pdfOptions->set('defaultFont', 'Arial');
  1428.         $pdfOptions->setIsRemoteEnabled(true);
  1429.         $pdfOptions->isHtml5ParserEnabled(true);
  1430.         // Instantiate Dompdf with our options
  1431.         $dompdf = new Dompdf($pdfOptions);
  1432.         $html $this->renderView('files/rechnungen_pdf.html.twig', [
  1433.             'output' => $output,
  1434.             'family' => $family
  1435.         ]);
  1436.         // Load HTML to Dompdf
  1437.         $dompdf->loadHtml($html);
  1438.         // (Optional) Setup the paper size and orientation 'portrait' or 'portrait'
  1439.         $dompdf->setPaper('A4''portrait');
  1440.         // Render the HTML as PDF
  1441.         $dompdf->render();
  1442.         $output $dompdf->output();
  1443.         $dir $this->getParameter('uploads');
  1444.         $filename 'rechnung' time() . '.pdf';
  1445.         file_put_contents($dir $filename$output);
  1446.         try {
  1447.             if (($request->get('other') == '1') && ($request->get('other_destination') != '')) {
  1448.                 $email = (new TemplatedEmail())
  1449.                     ->from('Nizar Trabelsi <nizar.trabelsi@wep-erziehungshilfe.de>')
  1450.                     ->to($request->get('other_destination'))
  1451.                     ->cc('info@wep-erziehungshilfe.de')
  1452.                     ->attachFromPath($dir $filename)
  1453.                     ->subject('Rechnung')
  1454.                     ->htmlTemplate('email/rechnung.html.twig')
  1455.                     ->context([
  1456.                         'email_text' => $request->get('email_text'),
  1457.                     ]);
  1458.                 $existanceContact $contactRepository->findOneBy(['email' => $request->get('other_destination')]);
  1459.                 if (is_null($existanceContact)) {
  1460.                     $contact = new Contact();
  1461.                     $contact->setEmail($request->get('other_destination'));
  1462.                     $this->em->persist($contact);
  1463.                 }
  1464.             } else {
  1465.                 $email = (new TemplatedEmail())
  1466.                     ->from('Nizar Trabelsi <nizar.trabelsi@wep-erziehungshilfe.de>')
  1467.                     ->to(...$request->get('destination'))
  1468.                     ->cc('info@wep-erziehungshilfe.de')
  1469.                     ->attachFromPath($dir $filename)
  1470.                     ->subject('Rechnung')
  1471.                     ->htmlTemplate('email/rechnung.html.twig')
  1472.                     ->context([
  1473.                         'email_text' => $request->get('email_text'),
  1474.                     ]);
  1475.             }
  1476.             $mailer->send($email);
  1477.             $filesystem->remove($dir $filename);
  1478.             foreach ($families as $family) {
  1479.                 $Rechnungen $RechnungenRepository->findOneBy(['family' => $family['id'], 'month' => $family['m'], 'year' => $family['y']]);
  1480.                 if (!is_null($Rechnungen)) {
  1481.                     if ((($request->get('ids') != '') && (in_array($Rechnungen->getId(), $request->get('ids')))) || ($request->get('ids') == '')) {
  1482.                         $Rechnungen->setSent(1);
  1483.                         $this->em->persist($Rechnungen);
  1484.                         $this->em->flush();
  1485.                     }
  1486.                 }
  1487.             }
  1488.             $this->em->flush();
  1489.             return new Response('OK');
  1490.         } catch (TransportExceptionInterface $e) {
  1491.             return new Response($e->getOriginalMessage());
  1492.         }
  1493.     }
  1494.     /**
  1495.      * @Route("/export/alle_rechnungen_pdf", name="app_alle_rechnungen_pdf", methods={"GET","POST"}, options={"expose"=true})
  1496.      */
  1497.     public function alle_rechnungen_pdf(Request $requestEntityManagerInterface $entityManagerCalendarRepository $CalendarRepositoryJugendamtRepository $JugendamtRepositoryRechnungenRepository $RechnungenRepositoryFamilyRepository $FamilyRepository): Response
  1498.     {
  1499.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  1500.         if (!$this->security->isGranted('ROLE_ADMIN')) {
  1501.             return $this->redirectToRoute('app_logout');
  1502.         }
  1503.         $sql_where '';
  1504.         $family null;
  1505.         if ($request->get('searchByFamily') != "") {
  1506.             $sql_where .= ' AND f.id = ' $request->get('searchByFamily');
  1507.             $family $FamilyRepository->find($request->get('searchByFamily'));
  1508.         }
  1509.         $sql_search '';
  1510.         /*if( $request->get('search')['value']!=""){
  1511.             $sql_where_glob_arr = [];
  1512.             foreach($columns as $column){
  1513.             $sql_where_glob_arr[] = ' '.$column.' LIKE \'%'.$request->get('search')['value'].'%\' ' ;
  1514.             }
  1515.             if(count($sql_where_glob_arr)>0){
  1516.                 $sql_search = ' AND ( '.implode(' OR ', $sql_where_glob_arr ).' ) ' ;
  1517.             }
  1518.         }*/
  1519.         $array_search = array();
  1520.         //->setParameter('nom', '%'.$request->get('searchByNom').'%')
  1521.         //p.nom LIKE :nom
  1522.         $hourPrice 55;
  1523.         if ($request->get('searchByYear') . $request->get('searchByMonth') >= 202308) {
  1524.             $hourPrice 70;
  1525.         }
  1526.         $families $entityManager->createQuery(
  1527.             'SELECT f.id as id , f.firstname , f.lastname, concat(f.id , MONTH(p.start) , YEAR(p.start)) as family , SUM(p.km) as total_km , SUM(p.km)*0.30 as total_km_price , SUM( ( TimestampDiff(SECOND ,p.start , p.end) / 3600 ) ) as total_hours , SUM( ( TimestampDiff(SECOND ,p.start , p.end) / 3600 ) ) * ' $hourPrice '  as total_price_hours , MONTH(p.start) as m , YEAR(p.start) as y
  1528.             FROM App\Entity\Calendar p
  1529.             JOIN p.family f
  1530.             
  1531.             WHERE 1=1 AND p.status = 2 AND MONTH(p.start) >= ' $request->get('searchByMonth') . ' AND YEAR(p.start) >= ' $request->get('searchByYear') . ' AND MONTH(p.start) <= ' $request->get('searchByMonth2') . ' AND YEAR(p.start) <= ' $request->get('searchByYear2') . ' ' $sql_where ' ' $sql_search ' GROUP BY family 
  1532.             
  1533.             
  1534.             '
  1535.         )
  1536.             ->getResult();
  1537.         $months = ['01' => 'Januar''02' => 'Februar''03' => 'März''04' => 'April''05' => 'Mai''06' => 'Juni''07' => 'Juli''08' => 'August''09' => 'September''10' => 'Oktober''11' => 'November''12' => 'Dezember'];
  1538.         $output = [];
  1539.         foreach ($families as $family) {
  1540.             $Rechnungen $RechnungenRepository->findOneBy(['family' => $family['id'], 'month' => $family['m'], 'year' => $family['y']]);
  1541.             if (!is_null($Rechnungen)) {
  1542.                 if ((($request->get('ids') != '') && (in_array($Rechnungen->getId(), $request->get('ids')))) || ($request->get('ids') == '')) {
  1543.                     $mois $family['m'] < 10 '0' $family['m'] : $family['m'];
  1544.                     $annee $family['y'];
  1545.                     $start $annee.'-'.$mois.'-01 00:00:00';
  1546.                     $end date("Y-m-t"strtotime($annee.'-'.$mois.'-01')).' 00:00:00';
  1547.                     $jugendamt $JugendamtRepository->findOneBy(['family' => $family['id']]);
  1548.                     $calendars $entityManager->createQuery(
  1549.                         'SELECT p
  1550.                         FROM App\Entity\Calendar p
  1551.                         JOIN p.family f
  1552.                         
  1553.                         WHERE 1=1 AND f.id='.$family['id'].' AND p.status = 2 AND p.start >= \'' $start '\' AND p.end <= \'' $end '\' 
  1554.                         
  1555.                         
  1556.                         '
  1557.                     )
  1558.                         ->getResult();
  1559.                     
  1560.                     $output[] = [
  1561.                         'family' => $family['firstname'] . ' ' $family['lastname'],
  1562.                         'period' => $months[$family['m'] < 10 '0' $family['m'] : $family['m']] . ' ' $family['y'],
  1563.                         'total_km' => $family['total_km'],
  1564.                         'total_hours' => $family['total_hours'],
  1565.                         'steigend' => $family['total_km_price'] +  $family['total_price_hours'],
  1566.                         'id' => $family['id'],
  1567.                         'month' => $family['m'],
  1568.                         'year' => $family['y'],
  1569.                         'num' => substr($Rechnungen->getYear('Y'), -2) . str_pad($Rechnungen->getNum(), 30STR_PAD_LEFT),
  1570.                         'jugendamt' => $jugendamt,
  1571.                         'date_invoice' => date_format($Rechnungen->getCreatedAt(), 'd.m.Y'),
  1572.                         'calendars'=>$calendars
  1573.                     ];
  1574.                 }
  1575.             }
  1576.         }
  1577.         array_multisort(array_column($output'num'), SORT_ASC$output);
  1578.         $pdfOptions = new Options();
  1579.         //$pdfOptions->set('defaultFont', 'Arial');
  1580.         $pdfOptions->setIsRemoteEnabled(true);
  1581.         $pdfOptions->isHtml5ParserEnabled(true);
  1582.         // Instantiate Dompdf with our options
  1583.         $dompdf = new Dompdf($pdfOptions);
  1584.         $html $this->renderView('files/alle_rechnungen_pdf.html.twig', [
  1585.             'output' => $output,
  1586.             'family' => $family
  1587.         ]);
  1588.         // Load HTML to Dompdf
  1589.         $dompdf->loadHtml($html);
  1590.         // (Optional) Setup the paper size and orientation 'portrait' or 'portrait'
  1591.         $dompdf->setPaper('A4''portrait');
  1592.         // Render the HTML as PDF
  1593.         $dompdf->render();
  1594.         $dompdf->stream("mypdf.pdf", [
  1595.             "Attachment" => false
  1596.         ]);
  1597.     }
  1598.     /**
  1599.      * @Route("/export/rechnungen_table_pdf", name="app_rechnungen_table_pdf", methods={"GET","POST"}, options={"expose"=true})
  1600.      */
  1601.     public function rechnungen_table_pdf(Request $requestEntityManagerInterface $entityManagerRechnungenRepository $RechnungenRepositoryFamilyRepository $FamilyRepository): Response
  1602.     {
  1603.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  1604.         if (!$this->security->isGranted('ROLE_ADMIN')) {
  1605.             return $this->redirectToRoute('app_logout');
  1606.         }
  1607.         $sql_where '';
  1608.         $family null;
  1609.         if ($request->get('searchByFamily') != "") {
  1610.             $sql_where .= ' AND f.id = ' $request->get('searchByFamily');
  1611.             $family $FamilyRepository->find($request->get('searchByFamily'));
  1612.         }
  1613.         $sql_search '';
  1614.         /*if( $request->get('search')['value']!=""){
  1615.             $sql_where_glob_arr = [];
  1616.             foreach($columns as $column){
  1617.             $sql_where_glob_arr[] = ' '.$column.' LIKE \'%'.$request->get('search')['value'].'%\' ' ;
  1618.             }
  1619.             if(count($sql_where_glob_arr)>0){
  1620.                 $sql_search = ' AND ( '.implode(' OR ', $sql_where_glob_arr ).' ) ' ;
  1621.             }
  1622.         }*/
  1623.         $array_search = array();
  1624.         $hourPrice 55;
  1625.         if ($request->get('searchByYear') . $request->get('searchByMonth') >= 202308) {
  1626.             $hourPrice 70;
  1627.         }
  1628.         //->setParameter('nom', '%'.$request->get('searchByNom').'%')
  1629.         //p.nom LIKE :nom
  1630.         $families $entityManager->createQuery(
  1631.             'SELECT f.id as id , f.firstname , f.lastname , concat(f.id , MONTH(p.start) , YEAR(p.start)) as family , SUM(p.km)*0.30 as total_km_price , SUM( ( TimestampDiff(SECOND ,p.start , p.end) / 3600 ) ) * ' $hourPrice '  as total_price_hours , MONTH(p.start) as m , YEAR(p.start) as y
  1632.             FROM App\Entity\Calendar p
  1633.             JOIN p.family f
  1634.             
  1635.             WHERE 1=1 AND p.status = 2 AND MONTH(p.start) >= ' $request->get('searchByMonth') . ' AND YEAR(p.start) >= ' $request->get('searchByYear') . ' AND MONTH(p.start) <= ' $request->get('searchByMonth2') . ' AND YEAR(p.start) <= ' $request->get('searchByYear2') . ' ' $sql_where ' ' $sql_search ' GROUP BY family 
  1636.             
  1637.             
  1638.             '
  1639.         )
  1640.             ->getResult();
  1641.         $months = ['01' => 'Januar''02' => 'Februar''03' => 'März''04' => 'April''05' => 'Mai''06' => 'Juni''07' => 'Juli''08' => 'August''09' => 'September''10' => 'Oktober''11' => 'November''12' => 'Dezember'];
  1642.         $output = [];
  1643.         foreach ($families as $family) {
  1644.             $Rechnungen $RechnungenRepository->findOneBy(['family' => $family['id'], 'month' => $family['m'], 'year' => $family['y']]);
  1645.             $output[] = [
  1646.                 'family' => $family['firstname'] . ' ' $family['lastname'],
  1647.                 'period' => $months[$family['m'] < 10 '0' $family['m'] : $family['m']] . ' ' $family['y'],
  1648.                 'rechnung' => '',
  1649.                 'steigend' => $family['total_km_price'] +  $family['total_price_hours'],
  1650.                 'id' => $family['id'],
  1651.                 'month' => $family['m'],
  1652.                 'year' => $family['y'],
  1653.                 'token' => $this->tokenManager->getToken('rechnung' $family['id'])->getValue(),
  1654.                 'file' => $Rechnungen != null '/uploads/docs_family/' sha1($family['id']) . '/Rechnung-' $Rechnungen->getNum() . '.pdf' ''
  1655.             ];
  1656.         }
  1657.         $pdfOptions = new Options();
  1658.         //$pdfOptions->set('defaultFont', 'Arial');
  1659.         $pdfOptions->setIsRemoteEnabled(true);
  1660.         $pdfOptions->isHtml5ParserEnabled(true);
  1661.         // Instantiate Dompdf with our options
  1662.         $dompdf = new Dompdf($pdfOptions);
  1663.         $html $this->renderView('files/rechnungen_pdf.html.twig', [
  1664.             'output' => $output,
  1665.             'family' => $family,
  1666.         ]);
  1667.         // Load HTML to Dompdf
  1668.         $dompdf->loadHtml($html);
  1669.         // (Optional) Setup the paper size and orientation 'portrait' or 'portrait'
  1670.         $dompdf->setPaper('A4''portrait');
  1671.         // Render the HTML as PDF
  1672.         $dompdf->render();
  1673.         $dompdf->stream("mypdf.pdf", [
  1674.             "Attachment" => false
  1675.         ]);
  1676.     }
  1677.     /**
  1678.      * @Route("/vordruck_tabelle_rechnungen", name="app_vordruck_tabelle_rechnungen_index", methods={"GET"})
  1679.      */
  1680.     public function index_vordruck_tabelle_rechnungen(CalendarRepository $CalendarRepositoryContactRepository $contactRepositoryFamilyRepository $FamilyRepository): Response
  1681.     {
  1682.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  1683.         if (!$this->security->isGranted('ROLE_ADMIN')) {
  1684.             return $this->redirectToRoute('app_logout');
  1685.         }
  1686.         $families $FamilyRepository->findAll();
  1687.         $contacts $contactRepository->findAll();
  1688.         return $this->render('family/index_vordruck_tabelle_rechnungen.html.twig', [
  1689.             'calendars' => $CalendarRepository->findAll(),
  1690.             'families' => $families,
  1691.             'contacts' => $contacts
  1692.         ]);
  1693.     }
  1694.     /**
  1695.      * @Route("/alle_rechnungen", name="app_alle_rechnungen_index", methods={"GET"})
  1696.      */
  1697.     public function alle_rechnungen(EntityManagerInterface $entityManagerCalendarRepository $CalendarRepositoryFamilyRepository $FamilyRepositoryContactRepository $contactRepository): Response
  1698.     {
  1699.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  1700.         if (!$this->security->isGranted('ROLE_ADMIN')) {
  1701.             return $this->redirectToRoute('app_logout');
  1702.         }
  1703.         $families $FamilyRepository->findAll();
  1704.         $contacts $contactRepository->findAll();
  1705.         $cities $entityManager->createQuery(
  1706.             'SELECT j
  1707.             FROM App\Entity\Jugendamt j
  1708.             WHERE j.stadt != \'\'
  1709.             GROUP BY j.stadt  
  1710.             '
  1711.         )
  1712.         ->getResult(); 
  1713.         return $this->render('family/alle_rechnungen.html.twig', [
  1714.             'calendars' => $CalendarRepository->findAll(),
  1715.             'families' => $families,
  1716.             'contacts' => $contacts,
  1717.             'cities' => $cities
  1718.         ]);
  1719.     }
  1720.     /**
  1721.      * @Route("/serverRechnungen", name="serverRechnungen", methods={"GET"} , options = {"expose" = true } )
  1722.      */
  1723.     public function serverRechnungen(Request $requestEntityManagerInterface $entityManagerJugendamtRepository $JugendamtRepositoryRechnungenRepository $RechnungenRepository): Response
  1724.     {
  1725.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  1726.         $sql_where '';
  1727.         if ($request->get('searchByFamily') != "") {
  1728.             $sql_where .= ' AND f.id = ' $request->get('searchByFamily');
  1729.         }
  1730.         $columns = ['f.id''concat_ws(\'\',MONTH(r.month) , YEAR(r.year))''r.reference''r.id''r.id'];
  1731.         $sql_search '';
  1732.         if ($request->get('search')['value'] != "") {
  1733.             $sql_where_glob_arr = [];
  1734.             foreach ($columns as $column) {
  1735.                 $sql_where_glob_arr[] = ' ' $column ' LIKE \'%' $request->get('search')['value'] . '%\' ';
  1736.             }
  1737.             if (count($sql_where_glob_arr) > 0) {
  1738.                 $sql_search ' AND ( ' implode(' OR '$sql_where_glob_arr) . ' ) ';
  1739.             }
  1740.         }
  1741.         
  1742.         
  1743.         $orders = [];
  1744.         for ($i 0$i count($request->get('order')); $i++) {
  1745.             $orders[] = $columns[$request->get('order')[$i]['column']] . ' ' $request->get('order')[$i]['dir'];
  1746.         }
  1747.         if (count($orders) > 0) {
  1748.             $order " ORDER BY " implode(' , '$orders);
  1749.         } else {
  1750.             $order "";
  1751.         }
  1752.         $hourPrice 55;
  1753.         if ($request->get('searchByYear') . $request->get('searchByMonth') >= 202308) {
  1754.             $hourPrice 70;
  1755.         }
  1756.         /*$existance = $entityManager->createQuery(
  1757.             'SELECT f.id as id , f.firstname , f.lastname , concat(f.id , MONTH(p.start) , YEAR(p.start)) as family , SUM(p.km)*0.30 as total_km_price , SUM( ( TimestampDiff(SECOND ,p.start , p.end) / 3600 ) ) * ' . $hourPrice . '  as total_price_hours , MONTH(p.start) as m , YEAR(p.start) as y
  1758.             FROM App\Entity\Calendar p
  1759.             JOIN p.family f
  1760.             
  1761.             WHERE 1=1 AND p.status = 2 AND MONTH(p.start) >= ' . $request->get('searchByMonth') . ' AND YEAR(p.start) >= ' . $request->get('searchByYear') . ' AND MONTH(p.start) <= ' . $request->get('searchByMonth2') . ' AND YEAR(p.start) <= ' . $request->get('searchByYear2') . ' ' . $sql_where . ' ' . $sql_search . ' GROUP BY family ' . $order . '
  1762.             
  1763.             '
  1764.         )
  1765.             ->getResult();*/
  1766.         $existance $entityManager->createQuery(
  1767.             'SELECT count(r.id) as nbr, SUM(r.total_amount) as total_amount
  1768.             FROM App\Entity\Rechnungen r
  1769.             JOIN r.family f
  1770.             
  1771.             WHERE 1=1 AND CONCAT(r.year,LPAD(r.month, 2, \'0\')) >= :start AND CONCAT(r.year,LPAD(r.month, 2, \'0\')) <= :end ' $sql_where ' ' $sql_search ' ' $order '
  1772.             
  1773.             '
  1774.         )
  1775.         ->setParameter('start'$request->get('searchByYear').str_pad($request->get('searchByMonth'), 2'0'STR_PAD_LEFT))
  1776.         ->setParameter('end'$request->get('searchByYear2').str_pad($request->get('searchByMonth2'), 2'0'STR_PAD_LEFT))
  1777.         ->getOneOrNullResult();
  1778.         $I_nbResultatsTotal $existance['nbr'];
  1779.         $limit =  $request->get('length');
  1780.         $offset $request->get('start');
  1781.         $array_search = array();
  1782.         //->setParameter('nom', '%'.$request->get('searchByNom').'%')
  1783.         //p.nom LIKE :nom
  1784.         $hourPrice 55;
  1785.         if ($request->get('searchByYear') . $request->get('searchByMonth') >= 202308) {
  1786.             $hourPrice 70;
  1787.         }
  1788.         /*$families = $entityManager->createQuery(
  1789.             'SELECT f.clearing as clearing, f.id as id , f.status as status , concat_ws(\' \',f.firstname , f.lastname) as familien , ( SELECT r.reference  FROM App\Entity\Rechnungen r JOIN r.family rf WHERE rf.id = f.id AND r.month = MONTH(p.start) AND r.year = YEAR(p.start)  ) as num , concat(f.id , MONTH(p.start) , YEAR(p.start)) as family , SUM(p.km)*0.30 as total_km_price , SUM( ( TimestampDiff(SECOND ,p.start , p.end) / 3600 ) ) * ' . $hourPrice . '  as total_price_hours , ((SUM(p.km)*0.30)+(SUM( ( TimestampDiff(SECOND ,p.start , p.end) / 3600 ) ) * ' . $hourPrice . ')) as bertrag , concat_ws(\'\',MONTH(p.start) , YEAR(p.start)) as month_year ,MONTH(p.start) as m , YEAR(p.start) as y
  1790.             FROM App\Entity\Calendar p
  1791.             JOIN p.family f
  1792.             
  1793.             WHERE 1=1 AND p.status = 2 AND DATE_FORMAT(p.start,\'%Y-%m\') >= \'' . $request->get('searchByYear') . '-' . $request->get('searchByMonth') . '\' AND DATE_FORMAT(p.start,\'%Y-%m\') <= \'' . $request->get('searchByYear2') . '-' . $request->get('searchByMonth2') . '\'  ' . $sql_where . ' ' . $sql_search . ' GROUP BY family ' . $order . '
  1794.             
  1795.             
  1796.             '
  1797.         )
  1798.             ->setMaxResults($limit)
  1799.             ->setFirstResult($offset)
  1800.             ->getResult();*/
  1801.         $invoices $entityManager->createQuery(
  1802.             'SELECT r
  1803.             FROM App\Entity\Rechnungen r
  1804.             JOIN r.family f
  1805.             
  1806.             WHERE 1=1 AND CONCAT(r.year,LPAD(r.month, 2, \'0\')) >= :start AND CONCAT(r.year,LPAD(r.month, 2, \'0\')) <= :end ' $sql_where ' ' $sql_search ' ' $order '            
  1807.             '
  1808.         )
  1809.             ->setParameter('start'$request->get('searchByYear').str_pad($request->get('searchByMonth'), 2'0'STR_PAD_LEFT))
  1810.             ->setParameter('end'$request->get('searchByYear2').str_pad($request->get('searchByMonth2'), 2'0'STR_PAD_LEFT))
  1811.             ->setMaxResults($limit)
  1812.             ->setFirstResult($offset)
  1813.             ->getResult();
  1814.         
  1815.         $months = ['1' => 'Januar''2' => 'Februar''3' => 'März''4' => 'April''5' => 'Mai''6' => 'Juni''7' => 'Juli''8' => 'August''9' => 'September''10' => 'Oktober''11' => 'November''12' => 'Dezember'];
  1816.         $output = [];
  1817.         foreach ($invoices as $invoice) {
  1818.             $family $invoice->getFamily();
  1819.             $dateCalcul = new DateTime($invoice->getYear().'-'.$invoice->getMonth().'-01');
  1820.             $dateCalcul->modify('last day of this month');
  1821.             $dateEnd $dateCalcul->format('Y-m-d 23:59:59');
  1822.             $calendars $this->em->createQuery(
  1823.             'SELECT p
  1824.             FROM App\Entity\Calendar p
  1825.             
  1826.             WHERE 1=1 AND p.status = 2 AND p.family = '.$family->getId().' AND p.start >= \''.$invoice->getYear().'-'.$invoice->getMonth().'-01 00:00:00\' AND p.end <= \''.$dateEnd.'\'
  1827.             
  1828.             
  1829.             '
  1830.             )
  1831.             ->getResult() ;
  1832.             $totalHours 0;
  1833.             foreach($calendars as $calendar){
  1834.                 $t1 strtotimedate_format($calendar->getEnd(),'Y-m-d H:i:s')  );
  1835.                 $t2 strtotimedate_format($calendar->getStart(),'Y-m-d H:i:s') );
  1836.                 $diff $t1 $t2;
  1837.                 $hours $diff / ( 60 60 );
  1838.                 $totalHours += $hours;
  1839.             }
  1840.             
  1841.             if($invoice->getHours() == null) {
  1842.             $invoice->setHours(round($totalHours,2));
  1843.             $entityManager->flush();
  1844.             }
  1845.                 
  1846.             if($invoice->getFileName() == ''){
  1847.                 $folderPath $this->getParameter('docs_family') . '/' sha1($family->getId());
  1848.                 $oldPath $folderPath '/Rechnung-' $invoice->getReference() . '.pdf';
  1849.                 $newFileName 'Rechnung ' .
  1850.                 $invoice->getReference() . '-' .
  1851.                 $family->getFullName() . '-' .
  1852.                 $invoice->getMonth() . '-' .
  1853.                 substr($invoice->getYear(), 22) . '.pdf';
  1854.                 $newPath $folderPath '/' $newFileName;
  1855.                 if (file_exists($oldPath)) {
  1856.                     rename($oldPath$newPath);
  1857.                 }
  1858.                 $invoice->setFileName($newFileName);
  1859.                 $this->em->flush();
  1860.             }
  1861.             $file '/uploads/docs_family/' sha1($family->getId()) . '/' $invoice->getFileName();
  1862.             
  1863.             $output[] = [
  1864.                 'id_rechnung' => $invoice != null $invoice->getId() : null,
  1865.                 'familyId' => $family->getId(),
  1866.                 'family' => $family->getFullName() . ($family->getStatus() === ' (Archive)' ''),
  1867.                 'period' => $months[$invoice->getMonth()] . ' ' $invoice->getYear(),
  1868.                 'stunden' => isset($family->getJugendamts()[0]) ? $family->getJugendamts()[0]->getStunden() : '' ,
  1869.                 'current_hours' => $invoice->getHours(),
  1870.                 'rechnung' => $invoice->getReference(),
  1871.                 'steigend' => $invoice->getTotalAmount(),
  1872.                 'id' => $invoice->getId(),
  1873.                 'month' => $invoice->getMonth(),
  1874.                 'year' => $invoice->getYear(),
  1875.                 'token' => $this->tokenManager->getToken('rechnung' $family->getId())->getValue(),
  1876.                 'file' => $file
  1877.             ];
  1878.         }
  1879.         $total $existance['total_amount'];
  1880.         $JSON json_encode($output);
  1881.         $JSON '{"draw": ' $request->get('draw') . ',"recordsTotal":' $I_nbResultatsTotal ',"recordsFiltered":' $I_nbResultatsTotal ',"total":"' $total '","data":' $JSON '}';
  1882.         $response   = new Response($JSON200, ['Content-Type' => 'application/json']);
  1883.         return $response;
  1884.     }
  1885.     /**
  1886.      * @Route("/serverAlleRechnungen", name="serverAlleRechnungen", methods={"GET"} , options = {"expose" = true } )
  1887.      */
  1888.     public function serverAlleRechnungen(Request $requestEntityManagerInterface $entityManagerFamilyRepository $FamilyRepositoryJugendamtRepository $JugendamtRepositoryRechnungenRepository $RechnungenRepository): Response
  1889.     {
  1890.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  1891.         $sql_where '';
  1892.         if ($request->get('searchByFamily') != "") {
  1893.             $sql_where .= ' AND f.id = ' $request->get('searchByFamily');
  1894.         }
  1895.         if ($request->get('searchByPaid') != "") {
  1896.             $sql_where .= ' AND r.paid = ' $request->get('searchByPaid');
  1897.         }
  1898.         if ($request->get('searchByCity') != "") {
  1899.             $sql_where .= " AND j.stadt = '" $request->get('searchByCity')."'";
  1900.         }
  1901.         if ($request->get('searchByPaidYear') != "") {
  1902.             $sql_where .= " AND r.paidAt >= '" $request->get('searchByPaidYear') ."-01-01' AND r.paidAt <= '" $request->get('searchByPaidYear') ."-12-31' ";
  1903.         }
  1904.         
  1905.         $columns = ['r.id''concat_ws(\' \',f.firstname , f.lastname)''concat_ws(\'\', Substring(r.year, 3 , 2) , LPAD(r.num, 3, 0) )''r.reference''r.paid'];
  1906.         $numArr = [];
  1907.         $sql_search '';
  1908.         if ($request->get('search')['value'] != "") {
  1909.             $sql_where_glob_arr = [];
  1910.             foreach ($columns as $column) {
  1911.                 $sql_where_glob_arr[] = ' ' $column ' LIKE \'%' $request->get('search')['value'] . '%\' ';
  1912.             }
  1913.             if (count($sql_where_glob_arr) > 0) {
  1914.                 $sql_search ' AND ( ' implode(' OR '$sql_where_glob_arr) . ' ) ';
  1915.             }
  1916.         }
  1917.         $orders = [];
  1918.         for ($i 0$i count($request->get('order')); $i++) {
  1919.             $orders[] = $columns[$request->get('order')[$i]['column']] . ' ' $request->get('order')[$i]['dir'];
  1920.         }
  1921.         if (count($orders) > 0) {
  1922.             $order " ORDER BY " implode(' , '$orders);
  1923.         } else {
  1924.             $order "";
  1925.         }
  1926.         $existance $entityManager->createQuery(
  1927.             'SELECT count(r.id) as nbr
  1928.             FROM App\Entity\Rechnungen r
  1929.             JOIN r.family f
  1930.             LEFT JOIN f.jugendamts j
  1931.             WHERE 1=1 AND CONCAT(r.year,LPAD(r.month, 2, \'0\')) >= :start AND CONCAT(r.year,LPAD(r.month, 2, \'0\')) <= :end  ' $sql_search ' ' $sql_where ' ' $order '
  1932.             
  1933.             
  1934.             '
  1935.         )
  1936.         ->setParameter('start'$request->get('searchByYear').str_pad($request->get('searchByMonth'), 2'0'STR_PAD_LEFT))
  1937.         ->setParameter('end'$request->get('searchByYear2').str_pad($request->get('searchByMonth2'), 2'0'STR_PAD_LEFT))
  1938.         ->getOneOrNullResult();
  1939.         $I_nbResultatsTotal = !is_null($existance) ? $existance['nbr'] : 0;
  1940.         $limit =  $request->get('length');
  1941.         $offset $request->get('start');
  1942.         $array_search = array();
  1943.         //->setParameter('nom', '%'.$request->get('searchByNom').'%')
  1944.         //p.nom LIKE :nom
  1945.         $families $entityManager->createQuery(
  1946.             'SELECT f.clearing as clearing, f.id as id, f.status as status , concat_ws(\' \',f.firstname , f.lastname) as familien , concat_ws(\'\', Substring(r.year, 3 , 2) , LPAD(r.num, 3, 0) ) as numrr, r.total_amount , concat_ws(\'-\', LPAD(r.month, 2, 0) , r.year) as month_year, concat_ws(\'-\', r.year, LPAD(r.month, 2, 0)) as year_month ,r.month as m , r.year as y, r.paid as paid
  1947.             FROM App\Entity\Rechnungen r
  1948.             JOIN r.family f
  1949.             LEFT JOIN f.jugendamts j
  1950.             WHERE 1=1 AND CONCAT(r.year,LPAD(r.month, 2, \'0\')) >= :start AND CONCAT(r.year,LPAD(r.month, 2, \'0\')) <= :end ' $sql_search ' ' $sql_where ' GROUP BY r.reference ' $order '            
  1951.             '
  1952.         )
  1953.         ->setParameter('start'$request->get('searchByYear').str_pad($request->get('searchByMonth'), 2'0'STR_PAD_LEFT))
  1954.         ->setParameter('end'$request->get('searchByYear2').str_pad($request->get('searchByMonth2'), 2'0'STR_PAD_LEFT))
  1955.         ->setMaxResults($limit)
  1956.         ->setFirstResult($offset)
  1957.         ->getResult();
  1958.         $totalAmounts $entityManager->createQuery(
  1959.             'SELECT f.id as id , r.paid , concat_ws(\' \',f.firstname , f.lastname) as familien , concat_ws(\'\', Substring(r.year, 3 , 2) , LPAD(r.num, 3, 0) ) as numrr, r.total_amount , concat_ws(\'-\', r.month , r.year) as month_year, concat_ws(\'-\', r.year, LPAD(r.month, 2, 0)) as year_month ,r.month as m , r.year as y
  1960.             FROM App\Entity\Rechnungen r
  1961.             JOIN r.family f
  1962.             LEFT JOIN f.jugendamts j
  1963.             WHERE 1=1 AND CONCAT(r.year,LPAD(r.month, 2, \'0\')) >= :start AND CONCAT(r.year,LPAD(r.month, 2, \'0\')) <= :end ' $sql_search ' ' $sql_where ' ' $order '            
  1964.             '
  1965.         )
  1966.         ->setParameter('start'$request->get('searchByYear').str_pad($request->get('searchByMonth'), 2'0'STR_PAD_LEFT))
  1967.         ->setParameter('end'$request->get('searchByYear2').str_pad($request->get('searchByMonth2'), 2'0'STR_PAD_LEFT))
  1968.         
  1969.         ->getResult();
  1970.         $total 0;
  1971.         $total_paid 0;
  1972.         foreach ($totalAmounts as $totalAmount) {
  1973.             $m $totalAmount['m'] < 10 '0' $totalAmount['m'] : $totalAmount['m'];
  1974.             $hourPrice 55;
  1975.             if ($totalAmount['y'] . $m >= 202308) {
  1976.                 $hourPrice 70;
  1977.             }
  1978.             $RechNotConfirmed $entityManager->createQuery(
  1979.                 'SELECT  concat(f.id , MONTH(p.start) , YEAR(p.start)) as family , SUM(p.km)*0.30 as total_km_price , SUM( ( TimestampDiff(SECOND ,p.start , p.end) / 3600 ) ) * ' $hourPrice '  as total_price_hours , ((SUM(p.km)*0.30)+(SUM( ( TimestampDiff(SECOND ,p.start , p.end) / 3600 ) ) * ' $hourPrice ')) as bertrag , concat_ws(\'\',MONTH(p.start) , YEAR(p.start)) as month_year ,MONTH(p.start) as m , YEAR(p.start) as y
  1980.                 FROM App\Entity\Calendar p
  1981.                 JOIN p.family f
  1982.                 
  1983.                 WHERE 1=1 AND f.id = ' $totalAmount['id'] . ' AND p.status = 2 AND DATE_FORMAT(p.start,\'%Y-%m\') = \'' $totalAmount['y'] . '-' $m '\' 
  1984.                 
  1985.                 
  1986.                 '
  1987.             )
  1988.                 ->getOneOrNullResult();
  1989.             if ($totalAmount['total_amount'] != '') {
  1990.                 $total += $totalAmount['total_amount'];
  1991.             } else {
  1992.                 $total += $RechNotConfirmed['total_price_hours'] + $RechNotConfirmed['total_km_price'];
  1993.             }
  1994.             if ($totalAmount['paid'] == '1') {
  1995.                 $total_paid += $totalAmount['total_amount'];
  1996.             }
  1997.         }
  1998.         $months = ['01' => 'Januar''02' => 'Februar''03' => 'März''04' => 'April''05' => 'Mai''06' => 'Juni''07' => 'Juli''08' => 'August''09' => 'September''10' => 'Oktober''11' => 'November''12' => 'Dezember'];
  1999.         $output = [];
  2000.         foreach ($families as $family) {
  2001.             $currentFamily $FamilyRepository->find($family['id']);
  2002.             $m $family['m'] < 10 '0' $family['m'] : $family['m'];
  2003.             $hourPrice 55;
  2004.             if ($family['y'] . $m >= 202308) {
  2005.                 $hourPrice 70;
  2006.             }
  2007.             $RechnungenNotConfirmed $entityManager->createQuery(
  2008.                 'SELECT concat(f.id , MONTH(p.start) , YEAR(p.start)) as family , SUM(p.km)*0.30 as total_km_price , SUM( ( TimestampDiff(SECOND ,p.start , p.end) / 3600 ) ) * ' $hourPrice '  as total_price_hours , ((SUM(p.km)*0.30)+(SUM( ( TimestampDiff(SECOND ,p.start , p.end) / 3600 ) ) * ' $hourPrice ')) as bertrag , concat_ws(\'\',MONTH(p.start) , YEAR(p.start)) as month_year ,MONTH(p.start) as m , YEAR(p.start) as y
  2009.                 FROM App\Entity\Calendar p
  2010.                 JOIN p.family f
  2011.                 
  2012.                 WHERE 1=1 AND f.id = ' $family['id'] . ' AND p.status = 2 AND DATE_FORMAT(p.start,\'%Y-%m\') = \'' $family['y'] . '-' $m '\' 
  2013.                 
  2014.                 
  2015.                 '
  2016.             )
  2017.                 ->getOneOrNullResult();
  2018.             $Rechnungen $RechnungenRepository->findOneBy(['family' => $family['id'], 'month' => $family['m'], 'year' => $family['y']]);
  2019.             if($Rechnungen->getFileName() == ''){
  2020.                 $folderPath $this->getParameter('docs_family') . '/' sha1($currentFamily->getId());
  2021.                 $oldPath $folderPath '/Rechnung-' $Rechnungen->getReference() . '.pdf';
  2022.                 $newFileName 'Rechnung ' .
  2023.                 $Rechnungen->getReference() . '-' .
  2024.                 $currentFamily->getFullName() . '-' .
  2025.                 $Rechnungen->getMonth() . '-' .
  2026.                 substr($Rechnungen->getYear(), 22) . '.pdf';
  2027.                 $newPath $folderPath '/' $newFileName;
  2028.                 if (file_exists($oldPath)) {
  2029.                     rename($oldPath$newPath);
  2030.                 }
  2031.                 $Rechnungen->setFileName($newFileName);
  2032.                 $this->em->flush();
  2033.             }
  2034.             $file '/uploads/docs_family/' sha1($currentFamily->getId()) . '/' $Rechnungen->getFileName();
  2035.             $jugendamt $JugendamtRepository->findOneBy(['family' => $family['id']]);
  2036.             $output[] = [
  2037.                 'id_rechnung' => $Rechnungen != null $Rechnungen->getId() : null,
  2038.                 'family' => $family['familien'] . ($family['status'] == ' (Archive)' ''),
  2039.                 'period' => $months[str_pad($family['m'], 2'0'STR_PAD_LEFT)] . ' ' $family['y'],
  2040.                 'stadt' => $jugendamt !== null $jugendamt->getStadt() : '',
  2041.                 'rechnung' => $family['numrr'],
  2042.                 //'steigend'=> ,
  2043.                 'steigend' => $family['clearing'] == && !is_null($Rechnungen) ? $Rechnungen->getTotalAmount() : $RechnungenNotConfirmed['total_price_hours'] + $RechnungenNotConfirmed['total_km_price'],
  2044.                 'id' => $family['id'],
  2045.                 'month' => $family['m'],
  2046.                 'year' => $family['y'],
  2047.                 'token' => $this->tokenManager->getToken('rechnung' $family['id'])->getValue(),
  2048.                 'file' => $file,
  2049.                 'sent' => $Rechnungen->getSent() ?? 0,
  2050.                 'paid' => $Rechnungen->getPaid(),
  2051.                 'paid_at' => $Rechnungen->getPaidAt() !== null date_format($Rechnungen->getPaidAt(),'d.m.Y') : ''
  2052.             ];
  2053.         }
  2054.         $total_unpaid $total $total_paid;
  2055.         $JSON json_encode($output);
  2056.         $JSON '{"draw": ' $request->get('draw') . ',"recordsTotal":' $I_nbResultatsTotal ',"recordsFiltered":' $I_nbResultatsTotal ',"total_unpaid":"' number_format($total_unpaid2'.'' ') . '","total_paid":"' number_format($total_paid2'.'' ') . '","total":"' number_format($total2'.'' ') . '","data":' $JSON '}';
  2057.         $response   = new Response($JSON200, ['Content-Type' => 'application/json']);
  2058.         return $response;
  2059.     }
  2060.     /**
  2061.      * @Route("/invoices/pending", name="app_invoice_pending_index", methods={"GET"})
  2062.      */
  2063.     public function invoicesPending(CalendarRepository $CalendarRepositoryFamilyRepository $FamilyRepositoryContactRepository $contactRepository): Response
  2064.     {
  2065.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  2066.         if (!$this->security->isGranted('ROLE_ADMIN')) {
  2067.             return $this->redirectToRoute('app_logout');
  2068.         }
  2069.         $families $FamilyRepository->findAll();
  2070.         $contacts $contactRepository->findAll();
  2071.         return $this->render('family/invoice_pending.html.twig', [
  2072.             'calendars' => $CalendarRepository->findAll(),
  2073.             'families' => $families,
  2074.             'contacts' => $contacts
  2075.         ]);
  2076.     }
  2077.     /**
  2078.      * @Route("/server/invoices/pending", name="app_server_invoice_pending", methods={"GET"} , options = {"expose" = true } )
  2079.      */
  2080.     public function serverInvoicesPending(Request $requestEntityManagerInterface $entityManagerJugendamtRepository $JugendamtRepositoryRechnungenRepository $RechnungenRepository): Response
  2081.     {
  2082.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  2083.         $sql_where '';
  2084.         if ($request->get('searchByFamily') != "") {
  2085.             $sql_where .= ' AND f.id = ' $request->get('searchByFamily');
  2086.         }
  2087.         $columns = ['family''concat_ws(\'\',MONTH(p.start) , YEAR(p.start))''num''f.country''p.id'];
  2088.         $sql_search '';
  2089.         if ($request->get('search')['value'] != "") {
  2090.             $sql_where_glob_arr = [];
  2091.             foreach ($columns as $column) {
  2092.                 $sql_where_glob_arr[] = ' ' $column ' LIKE \'%' $request->get('search')['value'] . '%\' ';
  2093.             }
  2094.             if (count($sql_where_glob_arr) > 0) {
  2095.                 $sql_search ' AND ( ' implode(' OR '$sql_where_glob_arr) . ' ) ';
  2096.             }
  2097.         }
  2098.         
  2099.         
  2100.         $orders = [];
  2101.         for ($i 0$i count($request->get('order')); $i++) {
  2102.             $orders[] = $columns[$request->get('order')[$i]['column']] . ' ' $request->get('order')[$i]['dir'];
  2103.         }
  2104.         if (count($orders) > 0) {
  2105.             $order " ORDER BY " implode(' , '$orders);
  2106.         } else {
  2107.             $order "";
  2108.         }
  2109.         $hourPrice 55;
  2110.         if ($request->get('searchByYear') . $request->get('searchByMonth') >= 202308) {
  2111.             $hourPrice 70;
  2112.         }
  2113.         $month = (int) $request->get('searchByMonth') < 10 '0'.$request->get('searchByMonth') : $request->get('searchByMonth');
  2114.         $month2 = (int) $request->get('searchByMonth2') < 10 '0'.$request->get('searchByMonth2') : $request->get('searchByMonth2');
  2115.         $existance $entityManager->createQuery(
  2116.             'SELECT f.id as id , f.firstname , f.lastname , concat(f.id , MONTH(p.start) , YEAR(p.start)) as family , SUM(p.km)*0.30 as total_km_price , SUM( ( TimestampDiff(SECOND ,p.start , p.end) / 3600 ) ) * ' $hourPrice '  as total_price_hours , MONTH(p.start) as m , YEAR(p.start) as y
  2117.             FROM App\Entity\Calendar p
  2118.             JOIN p.family f
  2119.             
  2120.             WHERE 1=1 AND p.status = 2 AND MONTH(p.start) >= ' $month ' AND YEAR(p.start) >= ' $request->get('searchByYear') . ' AND MONTH(p.start) <= ' $month2 ' AND YEAR(p.start) <= ' $request->get('searchByYear2') . ' ' $sql_where ' ' $sql_search ' GROUP BY family ' $order '
  2121.             
  2122.             '
  2123.         )
  2124.             ->getResult();
  2125.         $I_nbResultatsTotal count($existance);
  2126.         $limit =  $request->get('length');
  2127.         $offset $request->get('start');
  2128.         $array_search = array();
  2129.         //->setParameter('nom', '%'.$request->get('searchByNom').'%')
  2130.         //p.nom LIKE :nom
  2131.         $hourPrice 55;
  2132.         if ($request->get('searchByYear') . $month >= 202308) {
  2133.             $hourPrice 70;
  2134.         }
  2135.         $families $entityManager->createQuery(
  2136.             'SELECT f.clearing as clearing, 
  2137.             f.id as id , 
  2138.             f.status as status , 
  2139.             concat_ws(\' \',f.firstname , f.lastname) as familien , 
  2140.             ( SELECT r.reference  FROM App\Entity\Rechnungen r JOIN r.family rf WHERE rf.id = f.id AND r.month = MONTH(p.start) AND r.year = YEAR(p.start)  ) as num , 
  2141.             concat(f.id , MONTH(p.start) , YEAR(p.start)) as family , 
  2142.             SUM(p.km)*0.30 as total_km_price , 
  2143.             (SUM(TIMESTAMPDIFF(SECOND, p.start, p.end) / 3600) * ' $hourPrice ' ) as total_price_hours , 
  2144.             (SUM( TIMESTAMPDIFF(SECOND, p.start, p.end) / 3600 *
  2145.                 (' $hourPrice ' *
  2146.                     (CASE 
  2147.                         WHEN p.holiday = 1 THEN 1.35
  2148.                         WHEN p.sunday = 1 THEN 0.25
  2149.                         ELSE 0
  2150.                     END)
  2151.                 ))
  2152.             ) as total_price_extra_hours , 
  2153.             ((SUM(p.km)*0.30)+
  2154.             (SUM(TIMESTAMPDIFF(SECOND, p.start, p.end) / 3600) *
  2155.                 (' $hourPrice ' *
  2156.                     (CASE 
  2157.                         WHEN p.holiday = 1 THEN 2.35
  2158.                         WHEN p.sunday = 1 THEN 1.25
  2159.                         ELSE 1
  2160.                     END)
  2161.                 )
  2162.             )
  2163.             ) as bertrag , 
  2164.             concat_ws(\'\',MONTH(p.start) , YEAR(p.start)) as month_year ,MONTH(p.start) as m , YEAR(p.start) as y
  2165.             FROM App\Entity\Calendar p
  2166.             JOIN p.family f
  2167.             
  2168.             WHERE 1=1 AND ( SELECT count(rc.reference)  FROM App\Entity\Rechnungen rc JOIN rc.family rcf WHERE rcf.id = f.id AND rc.month = MONTH(p.start) AND rc.year = YEAR(p.start)  ) = 0 AND p.status = 2 AND DATE_FORMAT(p.start,\'%Y-%m\') >= \'' $request->get('searchByYear') . '-' $month '\' AND DATE_FORMAT(p.start,\'%Y-%m\') <= \'' $request->get('searchByYear2') . '-' $month2 '\'  ' $sql_where ' ' $sql_search ' GROUP BY family ' $order '
  2169.             
  2170.             
  2171.             '
  2172.         )
  2173.             ->setMaxResults($limit)
  2174.             ->setFirstResult($offset)
  2175.             ->getResult();
  2176.         $months = ['01' => 'Januar''02' => 'Februar''03' => 'März''04' => 'April''05' => 'Mai''06' => 'Juni''07' => 'Juli''08' => 'August''09' => 'September''10' => 'Oktober''11' => 'November''12' => 'Dezember'];
  2177.         $total 0;
  2178.         $output = [];
  2179.         foreach ($families as $family) {
  2180.             $dateCalcul = new DateTime($family['y'].'-'.$family['m'].'-01');
  2181.             $dateCalcul->modify('last day of this month');
  2182.             $dateEnd $dateCalcul->format('Y-m-d 23:59:59');
  2183.             $calendars $this->em->createQuery(
  2184.             'SELECT p
  2185.             FROM App\Entity\Calendar p
  2186.             
  2187.             WHERE 1=1 AND p.status = 2 AND p.family = '.$family['id'].' AND p.start >= \''.$family['y'].'-'.$family['m'].'-01 00:00:00\' AND p.end <= \''.$dateEnd.'\'
  2188.             
  2189.             
  2190.             '
  2191.             )
  2192.             ->getResult() ;
  2193.             $totalHours 0;
  2194.             foreach($calendars as $calendar){
  2195.                 $t1 strtotimedate_format($calendar->getEnd(),'Y-m-d H:i:s')  );
  2196.                 $t2 strtotimedate_format($calendar->getStart(),'Y-m-d H:i:s') );
  2197.                 $diff $t1 $t2;
  2198.                 $hours $diff / ( 60 60 );
  2199.                 $totalHours += $hours;
  2200.             }
  2201.             $Rechnungen $RechnungenRepository->findOneBy(['family' => $family['id'], 'month' => $family['m'], 'year' => $family['y']]);
  2202.             $jugendamt $JugendamtRepository->findOneBy(['family' => $family['id']]);
  2203.             $output[] = [
  2204.                 'family' => $family['familien'] . ($family['status'] == ' (Archive)' ''),
  2205.                 'period' => $months[$family['m'] < 10 '0' $family['m'] : $family['m']] . ' ' $family['y'],
  2206.                 'stunden' => !is_null($jugendamt) ? $jugendamt->getStunden() : '',
  2207.                 'current_hours' => $totalHours,
  2208.                 'rechnung' => $family['num'],
  2209.                 'steigend' => !is_null($Rechnungen) ? $Rechnungen->getTotalAmount() : $family['total_km_price'] + $family['total_price_extra_hours'] +  $family['total_price_hours'],
  2210.                 'id' => $family['id'],
  2211.                 'month' => $family['m'],
  2212.                 'year' => $family['y'],
  2213.                 'token' => $this->tokenManager->getToken('rechnung' $family['id'])->getValue(),
  2214.                 'file' => $Rechnungen != null '/uploads/docs_family/' sha1($family['id']) . '/Rechnung-' substr($family['y'], 22) . str_pad($Rechnungen->getNum(), 30STR_PAD_LEFT) . '.pdf' ''
  2215.             ];
  2216.             $total += $family['total_km_price'] + $family['total_price_extra_hours'] +  $family['total_price_hours'];
  2217.         }
  2218.         $JSON json_encode($output);
  2219.         $JSON '{"draw": ' $request->get('draw') . ',"recordsTotal":' $I_nbResultatsTotal ',"recordsFiltered":' $I_nbResultatsTotal ',"total":"' $total '","data":' $JSON '}';
  2220.         $response   = new Response($JSON200, ['Content-Type' => 'application/json']);
  2221.         return $response;
  2222.     }
  2223. }