<?php
namespace App\Controller;
use App\Model\DataObject\Address;
use App\Model\DataObject\Business;
use App\Model\DataObject\User;
use App\Service\BusinessService;
use Carbon\Carbon;
use Exception;
use Pimcore\Controller\FrontendController;
use Pimcore\HttpKernel\BundleLocator\NotFoundException;
use Pimcore\Mail;
use Pimcore\Model\Asset;
use Pimcore\Model\Asset\Document;
use Pimcore\Model\Asset\Folder as AssetFolder;
use Pimcore\Model\Asset\Image;
use Pimcore\Model\DataObject;
use Pimcore\Model\DataObject\Availability;
use Pimcore\Model\DataObject\Booking;
use Pimcore\Model\DataObject\Data\BlockElement;
use Pimcore\Model\DataObject\Data\Hotspotimage;
use Pimcore\Model\DataObject\Folder;
use Pimcore\Model\DataObject\Job;
use Pimcore\Model\DataObject\Language;
use Pimcore\Model\DataObject\Organisation;
use Pimcore\Model\DataObject\Payment;
use Pimcore\Model\DataObject\Schedule;
use Pimcore\Model\DataObject\Services;
use Pimcore\Model\DataObject\Subscription;
use Pimcore\Model\Element\Service;
use Symfony\Component\HttpFoundation\Request;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\Routing\Annotation\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Stripe\Exception\SignatureVerificationException;
use Stripe\Exception\UnexpectedValueException;
use Stripe\Stripe;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Core\Security as FrontSecurity;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\Validator\Validator\ValidatorInterface;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use function PHPUnit\Framework\throwException;
class BackendController extends FrontendController
{
private function checkPermission(Request $request, $security, $premiumRedirect = true){
if($this->editmode){
return;
}
$securityUser = $security->getUser();
if (!$securityUser) {
return $this->redirect($this->generateUrl("login", ["_target_path" => $request->getRequestUri()]));
}
$user = User::getByUsername($securityUser->getUserIdentifier())->load()[0];
$businesses = $user->getBusinesses();
if(!$businesses) {
if($user->getPanier()){
$sub = $securityUser->getSubscriptions();
if($sub && $sub[0]->getStripeStatus() === "incomplete") {
return $this->redirectToRoute('waitingValidation');
}
return $this->redirectToRoute('panier');
}
return $this->redirectToRoute('newBusiness');
}
if(isset($businesses[$user->getLastBusinessUsed()])){
$business = $businesses[$user->getLastBusinessUsed()];
} else{
$user->setLastBusinessUsed(0);
$user->save();
$business = $businesses[0];
}
if($premiumRedirect) {
$newBusArray = [];
foreach($businesses as $newPan){
if($newPan->getPremium()){
$newBusArray[] = $newPan;
} else{
$user->setPanier([...$user->getPanier(), $newPan]);
}
}
$businesses = $newBusArray;
$user->setBusinesses($businesses);
$user->save();
if(!$businesses){
$sub = $securityUser->getSubscriptions();
if($sub && $sub[0]->getStripeStatus() === "incomplete") {
return $this->redirectToRoute('waitingValidation');
}
return $this->redirectToRoute('panier');
}
if(!$business->getPremium()){
$user->setLastBusinessUsed(0);
$user->save();
$business = $businesses[0];
}
}
return ["business" => $business, "businesses" => $businesses, "user" => $user];
}
/**
* @Template
* @param Request $request
* @return array
* @route(
* "/{_locale}/pro/dashboard",
* name="dashboard",
* methods={"GET"}
* )
*/
public function dashboardAction(Request $request, FrontSecurity $security)
{
$resPermission = $this->checkPermission($request, $security);
if(!(is_array($resPermission))){
return $resPermission;
}
$resPermission["nextLeaving"] = $resPermission["business"]->nextLeaving();
$resPermission["nextComing"] = $resPermission["business"]->nextComing();
$resPermission["nbreVisites"] = count($resPermission["business"]->getVisites());
return $resPermission;
}
/**
* @route("{_locale}/pro/changeBusiness", name="changeBusiness", methods={"GET"})
*/
public function changeBusinessAction(Request $request, FrontSecurity $security)
{
$securityUser = $security->getUser();
if (!$securityUser) {
return $this->redirect($this->generateUrl("login"));
}
$user = User::getByUsername($securityUser->getUserIdentifier())->load()[0];
$businesses = $user->getBusinesses();
$index = $request->get('index');
if($index < count($businesses) && $index >= 0){
$user->setLastBusinessUsed($index);
$user->save();
}
return $this->redirect($request->headers->get('referer'));
}
/**
* @Template
* @param Request $request
* @return array
* @route("/{_locale}/pro/availabilities", name="availabilities", methods={"GET"})
*/
public function availabilitiesAction(Request $request, FrontSecurity $security)
{
$resPermission = $this->checkPermission($request, $security);
if(!(is_array($resPermission))){
return $resPermission;
}
if(!$resPermission['business']->getNursery()){
return $this->redirectToRoute('dashboard');
}
return $resPermission;
}
/**
* @Template
* @param Request $request
* @return array
* @route(
* "/{_locale}/pro/booking/add/{id}",
* name="addBooking",
* methods={"POST"}
* )
*/
public function addBookingAction(Request $request, FrontSecurity $security)
{
$resPermission = $this->checkPermission($request, $security);
if(!(is_array($resPermission))){
return $resPermission;
}
$businesses = $resPermission["businesses"];
$business = $resPermission["business"];
//TODO check if availabilities belong to business
$availability = Availability::getById($request->get('id'));
if(!$availability) {
throw new NotFoundException("Availability not found");
}
$booking = new Booking();
$booking->setName($request->get('name'));
$booking->setStart(Carbon::create($request->get('start')));
$booking->setStop(Carbon::create($request->get('stop')));
$booking->setPartTime($request->get('partTime'));
$booking->setParent($availability);
$booking->setKey($booking->getName().uniqid());
$booking->setPublished(true);
$booking->save();
$reservations = $availability->getReservations();
array_push($reservations,$booking);
$availability->setReservations($reservations);
$availability->save();
return $this->redirect($request->headers->get('referer'));
}
/**
* @Template
* @param Request $request
* @return array
* @route(
* "/{_locale}/pro/booking/edit/{id}",
* name="editBooking",
* methods={"POST"}
* )
*/
public function editBookingAction(Request $request, FrontSecurity $security)
{
$resPermission = $this->checkPermission($request, $security);
if(!(is_array($resPermission))){
return $resPermission;
}
$businesses = $resPermission["businesses"];
$business = $resPermission["business"];
//TODO check if booking belong to current business
$booking = Booking::getById($request->get('id'));
if(!$booking) {
throw new NotFoundException("Booking not found");
}
$booking->setName($request->get('name'));
$booking->setStart(Carbon::create($request->get('start')));
$booking->setStop(Carbon::create($request->get('stop')));
$booking->setPartTime($request->get('partTime'));
$booking->save();
return $this->redirect($request->headers->get('referer'));
}
/**
* @Template
* @param Request $request
* @return array
* @route(
* "/{_locale}/pro/booking/remove/{id}",
* name="removeBooking",
* methods={"GET"}
* )
*/
public function removeBookingAction(Request $request, FrontSecurity $security)
{
$resPermission = $this->checkPermission($request, $security);
if(!(is_array($resPermission))){
return $resPermission;
}
$businesses = $resPermission["businesses"];
$business = $resPermission["business"];
//TODO check if booking belong to current business
$booking = Booking::getById($request->get('id'));
if(!$booking) {
throw new NotFoundException("Booking not found");
}
$booking->delete();
return $this->redirect($request->headers->get('referer'));
}
/**
* @Template
* @param Request $request
* @return array
* @route(
* "/{_locale}/pro/availability/add",
* name="addAvailability",
* methods={"GET"}
* )
*/
public function addAvailabilityAction(Request $request, FrontSecurity $security)
{
$resPermission = $this->checkPermission($request, $security);
if(!(is_array($resPermission))){
return $resPermission;
}
$businesses = $resPermission["businesses"];
$business = $resPermission["business"];
$folder = Folder::getByPath($business->getPath().$business->getKey().'/Availabilities');
if(!$folder){
$folder = new Folder();
$folder->setKey('Availabilities');
$folder->setParentId($business->getId());
$folder->save();
}
$availability = new Availability();
$availability->setPublished(true);
$availability->setParent($folder);
$availability->setKey(uniqid());
$availability->save();
$availabilities = $business->getAvailabilities();
array_push($availabilities,$availability);
$business->setAvailabilities($availabilities);
$business->save();
return $this->redirect($request->headers->get('referer'));
}
/**
* @Template
* @param Request $request
* @return array
* @route(
* "/{_locale}/pro/availability/close/{id}",
* name="closeAvailability",
* methods={"GET"}
* )
*/
public function closeAvailabilityAction(Request $request, FrontSecurity $security)
{
$resPermission = $this->checkPermission($request, $security);
if(!(is_array($resPermission))){
return $resPermission;
}
$businesses = $resPermission["businesses"];
$business = $resPermission["business"];
// TODO check if availabilitey belong to business
$availability = Availability::getById($request->get('id'));
if(!$availability) {
throw new NotFoundException("Availability not found");
}
$availability->setClosed(!$availability->getClosed());
$availability->save();
return $this->redirect($request->headers->get('referer'));
}
/**
* @Template
* @param Request $request
* @return array
* @route(
* "/{_locale}/pro/availability/remove/{id}",
* name="removeAvailability",
* methods={"GET"}
* )
*/
public function removeAvailabilityAction(Request $request, FrontSecurity $security)
{
$resPermission = $this->checkPermission($request, $security);
if(!(is_array($resPermission))){
return $resPermission;
}
$businesses = $resPermission["businesses"];
$business = $resPermission["business"];
//TODO check if availability belong to business
$availability = Availability::getById($request->get('id'));
if(!$availability) {
throw new NotFoundException("Availability not found");
}
$availability->delete();
return $this->redirect($request->headers->get('referer'));
}
/**
* @Template
* @param Request $request
* @return array
* @route("/{_locale}/pro/jobs", name="jobs", methods={"GET"})
*/
public function jobsAction(Request $request, FrontSecurity $security)
{
$resPermission = $this->checkPermission($request, $security);
if(!(is_array($resPermission))){
return $resPermission;
}
return $resPermission;
}
/**
* @Template
* @param Request $request
* @return array
* @route(
* "/{_locale}/pro/jobs/new",
* name="newJob",
* methods={"GET","POST"}
* )
*/
public function newJobAction(Request $request, FrontSecurity $security)
{
$resPermission = $this->checkPermission($request, $security);
if(!(is_array($resPermission))){
return $resPermission;
}
$businesses = $resPermission["businesses"];
$business = $resPermission["business"];
if($request->isMethod('POST')) {
$languages = \Pimcore\Tool::getValidLanguages();
$folder = Folder::getByPath($business->getPath().$business->getKey().'/Jobs');
if(!$folder){
$folder = new Folder();
$folder->setKey('Jobs');
$folder->setParentId($business->getId());
$folder->save();
}
$job = new Job();
foreach($languages as $lang) {
$job->setTitle($request->get('title'),$lang);
$job->setContract($request->get('contract'),$lang);
}
$job->setEmail($request->get('email'));
$job->setKey(uniqid());
$job->setParentId($folder->getId());
$job->setPublished(true);
$job->save();
$jobs = $business->getJobs();
array_push($jobs, $job);
$business->setJobs($jobs);
$business->save();
return $this->redirectToRoute('jobs');
}
if(count($businesses) > 1) {
return ["business" => $business, "businesses" => $businesses];
}else {
return ["business" => $business];
}
}
/**
* @Template
* @param Request $request
* @return array
* @route(
* "/{_locale}/pro/jobs/edit/{id}",
* name="editJob",
* methods={"GET","POST"}
* )
*/
public function editJobAction(Request $request, FrontSecurity $security)
{
$resPermission = $this->checkPermission($request, $security);
if(!(is_array($resPermission))){
return $resPermission;
}
$businesses = $resPermission["businesses"];
$business = $resPermission["business"];
//TODO check if job belong to business
$job = Job::getById($request->get('id'));
if(!$job){
throw new NotFoundException('Job not found');
}
if($request->isMethod('POST')) {
$languages = \Pimcore\Tool::getValidLanguages();
foreach($languages as $lang) {
$job->setTitle($request->get('title'),$lang);
$job->setContract($request->get('contract'),$lang);
}
$job->setEmail($request->get('email'));
$job->setPublished(true);
$job->save();
return $this->redirectToRoute('jobs');
}
$resPermission["job"] =$job;
return $resPermission;
}
/**
* @param Request $request
* @return redirect
* @route(
* "/{_locale}/pro/jobs/remove/{id}",
* name="removeJob",
* methods={"GET"}
* )
*/
public function removeJobAction(Request $request, FrontSecurity $security)
{
$resPermission = $this->checkPermission($request, $security);
if(!(is_array($resPermission))){
return $resPermission;
}
$businesses = $resPermission["businesses"];
$business = $resPermission["business"];
//TODO check if job belong to business
$job = Job::getById( $request->get('id'));
$job->delete();
return $this->redirect($request->headers->get('referer'));
}
/**
* @Template
* @param Request $request
* @return array
* @route("/{_locale}/pro/profil", name="profil", methods={"GET"})
*/
public function profileAction(Request $request, FrontSecurity $security)
{
$resPermission = $this->checkPermission($request, $security);
if(!(is_array($resPermission))){
return $resPermission;
}
$businesses = $resPermission["businesses"];
$business = $resPermission["business"];
// On check et force la suppression des items si les datas sont nulls
$gallery = $business->getGallery();
$items = $gallery->getItems();
$deleteItems = false;
foreach($items as $key => $item) {
if($item === NULL) {
unset($items[$key]);
$deleteItems = true;
}
}
if($deleteItems == true) {
$gallery->setItems($items);
$business->setGallery($gallery);
$business->save();
}
$services = new Services\Listing();
$services->setOrder("name");
$services->load();
$organisations = new Organisation\Listing();
$organisations->setOrder("name");
$organisations->load();
$languages = new Language\Listing();
$languages->setOrder("lang");
$languages->load();
$res = ["business" => $business, "languages"=>$languages, "services" => $services, "organisations" => $organisations];
if (count($businesses)>1){
$res["businesses"] = $businesses;
}
return $res;
}
/**
* @Template
* @param Request $request
* @return array
* @route(
* "/{_locale}/pro/profile/edit",
* name="editProfile",
* methods={"POST"}
* )
*/
public function editProfileAction(Request $request, FrontSecurity $security)
{
$resPermission = $this->checkPermission($request, $security);
if(!(is_array($resPermission))){
return $resPermission;
}
$businesses = $resPermission["businesses"];
$business = $resPermission["business"];
$languages = \Pimcore\Tool::getValidLanguages();
$presentation = $request->get('presentation');
foreach($languages as $lang) {
$business->setPresentation($presentation[$lang], $lang);
}
$business->setCustomTags($request->get('tags'));
if($business->getNursery()){
$business->setFrame($request->get('frame'));
$business->setPrice($request->get('price'));
//update services
$services = [];
if($request->get('services')){
foreach($request->get('services') as $service) {
array_push($services, Services::getById($service));
}
$business->setServices($services);
}
//update languages
$langs = [];
if($request->get('languages')){
foreach($request->get('languages') as $lang) {
array_push($langs, Language::getById($lang));
}
$business->setLangs($langs);
}
//update Organisation
if($request->get('organisation')){
$business->setOrganisation(Organisation::getById($request->get('organisation')));
}else {
$business->setOrganisation(null);
}
}
//create asset folder if doesn't exist
$provFolder = AssetFolder::getByPath($business->getPath());
if(!$provFolder){
$provFolder = new AssetFolder();
$provFolder->setKey(BusinessService::getProvince($business->getAddress()->getZip()));
$provFolder->setParentId(8);
$provFolder->save();
}
$folder = AssetFolder::getByPath($business->getPath().$business->getId());
if(!$folder){
$folder = new AssetFolder();
$folder->setKey($business->getId());
$folder->setParent($provFolder);
$folder->save();
}
//upload profile
$imgMainFile = $request->files->get('img-main');
if($imgMainFile) {
$imgMain = new Image();
$imgMain->setKey(uniqid().'.'.$imgMainFile->getClientOriginalExtension());
$imgMain->setParent($folder);
$imgMain->setData(file_get_contents($imgMainFile->getPath().'/'.$imgMainFile->getFileName()));
$imgMain->save();
$business->setImage($imgMain);
}
//upload banner
$imgBanner = $request->files->get('img-banner');
if($imgBanner){
$banner = new Image();
$banner->setKey(uniqid().'.'.$imgBanner->getClientOriginalExtension());
$banner->setParent($folder);
$banner->setData(file_get_contents($imgBanner->getPath().'/'.$imgBanner->getFileName()));
$banner->save();
$business->setBanner($banner);
}
//upload doc
$doc = $request->files->get('doc');
if($doc){
$newDoc = new Document();
$newDoc->setKey(uniqid().'.'.$doc->getClientOriginalExtension());
$newDoc->setParent($folder);
$newDoc->setData(file_get_contents($doc->getPath().'/'.$doc->getFileName()));
$newDoc->save();
$business->setDoc($newDoc);
}
$business->save();
return $this->redirect($request->headers->get('referer'));
}
/**
* @Template
* @param Request $request
* @return array
* @route("/{_locale}/pro/schedules", name="schedules", methods={"GET"})
*/
public function scheduleAction(Request $request, FrontSecurity $security)
{
$resPermission = $this->checkPermission($request, $security);
if(!(is_array($resPermission))){
return $resPermission;
}
return $resPermission;
}
/**
* @Template
* @param Request $request
* @return array
* @route(
* "/{_locale}/pro/schedule/add",
* name="addSchedule",
* methods={"POST"}
* )
*/
public function addScheduleAction(Request $request, FrontSecurity $security)
{
$resPermission = $this->checkPermission($request, $security);
if(!(is_array($resPermission))){
return $resPermission;
}
$businesses = $resPermission["businesses"];
$business = $resPermission["business"];
$folder = Folder::getByPath($business->getPath().$business->getKey().'/Schedules');
if(!$folder){
$folder = new Folder();
$folder->setKey('Schedules');
$folder->setParentId($business->getId());
$folder->save();
}
$schedules = $business->getSchedules();
$found = null;
$day = $request->get('day');
foreach($schedules as $schedule) {
if($schedule->getDay() == $day){
$found= $schedule;
}
}
if (!$found) {
$schedule = new Schedule();
$schedule->setDay($day);
$data = [
"start" => new BlockElement("start", "time", $request->get('start')),
"stop" => new BlockElement("start", "time", $request->get('stop'))
];
$schedule->setHours([$data]);
$schedule->setParent($folder);
$schedule->setKey($schedule->getDay());
$schedule->setPublished(true);
$schedule->save();
array_push($schedules, $schedule);
$business->setSchedules($schedules);
$business->save();
}else {
$hours = $found->gethours();
$data = [
"start" => new BlockElement("start", "time", $request->get('start')),
"stop" => new BlockElement("start", "time", $request->get('stop'))
];
array_push($hours,$data);
$found->setHours($hours);
$found->save();
}
return $this->redirect($request->headers->get('referer'));
}
/**
* @Template
* @param Request $request
* @return array
* @route(
* "/{_locale}/pro/schedule/remove/{day}",
* name="removeSchedule",
* methods={"GET"}
* )
*/
public function removeScheduleAction(Request $request, FrontSecurity $security)
{
$resPermission = $this->checkPermission($request, $security);
if(!(is_array($resPermission))){
return $resPermission;
}
$businesses = $resPermission["businesses"];
$business = $resPermission["business"];
//TODO check schedule belong to business
$schedules = $business->getSchedules();
$found = null;
$day = $request->get('day');
foreach($schedules as $schedule) {
if($schedule->getDay() == $day){
$found= $schedule;
}
}
if (!$found) {
throw new NotFoundException("Schedule not found");
}else {
$found->delete();
}
return $this->redirect($request->headers->get('referer'));
}
/**
* @Template
* @param Request $request
* @return array
* @route("/{_locale}/pro/details", name="details", methods={"GET"})
*/
public function detailsAction(Request $request, FrontSecurity $security)
{
$resPermission = $this->checkPermission($request, $security);
if(!(is_array($resPermission))){
return $resPermission;
}
$businesses = $resPermission["businesses"];
$business = $resPermission["business"];
$folder = Folder::getByPath($business->getPath().$business->getKey().'/Addresses');
if(!$folder){
$folder = new Folder();
$folder->setKey('Addresses');
$folder->setParentId($business->getId());
$folder->save();
}
$address = $business->getAddress();
if(!$address) {
$address = new Address();
$address->setKey("operational");
$address->setParent($folder);
$address->setPublished(true);
$address->save();
$business->setAddress($address);
$business->save();
}
$billing = $business->getBilling();
if(!$billing) {
$billing = new Address();
$billing->setKey("billing");
$billing->setParent($folder);
$billing->setPublished(true);
$billing->save();
$business->setBilling($billing);
$business->save();
}
if(count($businesses) > 1) {
return ["business" => $business, "businesses" => $businesses];
}else {
return ["business" => $business];
}
}
/**
* @Template
* @param Request $request
* @return array
* @route(
* "/{_locale}/pro/details/edit",
* name="editDetails",
* methods={"POST"}
* )
*/
public function editDetailsAction(Request $request, FrontSecurity $security)
{
$resPermission = $this->checkPermission($request, $security);
if(!(is_array($resPermission))){
return $resPermission;
}
$businesses = $resPermission["businesses"];
$business = $resPermission["business"];
$folder = Folder::getByPath($business->getPath().$business->getKey().'/Addresses');
if(!$folder){
$folder = new Folder();
$folder->setKey('Addresses');
$folder->setParentId($business->getId());
$folder->save();
}
$address = $business->getAddress();
if(!$address) {
$address = new Address();
$address->setKey("operational");
}
$address->setParent($folder);
$address->setStreet($request->get('street'));
$address->setZip($request->get('zip'));
$address->setCity($request->get('city'));
$address->setCountry("BE");
$address->save();
$business->setAddress($address);
$business->setPhone($request->get('phone'));
$link = $request->get('website');
$scheme = parse_url($link, PHP_URL_SCHEME);
if (empty($scheme)){
$link = 'http://' . ltrim($link, '/');
}
$business->setWebsite($link);
$business->setEmail($request->get('email'));
$languages = \Pimcore\Tool::getValidLanguages();
foreach($languages as $lang) {
$business->setName($request->get('name'), $lang);
}
if ($security->getUser()->isGranted('ROLE_PRO')) {
$billing = $business->getBilling();
if(!$billing) {
$billing = new Address();
$billing->setKey("billing");
}
$billing->setParent($folder);
$billing->setCompanyName($request->get('billing-name'));
$billing->setTva($request->get('billing-tva'));
$billing->setContact($request->get('billing-contact'));
$billing->setStreet($request->get('billing-street'));
$billing->setZip($request->get('billing-zip'));
$billing->setCity($request->get('billing-city'));
$billing->setCountry("BE");
$billing->save();
$business->setBilling($billing);
}
$business->save();
if ($security->getUser()->isGranted('ROLE_PRO')) {
$stripe = new \Stripe\StripeClient(\Pimcore\Model\WebsiteSetting::getByName('stripeSecretKey')->getData());
$customer = $stripe->customers->update(
$business->getStripeCustomerID(),
[
'address' => [
'city' => $billing->getCity(),
'country' => 'BE',
'line1' => $billing->getStreet(),
'postal_code' => $billing->getZip()
],
'name' => $billing->getContact()
]
);
try{
$stripe->customers->createTaxId(
$business->getStripeCustomerID(),
['type' => 'eu_vat', 'value' => $billing->getTva()]
);
}catch(Exception $e) {
return $this->render('backend/details.html.twig',['error' => $e, "business"=> $business]);
}
}
return $this->redirect($request->headers->get('referer'));
}
/**
* @Template
* @param Request $request
* @return array
* @route(
* "/{_locale}/pro/gallery/remove/{id}",
* name="removeGalleryImage",
* methods={"GET"}
* )
*/
public function removeGalleryImageAction(Request $request, FrontSecurity $security)
{
$resPermission = $this->checkPermission($request, $security);
if(!(is_array($resPermission))){
return $resPermission;
}
$businesses = $resPermission["businesses"];
$business = $resPermission["business"];
$gallery = $business->getGallery();
$items = $gallery->getItems();
//array_splice($items,$request->get('id'),1);
// unset au lieu de array_splice
unset($items[$request->get('id')]);
// On force la suppression des items si les datas sont nulls
foreach($items as $key => $item) {
if($item === NULL) {
unset($items[$key]);
}
}
$gallery->setItems($items);
$business->setGallery($gallery);
$business->save();
return $this->redirect($request->headers->get('referer'));
}
/**
* @Template
* @param Request $request
* @return array
* @route(
* "/{_locale}/pro/gallery/add",
* name="uploadGalleryImage",
* methods={"POST"}
* )
*/
public function uploadToGalleryImageAction(Request $request, FrontSecurity $security)
{
$resPermission = $this->checkPermission($request, $security);
if(!(is_array($resPermission))){
return $resPermission;
}
$businesses = $resPermission["businesses"];
$business = $resPermission["business"];
$gallery = $business->getGallery();
$items = $gallery->getItems();
//create asset folder if doesn't exist
$folder = AssetFolder::getByPath($business->getPath().'/'.$business->getKey());
if(!$folder){
$folder = new AssetFolder();
$folder->setKey($business->getKey());
$folder->setParent(AssetFolder::getByPath($business->getPath()));
$folder->save();
}
if(count($items) + count($request->files->get('gallery')) > 10) {
return $this->json(['status' => 'NOK', 'error' => 'Too much file in gallery']);
}
foreach ($request->files->get('gallery') as $img){
$assetImg = new Image();
$assetImg->setKey(uniqid().'.'.$img->getClientOriginalExtension());
$assetImg->setParent($folder);
$assetImg->setData(file_get_contents($img->getPath().'/'.$img->getFileName()));
$assetImg->save();
$advImg = new Hotspotimage();
$advImg->setImage($assetImg);
$items[]=$advImg;
}
$gallery->setItems($items);
$business->setGallery($gallery);
$business->save();
return $this->json(["status" => "OK"]);
}
/**
* @Template
* @param Request $request
* @return array
* @route("/{_locale}/pro/utilisateurs", name="addUserBusinessForm", methods={"GET", "POST"})
* @Security("is_granted('ROLE_PRO')")
*/
public function addUserBusinessAction(Request $request, FrontSecurity $security, ValidatorInterface $validator, \Pimcore\Config\Config $websiteConfig)
{
$lang = $request->getLocale();
$resPermission = $this->checkPermission($request, $security);
if(!(is_array($resPermission))){
return $resPermission;
}
$business = $resPermission["business"];
$user = new User();
if($request->isMethod("POST")){
$linkedUsers = $business->getUsers();
$flag = true;
foreach ($linkedUsers as $luser){
if($request->get('email') == $luser->getUsername()){
$flag = false;
}
}
$gender = $request->get('gender');
$firstName = $request->get('firstname');
$lastName = $request->get('lastname');
$phone = $request->get('phone');
$user->setGender($gender);
$user->setFirstname($firstName);
$user->setLastname($lastName);
$user->setPhone($phone);
$email = $request->get('email');
$emailConstraint = new Assert\Email();
$errors = $validator->validate($email, $emailConstraint);
if (count($errors) > 0) {
return $this->render('backend/new_business_user.html.twig',[
"user" => $user,
"error" => $errors[0]->getMessage()
]);
}
$checkUser = User::getByUsername($email, ['limit' => 1,'unpublished' => true]);
if ($checkUser && $checkUser->getPublished()) {
$businnesses = $checkUser->getBusinesses();
if($businnesses){
if($flag){
array_push($businnesses, $business);
$checkUser->setBusinesses($businnesses);
}
} else{
$checkUser->setBusinesses([$business]);
}
$checkUser->save();
$this->sendEmailNotification($checkUser, $business, $lang, $websiteConfig, false, $request);
if($flag){
array_push($linkedUsers, $checkUser);
$business->setUsers($linkedUsers);
$business->save();
}
return $this->redirect($this->generateUrl("dashboard"));
}
$user->setUsername($email);
$user->setBusinesses([$business]);
$keyname = Service::getValidKey($email, 'object');
$user->setKey($keyname);
$user->setParent(Folder::getByPath('/users') ?? Folder::create(['o_parentId' => 1, 'o_key' => 'users']));
$user->setPublished(false);
try{
$user->save();
}catch(Exception $e) {
return $this->render('backend/new_business_user.html.twig',[
"user" => $user,
"error" => $e->getMessage()
]);
}
$this->sendEmailNotification($user, $business, $lang, $websiteConfig, true, $request);
if($flag){
array_push($linkedUsers, $user);
$business->setUsers($linkedUsers);
$business->save();
}
return $this->redirect($this->generateUrl("dashboard"));
}
return $this->render('backend/new_business_user.html.twig',[
"user" => $user
]);
}
/**
* @Template
* @param Request $request
* @return array
* @route("/{_locale}/pro/utilisateur/delete/{id}", name="deleteUserBusinessForm", methods={"GET"})
* @Security("is_granted('ROLE_PRO')")
*/
public function deleteUserBusinessAction(Request $request, FrontSecurity $security, ValidatorInterface $validator, \Pimcore\Config\Config $websiteConfig)
{
$resPermission = $this->checkPermission($request, $security);
if(!(is_array($resPermission))){
return $resPermission;
}
$business = $resPermission["business"];
DataObject::setHideUnpublished(false);
$linkedUsers = $business->getUsers();
DataObject::setHideUnpublished(true);
$newUserArray = [];
foreach ($linkedUsers as $luser){
if($request->get('id') != $luser->getId()){
$newUserArray[] = $luser;
}else{
$userBusiness = $luser->getBusinesses();
$newBusinessArray = [];
foreach ($userBusiness as $bus){
if($bus->getId() != $business->getId()){
$newBusinessArray[] = $bus;
}
}
$luser->setBusinesses($newBusinessArray);
$luser->save();
}
}
$business->setUsers($newUserArray);
$business->save();
return $this->redirect($this->generateUrl("dashboard"));
}
private function sendEmailNotification($user, $business, $lang, $websiteConfig, $mdp, $request){
$mail = new Mail();
if($mdp){
$token = md5(time() * 10000);
$user->setInscriptionToken($token);
$nbrDays = intval($websiteConfig->get('expirationDaysAccount')) === 0 ? 2 : intval($websiteConfig->get('expirationDaysAccount'));
$user->setInscriptionExpire(Carbon::now()->addDay($nbrDays));
$user->save();
$mail->setDocument('/'.$lang."/emails/added-to-business-new-user");
$mail->setParams([
'link' => $request->getSchemeAndHttpHost().$this->generateUrl("confirmRegisteredUser", ['token' => $token]),
'business' => $business->getName($lang)
]);
}else{
$mail->setDocument('/'.$lang."/emails/added-to-business");
$mail->setParam('business', $business->getName($lang));
}
$mail->to($user->getUsername());
$mail->send();
}
}