src/Controller/ActionController.php line 408

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Action;
  4. use App\Entity\Actioncategory;
  5. use App\Entity\Settings;
  6. use App\Entity\Appointments;
  7. use App\Entity\Appointmentscategory;
  8. use App\Entity\User;
  9. use App\Entity\Actionlog;
  10. use App\Entity\Orderstatus;
  11. use App\Form\ActionType;
  12. use App\Repository\ActionRepository;
  13. use App\Repository\AppointmentsRepository;
  14. use App\Repository\OrderRepository;
  15. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  16. use Symfony\Component\HttpFoundation\Request;
  17. use Symfony\Component\HttpFoundation\Response;
  18. use Symfony\Component\Routing\Annotation\Route;
  19. use Symfony\Bridge\Doctrine\Form\Type\EntityType;
  20. use Symfony\Component\Form\Extension\Core\Type\TextType;
  21. use Symfony\Component\Form\Extension\Core\Type\TextareaType;
  22. use Symfony\Component\Form\Extension\Core\Type\DateTimeType;
  23. use Symfony\Component\Form\Extension\Core\Type\DateType;
  24. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  25. use Symfony\Component\Form\Extension\Core\Type\SearchType;
  26. use Symfony\Component\Form\FormBuilderInterface;
  27. use Symfony\Component\Form\FormEvent;
  28. use Symfony\Component\Form\FormEvents;
  29. use Doctrine\ORM\EntityRepository;
  30. use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
  31. use Symfony\Component\Form\Extension\Core\Type\FileType;
  32. use Symfony\Component\Validator\Constraints\File;
  33. use App\Service\FileUploader;
  34. use App\Service\ActionReminder;
  35. use App\Service\ActionService;
  36. use Doctrine\DataTables;
  37. /**
  38.  * @Route("/action")
  39.  */
  40. class ActionController extends AbstractController
  41. {
  42.     /**
  43.      * @Route("/", name="action_index", methods={"GET"})
  44.      */
  45.     public function index(): Response
  46.     {
  47.         return $this->render('action/index.html.twig');
  48.     }
  49.     
  50.     /**
  51.      * @Route("/ssp", name="action_ssp", methods={"GET"})
  52.      */
  53.     public function ssp(): Response
  54.     {
  55.         $em $this->getDoctrine()->getManager();
  56.         
  57.         $datatables = (new DataTables\Builder())
  58.             ->withColumnAliases([
  59.                 'a_duedate' => 'a.duedate',
  60.                 'u_username' => 'u.username',
  61.                 'a_title' => 'a.title',
  62.                 'o_ordernumber' => 'o.ordernumber',
  63.                 'c_name' => 'c.name',
  64.                 'c_city' => 'c.city',
  65.                 'a_completedate' => 'a.completedate',
  66.             ]) 
  67.             ->withIndexColumn('a.id')
  68.             ->withQueryBuilder(
  69.                 $em->createQueryBuilder()
  70.                     ->select('a','o','c','u')
  71.                     ->from(Action::class, 'a')
  72.                     ->leftjoin('a.actionholder','u')
  73.                     ->leftjoin('a.orderid','o')
  74.                     ->leftjoin('o.customer','c')
  75.                     ->where('a.status = 1')
  76.                     ->andWhere('a.isfinished = false')
  77.             )
  78.             ->withRequestParams($_GET);
  79.         
  80.         #echo "<pre>";
  81.         #echo json_encode($datatables->getResponse(), JSON_PRETTY_PRINT);
  82.         #exit();
  83.         
  84.         return new Response(json_encode($datatables->getResponse()));
  85.     }    
  86.     
  87.      /**
  88.      * @Route("/personalview", name="action_index_personal", methods={"GET"})
  89.      */
  90.     public function personalview(): Response
  91.     {
  92.         return $this->render('action/indexpersonal.html.twig');
  93.     }
  94.     
  95.      /**
  96.      * @Route("/personalhiddenview", name="action_index_personalhidden", methods={"GET"})
  97.      */
  98.     public function personalhiddenview(): Response
  99.     {
  100.         return $this->render('action/indexpersonalhidden.html.twig');
  101.     }    
  102.     
  103.     /**
  104.      * @Route("/personalssp", name="action_personal_ssp", methods={"GET"})
  105.      */
  106.     public function personalssp(): Response
  107.     {
  108.         $em $this->getDoctrine()->getManager();
  109.         
  110.         $datatables = (new DataTables\Builder())
  111.             ->withColumnAliases([
  112.                 'a_duedate' => 'a.duedate',
  113.                 'u_username' => 'u.username',
  114.                 'a_title' => 'a.title',
  115.                 'o_ordernumber' => 'o.ordernumber',
  116.                 'c_name' => 'c.name',
  117.                 'c_city' => 'c.city',
  118.                 'a_completedate' => 'a.completedate',
  119.             ]) 
  120.             ->withIndexColumn('a.id')
  121.             ->withQueryBuilder(
  122.                 $em->createQueryBuilder()
  123.                     ->select('a','o','c','u','k')
  124.                     ->from(Action::class, 'a')
  125.                     ->leftjoin('a.actionholder','u')
  126.                     ->leftjoin('a.orderid','o')
  127.                     ->leftjoin('o.customer','c')
  128.                     ->leftjoin('a.category','k')
  129.                     ->where('a.status = 1')
  130.                     ->andWhere(':userId NOT MEMBER OF k.hiddenbyusers')
  131.                     ->andWhere('a.actionholder = ' $this->getUser()->getId())
  132.                     ->andWhere('a.isfinished = false')
  133.                     ->setParameter("userId"$this->getUser()->getId())
  134.             )
  135.             ->withRequestParams($_GET);
  136.         
  137.         return new Response(json_encode($datatables->getResponse()));
  138.     }        
  139.     /**
  140.      * @Route("/personalhiddenssp", name="action_personalhidden_ssp", methods={"GET"})
  141.      */
  142.     public function personalhiddenssp(): Response
  143.     {
  144.         $em $this->getDoctrine()->getManager();
  145.         
  146.         $datatables = (new DataTables\Builder())
  147.             ->withColumnAliases([
  148.                 'a_duedate' => 'a.duedate',
  149.                 'u_username' => 'u.username',
  150.                 'a_title' => 'a.title',
  151.                 'o_ordernumber' => 'o.ordernumber',
  152.                 'c_name' => 'c.name',
  153.                 'c_city' => 'c.city',
  154.                 'a_completedate' => 'a.completedate',
  155.             ]) 
  156.             ->withIndexColumn('a.id')
  157.             ->withQueryBuilder(
  158.                 $em->createQueryBuilder()
  159.                     ->select('a','o','c','u','k')
  160.                     ->from(Action::class, 'a')
  161.                     ->leftjoin('a.actionholder','u')
  162.                     ->leftjoin('a.orderid','o')
  163.                     ->leftjoin('o.customer','c')
  164.                     ->leftjoin('a.category','k')
  165.                     ->where('a.status = 1')
  166.                     ->andWhere(':userId MEMBER OF k.hiddenbyusers')
  167.                     ->andWhere('a.actionholder = ' $this->getUser()->getId())
  168.                     ->andWhere('a.isfinished = false')
  169.                     ->setParameter("userId"$this->getUser()->getId())
  170.             )
  171.             ->withRequestParams($_GET);
  172.         
  173.         return new Response(json_encode($datatables->getResponse()));
  174.     }    
  175.     
  176.     /**
  177.      * @Route("/filteredview", name="action_index_filtered", methods={"GET","POST"})
  178.      */
  179.     public function filteredview(Request $requestActionRepository $actionRepository): Response
  180.     {
  181.         $form $this->createFormBuilder()
  182.             ->add('category'EntityType::class, [
  183.                 'label_attr' => array('class' => ''),
  184.                 'attr' => array('class' => 'form-control selectpicker','data-live-search' => 'true'),
  185.                 'required' => false,
  186.                 'query_builder' => function (EntityRepository $er) {
  187.                     return $er->createQueryBuilder('u')
  188.                         ->where('u.status = 1')
  189.                         ->orderBy('u.priority''DESC');
  190.                     },
  191.                 'class' => Actioncategory::class,
  192.                 'choice_label' => 'name',
  193.                 'placeholder' => 'Alle categoriën',
  194.                 'label' => 'Filter op actiecategorie(ën)',
  195.                 'multiple' => true,
  196.                 ])
  197.             ->add('user'EntityType::class, [
  198.                 'label_attr' => array('class' => ''),
  199.                 'attr' => array('class' => 'form-control selectpicker','data-live-search' => 'true'),
  200.                 'required' => false,
  201.                 'query_builder' => function (EntityRepository $er) {
  202.                     return $er->createQueryBuilder('u')
  203.                         ->where('u.status = 1');
  204.                     },
  205.                 'class' => User::class,
  206.                 'choice_label' => 'username',
  207.                 'placeholder' => 'Alle gebruikers',
  208.                 'label' => 'Filter op actiehouder',
  209.                 ])                
  210.             ->add('finished'ChoiceType::class, [
  211.                 'label' => 'Filter op lopend of afgerond',
  212.                 'attr' => array('class' => 'form-control selectpicker'),
  213.                 'placeholder' => 'Alles tonen',
  214.                 'required' => false,
  215.                 'choices'  => [
  216.                     'Lopend' => 1,
  217.                     'Lopend (over tijd)' => 2,
  218.                     'Afgerond' => 3,
  219.                 ]])
  220.             ->add('showdeleted'ChoiceType::class, [
  221.                 'label' => 'Verwijderde acties tonen',
  222.                 'attr' => array('class' => 'form-control selectpicker'),
  223.                 'placeholder' => 'Alles tonen',
  224.                 'required' => false,
  225.                 'data' => 2,
  226.                 'choices'  => [
  227.                     'Alleen bestaande' => 2,
  228.                     'Uitsluitend verwijderde' => 1,
  229.                 ]])
  230.             ->add('startdate'DateType::class, array(
  231.                 'widget'=> 'single_text'
  232.                 'label' => 'Streefdatum na',
  233.                 'attr' => array('class' => 'form-control'),
  234.                 'required' => false,
  235.                 ))        
  236.             ->add('enddate'DateType::class, array(
  237.                 'widget'=> 'single_text'
  238.                 'label' => 'Streefdatum voor',
  239.                 'attr' => array('class' => 'form-control'),
  240.                 'required' => false,
  241.                 ))
  242.             ->add('createstartdate'DateType::class, array(
  243.                 'widget'=> 'single_text'
  244.                 'label' => 'Actie aangemaakt na',
  245.                 'attr' => array('class' => 'form-control'),
  246.                 'required' => false,
  247.                 ))        
  248.             ->add('createenddate'DateType::class, array(
  249.                 'widget'=> 'single_text'
  250.                 'label' => 'Actie aangemaakt voor',
  251.                 'attr' => array('class' => 'form-control'),
  252.                 'required' => false,
  253.                 ))                    
  254.             ->getForm();
  255.         $form->handleRequest($request);
  256.         
  257.         if ($form->isSubmitted() && $form->isValid()) {
  258.             
  259.             $category $form['category']->getData(); 
  260.             $user $form['user']->getData();
  261.             $isfinished $form['finished']->getData();
  262.             $showdeleted $form['showdeleted']->getData();
  263.             $startdate $form['startdate']->getData();
  264.             $enddate $form['enddate']->getData();
  265.             $createstartdate $form['createstartdate']->getData();
  266.             $createenddate $form['createenddate']->getData();            
  267.             
  268.             $query $actionRepository->createQueryBuilder('a');
  269.             if (!$category->isEmpty()) {
  270.                 $query->andWhere('a.category IN (:category)')
  271.                       ->setParameter('category'$category);
  272.             }            
  273.             
  274.             if ($user) {
  275.                 $query->andWhere('a.actionholder = :user')->setParameter('user'$user);
  276.             }
  277.             
  278.             if ($startdate) {
  279.                 $query->andWhere('a.duedate >= :startdate')->setParameter('startdate'$startdate);
  280.             }
  281.             
  282.             if ($enddate) {
  283.                 $query->andWhere('a.duedate <= :enddate')->setParameter('enddate'$enddate);
  284.             }
  285.             if ($createstartdate) {
  286.                 $query->andWhere('a.createdate >= :createstartdate')->setParameter('createstartdate'$createstartdate);
  287.             }
  288.             
  289.             if ($createenddate) {
  290.                 $query->andWhere('a.createdate <= :createenddate')->setParameter('createenddate'$createenddate);
  291.             }
  292.             
  293.             $today = new \DateTime();
  294.             
  295.             if ($isfinished == 1) {
  296.                 $query->andWhere('a.isfinished = false');
  297.             } elseif ($isfinished == 2) {
  298.                 $query->andWhere('a.isfinished = false');
  299.                 $query->andWhere('a.duedate < :today')->setParameter('today'$today);
  300.             } elseif ($isfinished == 3) {
  301.                 $query->andWhere('a.isfinished = true');
  302.             }
  303.             
  304.             if ($showdeleted == 2) {
  305.                 $query->andWhere('a.status = 1');
  306.             } elseif ($showdeleted == 1) {
  307.                 $query->andWhere('a.status = 0');
  308.             }
  309.             
  310.             
  311.             // limit the result to ensure speed
  312.             $query->setMaxResults(250);
  313.             
  314.             $result $query->getQuery()->execute();
  315.             return $this->render('action/indexfiltered.html.twig', [
  316.                 'filteredview' => true,
  317.                 'actions' => $result,
  318.                 'form' => $form->createView(),
  319.             ]);
  320.         
  321.         }
  322.         return $this->render('action/indexfiltered.html.twig', [
  323.             'filteredview' => false,
  324.             'form' => $form->createView(),
  325.         ]);
  326.     }
  327.     /**
  328.      * @Route("/new", name="action_new", methods={"GET","POST"})
  329.      */
  330.     public function new(Request $requestOrderRepository $orderRepositoryActionReminder $actionReminderActionService $actionService): Response
  331.     {
  332.         $action = new Action();
  333.         
  334.         # get max upload size to be indicated to the user
  335.         $maxfilesize ini_get("upload_max_filesize");
  336.         
  337.         $form $this->createForm(ActionType::class, $action);
  338.         $form $form->add('reminder'EntityType::class, [
  339.                 'label_attr' => array('class' => ''),
  340.                 'attr' => array('class' => 'form-control'),
  341.                 'required' => false,
  342.                 'query_builder' => function (EntityRepository $er) {
  343.                     return $er->createQueryBuilder('u')
  344.                         ->where('u.status = 1')
  345.                         ->andWhere('u.microsoft IS NOT NULL');
  346.                     },
  347.                 'class' => User::class,
  348.                 'placeholder' => 'Kies een agenda',
  349.                 'label' => 'Agenda reminder op streefdatum toevoegen (optioneel)',
  350.                 'mapped' => false,
  351.                 ]);
  352.         $form $form->add('orderid'SearchType::class, [
  353.                 'label_attr' => array('class' => ''),
  354.                 'attr' => array('class' => 'form-control','autocomplete'=>'off'),
  355.                 'required' => true,
  356.                 'label' => 'Gerelateerde order *',
  357.                 'mapped' => false,
  358.                 ]);
  359.         $form $form->add('uploads'FileType::class, [
  360.                     'attr' => array('class' => 'custom-file'),
  361.                     'label' => 'Bestanden uploaden (max ' $maxfilesize 'B)',
  362.                     'mapped' => false,
  363.                     'multiple' => true,
  364.                     'required' => false,
  365.                 ]);
  366.         
  367.         $form->handleRequest($request);
  368.         if ($form->isSubmitted() && $form->isValid()) {
  369.             
  370.             $selectedid $request->request->get('selectedid');
  371.             $order $orderRepository->find($selectedid);
  372.             
  373.             $action $actionService->saveAction($form,$order);
  374.             return $this->redirectToRoute('action_show',array('id'=>$action->getId()));
  375.         }
  376.         return $this->render('action/new.html.twig', [
  377.             'action' => $action,
  378.             'form' => $form->createView(),
  379.         ]);
  380.     }
  381.     
  382.     
  383.     /**
  384.      * @Route("/triggered/{id}", name="action_new_triggered", methods={"GET","POST"})
  385.      */
  386.     public function newtriggered(Request $requestAppointmentsRepository $appointmentsRepositoryActionRepository $actionRepository$id=nullActionService $actionService): Response
  387.     {
  388.         $previousaction $actionRepository->findOneBy(['id' => $id ]);
  389.         $previousactioncategory $previousaction->getCategory();
  390.         
  391.         # get the entity manager $em
  392.         $em $this->getDoctrine()->getManager();
  393.         
  394.         # get repository for all actioncategories
  395.         $repoActioncategory $em->getRepository(Actioncategory::class);
  396.         
  397.         $triggercategory $repoActioncategory->findOneBy([
  398.             'id' => $previousactioncategory->getTriggercategory(),
  399.         ]);
  400.         
  401.         $order $previousaction->getOrderid();
  402.         
  403.         # get upcoming appointments for this action to show upcoming appointments for the user
  404.         $today = new \DateTime("today midnight");
  405.         
  406.         # build query and execute, get list with appointment
  407.         $queryAppointments$appointmentsRepository->createQueryBuilder('a')
  408.             ->where('a.status = 1')
  409.             ->andWhere('a.startdate >= :now')
  410.             ->andWhere('a.orderid = ' $order->getId())
  411.             ->setParameter('now',$today->format('Y-m-d'))
  412.             ->orderBy('a.startdate','ASC');
  413.         $appointments $queryAppointments->getQuery()->execute();
  414.             
  415.         
  416.         $action = new Action();
  417.         if ($triggercategory) {
  418.             $action->setActionholder($triggercategory->getDefaultuser());
  419.             $action->setCategory($triggercategory);
  420.             $action->setTitle($triggercategory->getName());
  421.             
  422.             # get due date and more    
  423.             $returnarray =  $actionService->getDuedate($triggercategory$order);    
  424.             $duedate $returnarray['duedate'];    
  425.             $determinedby $returnarray['determinedby'];    
  426.             $appointmentscategory $returnarray['appointmentscategory'];    
  427.             
  428.             if ($determinedby == 'appointment') {
  429.                 $appointmentscategorybool true;
  430.             } else {
  431.                 $appointmentscategorybool false;
  432.             }
  433.             
  434.             # check if it is duplicate action
  435.             $duplicate $actionService->checkDuplicate($triggercategory$order);    
  436.         
  437.             
  438.             $action->setDuedate(new \DateTime($duedate));
  439.         } else {
  440.             
  441.             # set bools to false 
  442.             $appointmentscategorybool false;
  443.             $duplicate false;
  444.         }
  445.         
  446.         # get max upload size to be indicated to the user
  447.         $maxfilesize ini_get("upload_max_filesize");
  448.         
  449.         $form $this->createFormBuilder($action)
  450.             ->add('title'TextType::class, array(
  451.                 'attr' => array('class' => 'form-control'),
  452.                 'label' => 'Titel *',
  453.                 'required' => true,
  454.                 ))
  455.             ->add('category'EntityType::class, [
  456.                 'label_attr' => array('class' => ''),
  457.                 'attr' => array('class' => 'form-control'),
  458.                 'required' => true,
  459.                 'query_builder' => function (EntityRepository $er) {
  460.                     return $er->createQueryBuilder('u')
  461.                         ->where('u.status = 1')
  462.                         ->orderBy('u.priority''DESC');
  463.                     },
  464.                 'class' => Actioncategory::class,
  465.                 'choice_label' => 'name',
  466.                 'placeholder' => 'Kies een actiecategorie',
  467.                 'label' => 'Actiecategorie *',
  468.                 ])
  469.             ->add('description'TextareaType::class, array(
  470.                 'attr' => array('class' => 'form-control'),
  471.                 'label' => 'Opmerkingen',
  472.                 'required' => false,
  473.                 ))
  474.             ->add('duedate'DateType::class, array(
  475.                 'widget'=> 'single_text'
  476.                 'attr' => array('class' => 'form-control'),
  477.                 'input' => 'datetime',
  478.                 'label' => 'Streefdatum *',
  479.                 'required' => true,
  480.                 ))
  481.             ->add('actionholder'EntityType::class, [
  482.                     'label_attr' => array('class' => ''),
  483.                     'attr' => array('class' => 'form-control'),
  484.                     'required' => true,
  485.                     'query_builder' => function (EntityRepository $er) {
  486.                         return $er->createQueryBuilder('u')
  487.                             ->where('u.status = 1');
  488.                         },
  489.                     'class' => User::class,
  490.                     'choice_label' => 'username',
  491.                     'placeholder' => 'Selecteer actiehouder',
  492.                     'label' => 'Actie bij *',
  493.                 ])
  494.             ->add('uploads'FileType::class, [
  495.                 'attr' => array('class' => 'custom-file'),
  496.                 'label' => 'Bestanden uploaden (max ' $maxfilesize 'B)',
  497.                 'mapped' => false,
  498.                 'multiple' => true,
  499.                 'required' => false,
  500.             ])
  501.             ->add('reminder'EntityType::class, [
  502.                 'label_attr' => array('class' => ''),
  503.                 'attr' => array('class' => 'form-control'),
  504.                 'required' => false,
  505.                 'query_builder' => function (EntityRepository $er) {
  506.                     return $er->createQueryBuilder('u')
  507.                         ->where('u.status = 1')
  508.                         ->andWhere('u.microsoft IS NOT NULL');
  509.                     },
  510.                 'class' => User::class,
  511.                 'placeholder' => 'Kies een agenda',
  512.                 'label' => 'Agenda reminder op streefdatum toevoegen (optioneel)',
  513.                 'mapped' => false,
  514.             ])
  515.             ->getForm();
  516.         $form->handleRequest($request);
  517.         if ($form->isSubmitted() && $form->isValid()) {
  518.             
  519.             $action $actionService->saveAction($form,$order);
  520.             return $this->redirectToRoute('action_show',array('id'=>$action->getId()));
  521.         }
  522.         return $this->render('order/subpages/triggered.html.twig', [
  523.             'appointmentscategorybool' => $appointmentscategorybool,
  524.             'duplicate' => $duplicate,
  525.             'order' => $order,
  526.             'form' => $form->createView(),
  527.             'appointments' => $appointments,
  528.             'action' => $previousaction,
  529.         ]);
  530.     }
  531.     /**
  532.      * @Route("/{id}", name="action_show", methods={"GET","POST"})
  533.      */
  534.     public function show(Action $actionRequest $requestFileUploader $fileUploaderActionReminder $actionReminderAppointmentsRepository $appointmentsRepository): Response
  535.     {
  536.         $order $action->getOrderid();
  537.         
  538.         $relatedappointment $action->getAppointment();
  539.         
  540.         if ($relatedappointment) {
  541.             $appointmenthost $relatedappointment->getHost();
  542.         } else {
  543.             $appointmenthost null;
  544.         }
  545.         # get max upload size to be indicated to the user
  546.         $maxfilesize ini_get("upload_max_filesize");
  547.         
  548.         # get upcoming appointments for this action
  549.         $today = new \DateTime("today midnight");
  550.         
  551.         # build query and execute, get list with appointment
  552.         $queryAppointments$appointmentsRepository->createQueryBuilder('a')
  553.             ->where('a.status = 1')
  554.             ->andWhere('a.startdate >= :now')
  555.             ->andWhere('a.orderid = ' $order->getId())
  556.             ->setParameter('now',$today->format('Y-m-d'))
  557.             ->orderBy('a.startdate','ASC');
  558.         $appointments $queryAppointments->getQuery()->execute();
  559.         
  560.         $form $this->createFormBuilder()
  561.             ->add('title'TextType::class, array(
  562.                 'attr' => array('class' => 'form-control'),
  563.                 'label' => 'Titel *',
  564.                 'data' => $action->getTitle(),
  565.                 'required' => true,
  566.                 ))        
  567.             ->add('description'TextareaType::class, array(
  568.                 'attr' => array('class' => 'form-control'),
  569.                 'data' => '',
  570.                 'label' => 'Beschrijving',
  571.                 'required' => false,
  572.                 ))
  573.             ->add('duedate'DateType::class, array(
  574.                 'widget'=> 'single_text'
  575.                 'label' => 'Streefdatum',
  576.                 'attr' => array('class' => 'form-control'),
  577.                 'data' => $action->getDuedate(),
  578.                 'required' => true,
  579.                 ))
  580.             ->add('actionholder'EntityType::class, [
  581.                 'label_attr' => array('class' => ''),
  582.                 'attr' => array('class' => 'form-control'),
  583.                 'required' => true,
  584.                 'query_builder' => function (EntityRepository $er) {
  585.                     return $er->createQueryBuilder('u')
  586.                         ->where('u.status = 1');
  587.                     },
  588.                 'class' => User::class,
  589.                 'data' => $action->getActionholder(),
  590.                 'choice_label' => 'username',
  591.                 'placeholder' => 'Kies een actiehouder',
  592.                 'label' => 'Actie bij *',
  593.                 ])    
  594.             ->add('orderstatus'EntityType::class, [
  595.                 'label_attr' => array('class' => ''),
  596.                 'attr' => array('class' => 'form-control'),
  597.                 'required' => true,
  598.                 'query_builder' => function (EntityRepository $er) {
  599.                     return $er->createQueryBuilder('u')
  600.                         ->where('u.status = 1');
  601.                     },
  602.                 'class' => Orderstatus::class,
  603.                 'choice_label' => 'name',
  604.                 'placeholder' => 'Kies een orderstatus',
  605.                 'label' => 'Status van de order aanpassen',
  606.                 'data' => $order->getOrderstatus(),
  607.                 ])                
  608.             ->add('isfinished'CheckboxType::class, [
  609.                 'required' => false,
  610.                 'label_attr' => array('class' => 'mr-3'),
  611.                 'attr' => array('class' => 'mt-3'),
  612.                 'data' => $action->getIsfinished(),
  613.                 'label' => 'Actie afgerond',
  614.                 ])
  615.             ->add('reminder'EntityType::class, [
  616.                 'label_attr' => array('class' => ''),
  617.                 'attr' => array('class' => 'form-control'),
  618.                 'required' => false,
  619.                 'query_builder' => function (EntityRepository $er) {
  620.                     return $er->createQueryBuilder('u')
  621.                         ->where('u.status = 1')
  622.                         ->andWhere('u.microsoft IS NOT NULL');
  623.                     },
  624.                 'class' => User::class,
  625.                 'placeholder' => 'Kies een agenda',
  626.                 'data' => $appointmenthost,
  627.                 'label' => 'Agenda reminder op streefdatum toevoegen (optioneel)',
  628.                 'mapped' => false,
  629.                 ])                            
  630.             ->add('uploads'FileType::class, [
  631.                     'attr' => array('class' => 'custom-file'),
  632.                     'label' => 'Bestanden uploaden (max ' $maxfilesize 'B)',
  633.                     'mapped' => false,
  634.                     'multiple' => true,
  635.                     'required' => false,
  636.                 ])
  637.             ->getForm();
  638.         $form->handleRequest($request);
  639.         
  640.         if ($form->isSubmitted() && $form->isValid()) {
  641.             
  642.             $action->setDescription(nl2br($form['description']->getData()));
  643.             $action->setDuedate($form['duedate']->getData()->setTime(2359));
  644.             $action->setActionholder($form['actionholder']->getData());
  645.             $action->setTitle($form['title']->getData());
  646.             
  647.             $agenda $form['reminder']->getData();
  648.                 
  649.             if ($agenda) {
  650.                 $appointment $actionReminder->add($action$agenda);
  651.                 $action->setAppointment($appointment);
  652.             } else {
  653.                 $action->setAppointment(null);
  654.                 # Eigenlijk moet de afspraak ook weggegooid worden.. To be done one day!
  655.             }
  656.             
  657.             $actionlog = new Actionlog();
  658.                         
  659.             if ($form['isfinished']->getData()) {
  660.                 $action->setCompletedate(new \DateTime());
  661.                 $action->setIsfinished(true);
  662.                 $actionlog->setCompletedate(new \DateTime());
  663.                 $actionlog->setIsfinished(true);
  664.             }
  665.             else {
  666.                 $action->setCompletedate(null);
  667.                 $actionlog->setCompletedate(null);
  668.                 $action->setIsfinished(false);
  669.                 $actionlog->setIsfinished(false);
  670.             }
  671.             
  672.             $entityManager $this->getDoctrine()->getManager();
  673.             $entityManager->persist($action);
  674.             $entityManager->flush();
  675.             
  676.             $uploads $form['uploads']->getData();
  677.         
  678.             if ($uploads) {
  679.                 
  680.                 foreach ($uploads as $upload) {
  681.                 
  682.                     $uploadFileName $fileUploader->upload($upload);
  683.                     $uploads_array[]= $uploadFileName;
  684.                 }
  685.                 
  686.                 # setUpload is not used anymore since multi upload is required
  687.                 $actionlog->setUploads($uploads_array);
  688.             }
  689.             
  690.             $actionlog->setActionid($action);
  691.             $actionlog->setTitle($form['title']->getData());
  692.             $actionlog->setDescription(nl2br($form['description']->getData()));
  693.             $actionlog->setActionholder($form['actionholder']->getData());
  694.             $actionlog->setDuedate($form['duedate']->getData());
  695.             $actionlog->setCreatedbyuser($this->getUser());
  696.             $actionlog->setCreatedate(new \DateTime());
  697.             $actionlog->setStatus(1);
  698.             
  699.             $entityManager $this->getDoctrine()->getManager();
  700.             $entityManager->persist($actionlog);
  701.             $entityManager->flush();
  702.             
  703.             $order->setOrderstatus($form['orderstatus']->getData());
  704.             $entityManager->persist($order);
  705.             $entityManager->flush();
  706.             
  707.             if ($action->getIsfinished()){
  708.                 return $this->redirectToRoute('action_new_triggered',array('id'=>$action->getId()));
  709.             }
  710.             else {
  711.                 return $this->redirectToRoute('action_show',array('id'=>$action->getId()));
  712.             }
  713.         } else if ($form->isSubmitted()) {
  714.             
  715.             // form submit not valid, most likely to do with upload size!
  716.             echo '<script>alert("Kan niet opslaan. Controleer of de bestanden die je upload niet te groot zijn")</script>';
  717.             
  718.             return $this->render('action/showinorder.html.twig', [
  719.                 'appointments' => $appointments,
  720.                 'action' => $action,
  721.                 'order' => $order,
  722.                 'form' => $form->createView(),
  723.             ]);
  724.         }
  725.         
  726.         return $this->render('action/showinorder.html.twig', [
  727.             'appointments' => $appointments,
  728.             'action' => $action,
  729.             'order' => $order,
  730.             'form' => $form->createView(),
  731.         ]);
  732.     }
  733.     
  734.     /**
  735.      * @Route("/{id}/edit", name="action_edit", methods={"GET","POST"})
  736.      */
  737.     public function edit(Request $requestAction $action): Response
  738.     {
  739.         $form $this->createForm(ActionType::class, $action);
  740.         $form->handleRequest($request);
  741.         if ($form->isSubmitted() && $form->isValid()) {
  742.             $this->getDoctrine()->getManager()->flush();
  743.             return $this->redirectToRoute('action_show',array('id'=>$action->getId()));
  744.         }
  745.         return $this->render('action/edit.html.twig', [
  746.             'action' => $action,
  747.             'form' => $form->createView(),
  748.         ]);
  749.     }
  750.     /**
  751.      * @Route("/{id}", name="action_delete", methods={"DELETE"})
  752.      */
  753.     public function delete(Request $requestAction $action): Response
  754.     {
  755.         $orderid $action->getOrderid()->getId();
  756.         
  757.         if ($this->isCsrfTokenValid('delete'.$action->getId(), $request->request->get('_token'))) {
  758.             $entityManager $this->getDoctrine()->getManager();
  759.             #$action->setCompletedate(new \DateTime());
  760.             #$action->setIsfinished(true);        
  761.             $action->setStatus(0);
  762.             $entityManager->flush();
  763.         }
  764.         return $this->redirectToRoute('order_show_acties',['id' => $orderid] );
  765.     }
  766. }