src/Controller/ApiController.php line 2462

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Event\HolidayEvent;
  4. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  5. use Symfony\Component\Security\Core\Exception\AccessDeniedException;
  6. use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
  7. use Symfony\Component\HttpFoundation\Request;
  8. use Symfony\Component\HttpFoundation\Response;
  9. use Symfony\Component\Routing\Annotation\Route;
  10. use Symfony\Component\Security\Core\User\UserInterface;
  11. use Pimcore\Model\Asset;
  12. use Pimcore\Model\DataObject;
  13. use Pimcore\Model\Document;
  14. use Pimcore\Model\Element\Tag;
  15. use Pimcore\Model\DataObject\Data\BlockElement;
  16. use Symfony\Component\Stopwatch\Stopwatch;
  17. use App\Form\ManageUserCreateType;
  18. use App\Form\ManageUserUpdateType;
  19. use App\Form\PasswordFormType;
  20. use App\Form\RegistrationFormHandler;
  21. use App\Model\Customer;
  22. use App\Model\TrycareMembership;
  23. use App\Services\CreateSubuserService;
  24. use App\Services\GeneralService;
  25. use App\Services\HeadOfficeService;
  26. use App\Services\PermissionService;
  27. use App\Services\ToolsService;
  28. use App\Services\NotificationService;
  29. use App\Services\EmployeeContractService;
  30. use App\Services\FreeTrialService;
  31. use App\Services\TrycareService;
  32. use App\Stripe\UserHandler;
  33. use Carbon\Carbon;
  34. use CustomerManagementFrameworkBundle\CustomerProvider\CustomerProviderInterface;
  35. use Error;
  36. use Pimcore\DataObject\Consent\Service;
  37. use Psr\Log\LoggerInterface;
  38. use Symfony\Component\HttpClient\Exception\InvalidArgumentException;
  39. use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
  40. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  41. use Symfony\Component\HttpKernel\Exception\PreconditionFailedHttpException;
  42. use Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException;
  43. use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
  44. /**
  45.  * @Route("/api", name="api")
  46.  */
  47. class ApiController extends AbstractController
  48. {
  49.     /**
  50.      * @Route("/template-hub/templates/read", name="template-hub-read")
  51.      */
  52.     public function templateHubReadAction(Stopwatch $stopwatch)
  53.     {
  54.         if (!$this->isGranted('ROLE_USER')) {
  55.             throw new UnauthorizedHttpException('Not authorized.');
  56.         }
  57.         $listPublic = new DataObject\Templates\Listing();
  58.         $listPublic->load();
  59.         $listPublic $listPublic->getData();
  60.         $listCategories array_map(function ($template) {
  61.             return $template->getCategory();
  62.         }, $listPublic);
  63.         $listCategories array_unique($listCategories);
  64.         $templatesList = [];
  65.         foreach ($listCategories as $category) {
  66.             $list array_filter($listPublic, function ($item) use ($category) {
  67.                 return $item->getCategory() === $category;
  68.             });
  69.             $dataContent = [];
  70.             foreach ($list as $template) {
  71.                 /* if ($asset instanceof \Pimcore\Model\Asset\Document) {
  72.                     try {
  73.                     if (!$asset->getCustomSetting('document_page_count')) {
  74.                         $asset->processPageCount();
  75.                     }
  76.                     } catch (\Exception $e) {
  77.                     //do nothing
  78.                     }
  79.                 } */
  80.                 $coverPath $template->getCover()->getPath();
  81.                 $coverFilename $template->getCover()->getFilename();
  82.                 $dataContent[] = [
  83.                     'name' => $template->getTitle(),
  84.                     'id' => $template->getId(),
  85.                     "preview" => $coverPath $coverFilename,
  86.                     "linkDocument" => $template->getDocument()->getFullPath(),
  87.                     /* "linkPdf" => $template->getPdf()->getFullPath(), */
  88.                 ];
  89.             }
  90.             $templatesList[] = [
  91.                 "category" => $category,
  92.                 "data" => $dataContent
  93.             ];
  94.         }
  95.         $response = new Response();
  96.         $response->headers->set('Content-Type''application/json');
  97.         $response->headers->set('Access-Control-Allow-Origin''*');
  98.         $response->setContent(json_encode($templatesList));
  99.         return $response;
  100.     }
  101.     /**
  102.      * @Route("/head-office/assets/create", name="template-hub-assets-create", methods={"POST"})
  103.      * 
  104.      * @param Request $request
  105.      * @return Response
  106.      */
  107.     public function headOfficeAssetCreateAction(Request $request)
  108.     {
  109.         $loggedUser $this->getUser();
  110.         if (!$loggedUser) {
  111.             throw new UnauthorizedHttpException('Not authorized.');
  112.         }
  113.         $id $loggedUser->getId();
  114.         if ($request->getContent()) {
  115.             $data json_decode($request->getContent(), true);
  116.             $fileName $data['fileKey'];
  117.             $title $data['title'];
  118.             $description $data['description'];
  119.             $parentFolder DataObject::getByPath("/Head Office/Private/" $id);
  120.             if (!$parentFolder) {
  121.                 $parentFolder DataObject\Service::createFolderByPath("/Head Office/Private/" $id);
  122.             }
  123.             $newObject = new DataObject\HOFile();
  124.             $newObject->setKey($fileName);
  125.             $newObject->setParent($parentFolder);
  126.             $newObject->setTitle($title);
  127.             $newObject->setDescription($description);
  128.             $newObject->setPublished(true);
  129.             $newObject->save();
  130.             return new Response($newObject->getId());
  131.         }
  132.         return new Response(null);
  133.     }
  134.     /**
  135.      * @Route("/head-office/assets/read", name="template-hub-assets-read", methods={"GET"})
  136.      * 
  137.      * @param Request $request
  138.      * @return Response
  139.      */
  140.     public function headOfficeAssetReadAction(Request $request)
  141.     {
  142.         $loggedUser $this->getUser();
  143.         if (!$loggedUser) {
  144.             throw new UnauthorizedHttpException('Not authorized.');
  145.         }
  146.         $id $loggedUser->getId();
  147.         $parentFolder DataObject::getByPath("/Head Office/Private/" $id);
  148.         if ($parentFolder) {
  149.             $list = new DataObject\HOFile\Listing();
  150.             $list->setCondition("o_parentId = ?"$parentFolder->getId());
  151.             $list->load();
  152.             $list $list->getData();
  153.             $dataContent = [];
  154.             foreach ($list as $file) {
  155.                 $dataContent[] = [
  156.                     'title' => $file->getTitle(),
  157.                     'description' => $file->getDescription(),
  158.                     'id' => $file->getId(),
  159.                     'key' => $file->getKey()
  160.                 ];
  161.             };
  162.             return new Response(json_encode($dataContent));
  163.         }
  164.         return new Response(null);
  165.     }
  166.     /**
  167.      * @Route("/head-office/assets/delete", name="template-hub-assets-delete", methods={"POST"})
  168.      * 
  169.      * @param Request $request
  170.      * @return Response
  171.      */
  172.     public function headOfficeAssetDeleteAction(Request $request)
  173.     {
  174.         $loggedUser $this->getUser();
  175.         if (!$loggedUser) {
  176.             throw new UnauthorizedHttpException('Not authorized.');
  177.         }
  178.         $id $loggedUser->getId();
  179.         if ($request->getContent()) {
  180.             $data json_decode($request->getContent(), true);
  181.             $fileId $data['objectId'];
  182.             $object DataObject::getById($fileId);
  183.             $object->delete();
  184.             return new Response('File deleted');
  185.         }
  186.         return new Response(null);
  187.     }
  188.     /**
  189.      * @Route("/head-office/credentials/set-cognito", name="head-office-cognito", methods={"PATCH"})
  190.      * 
  191.      * @param Request $request
  192.      * @return Response
  193.      */
  194.     public function headOfficeSetVaultAction(Request $request)
  195.     {
  196.         $loggedUser $this->getUser();
  197.         if (!$loggedUser) {
  198.             throw new UnauthorizedHttpException('Not authorized.');
  199.         }
  200.         $id $loggedUser->getId();
  201.         if ($request->getContent()) {
  202.             $data json_decode($request->getContent(), true);
  203.             $cognito $data['cognitoConfirmed'];
  204.             $loggedUser->setCognitoConfirmed($cognito);
  205.             $loggedUser->save();
  206.             $response = new Response();
  207.             return $response->setContent(json_encode(['message' => 'OK']));
  208.         }
  209.         throw new BadRequestHttpException();
  210.     }
  211.     /**
  212.      * @Route("/head-office/credentials/set", name="head-office-credentials-set", methods={"PUT"}))
  213.      */
  214.     public function headOfficeSetCredentialsAction(Request $requestPermissionService $permissionProviderService $consentService)
  215.     {
  216.         $loggedUser $this->getUser();
  217.         if (!$loggedUser) {
  218.             throw new UnauthorizedHttpException('Not authorized.');
  219.         }
  220.         $data json_decode($request->getContent(), true);
  221.         $password $data['password'];
  222.         $cognito $data['cognito'];
  223.         $loggedUser->setPassword($password);
  224.         $loggedUser->setCognito($cognito);
  225.         $consentService->giveConsent($loggedUser"termsAndPolicy""Agreed with website's terms of use and privacy policy.");
  226.         try {
  227.             $loggedUser->save();
  228.             $response = new Response();
  229.             return $response->setContent(json_encode(['message' => 'OK']));
  230.         } catch (\Exception $e) {
  231.             throw new BadRequestHttpException($e);
  232.         }
  233.     }
  234.     /**
  235.      * @Route("/head-office/credentials/get", name="head-office-credentials", methods={"GET"}))
  236.      */
  237.     public function headOfficeCheckCredentialsAction(PermissionService $permissionProvider)
  238.     {
  239.         $loggedUser $this->getUser();
  240.         if (!$loggedUser) {
  241.             throw new UnauthorizedHttpException('Not authorized.');
  242.         }
  243.         $id $loggedUser->getId();
  244.         $role $loggedUser->getTypeOfUser();
  245.         $userData = [];
  246.         $cpdCycles = [];
  247.         foreach ($loggedUser->getCpdCycles() as $cycle) {
  248.             $cpdCycles[] = [
  249.                 'id' => $cycle->getId(),
  250.                 'startingDate' => $cycle->getStartDate(),
  251.                 'endDate' => $cycle->getEndDate(),
  252.                 'createdAt' => $cycle->getCreationDate(),
  253.                 'requiredHours' => $cycle->getRequiredHours()
  254.             ];
  255.         }
  256.         $permissions $permissionProvider->getPermissions($loggedUser);
  257.         $plans = [];
  258.         foreach ($loggedUser->getCpdPlans() as $cpdPlan) {
  259.             $plans[] = [
  260.                 'id' => $cpdPlan->getid(),
  261.                 'createdAt' => $cpdPlan->getCreationDate()
  262.             ];
  263.         }
  264.         $clinic $loggedUser->getClinic();
  265.         $clinicBranches = [];
  266.         foreach ($clinic->getBranches() as $branch) {
  267.             $clinicBranches[] = [
  268.                 'name' => $branch->getName(),
  269.                 'isMain' => $branch->getIsMain(),
  270.                 'id' => $branch->getId(),
  271.                 'isNew' => $branch->getIsNew()
  272.             ];
  273.         }
  274.         $role $loggedUser->getTypeOfUser();
  275.         $subscription $loggedUser->getSubscription();
  276.         $superuser $clinic->getSuperuser();
  277.         $includedSubs count($superuser->getIncludedSubscriptions());
  278.         if ($superuser->getSubscription()->getIsTrycareMembership()) {
  279.             $includedSubs TrycareMembership::getAdditionalSubscriptionsAmount($superuser->getSubscription()->getTrycareMemberId());
  280.         }
  281.         $userData = [
  282.             'id' => $id,
  283.             'role' => $loggedUser->getTypeOfUser(),
  284.             'cognito' => $loggedUser->getCognito(),
  285.             'email' => $loggedUser->getEmail(),
  286.             'clinicId' => $clinic->getName(),
  287.             'cognitoConfirmed' => $loggedUser->getCognitoConfirmed(),
  288.             'firstName' => $loggedUser->getFirstname(),
  289.             'lastName' => $loggedUser->getLastname(),
  290.             'displayName' => $loggedUser->getDisplayName(),
  291.             'profession' => $loggedUser->getProfession(),
  292.             'gdcNumber' => $loggedUser->getGdcNumber(),
  293.             'cpdCycles' => $cpdCycles,
  294.             'newAlert' => $loggedUser->getNewAlert(),
  295.             'permissions' => $permissions,
  296.             'licence' => [
  297.                 'endOfCycle' => $subscription->getExpiryDate(),
  298.                 'cancel' => $subscription->getCancelEndPeriod(),
  299.                 'cycleType' => $subscription->getBillingCycle(),
  300.                 'freeTrial' => $subscription->getIsFreeTrial(),
  301.                 'includedSubs' => $includedSubs
  302.             ],
  303.             'cpdPlans' => $plans,
  304.             'clinicBranches' => $clinicBranches,
  305.             'newsletter' => $loggedUser->getNewsletterActive(),
  306.             'isTrycareMembership' => $subscription->getIsTrycareMembership(),
  307.         ];
  308.         $response = new Response();
  309.         $response->headers->set('Content-Type''application/json');
  310.         $response->headers->set('Access-Control-Allow-Origin''*');
  311.         $response->setContent(json_encode($userData));
  312.         return $response;
  313.     }
  314.     /**
  315.      * @Route("/head-office/credentials/update", name="head-office-credentials-update", methods={"PUT"}))
  316.      */
  317.     public function headOfficeUpdateUserAction(Request $requestPermissionService $permissionProviderService $consentServiceUserHandler $userHandler)
  318.     {
  319.         $loggedUser $this->getUser();
  320.         if (!$loggedUser) {
  321.             throw new UnauthorizedHttpException('Not authorized.');
  322.         }
  323.         $content json_decode($request->getContent());
  324.         $form $this->createForm(ManageUserUpdateType::class);
  325.         $form->submit((array)$content);
  326.         if (!$form->isValid()) {
  327.             $errors = [];
  328.             foreach ($form->getErrors(deeptrueflattentrue) as $error) {
  329.                 $errors[] = $error->getMessage();
  330.             }
  331.             throw new BadRequestHttpException(json_encode($errors));
  332.         }
  333.         $data json_decode($request->getContent(), true);
  334.         if ($loggedUser->getTypeOfUser() === 'subuser' && $data['termsAndPolicy'] != true) {
  335.             throw new BadRequestHttpException('You must agree to our terms and policies.');
  336.         }
  337.         $clinic $loggedUser->getClinic();
  338.         //create main location
  339.         if (array_key_exists('firstLineAddress'$data)) {
  340.             $branch $userHandler->createBranch(['name' => $data['firstLineAddress'], 'isMain' => true], $clinic);
  341.             $clinic->setBranches([...$clinic->getBranches(), $branch]);
  342.         }
  343.         $loggedUser->setFirstname($data['firstname']);
  344.         $loggedUser->setLastname($data['lastname']);
  345.         $loggedUser->setProfession($data['profession']);
  346.         $loggedUser->setGdcNumber($data['gdcNumber']);
  347.         // $loggedUser->setPhone($data['contact']);
  348.         if (array_key_exists('termsAndPolicy'$data)) {
  349.             $consentService->giveConsent($loggedUser"termsAndPolicy""Agreed with website's terms of use and privacy policy.");
  350.         }
  351.         if (array_key_exists('dealsAndOffers'$data)) {
  352.             $consentMessage "Consent given for deals and offers";
  353.             $consentService->giveConsent($loggedUser"dealsAndOffers"$consentMessage);
  354.         }
  355.         if (array_key_exists('cognito'$data)) {
  356.             $loggedUser->setCognito($data['cognito']);
  357.         }
  358.         if (array_key_exists('displayName'$data)) {
  359.             $loggedUser->setDisplayName($data['displayName']);
  360.         }
  361.         if (array_key_exists('password'$data)) {
  362.             $loggedUser->setPassword($data['password']);
  363.         }
  364.         if ($loggedUser->getTypeOfUser() === 'superuser') {
  365.             if (array_key_exists('practiceName'$data)) {
  366.                 $clinic->setDisplayName($data['practiceName']);
  367.             }
  368.             if (array_key_exists('phone'$data)) {
  369.                 $clinic->setPhone($data['phone']);
  370.             }
  371.             $clinic->save();
  372.         }
  373.         try {
  374.             $loggedUser->save();
  375.             $response = new Response();
  376.             return $response->setContent(json_encode(['message' => 'OK']));
  377.         } catch (\Exception $e) {
  378.             throw new BadRequestHttpException($e);
  379.         }
  380.     }
  381.     /**
  382.      * @Route("/head-office/protocols/get", name="head-office-protocols-get", methods={"GET"}))
  383.      */
  384.     public function headOfficeGetProtocolsAction()
  385.     {
  386.         $loggedUser $this->getUser();
  387.         if (!$loggedUser) {
  388.             throw new UnauthorizedHttpException('Not authorized.');
  389.         }
  390.         $id $loggedUser->getId();
  391.         $protocols = [
  392.             'clinicalPractice',
  393.             'riskAssessments',
  394.             'decontaminationAndCleaning',
  395.             'wasteManagement',
  396.             'occupationalHazards',
  397.             'miscellaneous'
  398.         ];
  399.         $clinic $loggedUser->getClinic();
  400.         $clinicHealthSafetyProtocols = [];
  401.         foreach ($protocols as $protocol) {
  402.             $getter "get" ucwords($protocol);
  403.             $protocolDoc $clinic->$getter();
  404.             if (!empty($protocolDoc)) {
  405.                 $data = [];
  406.                 foreach ($protocolDoc as $doc) {
  407.                     $data[] = [
  408.                         'title' => $doc->getTitle(),
  409.                         'date' => $doc->getAddedDate(),
  410.                         'id' => $doc->getId(),
  411.                         'key' => $doc->getKey()
  412.                     ];
  413.                 }
  414.                 $clinicHealthSafetyProtocols[$protocol] = $data;
  415.             } else {
  416.                 $clinicHealthSafetyProtocols[$protocol] = null;
  417.             }
  418.         }
  419.         $response = new Response();
  420.         $response->headers->set('Content-Type''application/json');
  421.         $response->headers->set('Access-Control-Allow-Origin''*');
  422.         $response->setContent(json_encode($clinicHealthSafetyProtocols));
  423.         return $response;
  424.     }
  425.     /**
  426.      * @Route("/head-office/protocols/post", name="head-office-protocols-post", methods={"POST"})
  427.      * 
  428.      * @param Request $request
  429.      * @return Response
  430.      */
  431.     public function headOfficePostProtocolsAction(Request $requestPermissionService $permissionProvider)
  432.     {
  433.         $loggedUser $this->getUser();
  434.         if (!$loggedUser) {
  435.             throw new UnauthorizedHttpException('Not authorized.');
  436.         }
  437.         $permissionProvider->checkPermissions('teamHQ'$loggedUser);
  438.         if ($request->getContent()) {
  439.             $data json_decode($request->getContent(), true);
  440.             $fileName $data['fileKey'];
  441.             $title $data['title'];
  442.             $documentType $data['documentType'];
  443.             $clinic $loggedUser->getClinic();
  444.             $parentFolder DataObject::getByPath("/Companies/" $clinic->getName() . "/Protocol Documents");
  445.             if (!$parentFolder) {
  446.                 $parentFolder DataObject\Service::createFolderByPath("/Companies/" $clinic->getName() . "/Protocol Documents");
  447.             }
  448.             $currentDate date("d/m/Y");
  449.             $newObject = new DataObject\ProtocolDocument();
  450.             $newObject->setKey($fileName);
  451.             $newObject->setParent($parentFolder);
  452.             $newObject->setTitle($title);
  453.             $newObject->setAddedDate($currentDate);
  454.             $newObject->setPublished(true);
  455.             $newObject->save();
  456.             $getter "get" ucwords($documentType);
  457.             $setter "set" ucwords($documentType);
  458.             $currentDocs $clinic->$getter();
  459.             $clinic->$setter(array_merge($currentDocs, [$newObject]));
  460.             $clinic->save();
  461.             return new Response(json_encode($currentDocs));
  462.         }
  463.         return new Response(null);
  464.     }
  465.     /**
  466.      * @Route("/head-office/protocols/delete/{id}", name="head-office-protocols-delete", methods={"DELETE"})
  467.      * 
  468.      * @param Request $request
  469.      * @return Response
  470.      */
  471.     public function headOfficeProtocolsDeleteAction(Request $request$idPermissionService $permissionProvider)
  472.     {
  473.         $loggedUser $this->getUser();
  474.         if (!$loggedUser) {
  475.             throw new UnauthorizedHttpException('Not authorized.');
  476.         }
  477.         $permissionProvider->checkPermissions('teamHQ'$loggedUser);
  478.         $object DataObject::getById($id);
  479.         if ($object) {
  480.             $object->delete();
  481.             return new Response('File deleted');
  482.         }
  483.         throw new BadRequestHttpException();
  484.     }
  485.     public function filterForTags($tagIds)
  486.     {
  487.         $tagIds is_array($tagIds) ? $tagIds explode(','$tagIds);
  488.         $listing = new \Pimcore\Model\Asset\Listing();
  489.         if ($tagIds) {
  490.             $conditionParts = [];
  491.             foreach ($tagIds as $tagId) {
  492.                 $conditionParts[] = "id IN (SELECT cId FROM tags_assignment WHERE ctype = 'asset' AND tagid = " . (int) $tagId ")";
  493.             }
  494.             if (count($conditionParts) > 0) {
  495.                 $condition implode(" AND "$conditionParts);
  496.                 $listing->addConditionParam($condition);
  497.                 $listing->load();
  498.             }
  499.         }
  500.         return $listing;
  501.     }
  502.     /**
  503.      * @Route("/head-office/locker/", name="head-office-locker-get", methods={"GET"})
  504.      * 
  505.      * @param Request $request
  506.      * @return Response
  507.      */
  508.     public function headOfficeGetLockerAction()
  509.     {
  510.         $loggedUser $this->getUser();
  511.         if (!$loggedUser) {
  512.             throw new UnauthorizedHttpException('You must be logged in to use this service');
  513.         }
  514.         $clinic $loggedUser->getClinic();
  515.         $parentFolder DataObject::getByPath("/Companies/" $clinic->getName() . "/Locker");
  516.         $data = [];
  517.         if ($parentFolder) {
  518.             $list = new DataObject\LockerDocument\Listing();
  519.             $list->setCondition("o_parentId = ?"$parentFolder->getId());
  520.             $list->load();
  521.             $list $list->getData();
  522.             foreach ($list as $document) {
  523.                 $data[] = [
  524.                     'id' => $document->getId(),
  525.                     'key' => $document->getKey(),
  526.                     'title' => $document->getTitle(),
  527.                     'date' => $document->getAddedDate(),
  528.                     'documentKey' => $document->getDocumentKey(),
  529.                     'isPinned' => $document->getIsPinned(),
  530.                     'isMinutes' => $document->getIsMinutes()
  531.                 ];
  532.             }
  533.         }
  534.         return new Response(json_encode($data));
  535.     }
  536.     /**
  537.      * @Route("/head-office/locker/", name="head-office-locker-post", methods={"POST"})
  538.      * 
  539.      * @param Request $request
  540.      * @return Response
  541.      */
  542.     public function headOfficePostLockerAction(Request $requestPermissionService $permissionProviderNotificationService $notificationProvider)
  543.     {
  544.         $loggedUser $this->getUser();
  545.         if (!$loggedUser) {
  546.             throw new UnauthorizedHttpException('Not authorized.');
  547.         }
  548.         $permissionProvider->checkPermissions('teamHQ'$loggedUser);
  549.         if ($request->getContent()) {
  550.             $data json_decode($request->getContent(), true);
  551.             $clinic $loggedUser->getClinic();
  552.             $parentFolder DataObject::getByPath("/Companies/" $clinic->getName() . "/Locker");
  553.             if (!$parentFolder) {
  554.                 $parentFolder DataObject\Service::createFolderByPath("/Companies/" $clinic->getName() . "/Locker");
  555.             }
  556.             $title $data['title'];
  557.             $documentKey $data['documentKey'];
  558.             $key $data['documentKey'];
  559.             $isPinned $data['showHighlight'];
  560.             $isMinutes $data['isMinutes'];
  561.             $shouldNotify $data['showNotify'];
  562.             $currentDate date("d/m/Y");
  563.             $newObject = new DataObject\LockerDocument();
  564.             $newObject->setParent($parentFolder);
  565.             $newObject->setTitle($title);
  566.             $newObject->setAddedDate($currentDate);
  567.             $newObject->setDocumentKey($documentKey);
  568.             $newObject->setKey($key);
  569.             $newObject->setIsPinned($isPinned);
  570.             $newObject->setIsMinutes($isMinutes);
  571.             $newObject->setPublished(true);
  572.             $newObject->save();
  573.             if ($shouldNotify) {
  574.                 $superuser $loggedUser->getTypeOfUser() === 'superuser' $loggedUser $clinic->getSuperuser();
  575.                 $subusers $superuser->getSubusers();
  576.                 $allUsers = array(...$subusers$superuser);
  577.                 $message 'A new document "' $newObject->getTitle() . '" has been uploaded to the {%TeamHQ%}.';
  578.                 foreach ($allUsers as $user) {
  579.                     $notificationProvider->createNotification($user$message'team-lounge');
  580.                 }
  581.             }
  582.             $response = new Response();
  583.             return $response->setContent(json_encode(['message' => 'OK']));
  584.         }
  585.         return new Response(null);
  586.     }
  587.     /**
  588.      * @Route("/head-office/locker/{id}", name="head-office-locker-delete", methods={"DELETE"})
  589.      * 
  590.      * @param Request $request
  591.      * @return Response
  592.      */
  593.     public function headOfficeDeleteLockerAction(Request $request$idPermissionService $permissionProvider)
  594.     {
  595.         $loggedUser $this->getUser();
  596.         if (!$loggedUser) {
  597.             throw new UnauthorizedHttpException('Not authorized.');
  598.         }
  599.         $permissionProvider->checkPermissions('teamHQ'$loggedUser);
  600.         $practiceDocument DataObject::getById($id);
  601.         if (!is_null($practiceDocument)) {
  602.             $practiceDocument->delete();
  603.             return new Response('OK'Response::HTTP_OK);
  604.         }
  605.         throw new BadRequestHttpException();
  606.     }
  607.     /**
  608.      * @Route("/head-office/locker/unpin/{id}", name="head-office-locker-unpin", methods={"PUT"})
  609.      * 
  610.      * @param Request $request
  611.      * @return Response
  612.      */
  613.     public function headOfficeUnpinLockerAction(Request $request$idPermissionService $permissionProvider)
  614.     {
  615.         $loggedUser $this->getUser();
  616.         if (!$loggedUser) {
  617.             throw new UnauthorizedHttpException('Not authorized.');
  618.         }
  619.         $permissionProvider->checkPermissions('teamHQ'$loggedUser);
  620.         $practiceDocument DataObject::getById($id);
  621.         if (!is_null($practiceDocument)) {
  622.             $practiceDocument->setIsPinned(false);
  623.             $practiceDocument->save();
  624.             return new Response('OK'Response::HTTP_OK);
  625.         }
  626.         throw new BadRequestHttpException();
  627.     }
  628.     /**
  629.      * @Route("/head-office/locker/pin/{id}", name="head-office-locker-pin", methods={"PUT"})
  630.      * 
  631.      * @param Request $request
  632.      * @return Response
  633.      */
  634.     public function headOfficePinLockerAction(Request $request$idPermissionService $permissionProvider)
  635.     {
  636.         $loggedUser $this->getUser();
  637.         if (!$loggedUser) {
  638.             throw new UnauthorizedHttpException('Not authorized.');
  639.         }
  640.         $permissionProvider->checkPermissions('teamHQ'$loggedUser);
  641.         $practiceDocument DataObject::getById($id);
  642.         if (!is_null($practiceDocument)) {
  643.             $practiceDocument->setIsPinned(true);
  644.             $practiceDocument->save();
  645.             return new Response('OK'Response::HTTP_OK);
  646.         }
  647.         throw new BadRequestHttpException();
  648.     }
  649.     /**
  650.      * @Route("/head-office/team-message/", name="head-office-locker-teammessage-put", methods={"PUT"})
  651.      * 
  652.      * @param Request $request
  653.      * @return Response
  654.      */
  655.     public function headOfficePutTeamMessageAction(Request $requestPermissionService $permissionProvider)
  656.     {
  657.         $loggedUser $this->getUser();
  658.         if (!$loggedUser) {
  659.             throw new UnauthorizedHttpException('Not authorized.');
  660.         }
  661.         $permissionProvider->checkPermissions('teamHQ'$loggedUser);
  662.         if ($request->getContent()) {
  663.             $data json_decode($request->getContent(), true);
  664.             $id $loggedUser->getId();
  665.             $clinic $loggedUser->getClinic();
  666.             $customerMessageArea $data['customerMessageArea'];
  667.             $teamMessageArea $data['teamMessageArea'];
  668.             $clinic->setTeamMessageArea($teamMessageArea);
  669.             $clinic->setCustomerMessageArea($customerMessageArea);
  670.             $clinic->save();
  671.             return new Response('OK'Response::HTTP_OK);
  672.         }
  673.     }
  674.     /**
  675.      * @Route("/head-office/team-message/", name="head-office-teammessage-get", methods={"GET"})
  676.      * 
  677.      * @param Request $request
  678.      * @return Response
  679.      */
  680.     public function headOfficeGetTeamMessageAction(Request $request)
  681.     {
  682.         $loggedUser $this->getUser();
  683.         if (!$loggedUser) {
  684.             throw new UnauthorizedHttpException('Not authorized.');
  685.         }
  686.         $id $loggedUser->getId();
  687.         $clinic $loggedUser->getClinic();
  688.         $data = [
  689.             'customerMessage' => $clinic->getCustomerMessageArea(),
  690.             'teamMessage' => $clinic->getTeamMessageArea(),
  691.         ];
  692.         return new Response(json_encode(['messages' => $data]));
  693.     }
  694.     /**
  695.      * @Route("/head-office/our-team/document/request", name="our-team-create-request", methods={"POST"})
  696.      * 
  697.      * @param Request $request
  698.      * @return Response
  699.      */
  700.     public function headOfficeCreateDocumentRequestAction(Request $requestToolsService $toolsProvider)
  701.     {
  702.         $loggedUser $this->getUser();
  703.         if (!$loggedUser) {
  704.             throw new UnauthorizedHttpException('Not authorized.');
  705.         }
  706.         $data json_decode($request->getContent(), true);
  707.         $user DataObject\Customer::getByID($data['user']);
  708.         $toolsProvider->createUserTask($user$data['description'], 'userDocument');
  709.         return new Response('OK'Response::HTTP_OK);
  710.     }
  711.     /**
  712.      * @Route("/head-office/our-team/documents", name="our-team-upload-doc", methods={"POST"})
  713.      * 
  714.      * @param Request $request
  715.      * @return Response
  716.      */
  717.     public function headOfficeUploadDocumentAction(Request $requestHeadOfficeService $hoService)
  718.     {
  719.         $loggedUser $this->getUser();
  720.         if (!$loggedUser) {
  721.             throw new UnauthorizedHttpException('Not authorized.');
  722.         }
  723.         $data json_decode($request->getContent(), true);
  724.         if (empty($data['documentKey']) || empty($data['name']) || empty($data['ownerId'])) {
  725.             throw new BadRequestHttpException('File and name are required');
  726.         }
  727.         $owner DataObject\Customer::getById($data['ownerId']);
  728.         $hoService->createUserDocument($data$owner$loggedUser);
  729.         return new Response('OK'Response::HTTP_OK);
  730.     }
  731.     /**
  732.      * @Route("/head-office/our-team/documents/{id}", name="our-team-delete-doc", methods={"DELETE"})
  733.      * 
  734.      * @param Request $request
  735.      * @return Response
  736.      */
  737.     public function headOfficeDeleteDocumentAction($idRequest $requestHeadOfficeService $hoService)
  738.     {
  739.         $loggedUser $this->getUser();
  740.         if (!$loggedUser) {
  741.             throw new UnauthorizedHttpException('Not authorized.');
  742.         }
  743.         //check if is owner
  744.         $doc DataObject\UserDocument::getById($id);
  745.         if (!$doc || $doc->getOwner() !== $loggedUser) {
  746.             throw new NotFoundHttpException('Document not found');
  747.         }
  748.         $doc->delete();
  749.         return new Response('OK'Response::HTTP_OK);
  750.     }
  751.     /**
  752.      * This method retrieves users removed from a clinic from the dashboard, the criteria to identify such users is determined
  753.      * by active (false), clinic (still part of a clinic), no subscription and no parent user
  754.      * 
  755.      * @Route("/head-office/our-team/users/inactive", name="our-team-get-inactive-users", methods={"GET"})
  756.      * 
  757.      * @param Request $request
  758.      * @return Response
  759.      */
  760.     public function headOfficeGetInactiveUsersAction(GeneralService $generalProviderPermissionService $permissionProviderHeadOfficeService $hoService)
  761.     {
  762.         $loggedUser $this->getUser();
  763.         if (!$loggedUser) {
  764.             throw new UnauthorizedHttpException('Not authorized.');
  765.         }
  766.         $permissionProvider->checkPermissions('management'$loggedUser);
  767.         $clinic $loggedUser->getClinic();
  768.         $inactiveUsers $hoService->getInactiveClinicUsers($clinic);
  769.         $inactiveUsersData $generalProvider->getUsersData($inactiveUsers);
  770.         $response = new Response();
  771.         $response->setContent(json_encode(['users' => $inactiveUsersData]));
  772.         return $response;
  773.     }
  774.     /**
  775.      * @Route("/head-office/our-team/users/prorata/{contractId}", name="calculate-user-leave", methods={"GET"})
  776.      * 
  777.      * @param Request $request
  778.      * @return Response
  779.      */
  780.     public function headOfficeGetProRataUserAction(
  781.         $contractId,
  782.         HeadOfficeService $hoService,
  783.         PermissionService $permissionProvider,
  784.         Request $request
  785.     ) {
  786.         $loggedUser $this->getUser();
  787.         if (!$loggedUser) {
  788.             throw new UnauthorizedHttpException('Not authorized.');
  789.         }
  790.         $permissionProvider->checkPermissions('management'$loggedUser);
  791.         $contract DataObject\EmployeeContractDetails::getById($contractId);
  792.         if (!$contract) {
  793.             throw new BadRequestHttpException('Contract not valid');
  794.         }
  795.         $user $contract->getUser();
  796.         if (!$user) {
  797.             throw new BadRequestHttpException('User id not valid');
  798.         }
  799.         if ($user->getClinic() !== $loggedUser->getClinic()) {
  800.             throw new UnauthorizedHttpException('Not authorized');
  801.         }
  802.         $endDate $request->query->get('endDate');
  803.         if (!$endDate) {
  804.             throw new BadRequestHttpException('No end date provided');
  805.         }
  806.         $prorata $hoService->getTotalHolidaysProRata($contract$userCarbon::parse($endDate));
  807.         $response = new Response();
  808.         $response->headers->set('Content-Type''application/json');
  809.         $response->headers->set('Access-Control-Allow-Origin''*');
  810.         $data = [
  811.             'prorata' => $prorata
  812.         ];
  813.         $response->setContent(json_encode($data));
  814.         return $response;
  815.     }
  816.     /**
  817.      * @Route("/head-office/our-team/users/{userId}", name="our-team-get-user", methods={"GET"})
  818.      * 
  819.      * @param Request $request
  820.      * @return Response
  821.      */
  822.     public function headOfficeGetUserAction($userIdHeadOfficeService $hoServicePermissionService $permissionProvider)
  823.     {
  824.         $loggedUser $this->getUser();
  825.         if (!$loggedUser) {
  826.             throw new UnauthorizedHttpException('Not authorized.');
  827.         }
  828.         //TODO remove comments
  829.         //check permission if not getting own info
  830.         // if ($userId != $loggedUser->getId()) {
  831.         //     $permissionProvider->checkPermissions('management', $loggedUser);
  832.         // }
  833.         $user DataObject\Customer::getById($userId);
  834.         $docs $hoService->getUserDocs($userId);
  835.         $clinic $loggedUser->getClinic();
  836.         $policy $hoService->getHolidayPolicyData($hoService->getHolidayPolicyByClinic($clinic));
  837.         //TODO The contract should be the relevant contract for the period, not specifically the last
  838.         $employeeContractDetails $hoService->getUserLastCreatedContract($user);
  839.         $employeeContractDetailsData $employeeContractDetails
  840.             $hoService->getEmployeeContractDetailsData($employeeContractDetails)
  841.             : null;
  842.         $workPeriods $employeeContractDetailsData $hoService->getContractWorkPeriods($employeeContractDetails) : [];
  843.         $contracts $hoService->getUserContracts($user);
  844.         $contractsData array_map(function ($contract) use ($hoService) {
  845.             $data $hoService->getEmployeeContractDetailsData($contract);
  846.             $data['workPeriods'] = $hoService->getContractWorkPeriods($contract);
  847.             return $data;
  848.         }, $contracts);
  849.         $response = new Response();
  850.         $response->headers->set('Content-Type''application/json');
  851.         $response->headers->set('Access-Control-Allow-Origin''*');
  852.         $data = [
  853.             'id' => $userId,
  854.             'documents' => $docs,
  855.             /* 'clinic policy' => $policy, */
  856.             'contractDetails' => $employeeContractDetailsData,
  857.             'contracts' => $contractsData,
  858.             'workPeriods' => $workPeriods,
  859.             'amendments' => $hoService->getAmendmentsByUser($user),
  860.             'holidayDetails' => $employeeContractDetailsData
  861.                 $hoService->getUserHolidayDetails($user$hoService->getHolidayPolicyByClinic($user->getClinic())) : null //only retrieves when contract is set
  862.         ];
  863.         $response->setContent(json_encode($data));
  864.         return $response;
  865.     }
  866.     /**
  867.      * @Route("/head-office/our-team/users/{userId}/contracts", name="our-team-post-user", methods={"POST"})
  868.      * 
  869.      * @param Request $request
  870.      * @return Response
  871.      */
  872.     public function headOfficePostUserAction(
  873.         $userId,
  874.         Request $request,
  875.         HeadOfficeService $hoService,
  876.         PermissionService $permissionProvider
  877.     ) {
  878.         $loggedUser $this->getUser();
  879.         if (!$loggedUser) {
  880.             throw new UnauthorizedHttpException('Not authorized.');
  881.         }
  882.         //check permission
  883.         $permissionProvider->checkPermissions('management'$loggedUser);
  884.         $user DataObject\Customer::getById($userId);
  885.         if (!$user) {
  886.             throw new BadRequestHttpException('User id not valid');
  887.         }
  888.         if ($user->getClinic() !== $loggedUser->getClinic()) {
  889.             throw new UnauthorizedHttpException('Not authorized');
  890.         }
  891.         $payload json_decode($request->getContent(), true);
  892.         $contracts $hoService->getUserContracts($user);
  893.         
  894.         $lastCreatedContract $hoService->getUserLastCreatedContract($user);
  895.         $contract $lastCreatedContract;
  896.         $today Carbon::now()->toDateString();
  897.         $lastEffectiveDate $lastCreatedContract $lastCreatedContract->getEffectiveDate() : null;
  898.         //if the last saved contract is today, we just update it, do not create a new contract
  899.         if (!$lastEffectiveDate || $lastEffectiveDate->toDateString() != $today) {
  900.             $contract $hoService->createEmployeeContractDetails($user);
  901.         }
  902.         if ($lastCreatedContract) {
  903.             $payload['hiringDate'] = $lastCreatedContract->getHiringDate();
  904.         } else {
  905.             $payload['hiringDate'] = Carbon::parse($payload['hiringDate']);
  906.         }
  907.         $hoService->updateEmployeeContractDetails($payload$contract);
  908.         $hoService->saveWorkPeriods($payload['workPeriods'], $contract);
  909.         $response = new Response();
  910.         $response->headers->set('Content-Type''application/json');
  911.         $response->headers->set('Access-Control-Allow-Origin''*');
  912.         return $response->setContent(json_encode(['id' => $contract->getId()]));
  913.     }
  914.     /**
  915.      * @Route("/head-office/our-team/users/{userId}/contracts/{contractId}", name="our-team-put-user", methods={"PUT"})
  916.      * 
  917.      * @param Request $request
  918.      * @return Response
  919.      */
  920.     public function headOfficePutUserAction($userId$contractIdRequest $requestHeadOfficeService $hoServicePermissionService $permissionProvider)
  921.     {
  922.         $loggedUser $this->getUser();
  923.         if (!$loggedUser) {
  924.             throw new UnauthorizedHttpException('Not authorized.');
  925.         }
  926.         //check permission
  927.         $permissionProvider->checkPermissions('management'$loggedUser);
  928.         $user DataObject\Customer::getById($userId);
  929.         $contract DataObject\EmployeeContractDetails::getById($contractId);
  930.         if (!$user || !$contract || $contract->getUser()->getId() != $user->getId()) {
  931.             throw new BadRequestHttpException('Contract not found');
  932.         }
  933.         if ($user->getClinic() !== $loggedUser->getClinic()) {
  934.             throw new UnauthorizedHttpException('Not authorized');
  935.         }
  936.         $payload json_decode($request->getContent(), true);
  937.         if (isset($payload['workPeriods'])) {
  938.             $hoService->saveWorkPeriods($payload['workPeriods'], $contract);
  939.         }
  940.         if (isset($payload['reportTo'])) {
  941.             $hoService->updateContractReportTo($contract$payload['reportTo']);
  942.             $contract->save();
  943.         }
  944.         if (!empty($payload['endDate'])) {
  945.             $hoService->updateContractEndDate($contract$payload['endDate']);
  946.         }
  947.         
  948.         return new Response('OK'Response::HTTP_OK);
  949.     }
  950.     /**
  951.      * @Route("/head-office/our-team/users/history/{userId}", name="our-team-get-user-history", methods={"GET"})
  952.      * 
  953.      * @param Request $request
  954.      * @return Response
  955.      */
  956.     public function headOfficeGetUserHolidayHistoryAction(
  957.         $userId,
  958.         HeadOfficeService $hoService,
  959.         PermissionService $permissionProvider,
  960.         Request $request
  961.     ) {
  962.         $loggedUser $this->getUser();
  963.         if (!$loggedUser) {
  964.             throw new UnauthorizedHttpException('Not authorized.');
  965.         }
  966.         //check permission if not getting own info
  967.         if ($userId != $loggedUser->getId()) {
  968.             $permissionProvider->checkPermissions('management'$loggedUser);
  969.         }
  970.         $user DataObject\Customer::getById($userId);
  971.         if (!$user) {
  972.             throw new BadRequestHttpException('User id not valid');
  973.         }
  974.         if ($user->getClinic() !== $loggedUser->getClinic()) {
  975.             throw new UnauthorizedHttpException('Not authorized');
  976.         }
  977.         $yearAgo = (int)$request->query->get('year');
  978.         if (!$yearAgo) {
  979.             $yearAgo 1;
  980.         }
  981.         [$events$limit$yearAgo] = $hoService->getUserHolidaysEvents($user$yearAgo);
  982.         $response = new Response();
  983.         $response->headers->set('Content-Type''application/json');
  984.         $response->headers->set('Access-Control-Allow-Origin''*');
  985.         $response->setContent(json_encode(['history' => $events'limit' => $limit'year' => $yearAgo]));
  986.         return $response;
  987.     }
  988.     /**
  989.      * @Route("/head-office/our-team/policies", name="create-our-team-policies", methods={"POST"})
  990.      * 
  991.      * @param Request $request
  992.      * @return Response
  993.      */
  994.     public function headOfficeCreatePolicyAction(Request $requestPermissionService $permissionProviderHeadOfficeService $hoService)
  995.     {
  996.         $loggedUser $this->getUser();
  997.         if (!$loggedUser) {
  998.             throw new UnauthorizedHttpException('Not authorized.');
  999.         }
  1000.         //check permission
  1001.         $permissionProvider->checkPermissions('management'$loggedUser);
  1002.         $clinic $loggedUser->getClinic();
  1003.         $policy $hoService->createOrUpdateHolidayPolicy(json_decode($request->getContent(), true), $clinic);
  1004.         $clinic->setHolidayPolicy($policy);
  1005.         $clinic->save();
  1006.         return new Response('OK'Response::HTTP_OK);
  1007.     }
  1008.     /**
  1009.      * @Route("/head-office/our-team/policies", name="get-our-team-policies", methods={"GET"})
  1010.      * 
  1011.      * @param Request $request
  1012.      * @return Response
  1013.      */
  1014.     public function headOfficeGetPolicyAction(PermissionService $permissionProviderHeadOfficeService $hoService)
  1015.     {
  1016.         $loggedUser $this->getUser();
  1017.         if (!$loggedUser) {
  1018.             throw new UnauthorizedHttpException('Not authorized.');
  1019.         }
  1020.         $clinic $loggedUser->getClinic();
  1021.         $policy $hoService->getHolidayPolicyData($hoService->getHolidayPolicyByClinic($clinic));
  1022.         $response = new Response();
  1023.         $response->headers->set('Content-Type''application/json');
  1024.         $response->headers->set('Access-Control-Allow-Origin''*');
  1025.         $response->setContent(json_encode(['policy' => $policy]));
  1026.         return $response;
  1027.     }
  1028.     /**
  1029.      * @Route("/head-office/our-team/policies/{id}", name="update-our-team-policies", methods={"PUT"})
  1030.      * 
  1031.      * @param Request $request
  1032.      * @return Response
  1033.      */
  1034.     public function headOfficeUpdatePolicyAction($idRequest $requestPermissionService $permissionProviderHeadOfficeService $hoServiceGeneralService $generalProvider)
  1035.     {
  1036.         $loggedUser $this->getUser();
  1037.         if (!$loggedUser) {
  1038.             throw new UnauthorizedHttpException('Not authorized.');
  1039.         }
  1040.         //check permission
  1041.         $permissionProvider->checkPermissions('management'$loggedUser);
  1042.         $clinic $loggedUser->getClinic();
  1043.         //check ownership
  1044.         if ($hoService->getHolidayPolicyByClinic($clinic)->getId() != $id) {
  1045.             throw new UnauthorizedHttpException('Not allowed');
  1046.         }
  1047.         $policy $hoService->createOrUpdateHolidayPolicy(json_decode($request->getContent(), true), $clinic$id);
  1048.         $clinic->setHolidayPolicy($policy);
  1049.         return new Response('OK'Response::HTTP_OK);
  1050.     }
  1051.     /**
  1052.      * @Route("/head-office/our-team/holiday-enrollment", name="get-our-team-holiday-enrollment", methods={"GET"})
  1053.      * 
  1054.      * @param Request $request
  1055.      * @return Response
  1056.      */
  1057.     public function headOfficeGetEnrollmentsAction(PermissionService $permissionProviderHeadOfficeService $hoServiceGeneralService $generalProvider)
  1058.     {
  1059.         $loggedUser $this->getUser();
  1060.         if (!$loggedUser) {
  1061.             throw new UnauthorizedHttpException('Not authorized.');
  1062.         }
  1063.         //check permission
  1064.         $permissionProvider->checkPermissions('management'$loggedUser);
  1065.         $clinic $loggedUser->getClinic();
  1066.         $allsetUsers $hoService->getClinicHolidayEnrolledUsers($clinic);
  1067.         $data = [];
  1068.         foreach ($allsetUsers as $user) {
  1069.             $data[] = $generalProvider->getUserData($user);
  1070.         }
  1071.         $response = new Response();
  1072.         $response->headers->set('Content-Type''application/json');
  1073.         $response->headers->set('Access-Control-Allow-Origin''*');
  1074.         $response->setContent(json_encode(['users' => $data]));
  1075.         return $response;
  1076.     }
  1077.     /**
  1078.      * @Route("/head-office/our-team/amendments/{userId}", name="create-holiday-amendment", methods={"POST"})
  1079.      * 
  1080.      * @param Request $request
  1081.      * @return Response
  1082.      */
  1083.     public function headOfficeCreateAmendmentAction(
  1084.         $userId,
  1085.         Request $request,
  1086.         PermissionService $permissionProvider,
  1087.         HeadOfficeService $hoService,
  1088.         EventDispatcherInterface $dispatcher,
  1089.     ) {
  1090.         $loggedUser $this->getUser();
  1091.         if (!$loggedUser) {
  1092.             throw new UnauthorizedHttpException('Not authorized.');
  1093.         }
  1094.         //check permission
  1095.         $permissionProvider->checkPermissions('management'$loggedUser);
  1096.         $user DataObject\Customer::getById($userId);
  1097.         if (!$user) {
  1098.             throw new BadRequestHttpException('User id not valid');
  1099.         }
  1100.         if ($user->getClinic() !== $loggedUser->getClinic()) {
  1101.             throw new UnauthorizedHttpException('Not authorized');
  1102.         }
  1103.         $employeeContractDetails $hoService->getUserLastCreatedContract($user);
  1104.         if (!$employeeContractDetails) {
  1105.             throw new BadRequestHttpException('Employee contract is not set');
  1106.         }
  1107.         $payload json_decode($request->getContent(), true);
  1108.         $payload['adjustmentBase'] = $hoService->getHolidayPolicyByClinic($user->getClinic())->getHolidayEntitlementBase();
  1109.         $amendment $hoService->createHolidayAmendment($user$payload$loggedUser);
  1110.         $amendmentDetails $hoService->getAmendmentDetails($amendment);
  1111.         $msg $hoService->createHolidayMessage('amendmentCreated'$amendmentDetails);
  1112.         //create a new event to notify
  1113.         $event = new HolidayEvent([
  1114.             'recipients' => [$amendment->getEmployee()],
  1115.             'msg' => $msg,
  1116.             'id' => $userId
  1117.         ]);
  1118.         $dispatcher->dispatch($event'holiday.onAmendmentCreated');
  1119.         return new Response('OK'Response::HTTP_OK);
  1120.     }
  1121.     /**
  1122.      * @Route("/head-office/our-team/requests/{userId}", name="create-holiday-request", methods={"POST"})
  1123.      * 
  1124.      * @param Request $request
  1125.      * @return Response
  1126.      */
  1127.     public function headOfficeCreateHolidayRequestAction(
  1128.         $userId,
  1129.         Request $request,
  1130.         HeadOfficeService $hoService,
  1131.         EventDispatcherInterface $dispatcher,
  1132.     ) {
  1133.         $loggedUser $this->getUser();
  1134.         if (!$loggedUser) {
  1135.             throw new UnauthorizedHttpException('Not authorized.');
  1136.         }
  1137.         $user DataObject\Customer::getById($userId);
  1138.         if (!$user) {
  1139.             throw new UnauthorizedHttpException('User id not valid');
  1140.         }
  1141.         if ($user->getClinic() !== $loggedUser->getClinic()) {
  1142.             throw new UnauthorizedHttpException('Not authorized');
  1143.         }
  1144.         $policy $hoService->getHolidayPolicyByClinic($user->getClinic());
  1145.         $payload json_decode($request->getContent(), true);
  1146.         $type $payload['type'];
  1147.         //check if request includes a bank holiday
  1148.         $startDate Carbon::parse($payload['start']);
  1149.         $endDate $type === 'days' Carbon::parse($payload['end']) : $startDate->clone();
  1150.         $hours $payload['hours'];
  1151.         $intersectBankHolidays $hoService->getBankHolidaysFromInterval($startDate$endDate$policy->getApplicableBankHoliday());
  1152.         $processedRequests $hoService->separateRequestsByBankHolidays($intersectBankHolidays$startDate$endDate$type);
  1153.         $contract $hoService->getUserLastCreatedContract($user);
  1154.         $holidayEntitlementType $policy->getHolidayEntitlementBase();
  1155.         // if holiday entitlement is based in hours and type is period, should add hours to processed request
  1156.         if ($holidayEntitlementType === 'hours' && $type === 'period') {
  1157.             $processedRequests array_map(function ($req) use ($hours) {
  1158.                 $req['hours'] = $hours;
  1159.                 return $req;
  1160.             }, $processedRequests);
  1161.         }
  1162.         //check clinic policy to see if holidays cannot be negative
  1163.         if (!$policy->getHolidayCounterNegative() && $payload['category'] == 'holiday') {
  1164.             $exceedsAvailable $hoService->checkRequestsExceedAvailableHolidays($user$processedRequests);
  1165.             if ($exceedsAvailable) {
  1166.                 throw new BadRequestHttpException('Your request period exceeds holidays available.');
  1167.             }
  1168.         }
  1169.         foreach ($processedRequests as $processedRequest) {
  1170.             $data = [
  1171.                 'start' => $processedRequest['start'],
  1172.                 'end' => $processedRequest['end'],
  1173.                 'type' => $processedRequest['type'],
  1174.                 'description' => $payload['description'],
  1175.                 'category' => $payload['category'],
  1176.                 'period' => !empty($payload['category']) ? $payload['category'] : '',
  1177.                 'hours' => !empty($processedRequest['hours']) ? $processedRequest['hours'] : ''
  1178.             ];
  1179.             $request $hoService->createHolidayRequest($user$data$loggedUser);
  1180.             $requestDetails $hoService->getHolidayRequestDetails('requestCreated'$request$holidayEntitlementType === 'hours');
  1181.             $msg $hoService->createHolidayMessage('requestCreated'$requestDetails);
  1182.             //create a new event to notify
  1183.             $event = new HolidayEvent([
  1184.                 'recipients' => $contract->getReportTo(),
  1185.                 'msg' => $msg,
  1186.                 'id' => $userId
  1187.             ]);
  1188.             $dispatcher->dispatch($event'holiday.onRequestCreated');
  1189.         }
  1190.         return new Response('OK'Response::HTTP_OK);
  1191.     }
  1192.     /**
  1193.      * @Route("/head-office/our-team/requests/{id}", name="update-holiday-request", methods={"PUT"})
  1194.      * 
  1195.      * @param Request $request
  1196.      * @return Response
  1197.      */
  1198.     public function headOfficeUpdateRequestAction(
  1199.         $id,
  1200.         Request $request,
  1201.         HeadOfficeService $hoService,
  1202.         EventDispatcherInterface $dispatcher,
  1203.     ) {
  1204.         $loggedUser $this->getUser();
  1205.         if (!$loggedUser) {
  1206.             throw new UnauthorizedHttpException('Not authorized.');
  1207.         }
  1208.         $holidayRequest DataObject\HolidayRequest::getById($id);
  1209.         $employee $holidayRequest->getEmployee();
  1210.         $contract $hoService->getUserLastCreatedContract($employee);
  1211.         $reportedUsers $contract->getReportTo();
  1212.         //only users or the person who the user reports to are able to update
  1213.         if (!$holidayRequest || ($employee != $loggedUser && !in_array($loggedUser$reportedUsers))) {
  1214.             throw new BadRequestHttpException('Request not found');
  1215.         }
  1216.         $payload json_decode($request->getContent(), true);
  1217.         //approvals are only updated by reported user
  1218.         if (in_array($loggedUser$reportedUsers) && isset($payload['approved'])) {
  1219.             $status $payload['approved'] ? 'approved' 'rejected';
  1220.             $hoService->updateHolidayRequestStatus(
  1221.                 $holidayRequest,
  1222.                 $holidayRequest->getStatus(),
  1223.                 $status,
  1224.                 $loggedUser,
  1225.                 $payload['rejectReason']
  1226.             );
  1227.         }
  1228.         $holidayRequest->save();
  1229.         $eventType $holidayRequest->getStatus() === 'approved'
  1230.             'requestAccepted' : ($holidayRequest->getStatus() === 'rejected' 'requestRejected' null);
  1231.         if ($eventType) {
  1232.             $policy $hoService->getHolidayPolicyByClinic($employee->getClinic());
  1233.             $holidayEntitlementType $policy->getHolidayEntitlementBase();
  1234.             $requestDetails $hoService->getHolidayRequestDetails($eventType$holidayRequest$holidayEntitlementType === 'hours');
  1235.             $msg $hoService->createHolidayMessage($eventType$requestDetails);
  1236.             //create a new event to notify
  1237.             $event = new HolidayEvent([
  1238.                 'recipients' => [$holidayRequest->getEmployee()],
  1239.                 'msg' => $msg,
  1240.                 'id' => $employee->getId()
  1241.             ]);
  1242.             $dispatcher->dispatch($event'holiday.on' ucfirst($eventType));
  1243.         }
  1244.         return new Response('OK'Response::HTTP_OK);
  1245.     }
  1246.     /**
  1247.      * @Route("/head-office/our-team/requests/{id}", name="delete-holiday-request", methods={"DELETE"})
  1248.      * 
  1249.      * @param Request $request
  1250.      * @return Response
  1251.      */
  1252.     public function headOfficeDeleteRequestAction($id)
  1253.     {
  1254.         $loggedUser $this->getUser();
  1255.         if (!$loggedUser) {
  1256.             throw new UnauthorizedHttpException('Not authorized.');
  1257.         }
  1258.         $holidayRequest DataObject\HolidayRequest::getById($id);
  1259.         $employee $holidayRequest->getEmployee();
  1260.         //only owners can delete their own requests
  1261.         if (!$holidayRequest || $employee != $loggedUser) {
  1262.             throw new BadRequestHttpException('Request not found');
  1263.         }
  1264.         $today Carbon::now();
  1265.         $requestStart Carbon::parse($holidayRequest->getStart());
  1266.         if ($today->gt($requestStart)) {
  1267.             throw new BadRequestHttpException('It is a past request');
  1268.         }
  1269.         $holidayRequest->delete();
  1270.         return new Response('OK'Response::HTTP_OK);
  1271.     }
  1272.     /**
  1273.      * @Route("/head-office/our-team/requests", name="create-multiple-holiday-request", methods={"POST"})
  1274.      * 
  1275.      * @param Request $request
  1276.      * @return Response
  1277.      */
  1278.     public function headOfficeCreateMultipleHolidaysRequestAction(
  1279.         Request $request,
  1280.         HeadOfficeService $hoService,
  1281.         EventDispatcherInterface $dispatcher,
  1282.         PermissionService $permissionProvider
  1283.     ) {
  1284.         $loggedUser $this->getUser();
  1285.         if (!$loggedUser) {
  1286.             throw new UnauthorizedHttpException('Not authorized.');
  1287.         }
  1288.         $permissionProvider->checkPermissions('management'$loggedUser);
  1289.         $policy $hoService->getHolidayPolicyByClinic($loggedUser->getClinic());
  1290.         $payload json_decode($request->getContent(), true);
  1291.         $type "days";
  1292.         //check if request includes a bank holiday
  1293.         $startDate Carbon::parse($payload['start']);
  1294.         $endDate Carbon::parse($payload['end']);
  1295.         $intersectBankHolidays $hoService->getBankHolidaysFromInterval($startDate$endDate$policy->getApplicableBankHoliday());
  1296.         $processedRequests $hoService->separateRequestsByBankHolidays($intersectBankHolidays$startDate$endDate$type);
  1297.         foreach ($payload['users'] as $userId => $shouldCreate) {
  1298.             $user DataObject\Customer::getById($userId);
  1299.             if (!$shouldCreate || $user->getClinic() !== $loggedUser->getClinic()) {
  1300.                 continue;
  1301.             }
  1302.             $contract $hoService->getUserLastCreatedContract($user);
  1303.             $holidayEntitlementType $policy->getHolidayEntitlementBase();
  1304.             foreach ($processedRequests as $processedRequest) {
  1305.                 $data = [
  1306.                     'start' => $processedRequest['start'],
  1307.                     'end' => $processedRequest['end'],
  1308.                     'type' => $processedRequest['type'],
  1309.                     'description' => $payload['description'],
  1310.                     'category' => 'holiday'
  1311.                 ];
  1312.                 $request $hoService->createHolidayRequest($user$data$loggedUser);
  1313.                 $request->setStatus('approved'); //it's approved straight away
  1314.                 $request->save();
  1315.                 $requestDetails $hoService->getHolidayRequestDetails('requestCreated'$request$holidayEntitlementType === 'hours');
  1316.                 $msg $hoService->createHolidayMessage('requestCreated'$requestDetails);
  1317.                 //create a new event to notify
  1318.                 $event = new HolidayEvent([
  1319.                     'recipients' => $contract->getReportTo(),
  1320.                     'msg' => $msg,
  1321.                     'id' => $userId
  1322.                 ]);
  1323.                 $dispatcher->dispatch($event'holiday.onRequestCreated');
  1324.             }
  1325.         }
  1326.         return new Response('OK'Response::HTTP_OK);
  1327.     }
  1328.     /**
  1329.      * @Route("/head-office/our-team/leaves", name="get-clinic-leaves", methods={"GET"})
  1330.      * 
  1331.      * @param Request $request
  1332.      * @return Response
  1333.      */
  1334.     public function headOfficeClinicLeavesAction(HeadOfficeService $hoServicePermissionService $permissionProviderGeneralService $generalProvider)
  1335.     {
  1336.         $loggedUser $this->getUser();
  1337.         if (!$loggedUser) {
  1338.             throw new UnauthorizedHttpException('Not authorized.');
  1339.         }
  1340.         $teamUsers = [];
  1341.         if ($loggedUser->getTypeOfUser() == 'subuser') {
  1342.             $teamUsers = [$loggedUser];
  1343.         } else {
  1344.             $teamUsers $hoService->getReporteesByManager($loggedUser);
  1345.         }
  1346.         $policy $hoService->getHolidayPolicyByClinic($loggedUser->getClinic());
  1347.         $leaves $hoService->getReporteeLeaves($teamUsers$policy->getHolidayEntitlementBase());
  1348.         $response = new Response();
  1349.         $response->headers->set('Content-Type''application/json');
  1350.         $response->headers->set('Access-Control-Allow-Origin''*');
  1351.         $response->setContent(json_encode(['teamLeaves' => $leaves'reportees' => $generalProvider->getUsersData(array_unique($teamUsers))]));
  1352.         return $response;
  1353.     }
  1354.     /**
  1355.      * @Route("/head-office/our-team/bank-holidays", name="get-bank-holidays", methods={"GET"})
  1356.      * 
  1357.      * @param Request $request
  1358.      * @return Response
  1359.      */
  1360.     public function headOfficeGetBankHolidaysAction(HeadOfficeService $hoService)
  1361.     {
  1362.         $loggedUser $this->getUser();
  1363.         if (!$loggedUser) {
  1364.             throw new UnauthorizedHttpException('Not authorized.');
  1365.         }
  1366.         $bankHolidays $hoService->getBankHolidaysFromClinic($loggedUser->getClinic());
  1367.         $response = new Response();
  1368.         $response->headers->set('Content-Type''application/json');
  1369.         $response->headers->set('Access-Control-Allow-Origin''*');
  1370.         $response->setContent(json_encode(['bankHolidays' => $bankHolidays]));
  1371.         return $response;
  1372.     }
  1373.     /**
  1374.      * @Route("/head-office/our-team/leaver-wizard", name="create-leave", methods={"POST"})
  1375.      */
  1376.     public function createLeaveAction(Request $requestHeadOfficeService $hoServicePermissionService $permissionProvider)
  1377.     {
  1378.         $loggedUser $this->getUser();
  1379.         if (!$loggedUser) {
  1380.             throw new UnauthorizedHttpException('Not authorized.');
  1381.         }
  1382.         $permissionProvider->checkPermissions('management'$loggedUser);
  1383.         $payload json_decode($request->getContent(), true);
  1384.         //any validation
  1385.         $hoService->createLeaveWizardInfo($payload$loggedUser);
  1386.         return new Response('OK'Response::HTTP_OK);
  1387.     }
  1388.     
  1389.     /**
  1390.      * @Route("/head-office/our-team/leaver-wizard/{userId}", name="get-leave", methods={"GET"})
  1391.      */
  1392.     public function getLeaveAction($userIdRequest $requestHeadOfficeService $hoServicePermissionService $permissionProvider)
  1393.     {
  1394.         $loggedUser $this->getUser();
  1395.         if (!$loggedUser) {
  1396.             throw new UnauthorizedHttpException('Not authorized.');
  1397.         }
  1398.         //any validation
  1399.         $data $hoService->getLeavingWizardInfoByUserid($userId);
  1400.         $response = new Response();
  1401.         $response->headers->set('Content-Type''application/json');
  1402.         $response->headers->set('Access-Control-Allow-Origin''*');
  1403.         $response->setContent(json_encode(['leavingWizardInfo' => $data]));
  1404.         return $response;
  1405.     }
  1406.     /**
  1407.      * @Route("/education/courses", name="education-courses-read")
  1408.      */
  1409.     public function educationCourseReadAction()
  1410.     {
  1411.         $loggedUser $this->getUser();
  1412.         if (!$loggedUser) {
  1413.             throw new UnauthorizedHttpException('Not authorized.');
  1414.         }
  1415.         $entries = new DataObject\Course\Listing();
  1416.         $entries->load();
  1417.         $entries $entries->getData();
  1418.         $data = [];
  1419.         foreach ($entries as $course) {
  1420.             $modules = [];
  1421.             foreach ($course->getModules()->getItems() as $module) {
  1422.                 $units = [];
  1423.                 foreach ($module->getUnits() as $unit) {
  1424.                     $video $unit->getVideo();
  1425.                     /* $videoDuration = ($video && $video->getData()) ? $video->getData()->getCustomSettings()['embeddedMetaData']['Duration'] : ''; */
  1426.                     $units[] = [
  1427.                         'name' => $unit->getName(),
  1428.                         'id' => $unit->getId(),
  1429.                         'number' => $unit->getNumber(),
  1430.                         'quiz' => $unit->getHasQuiz(),
  1431.                         'description' => $unit->getDescription(),
  1432.                         'videoDuration' => ''
  1433.                     ];
  1434.                 }
  1435.                 $modules[] = [
  1436.                     'name' => $module->getName(),
  1437.                     'number' => $module->getNumber(),
  1438.                     'units' => $units
  1439.                 ];
  1440.             }
  1441.             $cardImage $course->getCardImage();
  1442.             $cardThumbnail = ($cardImage) ? $cardImage->getThumbnail('courseCard')->getPath() : null;
  1443.             $listImage $course->getListImage();
  1444.             $listThumbnail = ($listImage) ? $listImage->getThumbnail('newsList')->getPath() : null;
  1445.             $data[] = [
  1446.                 'name' => $course->getName(),
  1447.                 'id' => $course->getId(),
  1448.                 'provider' => $course->getProvider(),
  1449.                 'instructor' => $course->getInstructor(),
  1450.                 'cardImage' => $cardThumbnail,
  1451.                 'listImage' => $listThumbnail,
  1452.                 'modules' => $modules,
  1453.                 'description' => $course->getDescription()
  1454.             ];
  1455.         }
  1456.         $response = new Response();
  1457.         $response->headers->set('Content-Type''application/json');
  1458.         $response->headers->set('Access-Control-Allow-Origin''*');
  1459.         $response->setContent(json_encode($data));
  1460.         return $response;
  1461.     }
  1462.     /**
  1463.      * @Route("/education/courses/getting-started", name="education-courses-getting-started", methods={"GET"})
  1464.      */
  1465.     public function educationGettingStartedReadAction()
  1466.     {
  1467.         $loggedUser $this->getUser();
  1468.         if (!$loggedUser) {
  1469.             throw new UnauthorizedHttpException('Not authorized.');
  1470.         }
  1471.         $page DataObject\GettingStartedPageEducation::getById(2316);
  1472.         $data = [];
  1473.         $banner = [];
  1474.         $mainCourseLinks = [];
  1475.         foreach ($page->getCoursesLink() as $courseLink) {
  1476.             array_push($mainCourseLinks$courseLink->getId());
  1477.         };
  1478.         $banner['title'] = $page->getTitle();
  1479.         $banner['text'] = $page->getText();
  1480.         $banner['background'] = $page->getBackground()->getThumbnail('heroGrid')->getPath();
  1481.         $banner['newCourse'] = $page->getNewCourse();
  1482.         $banner['courseLink'] = $mainCourseLinks;
  1483.         $featuredCourses = [];
  1484.         foreach ($page->getFeaturedCourse() as $course) {
  1485.             $featuredCourses[] = [
  1486.                 'title' => $course['title']->getData(),
  1487.                 'text' => $course['text']->getData(),
  1488.                 'image' => $course['image']->getData()->getThumbnail('standardTeaser')->getPath(),
  1489.                 'link' => $course['courseLink']->getData()->getId(),
  1490.             ];
  1491.         }
  1492.         $data['banner'] = $banner;
  1493.         $data['featuredCourses'] = $featuredCourses;
  1494.         $response = new Response();
  1495.         $response->headers->set('Content-Type''application/json');
  1496.         $response->headers->set('Access-Control-Allow-Origin''*');
  1497.         $response->setContent(json_encode($data));
  1498.         return $response;
  1499.     }
  1500.     /**
  1501.      * @Route("/education/courses/{unitId}", name="education-read", methods={"GET"})
  1502.      */
  1503.     public function educationUnitReadAction($unitId)
  1504.     {
  1505.         $loggedUser $this->getUser();
  1506.         if (!$loggedUser) {
  1507.             throw new UnauthorizedHttpException('Not authorized.');
  1508.         }
  1509.         $unit DataObject\CourseUnit::getById($unitId);
  1510.         $quiz = [];
  1511.         if ($unit->getHasQuiz()) {
  1512.             if ($unit->getQuestions()) {
  1513.                 foreach ($unit->getQuestions()->getItems() as $question) {
  1514.                     $answers = [];
  1515.                     foreach ($question->getAnswer() as $answer) {
  1516.                         $answers[] = $answer['possibleAnswer']->getData();
  1517.                     }
  1518.                     $quiz[] = [
  1519.                         'question' => $question->getQuestion(),
  1520.                         'id' => $question->getIndex(),
  1521.                         'answers' => $answers
  1522.                     ];
  1523.                 }
  1524.             }
  1525.         } else {
  1526.             $quiz null;
  1527.         }
  1528.         $video $unit->getVideo();
  1529.         $videoPath = ($video) ? $video->getData()->getPath() : '';
  1530.         $videoName = ($video) ? $video->getData()->getFilename() : '';
  1531.         $data = [
  1532.             'name' => $unit->getName(),
  1533.             'id' => $unit->getId(),
  1534.             'number' => $unit->getNumber(),
  1535.             'quiz' => $quiz,
  1536.             'description' => $unit->getDescription(),
  1537.             'video' => $videoPath $videoName,
  1538.             'resources' => $unit->getResources()
  1539.         ];
  1540.         $response = new Response();
  1541.         $response->headers->set('Content-Type''application/json');
  1542.         $response->headers->set('Access-Control-Allow-Origin''*');
  1543.         $response->setContent(json_encode($data));
  1544.         return $response;
  1545.     }
  1546.     /**
  1547.      * @Route("/education/courses/{courseId}", name="add-my-course", methods={"POST"})
  1548.      */
  1549.     public function addMyCourseAction($courseIdRequest $request)
  1550.     {
  1551.         $loggedUser $this->getUser();
  1552.         if (!$loggedUser) {
  1553.             throw new UnauthorizedHttpException('Not authorized.');
  1554.         }
  1555.         $id $loggedUser->getId();
  1556.         $currentCourses $loggedUser->getMyCourses();
  1557.         if ($request->getContent()) {
  1558.             $data json_decode($request->getContent(), true);
  1559.             $courses $data['courses'];
  1560.             $coursesToAdd = [];
  1561.             foreach ($courses as $courseItem) {
  1562.                 $course DataObject\Course::getById($courseItem);
  1563.                 if (!$course) {
  1564.                     return new Response('Bad Request');
  1565.                 }
  1566.                 if (!in_array($course$currentCourses)) {
  1567.                     array_push($coursesToAdd$course);
  1568.                 }
  1569.             }
  1570.             $loggedUser->setMyCourses(array_merge($currentCourses$coursesToAdd));
  1571.         } else {
  1572.             $course DataObject\Course::getById($courseId);
  1573.             if (!$course) {
  1574.                 return new Response('Bad Request');
  1575.             }
  1576.             $loggedUser->setMyCourses(array_merge($currentCourses, [$course]));
  1577.         }
  1578.         $loggedUser->save();
  1579.         return new Response('OK'Response::HTTP_OK);
  1580.     }
  1581.     /**
  1582.      * @Route("/education/courses/{courseId}", name="remove-my-course", methods={"DELETE"})
  1583.      */
  1584.     public function removeMyCourseAction($courseIdRequest $request)
  1585.     {
  1586.         $loggedUser $this->getUser();
  1587.         if (!$loggedUser) {
  1588.             throw new UnauthorizedHttpException('Not authorized.');
  1589.         }
  1590.         $currentCourses $loggedUser->getMyCourses();
  1591.         if ($request->getContent()) {
  1592.             $data json_decode($request->getContent(), true);
  1593.             $courses $data['courses'];
  1594.             $currentCourses array_filter($currentCourses, function ($currentCourse) use ($courses) {
  1595.                 if (!in_array($currentCourse->getId(), $courses)) {
  1596.                     return true;
  1597.                 };
  1598.                 return false;
  1599.             });
  1600.             $loggedUser->setMyCourses(array_merge($currentCourses));
  1601.         } else {
  1602.             $course DataObject\Course::getById($courseId);
  1603.             if (!$course) {
  1604.                 return new Response('Bad Request');
  1605.             }
  1606.             $currentCourses array_filter($currentCourses, function ($course) use ($courseId) {
  1607.                 return ($course->getId() != $courseId);
  1608.             });
  1609.             $loggedUser->setMyCourses(array_merge($currentCourses));
  1610.         }
  1611.         $loggedUser->save();
  1612.         return new Response('OK'Response::HTTP_OK);
  1613.     }
  1614.     /**
  1615.      * @Route("/education/users", name="education-users-read")
  1616.      */
  1617.     public function educationUsersReadAction()
  1618.     {
  1619.         $loggedUser $this->getUser();
  1620.         if (!$loggedUser) {
  1621.             throw new UnauthorizedHttpException('Not authorized.');
  1622.         }
  1623.         $data = [];
  1624.         $modules = [];
  1625.         $courses $loggedUser->getMyCourses();
  1626.         $myCourses = [];
  1627.         foreach ($courses as $course) {
  1628.             $myCourses[] = [
  1629.                 'id' => $course->getId(),
  1630.             ];
  1631.         }
  1632.         $log = [];
  1633.         if ($loggedUser->getCourse()) {
  1634.             foreach ($loggedUser->getCourse()->getItems() as $course) {
  1635.                 $courseModule $course->getmodule();
  1636.                 $modules = [];
  1637.                 foreach ($courseModule as $module) {
  1638.                     $units = [];
  1639.                     foreach ($module['units']->getData() as $unit) {
  1640.                         $units[] = [
  1641.                             'id' => intval($unit[0]),
  1642.                             'number' => intval($unit[1]),
  1643.                             'quiz' => $unit[2],
  1644.                             'quizCompleted' => $unit[3],
  1645.                         ];
  1646.                     }
  1647.                     $modules[] = [
  1648.                         'number' => $module['moduleNumber']->getData(),
  1649.                         'units' => $units
  1650.                     ];
  1651.                 }
  1652.                 $log[] = [
  1653.                     'name' => $course->getName(),
  1654.                     'id' => $course->getCourseId(),
  1655.                     'modules' => $modules,
  1656.                 ];
  1657.             }
  1658.         }
  1659.         $data['log'] = $log;
  1660.         $data['myCourses'] = $myCourses;
  1661.         $response = new Response();
  1662.         $response->headers->set('Content-Type''application/json');
  1663.         $response->headers->set('Access-Control-Allow-Origin''*');
  1664.         $response->setContent(json_encode($data));
  1665.         return $response;
  1666.     }
  1667.     /**
  1668.      * @Route("/education/quiz/{unitId}", name="education-quiz-post", methods={"POST"})
  1669.      * 
  1670.      * @param Request $request
  1671.      * @return Response
  1672.      */
  1673.     public function educationQuizCheckAction(Request $request$unitId)
  1674.     {
  1675.         $loggedUser $this->getUser();
  1676.         if (!$loggedUser) {
  1677.             throw new UnauthorizedHttpException('Not authorized.');
  1678.         }
  1679.         $id $loggedUser->getId();
  1680.         if ($request->getContent()) {
  1681.             $data json_decode($request->getContent(), true);
  1682.             $answersEncoded $data['answers'];
  1683.             $answers json_decode($answersEncodedtrue);
  1684.             $unit DataObject\CourseUnit::getById($unitId);
  1685.             $questions $unit->getQuestions()->getItems();
  1686.             $correctAnswers 0;
  1687.             foreach ($questions as $question) {
  1688.                 /*  $correctAnswers[] = [
  1689.                     'qIndex'=> $question->getIndex(),
  1690.                     'currAnswer'=>$answers['0']
  1691.                 ]; */
  1692.                 $correct preg_replace('/\s+/'''$question->getRightAnswer());
  1693.                 $answer preg_replace('/\s+/'''$answers[strval($question->getIndex())]);
  1694.                 if ($answer === $correct) {
  1695.                     $correctAnswers++;
  1696.                 }
  1697.             }
  1698.             $response = new Response();
  1699.             $response->headers->set('Content-Type''application/json');
  1700.             $response->headers->set('Access-Control-Allow-Origin''*');
  1701.             $response->setContent($correctAnswers);
  1702.             return $response;
  1703.         }
  1704.         return new Response(null);
  1705.     }
  1706.     /**
  1707.      * @Route("/education/users/{unitId}", name="education-users-post", methods={"POST"})
  1708.      * 
  1709.      * @param Request $request
  1710.      * @return Response
  1711.      */
  1712.     public function educationUsersPostAction(Request $request$unitId)
  1713.     {
  1714.         $loggedUser $this->getUser();
  1715.         if (!$loggedUser) {
  1716.             throw new UnauthorizedHttpException('Not authorized.');
  1717.         }
  1718.         $id $loggedUser->getId();
  1719.         if ($request->getContent()) {
  1720.             $data json_decode($request->getContent(), true);
  1721.             $courseName $data['courseName'];
  1722.             $courseId $data['courseId'];
  1723.             $moduleNumber $data['moduleNumber'];
  1724.             $completedQuiz $data['completedQuiz'];
  1725.             $unit DataObject\CourseUnit::getById($unitId);
  1726.             $courseLog $loggedUser->getCourse();
  1727.             $hasQuiz = !empty($unit->getQuestions());
  1728.             $moduleQuiz $unit->getModuleQuiz();
  1729.             if (!is_null($courseLog)) {
  1730.                 $courseLog $loggedUser->getCourse()->getItems();
  1731.                 $currentCourse array_filter($courseLog, function ($course) use ($courseId) {
  1732.                     return ($course->getCourseId() == $courseId);
  1733.                 });
  1734.                 if (!empty($currentCourse)) {
  1735.                     $courseIndex key($currentCourse);
  1736.                     $modules $currentCourse[$courseIndex]->getModule();
  1737.                     $currentModule array_filter($modules, function ($module) use ($moduleNumber) {
  1738.                         return ($module['moduleNumber']->getData() == $moduleNumber);
  1739.                     });
  1740.                     if (!empty($currentModule)) {
  1741.                         $moduleIndex key($currentModule);
  1742.                         $currentUnits $currentModule[$moduleIndex]['units']->getData();
  1743.                         if ($completedQuiz == true) {
  1744.                             if ($moduleQuiz) {
  1745.                                 $currentModule[$moduleIndex]['units']->setData([...$currentUnits, [$unit->getId(), $unit->getNumber(), $hasQuiztrue]]);
  1746.                                 $loggedUser->save();
  1747.                                 return new Response('OK'Response::HTTP_OK);
  1748.                             }
  1749.                         }
  1750.                         $currentModule[$moduleIndex]['units']->setData([...$currentUnits, [$unit->getId(), $unit->getNumber(), $hasQuizboolval($completedQuiz)]]);
  1751.                         $loggedUser->save();
  1752.                     } else {
  1753.                         $blockData = [
  1754.                             "moduleNumber" => new BlockElement('moduleNumber''numeric'$moduleNumber),
  1755.                             "units" => new BlockElement('units''table', [[$unit->getId(), $unit->getNumber(), $hasQuiz$moduleQuiz boolval($moduleQuiz) : boolval($completedQuiz)]])
  1756.                         ];
  1757.                         $currentCourse[0]->setModule(array_merge($modules, [$blockData]));
  1758.                         $loggedUser->save();
  1759.                     }
  1760.                 } else {
  1761.                     $newCourse = new DataObject\Fieldcollection\Data\CourseUserLog();
  1762.                     $newCourse->setName($courseName);
  1763.                     $newCourse->setCourseId($courseId);
  1764.                     $blockData = [
  1765.                         "moduleNumber" => new BlockElement('moduleNumber''numeric'$moduleNumber),
  1766.                         "units" => new BlockElement('units''table', [[$unit->getId(), $unit->getNumber(), $hasQuiz$moduleQuiz boolval($moduleQuiz) : boolval($completedQuiz)]])
  1767.                     ];
  1768.                     $newCourse->setModule([$blockData]);
  1769.                     $loggedUser->getCourse()->setItems(array_merge($courseLog, [$newCourse]));
  1770.                     $loggedUser->save();
  1771.                 }
  1772.             } else {
  1773.                 $newCourse = new DataObject\Fieldcollection\Data\CourseUserLog();
  1774.                 $newCourse->setName($courseName);
  1775.                 $newCourse->setCourseId($courseId);
  1776.                 $blockData = [
  1777.                     "moduleNumber" => new BlockElement('moduleNumber''numeric'$moduleNumber),
  1778.                     "units" => new BlockElement('units''table', [[$unit->getId(), $unit->getNumber(), $hasQuiz$moduleQuiz boolval($moduleQuiz) : boolval($completedQuiz)]])
  1779.                 ];
  1780.                 $newCourse->setModule([$blockData]);
  1781.                 $courses = new DataObject\Fieldcollection();
  1782.                 $courses->add($newCourse);
  1783.                 $loggedUser->setCourse($courses);
  1784.                 $loggedUser->save();
  1785.             }
  1786.             return new Response('OK'Response::HTTP_OK);
  1787.         }
  1788.         return new Response(null);
  1789.     }
  1790.     /**
  1791.      * @Route("/dashboard/credentials", name="dashboard-credentials-get", methods={"GET"})
  1792.      */
  1793.     public function dashboardGetCredentialsAction(GeneralService $generalProviderPermissionService $permissionProvider)
  1794.     {
  1795.         $loggedUser $this->getUser();
  1796.         if (!$loggedUser) {
  1797.             throw new UnauthorizedHttpException('Not authorized.');
  1798.         }
  1799.         $permissionProvider->checkPermissions('management'$loggedUser);
  1800.         $super $permissionProvider->getSuperuser($loggedUser);
  1801.         $allUsers $super->getSubusers();
  1802.         if ($loggedUser->getTypeOfUser() !== 'superuser') {
  1803.             $allUsers array_merge($allUsers, [$loggedUser->getClinic()->getSuperuser()]);
  1804.         }
  1805.         $users $generalProvider->getUsersData($allUsers);
  1806.         $subscriptionsData $this->filterIncludedSubscriptions($super);
  1807.         $includedSubsTotal count($subscriptionsData['includedSubs']);
  1808.         $includedSubsNotUsed count($subscriptionsData['includedSubs']) - count($subscriptionsData['includedSubsNotUsed']);
  1809.         if ($super->getSubscription()->getIsTrycareMembership()) {
  1810.             $includedSubsTotal TrycareMembership::getAdditionalSubscriptionsAmount($super->getSubscription()->getTrycareMemberId());
  1811.             $includedSubsNotUsed $includedSubsTotal count($subscriptionsData['includedSubs']);
  1812.         }
  1813.         $userData = [];
  1814.         $userData = [
  1815.             'subusers' => $users,
  1816.             'role' => $loggedUser->getTypeOfUser(),
  1817.             'includedSubTotal' => $includedSubsTotal,
  1818.             'includedSubUsed' => $includedSubsNotUsed
  1819.         ];
  1820.         $response = new Response();
  1821.         $response->headers->set('Content-Type''application/json');
  1822.         $response->headers->set('Access-Control-Allow-Origin''*');
  1823.         $response->setContent(json_encode($userData));
  1824.         return $response;
  1825.     }
  1826.     /**
  1827.      * @Route("/dashboard/credentials", name="dashboard-credentials-change", methods={"PUT"})
  1828.      */
  1829.     public function dashboardUpdateCredentialsAction(Request $request)
  1830.     {
  1831.         $loggedUser $this->getUser();
  1832.         if (!$loggedUser) {
  1833.             throw new UnauthorizedHttpException('Not authorized.');
  1834.         }
  1835.         $content json_decode($request->getContent());
  1836.         $form $this->createForm(PasswordFormType::class);
  1837.         $form->submit((array)$content);
  1838.         if (!$form->isValid()) {
  1839.             $errors = [];
  1840.             foreach ($form->getErrors(deeptrueflattentrue) as $error) {
  1841.                 $propertyName $error->getOrigin()->getName();
  1842.                 $errors[] = $error->getMessage();
  1843.             }
  1844.             throw new BadRequestHttpException(json_encode($errors));
  1845.         }
  1846.         $plainPass $form->getData()['password'];
  1847.         $loggedUser->setPassword($plainPass);
  1848.         $loggedUser->save();
  1849.         return new Response(json_encode($plainPass), Response::HTTP_OK);
  1850.     }
  1851.     public function filterIncludedSubscriptions($loggedUser)
  1852.     {
  1853.         $includedSubscriptions $loggedUser->getIncludedSubscriptions();
  1854.         $includedSubsNotUsed = [];
  1855.         foreach ($includedSubscriptions as $sub) {
  1856.             $user $sub->getUser();
  1857.             if (empty($user)) {
  1858.                 $includedSubsNotUsed[] = $sub;
  1859.             }
  1860.         }
  1861.         return [
  1862.             'includedSubs' => $includedSubscriptions,
  1863.             'includedSubsNotUsed' => $includedSubsNotUsed
  1864.         ];
  1865.     }
  1866.     /**
  1867.      * @Route("/dashboard/user", name="dashboard-user-create", methods={"POST"})
  1868.      */
  1869.     public function dashboardCreateUserAction(Request $requestUserHandler $userHandlerPermissionService $permissionProvider)
  1870.     {
  1871.         $loggedUser $this->getUser();
  1872.         if (!$loggedUser) {
  1873.             throw new UnauthorizedHttpException('Not authorized.');
  1874.         }
  1875.         $permissionProvider->checkPermissions('management'$loggedUser);
  1876.         $clinic $loggedUser->getClinic();
  1877.         if (is_null($clinic)) {
  1878.             throw new BadRequestHttpException('No clinic ID registered.');
  1879.         }
  1880.         $superuser $clinic->getSuperuser();
  1881.         $content json_decode($request->getContent());
  1882.         $form $this->createForm(ManageUserCreateType::class);
  1883.         $form->submit((array)$content);
  1884.         if (!$form->isValid()) {
  1885.             $errors = [];
  1886.             foreach ($form->getErrors(deeptrueflattentrue) as $error) {
  1887.                 $errors[] = $error->getMessage();
  1888.             }
  1889.             throw new BadRequestHttpException(json_encode($errors));
  1890.         }
  1891.         $payload json_decode($request->getContent(), true);
  1892.         $response = new Response();
  1893.         $stripeResponse $userHandler->addOneExtraLicence($superuser$payload);
  1894.         return $response->setContent(json_encode($stripeResponse));
  1895.     }
  1896.     /**
  1897.      * @Route("/dashboard/users", name="dashboard-users-create", methods={"POST"})
  1898.      */
  1899.     public function dashboardCreateUsersAction(
  1900.         Request $request,
  1901.         UserHandler $userHandler,
  1902.         PermissionService $permissionProvider,
  1903.         FreeTrialService $freeTrialService,
  1904.         TrycareService $trycareService
  1905.     ) {
  1906.         $loggedUser $this->getUser();
  1907.         if (!$loggedUser) {
  1908.             throw new UnauthorizedHttpException('Not authorized.');
  1909.         }
  1910.         $permissionProvider->checkPermissions('manager'$loggedUser);
  1911.         $clinic $loggedUser->getClinic();
  1912.         if (is_null($clinic)) {
  1913.             throw new BadRequestHttpException('No clinic ID registered.');
  1914.         }
  1915.         $data json_decode($request->getContent());
  1916.         $userBlocks $data->userBlocks;
  1917.         foreach ($userBlocks as $block) {
  1918.             $form $this->createForm(ManageUserCreateType::class);
  1919.             $userHandler->validateUsersInputs($block$form);
  1920.         }
  1921.         $superuser $clinic->getSuperuser();
  1922.         $includedSubsResult = [];
  1923.         $stripeResponse = [];
  1924.         $response = new Response();
  1925.         //if superuser is free trial. create new included subs for additional users.
  1926.         if ($superuser->getSubscription()->getIsFreeTrial()) {
  1927.             $freeTrialService->createFreeTrialSubusers($userBlocks$superuser);
  1928.             $includedSubsResult = ['status' => 'OK'];
  1929.             return $response->setContent(json_encode(['stripe' => $stripeResponse'included' => $includedSubsResult]));
  1930.         }
  1931.         $isTrycareSubscription $superuser->getSubscription()->getIsTrycareMembership();
  1932.         // is trycare sub, we need to check if users to add do not exceed available add subs
  1933.         if ($isTrycareSubscription) {
  1934.             $maxSubs TrycareMembership::getAdditionalSubscriptionsAmount($superuser->getSubscription()->getTrycareMemberId());
  1935.             $subsInUse $superuser->getIncludedSubscriptions();
  1936.             if (count($subsInUse) >= $maxSubs) {
  1937.                 throw new BadRequestHttpException('No aditional user subscriptions available. Please contact support.');
  1938.             }
  1939.             $trycareService->createTrycareSubusers($userBlocks$superuser);
  1940.             $includedSubsResult = ['status' => 'OK'];
  1941.             return $response->setContent(json_encode(['stripe' => $stripeResponse'included' => $includedSubsResult]));
  1942.         }
  1943.         $emptyIncludedSubscriptions array_values($userHandler->getFreeIncludedSubscriptions($superuser));
  1944.         if (count($emptyIncludedSubscriptions) > 0) {
  1945.             $includedUserBlocks array_splice($userBlocks0count($emptyIncludedSubscriptions));
  1946.             $customers $userHandler->createSubusersFromBlocks($includedUserBlocks$superuser);
  1947.             foreach ($customers as $index => $customer) {
  1948.                 $customerId $customer->getId();
  1949.                 $userHandler->attachCustomerToSubscription(
  1950.                     $emptyIncludedSubscriptions[$index],
  1951.                     $customer,
  1952.                     ' is being attached a customer',
  1953.                     "customer ID: $customerId"
  1954.                 );
  1955.             }
  1956.             $superuser->setSubusers([...$superuser->getSubusers(), ...$customers]);
  1957.             $superuser->save();
  1958.             $includedSubsResult = ['status' => 'OK'];
  1959.         }
  1960.         //if there are still users in the block means that the number of included subscriptions available wasn't enough
  1961.         if (count($userBlocks) > && !$isTrycareSubscription) {
  1962.             $stripeResponse $userHandler->addExtraLicences($superusercount($userBlocks), $userBlocks);
  1963.         }
  1964.         return $response->setContent(json_encode(['stripe' => $stripeResponse'included' => $includedSubsResult]));
  1965.     }
  1966.     /**
  1967.      * @Route("/dashboard/user/{id}", name="dashboard-users-delete", methods={"DELETE"})
  1968.      */
  1969.     public function dashboardDeleteUserAction($idRequest $requestCustomerProviderInterface $customerProviderPermissionService $permissionProviderUserHandler $userHandler)
  1970.     {
  1971.         $loggedUser $this->getUser();
  1972.         if (!$loggedUser) {
  1973.             throw new UnauthorizedHttpException('Not authorized.');
  1974.         }
  1975.         $permissionProvider->checkPermissions('management'$loggedUser);
  1976.         $user $customerProvider->getById($id);
  1977.         if ($user->getTypeOfUser() === 'superuser') {
  1978.             throw new BadRequestHttpException('Superusers cannot be deleted');
  1979.         }
  1980.         $userClinic $user->getClinic();
  1981.         $loggedUserClinic $loggedUser->getClinic();
  1982.         if (is_null($userClinic) || is_null($loggedUserClinic)) {
  1983.             throw new BadRequestHttpException('No clinic ID registered.');
  1984.         }
  1985.         if ($userClinic->getId() !== $loggedUserClinic->getId()) {
  1986.             throw new BadRequestHttpException('You can only unsubscribe a user from your practice.');
  1987.         }
  1988.         $superuser $userClinic->getSuperuser();
  1989.         $userHandler->handleSubuserRemoval($user$superuser);
  1990.         $response = new Response();
  1991.         return $response->setContent(json_encode(['message' => 'OK']));
  1992.     }
  1993.     /**
  1994.      * @Route("/dashboard/user/{id}", name="dashboard-users-update", methods={"PUT"})
  1995.      */
  1996.     public function dashboardUpdateUserAction($idRequest $requestCustomerProviderInterface $customerProviderPermissionService $permissionProvider)
  1997.     {
  1998.         $loggedUser $this->getUser();
  1999.         if (!$loggedUser) {
  2000.             throw new UnauthorizedHttpException('Not authorized.');
  2001.         }
  2002.         $permissionProvider->checkPermissions('management'$loggedUser);
  2003.         try {
  2004.             $customer $customerProvider->getById($id);
  2005.             if ($customer->getTypeOfUser() === 'superuser' && $loggedUser->getTypeOfUser() !== 'superuser') {
  2006.                 throw new AccessDeniedHttpException('You have no authorization.');
  2007.             }
  2008.             $payload json_decode($request->getContent(), true);
  2009.             $displayName $payload['displayName'];
  2010.             $customer->setDisplayName($displayName);
  2011.             $permissions $payload['permissions'];
  2012.             $isManager $payload['manager'];
  2013.             $editHSAllowed $permissions['headOffice']['editHS'];
  2014.             $editTeamHQAllowed $permissions['headOffice']['editTeamHQ'];
  2015.             $placeOrderAllowed $permissions['store']['placeOrder'];
  2016.             $customer->setTypeOfUser($isManager 'manager' 'subuser');
  2017.             $customer->setEditHSAllowed($editHSAllowed true false);
  2018.             $customer->setEditTeamHQAllowed($editTeamHQAllowed true false);
  2019.             $customer->setPlaceOrderAllowed($placeOrderAllowed true false);
  2020.             $customer->save();
  2021.             $response = new Response();
  2022.             return $response->setContent(json_encode(['message' => 'OK']));
  2023.         } catch (\Exception $e) {
  2024.             throw new BadRequestHttpException($e->getMessage());
  2025.         }
  2026.     }
  2027.     /**
  2028.      * @Route("/practice/users", name="get-users-practice", methods={"GET"})
  2029.      */
  2030.     public function getPracticeUsersAction(GeneralService $generalProvider)
  2031.     {
  2032.         $loggedUser $this->getUser();
  2033.         if (!$loggedUser) {
  2034.             throw new UnauthorizedHttpException('Not authorized.');
  2035.         }
  2036.         $clinic $loggedUser->getClinic();
  2037.         $users $generalProvider->getActiveUsersByClinic($clinic);
  2038.         $data = [];
  2039.         foreach ($users as $user) {
  2040.             $userData = [
  2041.                 'id' => $user->getId(),
  2042.                 'firstName' => $user->getFirstname(),
  2043.                 'lastName' => $user->getLastname(),
  2044.                 'displayName' => $user->getDisplayName(),
  2045.                 'email' => $user->getEmail(),
  2046.                 'createdAt' => $user->getCreationDate(),
  2047.             ];
  2048.             array_push($data$userData);
  2049.         }
  2050.         $response = new Response();
  2051.         $response->headers->set('Content-Type''application/json');
  2052.         $response->headers->set('Access-Control-Allow-Origin''*');
  2053.         $response->setContent(json_encode(['users' => $data]));
  2054.         return $response;
  2055.     }
  2056.     /**
  2057.      * @Route("/report/error", name="report-error", methods={"POST"})
  2058.      */
  2059.     public function reportErrorAction(Request $request)
  2060.     {
  2061.         $payload json_decode($request->getContent(), true);
  2062.         $error $payload['error'];
  2063.         \Pimcore\Log\Simple::log('front-end-report'$error);
  2064.         $response = new Response();
  2065.         return $response->setContent(json_encode(['message' => 'OK']));
  2066.     }
  2067.     /**
  2068.      * @Route("/help/{uid}", name="get-help", methods={"GET"})
  2069.      */
  2070.     public function getHelpAction($uidRequest $request)
  2071.     {
  2072.         $help DataObject\Help::getByUid($uid1);
  2073.         if (!$help) {
  2074.             throw new InvalidArgumentException('Invalid UID');
  2075.         }
  2076.         $data = [
  2077.             'title' => $help->getTitle(),
  2078.             'content' => $help->getContent()
  2079.         ];
  2080.         $response = new Response();
  2081.         $response->headers->set('Content-Type''application/json');
  2082.         $response->headers->set('Access-Control-Allow-Origin''*');
  2083.         $response->setContent(json_encode($data));
  2084.         return $response;
  2085.     }
  2086. }