src/Controller/MedecinController.php line 60

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Traits\Autowired\Vendor\SeoPageTrait;
  4. use App\Traits\Autowired\Vendor\TranslatorTrait;
  5. use Symfony\Component\Routing\Annotation\Route;
  6. use Doctrine\ORM\EntityManagerInterface;
  7. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  8. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  9. use Symfony\Component\HttpFoundation\JsonResponse;
  10. use Symfony\Component\HttpFoundation\Request;
  11. use Symfony\Component\HttpFoundation\Response;
  12. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  13. use App\Entity\ArretTravail;
  14. use App\Entity\Client;
  15. use App\Entity\Disponibilite;
  16. use App\Entity\FeuilleSoin;
  17. use App\Entity\Intervention;
  18. use App\Entity\Ordonnance;
  19. use App\Form\Type\ClientSearchType;
  20. use App\Form\Type\OrdonnanceType;
  21. use App\Form\Type\UserType;
  22. use App\Manager\MedecinDossierManager;
  23. use App\Repository\ClientRepository;
  24. use App\Repository\InterventionRepository;
  25. use App\Services\JWTService;
  26. use App\Traits\FileUploaderTrait;
  27. use App\Model\Email;
  28. use App\Entity\Media;
  29. use App\Entity\User;
  30. use App\Manager\DoctorManager;
  31. use App\Repository\UserRepository;
  32. use App\Services\DisponibiliteService;
  33. use App\Services\MailerService;
  34. use App\Traits\UserManagerTrait;
  35. use DateTime;
  36. use Exception;
  37. use InvalidArgumentException;
  38. use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
  39. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  40. class MedecinController extends AbstractController
  41. {
  42.     use FileUploaderTrait;
  43.     use UserManagerTrait;
  44.     use TranslatorTrait;
  45.     use SeoPageTrait;
  46.     public function __construct(
  47.         private readonly UserRepository $userRepository,
  48.         private readonly DisponibiliteService $disponibiliteService,
  49.         private readonly DoctorManager $doctorManager,
  50.         private readonly MailerService $mailerService
  51.     ) {
  52.     }
  53.     #[Route('/fr/vous-etes-medecin')]
  54.     public function indexAction(
  55.         Request $request,
  56.         EntityManagerInterface $entityManager
  57.     ) {
  58.         $titre "Devenez Médecin Urgence Docteurs à Domicile et Télé Consultation";
  59.         $description 'Vous souhaitez consulter en toute liberté avec un outil tout en un ? Urgence Docteurs est la solution qu’il vous faut.';
  60.         $this->seoPage
  61.             ->setTitle($titre)
  62.             ->addMeta('name''description'$description)
  63.             ->addMeta('property''og:title'$titre)
  64.             ->addMeta('property''og:description'$description)
  65.             ->addMeta('property''og:url',  $this->generateUrl('app_medecin_index', array(), true))
  66.             ->addMeta('property''twitter:title'$titre)
  67.             ->addMeta('property''twitter:description'$description);
  68.         // Formulaire de medecin
  69.         $user = new User();
  70.         $form $this->createForm(UserType::class, $user);
  71.         $form->handleRequest($request);
  72.         if ($form->isSubmitted()) {
  73.             $birthday $form['docteur']['dateInfo']->getData();
  74.             if ($birthday) {
  75.                 $birthday \DateTime::createFromFormat('Y-m-d'$birthday);
  76.                 if ($birthday) {
  77.                     $docteur $user->getDocteur();
  78.                     $docteur->setDateInfo($birthday);
  79.                     $entityManager->persist($docteur);
  80.                 }
  81.             }
  82.             $user->setEmail($user->getEmail());
  83.             $user->setType(User::TYPE_DOCTOR);
  84.             $user->setCreatedAt(new \DateTime());
  85.             $user->setEnabled(true);
  86.             $subject $this->translator->trans('medecin.message.sujet');
  87.             $email = new Email();
  88.             $email->setSubject($subject);
  89.             $email->setSender($user->getEmail());
  90.             $email->setRecipient('urgencedocteurs@gmail.com');
  91.             $email->setBody($this->renderView(
  92.                 'Medecin/inscription_recap.html.twig',
  93.                 array(
  94.                     'type' => 'medecin',
  95.                     'sujet' => $subject,
  96.                     'user' => $user,
  97.                 )
  98.             ));
  99.             $this->mailerService->send($email);
  100.             $entityManager->persist($user);
  101.             $entityManager->flush();
  102.             return $this->redirectToRoute('app_medecin_confirmation');
  103.         }
  104.         return new Response($this->renderView('Medecin/index.html.twig', [
  105.             'form' => $form->createView()
  106.         ]));
  107.     }
  108.     #[Route('/fr/medecin/confirmation'name'app_medecin_confirmation')]
  109.     public function confirmationAction()
  110.     {
  111.         return $this->render('Medecin/confirmation.html.twig');
  112.     }
  113.     /**
  114.      */
  115.     #[Route('/fr/medecin/login'name'medecin_login')]
  116.     public function loginAction(AuthenticationUtils $authenticationUtils)
  117.     {
  118.         // get the login error if there is one
  119.         $error $authenticationUtils->getLastAuthenticationError();
  120.         // last username entered by the user
  121.         $lastUsername $authenticationUtils->getLastUsername();
  122.         return $this->render('Medecin/login.html.twig', [
  123.             'last_username' => $lastUsername,
  124.             'error'         => $error,
  125.         ]);
  126.     }
  127.     /**
  128.      * medecin/dashboard
  129.      * @return Response
  130.      */
  131.     #[Route('/fr/medecin/dashboard'name'medecin_dashboard')]
  132.     public function dashboardAction(Request $request)
  133.     {
  134.         $em $this->getDoctrine()->getManager();
  135.         $user $this->getUser();
  136.         if (!$user) {
  137.             throw new NotFoundHttpException('User introuvable');
  138.         }
  139.         $docteur $user->getDocteur();
  140.         if (!$docteur) {
  141.             throw new NotFoundHttpException('docteur introuvable');
  142.         }
  143.         /** @var InterventionRepository $repositoryIntervention */
  144.         $repositoryIntervention $em->getRepository(Intervention::class);
  145.         $clientSearchForm $this->createForm(ClientSearchType::class);
  146.         $interventions $repositoryIntervention->findNextVisioByDocteur($docteur);
  147.         $interventionPassed $repositoryIntervention->findVisioByDocteur($docteurIntervention::ETAT_END);
  148.         $interventionsCanceled $repositoryIntervention->findVisioByDocteur($docteurIntervention::ETAT_CANCEL);
  149.         $clientSearchForm->handleRequest($request);
  150.         $totalInterventionPrice 0;
  151.         foreach ($interventions as &$intervention) {
  152.             $prix 25;
  153.             if ($intervention->getDocteur()->getSpecialite()->getCode() == 'GENEI') {
  154.                 if ($intervention->getPrix() >= 39) {
  155.                     $prix 44.06;
  156.                 }
  157.             } else {
  158.                 if ($intervention->getPrix() !== 50 && $intervention->getPrix() !== 49.0 && $intervention->getPrix() !== 60) {
  159.                     $prix 44.06;
  160.                 }
  161.             }
  162.             $totalInterventionPrice += $prix;
  163.             $intervention->setPrix($prix);
  164.         }
  165.         return new Response($this->renderView('Medecin/dashboard.html.twig', [
  166.             'clientSearchForm' => $clientSearchForm->createView(),
  167.             'interventionPassed' => $interventionPassed,
  168.             'interventionsCanceled' => $interventionsCanceled,
  169.             'interventions' => $interventions,
  170.             'totalIntervention' => $totalInterventionPrice
  171.         ]));
  172.     }
  173.     /**
  174.      * medecin/profil
  175.      * @return Response
  176.      */
  177.     #[Route('/fr/medecin/profil'name'medecin_profil')]
  178.     public function profileAction(Request $request)
  179.     {
  180.         /** @var User $user */
  181.         $user $this->getUser();
  182.         $docteur $user->getDocteur();
  183.         $em $this->getDoctrine()->getManager();
  184.         if ($request->isMethod(Request::METHOD_POST)) {
  185.             $nom $request->request->get('nom');
  186.             $prenom $request->request->get('prenom');
  187.             $codePostale $request->request->get('codePostal');
  188.             $city $request->request->get('ville');
  189.             $siret $request->request->get('siret');
  190.             $adresse $request->request->get('adresse');
  191.             $identifiant $request->request->get('identifiant');
  192.             $remplacant $request->request->get('remplacant');
  193.             $photo $request->files->get('photo');
  194.             $nomRe $request->request->get('remplacantNom');
  195.             $prenomRe $request->request->get('remplacantPrenom');
  196.             $remplacantAdresse $request->request->get('remplacantAdresse');
  197.             $remplacantCodePostal $request->request->get('remplacantCodePostal');
  198.             $remplacantVille $request->request->get('remplacantVille');
  199.             $remplacantRpps $request->request->get('remplacantRPPS');
  200.             if ($photo) {
  201.                 $user->setPhoto($this->saveImage($photo$nom$prenom));
  202.             }
  203.             $user->setFirstname($prenom);
  204.             $user->setLastname($nom);
  205.             $docteur->setCity($city);
  206.             $docteur->setCodePostal($codePostale);
  207.             $docteur->setSiret($siret);
  208.             $docteur->setAdresse($adresse);
  209.             $docteur->setIdentifiant($identifiant);
  210.             $docteur->setMedecinRemplacant($remplacant == 'on' true false);
  211.             $docteur->setAdresseRemplacant($remplacantAdresse);
  212.             $docteur->setCodePostalRemplacant($remplacantCodePostal);
  213.             $docteur->setPrenomRemplacant($prenomRe);
  214.             $docteur->setNomRemplacant($nomRe);
  215.             $docteur->setVilleRemplacant($remplacantVille);
  216.             $docteur->setRppsRemplacant($remplacantRpps);
  217.             $em->persist($docteur);
  218.             $em->persist($user);
  219.             $em->flush();
  220.         }
  221.         $filename $user->getPhoto();
  222.         $imageUrl $filename $this->getParameter('doctors_uploads_directory').$filename null;
  223.         // Get the binary data of the image
  224.         $imageData null;
  225.         if ($imageUrl && file_exists($imageUrl)) {
  226.             $imageData base64_encode(file_get_contents($imageUrl));
  227.         }
  228.         return new Response($this->renderView('Medecin/profil.html.twig', [
  229.             'imageData' => $imageData
  230.         ]));
  231.     }
  232.     #[Route('/fr/medecin/saveProfile'name'medecin_ajax_profil')]
  233.     public function ajaxProfileAction(Request $request)
  234.     {
  235.         /** @var User $user */
  236.         $user $this->getUser();
  237.         $docteur $user->getDocteur();
  238.         $em $this->getDoctrine()->getManager();
  239.         if ($request->isMethod(Request::METHOD_POST)) {
  240.             $signature $request->request->get('signature');
  241.             $nom $request->request->get('nom');
  242.             $prenom $request->request->get('prenom');
  243.             $codePostale $request->request->get('codePostal');
  244.             $city $request->request->get('ville');
  245.             $siret $request->request->get('siret');
  246.             $adresse $request->request->get('adresse');
  247.             $identifiant $request->request->get('identifiant');
  248.             $remplacant $request->request->get('remplacant');
  249.             $photo $request->files->get('photo');
  250.             $nomRe $request->request->get('remplacantNom');
  251.             $prenomRe $request->request->get('remplacantPrenom');
  252.             $remplacantAdresse $request->request->get('remplacantAdresse');
  253.             $remplacantCodePostal $request->request->get('remplacantCodePostal');
  254.             $remplacantVille $request->request->get('remplacantVille');
  255.             $remplacantRpps $request->request->get('remplacantRPPS');
  256.             $remplacantAdeli $request->request->get('remplacantAdeli');
  257.             if ($photo) {
  258.                 $user->setPhoto($this->saveImage($photo$nom$prenom));
  259.             }
  260.             $user->setFirstname($prenom);
  261.             $user->setLastname($nom);
  262.             $docteur->setCity($city);
  263.             $docteur->setCodePostal($codePostale);
  264.             $docteur->setSiret($siret);
  265.             $docteur->setAdresse($adresse);
  266.             $docteur->setIdentifiant($identifiant);
  267.             $docteur->setMedecinRemplacant($remplacant == 'on' true false);
  268.             $docteur->setAdresseRemplacant($remplacantAdresse);
  269.             $docteur->setCodePostalRemplacant($remplacantCodePostal);
  270.             $docteur->setPrenomRemplacant($prenomRe);
  271.             $docteur->setNomRemplacant($nomRe);
  272.             $docteur->setVilleRemplacant($remplacantVille);
  273.             $docteur->setRppsRemplacant($remplacantRpps);
  274.             $docteur->setSignatureBase64($signature);
  275.             $docteur->setAdeliRemplacant($remplacantAdeli);
  276.             $em->persist($docteur);
  277.             $em->persist($user);
  278.             $em->flush();
  279.         }
  280.         $filename $user->getPhoto();
  281.         $imageUrl $filename $this->getParameter('doctors_uploads_directory').$filename null;
  282.         // Get the binary data of the image
  283.         $imageData null;
  284.         if ($imageUrl && file_exists($imageUrl)) {
  285.             $imageData base64_encode(file_get_contents($imageUrl));
  286.         }
  287.         return new JsonResponse(
  288.             [
  289.                 'success' => true,
  290.                 'imageData' => $imageData
  291.             ]
  292.         );
  293.     }
  294.     /**
  295.      * patient/dashboard
  296.      * @return Response
  297.      */
  298.     #[Route('/fr/medecin/visio/'name'medecin_visio_tc')]
  299.     #[Route('/fr/medecin/visio/{numeroReference}'name'medecin_visio')]
  300.     public function visioAction(Intervention $interventionJWTService $jwtService)
  301.     {
  302.         // Set up your Twilio account credentials
  303.         $accountSID $_ENV['TWILIO_ACCOUNT_SID'];
  304.         // Set up your Twilio API keys
  305.         $apiKeySID $_ENV['TWILIO_API_KEY_SID'];
  306.         $apiKeySecret $_ENV['TWILIO_API_KEY_SECRET'];
  307.         $em $this->getDoctrine()->getManager();
  308.         // if intervention di
  309.         if (!$intervention->getClient() || ($intervention->getClient() && !$intervention->getClient()->getUser())) {
  310.             $intervention->setCurrent(0);
  311.             $em->persist($intervention);
  312.             $em->flush();
  313.             return $this->redirectToRoute('medecin_dashboard');
  314.         }
  315.         $identity 'urgenceDocteurs-docteur';
  316.         // Create an Access Token
  317.         $token = new AccessToken(
  318.             $accountSID,
  319.             $apiKeySID,
  320.             $apiKeySecret,
  321.             3600,
  322.             $identity
  323.         );
  324.         // Grant access to Video
  325.         $grant = new VideoGrant();
  326.         $grant->setRoom($intervention->getNumeroReference());
  327.         $token->addGrant($grant);
  328.         $newOrdonnance = new Ordonnance();
  329.         $ordonnanceForm $this->createForm(OrdonnanceType::class, $newOrdonnance);
  330.         //pass doctor for ordonnanceModal
  331.         $doctor $intervention->getDocteur();
  332.         $user $this->userManager->getUserByDocteur($doctor);
  333.         $jwt $jwtService->generateJWT($this->getUser()->getId());
  334.         return new Response($this->renderView('Medecin/visio.html.twig', [
  335.             'intervention' => $intervention,
  336.             'token' => $token->toJWT(),
  337.             'ordonnanceForm' => $ordonnanceForm->createView(),
  338.             'doctor' => $doctor,
  339.             'user' => $user,
  340.             'jwt' => $jwt
  341.         ]));
  342.     }
  343.     /**
  344.      * patient/dashboard
  345.      * @return Response
  346.      */
  347.     #[Route('/fr/medecin/cancel/{numeroReference}'name'medecin_cancel')]
  348.     public function cancelAction(Request $requestIntervention $intervention)
  349.     {
  350.         $em $this->getDoctrine()->getManager();
  351.         // if intervention di
  352.         $intervention->setCurrent(false);
  353.         $intervention->setEtat(Intervention::ETAT_CANCEL);
  354.         $em->persist($intervention);
  355.         $em->flush();
  356.         return $this->redirectToRoute('medecin_dashboard');
  357.     }
  358.     #[Route('fr/medecin/agenda'name'medecin_agenda')]
  359.     public function agendaAction()
  360.     {
  361.         /** @var User $user */
  362.         $user $this->getUser();
  363.         //get only futures slots, not all
  364.         $dispos $this->disponibiliteService->allDisponibilites($user);
  365.         // reccurrence
  366.         return new Response($this->renderView('Medecin/agenda.html.twig', [
  367.             'disponibilites' => json_encode($dispos)
  368.         ]));
  369.     }
  370.     /**
  371.      * @param Request $request
  372.      * @param Client $client
  373.      * @return JsonResponse
  374.      */
  375.     #[Route('fr/medecin/arret-travail/{id}'name'medecin_dossier_ajax_savearrettravail')]
  376.     public function ajaxSaveArretTravailAction(Request $requestClient $client)
  377.     {
  378.         $em $this->getDoctrine()->getManager();
  379.         $response = [
  380.             'status' => false
  381.         ];
  382.         if ($request->isMethod(Request::METHOD_POST)) {
  383.             $recipient $request->request->get('recipient');
  384.             $stopUntil $request->request->get('stopUntil');
  385.             $stopUntil date_create_from_format('Y-m-d'$stopUntil);
  386.             $affectation $request->request->get('affectation');
  387.             $grossesse $request->request->get('grossesse');
  388.             $sorties $request->request->get('sorties');
  389.             $sortiesFrom $request->request->get('sortiesFrom');
  390.             $sortiesFrom date_create_from_format('Y-m-d'$sortiesFrom);
  391.             $sortiesSansException $request->request->get('sortiesSansRestrictions');
  392.             $sortiesSansExceptionFrom $request->request->get('sortiesSansRestrictionsFrom');
  393.             $sortiesSansExceptionFrom date_create_from_format('Y-m-d:H:i:s'$sortiesSansExceptionFrom);
  394.             $tempsPartielFrom $request->request->get('tempsPartielFrom');
  395.             $tempsPartielFrom date_create_from_format('Y-m-d'$tempsPartielFrom);
  396.             $tempsPartielTo $request->request->get('tempsPartielTo');
  397.             $tempsPartielTo date_create_from_format('Y-m-d'$tempsPartielTo);
  398.             $motifMedical =  $request->request->get('motifMedical');
  399.             $stopUntilLetter =  $request->request->get('stopUntilLetter');
  400.             $longueDuree $request->request->get('longueDuree');
  401.             $arret = new ArretTravail();
  402.             $arret->setName($recipient);
  403.             if ($stopUntil) {
  404.                 $arret->setUntil($stopUntil);
  405.             }
  406.             $arret->setStopUntilLetter($stopUntilLetter);
  407.             $arret->setAffectation($affectation === 'on' true :  false);
  408.             $arret->setGrossesse($grossesse === 'on' true :  false);
  409.             $arret->setSorties($sorties === 'on' true :  false);
  410.             if ($sortiesFrom) {
  411.                 $arret->setSortiesFrom($sortiesFrom);
  412.             }
  413.             $arret->setSortiesSansRestrictions($sortiesSansException === 'on' true :  false);
  414.             if ($sortiesSansExceptionFrom) {
  415.                 $arret->setSortiesSansRestrictionsFrom($sortiesSansExceptionFrom);
  416.             }
  417.             if ($tempsPartielFrom) {
  418.                 $arret->setTempsPartielFrom($tempsPartielFrom);
  419.             }
  420.             if ($tempsPartielTo) {
  421.                 $arret->setTempsPartielTo($tempsPartielTo);
  422.             }
  423.             $arret->setLongueDuree($longueDuree === 'on' true :  false);
  424.             $arret->setMotifMedical($motifMedical);
  425.             $arret->setClient($client);
  426.             $em->persist($arret);
  427.             $em->flush();
  428.             $response['status'] = true;
  429.         }
  430.         return new JsonResponse($response);
  431.     }
  432.     /**
  433.      * @param Request $request
  434.      * @param Client $client
  435.      * @return JsonResponse
  436.      */
  437.     #[Route('fr/medecin/feuille-soin/{id}'name'medecin_dossier_ajax_savefeuille')]
  438.     public function ajaxSaveFeuilleSoinAction(Request $requestClient $client)
  439.     {
  440.         $em $this->getDoctrine()->getManager();
  441.         $response = [
  442.             'status' => false
  443.         ];
  444.         if ($request->isMethod(Request::METHOD_POST)) {
  445.             $accidentTiers $request->request->get('accidenttiers');
  446.             $accidentTiersFrom $request->request->get('dateaccidenttiersFrom');
  447.             $maternite $request->request->get('maternite');
  448.             $dateAccouchement $request->request->get('dateaccouchement');
  449.             $atmp $request->request->get('atmp');
  450.             $numeroatmp $request->request->get('numeroatmp');
  451.             $dateatmp $request->request->get('dateatmp');
  452.             $nouveaumedecin $request->request->get('nouveaumedecin');
  453.             $name $request->request->get('nomprenommedecin');
  454.             $accesdirect $request->request->get('accesdirect');
  455.             $urgence $request->request->get('urgence');
  456.             $horsresidence $request->request->get('horsresidence');
  457.             $medecinremplace $request->request->get('medecinremplace');
  458.             $acceshorscoord $request->request->get('acceshorscoord');
  459.             $datedemande $request->request->get('datedemande');
  460.             $code1 $request->request->get('code1');
  461.             $code2 $request->request->get('code2');
  462.             $code3 $request->request->get('code3');
  463.             $code4 $request->request->get('code4');
  464.             $montant1 $request->request->get('montant1') ? floatval($request->request->get('montant1')) : null;
  465.             $montant2 $request->request->get('montant2') ? floatval($request->request->get('montant2')) : null;
  466.             $montant3 $request->request->get('montant3') ? floatval($request->request->get('montant3')) : null;
  467.             $montant4 $request->request->get('montant4') ? floatval($request->request->get('montant4')) : null;
  468.             $montantTotal $request->request->get('montanttotal') ? floatval($request->request->get('montanttotal')) : null;;
  469.             $obligatoirepaid $request->request->get('obligatoirepaid');
  470.             $complementairepaid $request->request->get('complementairepaid');
  471.             $datefeuillesoins $request->request->get('datefeuillesoins');
  472.             $feuille = new FeuilleSoin();
  473.             $feuille->setAccidentTier($accidentTiers === 'on' true :  false);
  474.             if ($accidentTiersFrom) {
  475.                 $accidentTiersFromDate date_create_from_format('d/m/Y'$accidentTiersFrom);
  476.                 if ($accidentTiersFromDate) {
  477.                     $feuille->setAccidentTierFrom($accidentTiersFromDate);
  478.                 }
  479.             }
  480.             $feuille->setMaternite($maternite === 'on' true:  false);
  481.             if($dateAccouchement){
  482.                 $dateAccouchement date_create_from_format('d/m/Y'$dateAccouchement);
  483.                 $feuille->setDateAccouchement($dateAccouchement);
  484.             }
  485.             $feuille->setAtmp($atmp === 'on' true:  false);
  486.             $feuille->setNumAtmp($numeroatmp);
  487.             if($dateatmp) {
  488.                 $dateatmp date_create_from_format('d/m/Y'$dateatmp);
  489.                 $feuille->setDateAtmp($dateatmp);
  490.             }
  491.             $feuille->setMedecinTraitant($nouveaumedecin === 'on' true:  false);
  492.             $feuille->setNameMedecinTraitant($name);
  493.             $feuille->setDirect($accesdirect === 'on' true:  false);
  494.             $feuille->setHorsCoordination($acceshorscoord === 'on' true:  false);
  495.             $feuille->setHorsResidence($horsresidence === 'on' true:  false);
  496.             $feuille->setUrgence($urgence === 'on' true:  false);
  497.             $feuille->setRemplacement($medecinremplace === 'on' true:  false);
  498.             if($datedemande){
  499.                 $datedemande date_create_from_format('d/m/Y'$datedemande);
  500.                 $feuille->setDateDemande($datedemande);
  501.             }
  502.             $feuille->setCodeActe1($code1);
  503.             $feuille->setCodeActe2($code2);
  504.             $feuille->setCodeActe3($code3);
  505.             $feuille->setCodeActe4($code4);
  506.             $feuille->setMontantActe1($montant1);
  507.             $feuille->setMontantActe2($montant2);
  508.             $feuille->setMontantActe3($montant3);
  509.             $feuille->setMontantActe4($montant4);
  510.             $feuille->setMontantTotal($montantTotal);
  511.             $feuille->setPartComplementaire($complementairepaid === 'on' true :  false);
  512.             $feuille->setPartObligatoire($obligatoirepaid === 'on' true :  false);
  513.             if ($datefeuillesoins) {
  514.                 $bool date_create_from_format('d/m/Y'$datefeuillesoins);
  515.                 if ($bool) {
  516.                     $feuille->setDateFeuille($bool);
  517.                 }
  518.             }
  519.             $feuille->setClient($client);
  520.             $em->persist($feuille);
  521.             $em->flush();
  522.             $response['status'] = true;
  523.         }
  524.         return new JsonResponse($response);
  525.     }
  526.     /**
  527.      * NOT USE
  528.      * @param Request $request
  529.      * @param Client $client
  530.      * @return JsonResponse
  531.      */
  532.     #[Route('fr/medecin/ordonnance/{id}'name'medecin_dossier_ajax_saveordonnance')]
  533.     public function ajaxSaveOrdonnanceAction(Request $requestIntervention $intervention)
  534.     {
  535.         $em $this->getDoctrine()->getManager();
  536.         $response = [
  537.             'status' => false
  538.         ];
  539.         $date = new DateTime();
  540.         if ($request->isMethod(Request::METHOD_POST)) {
  541.             $description $request->request->get('ordonnance')['description'];
  542.             $prescription $request->request->get('ordonnance')['prescription'];
  543.             $ordonance = new Ordonnance();
  544.             $ordonance->setClient($intervention->getClient());
  545.             $ordonance->setIntervention($intervention);
  546.             $ordonance->setDescription($description);
  547.             $ordonance->setPrescription($prescription);
  548.             $ordonance->setCreatedAt($date);
  549.             $em->persist($ordonance);
  550.             $em->flush();
  551.         }
  552.         return new JsonResponse($response);
  553.     }
  554.     /**
  555.      * @param Request $request
  556.      * @return JsonResponse
  557.      */
  558.     #[Route('fr/medecin/planning/addRecurrence'name'medecin_planning_add_recurrence')]
  559.     public function ajaxAddRecurrenceAction(Request $request)
  560.     {
  561.         $em $this->getDoctrine()->getManager();
  562.         if ($request->isMethod(Request::METHOD_POST)) {
  563.             $days $request->request->get('days');
  564.             $heureDebut $request->request->get('heureDebut');
  565.             $heureFin $request->request->get('heureFin');
  566.             $heureDebutPause $request->request->get('heureDebutPause');
  567.             $heureFinPause $request->request->get('heureFinPause');
  568.             /** @var User $user */
  569.             $user $this->getUser();
  570.             $docteur $user->getDocteur();
  571.             $docteur->setDisponiblite(json_encode($days));
  572.             $docteur->setStartWork($heureDebut);
  573.             $docteur->setEndWork($heureFin);
  574.             $docteur->setStartPause($heureDebutPause);
  575.             $docteur->setEndPause($heureFinPause);
  576.             $em->persist($docteur);
  577.             $em->flush();
  578.         }
  579.         $dispos $this->disponibiliteService->allDisponibilites($user);
  580.         return new JsonResponse([
  581.             'success' => true,
  582.             'dispos' => $dispos
  583.         ]);
  584.     }
  585.     /**
  586.      * @param Request $request
  587.      * @return JsonResponse
  588.      */
  589.     #[Route('fr/medecin/planning/addDisponibilite'name'medecin_planning_add_disponibilite')]
  590.     public function ajaxAddDispoAction(Request $request)
  591.     {
  592.         $em $this->getDoctrine()->getManager();
  593.         $dispoSerialize null;
  594.         $serializer $this->get('serializer');
  595.         if ($request->isMethod(Request::METHOD_POST)) {
  596.             $dateTimeStart $request->request->get('dateTimeStart');
  597.             $dateTimeEnd $request->request->get('dateTimeEnd');
  598.             $duree $request->request->get('duree');
  599.             $allDay $request->request->get('allDay');
  600.             $slots = (int) $request->request->get('slots');
  601.             $allDayBool false;
  602.             switch ($duree) {
  603.                 case '15min':
  604.                     $duree 0.25;
  605.                     $dureeString '+15 minutes';
  606.                     break;
  607.                 case '30min':
  608.                     $duree 0.5;
  609.                     $dureeString '+30 minutes';
  610.                     break;
  611.                 case '45min':
  612.                     $duree 0.75;
  613.                     $dureeString '+45 minutes';
  614.                     break;
  615.                 case '1H':
  616.                     $duree 1;
  617.                     $dureeString '+1 hour';
  618.                     break;
  619.                 case '1H15':
  620.                     $duree 1.25;
  621.                     $dureeString '+1 hour +15 minutes';
  622.                     break;
  623.                 case '1H30':
  624.                     $duree 1.5;
  625.                     $dureeString '+1 hour +30 minutes';
  626.                     break;
  627.                 case '1H45':
  628.                     $duree 1.75;
  629.                     $dureeString '+1 hour +45 minutes';
  630.                     break;
  631.                 case '2H':
  632.                     $duree 2;
  633.                     $dureeString '+2 hours';
  634.                     break;
  635.             }
  636.             $startDateTime = new \DateTime($dateTimeStart);
  637.             $endDateTime = new \DateTime($dateTimeEnd);
  638.             $diff $startDateTime->getTimestamp() - $endDateTime->getTimestamp();
  639.             $hours abs($diff / (60 60));
  640.             //once we know the nb of hours, create the slots of $duree minutes
  641.             $creneaux $hours $duree;
  642.             if ($allDay && $allDay === 'on') {
  643.                 $allDayBool true;
  644.             }
  645.             /** @var User $user */
  646.             $user $this->getUser();
  647.             $docteur $user->getDocteur();
  648.             $disponibilites = [];
  649.             $end = new \DateTime($dateTimeStart); // based on start to generate all slots
  650.             for ($i 0$i $creneaux$i++) {
  651.                 $disponibilite = new Disponibilite();
  652.                 $disponibilite->setDocteur($docteur);
  653.                 if ($i 0) {
  654.                     $startDateTime->modify($dureeString); //add duration to dateStart except on first loop
  655.                 }
  656.                 $disponibilite->setDateStart($startDateTime);
  657.                 $end->modify($dureeString);
  658.                 $disponibilite->setDateEnd($end);
  659.                 $disponibilite->setAllDay($allDayBool);
  660.                 $em->persist($disponibilite);
  661.                 //check for slots
  662.                 if ($slots 1) {
  663.                     for ($s 1$s $slots$s++) {
  664.                         $disponibiliteSupp = clone $disponibilite;
  665.                         $em->persist($disponibiliteSupp);
  666.                         $disponibilites[]  = [
  667.                             'id' => $disponibiliteSupp->getId(),
  668.                             'calendarId' =>  '1',
  669.                             'title' => 'Disponibilite',
  670.                             'category' =>  'time',
  671.                             'start' =>  $disponibiliteSupp->getDateStart()->format('Y-m-d\TH:i:s'),
  672.                             'end' => $disponibiliteSupp->getDateEnd()->format('Y-m-d\TH:i:s'),
  673.                             'allDay' => $disponibiliteSupp->getAllDay(),
  674.                             'isReadOnly' => true,
  675.                             'bgColor' => $disponibiliteSupp->getAllDay() ? '#28a745' '#0d8dd0'
  676.                         ];
  677.                     }
  678.                 }
  679.                 $em->flush();
  680.                 $disponibilites[]  = [
  681.                     'id' => $disponibilite->getId(),
  682.                     'calendarId' =>  '1',
  683.                     'title' => 'Disponibilite',
  684.                     'category' =>  'time',
  685.                     'start' =>  $disponibilite->getDateStart()->format('Y-m-d\TH:i:s'),
  686.                     'end' => $disponibilite->getDateEnd()->format('Y-m-d\TH:i:s'),
  687.                     'allDay' => $disponibilite->getAllDay(),
  688.                     'isReadOnly' => true,
  689.                     'bgColor' => $disponibilite->getAllDay() ? '#28a745' '#0d8dd0'
  690.                 ];
  691.             }
  692.             $dispoSerialize $serializer->serialize($disponibilites'json');
  693.         }
  694.         return new JsonResponse([
  695.             'success' => true,
  696.             'dispo' => $dispoSerialize
  697.         ]);
  698.     }
  699.     /**
  700.      * @param Request $request
  701.      * @return JsonResponse
  702.      */
  703.     #[Route('fr/medecin/planning/removeDisponibilite'name'medecin_planning_remove_disponibilite')]
  704.     public function ajaxRemoveDispoAction(Request $request)
  705.     {
  706.         $em $this->getDoctrine()->getManager();
  707.         $user $this->getUser();
  708.         $dispoRepo $em->getRepository(Disponibilite::class);
  709.         if ($request->isMethod(Request::METHOD_POST)) {
  710.             $dispoId $request->request->get('id');
  711.             $dispoToDelete $dispoRepo->findOneById($dispoId);
  712.             if ($dispoToDelete) {
  713.                 $em->remove($dispoToDelete);
  714.                 $em->flush();
  715.             } else {
  716.                 // reccurence remove
  717.                 $recurrenceKey $request->request->get('recurrence');
  718.                 $startDate $request->request->get('startDate');
  719.                 $dateTime DateTime::createFromFormat('D M d Y H:i:s e+'$startDate);
  720.                 $convertedStartDate $dateTime->format('Y-m-d\TH:i:s');
  721.                 $endDate $request->request->get('endDate');
  722.                 $dateTime DateTime::createFromFormat('D M d Y H:i:s e+'$endDate);
  723.                 $convertedEndDate $dateTime->format('Y-m-d\TH:i:s');
  724.                 $doctor $user->getDocteur();
  725.                 $recurrence json_decode($doctor->getDisponiblite(), true);
  726.                 $deleteRecurrenceValue $request->request->get('deleteRecurrenceValue');
  727.                 if (($key array_search($recurrenceKey$recurrence)) !== false) {
  728.                     if ($deleteRecurrenceValue === "1") {
  729.                         unset($recurrence[$key]);
  730.                         $doctor->setDisponiblite(json_encode(array_values($recurrence)));
  731.                     } else {
  732.                         // create deleted disponibilite json with start date and enddate and key day.
  733.                         $deletedDisponibilite[] = [
  734.                             'startDate' => $convertedStartDate,
  735.                             'endDate' => $convertedEndDate
  736.                         ];
  737.                         // Convert the deleted disponibilite to JSON
  738.                         $deletedDisponibiliteJson json_encode($deletedDisponibilite);
  739.                         $doctor->setDeletedDisponiblite($deletedDisponibiliteJson);
  740.                     }
  741.                     $em->persist($doctor);
  742.                     $em->flush();
  743.                 }
  744.             }
  745.         }
  746.         $dispos =  $this->disponibiliteService->allDisponibilites($user);
  747.         return new JsonResponse([
  748.             'success' => true,
  749.             'disponibilites' => $dispos
  750.         ]);
  751.     }
  752.     /**
  753.      * @Route("/fr/disponibilites", name="delete_disponibilites", methods={"POST"})
  754.      */
  755.     public function deleteDisponibilites(Request $request): JsonResponse
  756.     {
  757.         try {
  758.             $dateJour $request->request->get('deletefromdate');
  759.             $heureDebut $request->request->get('heuredebutdispo');
  760.             $heureFin $request->request->get('heurefindispo');
  761.             $user $this->getUser();
  762.             $docteur $user->getDocteur();
  763.             $this->disponibiliteService->deleteDisponibilites($docteur$dateJour$heureDebut$heureFin);
  764.             return new JsonResponse(
  765.                 [
  766.                     'message' => 'Disponibilités supprimées avec succès.',
  767.                     'success' => true,
  768.                     'dispos' => $this->disponibiliteService->allDisponibilites($user)
  769.                 ],
  770.                 Response::HTTP_OK
  771.             );
  772.         } catch (InvalidArgumentException $e) {
  773.             return new JsonResponse(['message' => $e->getMessage()], Response::HTTP_BAD_REQUEST);
  774.         } catch (Exception $e) {
  775.             return new JsonResponse(['message' => $e->getMessage()], Response::HTTP_INTERNAL_SERVER_ERROR);
  776.         }
  777.     }
  778.     /**
  779.      * @param Request $request
  780.      * @return JsonResponse
  781.      */
  782.     #[Route('fr/medecin/planning/updateDisponibilite'name'medecin_planning_update_disponibilite')]
  783.     public function ajaxUpdateDispoAction(Request $request)
  784.     {
  785.         $em $this->getDoctrine()->getManager();
  786.         $dispoRepo $em->getRepository(Disponibilite::class);
  787.         if ($request->isMethod(Request::METHOD_POST)) {
  788.             $date $request->request->get('dateStart');
  789.             $dateEnd $request->request->get('dateEnd');
  790.             $dispoId $request->request->get('id');
  791.             $dispoToUpdate $dispoRepo->findOneById($dispoId);
  792.             $dispoToUpdate->setDateStart(new \DateTime($date));
  793.             $dispoToUpdate->setDateEnd(new \DateTime($dateEnd));
  794.             $em->persist($dispoToUpdate);
  795.             $em->flush();
  796.         }
  797.         return new JsonResponse([
  798.             'success' => true
  799.         ]);
  800.     }
  801.     /**
  802.      * @param Request $request
  803.      * @return JsonResponse
  804.      */
  805.     #[Route("fr/medecin/updateWorking"name'medecin_planning_update_working')]
  806.     public function ajaxUpdateWorkingAction(Request $request)
  807.     {
  808.         $em $this->getDoctrine()->getManager();
  809.         if ($request->isMethod(Request::METHOD_POST)) {
  810.             $working = (bool) $request->request->get('working');
  811.             /** @var User $user */
  812.             $user $this->getUser();
  813.             $doctor $user->getDocteur();
  814.             $doctor->setWorking($working);
  815.             $em->persist($doctor);
  816.             $em->flush();
  817.         }
  818.         return new JsonResponse([
  819.             'success' => true
  820.         ]);
  821.     }
  822.     /**
  823.      * find client
  824.      * @param Request $request
  825.      * @return JsonResponse
  826.      */
  827.     #[Route('/fr/medecin/ajaxFindClients'name'medecin_ajax_find_clients')]
  828.     public function ajaxFindClientsAction(Request $request)
  829.     {
  830.         /** @var InterventionRepository $repositoryIntervention */
  831.         $repositoryIntervention $this->getDoctrine()->getRepository(Intervention::class);
  832.         /** @var User $user */
  833.         $user $this->getUser()->getDocteur();
  834.         $results = [];
  835.         if ($request->isMethod(Request::METHOD_POST)) {
  836.             $name $request->request->get('name');
  837.             $results $repositoryIntervention->findByName($user$name);
  838.         }
  839.         return new JsonResponse([
  840.             'success' => true,
  841.             'results' => $results
  842.         ]);
  843.     }
  844.     /**
  845.      * medecin/dossier
  846.      * @return Response
  847.      * @ParamConverter("client", class=Client::class)
  848.      */
  849.     #[Route('/fr/medecin/dossier'name'medecin_dossier_no_id')]
  850.     #[Route('/fr/medecin/dossier/{id}'name'medecin_dossier')]
  851.     public function dossierAction(Request $requestClient $clientMedecinDossierManager $dossierManagerJWTService $JWTService)
  852.     {
  853.         /** @var User $user */
  854.         $user $this->getUser();
  855.         $doctor $user->getDocteur();
  856.         $em $this->getDoctrine()->getManager();
  857.         $age $client->getDateInfoInfoString();
  858.         /** @var Intervention $intervention */
  859.         $intervention $em->getRepository(Intervention::class)->findLastByClient($client);
  860.         $arret $em->getRepository(ArretTravail::class)->findLastByClient($client);
  861.         $feuille $em->getRepository(FeuilleSoin::class)->findLastByClient($client);
  862.         $age $intervention $intervention[0]->getAge() : null;
  863.         $ordonnance $client->getOrdonnances()->last();
  864.         $ordos = [];
  865.         $ordonnances $client->getOrdonnances();
  866.         $newOrdonnance = new Ordonnance();
  867.         $ordonnanceForm $this->createForm(OrdonnanceType::class, $newOrdonnance);
  868.         $medecinDossier $dossierManager->findOrCreate($doctor$client);
  869.         $ordonnanceForm->handleRequest($request);
  870.         if ($request->isMethod(Request::METHOD_POST)) {
  871.             $comment $request->request->get('comment');
  872.             $medecinDossier $dossierManager->findOrCreate($doctor$client$comment);
  873.         }
  874.         $date = new DateTime();
  875.         if ($ordonnanceForm->isSubmitted() && $ordonnanceForm->isValid()) {
  876.             $prescription $ordonnanceForm->get('prescription')->getData();
  877.             $newOrdonnance->setPrescription($prescription);
  878.             $newOrdonnance->setClient($client);
  879.             $newOrdonnance->setIntervention($intervention[0]);
  880.             $newOrdonnance->setCreatedAt($date);
  881.             $em->persist($newOrdonnance);
  882.             $em->flush();
  883.             $ordonnance $newOrdonnance;
  884.         }
  885.         //select ordonnance
  886.         if ($ordonnances) {
  887.             foreach ($ordonnances as $key => $ordo) {
  888.                 $ordos[]  = [
  889.                     $ordo->getCreatedAt()->format('d/m/Y H:i') => $ordo->getId()
  890.                 ];
  891.             }
  892.             $ordonnancesForm $this->createFormBuilder()
  893.                 ->add('ordonnances'ChoiceType::class, [
  894.                     'choices' => $ordos,
  895.                     'label' => false,
  896.                     'placeholder' => 'Sélectionner une autre ordonnance',
  897.                     'attr' => ['class' => 'form-control'],
  898.                     'group_by' => function ($choice$key$value) {
  899.                         return '';
  900.                     }
  901.                 ])
  902.                 ->getForm();
  903.             $ordonnancesForm->handleRequest($request);
  904.             //form to select the date --> didn't work by ajax due to synapse widget
  905.             if ($ordonnancesForm->isSubmitted() && $ordonnancesForm->isValid()) {
  906.                 $ordonnanceFromForm $ordonnancesForm->get('ordonnances')->getData();
  907.                 $ordonnanceRepo $this->getDoctrine()->getManager()->getRepository(Ordonnance::class);
  908.                 $ordo $ordonnanceRepo->find($ordonnanceFromForm);
  909.                 $ordonnance $ordo;
  910.             }
  911.         }
  912.         $jwt $JWTService->generateJWT($this->getUser()->getId());
  913.         return new Response($this->renderView('Medecin/dossier.html.twig', [
  914.             'jwt' => $jwt,
  915.             'client' => $client,
  916.             'age' => $age,
  917.             'doctor' => $doctor,
  918.             'ordonnance' => $ordonnance,
  919.             'ordonnancesForm' => $ordonnances $ordonnancesForm->createView() : null,
  920.             'arret' => $arret $arret[0] : null,
  921.             'feuille' => $feuille $feuille[0] : null,
  922.             'ordonnanceForm' => $ordonnanceForm->createView(),
  923.             'intervention' => $intervention $intervention[0] : null,
  924.             'medecinDossier' => $medecinDossier,
  925.             'user' => $user
  926.         ]));
  927.     }
  928.     /**
  929.      * /releve
  930.      */
  931.     #[Route('fr/medecin/releve'name'medecin_releve')]
  932.     public function releveAction(Request $request)
  933.     {
  934.         $user $this->getUser();
  935.         $docteur $user->getDocteur();
  936.         $em $this->getDoctrine()->getManager();
  937.         $total 0;
  938.         $filter = array('docteur' => $docteur'etat' => 'endConsultation');
  939.         $dateBegin $request->request->get('dateBegin');
  940.         $dateEnd $request->request->get('dateEnd');
  941.         if (isset($dateBegin) && $dateBegin != null$filter['dateBegin'] = $dateBegin;
  942.         if (isset($dateEnd) && $dateEnd != null$filter['dateEnd'] = $dateEnd;
  943.         $interventions $em->getRepository(Intervention::class)
  944.             ->findInterventionFilter($filter100);
  945.         foreach ($interventions as $intervention) {
  946.             $prix 25;
  947.             if ($intervention->getDocteur()->getSpecialite()->getCode() == 'GENEI') {
  948.                 if ($intervention->getPrix() >= 39) {
  949.                     $prix 44.06;
  950.                 }
  951.             } else {
  952.                 if ($intervention->getPrix() !== 50 && $intervention->getPrix() !== 49.0 && $intervention->getPrix() !== 60) {
  953.                     $prix 44.06;
  954.                 }
  955.             }
  956.             $total += $prix;
  957.         }
  958.         return new Response($this->renderView('Medecin/releve.html.twig', [
  959.             'docteur' => $docteur,
  960.             'interventions' => $interventions,
  961.             'total' => $total,
  962.             'nbintervention35' => isset($interventionsTC35) ? count($interventionsTC35) : 0,
  963.             'nbintervention50' => isset($interventionsTC50) ? count($interventionsTC50) : 0,
  964.         ]));
  965.     }
  966.     /**
  967.      * Put in manager
  968.      * @param $imageBase64
  969.      * @param $nom
  970.      * @param $prenom
  971.      * @return Media
  972.      */
  973.     private function saveImage($file$nom$prenom)
  974.     {
  975.         $uid md5(uniqid(time()));
  976.         $filename 'image-' $nom '-' $prenom '-' $uid '.jpeg';
  977.         $this->fileUploader->upload($file$filename);
  978.         $media = new Media();
  979.         $media->setBinaryContent($this->fileUploader->getTargetDirectory() . $filename);
  980.         $media->setContext('docteur');
  981.         $media->setProviderName('sonata.media.provider.image');
  982.         $media->setName($filename);
  983.         $this->getDoctrine()->getManager()->persist($media);
  984.         $this->getDoctrine()->getManager()->flush();
  985.         return $filename;
  986.     }
  987. }