<?php
namespace App\Controller;
use App\Traits\Autowired\Vendor\SeoPageTrait;
use App\Traits\Autowired\Vendor\TranslatorTrait;
use Symfony\Component\Routing\Annotation\Route;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use App\Entity\ArretTravail;
use App\Entity\Client;
use App\Entity\Disponibilite;
use App\Entity\FeuilleSoin;
use App\Entity\Intervention;
use App\Entity\Ordonnance;
use App\Form\Type\ClientSearchType;
use App\Form\Type\OrdonnanceType;
use App\Form\Type\UserType;
use App\Manager\MedecinDossierManager;
use App\Repository\ClientRepository;
use App\Repository\InterventionRepository;
use App\Services\JWTService;
use App\Traits\FileUploaderTrait;
use App\Model\Email;
use App\Entity\Media;
use App\Entity\User;
use App\Manager\DoctorManager;
use App\Repository\UserRepository;
use App\Services\DisponibiliteService;
use App\Services\MailerService;
use App\Traits\UserManagerTrait;
use DateTime;
use Exception;
use InvalidArgumentException;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
class MedecinController extends AbstractController
{
use FileUploaderTrait;
use UserManagerTrait;
use TranslatorTrait;
use SeoPageTrait;
public function __construct(
private readonly UserRepository $userRepository,
private readonly DisponibiliteService $disponibiliteService,
private readonly DoctorManager $doctorManager,
private readonly MailerService $mailerService
) {
}
#[Route('/fr/vous-etes-medecin')]
public function indexAction(
Request $request,
EntityManagerInterface $entityManager
) {
$titre = "Devenez Médecin Urgence Docteurs à Domicile et Télé Consultation";
$description = 'Vous souhaitez consulter en toute liberté avec un outil tout en un ? Urgence Docteurs est la solution qu’il vous faut.';
$this->seoPage
->setTitle($titre)
->addMeta('name', 'description', $description)
->addMeta('property', 'og:title', $titre)
->addMeta('property', 'og:description', $description)
->addMeta('property', 'og:url', $this->generateUrl('app_medecin_index', array(), true))
->addMeta('property', 'twitter:title', $titre)
->addMeta('property', 'twitter:description', $description);
// Formulaire de medecin
$user = new User();
$form = $this->createForm(UserType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted()) {
$birthday = $form['docteur']['dateInfo']->getData();
if ($birthday) {
$birthday = \DateTime::createFromFormat('Y-m-d', $birthday);
if ($birthday) {
$docteur = $user->getDocteur();
$docteur->setDateInfo($birthday);
$entityManager->persist($docteur);
}
}
$user->setEmail($user->getEmail());
$user->setType(User::TYPE_DOCTOR);
$user->setCreatedAt(new \DateTime());
$user->setEnabled(true);
$subject = $this->translator->trans('medecin.message.sujet');
$email = new Email();
$email->setSubject($subject);
$email->setSender($user->getEmail());
$email->setRecipient('urgencedocteurs@gmail.com');
$email->setBody($this->renderView(
'Medecin/inscription_recap.html.twig',
array(
'type' => 'medecin',
'sujet' => $subject,
'user' => $user,
)
));
$this->mailerService->send($email);
$entityManager->persist($user);
$entityManager->flush();
return $this->redirectToRoute('app_medecin_confirmation');
}
return new Response($this->renderView('Medecin/index.html.twig', [
'form' => $form->createView()
]));
}
#[Route('/fr/medecin/confirmation', name: 'app_medecin_confirmation')]
public function confirmationAction()
{
return $this->render('Medecin/confirmation.html.twig');
}
/**
*/
#[Route('/fr/medecin/login', name: 'medecin_login')]
public function loginAction(AuthenticationUtils $authenticationUtils)
{
// get the login error if there is one
$error = $authenticationUtils->getLastAuthenticationError();
// last username entered by the user
$lastUsername = $authenticationUtils->getLastUsername();
return $this->render('Medecin/login.html.twig', [
'last_username' => $lastUsername,
'error' => $error,
]);
}
/**
* medecin/dashboard
* @return Response
*/
#[Route('/fr/medecin/dashboard', name: 'medecin_dashboard')]
public function dashboardAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
$user = $this->getUser();
if (!$user) {
throw new NotFoundHttpException('User introuvable');
}
$docteur = $user->getDocteur();
if (!$docteur) {
throw new NotFoundHttpException('docteur introuvable');
}
/** @var InterventionRepository $repositoryIntervention */
$repositoryIntervention = $em->getRepository(Intervention::class);
$clientSearchForm = $this->createForm(ClientSearchType::class);
$interventions = $repositoryIntervention->findNextVisioByDocteur($docteur);
$interventionPassed = $repositoryIntervention->findVisioByDocteur($docteur, Intervention::ETAT_END);
$interventionsCanceled = $repositoryIntervention->findVisioByDocteur($docteur, Intervention::ETAT_CANCEL);
$clientSearchForm->handleRequest($request);
$totalInterventionPrice = 0;
foreach ($interventions as &$intervention) {
$prix = 25;
if ($intervention->getDocteur()->getSpecialite()->getCode() == 'GENEI') {
if ($intervention->getPrix() >= 39) {
$prix = 44.06;
}
} else {
if ($intervention->getPrix() !== 50 && $intervention->getPrix() !== 49.0 && $intervention->getPrix() !== 60) {
$prix = 44.06;
}
}
$totalInterventionPrice += $prix;
$intervention->setPrix($prix);
}
return new Response($this->renderView('Medecin/dashboard.html.twig', [
'clientSearchForm' => $clientSearchForm->createView(),
'interventionPassed' => $interventionPassed,
'interventionsCanceled' => $interventionsCanceled,
'interventions' => $interventions,
'totalIntervention' => $totalInterventionPrice
]));
}
/**
* medecin/profil
* @return Response
*/
#[Route('/fr/medecin/profil', name: 'medecin_profil')]
public function profileAction(Request $request)
{
/** @var User $user */
$user = $this->getUser();
$docteur = $user->getDocteur();
$em = $this->getDoctrine()->getManager();
if ($request->isMethod(Request::METHOD_POST)) {
$nom = $request->request->get('nom');
$prenom = $request->request->get('prenom');
$codePostale = $request->request->get('codePostal');
$city = $request->request->get('ville');
$siret = $request->request->get('siret');
$adresse = $request->request->get('adresse');
$identifiant = $request->request->get('identifiant');
$remplacant = $request->request->get('remplacant');
$photo = $request->files->get('photo');
$nomRe = $request->request->get('remplacantNom');
$prenomRe = $request->request->get('remplacantPrenom');
$remplacantAdresse = $request->request->get('remplacantAdresse');
$remplacantCodePostal = $request->request->get('remplacantCodePostal');
$remplacantVille = $request->request->get('remplacantVille');
$remplacantRpps = $request->request->get('remplacantRPPS');
if ($photo) {
$user->setPhoto($this->saveImage($photo, $nom, $prenom));
}
$user->setFirstname($prenom);
$user->setLastname($nom);
$docteur->setCity($city);
$docteur->setCodePostal($codePostale);
$docteur->setSiret($siret);
$docteur->setAdresse($adresse);
$docteur->setIdentifiant($identifiant);
$docteur->setMedecinRemplacant($remplacant == 'on' ? true : false);
$docteur->setAdresseRemplacant($remplacantAdresse);
$docteur->setCodePostalRemplacant($remplacantCodePostal);
$docteur->setPrenomRemplacant($prenomRe);
$docteur->setNomRemplacant($nomRe);
$docteur->setVilleRemplacant($remplacantVille);
$docteur->setRppsRemplacant($remplacantRpps);
$em->persist($docteur);
$em->persist($user);
$em->flush();
}
$filename = $user->getPhoto();
$imageUrl = $filename ? $this->getParameter('doctors_uploads_directory').$filename : null;
// Get the binary data of the image
$imageData = null;
if ($imageUrl && file_exists($imageUrl)) {
$imageData = base64_encode(file_get_contents($imageUrl));
}
return new Response($this->renderView('Medecin/profil.html.twig', [
'imageData' => $imageData
]));
}
#[Route('/fr/medecin/saveProfile', name: 'medecin_ajax_profil')]
public function ajaxProfileAction(Request $request)
{
/** @var User $user */
$user = $this->getUser();
$docteur = $user->getDocteur();
$em = $this->getDoctrine()->getManager();
if ($request->isMethod(Request::METHOD_POST)) {
$signature = $request->request->get('signature');
$nom = $request->request->get('nom');
$prenom = $request->request->get('prenom');
$codePostale = $request->request->get('codePostal');
$city = $request->request->get('ville');
$siret = $request->request->get('siret');
$adresse = $request->request->get('adresse');
$identifiant = $request->request->get('identifiant');
$remplacant = $request->request->get('remplacant');
$photo = $request->files->get('photo');
$nomRe = $request->request->get('remplacantNom');
$prenomRe = $request->request->get('remplacantPrenom');
$remplacantAdresse = $request->request->get('remplacantAdresse');
$remplacantCodePostal = $request->request->get('remplacantCodePostal');
$remplacantVille = $request->request->get('remplacantVille');
$remplacantRpps = $request->request->get('remplacantRPPS');
$remplacantAdeli = $request->request->get('remplacantAdeli');
if ($photo) {
$user->setPhoto($this->saveImage($photo, $nom, $prenom));
}
$user->setFirstname($prenom);
$user->setLastname($nom);
$docteur->setCity($city);
$docteur->setCodePostal($codePostale);
$docteur->setSiret($siret);
$docteur->setAdresse($adresse);
$docteur->setIdentifiant($identifiant);
$docteur->setMedecinRemplacant($remplacant == 'on' ? true : false);
$docteur->setAdresseRemplacant($remplacantAdresse);
$docteur->setCodePostalRemplacant($remplacantCodePostal);
$docteur->setPrenomRemplacant($prenomRe);
$docteur->setNomRemplacant($nomRe);
$docteur->setVilleRemplacant($remplacantVille);
$docteur->setRppsRemplacant($remplacantRpps);
$docteur->setSignatureBase64($signature);
$docteur->setAdeliRemplacant($remplacantAdeli);
$em->persist($docteur);
$em->persist($user);
$em->flush();
}
$filename = $user->getPhoto();
$imageUrl = $filename ? $this->getParameter('doctors_uploads_directory').$filename : null;
// Get the binary data of the image
$imageData = null;
if ($imageUrl && file_exists($imageUrl)) {
$imageData = base64_encode(file_get_contents($imageUrl));
}
return new JsonResponse(
[
'success' => true,
'imageData' => $imageData
]
);
}
/**
* patient/dashboard
* @return Response
*/
#[Route('/fr/medecin/visio/', name: 'medecin_visio_tc')]
#[Route('/fr/medecin/visio/{numeroReference}', name: 'medecin_visio')]
public function visioAction(Intervention $intervention, JWTService $jwtService)
{
// Set up your Twilio account credentials
$accountSID = $_ENV['TWILIO_ACCOUNT_SID'];
// Set up your Twilio API keys
$apiKeySID = $_ENV['TWILIO_API_KEY_SID'];
$apiKeySecret = $_ENV['TWILIO_API_KEY_SECRET'];
$em = $this->getDoctrine()->getManager();
// if intervention di
if (!$intervention->getClient() || ($intervention->getClient() && !$intervention->getClient()->getUser())) {
$intervention->setCurrent(0);
$em->persist($intervention);
$em->flush();
return $this->redirectToRoute('medecin_dashboard');
}
$identity = 'urgenceDocteurs-docteur';
// Create an Access Token
$token = new AccessToken(
$accountSID,
$apiKeySID,
$apiKeySecret,
3600,
$identity
);
// Grant access to Video
$grant = new VideoGrant();
$grant->setRoom($intervention->getNumeroReference());
$token->addGrant($grant);
$newOrdonnance = new Ordonnance();
$ordonnanceForm = $this->createForm(OrdonnanceType::class, $newOrdonnance);
//pass doctor for ordonnanceModal
$doctor = $intervention->getDocteur();
$user = $this->userManager->getUserByDocteur($doctor);
$jwt = $jwtService->generateJWT($this->getUser()->getId());
return new Response($this->renderView('Medecin/visio.html.twig', [
'intervention' => $intervention,
'token' => $token->toJWT(),
'ordonnanceForm' => $ordonnanceForm->createView(),
'doctor' => $doctor,
'user' => $user,
'jwt' => $jwt
]));
}
/**
* patient/dashboard
* @return Response
*/
#[Route('/fr/medecin/cancel/{numeroReference}', name: 'medecin_cancel')]
public function cancelAction(Request $request, Intervention $intervention)
{
$em = $this->getDoctrine()->getManager();
// if intervention di
$intervention->setCurrent(false);
$intervention->setEtat(Intervention::ETAT_CANCEL);
$em->persist($intervention);
$em->flush();
return $this->redirectToRoute('medecin_dashboard');
}
#[Route('fr/medecin/agenda', name: 'medecin_agenda')]
public function agendaAction()
{
/** @var User $user */
$user = $this->getUser();
//get only futures slots, not all
$dispos = $this->disponibiliteService->allDisponibilites($user);
// reccurrence
return new Response($this->renderView('Medecin/agenda.html.twig', [
'disponibilites' => json_encode($dispos)
]));
}
/**
* @param Request $request
* @param Client $client
* @return JsonResponse
*/
#[Route('fr/medecin/arret-travail/{id}', name: 'medecin_dossier_ajax_savearrettravail')]
public function ajaxSaveArretTravailAction(Request $request, Client $client)
{
$em = $this->getDoctrine()->getManager();
$response = [
'status' => false
];
if ($request->isMethod(Request::METHOD_POST)) {
$recipient = $request->request->get('recipient');
$stopUntil = $request->request->get('stopUntil');
$stopUntil = date_create_from_format('Y-m-d', $stopUntil);
$affectation = $request->request->get('affectation');
$grossesse = $request->request->get('grossesse');
$sorties = $request->request->get('sorties');
$sortiesFrom = $request->request->get('sortiesFrom');
$sortiesFrom = date_create_from_format('Y-m-d', $sortiesFrom);
$sortiesSansException = $request->request->get('sortiesSansRestrictions');
$sortiesSansExceptionFrom = $request->request->get('sortiesSansRestrictionsFrom');
$sortiesSansExceptionFrom = date_create_from_format('Y-m-d:H:i:s', $sortiesSansExceptionFrom);
$tempsPartielFrom = $request->request->get('tempsPartielFrom');
$tempsPartielFrom = date_create_from_format('Y-m-d', $tempsPartielFrom);
$tempsPartielTo = $request->request->get('tempsPartielTo');
$tempsPartielTo = date_create_from_format('Y-m-d', $tempsPartielTo);
$motifMedical = $request->request->get('motifMedical');
$stopUntilLetter = $request->request->get('stopUntilLetter');
$longueDuree = $request->request->get('longueDuree');
$arret = new ArretTravail();
$arret->setName($recipient);
if ($stopUntil) {
$arret->setUntil($stopUntil);
}
$arret->setStopUntilLetter($stopUntilLetter);
$arret->setAffectation($affectation === 'on' ? true : false);
$arret->setGrossesse($grossesse === 'on' ? true : false);
$arret->setSorties($sorties === 'on' ? true : false);
if ($sortiesFrom) {
$arret->setSortiesFrom($sortiesFrom);
}
$arret->setSortiesSansRestrictions($sortiesSansException === 'on' ? true : false);
if ($sortiesSansExceptionFrom) {
$arret->setSortiesSansRestrictionsFrom($sortiesSansExceptionFrom);
}
if ($tempsPartielFrom) {
$arret->setTempsPartielFrom($tempsPartielFrom);
}
if ($tempsPartielTo) {
$arret->setTempsPartielTo($tempsPartielTo);
}
$arret->setLongueDuree($longueDuree === 'on' ? true : false);
$arret->setMotifMedical($motifMedical);
$arret->setClient($client);
$em->persist($arret);
$em->flush();
$response['status'] = true;
}
return new JsonResponse($response);
}
/**
* @param Request $request
* @param Client $client
* @return JsonResponse
*/
#[Route('fr/medecin/feuille-soin/{id}', name: 'medecin_dossier_ajax_savefeuille')]
public function ajaxSaveFeuilleSoinAction(Request $request, Client $client)
{
$em = $this->getDoctrine()->getManager();
$response = [
'status' => false
];
if ($request->isMethod(Request::METHOD_POST)) {
$accidentTiers = $request->request->get('accidenttiers');
$accidentTiersFrom = $request->request->get('dateaccidenttiersFrom');
$maternite = $request->request->get('maternite');
$dateAccouchement = $request->request->get('dateaccouchement');
$atmp = $request->request->get('atmp');
$numeroatmp = $request->request->get('numeroatmp');
$dateatmp = $request->request->get('dateatmp');
$nouveaumedecin = $request->request->get('nouveaumedecin');
$name = $request->request->get('nomprenommedecin');
$accesdirect = $request->request->get('accesdirect');
$urgence = $request->request->get('urgence');
$horsresidence = $request->request->get('horsresidence');
$medecinremplace = $request->request->get('medecinremplace');
$acceshorscoord = $request->request->get('acceshorscoord');
$datedemande = $request->request->get('datedemande');
$code1 = $request->request->get('code1');
$code2 = $request->request->get('code2');
$code3 = $request->request->get('code3');
$code4 = $request->request->get('code4');
$montant1 = $request->request->get('montant1') ? floatval($request->request->get('montant1')) : null;
$montant2 = $request->request->get('montant2') ? floatval($request->request->get('montant2')) : null;
$montant3 = $request->request->get('montant3') ? floatval($request->request->get('montant3')) : null;
$montant4 = $request->request->get('montant4') ? floatval($request->request->get('montant4')) : null;
$montantTotal = $request->request->get('montanttotal') ? floatval($request->request->get('montanttotal')) : null;;
$obligatoirepaid = $request->request->get('obligatoirepaid');
$complementairepaid = $request->request->get('complementairepaid');
$datefeuillesoins = $request->request->get('datefeuillesoins');
$feuille = new FeuilleSoin();
$feuille->setAccidentTier($accidentTiers === 'on' ? true : false);
if ($accidentTiersFrom) {
$accidentTiersFromDate = date_create_from_format('d/m/Y', $accidentTiersFrom);
if ($accidentTiersFromDate) {
$feuille->setAccidentTierFrom($accidentTiersFromDate);
}
}
$feuille->setMaternite($maternite === 'on' ? true: false);
if($dateAccouchement){
$dateAccouchement = date_create_from_format('d/m/Y', $dateAccouchement);
$feuille->setDateAccouchement($dateAccouchement);
}
$feuille->setAtmp($atmp === 'on' ? true: false);
$feuille->setNumAtmp($numeroatmp);
if($dateatmp) {
$dateatmp = date_create_from_format('d/m/Y', $dateatmp);
$feuille->setDateAtmp($dateatmp);
}
$feuille->setMedecinTraitant($nouveaumedecin === 'on' ? true: false);
$feuille->setNameMedecinTraitant($name);
$feuille->setDirect($accesdirect === 'on' ? true: false);
$feuille->setHorsCoordination($acceshorscoord === 'on' ? true: false);
$feuille->setHorsResidence($horsresidence === 'on' ? true: false);
$feuille->setUrgence($urgence === 'on' ? true: false);
$feuille->setRemplacement($medecinremplace === 'on' ? true: false);
if($datedemande){
$datedemande = date_create_from_format('d/m/Y', $datedemande);
$feuille->setDateDemande($datedemande);
}
$feuille->setCodeActe1($code1);
$feuille->setCodeActe2($code2);
$feuille->setCodeActe3($code3);
$feuille->setCodeActe4($code4);
$feuille->setMontantActe1($montant1);
$feuille->setMontantActe2($montant2);
$feuille->setMontantActe3($montant3);
$feuille->setMontantActe4($montant4);
$feuille->setMontantTotal($montantTotal);
$feuille->setPartComplementaire($complementairepaid === 'on' ? true : false);
$feuille->setPartObligatoire($obligatoirepaid === 'on' ? true : false);
if ($datefeuillesoins) {
$bool = date_create_from_format('d/m/Y', $datefeuillesoins);
if ($bool) {
$feuille->setDateFeuille($bool);
}
}
$feuille->setClient($client);
$em->persist($feuille);
$em->flush();
$response['status'] = true;
}
return new JsonResponse($response);
}
/**
* NOT USE
* @param Request $request
* @param Client $client
* @return JsonResponse
*/
#[Route('fr/medecin/ordonnance/{id}', name: 'medecin_dossier_ajax_saveordonnance')]
public function ajaxSaveOrdonnanceAction(Request $request, Intervention $intervention)
{
$em = $this->getDoctrine()->getManager();
$response = [
'status' => false
];
$date = new DateTime();
if ($request->isMethod(Request::METHOD_POST)) {
$description = $request->request->get('ordonnance')['description'];
$prescription = $request->request->get('ordonnance')['prescription'];
$ordonance = new Ordonnance();
$ordonance->setClient($intervention->getClient());
$ordonance->setIntervention($intervention);
$ordonance->setDescription($description);
$ordonance->setPrescription($prescription);
$ordonance->setCreatedAt($date);
$em->persist($ordonance);
$em->flush();
}
return new JsonResponse($response);
}
/**
* @param Request $request
* @return JsonResponse
*/
#[Route('fr/medecin/planning/addRecurrence', name: 'medecin_planning_add_recurrence')]
public function ajaxAddRecurrenceAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
if ($request->isMethod(Request::METHOD_POST)) {
$days = $request->request->get('days');
$heureDebut = $request->request->get('heureDebut');
$heureFin = $request->request->get('heureFin');
$heureDebutPause = $request->request->get('heureDebutPause');
$heureFinPause = $request->request->get('heureFinPause');
/** @var User $user */
$user = $this->getUser();
$docteur = $user->getDocteur();
$docteur->setDisponiblite(json_encode($days));
$docteur->setStartWork($heureDebut);
$docteur->setEndWork($heureFin);
$docteur->setStartPause($heureDebutPause);
$docteur->setEndPause($heureFinPause);
$em->persist($docteur);
$em->flush();
}
$dispos = $this->disponibiliteService->allDisponibilites($user);
return new JsonResponse([
'success' => true,
'dispos' => $dispos
]);
}
/**
* @param Request $request
* @return JsonResponse
*/
#[Route('fr/medecin/planning/addDisponibilite', name: 'medecin_planning_add_disponibilite')]
public function ajaxAddDispoAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
$dispoSerialize = null;
$serializer = $this->get('serializer');
if ($request->isMethod(Request::METHOD_POST)) {
$dateTimeStart = $request->request->get('dateTimeStart');
$dateTimeEnd = $request->request->get('dateTimeEnd');
$duree = $request->request->get('duree');
$allDay = $request->request->get('allDay');
$slots = (int) $request->request->get('slots');
$allDayBool = false;
switch ($duree) {
case '15min':
$duree = 0.25;
$dureeString = '+15 minutes';
break;
case '30min':
$duree = 0.5;
$dureeString = '+30 minutes';
break;
case '45min':
$duree = 0.75;
$dureeString = '+45 minutes';
break;
case '1H':
$duree = 1;
$dureeString = '+1 hour';
break;
case '1H15':
$duree = 1.25;
$dureeString = '+1 hour +15 minutes';
break;
case '1H30':
$duree = 1.5;
$dureeString = '+1 hour +30 minutes';
break;
case '1H45':
$duree = 1.75;
$dureeString = '+1 hour +45 minutes';
break;
case '2H':
$duree = 2;
$dureeString = '+2 hours';
break;
}
$startDateTime = new \DateTime($dateTimeStart);
$endDateTime = new \DateTime($dateTimeEnd);
$diff = $startDateTime->getTimestamp() - $endDateTime->getTimestamp();
$hours = abs($diff / (60 * 60));
//once we know the nb of hours, create the slots of $duree minutes
$creneaux = $hours / $duree;
if ($allDay && $allDay === 'on') {
$allDayBool = true;
}
/** @var User $user */
$user = $this->getUser();
$docteur = $user->getDocteur();
$disponibilites = [];
$end = new \DateTime($dateTimeStart); // based on start to generate all slots
for ($i = 0; $i < $creneaux; $i++) {
$disponibilite = new Disponibilite();
$disponibilite->setDocteur($docteur);
if ($i > 0) {
$startDateTime->modify($dureeString); //add duration to dateStart except on first loop
}
$disponibilite->setDateStart($startDateTime);
$end->modify($dureeString);
$disponibilite->setDateEnd($end);
$disponibilite->setAllDay($allDayBool);
$em->persist($disponibilite);
//check for slots
if ($slots > 1) {
for ($s = 1; $s < $slots; $s++) {
$disponibiliteSupp = clone $disponibilite;
$em->persist($disponibiliteSupp);
$disponibilites[] = [
'id' => $disponibiliteSupp->getId(),
'calendarId' => '1',
'title' => 'Disponibilite',
'category' => 'time',
'start' => $disponibiliteSupp->getDateStart()->format('Y-m-d\TH:i:s'),
'end' => $disponibiliteSupp->getDateEnd()->format('Y-m-d\TH:i:s'),
'allDay' => $disponibiliteSupp->getAllDay(),
'isReadOnly' => true,
'bgColor' => $disponibiliteSupp->getAllDay() ? '#28a745' : '#0d8dd0'
];
}
}
$em->flush();
$disponibilites[] = [
'id' => $disponibilite->getId(),
'calendarId' => '1',
'title' => 'Disponibilite',
'category' => 'time',
'start' => $disponibilite->getDateStart()->format('Y-m-d\TH:i:s'),
'end' => $disponibilite->getDateEnd()->format('Y-m-d\TH:i:s'),
'allDay' => $disponibilite->getAllDay(),
'isReadOnly' => true,
'bgColor' => $disponibilite->getAllDay() ? '#28a745' : '#0d8dd0'
];
}
$dispoSerialize = $serializer->serialize($disponibilites, 'json');
}
return new JsonResponse([
'success' => true,
'dispo' => $dispoSerialize
]);
}
/**
* @param Request $request
* @return JsonResponse
*/
#[Route('fr/medecin/planning/removeDisponibilite', name: 'medecin_planning_remove_disponibilite')]
public function ajaxRemoveDispoAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
$user = $this->getUser();
$dispoRepo = $em->getRepository(Disponibilite::class);
if ($request->isMethod(Request::METHOD_POST)) {
$dispoId = $request->request->get('id');
$dispoToDelete = $dispoRepo->findOneById($dispoId);
if ($dispoToDelete) {
$em->remove($dispoToDelete);
$em->flush();
} else {
// reccurence remove
$recurrenceKey = $request->request->get('recurrence');
$startDate = $request->request->get('startDate');
$dateTime = DateTime::createFromFormat('D M d Y H:i:s e+', $startDate);
$convertedStartDate = $dateTime->format('Y-m-d\TH:i:s');
$endDate = $request->request->get('endDate');
$dateTime = DateTime::createFromFormat('D M d Y H:i:s e+', $endDate);
$convertedEndDate = $dateTime->format('Y-m-d\TH:i:s');
$doctor = $user->getDocteur();
$recurrence = json_decode($doctor->getDisponiblite(), true);
$deleteRecurrenceValue = $request->request->get('deleteRecurrenceValue');
if (($key = array_search($recurrenceKey, $recurrence)) !== false) {
if ($deleteRecurrenceValue === "1") {
unset($recurrence[$key]);
$doctor->setDisponiblite(json_encode(array_values($recurrence)));
} else {
// create deleted disponibilite json with start date and enddate and key day.
$deletedDisponibilite[] = [
'startDate' => $convertedStartDate,
'endDate' => $convertedEndDate
];
// Convert the deleted disponibilite to JSON
$deletedDisponibiliteJson = json_encode($deletedDisponibilite);
$doctor->setDeletedDisponiblite($deletedDisponibiliteJson);
}
$em->persist($doctor);
$em->flush();
}
}
}
$dispos = $this->disponibiliteService->allDisponibilites($user);
return new JsonResponse([
'success' => true,
'disponibilites' => $dispos
]);
}
/**
* @Route("/fr/disponibilites", name="delete_disponibilites", methods={"POST"})
*/
public function deleteDisponibilites(Request $request): JsonResponse
{
try {
$dateJour = $request->request->get('deletefromdate');
$heureDebut = $request->request->get('heuredebutdispo');
$heureFin = $request->request->get('heurefindispo');
$user = $this->getUser();
$docteur = $user->getDocteur();
$this->disponibiliteService->deleteDisponibilites($docteur, $dateJour, $heureDebut, $heureFin);
return new JsonResponse(
[
'message' => 'Disponibilités supprimées avec succès.',
'success' => true,
'dispos' => $this->disponibiliteService->allDisponibilites($user)
],
Response::HTTP_OK
);
} catch (InvalidArgumentException $e) {
return new JsonResponse(['message' => $e->getMessage()], Response::HTTP_BAD_REQUEST);
} catch (Exception $e) {
return new JsonResponse(['message' => $e->getMessage()], Response::HTTP_INTERNAL_SERVER_ERROR);
}
}
/**
* @param Request $request
* @return JsonResponse
*/
#[Route('fr/medecin/planning/updateDisponibilite', name: 'medecin_planning_update_disponibilite')]
public function ajaxUpdateDispoAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
$dispoRepo = $em->getRepository(Disponibilite::class);
if ($request->isMethod(Request::METHOD_POST)) {
$date = $request->request->get('dateStart');
$dateEnd = $request->request->get('dateEnd');
$dispoId = $request->request->get('id');
$dispoToUpdate = $dispoRepo->findOneById($dispoId);
$dispoToUpdate->setDateStart(new \DateTime($date));
$dispoToUpdate->setDateEnd(new \DateTime($dateEnd));
$em->persist($dispoToUpdate);
$em->flush();
}
return new JsonResponse([
'success' => true
]);
}
/**
* @param Request $request
* @return JsonResponse
*/
#[Route("fr/medecin/updateWorking", name: 'medecin_planning_update_working')]
public function ajaxUpdateWorkingAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
if ($request->isMethod(Request::METHOD_POST)) {
$working = (bool) $request->request->get('working');
/** @var User $user */
$user = $this->getUser();
$doctor = $user->getDocteur();
$doctor->setWorking($working);
$em->persist($doctor);
$em->flush();
}
return new JsonResponse([
'success' => true
]);
}
/**
* find client
* @param Request $request
* @return JsonResponse
*/
#[Route('/fr/medecin/ajaxFindClients', name: 'medecin_ajax_find_clients')]
public function ajaxFindClientsAction(Request $request)
{
/** @var InterventionRepository $repositoryIntervention */
$repositoryIntervention = $this->getDoctrine()->getRepository(Intervention::class);
/** @var User $user */
$user = $this->getUser()->getDocteur();
$results = [];
if ($request->isMethod(Request::METHOD_POST)) {
$name = $request->request->get('name');
$results = $repositoryIntervention->findByName($user, $name);
}
return new JsonResponse([
'success' => true,
'results' => $results
]);
}
/**
* medecin/dossier
* @return Response
* @ParamConverter("client", class=Client::class)
*/
#[Route('/fr/medecin/dossier', name: 'medecin_dossier_no_id')]
#[Route('/fr/medecin/dossier/{id}', name: 'medecin_dossier')]
public function dossierAction(Request $request, Client $client, MedecinDossierManager $dossierManager, JWTService $JWTService)
{
/** @var User $user */
$user = $this->getUser();
$doctor = $user->getDocteur();
$em = $this->getDoctrine()->getManager();
$age = $client->getDateInfoInfoString();
/** @var Intervention $intervention */
$intervention = $em->getRepository(Intervention::class)->findLastByClient($client);
$arret = $em->getRepository(ArretTravail::class)->findLastByClient($client);
$feuille = $em->getRepository(FeuilleSoin::class)->findLastByClient($client);
$age = $intervention ? $intervention[0]->getAge() : null;
$ordonnance = $client->getOrdonnances()->last();
$ordos = [];
$ordonnances = $client->getOrdonnances();
$newOrdonnance = new Ordonnance();
$ordonnanceForm = $this->createForm(OrdonnanceType::class, $newOrdonnance);
$medecinDossier = $dossierManager->findOrCreate($doctor, $client);
$ordonnanceForm->handleRequest($request);
if ($request->isMethod(Request::METHOD_POST)) {
$comment = $request->request->get('comment');
$medecinDossier = $dossierManager->findOrCreate($doctor, $client, $comment);
}
$date = new DateTime();
if ($ordonnanceForm->isSubmitted() && $ordonnanceForm->isValid()) {
$prescription = $ordonnanceForm->get('prescription')->getData();
$newOrdonnance->setPrescription($prescription);
$newOrdonnance->setClient($client);
$newOrdonnance->setIntervention($intervention[0]);
$newOrdonnance->setCreatedAt($date);
$em->persist($newOrdonnance);
$em->flush();
$ordonnance = $newOrdonnance;
}
//select ordonnance
if ($ordonnances) {
foreach ($ordonnances as $key => $ordo) {
$ordos[] = [
$ordo->getCreatedAt()->format('d/m/Y H:i') => $ordo->getId()
];
}
$ordonnancesForm = $this->createFormBuilder()
->add('ordonnances', ChoiceType::class, [
'choices' => $ordos,
'label' => false,
'placeholder' => 'Sélectionner une autre ordonnance',
'attr' => ['class' => 'form-control'],
'group_by' => function ($choice, $key, $value) {
return '';
}
])
->getForm();
$ordonnancesForm->handleRequest($request);
//form to select the date --> didn't work by ajax due to synapse widget
if ($ordonnancesForm->isSubmitted() && $ordonnancesForm->isValid()) {
$ordonnanceFromForm = $ordonnancesForm->get('ordonnances')->getData();
$ordonnanceRepo = $this->getDoctrine()->getManager()->getRepository(Ordonnance::class);
$ordo = $ordonnanceRepo->find($ordonnanceFromForm);
$ordonnance = $ordo;
}
}
$jwt = $JWTService->generateJWT($this->getUser()->getId());
return new Response($this->renderView('Medecin/dossier.html.twig', [
'jwt' => $jwt,
'client' => $client,
'age' => $age,
'doctor' => $doctor,
'ordonnance' => $ordonnance,
'ordonnancesForm' => $ordonnances ? $ordonnancesForm->createView() : null,
'arret' => $arret ? $arret[0] : null,
'feuille' => $feuille ? $feuille[0] : null,
'ordonnanceForm' => $ordonnanceForm->createView(),
'intervention' => $intervention ? $intervention[0] : null,
'medecinDossier' => $medecinDossier,
'user' => $user
]));
}
/**
* /releve
*/
#[Route('fr/medecin/releve', name: 'medecin_releve')]
public function releveAction(Request $request)
{
$user = $this->getUser();
$docteur = $user->getDocteur();
$em = $this->getDoctrine()->getManager();
$total = 0;
$filter = array('docteur' => $docteur, 'etat' => 'endConsultation');
$dateBegin = $request->request->get('dateBegin');
$dateEnd = $request->request->get('dateEnd');
if (isset($dateBegin) && $dateBegin != null) $filter['dateBegin'] = $dateBegin;
if (isset($dateEnd) && $dateEnd != null) $filter['dateEnd'] = $dateEnd;
$interventions = $em->getRepository(Intervention::class)
->findInterventionFilter($filter, 100);
foreach ($interventions as $intervention) {
$prix = 25;
if ($intervention->getDocteur()->getSpecialite()->getCode() == 'GENEI') {
if ($intervention->getPrix() >= 39) {
$prix = 44.06;
}
} else {
if ($intervention->getPrix() !== 50 && $intervention->getPrix() !== 49.0 && $intervention->getPrix() !== 60) {
$prix = 44.06;
}
}
$total += $prix;
}
return new Response($this->renderView('Medecin/releve.html.twig', [
'docteur' => $docteur,
'interventions' => $interventions,
'total' => $total,
'nbintervention35' => isset($interventionsTC35) ? count($interventionsTC35) : 0,
'nbintervention50' => isset($interventionsTC50) ? count($interventionsTC50) : 0,
]));
}
/**
* Put in manager
* @param $imageBase64
* @param $nom
* @param $prenom
* @return Media
*/
private function saveImage($file, $nom, $prenom)
{
$uid = md5(uniqid(time()));
$filename = 'image-' . $nom . '-' . $prenom . '-' . $uid . '.jpeg';
$this->fileUploader->upload($file, $filename);
$media = new Media();
$media->setBinaryContent($this->fileUploader->getTargetDirectory() . $filename);
$media->setContext('docteur');
$media->setProviderName('sonata.media.provider.image');
$media->setName($filename);
$this->getDoctrine()->getManager()->persist($media);
$this->getDoctrine()->getManager()->flush();
return $filename;
}
}