src/Controller/BackendController.php line 121

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Model\DataObject\Address;
  4. use App\Model\DataObject\Business;
  5. use App\Model\DataObject\User;
  6. use App\Service\BusinessService;
  7. use Carbon\Carbon;
  8. use Exception;
  9. use Pimcore\Controller\FrontendController;
  10. use Pimcore\HttpKernel\BundleLocator\NotFoundException;
  11. use Pimcore\Mail;
  12. use Pimcore\Model\Asset;
  13. use Pimcore\Model\Asset\Document;
  14. use Pimcore\Model\Asset\Folder as AssetFolder;
  15. use Pimcore\Model\Asset\Image;
  16. use Pimcore\Model\DataObject;
  17. use Pimcore\Model\DataObject\Availability;
  18. use Pimcore\Model\DataObject\Booking;
  19. use Pimcore\Model\DataObject\Data\BlockElement;
  20. use Pimcore\Model\DataObject\Data\Hotspotimage;
  21. use Pimcore\Model\DataObject\Folder;
  22. use Pimcore\Model\DataObject\Job;
  23. use Pimcore\Model\DataObject\Language;
  24. use Pimcore\Model\DataObject\Organisation;
  25. use Pimcore\Model\DataObject\Payment;
  26. use Pimcore\Model\DataObject\Schedule;
  27. use Pimcore\Model\DataObject\Services;
  28. use Pimcore\Model\DataObject\Subscription;
  29. use Pimcore\Model\Element\Service;
  30. use Symfony\Component\HttpFoundation\Request;
  31. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  32. use Symfony\Component\Routing\Annotation\Route;
  33. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  34. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
  35. use Stripe\Exception\SignatureVerificationException;
  36. use Stripe\Exception\UnexpectedValueException;
  37. use Stripe\Stripe;
  38. use Symfony\Component\EventDispatcher\EventDispatcher;
  39. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
  40. use Symfony\Component\Security\Core\Security as FrontSecurity;
  41. use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
  42. use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
  43. use Symfony\Component\Validator\Validator\ValidatorInterface;
  44. use Symfony\Component\Validator\Constraints as Assert;
  45. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  46. use function PHPUnit\Framework\throwException;
  47. class BackendController extends FrontendController
  48. {
  49.     private function checkPermission(Request $request, $security, $premiumRedirect = true){
  50.         if($this->editmode){
  51.             return;
  52.         }
  53.         $securityUser = $security->getUser();
  54.         if (!$securityUser) {
  55.             return $this->redirect($this->generateUrl("login", ["_target_path" => $request->getRequestUri()]));
  56.         }
  57.         $user = User::getByUsername($securityUser->getUserIdentifier())->load()[0];
  58.         $businesses = $user->getBusinesses();
  59.         if(!$businesses) {
  60.             if($user->getPanier()){
  61.                 $sub = $securityUser->getSubscriptions();
  62.                 if($sub && $sub[0]->getStripeStatus() === "incomplete") {
  63.                     return $this->redirectToRoute('waitingValidation');
  64.                 }
  65.                 return $this->redirectToRoute('panier');
  66.             }
  67.             return $this->redirectToRoute('newBusiness');
  68.         }
  69.         if(isset($businesses[$user->getLastBusinessUsed()])){
  70.             $business = $businesses[$user->getLastBusinessUsed()];
  71.         } else{
  72.             $user->setLastBusinessUsed(0);
  73.             $user->save();
  74.             $business = $businesses[0];
  75.         }
  76.         if($premiumRedirect) {
  77.             $newBusArray = [];
  78.             foreach($businesses as $newPan){
  79.                 if($newPan->getPremium()){
  80.                     $newBusArray[] = $newPan;
  81.                 } else{
  82.                     $user->setPanier([...$user->getPanier(), $newPan]);
  83.                 }
  84.             }
  85.             $businesses = $newBusArray;
  86.             $user->setBusinesses($businesses);
  87.             $user->save();
  88.             if(!$businesses){
  89.                 $sub = $securityUser->getSubscriptions();
  90.                 if($sub && $sub[0]->getStripeStatus() === "incomplete") {
  91.                     return $this->redirectToRoute('waitingValidation');
  92.                 }
  93.                 return $this->redirectToRoute('panier');
  94.             }
  95.             if(!$business->getPremium()){
  96.                 $user->setLastBusinessUsed(0);
  97.                 $user->save();
  98.                 $business = $businesses[0];
  99.             }
  100.         }
  101.         return ["business" => $business, "businesses" => $businesses, "user" => $user];
  102.     }
  103.     /**
  104.      * @Template
  105.      * @param Request $request
  106.      * @return array
  107.      * @route(
  108.      *      "/{_locale}/pro/dashboard",
  109.      *      name="dashboard",
  110.      *      methods={"GET"}
  111.      * )
  112.      */
  113.     public function dashboardAction(Request $request, FrontSecurity $security)
  114.     {
  115.         $resPermission =  $this->checkPermission($request, $security);
  116.         if(!(is_array($resPermission))){
  117.             return $resPermission;
  118.         }
  119.         $resPermission["nextLeaving"] = $resPermission["business"]->nextLeaving();
  120.         $resPermission["nextComing"] = $resPermission["business"]->nextComing();
  121.         $resPermission["nbreVisites"] = count($resPermission["business"]->getVisites());
  122.         return $resPermission;
  123.     }
  124.     /**
  125.      * @route("{_locale}/pro/changeBusiness", name="changeBusiness", methods={"GET"})
  126.      */
  127.     public function changeBusinessAction(Request $request, FrontSecurity $security)
  128.     {
  129.         $securityUser = $security->getUser();
  130.         if (!$securityUser) {
  131.             return $this->redirect($this->generateUrl("login"));
  132.         }
  133.         $user = User::getByUsername($securityUser->getUserIdentifier())->load()[0];
  134.         $businesses = $user->getBusinesses();
  135.         $index = $request->get('index');
  136.         if($index < count($businesses) && $index >= 0){
  137.             $user->setLastBusinessUsed($index);
  138.             $user->save();
  139.         }
  140.         return $this->redirect($request->headers->get('referer'));
  141.     }
  142.     /**
  143.      * @Template
  144.      * @param Request $request
  145.      * @return array
  146.      * @route("/{_locale}/pro/availabilities", name="availabilities", methods={"GET"})
  147.      */
  148.     public function availabilitiesAction(Request $request, FrontSecurity $security)
  149.     {
  150.         $resPermission =  $this->checkPermission($request, $security);
  151.         if(!(is_array($resPermission))){
  152.             return $resPermission;
  153.         }
  154.         if(!$resPermission['business']->getNursery()){
  155.             return $this->redirectToRoute('dashboard');
  156.         }
  157.         return $resPermission;
  158.     }
  159.     /**
  160.      * @Template
  161.      * @param Request $request
  162.      * @return array
  163.      * @route(
  164.      *      "/{_locale}/pro/booking/add/{id}",
  165.      *      name="addBooking",
  166.      *      methods={"POST"}
  167.      * )
  168.      */
  169.     public function addBookingAction(Request $request, FrontSecurity $security)
  170.     {
  171.         $resPermission =  $this->checkPermission($request, $security);
  172.         if(!(is_array($resPermission))){
  173.             return $resPermission;
  174.         }
  175.         $businesses = $resPermission["businesses"];
  176.         $business = $resPermission["business"];
  177.         //TODO check if availabilities belong to business
  178.         $availability = Availability::getById($request->get('id'));
  179.         if(!$availability) {
  180.             throw new NotFoundException("Availability not found");
  181.         }
  182.         $booking = new Booking();
  183.         $booking->setName($request->get('name'));
  184.         $booking->setStart(Carbon::create($request->get('start')));
  185.         $booking->setStop(Carbon::create($request->get('stop')));
  186.         $booking->setPartTime($request->get('partTime'));
  187.         $booking->setParent($availability);
  188.         $booking->setKey($booking->getName().uniqid());
  189.         $booking->setPublished(true);
  190.         $booking->save();
  191.         $reservations = $availability->getReservations();
  192.         array_push($reservations,$booking);
  193.         $availability->setReservations($reservations);
  194.         $availability->save();
  195.         return $this->redirect($request->headers->get('referer'));
  196.     }
  197.     /**
  198.      * @Template
  199.      * @param Request $request
  200.      * @return array
  201.      * @route(
  202.      *      "/{_locale}/pro/booking/edit/{id}",
  203.      *      name="editBooking",
  204.      *      methods={"POST"}
  205.      * )
  206.      */
  207.     public function editBookingAction(Request $request, FrontSecurity $security)
  208.     {
  209.        $resPermission =  $this->checkPermission($request, $security);
  210.         if(!(is_array($resPermission))){
  211.             return $resPermission;
  212.         }
  213.         $businesses = $resPermission["businesses"];
  214.         $business = $resPermission["business"];
  215.         //TODO check if booking belong to current business
  216.         $booking = Booking::getById($request->get('id'));
  217.         if(!$booking) {
  218.             throw new NotFoundException("Booking not found");
  219.         }
  220.         $booking->setName($request->get('name'));
  221.         $booking->setStart(Carbon::create($request->get('start')));
  222.         $booking->setStop(Carbon::create($request->get('stop')));
  223.         $booking->setPartTime($request->get('partTime'));
  224.         $booking->save();
  225.         return $this->redirect($request->headers->get('referer'));
  226.     }
  227.     /**
  228.      * @Template
  229.      * @param Request $request
  230.      * @return array
  231.      * @route(
  232.      *      "/{_locale}/pro/booking/remove/{id}",
  233.      *      name="removeBooking",
  234.      *      methods={"GET"}
  235.      * )
  236.      */
  237.     public function removeBookingAction(Request $request, FrontSecurity $security)
  238.     {
  239.        $resPermission =  $this->checkPermission($request, $security);
  240.         if(!(is_array($resPermission))){
  241.             return $resPermission;
  242.         }
  243.         $businesses = $resPermission["businesses"];
  244.         $business = $resPermission["business"];
  245.         //TODO check if booking belong to current business
  246.         $booking = Booking::getById($request->get('id'));
  247.         if(!$booking) {
  248.             throw new NotFoundException("Booking not found");
  249.         }
  250.         $booking->delete();
  251.         return $this->redirect($request->headers->get('referer'));
  252.     }
  253.     /**
  254.      * @Template
  255.      * @param Request $request
  256.      * @return array
  257.      * @route(
  258.      *      "/{_locale}/pro/availability/add",
  259.      *      name="addAvailability",
  260.      *      methods={"GET"}
  261.      * )
  262.      */
  263.     public function addAvailabilityAction(Request $request, FrontSecurity $security)
  264.     {
  265.        $resPermission =  $this->checkPermission($request, $security);
  266.         if(!(is_array($resPermission))){
  267.             return $resPermission;
  268.         }
  269.         $businesses = $resPermission["businesses"];
  270.         $business = $resPermission["business"];
  271.         $folder = Folder::getByPath($business->getPath().$business->getKey().'/Availabilities');
  272.         if(!$folder){
  273.             $folder = new Folder();
  274.             $folder->setKey('Availabilities');
  275.             $folder->setParentId($business->getId());
  276.             $folder->save();
  277.         }
  278.         $availability = new Availability();
  279.         $availability->setPublished(true);
  280.         $availability->setParent($folder);
  281.         $availability->setKey(uniqid());
  282.         $availability->save();
  283.         $availabilities = $business->getAvailabilities();
  284.         array_push($availabilities,$availability);
  285.         $business->setAvailabilities($availabilities);
  286.         $business->save();
  287.         return $this->redirect($request->headers->get('referer'));
  288.     }
  289.     /**
  290.      * @Template
  291.      * @param Request $request
  292.      * @return array
  293.      * @route(
  294.      *      "/{_locale}/pro/availability/close/{id}",
  295.      *      name="closeAvailability",
  296.      *      methods={"GET"}
  297.      * )
  298.      */
  299.     public function closeAvailabilityAction(Request $request, FrontSecurity $security)
  300.     {
  301.        $resPermission =  $this->checkPermission($request, $security);
  302.         if(!(is_array($resPermission))){
  303.             return $resPermission;
  304.         }
  305.         $businesses = $resPermission["businesses"];
  306.         $business = $resPermission["business"];
  307.         // TODO check if availabilitey belong to business
  308.         $availability = Availability::getById($request->get('id'));
  309.         if(!$availability) {
  310.             throw new NotFoundException("Availability not found");
  311.         }
  312.         $availability->setClosed(!$availability->getClosed());
  313.         $availability->save();
  314.         return $this->redirect($request->headers->get('referer'));
  315.     }
  316.     /**
  317.      * @Template
  318.      * @param Request $request
  319.      * @return array
  320.      * @route(
  321.      *      "/{_locale}/pro/availability/remove/{id}",
  322.      *      name="removeAvailability",
  323.      *      methods={"GET"}
  324.      * )
  325.      */
  326.     public function removeAvailabilityAction(Request $request, FrontSecurity $security)
  327.     {
  328.        $resPermission =  $this->checkPermission($request, $security);
  329.         if(!(is_array($resPermission))){
  330.             return $resPermission;
  331.         }
  332.         $businesses = $resPermission["businesses"];
  333.         $business = $resPermission["business"];
  334.         //TODO check if availability belong to business
  335.         $availability = Availability::getById($request->get('id'));
  336.         if(!$availability) {
  337.             throw new NotFoundException("Availability not found");
  338.         }
  339.         $availability->delete();
  340.         return $this->redirect($request->headers->get('referer'));
  341.     }
  342.     /**
  343.      * @Template
  344.      * @param Request $request
  345.      * @return array
  346.      * @route("/{_locale}/pro/jobs", name="jobs", methods={"GET"})
  347.      */
  348.     public function jobsAction(Request $request, FrontSecurity $security)
  349.     {
  350.        $resPermission =  $this->checkPermission($request, $security);
  351.         if(!(is_array($resPermission))){
  352.             return $resPermission;
  353.         }
  354.        return $resPermission;
  355.     }
  356.     /**
  357.      * @Template
  358.      * @param Request $request
  359.      * @return array
  360.      * @route(
  361.      *      "/{_locale}/pro/jobs/new",
  362.      *      name="newJob",
  363.      *      methods={"GET","POST"}
  364.      * )
  365.      */
  366.     public function newJobAction(Request $request, FrontSecurity $security)
  367.     {
  368.        $resPermission =  $this->checkPermission($request, $security);
  369.         if(!(is_array($resPermission))){
  370.             return $resPermission;
  371.         }
  372.         $businesses = $resPermission["businesses"];
  373.         $business = $resPermission["business"];
  374.         if($request->isMethod('POST')) {
  375.             $languages = \Pimcore\Tool::getValidLanguages();
  376.             $folder = Folder::getByPath($business->getPath().$business->getKey().'/Jobs');
  377.             if(!$folder){
  378.                 $folder = new Folder();
  379.                 $folder->setKey('Jobs');
  380.                 $folder->setParentId($business->getId());
  381.                 $folder->save();
  382.             }
  383.             $job = new Job();
  384.             foreach($languages as $lang) {
  385.                 $job->setTitle($request->get('title'),$lang);
  386.                 $job->setContract($request->get('contract'),$lang);
  387.             }
  388.             $job->setEmail($request->get('email'));
  389.             $job->setKey(uniqid());
  390.             $job->setParentId($folder->getId());
  391.             $job->setPublished(true);
  392.             $job->save();
  393.             $jobs = $business->getJobs();
  394.             array_push($jobs, $job);
  395.             $business->setJobs($jobs);
  396.             $business->save();
  397.             return $this->redirectToRoute('jobs');
  398.         }
  399.         if(count($businesses) > 1) {
  400.             return ["business" => $business, "businesses" => $businesses];
  401.         }else {
  402.             return ["business" => $business];
  403.         }
  404.     }
  405.     /**
  406.      * @Template
  407.      * @param Request $request
  408.      * @return array
  409.      * @route(
  410.      *      "/{_locale}/pro/jobs/edit/{id}",
  411.      *      name="editJob",
  412.      *      methods={"GET","POST"}
  413.      * )
  414.      */
  415.     public function editJobAction(Request $request, FrontSecurity $security)
  416.     {
  417.         $resPermission =  $this->checkPermission($request, $security);
  418.         if(!(is_array($resPermission))){
  419.             return $resPermission;
  420.         }
  421.         $businesses = $resPermission["businesses"];
  422.         $business = $resPermission["business"];
  423.         //TODO check if job belong to business
  424.         $job = Job::getById($request->get('id'));
  425.         if(!$job){
  426.             throw new NotFoundException('Job not found');
  427.         }
  428.         if($request->isMethod('POST')) {
  429.             $languages = \Pimcore\Tool::getValidLanguages();
  430.             foreach($languages as $lang) {
  431.                 $job->setTitle($request->get('title'),$lang);
  432.                 $job->setContract($request->get('contract'),$lang);
  433.             }
  434.             $job->setEmail($request->get('email'));
  435.             $job->setPublished(true);
  436.             $job->save();
  437.             return $this->redirectToRoute('jobs');
  438.         }
  439.         $resPermission["job"] =$job;
  440.         return $resPermission;
  441.     }
  442.     /**
  443.      * @param Request $request
  444.      * @return redirect
  445.      * @route(
  446.      *      "/{_locale}/pro/jobs/remove/{id}",
  447.      *      name="removeJob",
  448.      *      methods={"GET"}
  449.      * )
  450.      */
  451.     public function removeJobAction(Request $request, FrontSecurity $security)
  452.     {
  453.        $resPermission =  $this->checkPermission($request, $security);
  454.         if(!(is_array($resPermission))){
  455.             return $resPermission;
  456.         }
  457.         $businesses = $resPermission["businesses"];
  458.         $business = $resPermission["business"];
  459.         //TODO check if job belong to business
  460.         $job = Job::getById( $request->get('id'));
  461.         $job->delete();
  462.         return $this->redirect($request->headers->get('referer'));
  463.     }
  464.     /**
  465.      * @Template
  466.      * @param Request $request
  467.      * @return array
  468.      * @route("/{_locale}/pro/profil", name="profil", methods={"GET"})
  469.      */
  470.     public function profileAction(Request $request, FrontSecurity $security)
  471.     {
  472.        $resPermission =  $this->checkPermission($request, $security);
  473.         if(!(is_array($resPermission))){
  474.             return $resPermission;
  475.         }
  476.         $businesses = $resPermission["businesses"];
  477.         $business = $resPermission["business"];
  478.         // On check et force la suppression des items si les datas sont nulls
  479.         $gallery = $business->getGallery();
  480.         $items = $gallery->getItems();
  481.         $deleteItems = false;
  482.         foreach($items as $key => $item) {
  483.             if($item === NULL) {
  484.                 unset($items[$key]);
  485.                 $deleteItems = true;
  486.             }
  487.         }
  488.         if($deleteItems == true) {
  489.             $gallery->setItems($items);
  490.             $business->setGallery($gallery);
  491.             $business->save();
  492.         }
  493.         $services = new Services\Listing();
  494.         $services->setOrder("name");
  495.         $services->load();
  496.         $organisations = new Organisation\Listing();
  497.         $organisations->setOrder("name");
  498.         $organisations->load();
  499.         $languages = new Language\Listing();
  500.         $languages->setOrder("lang");
  501.         $languages->load();
  502.         $res = ["business" => $business, "languages"=>$languages, "services" => $services, "organisations" => $organisations];
  503.         if (count($businesses)>1){
  504.             $res["businesses"] = $businesses;
  505.         }
  506.         return $res;
  507.     }
  508.     /**
  509.      * @Template
  510.      * @param Request $request
  511.      * @return array
  512.      * @route(
  513.      *      "/{_locale}/pro/profile/edit",
  514.      *      name="editProfile",
  515.      *      methods={"POST"}
  516.      * )
  517.      */
  518.     public function editProfileAction(Request $request, FrontSecurity $security)
  519.     {
  520.        $resPermission =  $this->checkPermission($request, $security);
  521.         if(!(is_array($resPermission))){
  522.             return $resPermission;
  523.         }
  524.         $businesses = $resPermission["businesses"];
  525.         $business = $resPermission["business"];
  526.         $languages = \Pimcore\Tool::getValidLanguages();
  527.         $presentation = $request->get('presentation');
  528.         foreach($languages as $lang) {
  529.             $business->setPresentation($presentation[$lang], $lang);
  530.         }
  531.         $business->setCustomTags($request->get('tags'));
  532.         if($business->getNursery()){
  533.             $business->setFrame($request->get('frame'));
  534.             $business->setPrice($request->get('price'));
  535.             //update services
  536.             $services = [];
  537.             if($request->get('services')){
  538.                 foreach($request->get('services') as $service) {
  539.                     array_push($services, Services::getById($service));
  540.                 }
  541.                 $business->setServices($services);
  542.             }
  543.             //update languages
  544.             $langs = [];
  545.             if($request->get('languages')){
  546.                 foreach($request->get('languages') as $lang) {
  547.                     array_push($langs, Language::getById($lang));
  548.                 }
  549.                 $business->setLangs($langs);
  550.             }
  551.             //update Organisation
  552.             if($request->get('organisation')){
  553.                 $business->setOrganisation(Organisation::getById($request->get('organisation')));
  554.             }else {
  555.                 $business->setOrganisation(null);
  556.             }
  557.         }
  558.         //create asset folder if doesn't exist
  559.         $provFolder = AssetFolder::getByPath($business->getPath());
  560.         if(!$provFolder){
  561.             $provFolder = new AssetFolder();
  562.             $provFolder->setKey(BusinessService::getProvince($business->getAddress()->getZip()));
  563.             $provFolder->setParentId(8);
  564.             $provFolder->save();
  565.         }
  566.         $folder = AssetFolder::getByPath($business->getPath().$business->getId());
  567.         if(!$folder){
  568.             $folder = new AssetFolder();
  569.             $folder->setKey($business->getId());
  570.             $folder->setParent($provFolder);
  571.             $folder->save();
  572.         }
  573.         //upload profile
  574.         $imgMainFile = $request->files->get('img-main');
  575.         if($imgMainFile) {
  576.             $imgMain = new Image();
  577.             $imgMain->setKey(uniqid().'.'.$imgMainFile->getClientOriginalExtension());
  578.             $imgMain->setParent($folder);
  579.             $imgMain->setData(file_get_contents($imgMainFile->getPath().'/'.$imgMainFile->getFileName()));
  580.             $imgMain->save();
  581.             $business->setImage($imgMain);
  582.         }
  583.         //upload banner
  584.         $imgBanner = $request->files->get('img-banner');
  585.         if($imgBanner){
  586.             $banner = new Image();
  587.             $banner->setKey(uniqid().'.'.$imgBanner->getClientOriginalExtension());
  588.             $banner->setParent($folder);
  589.             $banner->setData(file_get_contents($imgBanner->getPath().'/'.$imgBanner->getFileName()));
  590.             $banner->save();
  591.             $business->setBanner($banner);
  592.         }
  593.         //upload doc
  594.         $doc = $request->files->get('doc');
  595.         if($doc){
  596.             $newDoc = new Document();
  597.             $newDoc->setKey(uniqid().'.'.$doc->getClientOriginalExtension());
  598.             $newDoc->setParent($folder);
  599.             $newDoc->setData(file_get_contents($doc->getPath().'/'.$doc->getFileName()));
  600.             $newDoc->save();
  601.             $business->setDoc($newDoc);
  602.         }
  603.         $business->save();
  604.         return $this->redirect($request->headers->get('referer'));
  605.     }
  606.     /**
  607.      * @Template
  608.      * @param Request $request
  609.      * @return array
  610.      * @route("/{_locale}/pro/schedules", name="schedules", methods={"GET"})
  611.      */
  612.     public function scheduleAction(Request $request, FrontSecurity $security)
  613.     {
  614.        $resPermission =  $this->checkPermission($request, $security);
  615.         if(!(is_array($resPermission))){
  616.             return $resPermission;
  617.         }
  618.        return $resPermission;
  619.     }
  620.     /**
  621.      * @Template
  622.      * @param Request $request
  623.      * @return array
  624.      * @route(
  625.      *      "/{_locale}/pro/schedule/add",
  626.      *      name="addSchedule",
  627.      *      methods={"POST"}
  628.      * )
  629.      */
  630.     public function addScheduleAction(Request $request, FrontSecurity $security)
  631.     {
  632.        $resPermission =  $this->checkPermission($request, $security);
  633.         if(!(is_array($resPermission))){
  634.             return $resPermission;
  635.         }
  636.         $businesses = $resPermission["businesses"];
  637.         $business = $resPermission["business"];
  638.         $folder = Folder::getByPath($business->getPath().$business->getKey().'/Schedules');
  639.         if(!$folder){
  640.             $folder = new Folder();
  641.             $folder->setKey('Schedules');
  642.             $folder->setParentId($business->getId());
  643.             $folder->save();
  644.         }
  645.         $schedules = $business->getSchedules();
  646.         $found = null;
  647.         $day = $request->get('day');
  648.         foreach($schedules as $schedule) {
  649.             if($schedule->getDay() == $day){
  650.                 $found= $schedule;
  651.             }
  652.         }
  653.         if (!$found) {
  654.             $schedule = new Schedule();
  655.             $schedule->setDay($day);
  656.             $data = [
  657.                 "start" => new BlockElement("start", "time", $request->get('start')),
  658.                 "stop" => new BlockElement("start", "time", $request->get('stop'))
  659.             ];
  660.             $schedule->setHours([$data]);
  661.             $schedule->setParent($folder);
  662.             $schedule->setKey($schedule->getDay());
  663.             $schedule->setPublished(true);
  664.             $schedule->save();
  665.             array_push($schedules, $schedule);
  666.             $business->setSchedules($schedules);
  667.             $business->save();
  668.         }else {
  669.             $hours = $found->gethours();
  670.             $data = [
  671.                 "start" => new BlockElement("start", "time", $request->get('start')),
  672.                 "stop" => new BlockElement("start", "time", $request->get('stop'))
  673.             ];
  674.             array_push($hours,$data);
  675.             $found->setHours($hours);
  676.             $found->save();
  677.         }
  678.         return $this->redirect($request->headers->get('referer'));
  679.     }
  680.     /**
  681.      * @Template
  682.      * @param Request $request
  683.      * @return array
  684.      * @route(
  685.      *      "/{_locale}/pro/schedule/remove/{day}",
  686.      *      name="removeSchedule",
  687.      *      methods={"GET"}
  688.      * )
  689.      */
  690.     public function removeScheduleAction(Request $request, FrontSecurity $security)
  691.     {
  692.        $resPermission =  $this->checkPermission($request, $security);
  693.         if(!(is_array($resPermission))){
  694.             return $resPermission;
  695.         }
  696.         $businesses = $resPermission["businesses"];
  697.         $business = $resPermission["business"];
  698.         //TODO check schedule belong to business
  699.         $schedules = $business->getSchedules();
  700.         $found = null;
  701.         $day = $request->get('day');
  702.         foreach($schedules as $schedule) {
  703.             if($schedule->getDay() == $day){
  704.                 $found= $schedule;
  705.             }
  706.         }
  707.         if (!$found) {
  708.             throw new NotFoundException("Schedule not found");
  709.         }else {
  710.             $found->delete();
  711.         }
  712.         return $this->redirect($request->headers->get('referer'));
  713.     }
  714.     /**
  715.      * @Template
  716.      * @param Request $request
  717.      * @return array
  718.      * @route("/{_locale}/pro/details", name="details", methods={"GET"})
  719.      */
  720.     public function detailsAction(Request $request, FrontSecurity $security)
  721.     {
  722.        $resPermission =  $this->checkPermission($request, $security);
  723.         if(!(is_array($resPermission))){
  724.             return $resPermission;
  725.         }
  726.         $businesses = $resPermission["businesses"];
  727.         $business = $resPermission["business"];
  728.         $folder = Folder::getByPath($business->getPath().$business->getKey().'/Addresses');
  729.         if(!$folder){
  730.             $folder = new Folder();
  731.             $folder->setKey('Addresses');
  732.             $folder->setParentId($business->getId());
  733.             $folder->save();
  734.         }
  735.         $address = $business->getAddress();
  736.         if(!$address) {
  737.             $address = new Address();
  738.             $address->setKey("operational");
  739.             $address->setParent($folder);
  740.             $address->setPublished(true);
  741.             $address->save();
  742.             $business->setAddress($address);
  743.             $business->save();
  744.         }
  745.         $billing = $business->getBilling();
  746.         if(!$billing) {
  747.             $billing = new Address();
  748.             $billing->setKey("billing");
  749.             $billing->setParent($folder);
  750.             $billing->setPublished(true);
  751.             $billing->save();
  752.             $business->setBilling($billing);
  753.             $business->save();
  754.         }
  755.         if(count($businesses) > 1) {
  756.             return ["business" => $business, "businesses" => $businesses];
  757.         }else {
  758.             return ["business" => $business];
  759.         }
  760.     }
  761.     /**
  762.      * @Template
  763.      * @param Request $request
  764.      * @return array
  765.      * @route(
  766.      *      "/{_locale}/pro/details/edit",
  767.      *      name="editDetails",
  768.      *      methods={"POST"}
  769.      * )
  770.      */
  771.     public function editDetailsAction(Request $request, FrontSecurity $security)
  772.     {
  773.        $resPermission =  $this->checkPermission($request, $security);
  774.         if(!(is_array($resPermission))){
  775.             return $resPermission;
  776.         }
  777.         $businesses = $resPermission["businesses"];
  778.         $business = $resPermission["business"];
  779.         $folder = Folder::getByPath($business->getPath().$business->getKey().'/Addresses');
  780.         if(!$folder){
  781.             $folder = new Folder();
  782.             $folder->setKey('Addresses');
  783.             $folder->setParentId($business->getId());
  784.             $folder->save();
  785.         }
  786.         $address = $business->getAddress();
  787.         if(!$address) {
  788.             $address = new Address();
  789.             $address->setKey("operational");
  790.         }
  791.         $address->setParent($folder);
  792.         $address->setStreet($request->get('street'));
  793.         $address->setZip($request->get('zip'));
  794.         $address->setCity($request->get('city'));
  795.         $address->setCountry("BE");
  796.         $address->save();
  797.         $business->setAddress($address);
  798.         $business->setPhone($request->get('phone'));
  799.         $link = $request->get('website');
  800.         $scheme = parse_url($link, PHP_URL_SCHEME);
  801.         if (empty($scheme)){
  802.             $link = 'http://' . ltrim($link, '/');
  803.         }
  804.         $business->setWebsite($link);
  805.         $business->setEmail($request->get('email'));
  806.         $languages = \Pimcore\Tool::getValidLanguages();
  807.         foreach($languages as $lang) {
  808.             $business->setName($request->get('name'), $lang);
  809.         }
  810.         if ($security->getUser()->isGranted('ROLE_PRO')) {
  811.             $billing = $business->getBilling();
  812.             if(!$billing) {
  813.                 $billing = new Address();
  814.                 $billing->setKey("billing");
  815.             }
  816.             $billing->setParent($folder);
  817.             $billing->setCompanyName($request->get('billing-name'));
  818.             $billing->setTva($request->get('billing-tva'));
  819.             $billing->setContact($request->get('billing-contact'));
  820.             $billing->setStreet($request->get('billing-street'));
  821.             $billing->setZip($request->get('billing-zip'));
  822.             $billing->setCity($request->get('billing-city'));
  823.             $billing->setCountry("BE");
  824.             $billing->save();
  825.             $business->setBilling($billing);
  826.         }
  827.         $business->save();
  828.         if ($security->getUser()->isGranted('ROLE_PRO')) {
  829.             $stripe = new \Stripe\StripeClient(\Pimcore\Model\WebsiteSetting::getByName('stripeSecretKey')->getData());
  830.             $customer = $stripe->customers->update(
  831.                 $business->getStripeCustomerID(),
  832.                 [
  833.                     'address' => [
  834.                         'city' => $billing->getCity(),
  835.                         'country' => 'BE',
  836.                         'line1' => $billing->getStreet(),
  837.                         'postal_code' => $billing->getZip()
  838.                     ],
  839.                     'name' => $billing->getContact()
  840.                 ]
  841.             );
  842.             try{
  843.                 $stripe->customers->createTaxId(
  844.                     $business->getStripeCustomerID(),
  845.                     ['type' => 'eu_vat', 'value' => $billing->getTva()]
  846.                 );
  847.             }catch(Exception $e) {
  848.                 return $this->render('backend/details.html.twig',['error' => $e, "business"=> $business]);
  849.             }
  850.         }
  851.         return $this->redirect($request->headers->get('referer'));
  852.     }
  853.     /**
  854.      * @Template
  855.      * @param Request $request
  856.      * @return array
  857.      * @route(
  858.      *      "/{_locale}/pro/gallery/remove/{id}",
  859.      *      name="removeGalleryImage",
  860.      *      methods={"GET"}
  861.      * )
  862.      */
  863.     public function removeGalleryImageAction(Request $request, FrontSecurity $security)
  864.     {
  865.        $resPermission =  $this->checkPermission($request, $security);
  866.         if(!(is_array($resPermission))){
  867.             return $resPermission;
  868.         }
  869.         $businesses = $resPermission["businesses"];
  870.         $business = $resPermission["business"];
  871.         $gallery = $business->getGallery();
  872.         $items = $gallery->getItems();
  873.         //array_splice($items,$request->get('id'),1);
  874.         // unset au lieu de array_splice
  875.         unset($items[$request->get('id')]);
  876.         // On force la suppression des items si les datas sont nulls
  877.         foreach($items as $key => $item) {
  878.             if($item === NULL) {
  879.                 unset($items[$key]);
  880.             }
  881.         }
  882.         $gallery->setItems($items);
  883.         $business->setGallery($gallery);
  884.         $business->save();
  885.         return $this->redirect($request->headers->get('referer'));
  886.     }
  887.     /**
  888.      * @Template
  889.      * @param Request $request
  890.      * @return array
  891.      * @route(
  892.      *      "/{_locale}/pro/gallery/add",
  893.      *      name="uploadGalleryImage",
  894.      *      methods={"POST"}
  895.      * )
  896.      */
  897.     public function uploadToGalleryImageAction(Request $request, FrontSecurity $security)
  898.     {
  899.         $resPermission =  $this->checkPermission($request, $security);
  900.         if(!(is_array($resPermission))){
  901.             return $resPermission;
  902.         }
  903.         $businesses = $resPermission["businesses"];
  904.         $business = $resPermission["business"];
  905.         $gallery = $business->getGallery();
  906.         $items = $gallery->getItems();
  907.         //create asset folder if doesn't exist
  908.         $folder = AssetFolder::getByPath($business->getPath().'/'.$business->getKey());
  909.         if(!$folder){
  910.             $folder = new AssetFolder();
  911.             $folder->setKey($business->getKey());
  912.             $folder->setParent(AssetFolder::getByPath($business->getPath()));
  913.             $folder->save();
  914.         }
  915.         if(count($items) + count($request->files->get('gallery')) > 10) {
  916.             return $this->json(['status' => 'NOK', 'error' => 'Too much file in gallery']);
  917.         }
  918.         foreach ($request->files->get('gallery') as $img){
  919.             $assetImg = new Image();
  920.             $assetImg->setKey(uniqid().'.'.$img->getClientOriginalExtension());
  921.             $assetImg->setParent($folder);
  922.             $assetImg->setData(file_get_contents($img->getPath().'/'.$img->getFileName()));
  923.             $assetImg->save();
  924.             $advImg = new Hotspotimage();
  925.             $advImg->setImage($assetImg);
  926.             $items[]=$advImg;
  927.         }
  928.         $gallery->setItems($items);
  929.         $business->setGallery($gallery);
  930.         $business->save();
  931.         return $this->json(["status" => "OK"]);
  932.     }
  933.     /**
  934.      * @Template
  935.      * @param Request $request
  936.      * @return array
  937.      * @route("/{_locale}/pro/utilisateurs", name="addUserBusinessForm", methods={"GET", "POST"})
  938.      * @Security("is_granted('ROLE_PRO')")
  939.      */
  940.     public function addUserBusinessAction(Request $request, FrontSecurity $security, ValidatorInterface $validator, \Pimcore\Config\Config $websiteConfig)
  941.     {
  942.         $lang = $request->getLocale();
  943.         $resPermission =  $this->checkPermission($request, $security);
  944.         if(!(is_array($resPermission))){
  945.             return $resPermission;
  946.         }
  947.         $business = $resPermission["business"];
  948.         $user = new User();
  949.         if($request->isMethod("POST")){
  950.             $linkedUsers = $business->getUsers();
  951.             $flag = true;
  952.             foreach ($linkedUsers as $luser){
  953.                 if($request->get('email') == $luser->getUsername()){
  954.                     $flag = false;
  955.                 }
  956.             }
  957.             $gender = $request->get('gender');
  958.             $firstName = $request->get('firstname');
  959.             $lastName = $request->get('lastname');
  960.             $phone = $request->get('phone');
  961.             $user->setGender($gender);
  962.             $user->setFirstname($firstName);
  963.             $user->setLastname($lastName);
  964.             $user->setPhone($phone);
  965.             $email = $request->get('email');
  966.             $emailConstraint = new Assert\Email();
  967.             $errors = $validator->validate($email, $emailConstraint);
  968.             if (count($errors) > 0) {
  969.                 return $this->render('backend/new_business_user.html.twig',[
  970.                     "user" => $user,
  971.                     "error" => $errors[0]->getMessage()
  972.                 ]);
  973.             }
  974.             $checkUser = User::getByUsername($email, ['limit' => 1,'unpublished' => true]);
  975.             if ($checkUser && $checkUser->getPublished()) {
  976.                 $businnesses = $checkUser->getBusinesses();
  977.                 if($businnesses){
  978.                     if($flag){
  979.                         array_push($businnesses, $business);
  980.                         $checkUser->setBusinesses($businnesses);
  981.                     }
  982.                 } else{
  983.                     $checkUser->setBusinesses([$business]);
  984.                 }
  985.                 $checkUser->save();
  986.                 $this->sendEmailNotification($checkUser, $business, $lang, $websiteConfig, false, $request);
  987.                 if($flag){
  988.                     array_push($linkedUsers, $checkUser);
  989.                     $business->setUsers($linkedUsers);
  990.                     $business->save();
  991.                 }
  992.                 return $this->redirect($this->generateUrl("dashboard"));
  993.             }
  994.             $user->setUsername($email);
  995.             $user->setBusinesses([$business]);
  996.             $keyname = Service::getValidKey($email, 'object');
  997.             $user->setKey($keyname);
  998.             $user->setParent(Folder::getByPath('/users') ?? Folder::create(['o_parentId' => 1, 'o_key' => 'users']));
  999.             $user->setPublished(false);
  1000.             try{
  1001.                 $user->save();
  1002.             }catch(Exception $e) {
  1003.                 return $this->render('backend/new_business_user.html.twig',[
  1004.                     "user" => $user,
  1005.                     "error" => $e->getMessage()
  1006.                 ]);
  1007.             }
  1008.             $this->sendEmailNotification($user, $business, $lang, $websiteConfig, true, $request);
  1009.             if($flag){
  1010.                 array_push($linkedUsers, $user);
  1011.                 $business->setUsers($linkedUsers);
  1012.                 $business->save();
  1013.             }
  1014.             return $this->redirect($this->generateUrl("dashboard"));
  1015.         }
  1016.         return $this->render('backend/new_business_user.html.twig',[
  1017.             "user" => $user
  1018.         ]);
  1019.     }
  1020.     /**
  1021.      * @Template
  1022.      * @param Request $request
  1023.      * @return array
  1024.      * @route("/{_locale}/pro/utilisateur/delete/{id}", name="deleteUserBusinessForm", methods={"GET"})
  1025.      * @Security("is_granted('ROLE_PRO')")
  1026.      */
  1027.     public function deleteUserBusinessAction(Request $request, FrontSecurity $security, ValidatorInterface $validator, \Pimcore\Config\Config $websiteConfig)
  1028.     {
  1029.         $resPermission =  $this->checkPermission($request, $security);
  1030.         if(!(is_array($resPermission))){
  1031.             return $resPermission;
  1032.         }
  1033.         $business = $resPermission["business"];
  1034.         DataObject::setHideUnpublished(false);
  1035.         $linkedUsers = $business->getUsers();
  1036.         DataObject::setHideUnpublished(true);
  1037.         $newUserArray = [];
  1038.         foreach ($linkedUsers as $luser){
  1039.             if($request->get('id') != $luser->getId()){
  1040.                 $newUserArray[] = $luser;
  1041.             }else{
  1042.                 $userBusiness = $luser->getBusinesses();
  1043.                 $newBusinessArray = [];
  1044.                 foreach ($userBusiness as $bus){
  1045.                     if($bus->getId() != $business->getId()){
  1046.                         $newBusinessArray[] = $bus;
  1047.                     }
  1048.                 }
  1049.                 $luser->setBusinesses($newBusinessArray);
  1050.                 $luser->save();
  1051.             }
  1052.         }
  1053.         $business->setUsers($newUserArray);
  1054.         $business->save();
  1055.         return $this->redirect($this->generateUrl("dashboard"));
  1056.     }
  1057.     private function sendEmailNotification($user, $business, $lang, $websiteConfig, $mdp, $request){
  1058.         $mail = new Mail();
  1059.         if($mdp){
  1060.             $token = md5(time() * 10000);
  1061.             $user->setInscriptionToken($token);
  1062.             $nbrDays = intval($websiteConfig->get('expirationDaysAccount')) === 0 ? 2 : intval($websiteConfig->get('expirationDaysAccount'));
  1063.             $user->setInscriptionExpire(Carbon::now()->addDay($nbrDays));
  1064.             $user->save();
  1065.             $mail->setDocument('/'.$lang."/emails/added-to-business-new-user");
  1066.             $mail->setParams([
  1067.                 'link' => $request->getSchemeAndHttpHost().$this->generateUrl("confirmRegisteredUser", ['token' => $token]),
  1068.                 'business' => $business->getName($lang)
  1069.             ]);
  1070.         }else{
  1071.             $mail->setDocument('/'.$lang."/emails/added-to-business");
  1072.             $mail->setParam('business', $business->getName($lang));
  1073.         }
  1074.         $mail->to($user->getUsername());
  1075.         $mail->send();
  1076.     }
  1077. }