<?php
namespace App\Controller;
use App\Client\StripeClient;
use App\Dto\Slot;
use App\Entity\Account;
use App\Entity\City;
use App\Entity\CustomerProfile;
use App\Entity\GroupSession;
use App\Entity\Need;
use App\Entity\Partner;
use App\Entity\PartnerNote;
use App\Entity\PartnerSecondaryLocation;
use App\Entity\PartnerSubscription;
use App\Entity\Reservation;
use App\Entity\ReservationPayment;
use App\Entity\ReservationPaymentLog;
use App\Entity\ServiceDelivery;
use App\Entity\ServiceDeliveryPlace;
use App\Entity\Speciality;
use App\Entity\SpecialityHasCity;
use App\Entity\User;
use App\Entity\VillesFrance;
use App\Form\PartnerNoteType;
use App\Form\UserLoginType;
use App\Form\UserRegisterType;
use App\Security\PasswordEncoder;
use App\Service\GoogleCalendarService;
use App\Service\ICalService;
use App\Service\MailjetEmailService;
use App\Utils\AgendaUtils;
use Doctrine\ORM\EntityManagerInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Stripe\Exception\ApiErrorException;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\HttpFoundation\Exception\BadRequestException;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
use Symfony\Component\Security\Http\SecurityEvents;
use Symfony\Component\Validator\Constraints\NotBlank;
use ICal\ICal;
/**
* Class PraticiensController
* @package App\Controller
*
* @Route("/praticiens", name="praticiens_")
*/
class PraticiensController extends AbstractController
{
private $em;
public function __construct(EntityManagerInterface $em)
{
$this->em = $em;
}
/**
* @Route(
* path="/",
* name="list",
* options={"sitemap" = true}
* )
*
* @return Response
*/
public function listAction(Request $request, EntityManagerInterface $em)
{
$specialities = $em->getRepository(Speciality::class)->findAll();
// Groupement alphabétique
$specialities_grouped = [];
foreach ($specialities as $speciality) {
$firstLetter = $speciality->getLabel()[0];
$firstLetter = strtoupper($firstLetter);
if (!array_key_exists($firstLetter, $specialities_grouped)) {
$specialities_grouped[$firstLetter] = [];
}
$specialities_grouped[$firstLetter][] = $speciality;
}
ksort($specialities_grouped);
return $this->render('praticiens/list.html.twig', [
"specialities_grouped" => $specialities_grouped,
]);
}
/**
* @Route(
* path="/{slugJob}",
* name="fiche"
* )
*
* @return Response
*/
public function ficheAction(Speciality $speciality, Request $request)
{
$terms = $speciality->getLabel();
$keywords= null;
if ($terms) {
$termsExplode = explode(" ", $terms);
if (count($termsExplode)) {
$keywords = $termsExplode;
}
}
$radius = $request->get('rad');
if (!$radius || intval($radius) < 5 || intval($radius) > 50) {
$radius = 50;
} else {
$radius = intval($radius);
}
$partners = $this->em->getRepository(Partner::class)->search("practitionner", $keywords);
$partnersAllowed = DefaultController::checkPartnersAlloweds($partners);
return $this->render('praticiens/fiche.html.twig', [
"speciality" => $speciality,
"partners" => $partnersAllowed,
"specialities" => $this->em->getRepository(Speciality::class)->findAll(),
"rad" => $radius,
]);
}
/**
* @Route(
* path="/{slugJob}/description",
* name="description"
* )
*
* @return Response
*/
public function descriptionAction(Speciality $speciality, Request $request)
{
return $this->render('praticiens/definition.html.twig', [
"speciality" => $speciality,
]);
}
/**
* @Route(
* path="/{slugJob}/{slugCity}",
* name="fiche_ville"
* )
*
* @ParamConverter("speciality", options={"mapping": {"slugJob": "slugJob"}})
* @ParamConverter("city", options={"mapping": {"slugCity": "slug"}})
*
* @return Response
*/
public function ficheVilleAction(Speciality $speciality, City $city, Request $request)
{
$specialityHasCity = $this->em->getRepository(SpecialityHasCity::class)->findOneBy(["speciality" => $speciality, "city" => $city]);
$terms = $speciality->getLabel();
$keywords= null;
if ($terms) {
$termsExplode = explode(" ", $terms);
if (count($termsExplode)) {
$keywords = $termsExplode;
}
}
$radius = $request->get('rad');
if (!$radius || intval($radius) < 5 || intval($radius) > 50) {
$radius = 50;
} else {
$radius = intval($radius);
}
$partners = $this->em->getRepository(Partner::class)->search("practitionner", $keywords, $city->getLat(), $city->getLon(), $radius);
$partnersAllowed = DefaultController::checkPartnersAlloweds($partners);
return $this->render('praticiens/fiche-ville.html.twig', [
"speciality" => $speciality,
"city" => $city,
"specialityHasCity" => $specialityHasCity,
"partners" => $partnersAllowed,
"specialities" => $this->em->getRepository(Speciality::class)->findAll(),
"cities" => $this->em->getRepository(City::class)->findAll(),
"rad" => $radius,
]);
}
}