src/Controller/PriseAppelController.php line 122

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Planning\PlanningJour;
  4. use App\Entity\Planning\Site;
  5. use App\Entity\Planning\User;
  6. use App\Entity\Vetoadom\Animal;
  7. use App\Entity\Vetoadom\AnimalAgeUnit;
  8. use App\Entity\Vetoadom\AnimalEspece;
  9. use App\Entity\Vetoadom\AnimalRace;
  10. use App\Entity\Vetoadom\AnimalSexe;
  11. use App\Entity\Vetoadom\AnimalSite;
  12. use App\Entity\Vetoadom\Appel;
  13. use App\Entity\Vetoadom\AppelAnimal;
  14. use App\Entity\Vetoadom\ChargeService;
  15. use App\Entity\Vetoadom\Client;
  16. use App\Entity\Vetoadom\ClientSite;
  17. use App\Entity\Vetoadom\Consultation;
  18. use App\Entity\Vetoadom\ConsultationAnimalOperationSpecifique;
  19. use App\Entity\Vetoadom\ConsultationDelaiUrgence;
  20. use App\Entity\Vetoadom\ConsultationEtatHistorique;
  21. use App\Entity\Vetoadom\ConsultationNiveauUrgence;
  22. use App\Entity\Vetoadom\Habitation;
  23. use App\Entity\Vetoadom\JourType;
  24. use App\Entity\Vetoadom\Message;
  25. use App\Entity\Vetoadom\MessageMauvaiseGestion;
  26. use App\Entity\Vetoadom\OperationSpecifique;
  27. use App\Entity\Vetoadom\Referant;
  28. use App\Entity\Vetoadom\Secteur;
  29. use App\Entity\Vetoadom\SecteurCliniqueSecondaire;
  30. use App\Entity\Vetoadom\SecteurConsigne;
  31. use App\Entity\Vetoadom\SecteurForcageChargeService;
  32. use App\Entity\Vetoadom\SecteurForcageTarif;
  33. use App\Entity\Vetoadom\SecteurGammeTarif;
  34. use App\Entity\Vetoadom\SecteurPays;
  35. use App\Entity\Vetoadom\SecteurTextePredefini;
  36. use App\Entity\Vetoadom\SecteurZone;
  37. use App\Entity\Vetoadom\Tarif;
  38. use App\Entity\Vetoadom\TarifConsultation;
  39. use App\Entity\Vetoadom\TarifOperationSpecifique;
  40. use App\Entity\Vetoadom\UserInformationTemporaire;
  41. use App\Entity\Vetoadom\UserPositionLog;
  42. use App\Entity\Vetoadom\UserPositionLogEtat;
  43. use App\Entity\Vetoadom\Variable;
  44. use App\Entity\Vetoadom\Ville;
  45. use App\Service\APIlocation;
  46. use App\Service\CustomJsonResponse;
  47. use App\Service\Misc;
  48. use App\Service\PriseAppelHelper;
  49. use App\Service\SendEmail;
  50. use App\Service\SendSms;
  51. use App\Service\Translation;
  52. use Doctrine\ORM\EntityManagerInterface;
  53. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  54. use Symfony\Component\Asset\Packages;
  55. use Symfony\Component\HttpFoundation\RedirectResponse;
  56. use Symfony\Component\HttpFoundation\Request;
  57. use Symfony\Component\HttpFoundation\Response;
  58. use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
  59. use Symfony\Component\Routing\Annotation\Route;
  60. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  61. use Symfony\Component\Validator\Validator\ValidatorInterface;
  62. use Symfony\Contracts\Translation\TranslatorInterface;
  63. class PriseAppelController extends AbstractController
  64. {
  65.     private $APIlocation;
  66.     private $customJsonResponse;
  67.     private $misc;
  68.     private $planningEntityManager;
  69.     private $vetoadomEntityManager;
  70.     private $translation;
  71.     private $translator;
  72.     private $urlGenerator;
  73.     private $validator;
  74.     private $packages;
  75.     private $priseAppelHelper;
  76.     private $sendEmail;
  77.     private $sendSms;
  78.     private $tabs = ['resume''prise-appel''messages''carte'];
  79.     public function __construct(
  80.         APIlocation            $APIlocation,
  81.         CustomJsonResponse     $customJsonResponse,
  82.         Misc                   $misc,
  83.         EntityManagerInterface $planningEntityManager,
  84.         EntityManagerInterface $vetoadomEntityManager,
  85.         Packages               $packages,
  86.         PriseAppelHelper       $priseAppelHelper,
  87.         SendEmail              $sendEmail,
  88.         SendSms                $sendSms,
  89.         Translation            $translation,
  90.         TranslatorInterface    $translator,
  91.         UrlGeneratorInterface  $urlGenerator,
  92.         ValidatorInterface     $validator
  93.     )
  94.     {
  95.         $this->APIlocation $APIlocation;
  96.         $this->customJsonResponse $customJsonResponse;
  97.         $this->misc $misc;
  98.         $this->planningEntityManager $planningEntityManager;
  99.         $this->vetoadomEntityManager $vetoadomEntityManager;
  100.         $this->packages $packages;
  101.         $this->priseAppelHelper $priseAppelHelper;
  102.         $this->sendEmail $sendEmail;
  103.         $this->sendSms $sendSms;
  104.         $this->translation $translation;
  105.         $this->translator $translator;
  106.         $this->urlGenerator $urlGenerator;
  107.         $this->validator $validator;
  108.     }
  109.     /**
  110.      * @Route("/prise-appel/{secteurId}/{_locale}", name="app_prise_appel", methods={"GET","POST"})
  111.      * @param Request $request
  112.      * @param string $secteurId
  113.      * @param string $_locale
  114.      * @return Response
  115.      * @throws TransportExceptionInterface
  116.      */
  117.     public function index(Request $requeststring $secteurId "0"string $_locale ''): Response
  118.     {
  119.         /** @var User $user */
  120.         $user $this->getUser();
  121.         $secteurId = (int)$secteurId;
  122.         $secteur $secteurId $this->vetoadomEntityManager->getRepository(Secteur::class)->getUserSecteur($user$secteurId) : null;
  123.         if (!$secteur) {
  124.             $errorMessage $this->translator->trans('page_prise_appel.secteur_unknown', [], 'validators');
  125.             $redirect $this->urlGenerator->generate('app_dashboard');
  126.             if ($request->isXmlHttpRequest()) {
  127.                 $this->customJsonResponse->setForbidden(true);
  128.                 $this->customJsonResponse->setField('alert'$errorMessage);
  129.                 $this->customJsonResponse->setRedirect($redirect);
  130.                 return $this->customJsonResponse->sendResponse();
  131.             }
  132.             return $this->render('error.html.twig', [
  133.                 'user' => $user,
  134.                 'errorMessage' => $errorMessage,
  135.                 'redirect' => $redirect
  136.             ]);
  137.         }
  138.         if (!in_array($secteur->getFonctionnement()->getCode(),['domicile','clinique'])) {
  139.             $errorMessage "La prise d'appel est inaccessible ici pour les secteurs de type Alvetis ou Medicphone";
  140.             $redirect $this->urlGenerator->generate('app_dashboard');
  141.             if ($request->isXmlHttpRequest()) {
  142.                 $this->customJsonResponse->setForbidden(true);
  143.                 $this->customJsonResponse->setField('alert'$errorMessage);
  144.                 $this->customJsonResponse->setRedirect($redirect);
  145.                 return $this->customJsonResponse->sendResponse();
  146.             }
  147.             return $this->render('error.html.twig', [
  148.                 'user' => $user,
  149.                 'errorMessage' => $errorMessage,
  150.                 'redirect' => $redirect
  151.             ]);
  152.         }
  153.         if (!$secteur->getPlanning1Id()) {
  154.             $errorMessage $this->translator->trans('page_prise_appel.secteur_is_not_configured', [], 'validators');
  155.             $redirect $this->urlGenerator->generate('app_dashboard');
  156.             if ($request->isXmlHttpRequest()) {
  157.                 $this->customJsonResponse->setForbidden(true);
  158.                 $this->customJsonResponse->setField('alert'$errorMessage);
  159.                 $this->customJsonResponse->setRedirect($redirect);
  160.                 return $this->customJsonResponse->sendResponse();
  161.             }
  162.             return $this->render('error.html.twig', [
  163.                 'user' => $user,
  164.                 'errorMessage' => $errorMessage,
  165.                 'redirect' => $redirect
  166.             ]);
  167.         }
  168.         $tab = (string)$request->get('tab') ?? 'resume';
  169.         if (!in_array($tab$this->tabs)) {
  170.             $tab 'resume';
  171.         }
  172.         # appel modification
  173.         $appel null;
  174.         $messageId 0;
  175.         $consultationId 0;
  176.         $sourceMessage null;
  177.         $sourceConsultation null;
  178.         if ($tab == 'prise-appel') {
  179.             $messageId = (int)($request->get('messageId') ?? 0);
  180.             $sourceMessage $messageId
  181.                 $this->vetoadomEntityManager->getRepository(Message::class)->findOneBy([
  182.                     'id' => $messageId,
  183.                     'messageEtat' => [1,2],
  184.                     'secteur' => $this->vetoadomEntityManager->getRepository(Secteur::class)->getUserSecteurIds($user)
  185.                 ])
  186.                 : null;
  187.             if (
  188.                 $messageId
  189.                 && !$sourceMessage
  190.             ) {
  191.                 $errorMessage $this->translator->trans('page_prise_appel.appel_unknown', [], 'validators');
  192.                 $redirect $this->urlGenerator->generate('app_dashboard');
  193.                 if ($request->isXmlHttpRequest()) {
  194.                     $this->customJsonResponse->setForbidden(true);
  195.                     $this->customJsonResponse->setField('alert'$errorMessage);
  196.                     $this->customJsonResponse->setRedirect($redirect);
  197.                     return $this->customJsonResponse->sendResponse();
  198.                 }
  199.                 return $this->render('error.html.twig', [
  200.                     'user' => $user,
  201.                     'errorMessage' => $errorMessage,
  202.                     'redirect' => $redirect
  203.                 ]);
  204.             }
  205.             $consultationId = !$messageId ? ((int)($request->get('consultationId')) ?? 0) : 0;
  206.             $sourceConsultation $consultationId
  207.                 $this->vetoadomEntityManager->getRepository(Consultation::class)->findOneBy([
  208.                     'id' => $consultationId,
  209.                     'active' => 1
  210.                 ])
  211.                 : null;
  212.             if (
  213.                 $consultationId
  214.                 &&
  215.                 (
  216.                     !$sourceConsultation
  217.                     || !in_array($sourceConsultation->getAppelAnimal()->getAppel()->getSecteur()->getId(), $this->vetoadomEntityManager->getRepository(Secteur::class)->getUserSecteurIds($user))
  218.                 )
  219.             ) {
  220.                 $errorMessage $this->translator->trans('page_prise_appel.appel_unknown', [], 'validators');
  221.                 $redirect $this->urlGenerator->generate('app_dashboard');
  222.                 if ($request->isXmlHttpRequest()) {
  223.                     $this->customJsonResponse->setForbidden(true);
  224.                     $this->customJsonResponse->setField('alert'$errorMessage);
  225.                     $this->customJsonResponse->setRedirect($redirect);
  226.                     return $this->customJsonResponse->sendResponse();
  227.                 }
  228.                 return $this->render('error.html.twig', [
  229.                     'user' => $user,
  230.                     'errorMessage' => $errorMessage,
  231.                     'redirect' => $redirect
  232.                 ]);
  233.             }
  234.             $appel $sourceMessage $sourceMessage->getAppel() : ($sourceConsultation $sourceConsultation->getAppelAnimal()->getAppel() : null);
  235.         }
  236.         $params = [];
  237.         if ($request->getMethod() == 'GET') {
  238.             $sessionData $request->getSession()->remove('prise-appel') ?? [];
  239.             # check secteur locale
  240.             $langues $secteur->getLanguesArray();
  241.             if (($langueIndex array_search($_localearray_column($langues'locale'))) === false) {
  242.                 return new RedirectResponse($this->urlGenerator->generate('app_prise_appel', ['secteurId' => $secteur->getId(), '_locale' => $langues[0]['locale']]));
  243.             }
  244.             $params['roles'] = $user->getRoles();
  245.             $params['dashboardUrl'] = $this->urlGenerator->generate('app_dashboard');
  246.             $params['priseAppelChangeSecteurUrl'] = $this->urlGenerator->generate('app_prise_appel_change_secteur');
  247.             $params['clientUrl'] = $this->urlGenerator->generate('app_admin_client');
  248.             $params['referantUrl'] = $this->urlGenerator->generate('app_referants_horaries_consignes_fiche');
  249.             $params['ckeditorURL'] = $this->getParameter('ckeditor_path');
  250.             $params['mapStyle'] = $_ENV['MAP_STYLE'];
  251.             // resume
  252.             $params['consultations'] = [];
  253.             $params['consultationNiveauUrgence'] = [];
  254.             foreach ($this->vetoadomEntityManager->getRepository(ConsultationNiveauUrgence::class)->findAll() as $item) {
  255.                 $params['consultationNiveauUrgence'][] = [
  256.                     'id' => $item->getId(),
  257.                     'nom' => $this->translator->trans('consultation_niveau_urgence.' $item->getCode(), [], 'messages'),
  258.                     'code' => $item->getCode()
  259.                 ];
  260.             }
  261.             // messages
  262.             $params['messages'] = [];
  263.             // carte
  264.             if ($secteur->getFonctionnement()->getCode() == 'domicile') {
  265.                 $params['userPositionLogEtat'] = [];
  266.                 foreach ($this->vetoadomEntityManager->getRepository(UserPositionLogEtat::class)->findAll() as $item) {
  267.                     $params['userPositionLogEtat'][] = [
  268.                         'id' => $item->getId(),
  269.                         'nom' => $this->translator->trans('user_position_log_etat.'.$item->getCode(),[],'messages')
  270.                     ];
  271.                 }
  272.             }
  273.             // prise-appel
  274.             $veterinairesPlanning $this->priseAppelHelper->getVeterinairesPlanning($secteur);
  275.             # appel
  276.             $params['appel'] = $sessionData['appel'] ?? $this->priseAppelHelper->getAppel($appel);
  277.             # appel modification
  278.             $params['appel']['messageId'] = $messageId;
  279.             $params['appel']['consultationId'] = $consultationId;
  280.             if ($params['appel']['messageId']) {
  281.                 $params['appel']['messageEtatId'] = $sourceMessage->getMessageEtat()->getId();
  282.                 $params['appel']['actions'] = $this->isGranted('ROLE_ADMIN') || in_array($user->getId(),array_column($veterinairesPlanning,'id')) ? 'admin' 'user';
  283.             }
  284.             # set secteur ville coordinates
  285.             if ($secteur->getVille()) {
  286.                 $secteur->setVille($this->APIlocation->setVilleCoordinates($secteur->getVille()));
  287.             }
  288.             $params['secteur'] = [
  289.                 'id' => $secteur->getId(),
  290.                 'nom' => $secteur->getNom(),
  291.                 'couleur' => $secteur->getCouleur(),
  292.                 'fonctionnementCode' => $secteur->getFonctionnement()->getCode(),
  293.                 'adresse1' => $secteur->getAdresse1() ?? '',
  294.                 'villeNom' => $secteur->getVille() ? $secteur->getVille()->getNom() : '',
  295.                 'villeCp' => $secteur->getVille() ? $secteur->getVille()->getCp() : '',
  296.                 'villeLat' => $secteur->getVille() ? $secteur->getVille()->getLat() : null,
  297.                 'villeLon' => $secteur->getVille() ? $secteur->getVille()->getLon() : null,
  298.                 'paysNom' => $secteur->getVille() ? $secteur->getVille()->getPays()->getNom() : '',
  299.                 'uniteDeplacement' => $secteur->getVille() ? $secteur->getVille()->getPays()->getUniteDeplacement() : '',
  300.                 'langue' => $_locale,
  301.                 'timezone' => 'UTC',
  302.                 'planningAstreinteChirurgie' => [],
  303.                 'planningVetCoach' => [],
  304.                 'consultationTarifId' => 0,
  305.                 'consultationTarifs' => [],
  306.                 'consignes' => $this->vetoadomEntityManager->getRepository(SecteurConsigne::class)->getSecteurConsignes($secteur->getId()),
  307.                 'langues' => $langues,
  308.                 'langueIndex' => $langueIndex,
  309.                 'pays' => $this->vetoadomEntityManager->getRepository(SecteurPays::class)->getSecteurPaysArray($secteur->getId()),
  310.                 'referant' => $secteur->getReferant() ? $secteur->getReferant()->getId() : 0,
  311.                 'referantNom' => $secteur->getReferant() ? $secteur->getReferant()->getNom() : '',
  312.                 'secteurTextePredefini' => [],
  313.                 'secteurCategoriesPoidsEspece' => [],
  314.                 'secteurZone' => null,
  315.                 'cliniquesSecondaire' => [],
  316.                 'stats' => $this->priseAppelHelper->getSecteurStats($secteur),
  317.                 'tarifOperationSpecifique' => [],
  318.                 'tab' => $tab,
  319.             ];
  320.             if ($secteur->getFonctionnement()->getCode() == 'clinique') {
  321.                 foreach ($this->vetoadomEntityManager->getRepository(SecteurCliniqueSecondaire::class)->findBy(['secteur' => $secteur'active' => 1]) as $secteurCliniqueSecondaire) {
  322.                     $secteurCliniqueSecondaire->setVille($this->APIlocation->setVilleCoordinates($secteurCliniqueSecondaire->getVille()));
  323.                     $params['secteur']['cliniquesSecondaire'][] = [
  324.                         'id' => $secteurCliniqueSecondaire->getId(),
  325.                         'nom' => $secteurCliniqueSecondaire->getNom(),
  326.                         'villeLat' => $secteurCliniqueSecondaire->getVille()->getLat(),
  327.                         'villeLon' => $secteurCliniqueSecondaire->getVille()->getLon(),
  328.                     ];
  329.                 }
  330.             }
  331.             # for clock display
  332.             foreach ($secteur->getSecteurPaysCollection() as $secteurPays) {
  333.                 $params['secteur']['timezone'] = $secteurPays->getPays()->getFuseauHoraire()->getCode();
  334.                 break;
  335.             }
  336.             # planning_text
  337.             $currentDateTime = new \DateTimeImmutable();
  338.             $params['planning_text'] = [];
  339.             $params['currentVets'] = [];
  340.             if ($secteur->getPlanning1Id()) {
  341.                 $planning1 $this->planningEntityManager->getRepository(Site::class)->findOneBy(['id' => $secteur->getPlanning1Id()]);
  342.                 $planning1CurrentVetsNumber $this->planningEntityManager->getRepository(PlanningJour::class)->getCurrentVetsNumber($secteur->getPlanning1Id(),$currentDateTime->format('Y-m-d H:i:s'));
  343.                 if ($planning1NextVetsChangeTime $this->planningEntityManager->getRepository(PlanningJour::class)->getNextVetsChangeTime($secteur->getPlanning1Id())) {
  344.                     $planning1NextVetsChangeTimeFormatted = (new \DateTime($planning1NextVetsChangeTime['nextVetsChangeTime']))->format('H:i');
  345.                     $planning1NextVetsNumber $this->planningEntityManager->getRepository(PlanningJour::class)->getCurrentVetsNumber($secteur->getPlanning1Id(),$planning1NextVetsChangeTime['nextVetsChangeTime']);
  346.                 }
  347.                 else {
  348.                     $planning1NextVetsChangeTimeFormatted '--:--';
  349.                     $planning1NextVetsNumber['vetsNumber'] = 0;
  350.                 }
  351.                 $params['planning_text'][] = $this->translator->trans(
  352.                     'page_prise_appel.planning_text',
  353.                     [
  354.                         '{{planningNom}}' => $planning1->getNom(),
  355.                         '{{currentVetsNumber}}' => $planning1CurrentVetsNumber['vetsNumber'],
  356.                         '{{nextVetsChangeTime}}' => $planning1NextVetsChangeTimeFormatted,
  357.                         '{{nextVetsNumber}}' => $planning1NextVetsNumber['vetsNumber']
  358.                     ],
  359.                     'messages'
  360.                 );
  361.                 $params['currentVets'] = array_merge(
  362.                     $params['currentVets'],
  363.                     $this->planningEntityManager->getRepository(PlanningJour::class)->getCurrentVetsList($secteur->getPlanning1Id(),$currentDateTime->format('Y-m-d H:i:s'))
  364.                 );
  365.             }
  366.             if ($secteur->getPlanning2Id()) {
  367.                 $planning2 $this->planningEntityManager->getRepository(Site::class)->findOneBy(['id' => $secteur->getPlanning2Id()]);
  368.                 $planning2CurrentVetsNumber $this->planningEntityManager->getRepository(PlanningJour::class)->getCurrentVetsNumber($secteur->getPlanning2Id(),$currentDateTime->format('Y-m-d H:i:s'));
  369.                 if ($planning2NextVetsChangeTime $this->planningEntityManager->getRepository(PlanningJour::class)->getNextVetsChangeTime($secteur->getPlanning2Id())) {
  370.                     $planning2NextVetsChangeTimeFormatted = (new \DateTime($planning2NextVetsChangeTime['nextVetsChangeTime']))->format('H:i');
  371.                     $planning2NextVetsNumber $this->planningEntityManager->getRepository(PlanningJour::class)->getCurrentVetsNumber($secteur->getPlanning2Id(),$planning2NextVetsChangeTime['nextVetsChangeTime']);
  372.                 }
  373.                 else {
  374.                     $planning2NextVetsChangeTimeFormatted '--:--';
  375.                     $planning2NextVetsNumber['vetsNumber'] = 0;
  376.                 }
  377.                 $params['planning_text'][] = $this->translator->trans(
  378.                     'page_prise_appel.planning_text',
  379.                     [
  380.                         '{{planningNom}}' => $planning2->getNom(),
  381.                         '{{currentVetsNumber}}' => $planning2CurrentVetsNumber['vetsNumber'],
  382.                         '{{nextVetsChangeTime}}' => $planning2NextVetsChangeTimeFormatted,
  383.                         '{{nextVetsNumber}}' => $planning2NextVetsNumber['vetsNumber']
  384.                     ],
  385.                     'messages'
  386.                 );
  387.                 $params['currentVets'] = array_merge(
  388.                     $params['currentVets'],
  389.                     $this->planningEntityManager->getRepository(PlanningJour::class)->getCurrentVetsList($secteur->getPlanning2Id(),$currentDateTime->format('Y-m-d H:i:s'))
  390.                 );
  391.             }
  392.             # planningSuperviseur
  393.             $params['secteur']['planningSuperviseur'] = $this->priseAppelHelper->getPlanningSuperviseur($secteur);
  394.             # planningRegulateur
  395.             $params['secteur']['planningRegulateur'] = $this->priseAppelHelper->getPlanningRegulateur($secteur);
  396.             if (!$params['secteur']['planningRegulateur']) {
  397.                 $params['secteur']['planningRegulateur'] = $params['secteur']['planningSuperviseur'];
  398.             }
  399.             # planningAstreinteChirurgie
  400.             if ($secteur->getAstreinteChirurgiePlanningId()) {
  401.                 $params['secteur']['planningAstreinteChirurgie'] = $this->planningEntityManager->getRepository(PlanningJour::class)->getAstreinteChirurgie($secteur->getAstreinteChirurgiePlanningId());
  402.             }
  403.             # planningVetCoach
  404.             if ($secteur->getVetcoachPlanningId()) {
  405.                 $params['secteur']['planningVetCoach'] = $this->planningEntityManager->getRepository(PlanningJour::class)->getVetCoach($secteur->getVetcoachPlanningId());
  406.             }
  407.             # veterinairesPlanning
  408.             $params['secteur']['veterinairesPlanning'] = $veterinairesPlanning;
  409.             # light
  410.             $secteurForcageChargeService $this->vetoadomEntityManager->getRepository(SecteurForcageChargeService::class)->findOneBy(['secteur' => $secteur'dateSuppression' => null]);
  411.             if ($secteurForcageChargeService) {
  412.                 $params['secteur']['light'] = $secteurForcageChargeService->getChargeService()->getCouleur();
  413.             } else {
  414.                 $lightConsultations $this->vetoadomEntityManager->getRepository(Consultation::class)->getLightConsultations($secteur->getId());
  415.                 $lightCode = (
  416.                     count($params['currentVets']) == 0
  417.                     || ($lightConsultations['consultationsNumber'] / count($params['currentVets'])) > $secteur->getCoeffFeux()
  418.                 ) ? 'orange' 'green';
  419.                 $params['secteur']['light'] = $this->vetoadomEntityManager->getRepository(ChargeService::class)->findOneBy(['code' => $lightCode])->getCouleur();
  420.             }
  421.             # new appel
  422.             if (!$params['appel']['id']) {
  423.                 $params['regulateurs'] = [];
  424.                 foreach ($this->priseAppelHelper->getPlanningRegulateur($secteur,true) as $item) {
  425.                     $params['regulateurs'][$item['id']] = [
  426.                         'userId' => $item['id'],
  427.                         'userNom' => $item['nom'],
  428.                         'userPrenom' => $item['prenom'],
  429.                     ];
  430.                 }
  431.                 foreach ($this->planningEntityManager->getRepository(User::class)->getVeterinairesPlanning([$secteur->getSupervisionPlanningId()]) as $item) {
  432.                     if (array_key_exists($item['id'],$params['regulateurs'])) continue;
  433.                     $params['regulateurs'][$item['id']] = [
  434.                         'userId' => $item['id'],
  435.                         'userNom' => $item['userNom'],
  436.                         'userPrenom' => $item['userPrenom'],
  437.                     ];
  438.                 }
  439.                 foreach ($params['secteur']['veterinairesPlanning'] as $item) {
  440.                     if (array_key_exists($item['id'],$params['regulateurs'])) continue;
  441.                     if (!in_array($item['role'],['ADMIN','SUPERADMIN'])) continue;
  442.                     $params['regulateurs'][$item['id']] = [
  443.                         'userId' => $item['id'],
  444.                         'userNom' => $item['userNom'],
  445.                         'userPrenom' => $item['userPrenom'],
  446.                     ];
  447.                 }
  448.                 $params['regulateurs'] = array_values($params['regulateurs']);
  449.                 $userNoms array_column($params['regulateurs'],'userNom');
  450.                 $userPrenoms array_column($params['regulateurs'],'userPrenom');
  451.                 array_multisort($userNoms,SORT_ASC,$userPrenoms,SORT_ASC,$params['regulateurs']);
  452.                 if (count($params['secteur']['planningRegulateur'])) {
  453.                     $params['appel']['regulateurId'] = $params['secteur']['planningRegulateur'][0]['id'];
  454.                 }
  455.             }
  456.             # consultation
  457.             $jourTypeId $this->vetoadomEntityManager->getRepository(JourType::class)->getJourType();
  458.             $params['tarifs'] = [];
  459.             foreach ($this->vetoadomEntityManager->getRepository(Tarif::class)->findBy(['active' => 1]) as $tarif) {
  460.                 $params['tarifs'][] = [
  461.                     'id' => $tarif->getId(),
  462.                     'nom' => $this->translator->trans('tarif.'.$tarif->getCode(), [], 'messages'),
  463.                 ];
  464.             }
  465.             if ($this->vetoadomEntityManager->getRepository(Tarif::class)->checkFilledAllSecteurTarifs($secteur->getId())) {
  466.                 $secteurForcageTarif $this->vetoadomEntityManager->getRepository(SecteurForcageTarif::class)->getCurrentForcageTarif($secteur->getId());
  467.                 if ($secteurForcageTarif) {
  468.                     $params['secteur']['consultationTarifId'] = $secteurForcageTarif->getTarif()->getId();
  469.                 }
  470.                 else if ($tarif $this->vetoadomEntityManager->getRepository(SecteurGammeTarif::class)->getTarif($secteur->getId(), $jourTypeId)) {
  471.                     $params['secteur']['consultationTarifId'] = $tarif['id'];
  472.                 }
  473.                 if ($params['secteur']['consultationTarifId']) {
  474.                     foreach ($this->vetoadomEntityManager->getRepository(TarifConsultation::class)->findBy(['secteur' => $secteur]) as $tarifConsultation) {
  475.                         $params['secteur']['consultationTarifs'][] = [
  476.                             'tarif' => $tarifConsultation->getTarif()->getId(),
  477.                             'pays' => $tarifConsultation->getPays()->getId(),
  478.                             'prix' => (float)$tarifConsultation->getPrix()
  479.                         ];
  480.                     }
  481.                 }
  482.             }
  483.             if (!empty($sessionData['consultationTarifId'])) {
  484.                 $params['secteur']['consultationTarifId'] = $sessionData['consultationTarifId'];
  485.             }
  486.             # clinique secteurZone
  487.             if ($secteur->getFonctionnement()->getCode() == 'clinique') {
  488.                 if ($secteur->getSecteurZoneCollection()->count()) {
  489.                     /** @var SecteurZone $secteurZone */
  490.                     $secteurZone $secteur->getSecteurZoneCollection()->first();
  491.                     $params['secteur']['secteurZone']['textPriseAppel'] = $langueIndex == $secteurZone->getTextPriseAppelLangue1() : $secteurZone->getTextPriseAppelLangue2();
  492.                 }
  493.             }
  494.             # secteurTextePredefini
  495.             foreach ($this->vetoadomEntityManager->getRepository(SecteurTextePredefini::class)->findBy(['secteur' => $secteur->getId(), 'langue' => $langues[$langueIndex]['id'], 'active' => 1]) as $secteurTextePredefini) {
  496.                 $params['secteur']['secteurTextePredefini'][] = [
  497.                     'typeCode' => $secteurTextePredefini->getSecteurTextePredefiniType()->getCode(),
  498.                     'texteCourt' => $secteurTextePredefini->getTexteCourt(),
  499.                     'texteLong' => $secteurTextePredefini->getTexteLong(),
  500.                 ];
  501.             }
  502.             # tarifOperationSpecifique
  503.             foreach ($secteur->getSecteurCategoriePoidsEspeceCollection() as $secteurCategoriePoidsEspece) {
  504.                 $params['secteur']['secteurCategoriesPoidsEspece'][] = [
  505.                     'id' => $secteurCategoriePoidsEspece->getId(),
  506.                     'secteurEspece' => $secteurCategoriePoidsEspece->getSecteurEspece()->getId(),
  507.                     'secteurEspeceNom' => $this->translator->trans('secteur_espece.' $secteurCategoriePoidsEspece->getSecteurEspece()->getCode(), [], 'messages'),
  508.                     'min' => $secteurCategoriePoidsEspece->getMin(),
  509.                     'max' => $secteurCategoriePoidsEspece->getMax()
  510.                 ];
  511.             }
  512.             if ($params['secteur']['consultationTarifId']) {
  513.                 foreach ($this->vetoadomEntityManager->getRepository(TarifOperationSpecifique::class)->findBy(['secteur' => $secteur'tarif' => $params['secteur']['consultationTarifId']]) as $tarifOperationSpecifique) {
  514.                     $params['secteur']['tarifOperationSpecifique'][] = [
  515.                         'id' => $tarifOperationSpecifique->getId(),
  516.                         'pays' => $tarifOperationSpecifique->getPays()->getId(),
  517.                         'operationSpecifiqueCode' => $tarifOperationSpecifique->getOperationSpecifique()->getCode(),
  518.                         'secteurCategoriePoidsEspece' => $tarifOperationSpecifique->getSecteurCategoriePoidsEspece()->getId(),
  519.                         'prix' => (float)$tarifOperationSpecifique->getPrix()
  520.                     ];
  521.                 }
  522.             }
  523.             # pays
  524.             foreach ($params['secteur']['pays'] as &$pays) {
  525.                 $pays['flag'] = $this->packages->getUrl("build/images/flag/${pays['id']}.png");
  526.             }
  527.             # client search
  528.             $params['clientSearch'] = [
  529.                 'pays' => $params['secteur']['pays'][0]['id'],
  530.                 'indicatif' => $params['secteur']['pays'][0]['indicatif'],
  531.                 'searchClientTelephoneTimer' => null,
  532.                 'telephone' => '',
  533.                 'searchClientNomTimer' => null,
  534.                 'nom' => '',
  535.                 'ville' => 0,
  536.                 'villeCp' => '',
  537.                 'villeSearchStarted' => false,
  538.                 'villeSearchTimer' => null,
  539.                 'villes' => [],
  540.                 'externeId' => '',
  541.                 'clients' => [],
  542.                 'searchClientStarted' => false,
  543.             ];
  544.             # client
  545.             $params['client'] = $sessionData['client'] ?? $this->priseAppelHelper->getClient($params['appel']['clientId'],$params['appel']['id']);
  546.             $params['habitation'] = [];
  547.             foreach ($this->vetoadomEntityManager->getRepository(Habitation::class)->findAll() as $item) {
  548.                 $params['habitation'][] = [
  549.                     'id' => $item->getId(),
  550.                     'nom' => $this->translator->trans('habitation.' $item->getCode(), [], 'messages'),
  551.                 ];
  552.             }
  553.             $params['animalEspece'] = [];
  554.             foreach ($this->vetoadomEntityManager->getRepository(AnimalEspece::class)->findAll() as $item) {
  555.                 $params['animalEspece'][] = [
  556.                     'id' => $item->getId(),
  557.                     'code' => $item->getCode(),
  558.                     'nom' => $this->translator->trans('animal_espece.' $item->getCode(), [], 'messages'),
  559.                 ];
  560.             }
  561.             $params['animalRace'] = [];
  562.             foreach ($this->vetoadomEntityManager->getRepository(AnimalRace::class)->findAll() as $item) {
  563.                 $params['animalRace'][] = [
  564.                     'id' => $item->getId(),
  565.                     'code' => $item->getCode(),
  566.                     'animalEspece' => $item->getAnimalEspece()->getId(),
  567.                     'nom' => $this->translator->trans('animal_race.' $item->getCode(), [], 'messages'),
  568.                 ];
  569.             }
  570.             $params['animalSexe'] = [];
  571.             foreach ($this->vetoadomEntityManager->getRepository(AnimalSexe::class)->findAll() as $item) {
  572.                 $params['animalSexe'][] = [
  573.                     'id' => $item->getId(),
  574.                     'nom' => $this->translator->trans('animal_sexe.' $item->getCode(), [], 'messages'),
  575.                 ];
  576.             }
  577.             $params['animalAgeUnit'] = [];
  578.             foreach ($this->vetoadomEntityManager->getRepository(AnimalAgeUnit::class)->findAll() as $item) {
  579.                 $params['animalAgeUnit'][] = [
  580.                     'code' => $item->getCode(),
  581.                     'nom' => $this->translator->trans('animal_age_unit.' $item->getCode(), [], 'messages'),
  582.                 ];
  583.             }
  584.             # referant
  585.             $params['jourTypes'] = [];
  586.             foreach ($this->vetoadomEntityManager->getRepository(JourType::class)->findBy(['formulaireReferant' => 1]) as $jourType) {
  587.                 $params['jourTypes'][] = [
  588.                     'id' => $jourType->getId(),
  589.                     'nom' => $this->translator->trans('jour.' $jourType->getCode(), [], 'messages'),
  590.                 ];
  591.             }
  592.             # infoConsultation
  593.             # get consultation for modification or use new one
  594.             if ($messageId) {
  595.                 $sourceConsultation $sourceMessage->getConsultation() ?? new Consultation();
  596.             }
  597.             else if (!$sourceConsultation) {
  598.                 $sourceConsultation = new Consultation();
  599.             }
  600.             $params['infoConsultation'] = [
  601.                 'infoArv' => $sourceConsultation->getInfoArv() ?? '',
  602.                 'veterinaireIntervenant' => null,
  603.                 'dateMin' => $sourceConsultation->getDateCreation() ? $sourceConsultation->getDateCreation()->format('Y-m-d') : $currentDateTime->format('Y-m-d'),
  604.             ];
  605.             if ($sourceConsultation->getVeterinaireIntervenantId()) {
  606.                 foreach ($params['secteur']['veterinairesPlanning'] as $veterinaireIntervenant) {
  607.                     if ($sourceConsultation->getVeterinaireIntervenantId() != $veterinaireIntervenant['id']) continue;
  608.                     $params['infoConsultation']['veterinaireIntervenant'] = $veterinaireIntervenant;
  609.                     break;
  610.                 }
  611.             }
  612.             $variableEmplacements = [];
  613.             if (!count($params['currentVets'])) {
  614.                 $params['infoConsultationTextTemplate'] = $secteur->{'getTexteSansLangue'.($langueIndex 1)}() ?? '';
  615.                 $variableEmplacements[] = 'secteur_text_sans_veterinaire';
  616.             }
  617.             else if (count($params['currentVets']) == 1) {
  618.                 $params['infoConsultationTextTemplate'] = $secteur->{'getTexteMonoLangue'.($langueIndex 1)}() ?? '';
  619.                 $variableEmplacements[] = 'secteur_text_mono_veterinaire';
  620.             }
  621.             else {
  622.                 $params['infoConsultationTextTemplate'] = $secteur->{'getTexteMultiLangue'.($langueIndex 1)}() ?? '';
  623.                 $variableEmplacements[] = 'secteur_text_multi_veterinaire';
  624.             }
  625.             $params['infoConsultationTextVariables'] = [];
  626.             foreach ($this->vetoadomEntityManager->getRepository(Variable::class)->getVariables($variableEmplacements) as $variable) {
  627.                 $params['infoConsultationTextVariables'][] = $variable->getCode();
  628.             }
  629.             if ($params['secteur']['fonctionnementCode'] == 'domicile') {
  630.                 # ConsultationDelaiUrgence
  631.                 $params['consultationDelaiUrgence'] = [];
  632.                 foreach ($this->vetoadomEntityManager->getRepository(ConsultationDelaiUrgence::class)->findAll() as $item) {
  633.                     $params['consultationDelaiUrgence'][] = [
  634.                         'id' => $item->getId(),
  635.                         'code' => $item->getCode(),
  636.                         'nom' => $this->translator->trans('consultation_delai_urgence.' $item->getCode(), [], 'messages'),
  637.                     ];
  638.                     if (
  639.                         (
  640.                             $secteur->getSecteurDelaiDefaut()->getCode() == 'dans_heure'
  641.                             && $item->getCode() == 'dans_heure'
  642.                         )
  643.                         ||
  644.                         (
  645.                             $secteur->getSecteurDelaiDefaut()->getCode() == 'aucun'
  646.                             && $item->getCode() == 'delai_a_preciser'
  647.                         )
  648.                     ) {
  649.                         $params['infoConsultation']['delaiUrgenceCode'] = $item->getCode();
  650.                     }
  651.                 }
  652.                 if ($sourceConsultation->getConsultationDelaiUrgence()) {
  653.                     $params['infoConsultation']['delaiUrgenceCode'] = $sourceConsultation->getConsultationDelaiUrgence()->getCode();
  654.                 }
  655.                 $params['infoConsultation']['debutHeure'] = $sourceConsultation->getDebutConsultation() ? $sourceConsultation->getDebutConsultation()->format('H:i') : '';
  656.                 $params['infoConsultation']['finHeure'] = $sourceConsultation->getFinConsultation() ? $sourceConsultation->getFinConsultation()->format('H:i') : '';
  657.                 $params['infoConsultation']['date'] = $sourceConsultation->getDebutConsultation() ? $sourceConsultation->getDebutConsultation()->format('Y-m-d') : '';
  658.             }
  659.             else {
  660.                 $params['infoConsultation']['heure'] = $sourceConsultation->getDebutConsultation() ? $sourceConsultation->getDebutConsultation()->format('H:i') : '';
  661.                 $params['infoConsultation']['date'] = $sourceConsultation->getDebutConsultation() ? $sourceConsultation->getDebutConsultation()->format('Y-m-d') : $currentDateTime->format('Y-m-d');
  662.             }
  663.             // scripts translation
  664.             $domainContext = [
  665.                 'scripts' => [
  666.                     'alert_modal',
  667.                     'error_alert_modal',
  668.                     'page_prise_appel',
  669.                     'page_prise_appel_referant',
  670.                     'page_prise_appel_animal',
  671.                     'page_prise_appel_carte',
  672.                     'consultation_etat_historique_modal',
  673.                     'consultation_supprimer_modal',
  674.                     'consultation_eta_modal',
  675.                     'consultation_niveau_urgence_modal',
  676.                     'consultation_en_cours_clinique_modal',
  677.                     'consultation_en_cours_clinique_next_etat_modal',
  678.                     'consultation_demande_de_nouvelles_modal',
  679.                     'message_supprimer_modal',
  680.                     'message_mauvaise_gestion_modal',
  681.                     'secteur_content_modal',
  682.                     'vet_force_modal',
  683.                     'vet_information_temporaire_modal'
  684.                 ],
  685.                 'validators' => [
  686.                     'common',
  687.                     'documents',
  688.                 ],
  689.             ];
  690.             $params['trans'] = $this->translation->getTranslation($domainContext);
  691.             return $this->render(
  692.                 'prise-appel.html.twig',
  693.                 [
  694.                     'user' => $user,
  695.                     'params' => $params
  696.                 ]
  697.             );
  698.         }
  699.         # POST
  700.         $action $request->get('action');
  701.         switch ($action) {
  702.             case 'getResume':
  703.                 {
  704.                     $this->customJsonResponse->setField('consultations'$this->priseAppelHelper->getResumeConsultations($secteur));
  705.                     return $this->customJsonResponse->sendResponse();
  706.                 }
  707.                 break;
  708.             case 'getConsultationEtatHistorique':
  709.                 {
  710.                     $consultationId = (int)($request->get('id') ?? 0);
  711.                     $this->customJsonResponse->setField('consultationEtatHistorique'$this->priseAppelHelper->getConsultationEtatHistorique($secteur$consultationId));
  712.                     return $this->customJsonResponse->sendResponse();
  713.                 }
  714.                 break;
  715.             case 'consultationSupprimer':
  716.                 {
  717.                     if (
  718.                         !$this->isGranted('ROLE_ADMIN')
  719.                         && !$this->isGranted('ROLE_ARV')
  720.                         && !$this->isGranted('ROLE_ASV')
  721.                     ) {
  722.                         $this->customJsonResponse->setForbidden(true);
  723.                         $this->customJsonResponse->setField('alert'$this->translator->trans('common.action_unknown', [], 'validators'));
  724.                         return $this->customJsonResponse->sendResponse();
  725.                     }
  726.                     $consultationId = (int)($request->get('id') ?? 0);
  727.                     $consultation $consultationId $this->vetoadomEntityManager->getRepository(Consultation::class)->findOneBy(['id' => $consultationId'active' => 1]) : null;
  728.                     if (
  729.                         !$consultation
  730.                         || $consultation->getAppelAnimal()->getAppel()->getSecteur()->getId() != $secteur->getId()
  731.                         || $consultation->getConsultationEtat()->getCode() == 'comptes_rendus_a_rediger'
  732.                     ) {
  733.                         $this->customJsonResponse->setForbidden(true);
  734.                         $this->customJsonResponse->setField('alert'$this->translator->trans('page_prise_appel_resume.consultation_unknown', [], 'validators'));
  735.                         return $this->customJsonResponse->sendResponse();
  736.                     }
  737.                     $validators = ['motifSuppression'];
  738.                     $consultation->setActive(0);
  739.                     $consultation->setDateSuppression(new \DateTime());
  740.                     $consultation->setUserSuppressionId($user->getId());
  741.                     $consultation->setMotifSuppression(trim($request->get('motifSuppression') ?? ''));
  742.                     # consultation validation
  743.                     $errors $this->validator->validate($consultation,null$validators);
  744.                     if ($errors->count()) {
  745.                         foreach ($errors as $key => $error) {
  746.                             $propertyPath "consultation-{$error->getPropertyPath()}";
  747.                             if (!$this->customJsonResponse->hasField($propertyPath)) {
  748.                                 $this->customJsonResponse->setField($propertyPath$error->getMessage());
  749.                             }
  750.                         }
  751.                     }
  752.                     if ($this->customJsonResponse->hasAnyField()) {
  753.                         $this->customJsonResponse->setForbidden(true);
  754.                         return $this->customJsonResponse->sendResponse();
  755.                     }
  756.                     # consultation = en_cours
  757.                     # free veterinaire
  758.                     if (
  759.                         $consultation->getConsultationEtat()->getId() == 3
  760.                         && $consultation->getVeterinaireIntervenantId()
  761.                         && $consultation->getPlanningJourId()
  762.                     ) {
  763.                         $userPositionLog $this->vetoadomEntityManager->getRepository(UserPositionLog::class)->findOneBy(
  764.                             [
  765.                                 'consultation' => $consultation,
  766.                                 'userId' => $consultation->getVeterinaireIntervenantId(),
  767.                                 'planningJourId' => $consultation->getPlanningJourId()
  768.                             ],
  769.                             ['id' => 'DESC']
  770.                         );
  771.                         if ($userPositionLog) {
  772.                             $this->vetoadomEntityManager->remove($userPositionLog);
  773.                         }
  774.                     }
  775.                     # message
  776.                     $message = new Message();
  777.                     $message->setAppel($consultation->getAppelAnimal()->getAppel());
  778.                     $message->setMessageEtat($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\MessageEtat'2));
  779.                     $message->setMessageOrigine($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\MessageOrigine'3));
  780.                     $message->setContenu(
  781.                         $this->translator->trans('page_prise_appel_resume.supprimer_message_contenu',
  782.                             [
  783.                                 '{{ dateDebut }}' => $consultation->getDebutConsultation()->format('d/m/Y'),
  784.                                 '{{ heureDebut }}' => $consultation->getDebutConsultation()->format('H:i'),
  785.                                 '{{ dateSuppression }}' => $consultation->getDateSuppression()->format('d/m/Y'),
  786.                                 '{{ heureSuppression }}' => $consultation->getDateSuppression()->format('H:i'),
  787.                                 '{{ motifAppel }}' => $consultation->getAppelAnimal()->getAppel()->getMotifAppel(),
  788.                                 '{{ motifSuppression }}' => $consultation->getMotifSuppression()
  789.                             ],
  790.                             'messages'
  791.                         )
  792.                     );
  793.                     $message->setReferant($consultation->getAppelAnimal()->getAppel()->getReferant());
  794.                     $message->setSecteur($secteur);
  795.                     $message->setSaisieUserId($user->getId());
  796.                     $message->setConsultation($consultation);
  797.                     $this->vetoadomEntityManager->persist($message);
  798.                     $this->vetoadomEntityManager->flush();
  799.                     # send email
  800.                     $emails $this->sendEmail->supprimerConsultation($consultation);
  801.                     $this->customJsonResponse->setField('message'$this->translator->trans('page_prise_appel.success_supprimer_consultation', ['{{emails}}' => $emails], 'messages'));
  802.                     $this->customJsonResponse->setField('consultations'$this->priseAppelHelper->getResumeConsultations($secteur));
  803.                     return $this->customJsonResponse->sendResponse();
  804.                 }
  805.                 break;
  806.             case 'saveConsultationETA':
  807.                 {
  808.                     $consultationId = (int)($request->get('id') ?? 0);
  809.                     $consultation $consultationId $this->vetoadomEntityManager->getRepository(Consultation::class)->findOneBy(['id' => $consultationId'active' => 1]) : null;
  810.                     if (
  811.                         !$consultation
  812.                         || $consultation->getAppelAnimal()->getAppel()->getSecteur()->getId() != $secteur->getId()
  813.                         || $consultation->getConsultationEtat()->getCode() != 'en_attente'
  814.                     ) {
  815.                         $this->customJsonResponse->setForbidden(true);
  816.                         $this->customJsonResponse->setField('alert'$this->translator->trans('page_prise_appel_resume.consultation_unknown', [], 'validators'));
  817.                         return $this->customJsonResponse->sendResponse();
  818.                     }
  819.                     $veterinaireIntervenantId = (int)($request->get('veterinaireIntervenantId') ?? 0);
  820.                     if (!$veterinaireIntervenantId) {
  821.                         $this->customJsonResponse->setField('consultation-veterinaireIntervenantId'$this->translator->trans('common.blank', [], 'validators'));
  822.                     }
  823.                     else {
  824.                         $currentDateTime = new \DateTimeImmutable();
  825.                         // vets
  826.                         $siteIds = [];
  827.                         $siteIds[] = $secteur->getPlanning1Id();
  828.                         if ($secteur->getPlanning2Id()) {
  829.                             $siteIds[] = $secteur->getPlanning2Id();
  830.                         }
  831.                         $currentVets $this->planningEntityManager->getRepository(PlanningJour::class)->getCurrentVetsMapList($siteIds,$currentDateTime);
  832.                         if (($currentVetIndex array_search($veterinaireIntervenantId,array_column($currentVets,'userId'))) === false ) {
  833.                             $this->customJsonResponse->setField('consultation-veterinaireIntervenantId'$this->translator->trans('common.blank', [], 'validators'));
  834.                         }
  835.                         else {
  836.                             $consultation->setPlanningJourId($currentVets[$currentVetIndex]['planningJourId']);
  837.                         }
  838.                     }
  839.                     $dateEta = \DateTime::createFromFormat("!Y-m-d"$request->get('dateEta') ?? '');
  840.                     $heureEta = \DateTime::createFromFormat("!H:i"$request->get('heureEta') ?? '');
  841.                     if ($dateEta === false && $heureEta !== false) {
  842.                         $this->customJsonResponse->setField('consultation-dateEta'$this->translator->trans('common.blank', [], 'validators'));
  843.                     }
  844.                     if ($dateEta !== false && $heureEta === false) {
  845.                         $this->customJsonResponse->setField('consultation-heureEta'$this->translator->trans('common.blank', [], 'validators'));
  846.                     }
  847.                     if (
  848.                         $dateEta !== false
  849.                         && $heureEta !== false
  850.                     ) {
  851.                         $dateEta->setTime($heureEta->format('H'),$heureEta->format('i'));
  852.                         if ($dateEta < new \DateTime(date('Y-m-d H:i:00'))) {
  853.                             $this->customJsonResponse->setField('alert'$this->translator->trans('page_prise_appel_resume.date_eta_wrong', [], 'validators'));
  854.                         }
  855.                         $consultation->setDateEta($dateEta);
  856.                     }
  857.                     else {
  858.                         $consultation->setDateEta(null);
  859.                     }
  860.                     if ($this->customJsonResponse->hasAnyField()) {
  861.                         $this->customJsonResponse->setForbidden(true);
  862.                         return $this->customJsonResponse->sendResponse();
  863.                     }
  864.                     $consultation->setVeterinaireIntervenantId($veterinaireIntervenantId);
  865.                     $consultation->setConsultationEtat($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\ConsultationEtat',7));
  866.                     $consultationEtatHistorique = new ConsultationEtatHistorique();
  867.                     $consultationEtatHistorique->setConsultation($consultation);
  868.                     $consultationEtatHistorique->setConsultationEtat($consultation->getConsultationEtat());
  869.                     $consultationEtatHistorique->setSaisieUserId($user->getId());
  870.                     $this->vetoadomEntityManager->persist($consultationEtatHistorique);
  871.                     $this->vetoadomEntityManager->flush();
  872.                     $source $request->get('source') ?? 'resume';
  873.                     if ($source == 'resume') {
  874.                         $this->customJsonResponse->setField('consultations'$this->priseAppelHelper->getResumeConsultations($secteur));
  875.                     }
  876.                     else if ($source == 'map') {
  877.                         $this->customJsonResponse->setField('mapMarkers'$this->priseAppelHelper->getDomicileConsultationsMapMarkers($secteur));
  878.                     }
  879.                     return $this->customJsonResponse->sendResponse();
  880.                 }
  881.                 break;
  882.             case 'consultationEnAttente':
  883.                 {
  884.                     $consultationId = (int)($request->get('id') ?? 0);
  885.                     $consultation $consultationId $this->vetoadomEntityManager->getRepository(Consultation::class)->findOneBy(['id' => $consultationId'active' => 1]) : null;
  886.                     if (
  887.                         !$consultation
  888.                         || $consultation->getAppelAnimal()->getAppel()->getSecteur()->getId() != $secteur->getId()
  889.                         || $consultation->getConsultationEtat()->getCode() != 'transmises'
  890.                     ) {
  891.                         $this->customJsonResponse->setForbidden(true);
  892.                         $this->customJsonResponse->setField('alert'$this->translator->trans('page_prise_appel_resume.consultation_unknown', [], 'validators'));
  893.                         return $this->customJsonResponse->sendResponse();
  894.                     }
  895.                     $consultation->setConsultationEtat($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\ConsultationEtat',6));
  896.                     $consultationEtatHistorique = new ConsultationEtatHistorique();
  897.                     $consultationEtatHistorique->setConsultation($consultation);
  898.                     $consultationEtatHistorique->setConsultationEtat($consultation->getConsultationEtat());
  899.                     $consultationEtatHistorique->setSaisieUserId($user->getId());
  900.                     $this->vetoadomEntityManager->persist($consultationEtatHistorique);
  901.                     $this->vetoadomEntityManager->flush();
  902.                     $this->customJsonResponse->setField('consultations'$this->priseAppelHelper->getResumeConsultations($secteur));
  903.                     return $this->customJsonResponse->sendResponse();
  904.                 }
  905.                 break;
  906.             case 'consultationEnCours':
  907.                 {
  908.                     $consultationId = (int)($request->get('id') ?? 0);
  909.                     $consultation $consultationId $this->vetoadomEntityManager->getRepository(Consultation::class)->findOneBy(['id' => $consultationId'active' => 1]) : null;
  910.                     if (
  911.                         !$consultation
  912.                         || $consultation->getAppelAnimal()->getAppel()->getSecteur()->getId() != $secteur->getId()
  913.                         || !in_array($consultation->getConsultationEtat()->getCode(),['transmises','patients_hospitalises'])
  914.                     ) {
  915.                         $this->customJsonResponse->setForbidden(true);
  916.                         $this->customJsonResponse->setField('alert'$this->translator->trans('page_prise_appel_resume.consultation_unknown', [], 'validators'));
  917.                         return $this->customJsonResponse->sendResponse();
  918.                     }
  919.                     if (
  920.                         $consultation->getAppelAnimal()->getAppel()->getSecteur()->getFonctionnement()->getCode() == 'domicile'
  921.                         && $consultation->getConsultationEtat()->getCode() == 'transmises'
  922.                     ) {
  923.                         $userPositionLog = new UserPositionLog();
  924.                         $userPositionLog->setConsultation($consultation);
  925.                         $userPositionLog->setUserId($consultation->getVeterinaireIntervenantId());
  926.                         $userPositionLog->setPlanningJourId($consultation->getPlanningJourId());
  927.                         $userPositionLog->setUserPositionLogEtat($this->vetoadomEntityManager->getRepository(UserPositionLogEtat::class)->findOneBy(['id' => 2]));
  928.                         $userPositionLog->setVille($consultation->getAppelAnimal()->getAppel()->getClient()->getVille());
  929.                         $this->vetoadomEntityManager->persist($userPositionLog);
  930.                     }
  931.                     $consultation->setConsultationEtat($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\ConsultationEtat',3));
  932.                     $consultationEtatHistorique = new ConsultationEtatHistorique();
  933.                     $consultationEtatHistorique->setConsultation($consultation);
  934.                     $consultationEtatHistorique->setConsultationEtat($consultation->getConsultationEtat());
  935.                     $consultationEtatHistorique->setSaisieUserId($user->getId());
  936.                     $this->vetoadomEntityManager->persist($consultationEtatHistorique);
  937.                     $this->vetoadomEntityManager->flush();
  938.                     $this->customJsonResponse->setField('consultations'$this->priseAppelHelper->getResumeConsultations($secteur));
  939.                     return $this->customJsonResponse->sendResponse();
  940.                 }
  941.                 break;
  942.             case 'consultationTransmises':
  943.                 {
  944.                     $consultationId = (int)($request->get('id') ?? 0);
  945.                     $consultation $consultationId $this->vetoadomEntityManager->getRepository(Consultation::class)->findOneBy(['id' => $consultationId'active' => 1]) : null;
  946.                     if (
  947.                         !$consultation
  948.                         || $consultation->getAppelAnimal()->getAppel()->getSecteur()->getId() != $secteur->getId()
  949.                         || $consultation->getConsultationEtat()->getCode() != 'en_cours'
  950.                     ) {
  951.                         $this->customJsonResponse->setForbidden(true);
  952.                         $this->customJsonResponse->setField('alert'$this->translator->trans('page_prise_appel_resume.consultation_unknown', [], 'validators'));
  953.                         return $this->customJsonResponse->sendResponse();
  954.                     }
  955.                     if ($consultation->getAppelAnimal()->getAppel()->getSecteur()->getFonctionnement()->getCode() == 'domicile') {
  956.                         $userPositionLog $this->vetoadomEntityManager->getRepository(UserPositionLog::class)->findOneBy(['consultation' => $consultation'userId' => $consultation->getVeterinaireIntervenantId()]);
  957.                         if ($userPositionLog) {
  958.                             $this->vetoadomEntityManager->remove($userPositionLog);
  959.                         }
  960.                     }
  961.                     $consultation->setConsultationEtat($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\ConsultationEtat',7));
  962.                     $consultationEtatHistorique = new ConsultationEtatHistorique();
  963.                     $consultationEtatHistorique->setConsultation($consultation);
  964.                     $consultationEtatHistorique->setConsultationEtat($consultation->getConsultationEtat());
  965.                     $consultationEtatHistorique->setSaisieUserId($user->getId());
  966.                     $this->vetoadomEntityManager->persist($consultationEtatHistorique);
  967.                     $this->vetoadomEntityManager->flush();
  968.                     $this->customJsonResponse->setField('consultations'$this->priseAppelHelper->getResumeConsultations($secteur));
  969.                     return $this->customJsonResponse->sendResponse();
  970.                 }
  971.                 break;
  972.             case 'consultationComptesRendusARediger':
  973.                 {
  974.                     $consultationId = (int)($request->get('id') ?? 0);
  975.                     $consultation $consultationId $this->vetoadomEntityManager->getRepository(Consultation::class)->findOneBy(['id' => $consultationId'active' => 1]) : null;
  976.                     if (
  977.                         !$consultation
  978.                         || $consultation->getAppelAnimal()->getAppel()->getSecteur()->getId() != $secteur->getId()
  979.                         || !in_array($consultation->getConsultationEtat()->getCode(),['en_cours','patients_hospitalises'])
  980.                     ) {
  981.                         $this->customJsonResponse->setForbidden(true);
  982.                         $this->customJsonResponse->setField('alert'$this->translator->trans('page_prise_appel_resume.consultation_unknown', [], 'validators'));
  983.                         return $this->customJsonResponse->sendResponse();
  984.                     }
  985.                     if (
  986.                         $consultation->getAppelAnimal()->getAppel()->getSecteur()->getFonctionnement()->getCode() == 'domicile'
  987.                         && $consultation->getConsultationEtat()->getCode() == 'en_cours'
  988.                     ) {
  989.                         $userPositionLog = new UserPositionLog();
  990.                         $userPositionLog->setConsultation($consultation);
  991.                         $userPositionLog->setUserId($consultation->getVeterinaireIntervenantId());
  992.                         $userPositionLog->setPlanningJourId($consultation->getPlanningJourId());
  993.                         $userPositionLog->setUserPositionLogEtat($this->vetoadomEntityManager->getRepository(UserPositionLogEtat::class)->findOneBy(['id' => 3]));
  994.                         $userPositionLog->setVille($consultation->getAppelAnimal()->getAppel()->getClient()->getVille());
  995.                         $this->vetoadomEntityManager->persist($userPositionLog);
  996.                     }
  997.                     $consultation->setConsultationEtat($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\ConsultationEtat',5));
  998.                     $consultationEtatHistorique = new ConsultationEtatHistorique();
  999.                     $consultationEtatHistorique->setConsultation($consultation);
  1000.                     $consultationEtatHistorique->setConsultationEtat($consultation->getConsultationEtat());
  1001.                     $consultationEtatHistorique->setSaisieUserId($user->getId());
  1002.                     $this->vetoadomEntityManager->persist($consultationEtatHistorique);
  1003.                     $this->vetoadomEntityManager->flush();
  1004.                     $this->customJsonResponse->setField('consultations'$this->priseAppelHelper->getResumeConsultations($secteur));
  1005.                     return $this->customJsonResponse->sendResponse();
  1006.                 }
  1007.                 break;
  1008.             case 'saveConsultationNiveauUrgence':
  1009.                 {
  1010.                     $consultationId = (int)($request->get('id') ?? 0);
  1011.                     $consultation $consultationId $this->vetoadomEntityManager->getRepository(Consultation::class)->findOneBy(['id' => $consultationId'active' => 1]) : null;
  1012.                     if (
  1013.                         !$consultation
  1014.                         || $consultation->getAppelAnimal()->getAppel()->getSecteur()->getId() != $secteur->getId()
  1015.                         || $consultation->getConsultationEtat()->getCode() != 'en_route'
  1016.                     ) {
  1017.                         $this->customJsonResponse->setForbidden(true);
  1018.                         $this->customJsonResponse->setField('alert'$this->translator->trans('page_prise_appel_resume.consultation_unknown', [], 'validators'));
  1019.                         return $this->customJsonResponse->sendResponse();
  1020.                     }
  1021.                     $validators = ['consultationNiveauUrgence'];
  1022.                     $consultationNiveauUrgenceId = (int)($request->get('consultationNiveauUrgenceId') ?? 0);
  1023.                     $consultationNiveauUrgence $consultationNiveauUrgenceId $this->vetoadomEntityManager->getRepository(ConsultationNiveauUrgence::class)->findOneBy(['id' => $consultationNiveauUrgenceId]) : null;
  1024.                     $consultation->setConsultationNiveauUrgence($consultationNiveauUrgence);
  1025.                     # consultation validation
  1026.                     $errors $this->validator->validate($consultation,null$validators);
  1027.                     if ($errors->count()) {
  1028.                         foreach ($errors as $key => $error) {
  1029.                             $propertyPath "consultation-{$error->getPropertyPath()}";
  1030.                             if (!$this->customJsonResponse->hasField($propertyPath)) {
  1031.                                 $this->customJsonResponse->setField($propertyPath$error->getMessage());
  1032.                             }
  1033.                         }
  1034.                     }
  1035.                     if ($this->customJsonResponse->hasAnyField()) {
  1036.                         $this->customJsonResponse->setForbidden(true);
  1037.                         return $this->customJsonResponse->sendResponse();
  1038.                     }
  1039.                     $consultation->setConsultationEtat($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\ConsultationEtat',2));
  1040.                     $consultationEtatHistorique = new ConsultationEtatHistorique();
  1041.                     $consultationEtatHistorique->setConsultation($consultation);
  1042.                     $consultationEtatHistorique->setConsultationEtat($consultation->getConsultationEtat());
  1043.                     $consultationEtatHistorique->setSaisieUserId($user->getId());
  1044.                     $this->vetoadomEntityManager->persist($consultationEtatHistorique);
  1045.                     $this->vetoadomEntityManager->flush();
  1046.                     $this->customJsonResponse->setField('consultations'$this->priseAppelHelper->getResumeConsultations($secteur));
  1047.                     return $this->customJsonResponse->sendResponse();
  1048.                 }
  1049.                 break;
  1050.             case 'consultationEnRoute':
  1051.                 {
  1052.                     $consultationId = (int)($request->get('id') ?? 0);
  1053.                     $consultation $consultationId $this->vetoadomEntityManager->getRepository(Consultation::class)->findOneBy(['id' => $consultationId'active' => 1]) : null;
  1054.                     if (
  1055.                         !$consultation
  1056.                         || $consultation->getAppelAnimal()->getAppel()->getSecteur()->getId() != $secteur->getId()
  1057.                         || $consultation->getConsultationEtat()->getCode() != 'salle_d_attente'
  1058.                     ) {
  1059.                         $this->customJsonResponse->setForbidden(true);
  1060.                         $this->customJsonResponse->setField('alert'$this->translator->trans('page_prise_appel_resume.consultation_unknown', [], 'validators'));
  1061.                         return $this->customJsonResponse->sendResponse();
  1062.                     }
  1063.                     $consultation->setConsultationEtat($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\ConsultationEtat',1));
  1064.                     $consultationEtatHistorique = new ConsultationEtatHistorique();
  1065.                     $consultationEtatHistorique->setConsultation($consultation);
  1066.                     $consultationEtatHistorique->setConsultationEtat($consultation->getConsultationEtat());
  1067.                     $consultationEtatHistorique->setSaisieUserId($user->getId());
  1068.                     $this->vetoadomEntityManager->persist($consultationEtatHistorique);
  1069.                     $this->vetoadomEntityManager->flush();
  1070.                     $this->customJsonResponse->setField('consultations'$this->priseAppelHelper->getResumeConsultations($secteur));
  1071.                     return $this->customJsonResponse->sendResponse();
  1072.                 }
  1073.                 break;
  1074.             case 'saveConsultationEnCoursClinique':
  1075.                 {
  1076.                     $consultationId = (int)($request->get('id') ?? 0);
  1077.                     $consultation $consultationId $this->vetoadomEntityManager->getRepository(Consultation::class)->findOneBy(['id' => $consultationId'active' => 1]) : null;
  1078.                     if (
  1079.                         !$consultation
  1080.                         || $consultation->getAppelAnimal()->getAppel()->getSecteur()->getId() != $secteur->getId()
  1081.                         || $consultation->getConsultationEtat()->getCode() != 'salle_d_attente'
  1082.                     ) {
  1083.                         $this->customJsonResponse->setForbidden(true);
  1084.                         $this->customJsonResponse->setField('alert'$this->translator->trans('page_prise_appel_resume.consultation_unknown', [], 'validators'));
  1085.                         return $this->customJsonResponse->sendResponse();
  1086.                     }
  1087.                     $veterinaireIntervenantId = (int)($request->get('veterinaireIntervenantId') ?? 0);
  1088.                     if (!$veterinaireIntervenantId) {
  1089.                         $this->customJsonResponse->setField('consultation-veterinaireIntervenantId'$this->translator->trans('common.blank', [], 'validators'));
  1090.                     }
  1091.                     if ($this->customJsonResponse->hasAnyField()) {
  1092.                         $this->customJsonResponse->setForbidden(true);
  1093.                         return $this->customJsonResponse->sendResponse();
  1094.                     }
  1095.                     $consultation->setVeterinaireIntervenantId($veterinaireIntervenantId);
  1096.                     $consultation->setConsultationEtat($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\ConsultationEtat',3));
  1097.                     $consultationEtatHistorique = new ConsultationEtatHistorique();
  1098.                     $consultationEtatHistorique->setConsultation($consultation);
  1099.                     $consultationEtatHistorique->setConsultationEtat($consultation->getConsultationEtat());
  1100.                     $consultationEtatHistorique->setSaisieUserId($user->getId());
  1101.                     $this->vetoadomEntityManager->persist($consultationEtatHistorique);
  1102.                     $this->vetoadomEntityManager->flush();
  1103.                     $this->customJsonResponse->setField('consultations'$this->priseAppelHelper->getResumeConsultations($secteur));
  1104.                     return $this->customJsonResponse->sendResponse();
  1105.                 }
  1106.                 break;
  1107.             case 'consultationSalleDAttente':
  1108.                 {
  1109.                     $consultationId = (int)($request->get('id') ?? 0);
  1110.                     $consultation $consultationId $this->vetoadomEntityManager->getRepository(Consultation::class)->findOneBy(['id' => $consultationId'active' => 1]) : null;
  1111.                     if (
  1112.                         !$consultation
  1113.                         || $consultation->getAppelAnimal()->getAppel()->getSecteur()->getId() != $secteur->getId()
  1114.                         || $consultation->getConsultationEtat()->getCode() != 'en_cours'
  1115.                     ) {
  1116.                         $this->customJsonResponse->setForbidden(true);
  1117.                         $this->customJsonResponse->setField('alert'$this->translator->trans('page_prise_appel_resume.consultation_unknown', [], 'validators'));
  1118.                         return $this->customJsonResponse->sendResponse();
  1119.                     }
  1120.                     $consultation->setConsultationEtat($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\ConsultationEtat',2));
  1121.                     $consultationEtatHistorique = new ConsultationEtatHistorique();
  1122.                     $consultationEtatHistorique->setConsultation($consultation);
  1123.                     $consultationEtatHistorique->setConsultationEtat($consultation->getConsultationEtat());
  1124.                     $consultationEtatHistorique->setSaisieUserId($user->getId());
  1125.                     $this->vetoadomEntityManager->persist($consultationEtatHistorique);
  1126.                     $this->vetoadomEntityManager->flush();
  1127.                     $this->customJsonResponse->setField('consultations'$this->priseAppelHelper->getResumeConsultations($secteur));
  1128.                     return $this->customJsonResponse->sendResponse();
  1129.                 }
  1130.                 break;
  1131.             case 'saveConsultationEnCoursCliniqueNextEtat':
  1132.                 {
  1133.                     $consultationId = (int)($request->get('id') ?? 0);
  1134.                     $consultation $consultationId $this->vetoadomEntityManager->getRepository(Consultation::class)->findOneBy(['id' => $consultationId'active' => 1]) : null;
  1135.                     if (
  1136.                         !$consultation
  1137.                         || $consultation->getAppelAnimal()->getAppel()->getSecteur()->getId() != $secteur->getId()
  1138.                         || $consultation->getConsultationEtat()->getCode() != 'en_cours'
  1139.                     ) {
  1140.                         $this->customJsonResponse->setForbidden(true);
  1141.                         $this->customJsonResponse->setField('alert'$this->translator->trans('page_prise_appel_resume.consultation_unknown', [], 'validators'));
  1142.                         return $this->customJsonResponse->sendResponse();
  1143.                     }
  1144.                     $consultationEtatId = (int)($request->get('nextEtat') ?? 0);
  1145.                     if (!in_array($consultationEtatId,[4,5])) {
  1146.                         $this->customJsonResponse->setForbidden(true);
  1147.                         $this->customJsonResponse->setField('consultation-consultationEtat'$this->translator->trans('common.blank', [], 'validators'));
  1148.                         return $this->customJsonResponse->sendResponse();
  1149.                     }
  1150.                     $consultation->setConsultationEtat($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\ConsultationEtat',$consultationEtatId));
  1151.                     $consultationEtatHistorique = new ConsultationEtatHistorique();
  1152.                     $consultationEtatHistorique->setConsultation($consultation);
  1153.                     $consultationEtatHistorique->setConsultationEtat($consultation->getConsultationEtat());
  1154.                     $consultationEtatHistorique->setSaisieUserId($user->getId());
  1155.                     $this->vetoadomEntityManager->persist($consultationEtatHistorique);
  1156.                     $this->vetoadomEntityManager->flush();
  1157.                     $this->customJsonResponse->setField('consultations'$this->priseAppelHelper->getResumeConsultations($secteur));
  1158.                     return $this->customJsonResponse->sendResponse();
  1159.                 }
  1160.                 break;
  1161.             case 'getConsultationDemandeDeNouvelles':
  1162.             case 'saveConsultationDemandeDeNouvelles':
  1163.                 {
  1164.                     $consultationId = (int)($request->get('id') ?? 0);
  1165.                     $consultation $consultationId $this->vetoadomEntityManager->getRepository(Consultation::class)->findOneBy(['id' => $consultationId'active' => 1]) : null;
  1166.                     if (
  1167.                         !$consultation
  1168.                         || $consultation->getAppelAnimal()->getAppel()->getSecteur()->getId() != $secteur->getId()
  1169.                         || $consultation->getAppelAnimal()->getAppel()->getSecteur()->getFonctionnement()->getCode() != 'clinique'
  1170.                         || !in_array($consultation->getConsultationEtat()->getCode(),['en_cours','patients_hospitalises'])
  1171.                     ) {
  1172.                         $this->customJsonResponse->setForbidden(true);
  1173.                         $this->customJsonResponse->setField('alert'$this->translator->trans('page_prise_appel_resume.consultation_unknown', [], 'validators'));
  1174.                         return $this->customJsonResponse->sendResponse();
  1175.                     }
  1176.                     if ($action == 'getConsultationDemandeDeNouvelles') {
  1177.                         $this->customJsonResponse->setField('consultationDemandeDeNouvelles'$this->vetoadomEntityManager->getRepository(Consultation::class)->getConsultationDemandeDeNouvelles($consultationId));
  1178.                         return $this->customJsonResponse->sendResponse();
  1179.                     }
  1180.                     # saveConsultationDemandeDeNouvelles
  1181.                     foreach ($this->vetoadomEntityManager->getRepository(Consultation::class)->getConsultationDemandeDeNouvelles($consultationId) as $item) {
  1182.                         $appel $this->vetoadomEntityManager->getRepository(Appel::class)->find($item['appelId']);
  1183.                         $appel->setDemandeDeNouvelleFaite(1);
  1184.                     }
  1185.                     $this->vetoadomEntityManager->flush();
  1186.                     $this->customJsonResponse->setField('consultations'$this->priseAppelHelper->getResumeConsultations($secteur));
  1187.                     return $this->customJsonResponse->sendResponse();
  1188.                 }
  1189.                 break;
  1190.             case 'sendEmailReferant':
  1191.                 {
  1192.                     $referantId = (int)($request->get('referant') ?? 0);
  1193.                     $referant $referantId $this->vetoadomEntityManager->getRepository(Referant::class)->findOneBy(['id' => $referantId]) : null;
  1194.                     if (!$referant) {
  1195.                         $this->customJsonResponse->setForbidden(true);
  1196.                         $this->customJsonResponse->setField('referant'$this->translator->trans('common.blank', [], 'validators'));
  1197.                         return $this->customJsonResponse->sendResponse();
  1198.                     }
  1199.                     $body nl2br((string)($request->get('message') ?? ''));
  1200.                     if ($body === '') {
  1201.                         $this->customJsonResponse->setForbidden(true);
  1202.                         $this->customJsonResponse->setField('referantTexteEmail'$this->translator->trans('common.blank', [], 'validators'));
  1203.                         return $this->customJsonResponse->sendResponse();
  1204.                     }
  1205.                     $subject $this->translator->trans('page_prise_appel_referant.subject', ['{{secteruNomShort}}' => $secteur->getNomShort()], 'messages');
  1206.                     $this->sendEmail->emailReferant($secteur,$referant,$subject,$body);
  1207.                     # message
  1208.                     $message = new Message();
  1209.                     $message->setMessageEtat($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\MessageEtat'3));
  1210.                     $message->setMessageOrigine($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\MessageOrigine'4));
  1211.                     $message->setContenu($body);
  1212.                     $message->setReferant($referant);
  1213.                     $message->setSecteur($secteur);
  1214.                     $message->setSaisieUserId($user->getId());
  1215.                     $this->vetoadomEntityManager->persist($message);
  1216.                     $this->vetoadomEntityManager->flush();
  1217.                     return $this->customJsonResponse->sendResponse();
  1218.                 }
  1219.                 break;
  1220.             case 'envoyerUnMessageSansRegulation':
  1221.             case 'demandeDeRenseignement':
  1222.             case 'validerLaConsultation':
  1223.             case 'demandeDeNouvelles':
  1224.                 {
  1225.                     # check for exist secteurConsigne with type stop_consultation
  1226.                     if ($action == 'validerLaConsultation') {
  1227.                         $stopConsultationConfirmed = (bool)$request->get('stopConsultationConfirmed');
  1228.                         if (
  1229.                             !$stopConsultationConfirmed
  1230.                             && count($this->vetoadomEntityManager->getRepository(SecteurConsigne::class)->checkSecteurStopConsultation($secteur->getId()))
  1231.                         ) {
  1232.                             $this->customJsonResponse->setForbidden(true);
  1233.                             $this->customJsonResponse->setField('stopConsultationConfirm'$this->translator->trans('page_prise_appel.appel_valider_secteur_consigne_stop_consultation', [], 'validators'));
  1234.                             return $this->customJsonResponse->sendResponse();
  1235.                         }
  1236.                     }
  1237.                     // client
  1238.                     $validators = ['nom','telephone1','telephone2','ville'];
  1239.                     $appelData $request->get('appel') ?? [];
  1240.                     if (!is_array($appelData)) $appelData = [];
  1241.                     $clientData $request->get('client') ?? [];
  1242.                     if (!is_array($clientData)) $clientData = [];
  1243.                     $clientId = (int)($clientData['id'] ?? 0);
  1244.                     $client $clientId $this->vetoadomEntityManager->getRepository(Client::class)->findOneBy(['id' => $clientData['id'], 'active' => 1]) : new Client();
  1245.                     if ($clientId && !$client) {
  1246.                         $this->customJsonResponse->setForbidden(true);
  1247.                         $this->customJsonResponse->setField('alert'$this->translator->trans('page_prise_appel.client_unknown', [], 'validators'));
  1248.                         return $this->customJsonResponse->sendResponse();
  1249.                     }
  1250.                     $client->setNom($this->misc->toUpper($clientData['nom'] ?? ''));
  1251.                     $client->setEmail($this->misc->toLower($clientData['email'] ?? ''));
  1252.                     if ($client->getEmail() !== null) {
  1253.                         $validators[] = 'email';
  1254.                     }
  1255.                     $client->setTelephone1(trim($clientData['telephone1'] ?? ''));
  1256.                     $client->setTelephone2(trim($clientData['telephone2'] ?? ''));
  1257.                     $villeId = (int)($clientData['ville'] ?? 0);
  1258.                     $ville $villeId $this->vetoadomEntityManager->getRepository(Ville::class)->findOneBy(['id' => $villeId]) : null;
  1259.                     $client->setVille($ville);
  1260.                     if ($secteur->getFonctionnement()->getCode() == 'domicile') {
  1261.                         $validators array_merge($validators,['interphone','code','batiment','ascenseur','escalier','etage','appartement','informationsComplementaires']);
  1262.                         $client->setAdresse($this->misc->toUpper($clientData['adresse'] ?? ''));
  1263.                         $client->setComplementAdresse($this->misc->toUpper($clientData['complementAdresse'] ?? ''));
  1264.                         if ($action == 'validerLaConsultation') {
  1265.                             $validators array_merge($validators,['adresse','complementAdresse','habitation']);
  1266.                         }
  1267.                         else {
  1268.                             if ($client->getAdresse() !== null) {
  1269.                                 $validators[] = 'adresse';
  1270.                             }
  1271.                             if ($client->getComplementAdresse() !== null) {
  1272.                                 $validators[] = 'complementAdresse';
  1273.                             }
  1274.                         }
  1275.                         $client->setInterphone(trim($clientData['interphone'] ?? ''));
  1276.                         $client->setCode(trim($clientData['code'] ?? ''));
  1277.                         $client->setBatiment(trim($clientData['batiment'] ?? ''));
  1278.                         $client->setAscenseur(trim($clientData['ascenseur'] ?? ''));
  1279.                         $client->setEscalier(trim($clientData['escalier'] ?? ''));
  1280.                         $client->setEtage(trim($clientData['etage'] ?? ''));
  1281.                         $client->setAppartement(trim($clientData['appartement'] ?? ''));
  1282.                         $client->setInformationsComplementaires(trim($clientData['informationsComplementaires'] ?? ''));
  1283.                         $habitationId = (int)($clientData['habitation'] ?? 0);
  1284.                         $habitation $habitationId $this->vetoadomEntityManager->getRepository(Habitation::class)->findOneBy(['id' => $habitationId]) : null;
  1285.                         $client->setHabitation($habitation);
  1286.                     }
  1287.                     $referantId = (int)($appelData['referantId'] ?? 0);
  1288.                     $referant $referantId $this->vetoadomEntityManager->getRepository(Referant::class)->findOneBy(['id' => $referantId]) : null;
  1289.                     if (!$client->getId()) {
  1290.                         $client->setReferant($referant);
  1291.                         # add clientSite
  1292.                         $clientSite = new ClientSite();
  1293.                         $clientSite->setClient($client);
  1294.                         $clientSite->setSiteId($secteur->getSiteId());
  1295.                         $this->vetoadomEntityManager->persist($clientSite);
  1296.                     }
  1297.                     else {
  1298.                         # add clientSite if not exist for this siteId
  1299.                         $clientSite $this->vetoadomEntityManager->getRepository(ClientSite::class)->findOneBy(['client' => $client'siteId' => $secteur->getSiteId()]);
  1300.                         if (!$clientSite) {
  1301.                             $clientSite = new ClientSite();
  1302.                             $clientSite->setClient($client);
  1303.                             $clientSite->setSiteId($secteur->getSiteId());
  1304.                             $this->vetoadomEntityManager->persist($clientSite);
  1305.                         }
  1306.                     }
  1307.                     # client validation
  1308.                     $errors $this->validator->validate($client,null$validators);
  1309.                     if ($errors->count()) {
  1310.                         foreach ($errors as $key => $error) {
  1311.                             $propertyPath "client-{$error->getPropertyPath()}";
  1312.                             if (!$this->customJsonResponse->hasField($propertyPath)) {
  1313.                                 $this->customJsonResponse->setField($propertyPath$error->getMessage());
  1314.                             }
  1315.                         }
  1316.                     }
  1317.                     else if (!$client->getId()) {
  1318.                         $this->vetoadomEntityManager->persist($client);
  1319.                     }
  1320.                     if ($this->customJsonResponse->hasAnyField()) {
  1321.                         $this->customJsonResponse->setForbidden(true);
  1322.                         return $this->customJsonResponse->sendResponse();
  1323.                     }
  1324.                     # set ville coordinates
  1325.                     $client->setVille($this->APIlocation->setVilleCoordinates($client->getVille()));
  1326.                     # animals
  1327.                     $animals $clientData['animals'] ?? [];
  1328.                     if (!is_array($animals)) $animals = [];
  1329.                     if (!$animals) {
  1330.                         $this->customJsonResponse->setForbidden(true);
  1331.                         $this->customJsonResponse->setField("alert"$this->translator->trans('page_prise_appel.animals_empty', [], 'validators'));
  1332.                         return $this->customJsonResponse->sendResponse();
  1333.                     }
  1334.                     $animalsForAppel = [];
  1335.                     foreach ($animals as $animalIndex => $animalData) {
  1336.                         $animalId = (int)($animalData['id']) ?? 0;
  1337.                         $animal $animalId $this->vetoadomEntityManager->getRepository(Animal::class)->findOneBy([
  1338.                             'id' => $animalId,
  1339.                             'client' => $client,
  1340.                             'active' => 1
  1341.                         ]) : new Animal();
  1342.                         if ($animalId && !$animal) {
  1343.                             $this->customJsonResponse->setForbidden(true);
  1344.                             $this->customJsonResponse->setField("animal-nom-{$animalIndex}"$this->translator->trans('page_prise_appel.animal_unknown', [], 'validators'));
  1345.                             return $this->customJsonResponse->sendResponse();
  1346.                         }
  1347.                         $validators = ['nom','animalEspece','animalSexe','dateNaissance'];
  1348.                         $animal->setNom($this->misc->toUpper($animalData['nom'] ?? ''));
  1349.                         $animalEspeceId = (int)($animalData['animalEspece'] ?? 0);
  1350.                         $animalEspece $animalEspeceId $this->vetoadomEntityManager->getRepository(AnimalEspece::class)->findOneBy(['id' => $animalEspeceId]) : null;
  1351.                         $animal->setAnimalEspece($animalEspece);
  1352.                         $animalSexeId = (int)($animalData['animalSexe'] ?? 0);
  1353.                         $animalSexe $animalSexeId $this->vetoadomEntityManager->getRepository(AnimalSexe::class)->findOneBy(['id' => $animalSexeId]) : null;
  1354.                         $animal->setAnimalSexe($animalSexe);
  1355.                         $animalRaceId = (int)($animalData['animalRace'] ?? 0);
  1356.                         $animal->setAnimalRace(
  1357.                             $animalRaceId && $animal->getAnimalEspece()
  1358.                                 ? $this->vetoadomEntityManager->getRepository(AnimalRace::class)->findOneBy(['id' => $animalRaceId'animalEspece' => $animal->getAnimalEspece()])
  1359.                                 : null
  1360.                         );
  1361.                         if (
  1362.                             $animal->getAnimalRace()
  1363.                             && $animal->getAnimalRace()->getCode() == 'autre'
  1364.                         ) {
  1365.                             $validators[] = 'animalRaceAutreNom';
  1366.                             $animal->setAnimalRaceAutreNom($this->misc->toUpper($animalData['animalRaceAutreNom'] ?? ''));
  1367.                         }
  1368.                         else {
  1369.                             $animal->setAnimalRaceAutreNom(null);
  1370.                         }
  1371.                         if (($dateNaissance = \DateTime::createFromFormat("!Y-m-d"$animalData['dateNaissance'] ?? '')) !== false) {
  1372.                             $animal->setDateNaissance($dateNaissance);
  1373.                         }
  1374.                         else {
  1375.                             $animal->setDateNaissance(null);
  1376.                         }
  1377.                         if (!$animal->getDeces()) {
  1378.                             $animal->setDeces((bool)($animalData['deces'] ?? false));
  1379.                         }
  1380.                         if (
  1381.                             $action == 'validerLaConsultation'
  1382.                             &&
  1383.                             (
  1384.                                 ($animalData['euthanasie'] ?? false)
  1385.                                 || ($animalData['cremation'] ?? false)
  1386.                             )
  1387.                         ) {
  1388.                             if (!$secteur->hasSecteurCategoriePoidsEspeceById($animalData['categoriePoids'] ?? 0)) {
  1389.                                 $this->customJsonResponse->setField("animal-categoriePoids-{$animalIndex}"$this->translator->trans('common.blank', [], 'validators'));
  1390.                             }
  1391.                         }
  1392.                         # animal validation
  1393.                         $errors $this->validator->validate($animal,null$validators);
  1394.                         if ($errors->count()) {
  1395.                             foreach ($errors as $key => $error) {
  1396.                                 $propertyPath "animal-{$error->getPropertyPath()}-{$animalIndex}";
  1397.                                 if (!$this->customJsonResponse->hasField($propertyPath)) {
  1398.                                     $this->customJsonResponse->setField($propertyPath$error->getMessage());
  1399.                                 }
  1400.                             }
  1401.                         }
  1402.                         else if (!$animal->getId()) {
  1403.                             $animal->setClient($client);
  1404.                             $this->vetoadomEntityManager->persist($animal);
  1405.                             # add animalSite
  1406.                             $animalSite = new AnimalSite();
  1407.                             $animalSite->setAnimal($animal);
  1408.                             $animalSite->setSiteId($secteur->getSiteId());
  1409.                             $this->vetoadomEntityManager->persist($animalSite);
  1410.                         }
  1411.                         else {
  1412.                             # add animalSite if not exist for this siteId
  1413.                             $animalSite $this->vetoadomEntityManager->getRepository(AnimalSite::class)->findOneBy(['animal' => $animal'siteId' => $secteur->getSiteId()]);
  1414.                             if (!$animalSite) {
  1415.                                 $animalSite = new AnimalSite();
  1416.                                 $animalSite->setAnimal($animal);
  1417.                                 $animalSite->setSiteId($secteur->getSiteId());
  1418.                                 $this->vetoadomEntityManager->persist($animalSite);
  1419.                             }
  1420.                         }
  1421.                         $animalsForAppel[] = [
  1422.                             'animal' => $animal,
  1423.                             'animalData' => $animalData
  1424.                         ];
  1425.                     }
  1426.                     # appel
  1427.                     $appelTypeIdAction['envoyerUnMessageSansRegulation'] = 1;
  1428.                     $appelTypeIdAction['demandeDeRenseignement'] = 2;
  1429.                     $appelTypeIdAction['validerLaConsultation'] = 3;
  1430.                     $appelTypeIdAction['demandeDeNouvelles'] = 4;
  1431.                     $validators = ['referant','motifAppel','informationInterne'];
  1432.                     $appel = new Appel();
  1433.                     $appel->setSaisieUserId($user->getId());
  1434.                     $appel->setRegulateurId($request->get('regulateurId') ?? 0);
  1435.                     $appel->setSuperviseurId($request->get('superviseurId') ?? 0);
  1436.                     $appel->setAstreinteChirurgieId($request->get('astreinteChirurgieId'));
  1437.                     $appel->setVetcoachId($request->get('vetcoachId'));
  1438.                     $appel->setSecteur($secteur);
  1439.                     $appel->setClient($client);
  1440.                     $appel->setLangue($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\Langue',$request->get('langueId')));
  1441.                     $appel->setReferant($referant);
  1442.                     $appel->setAppelType($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\AppelType',$appelTypeIdAction[$action]));
  1443.                     $appel->setMotifAppel($appelData['motifAppel'] ?? '');
  1444.                     $appel->setInformationInterne($appelData['informationInterne'] ?? '');
  1445.                     if ($secteur->getFonctionnement()->getCode() == 'domicile') {
  1446.                         $appel->setVille($client->getVille());
  1447.                         $secteurZoneId = (int)($request->get('secteurZoneId') ?? 0);
  1448.                         $secteurZone $secteurZoneId $this->vetoadomEntityManager->getRepository(SecteurZone::class)->findOneBy(['id' => $secteurZoneId,'secteur' => $secteur]) : null;
  1449.                         $appel->setSecteurZone($secteurZone);
  1450.                         if (
  1451.                             !$appel->getSecteurZone()
  1452.                             && !$this->customJsonResponse->hasField('alert')
  1453.                         ) {
  1454.                             $this->customJsonResponse->setField('alert'$this->translator->trans('page_prise_appel_client.tarif_deplacement_secteur_zone_text_hors_du_perimetre_action_no_secteurs', [], 'messages'));
  1455.                         }
  1456.                     }
  1457.                     # appel validation
  1458.                     $errors $this->validator->validate($appel,null$validators);
  1459.                     if ($errors->count()) {
  1460.                         foreach ($errors as $key => $error) {
  1461.                             if (!$this->customJsonResponse->hasField($error->getPropertyPath())) {
  1462.                                 $this->customJsonResponse->setField($error->getPropertyPath(), $error->getMessage());
  1463.                             }
  1464.                         }
  1465.                     }
  1466.                     if ($this->customJsonResponse->hasAnyField()) {
  1467.                         $this->customJsonResponse->setForbidden(true);
  1468.                         return $this->customJsonResponse->sendResponse();
  1469.                     }
  1470.                     $this->vetoadomEntityManager->persist($appel);
  1471.                     $appelAnimals = [];
  1472.                     foreach ($animalsForAppel as $item) {
  1473.                         $appelAnimal = new AppelAnimal();
  1474.                         $appelAnimal->setAppel($appel);
  1475.                         $appelAnimal->setAnimal($item['animal']);
  1476.                         if (
  1477.                             $action == 'validerLaConsultation'
  1478.                             &&
  1479.                             (
  1480.                                 ($item['animalData']['euthanasie'] ?? false)
  1481.                                 || ($item['animalData']['cremation'] ?? false)
  1482.                             )
  1483.                         ) {
  1484.                             $appelAnimal->setSecteurCategoriePoidsEspece($secteur->getSecteurCategoriePoidsEspeceById($item['animalData']['categoriePoids']));
  1485.                         }
  1486.                         $this->vetoadomEntityManager->persist($appelAnimal);
  1487.                         $appelAnimals[] = $appelAnimal;
  1488.                     }
  1489.                     # envoyerUnMessageSansRegulation
  1490.                     if ($action == 'envoyerUnMessageSansRegulation') {
  1491.                         # message
  1492.                         $message = new Message();
  1493.                         $message->setAppel($appel);
  1494.                         $message->setMessageEtat($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\MessageEtat'2));
  1495.                         $message->setMessageOrigine($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\MessageOrigine'2));
  1496.                         $message->setContenu($appel->getMotifAppel());
  1497.                         $message->setReferant($appel->getReferant());
  1498.                         $message->setSecteur($secteur);
  1499.                         $message->setSaisieUserId($user->getId());
  1500.                         $this->vetoadomEntityManager->persist($message);
  1501.                         $this->vetoadomEntityManager->flush();
  1502.                         # send email to referant
  1503.                         $emails $this->sendEmail->emailReferantSansRegulation($appel);
  1504.                         $message $this->translator->trans('page_prise_appel.success_envoyer_un_message_sans_regulation', ['{{emails}}' => $emails], 'messages');
  1505.                         # send email to clinique referant
  1506.                         if ($secteur->getFonctionnement()->getCode() == 'domicile') {
  1507.                             $consultationRefereeCliniqueId = (int)($request->get('consultationRefereeCliniqueId') ?? 0);
  1508.                             $referant $consultationRefereeCliniqueId $this->vetoadomEntityManager->getRepository(Referant::class)->findOneBy(['id' => $consultationRefereeCliniqueId]) : null;
  1509.                             if ($referant) {
  1510.                                 $appel->setReferant($referant);
  1511.                                 $emails $this->sendEmail->emailReferantSansRegulationClinique($appel);
  1512.                                 $message .= '<br>'.$this->translator->trans('page_prise_appel.success_envoyer_un_message_sans_regulation', ['{{emails}}' => $emails], 'messages');
  1513.                             }
  1514.                         }
  1515.                         $this->customJsonResponse->setField('message'$message);
  1516.                         $this->customJsonResponse->setRedirect($this->urlGenerator->generate('app_dashboard'));
  1517.                         return $this->customJsonResponse->sendResponse();
  1518.                     }
  1519.                     # demandeDeRenseignement
  1520.                     if ($action == 'demandeDeRenseignement') {
  1521.                         # message
  1522.                         $message = new Message();
  1523.                         $message->setAppel($appel);
  1524.                         $message->setMessageEtat($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\MessageEtat'1));
  1525.                         $message->setMessageOrigine($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\MessageOrigine'1));
  1526.                         $message->setContenu($appel->getMotifAppel());
  1527.                         $message->setReferant($appel->getReferant());
  1528.                         $message->setSecteur($secteur);
  1529.                         $message->setSaisieUserId($user->getId());
  1530.                         $this->vetoadomEntityManager->persist($message);
  1531.                         $this->vetoadomEntityManager->flush();
  1532.                         # send email
  1533.                         $emails $this->sendEmail->demandeDeRenseignement($appel);
  1534.                         $this->customJsonResponse->setField('message'$this->translator->trans('page_prise_appel.success_demande_de_renseignement', ['{{emails}}' => $emails], 'messages'));
  1535.                         $this->customJsonResponse->setRedirect($this->urlGenerator->generate('app_prise_appel',['secteurId' => $secteur->getId(),'tab' => 'messages']));
  1536.                         return $this->customJsonResponse->sendResponse();
  1537.                     }
  1538.                     if ($action == 'validerLaConsultation') {
  1539.                         # check that secteur has configured parameters for SMS sending
  1540.                         if ($secteur->getSmsExpediteur() === null) {
  1541.                             $this->customJsonResponse->setForbidden(true);
  1542.                             $this->customJsonResponse->setField('alert'$this->translator->trans('page_prise_appel.secteur_sms_not_configured', [], 'validators'));
  1543.                             return $this->customJsonResponse->sendResponse();
  1544.                         }
  1545.                         # consultation
  1546.                         $infoConsultation $request->get('infoConsultation') ?? [];
  1547.                         if (!is_array($infoConsultation)) $infoConsultation = [];
  1548.                         $validators = ['tarif','infoArv'];
  1549.                         $consultationCommon = new Consultation();
  1550.                         $tarifId = (int)($request->get('consultationTarifId') ?? 0);
  1551.                         $tarif $tarifId $this->vetoadomEntityManager->getRepository(Tarif::class)->findOneBy(['id' => $tarifId'active' => 1]) : null;
  1552.                         $consultationCommon->setTarif($tarif);
  1553.                         $consultationCommon->setTarifConsultation($request->get('tarifConsultation') ?? 0);
  1554.                         if ($secteur->getFonctionnement()->getCode() == 'domicile') {
  1555.                             $consultationCommon->setHorsZoneDistance($request->get('horsZoneDistance') ?? 0);
  1556.                             $consultationCommon->setTarifDeplacement($request->get('tarifDeplacement') ?? 0);
  1557.                             $consultationCommon->setConsultationEtat($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\ConsultationEtat',6));
  1558.                             $consultationRefereeCliniqueId = (int)($request->get('consultationRefereeCliniqueId') ?? 0);
  1559.                             $referant $consultationRefereeCliniqueId $this->vetoadomEntityManager->getRepository(Referant::class)->findOneBy(['id' => $consultationRefereeCliniqueId]) : null;
  1560.                             $consultationCommon->setConsultationRefereeClinique($referant);
  1561.                             $consultationDelaiUrgenceCode $infoConsultation['delaiUrgenceCode'] ?? '';
  1562.                             $consultationDelaiUrgence $consultationDelaiUrgenceCode !== '' $this->vetoadomEntityManager->getRepository(ConsultationDelaiUrgence::class)->findOneBy(['code' => $consultationDelaiUrgenceCode]) : null;
  1563.                             $consultationCommon->setConsultationDelaiUrgence($consultationDelaiUrgence);
  1564.                             if (!$consultationCommon->getConsultationDelaiUrgence()) {
  1565.                                 $this->customJsonResponse->setField('infoConsultation-delaiUrgence',$this->translator->trans('common.blank', [], 'validators'));
  1566.                             }
  1567.                             else if ($consultationDelaiUrgenceCode == 'dans_heure'){
  1568.                                 $debutHeure = \DateTime::createFromFormat("!H:i"$infoConsultation['debutHeure'] ?? '');
  1569.                                 $finHeure = \DateTime::createFromFormat("!H:i"$infoConsultation['finHeure'] ?? '');
  1570.                                 if ($debutHeure === false) {
  1571.                                     $this->customJsonResponse->setField('infoConsultation-debutHeure',$this->translator->trans('common.blank', [], 'validators'));
  1572.                                 }
  1573.                                 if ($finHeure === false) {
  1574.                                     $this->customJsonResponse->setField('infoConsultation-finHeure',$this->translator->trans('common.blank', [], 'validators'));
  1575.                                 }
  1576.                                 if ($debutHeure !== false && $finHeure !== false) {
  1577.                                     $debutConsultation = new \DateTime();
  1578.                                     $debutConsultation->setTime($debutHeure->format('H'),$debutHeure->format('i'));
  1579.                                     $consultationCommon->setDebutConsultation($debutConsultation);
  1580.                                     $finConsultation = new \DateTime();
  1581.                                     $finConsultation->setTime($finHeure->format('H'),$finHeure->format('i'));
  1582.                                     if ($debutConsultation >= $finConsultation) {
  1583.                                         $finConsultation->add(new \DateInterval('P1D'));
  1584.                                     }
  1585.                                     $consultationCommon->setFinConsultation($finConsultation);
  1586.                                 }
  1587.                             }
  1588.                             else if ($consultationDelaiUrgenceCode == 'prioritaire'){
  1589.                                 $consultationCommon->setDebutConsultation(new \DateTime());
  1590.                             }
  1591.                             else if ($consultationDelaiUrgenceCode == 'delai_a_preciser'){
  1592.                                 $date = \DateTime::createFromFormat("!Y-m-d"$infoConsultation['date'] ?? '');
  1593.                                 if ($date === false) {
  1594.                                     $this->customJsonResponse->setField('infoConsultation-date',$this->translator->trans('common.blank', [], 'validators'));
  1595.                                 }
  1596.                                 $debutHeure = \DateTime::createFromFormat("!H:i"$infoConsultation['debutHeure'] ?? '');
  1597.                                 $finHeure = \DateTime::createFromFormat("!H:i"$infoConsultation['finHeure'] ?? '');
  1598.                                 if ($debutHeure === false) {
  1599.                                     $this->customJsonResponse->setField('infoConsultation-debutHeure',$this->translator->trans('common.blank', [], 'validators'));
  1600.                                 }
  1601.                                 if ($finHeure === false) {
  1602.                                     $this->customJsonResponse->setField('infoConsultation-finHeure',$this->translator->trans('common.blank', [], 'validators'));
  1603.                                 }
  1604.                                 if ($date !== false && $debutHeure !== false && $finHeure !== false) {
  1605.                                     $debutConsultation = clone($date);
  1606.                                     $debutConsultation->setTime($debutHeure->format('H'),$debutHeure->format('i'));
  1607.                                     $consultationCommon->setDebutConsultation($debutConsultation);
  1608.                                     $finConsultation = clone($date);
  1609.                                     $finConsultation->setTime($finHeure->format('H'),$finHeure->format('i'));
  1610.                                     if ($debutConsultation >= $finConsultation) {
  1611.                                         $finConsultation->add(new \DateInterval('P1D'));
  1612.                                     }
  1613.                                     $consultationCommon->setFinConsultation($finConsultation);
  1614.                                 }
  1615.                             }
  1616.                         }
  1617.                         else {
  1618.                             $consultationCommon->setConsultationEtat($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\ConsultationEtat',1));
  1619.                             $date = \DateTime::createFromFormat("!Y-m-d"$infoConsultation['date'] ?? '');
  1620.                             $heure = \DateTime::createFromFormat("!H:i"$infoConsultation['heure'] ?? '');
  1621.                             if ($date === false) {
  1622.                                 $this->customJsonResponse->setField('infoConsultation-date',$this->translator->trans('common.blank', [], 'validators'));
  1623.                             }
  1624.                             if ($heure === false) {
  1625.                                 $this->customJsonResponse->setField('infoConsultation-heure',$this->translator->trans('common.blank', [], 'validators'));
  1626.                             }
  1627.                             if ($date !== false && $heure !== false) {
  1628.                                 $date->setTime($heure->format('H'),$heure->format('i'));
  1629.                                 $consultationCommon->setDebutConsultation($date);
  1630.                             }
  1631.                         }
  1632.                         $consultationCommon->setInfoArv(trim($infoConsultation['infoArv'] ?? ''));
  1633.                         $veterinaireIntervenantId = (int)($infoConsultation['veterinaireIntervenantId'] ?? 0);
  1634.                         $veterinairesPlanning $this->priseAppelHelper->getVeterinairesPlanning($secteur);
  1635.                         if (in_array($veterinaireIntervenantIdarray_column($veterinairesPlanning'id'))) {
  1636.                             $consultationCommon->setVeterinaireIntervenantId($veterinaireIntervenantId);
  1637.                         }
  1638.                         else {
  1639.                             $consultationCommon->setVeterinaireIntervenantId(null);
  1640.                         }
  1641.                         # consultation validation
  1642.                         $errors $this->validator->validate($consultationCommon,null$validators);
  1643.                         if ($errors->count()) {
  1644.                             foreach ($errors as $key => $error) {
  1645.                                 $propertyPath 'infoConsultation-'.$error->getPropertyPath();
  1646.                                 if (!$this->customJsonResponse->hasField($propertyPath)) {
  1647.                                     $this->customJsonResponse->setField($propertyPath$error->getMessage());
  1648.                                 }
  1649.                             }
  1650.                         }
  1651.                         if ($this->customJsonResponse->hasAnyField()) {
  1652.                             $this->customJsonResponse->setForbidden(true);
  1653.                             return $this->customJsonResponse->sendResponse();
  1654.                         }
  1655.                         foreach ($animals as $animalIndex => $animalData) {
  1656.                             # consultation
  1657.                             $consultation = clone $consultationCommon;
  1658.                             # reset tarifDeplacement for next consultations, save it only in first one
  1659.                             $consultationCommon->setTarifDeplacement(null);
  1660.                             $consultation->setAppelAnimal($appelAnimals[$animalIndex]);
  1661.                             # consultationAnimalOperationSpecifique
  1662.                             $totalTarifSpecifique 0;
  1663.                             if (($animalData['euthanasie'] ?? false)) {
  1664.                                 $consultationAnimalOperationSpecifique = new ConsultationAnimalOperationSpecifique();
  1665.                                 $consultationAnimalOperationSpecifique->setConsultation($consultation);
  1666.                                 $consultationAnimalOperationSpecifique->setOperationSpecifique($this->vetoadomEntityManager->getRepository(OperationSpecifique::class)->findOneBy(['code' => 'euthanasie']));
  1667.                                 $consultationAnimalOperationSpecifique->setTarifOperationSpecifique((int)($animalData['euthanasiePrix']??0));
  1668.                                 $this->vetoadomEntityManager->persist($consultationAnimalOperationSpecifique);
  1669.                                 $totalTarifSpecifique += $consultationAnimalOperationSpecifique->getTarifOperationSpecifique();
  1670.                             }
  1671.                             if (($animalData['cremation'] ?? false)) {
  1672.                                 $operationSpecifiqueCode $animalData['operationSpecifiqueCode'] ?? 'collective';
  1673.                                 if ($operationSpecifiqueCode == 'collective') {
  1674.                                     $consultationAnimalOperationSpecifique = new ConsultationAnimalOperationSpecifique();
  1675.                                     $consultationAnimalOperationSpecifique->setConsultation($consultation);
  1676.                                     $consultationAnimalOperationSpecifique->setOperationSpecifique($this->vetoadomEntityManager->getRepository(OperationSpecifique::class)->findOneBy(['code' => 'cremation_collective']));
  1677.                                     $consultationAnimalOperationSpecifique->setTarifOperationSpecifique((int)($animalData['cremationPrix'] ?? 0));
  1678.                                     $this->vetoadomEntityManager->persist($consultationAnimalOperationSpecifique);
  1679.                                     $totalTarifSpecifique += $consultationAnimalOperationSpecifique->getTarifOperationSpecifique();
  1680.                                     $consultationAnimalOperationSpecifique = new ConsultationAnimalOperationSpecifique();
  1681.                                     $consultationAnimalOperationSpecifique->setConsultation($consultation);
  1682.                                     $consultationAnimalOperationSpecifique->setOperationSpecifique($this->vetoadomEntityManager->getRepository(OperationSpecifique::class)->findOneBy(['code' => 'prise_en_charge_du_corps_pour_collective']));
  1683.                                     $consultationAnimalOperationSpecifique->setTarifOperationSpecifique((int)($animalData['pecPrix'] ?? 0));
  1684.                                     $this->vetoadomEntityManager->persist($consultationAnimalOperationSpecifique);
  1685.                                     $totalTarifSpecifique += $consultationAnimalOperationSpecifique->getTarifOperationSpecifique();
  1686.                                 }
  1687.                                 else if ($operationSpecifiqueCode == 'individuelle') {
  1688.                                     $consultationAnimalOperationSpecifique = new ConsultationAnimalOperationSpecifique();
  1689.                                     $consultationAnimalOperationSpecifique->setConsultation($consultation);
  1690.                                     $consultationAnimalOperationSpecifique->setOperationSpecifique($this->vetoadomEntityManager->getRepository(OperationSpecifique::class)->findOneBy(['code' => 'cremation_individuelle']));
  1691.                                     $consultationAnimalOperationSpecifique->setTarifOperationSpecifique((int)($animalData['cremationPrix'] ?? 0));
  1692.                                     $this->vetoadomEntityManager->persist($consultationAnimalOperationSpecifique);
  1693.                                     $totalTarifSpecifique += $consultationAnimalOperationSpecifique->getTarifOperationSpecifique();
  1694.                                     $consultationAnimalOperationSpecifique = new ConsultationAnimalOperationSpecifique();
  1695.                                     $consultationAnimalOperationSpecifique->setConsultation($consultation);
  1696.                                     $consultationAnimalOperationSpecifique->setOperationSpecifique($this->vetoadomEntityManager->getRepository(OperationSpecifique::class)->findOneBy(['code' => 'prise_en_charge_du_corps_pour_individuelle']));
  1697.                                     $consultationAnimalOperationSpecifique->setTarifOperationSpecifique((int)($animalData['pecPrix'] ?? 0));
  1698.                                     $this->vetoadomEntityManager->persist($consultationAnimalOperationSpecifique);
  1699.                                     $totalTarifSpecifique += $consultationAnimalOperationSpecifique->getTarifOperationSpecifique();
  1700.                                 }
  1701.                                 else if ($operationSpecifiqueCode == 'individuelle_assistee') {
  1702.                                     $consultationAnimalOperationSpecifique = new ConsultationAnimalOperationSpecifique();
  1703.                                     $consultationAnimalOperationSpecifique->setConsultation($consultation);
  1704.                                     $consultationAnimalOperationSpecifique->setOperationSpecifique($this->vetoadomEntityManager->getRepository(OperationSpecifique::class)->findOneBy(['code' => 'cremation_individuelle_assistee']));
  1705.                                     $consultationAnimalOperationSpecifique->setTarifOperationSpecifique((int)($animalData['cremationPrix'] ?? 0));
  1706.                                     $this->vetoadomEntityManager->persist($consultationAnimalOperationSpecifique);
  1707.                                     $totalTarifSpecifique += $consultationAnimalOperationSpecifique->getTarifOperationSpecifique();
  1708.                                     $consultationAnimalOperationSpecifique = new ConsultationAnimalOperationSpecifique();
  1709.                                     $consultationAnimalOperationSpecifique->setConsultation($consultation);
  1710.                                     $consultationAnimalOperationSpecifique->setOperationSpecifique($this->vetoadomEntityManager->getRepository(OperationSpecifique::class)->findOneBy(['code' => 'prise_en_charge_du_corps_pour_individuelle_assistee']));
  1711.                                     $consultationAnimalOperationSpecifique->setTarifOperationSpecifique((int)($animalData['pecPrix'] ?? 0));
  1712.                                     $this->vetoadomEntityManager->persist($consultationAnimalOperationSpecifique);
  1713.                                     $totalTarifSpecifique += $consultationAnimalOperationSpecifique->getTarifOperationSpecifique();
  1714.                                 }
  1715.                             }
  1716.                             $consultation->setTarifTotal($consultation->getTarifDeplacement() + $consultation->getTarifConsultation() + $totalTarifSpecifique);
  1717.                             $this->vetoadomEntityManager->persist($consultation);
  1718.                             $consultationEtatHistorique = new ConsultationEtatHistorique();
  1719.                             $consultationEtatHistorique->setConsultation($consultation);
  1720.                             $consultationEtatHistorique->setConsultationEtat($consultation->getConsultationEtat());
  1721.                             $consultationEtatHistorique->setSaisieUserId($appel->getSaisieUserId());
  1722.                             $this->vetoadomEntityManager->persist($consultationEtatHistorique);
  1723.                         }
  1724.                         unset($consultationCommon);
  1725.                         $this->vetoadomEntityManager->flush();
  1726.                         # send email
  1727.                         $emails $this->sendEmail->validerLaConsultation($appel);
  1728.                         # send sms to client for each consultation
  1729.                         $this->sendSms->validerlaConsultation($appel);
  1730.                         $this->customJsonResponse->setField('message'$this->translator->trans('page_prise_appel.success_valider_la_consultation', ['{{emails}}' => $emails], 'messages'));
  1731.                         $this->customJsonResponse->setRedirect($this->urlGenerator->generate('app_prise_appel',['secteurId' => $secteur->getId(),'tab' => 'resume']));
  1732.                         return $this->customJsonResponse->sendResponse();
  1733.                     }
  1734.                     # demandeDeNouvelles
  1735.                     foreach ($appelAnimals as $appelAnimal) {
  1736.                         if (
  1737.                             !$appelAnimal->getAnimal()->getId()
  1738.                             || !$this->vetoadomEntityManager->getRepository(Consultation::class)->getAnimalConsultations($appelAnimal->getAnimal()->getId(),[3,4])
  1739.                         ) {
  1740.                             $this->customJsonResponse->setForbidden(true);
  1741.                             $this->customJsonResponse->setField('alert'$this->translator->trans('page_prise_appel.demande_de_nouvelles_animal_has_no_consultation', ['{{animalNom}}' => $appelAnimal->getAnimal()->getNom()], 'validators'));
  1742.                             return $this->customJsonResponse->sendResponse();
  1743.                         }
  1744.                     }
  1745.                     $this->vetoadomEntityManager->flush();
  1746.                     # send email
  1747.                     $emails $this->sendEmail->demandeDeNouvelles($appel);
  1748.                     $this->customJsonResponse->setField('message'$this->translator->trans('page_prise_appel.success_demande_de_nouvelles', ['{{emails}}' => $emails], 'messages'));
  1749.                     $this->customJsonResponse->setRedirect($this->urlGenerator->generate('app_dashboard'));
  1750.                     return $this->customJsonResponse->sendResponse();
  1751.                 }
  1752.                 break;
  1753.             case 'appelModifier':
  1754.             case 'appelValiderLaConsultation':
  1755.                 {
  1756.                     if (!$appel) {
  1757.                         $this->customJsonResponse->setForbidden(true);
  1758.                         $this->customJsonResponse->setField('alert'$this->translator->trans('page_prise_appel.appel_unknown', [], 'validators'));
  1759.                         return $this->customJsonResponse->sendResponse();
  1760.                     }
  1761.                     if (
  1762.                         $sourceMessage
  1763.                         && $sourceMessage->getMessageEtat()->getId() == 2
  1764.                         && $action == 'appelValiderLaConsultation'
  1765.                     ) {
  1766.                         $this->customJsonResponse->setForbidden(true);
  1767.                         $this->customJsonResponse->setField('alert'$this->translator->trans('common.action_unknown', [], 'validators'));
  1768.                         return $this->customJsonResponse->sendResponse();
  1769.                     }
  1770.                     # secteur changed
  1771.                     $secteurChanged false;
  1772.                     $secteurFunctionnementChanged false;
  1773.                     $appelConsultations $this->vetoadomEntityManager->getRepository(Consultation::class)->getAppelConsultations($appel->getId());
  1774.                     if ($secteur->getId() != $appel->getSecteur()->getId()) {
  1775.                         $secteurChanged true;
  1776.                         if ($secteur->getFonctionnement()->getCode() != $appel->getSecteur()->getFonctionnement()->getCode()) {
  1777.                             $secteurFunctionnementChanged true;
  1778.                         }
  1779.                         $appel->setSecteur($secteur);
  1780.                         foreach ($this->vetoadomEntityManager->getRepository(Message::class)->findBy(['appel' => $appel]) as $message) {
  1781.                             $message->setSecteur($secteur);
  1782.                         }
  1783.                     }
  1784.                     // client
  1785.                     $validators = ['nom','telephone1','telephone2','ville'];
  1786.                     $clientData $request->get('client') ?? [];
  1787.                     if (!is_array($clientData)) $clientData = [];
  1788.                     $client $appel->getClient();
  1789.                     $client->setNom($this->misc->toUpper($clientData['nom'] ?? ''));
  1790.                     $client->setEmail($this->misc->toLower($clientData['email'] ?? ''));
  1791.                     if ($client->getEmail() !== null) {
  1792.                         $validators[] = 'email';
  1793.                     }
  1794.                     $client->setTelephone1(trim($clientData['telephone1'] ?? ''));
  1795.                     $client->setTelephone2(trim($clientData['telephone2'] ?? ''));
  1796.                     $villeId = (int)($clientData['ville'] ?? 0);
  1797.                     $ville $villeId $this->vetoadomEntityManager->getRepository(Ville::class)->findOneBy(['id' => $villeId]) : null;
  1798.                     $client->setVille($ville);
  1799.                     if ($secteur->getFonctionnement()->getCode() == 'domicile') {
  1800.                         $validators array_merge($validators,['interphone','code','batiment','ascenseur','escalier','etage','appartement','informationsComplementaires']);
  1801.                         $client->setAdresse($this->misc->toUpper($clientData['adresse'] ?? ''));
  1802.                         $client->setComplementAdresse($this->misc->toUpper($clientData['complementAdresse'] ?? ''));
  1803.                         if ($action == 'appelValiderConsultation') {
  1804.                             $validators array_merge($validators,['adresse','complementAdresse','habitation']);
  1805.                         }
  1806.                         else {
  1807.                             if ($client->getAdresse() !== null) {
  1808.                                 $validators[] = 'adresse';
  1809.                             }
  1810.                             if ($client->getComplementAdresse() !== null) {
  1811.                                 $validators[] = 'complementAdresse';
  1812.                             }
  1813.                         }
  1814.                         $client->setInterphone(trim($clientData['interphone'] ?? ''));
  1815.                         $client->setCode(trim($clientData['code'] ?? ''));
  1816.                         $client->setBatiment(trim($clientData['batiment'] ?? ''));
  1817.                         $client->setAscenseur(trim($clientData['ascenseur'] ?? ''));
  1818.                         $client->setEscalier(trim($clientData['escalier'] ?? ''));
  1819.                         $client->setEtage(trim($clientData['etage'] ?? ''));
  1820.                         $client->setAppartement(trim($clientData['appartement'] ?? ''));
  1821.                         $client->setInformationsComplementaires(trim($clientData['informationsComplementaires'] ?? ''));
  1822.                         $habitationId = (int)($clientData['habitation'] ?? 0);
  1823.                         $habitation $habitationId $this->vetoadomEntityManager->getRepository(Habitation::class)->findOneBy(['id' => $habitationId]) : null;
  1824.                         $client->setHabitation($habitation);
  1825.                     }
  1826.                     # client validation
  1827.                     $errors $this->validator->validate($client,null$validators);
  1828.                     if ($errors->count()) {
  1829.                         foreach ($errors as $key => $error) {
  1830.                             $propertyPath "client-{$error->getPropertyPath()}";
  1831.                             if (!$this->customJsonResponse->hasField($propertyPath)) {
  1832.                                 $this->customJsonResponse->setField($propertyPath$error->getMessage());
  1833.                             }
  1834.                         }
  1835.                     }
  1836.                     if ($this->customJsonResponse->hasAnyField()) {
  1837.                         $this->customJsonResponse->setForbidden(true);
  1838.                         return $this->customJsonResponse->sendResponse();
  1839.                     }
  1840.                     # set ville coordinates
  1841.                     $client->setVille($this->APIlocation->setVilleCoordinates($client->getVille()));
  1842.                     # animals
  1843.                     $animals $clientData['animals'] ?? [];
  1844.                     if (!is_array($animals)) $animals = [];
  1845.                     if (!$animals) {
  1846.                         $this->customJsonResponse->setForbidden(true);
  1847.                         $this->customJsonResponse->setField("alert"$this->translator->trans('page_prise_appel.animals_empty', [], 'validators'));
  1848.                         return $this->customJsonResponse->sendResponse();
  1849.                     }
  1850.                     $currentAppelAnimals $this->vetoadomEntityManager->getRepository(AppelAnimal::class)->findBy(['appel' => $appel'active' => 1]);
  1851.                     $animalsForAppel = [];
  1852.                     foreach ($animals as $animalIndex => $animalData) {
  1853.                         $animalId = (int)($animalData['id']) ?? 0;
  1854.                         $animal $animalId $this->vetoadomEntityManager->getRepository(Animal::class)->findOneBy([
  1855.                             'id' => $animalId,
  1856.                             'client' => $client,
  1857.                             'active' => 1
  1858.                         ]) : new Animal();
  1859.                         if ($animalId && !$animal) {
  1860.                             $this->customJsonResponse->setForbidden(true);
  1861.                             $this->customJsonResponse->setField("animal-nom-{$animalIndex}"$this->translator->trans('page_prise_appel.animal_unknown', [], 'validators'));
  1862.                             return $this->customJsonResponse->sendResponse();
  1863.                         }
  1864.                         $currentConsultation null;
  1865.                         $appelAnimal = new AppelAnimal();
  1866.                         if ($animalId) {
  1867.                             foreach ($currentAppelAnimals as $currentAppelAnimal) {
  1868.                                 if ($currentAppelAnimal->getAnimal()->getId() != $animalId) continue;
  1869.                                 $currentConsultation $this->vetoadomEntityManager->getRepository(Consultation::class)->findOneBy(['appelAnimal' => $currentAppelAnimal'active' => 1]);
  1870.                                 $appelAnimal $currentAppelAnimal;
  1871.                                 break;
  1872.                             }
  1873.                         }
  1874.                         # need validate data for consultation, when :
  1875.                         # secteurFunctionnementChanged and this animal has currentConsultation
  1876.                         # OR action == 'appelValiderLaConsultation' and this animal has no currentConsultation (we must create it)
  1877.                         # OR action == 'appelModifier' and we modify sourceConsultation of this animal
  1878.                         $validateDataForConsultation false;
  1879.                         if (
  1880.                             ($secteurFunctionnementChanged && $currentConsultation)
  1881.                             || ($action == 'appelValiderLaConsultation' && !$currentConsultation)
  1882.                             || ($action == 'appelModifier' && $currentConsultation && $sourceConsultation && $currentConsultation->getId() == $sourceConsultation->getId())
  1883.                         ) {
  1884.                             $validateDataForConsultation true;
  1885.                         }
  1886.                         $validators = ['nom','animalEspece','animalSexe','dateNaissance'];
  1887.                         $animal->setNom($this->misc->toUpper($animalData['nom'] ?? ''));
  1888.                         $animalEspeceId = (int)($animalData['animalEspece'] ?? 0);
  1889.                         $animalEspece $animalEspeceId $this->vetoadomEntityManager->getRepository(AnimalEspece::class)->findOneBy(['id' => $animalEspeceId]) : null;
  1890.                         $animal->setAnimalEspece($animalEspece);
  1891.                         $animalSexeId = (int)($animalData['animalSexe'] ?? 0);
  1892.                         $animalSexe $animalSexeId $this->vetoadomEntityManager->getRepository(AnimalSexe::class)->findOneBy(['id' => $animalSexeId]) : null;
  1893.                         $animal->setAnimalSexe($animalSexe);
  1894.                         $animalRaceId = (int)($animalData['animalRace'] ?? 0);
  1895.                         $animal->setAnimalRace(
  1896.                             $animalRaceId && $animal->getAnimalEspece()
  1897.                                 ? $this->vetoadomEntityManager->getRepository(AnimalRace::class)->findOneBy(['id' => $animalRaceId'animalEspece' => $animal->getAnimalEspece()])
  1898.                                 : null
  1899.                         );
  1900.                         if (
  1901.                             $animal->getAnimalRace()
  1902.                             && $animal->getAnimalRace()->getCode() == 'autre'
  1903.                         ) {
  1904.                             $validators[] = 'animalRaceAutreNom';
  1905.                             $animal->setAnimalRaceAutreNom($this->misc->toUpper($animalData['animalRaceAutreNom'] ?? ''));
  1906.                         }
  1907.                         else {
  1908.                             $animal->setAnimalRaceAutreNom(null);
  1909.                         }
  1910.                         if (($dateNaissance = \DateTime::createFromFormat("!Y-m-d"$animalData['dateNaissance'] ?? '')) !== false) {
  1911.                             $animal->setDateNaissance($dateNaissance);
  1912.                         }
  1913.                         else {
  1914.                             $animal->setDateNaissance(null);
  1915.                         }
  1916.                         if (!$animal->getDeces()) {
  1917.                             $animal->setDeces((bool)($animalData['deces'] ?? false));
  1918.                         }
  1919.                         if (
  1920.                             $validateDataForConsultation
  1921.                             &&
  1922.                             (
  1923.                                 ($animalData['euthanasie'] ?? false)
  1924.                                 || ($animalData['cremation'] ?? false)
  1925.                             )
  1926.                         ) {
  1927.                             if (!$secteur->hasSecteurCategoriePoidsEspeceById($animalData['categoriePoids'] ?? 0)) {
  1928.                                 $this->customJsonResponse->setField("animal-categoriePoids-{$animalIndex}"$this->translator->trans('common.blank', [], 'validators'));
  1929.                             }
  1930.                         }
  1931.                         # animal validation
  1932.                         $errors $this->validator->validate($animal,null$validators);
  1933.                         if ($errors->count()) {
  1934.                             foreach ($errors as $key => $error) {
  1935.                                 $propertyPath "animal-{$error->getPropertyPath()}-{$animalIndex}";
  1936.                                 if (!$this->customJsonResponse->hasField($propertyPath)) {
  1937.                                     $this->customJsonResponse->setField($propertyPath$error->getMessage());
  1938.                                 }
  1939.                             }
  1940.                         }
  1941.                         else if (!$animal->getId()) {
  1942.                             $animal->setClient($client);
  1943.                             $this->vetoadomEntityManager->persist($animal);
  1944.                             # add animalSite
  1945.                             $animalSite = new AnimalSite();
  1946.                             $animalSite->setAnimal($animal);
  1947.                             $animalSite->setSiteId($secteur->getSiteId());
  1948.                             $this->vetoadomEntityManager->persist($animalSite);
  1949.                         }
  1950.                         else {
  1951.                             # add animalSite if not exist for this siteId
  1952.                             $animalSite $this->vetoadomEntityManager->getRepository(AnimalSite::class)->findOneBy(['animal' => $animal'siteId' => $secteur->getSiteId()]);
  1953.                             if (!$animalSite) {
  1954.                                 $animalSite = new AnimalSite();
  1955.                                 $animalSite->setAnimal($animal);
  1956.                                 $animalSite->setSiteId($secteur->getSiteId());
  1957.                                 $this->vetoadomEntityManager->persist($animalSite);
  1958.                             }
  1959.                         }
  1960.                         $animalsForAppel[] = [
  1961.                             'animal' => $animal,
  1962.                             'animalData' => $animalData,
  1963.                             'appelAnimal' => $appelAnimal,
  1964.                             'currentConsultation' => $currentConsultation,
  1965.                             'validateDataForConsultation' => $validateDataForConsultation
  1966.                         ];
  1967.                     }
  1968.                     if ($this->customJsonResponse->hasAnyField()) {
  1969.                         $this->customJsonResponse->setForbidden(true);
  1970.                         return $this->customJsonResponse->sendResponse();
  1971.                     }
  1972.                     # delete animalAppel
  1973.                     $animalsToDeleteWithActiveConsultations = [];
  1974.                     foreach ($currentAppelAnimals as $key => $currentAppelAnimal) {
  1975.                         $found false;
  1976.                         foreach ($animalsForAppel as $animalForAppel) {
  1977.                             if ($currentAppelAnimal->getAnimal()->getId() != $animalForAppel['animal']->getId()) continue;
  1978.                             $found true;
  1979.                             break;
  1980.                         }
  1981.                         if (!$found) {
  1982.                             # check for exist active consultation
  1983.                             if ($this->vetoadomEntityManager->getRepository(Consultation::class)->findBy(['appelAnimal' => $currentAppelAnimal'active' => 1])) {
  1984.                                 $animalsToDeleteWithActiveConsultations[] = $currentAppelAnimal->getAnimal()->getNom();
  1985.                             }
  1986.                             else {
  1987.                                 $currentAppelAnimal->setActive(0);
  1988.                                 unset($currentAppelAnimals[$key]);
  1989.                             }
  1990.                         }
  1991.                     }
  1992.                     if ($animalsToDeleteWithActiveConsultations) {
  1993.                         $this->customJsonResponse->setField('alert'$this->translator->trans('page_prise_appel.appel_supprimer_animals_with_active_consultations', ['{{animalNom}}' => implode(",",$animalsToDeleteWithActiveConsultations)], 'validators'));
  1994.                         $this->customJsonResponse->setForbidden(true);
  1995.                         return $this->customJsonResponse->sendResponse();
  1996.                     }
  1997.                     # if this is not secteur functionnement change
  1998.                     # if action = appelValiderLaConsultation (we create consultations)
  1999.                     # if any animal has currentConsultation
  2000.                     if (
  2001.                         !$secteurFunctionnementChanged
  2002.                         && $action == 'appelValiderLaConsultation'
  2003.                         && !$request->get('recreateConsultationsConfirmed')
  2004.                     ) {
  2005.                         $animalsWithCurentConsultations = [];
  2006.                         /** @var Consultation $currentConsultation */
  2007.                         $currentConsultation null;
  2008.                         foreach ($animalsForAppel as $item) {
  2009.                             if (!$item['currentConsultation']) continue;
  2010.                             $animalsWithCurentConsultations[] = $item['animal']->getNom();
  2011.                             $currentConsultation $item['currentConsultation'];
  2012.                         }
  2013.                         if ($animalsWithCurentConsultations) {
  2014.                             $this->customJsonResponse->setField('recreateConsultationsConfirm'$this->translator->trans('page_prise_appel.appel_valider_consultation_animals_with_active_consultations', [
  2015.                                 '{{animalNom}}' => implode(",",$animalsWithCurentConsultations),
  2016.                                 '{{dateDebut}}' => $currentConsultation->getDebutConsultation()->format('d/m'),
  2017.                                 '{{heureDebut}}' => $currentConsultation->getDebutConsultation()->format('H:i'),
  2018.                             ], 'validators'));
  2019.                             $this->customJsonResponse->setForbidden(true);
  2020.                             return $this->customJsonResponse->sendResponse();
  2021.                         }
  2022.                     }
  2023.                     # deactivate current consultations
  2024.                     # if this is secteur functionnement change and there is current consultations
  2025.                     # or action = appelValiderLaConsultation
  2026.                     if (
  2027.                         ($secteurFunctionnementChanged && $appelConsultations)
  2028.                         || $action == 'appelValiderLaConsultation'
  2029.                     ) {
  2030.                         foreach ($animalsForAppel as $item) {
  2031.                             if (!$item['currentConsultation']) continue;
  2032.                             /** @var Consultation $currentConsultation */
  2033.                             $currentConsultation $item['currentConsultation'];
  2034.                             $currentConsultation->setActive(0);
  2035.                         }
  2036.                     }
  2037.                     # appel
  2038.                     $validators = ['referant','motifAppel','informationInterne'];
  2039.                     $appelData $request->get('appel') ?? [];
  2040.                     if (!is_array($appelData)) $appelData = [];
  2041.                     $referantId = (int)($appelData['referantId'] ?? 0);
  2042.                     $referant $referantId $this->vetoadomEntityManager->getRepository(Referant::class)->findOneBy(['id' => $referantId]) : null;
  2043.                     if ($secteurChanged) {
  2044.                         $appel->setRegulateurId($request->get('regulateurId') ?? 0);
  2045.                         $appel->setSuperviseurId($request->get('superviseurId') ?? 0);
  2046.                         $appel->setAstreinteChirurgieId($request->get('astreinteChirurgieId'));
  2047.                         $appel->setVetcoachId($request->get('vetcoachId'));
  2048.                     }
  2049.                     $appel->setLangue($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\Langue',$request->get('langueId')));
  2050.                     $appel->setReferant($referant);
  2051.                     $appel->setMotifAppel($appelData['motifAppel'] ?? '');
  2052.                     $appel->setInformationInterne($appelData['informationInterne'] ?? '');
  2053.                     if ($secteur->getFonctionnement()->getCode() == 'domicile') {
  2054.                         $appel->setVille($client->getVille());
  2055.                         $secteurZoneId = (int)($request->get('secteurZoneId') ?? 0);
  2056.                         $secteurZone $secteurZoneId $this->vetoadomEntityManager->getRepository(SecteurZone::class)->findOneBy(['id' => $secteurZoneId,'secteur' => $secteur]) : null;
  2057.                         $appel->setSecteurZone($secteurZone);
  2058.                         if (
  2059.                             $appelConsultations
  2060.                             && !$appel->getSecteurZone()
  2061.                             && !$this->customJsonResponse->hasField('alert')
  2062.                         ) {
  2063.                             $this->customJsonResponse->setField('alert'$this->translator->trans('page_prise_appel_client.tarif_deplacement_secteur_zone_text_hors_du_perimetre_action_no_secteurs', [], 'messages'));
  2064.                         }
  2065.                     }
  2066.                     # appel validation
  2067.                     $errors $this->validator->validate($appel,null$validators);
  2068.                     if ($errors->count()) {
  2069.                         foreach ($errors as $key => $error) {
  2070.                             if (!$this->customJsonResponse->hasField($error->getPropertyPath())) {
  2071.                                 $this->customJsonResponse->setField($error->getPropertyPath(), $error->getMessage());
  2072.                             }
  2073.                         }
  2074.                     }
  2075.                     if ($this->customJsonResponse->hasAnyField()) {
  2076.                         $this->customJsonResponse->setForbidden(true);
  2077.                         return $this->customJsonResponse->sendResponse();
  2078.                     }
  2079.                     $appelAnimals = [];
  2080.                     foreach ($animalsForAppel as $item) {
  2081.                         $appelAnimal $item['appelAnimal'];
  2082.                         $appelAnimal->setAppel($appel);
  2083.                         $appelAnimal->setAnimal($item['animal']);
  2084.                         if (
  2085.                             $item['validateDataForConsultation']
  2086.                             &&
  2087.                             (
  2088.                                 ($item['animalData']['euthanasie'] ?? false)
  2089.                                 || ($item['animalData']['cremation'] ?? false)
  2090.                             )
  2091.                         ) {
  2092.                             $appelAnimal->setSecteurCategoriePoidsEspece($secteur->getSecteurCategoriePoidsEspeceById($item['animalData']['categoriePoids']));
  2093.                         }
  2094.                         else {
  2095.                             $appelAnimal->setSecteurCategoriePoidsEspece(null);
  2096.                         }
  2097.                         if (!$appelAnimal->getId()) {
  2098.                             $this->vetoadomEntityManager->persist($appelAnimal);
  2099.                         }
  2100.                         $appelAnimals[] = $appelAnimal;
  2101.                     }
  2102.                     # consultation
  2103.                     # if this is secteur functionnement change and there is current consultations
  2104.                     # or action = appelValiderLaConsultation
  2105.                     # or we have sourceConsultation
  2106.                     if (
  2107.                         ($secteurFunctionnementChanged && $appelConsultations)
  2108.                         || $action == 'appelValiderLaConsultation'
  2109.                         || $sourceConsultation
  2110.                     ) {
  2111.                         $infoConsultation $request->get('infoConsultation') ?? [];
  2112.                         if (!is_array($infoConsultation)) $infoConsultation = [];
  2113.                         $validators = ['tarif''infoArv'];
  2114.                         # consultations creation
  2115.                         # if this is secteur functionnement change and there is current consultations
  2116.                         # or action = appelValiderLaConsultation
  2117.                         if (
  2118.                             ($secteurFunctionnementChanged && $appelConsultations)
  2119.                             || $action == 'appelValiderLaConsultation'
  2120.                         ) {
  2121.                             $consultationCommon = new Consultation();
  2122.                         }
  2123.                         # consultaion modification
  2124.                         else {
  2125.                             $consultationCommon $sourceConsultation;
  2126.                         }
  2127.                         $tarifId = (int)($request->get('consultationTarifId') ?? 0);
  2128.                         $tarif $tarifId $this->vetoadomEntityManager->getRepository(Tarif::class)->findOneBy(['id' => $tarifId'active' => 1]) : null;
  2129.                         $consultationCommon->setTarif($tarif);
  2130.                         $consultationCommon->setTarifConsultation($request->get('tarifConsultation') ?? 0);
  2131.                         if ($secteur->getFonctionnement()->getCode() == 'domicile') {
  2132.                             $consultationCommon->setHorsZoneDistance($request->get('horsZoneDistance') ?? 0);
  2133.                             $consultationCommon->setTarifDeplacement($request->get('tarifDeplacement') ?? 0);
  2134.                             $consultationCommon->setConsultationEtat($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\ConsultationEtat'6));
  2135.                             $consultationRefereeCliniqueId = (int)($request->get('consultationRefereeCliniqueId') ?? 0);
  2136.                             $referant $consultationRefereeCliniqueId $this->vetoadomEntityManager->getRepository(Referant::class)->findOneBy(['id' => $consultationRefereeCliniqueId]) : null;
  2137.                             $consultationCommon->setConsultationRefereeClinique($referant);
  2138.                             $consultationDelaiUrgenceCode $infoConsultation['delaiUrgenceCode'] ?? '';
  2139.                             $consultationDelaiUrgence $consultationDelaiUrgenceCode !== '' $this->vetoadomEntityManager->getRepository(ConsultationDelaiUrgence::class)->findOneBy(['code' => $consultationDelaiUrgenceCode]) : null;
  2140.                             $consultationDelaiUrgenceChanged = !$consultationCommon->getConsultationDelaiUrgence() || $consultationCommon->getConsultationDelaiUrgence()->getCode() != $consultationDelaiUrgenceCode;
  2141.                             $consultationCommon->setConsultationDelaiUrgence($consultationDelaiUrgence);
  2142.                             if (!$consultationCommon->getConsultationDelaiUrgence()) {
  2143.                                 $this->customJsonResponse->setField('infoConsultation-delaiUrgence'$this->translator->trans('common.blank', [], 'validators'));
  2144.                             } else if ($consultationDelaiUrgenceCode == 'dans_heure') {
  2145.                                 $debutHeure = \DateTime::createFromFormat("!H:i"$infoConsultation['debutHeure'] ?? '');
  2146.                                 $finHeure = \DateTime::createFromFormat("!H:i"$infoConsultation['finHeure'] ?? '');
  2147.                                 if ($debutHeure === false) {
  2148.                                     $this->customJsonResponse->setField('infoConsultation-debutHeure'$this->translator->trans('common.blank', [], 'validators'));
  2149.                                 }
  2150.                                 if ($finHeure === false) {
  2151.                                     $this->customJsonResponse->setField('infoConsultation-finHeure'$this->translator->trans('common.blank', [], 'validators'));
  2152.                                 }
  2153.                                 if ($debutHeure !== false && $finHeure !== false) {
  2154.                                     $debutConsultation $consultationDelaiUrgenceChanged ? new \DateTime() : $consultationCommon->getDebutConsultation();
  2155.                                     $debutConsultation->setTime($debutHeure->format('H'), $debutHeure->format('i'));
  2156.                                     $consultationCommon->setDebutConsultation($debutConsultation);
  2157.                                     $finConsultation $consultationDelaiUrgenceChanged ? new \DateTime() : $consultationCommon->getFinConsultation();
  2158.                                     $finConsultation->setTime($finHeure->format('H'), $finHeure->format('i'));
  2159.                                     if ($debutConsultation >= $finConsultation) {
  2160.                                         $finConsultation->add(new \DateInterval('P1D'));
  2161.                                     }
  2162.                                     $consultationCommon->setFinConsultation($finConsultation);
  2163.                                 }
  2164.                             } else if ($consultationDelaiUrgenceCode == 'prioritaire') {
  2165.                                 if ($consultationDelaiUrgenceChanged) {
  2166.                                     $consultationCommon->setDebutConsultation(new \DateTime());
  2167.                                 }
  2168.                             } else if ($consultationDelaiUrgenceCode == 'delai_a_preciser') {
  2169.                                 $date = \DateTime::createFromFormat("!Y-m-d"$infoConsultation['date'] ?? '');
  2170.                                 if ($date === false) {
  2171.                                     $this->customJsonResponse->setField('infoConsultation-date'$this->translator->trans('common.blank', [], 'validators'));
  2172.                                 }
  2173.                                 $debutHeure = \DateTime::createFromFormat("!H:i"$infoConsultation['debutHeure'] ?? '');
  2174.                                 $finHeure = \DateTime::createFromFormat("!H:i"$infoConsultation['finHeure'] ?? '');
  2175.                                 if ($debutHeure === false) {
  2176.                                     $this->customJsonResponse->setField('infoConsultation-debutHeure'$this->translator->trans('common.blank', [], 'validators'));
  2177.                                 }
  2178.                                 if ($finHeure === false) {
  2179.                                     $this->customJsonResponse->setField('infoConsultation-finHeure'$this->translator->trans('common.blank', [], 'validators'));
  2180.                                 }
  2181.                                 if ($date !== false && $debutHeure !== false && $finHeure !== false) {
  2182.                                     $debutConsultation = clone($date);
  2183.                                     $debutConsultation->setTime($debutHeure->format('H'), $debutHeure->format('i'));
  2184.                                     $consultationCommon->setDebutConsultation($debutConsultation);
  2185.                                     $finConsultation = clone($date);
  2186.                                     $finConsultation->setTime($finHeure->format('H'), $finHeure->format('i'));
  2187.                                     if ($debutConsultation >= $finConsultation) {
  2188.                                         $finConsultation->add(new \DateInterval('P1D'));
  2189.                                     }
  2190.                                     $consultationCommon->setFinConsultation($finConsultation);
  2191.                                 }
  2192.                             }
  2193.                         } else {
  2194.                             $consultationCommon->setConsultationEtat($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\ConsultationEtat'1));
  2195.                             $date = \DateTime::createFromFormat("!Y-m-d"$infoConsultation['date'] ?? '');
  2196.                             $heure = \DateTime::createFromFormat("!H:i"$infoConsultation['heure'] ?? '');
  2197.                             if ($date === false) {
  2198.                                 $this->customJsonResponse->setField('infoConsultation-date'$this->translator->trans('common.blank', [], 'validators'));
  2199.                             }
  2200.                             if ($heure === false) {
  2201.                                 $this->customJsonResponse->setField('infoConsultation-heure'$this->translator->trans('common.blank', [], 'validators'));
  2202.                             }
  2203.                             if ($date !== false && $heure !== false) {
  2204.                                 $date->setTime($heure->format('H'), $heure->format('i'));
  2205.                                 $consultationCommon->setDebutConsultation($date);
  2206.                             }
  2207.                         }
  2208.                         $consultationCommon->setInfoArv(trim($infoConsultation['infoArv'] ?? ''));
  2209.                         $veterinaireIntervenantId = (int)($infoConsultation['veterinaireIntervenantId'] ?? 0);
  2210.                         $veterinairesPlanning $this->priseAppelHelper->getVeterinairesPlanning($secteur);
  2211.                         if (in_array($veterinaireIntervenantIdarray_column($veterinairesPlanning'id'))) {
  2212.                             $consultationCommon->setVeterinaireIntervenantId($veterinaireIntervenantId);
  2213.                         } else {
  2214.                             $consultationCommon->setVeterinaireIntervenantId(null);
  2215.                         }
  2216.                         # consultation validation
  2217.                         $errors $this->validator->validate($consultationCommonnull$validators);
  2218.                         if ($errors->count()) {
  2219.                             foreach ($errors as $key => $error) {
  2220.                                 $propertyPath 'infoConsultation-' $error->getPropertyPath();
  2221.                                 if (!$this->customJsonResponse->hasField($propertyPath)) {
  2222.                                     $this->customJsonResponse->setField($propertyPath$error->getMessage());
  2223.                                 }
  2224.                             }
  2225.                         }
  2226.                         if ($this->customJsonResponse->hasAnyField()) {
  2227.                             $this->customJsonResponse->setForbidden(true);
  2228.                             return $this->customJsonResponse->sendResponse();
  2229.                         }
  2230.                         foreach ($animals as $animalIndex => $animalData) {
  2231.                             # consultation
  2232.                             # creation
  2233.                             $currentOperationsSpecifique = [];
  2234.                             if (!$consultationCommon->getId()) {
  2235.                                 $consultation = clone $consultationCommon;
  2236.                                 # reset tarifDeplacement for next consultations, save it only in first one
  2237.                                 $consultationCommon->setTarifDeplacement(null);
  2238.                                 $consultation->setAppelAnimal($appelAnimals[$animalIndex]);
  2239.                             }
  2240.                             # modification
  2241.                             else {
  2242.                                 # skip other animals
  2243.                                 if ($appelAnimals[$animalIndex]->getAnimal()->getId() != $consultationCommon->getAppelAnimal()->getAnimal()->getId()) continue;
  2244.                                 $consultation $consultationCommon;
  2245.                                 $currentOperationsSpecifique $this->vetoadomEntityManager->getRepository(ConsultationAnimalOperationSpecifique::class)->findBy(['consultation' => $consultation'active' => 1]);
  2246.                             }
  2247.                             # consultationAnimalOperationSpecifique
  2248.                             $totalTarifSpecifique 0;
  2249.                             $newOperationsSpecifique = [];
  2250.                             if (($animalData['euthanasie'] ?? false)) {
  2251.                                 $consultationAnimalOperationSpecifique = new ConsultationAnimalOperationSpecifique();
  2252.                                 $consultationAnimalOperationSpecifique->setOperationSpecifique($this->vetoadomEntityManager->getRepository(OperationSpecifique::class)->findOneBy(['code' => 'euthanasie']));
  2253.                                 foreach ($currentOperationsSpecifique as $item) {
  2254.                                     if ($item->getOperationSpecifique()->getId() != $consultationAnimalOperationSpecifique->getOperationSpecifique()->getId()) continue;
  2255.                                     $consultationAnimalOperationSpecifique $item;
  2256.                                     break;
  2257.                                 }
  2258.                                 $consultationAnimalOperationSpecifique->setConsultation($consultation);
  2259.                                 $consultationAnimalOperationSpecifique->setTarifOperationSpecifique((int)($animalData['euthanasiePrix'] ?? 0));
  2260.                                 if (!$consultationAnimalOperationSpecifique->getId()) {
  2261.                                     $this->vetoadomEntityManager->persist($consultationAnimalOperationSpecifique);
  2262.                                 }
  2263.                                 else {
  2264.                                     $newOperationsSpecifique[] = $consultationAnimalOperationSpecifique->getId();
  2265.                                 }
  2266.                                 $totalTarifSpecifique += $consultationAnimalOperationSpecifique->getTarifOperationSpecifique();
  2267.                             }
  2268.                             if (($animalData['cremation'] ?? false)) {
  2269.                                 $operationSpecifiqueCode $animalData['operationSpecifiqueCode'] ?? 'collective';
  2270.                                 if ($operationSpecifiqueCode == 'collective') {
  2271.                                     $consultationAnimalOperationSpecifique = new ConsultationAnimalOperationSpecifique();
  2272.                                     $consultationAnimalOperationSpecifique->setConsultation($consultation);
  2273.                                     $consultationAnimalOperationSpecifique->setOperationSpecifique($this->vetoadomEntityManager->getRepository(OperationSpecifique::class)->findOneBy(['code' => 'cremation_collective']));
  2274.                                     foreach ($currentOperationsSpecifique as $item) {
  2275.                                         if ($item->getOperationSpecifique()->getId() != $consultationAnimalOperationSpecifique->getOperationSpecifique()->getId()) continue;
  2276.                                         $consultationAnimalOperationSpecifique $item;
  2277.                                         break;
  2278.                                     }
  2279.                                     $consultationAnimalOperationSpecifique->setTarifOperationSpecifique((int)($animalData['cremationPrix'] ?? 0));
  2280.                                     if (!$consultationAnimalOperationSpecifique->getId()) {
  2281.                                         $this->vetoadomEntityManager->persist($consultationAnimalOperationSpecifique);
  2282.                                     }
  2283.                                     else {
  2284.                                         $newOperationsSpecifique[] = $consultationAnimalOperationSpecifique->getId();
  2285.                                     }
  2286.                                     $totalTarifSpecifique += $consultationAnimalOperationSpecifique->getTarifOperationSpecifique();
  2287.                                     $consultationAnimalOperationSpecifique = new ConsultationAnimalOperationSpecifique();
  2288.                                     $consultationAnimalOperationSpecifique->setConsultation($consultation);
  2289.                                     $consultationAnimalOperationSpecifique->setOperationSpecifique($this->vetoadomEntityManager->getRepository(OperationSpecifique::class)->findOneBy(['code' => 'prise_en_charge_du_corps_pour_collective']));
  2290.                                     foreach ($currentOperationsSpecifique as $item) {
  2291.                                         if ($item->getOperationSpecifique()->getId() != $consultationAnimalOperationSpecifique->getOperationSpecifique()->getId()) continue;
  2292.                                         $consultationAnimalOperationSpecifique $item;
  2293.                                         break;
  2294.                                     }
  2295.                                     $consultationAnimalOperationSpecifique->setTarifOperationSpecifique((int)($animalData['pecPrix'] ?? 0));
  2296.                                     if (!$consultationAnimalOperationSpecifique->getId()) {
  2297.                                         $this->vetoadomEntityManager->persist($consultationAnimalOperationSpecifique);
  2298.                                     }
  2299.                                     else {
  2300.                                         $newOperationsSpecifique[] = $consultationAnimalOperationSpecifique->getId();
  2301.                                     }
  2302.                                     $totalTarifSpecifique += $consultationAnimalOperationSpecifique->getTarifOperationSpecifique();
  2303.                                 } else if ($operationSpecifiqueCode == 'individuelle') {
  2304.                                     $consultationAnimalOperationSpecifique = new ConsultationAnimalOperationSpecifique();
  2305.                                     $consultationAnimalOperationSpecifique->setConsultation($consultation);
  2306.                                     $consultationAnimalOperationSpecifique->setOperationSpecifique($this->vetoadomEntityManager->getRepository(OperationSpecifique::class)->findOneBy(['code' => 'cremation_individuelle']));
  2307.                                     foreach ($currentOperationsSpecifique as $item) {
  2308.                                         if ($item->getOperationSpecifique()->getId() != $consultationAnimalOperationSpecifique->getOperationSpecifique()->getId()) continue;
  2309.                                         $consultationAnimalOperationSpecifique $item;
  2310.                                         break;
  2311.                                     }
  2312.                                     $consultationAnimalOperationSpecifique->setTarifOperationSpecifique((int)($animalData['cremationPrix'] ?? 0));
  2313.                                     if (!$consultationAnimalOperationSpecifique->getId()) {
  2314.                                         $this->vetoadomEntityManager->persist($consultationAnimalOperationSpecifique);
  2315.                                     }
  2316.                                     else {
  2317.                                         $newOperationsSpecifique[] = $consultationAnimalOperationSpecifique->getId();
  2318.                                     }
  2319.                                     $totalTarifSpecifique += $consultationAnimalOperationSpecifique->getTarifOperationSpecifique();
  2320.                                     $consultationAnimalOperationSpecifique = new ConsultationAnimalOperationSpecifique();
  2321.                                     $consultationAnimalOperationSpecifique->setConsultation($consultation);
  2322.                                     $consultationAnimalOperationSpecifique->setOperationSpecifique($this->vetoadomEntityManager->getRepository(OperationSpecifique::class)->findOneBy(['code' => 'prise_en_charge_du_corps_pour_individuelle']));
  2323.                                     foreach ($currentOperationsSpecifique as $item) {
  2324.                                         if ($item->getOperationSpecifique()->getId() != $consultationAnimalOperationSpecifique->getOperationSpecifique()->getId()) continue;
  2325.                                         $consultationAnimalOperationSpecifique $item;
  2326.                                         break;
  2327.                                     }
  2328.                                     $consultationAnimalOperationSpecifique->setTarifOperationSpecifique((int)($animalData['pecPrix'] ?? 0));
  2329.                                     if (!$consultationAnimalOperationSpecifique->getId()) {
  2330.                                         $this->vetoadomEntityManager->persist($consultationAnimalOperationSpecifique);
  2331.                                     }
  2332.                                     else {
  2333.                                         $newOperationsSpecifique[] = $consultationAnimalOperationSpecifique->getId();
  2334.                                     }
  2335.                                     $totalTarifSpecifique += $consultationAnimalOperationSpecifique->getTarifOperationSpecifique();
  2336.                                 } else if ($operationSpecifiqueCode == 'individuelle_assistee') {
  2337.                                     $consultationAnimalOperationSpecifique = new ConsultationAnimalOperationSpecifique();
  2338.                                     $consultationAnimalOperationSpecifique->setConsultation($consultation);
  2339.                                     $consultationAnimalOperationSpecifique->setOperationSpecifique($this->vetoadomEntityManager->getRepository(OperationSpecifique::class)->findOneBy(['code' => 'cremation_individuelle_assistee']));
  2340.                                     foreach ($currentOperationsSpecifique as $item) {
  2341.                                         if ($item->getOperationSpecifique()->getId() != $consultationAnimalOperationSpecifique->getOperationSpecifique()->getId()) continue;
  2342.                                         $consultationAnimalOperationSpecifique $item;
  2343.                                         break;
  2344.                                     }
  2345.                                     $consultationAnimalOperationSpecifique->setTarifOperationSpecifique((int)($animalData['cremationPrix'] ?? 0));
  2346.                                     if (!$consultationAnimalOperationSpecifique->getId()) {
  2347.                                         $this->vetoadomEntityManager->persist($consultationAnimalOperationSpecifique);
  2348.                                     }
  2349.                                     else {
  2350.                                         $newOperationsSpecifique[] = $consultationAnimalOperationSpecifique->getId();
  2351.                                     }
  2352.                                     $totalTarifSpecifique += $consultationAnimalOperationSpecifique->getTarifOperationSpecifique();
  2353.                                     $consultationAnimalOperationSpecifique = new ConsultationAnimalOperationSpecifique();
  2354.                                     $consultationAnimalOperationSpecifique->setConsultation($consultation);
  2355.                                     $consultationAnimalOperationSpecifique->setOperationSpecifique($this->vetoadomEntityManager->getRepository(OperationSpecifique::class)->findOneBy(['code' => 'prise_en_charge_du_corps_pour_individuelle_assistee']));
  2356.                                     foreach ($currentOperationsSpecifique as $item) {
  2357.                                         if ($item->getOperationSpecifique()->getId() != $consultationAnimalOperationSpecifique->getOperationSpecifique()->getId()) continue;
  2358.                                         $consultationAnimalOperationSpecifique $item;
  2359.                                         break;
  2360.                                     }
  2361.                                     $consultationAnimalOperationSpecifique->setTarifOperationSpecifique((int)($animalData['pecPrix'] ?? 0));
  2362.                                     if (!$consultationAnimalOperationSpecifique->getId()) {
  2363.                                         $this->vetoadomEntityManager->persist($consultationAnimalOperationSpecifique);
  2364.                                     }
  2365.                                     else {
  2366.                                         $newOperationsSpecifique[] = $consultationAnimalOperationSpecifique->getId();
  2367.                                     }
  2368.                                     $totalTarifSpecifique += $consultationAnimalOperationSpecifique->getTarifOperationSpecifique();
  2369.                                 }
  2370.                             }
  2371.                             $consultation->setTarifTotal($consultation->getTarifDeplacement() + $consultation->getTarifConsultation() + $totalTarifSpecifique);
  2372.                             # creation
  2373.                             if (!$consultation->getId()) {
  2374.                                 $this->vetoadomEntityManager->persist($consultation);
  2375.                                 $consultationEtatHistorique = new ConsultationEtatHistorique();
  2376.                                 $consultationEtatHistorique->setConsultation($consultation);
  2377.                                 $consultationEtatHistorique->setConsultationEtat($consultation->getConsultationEtat());
  2378.                                 $consultationEtatHistorique->setSaisieUserId($appel->getSaisieUserId());
  2379.                                 $this->vetoadomEntityManager->persist($consultationEtatHistorique);
  2380.                             }
  2381.                             # modification
  2382.                             else {
  2383.                                 # deactivate current operations specifique, which was removed
  2384.                                 foreach ($currentOperationsSpecifique as $currentOperationSpecifique) {
  2385.                                     if (in_array($currentOperationSpecifique->getId(),$newOperationsSpecifique)) continue;
  2386.                                     $currentOperationSpecifique->setActive(0);
  2387.                                 }
  2388.                                 # skip other animals
  2389.                                 break;
  2390.                             }
  2391.                         }
  2392.                     }
  2393.                     unset($consultationCommon);
  2394.                     # redirect to messages
  2395.                     if ($sourceMessage) {
  2396.                         if ($sourceMessage->getMessageEtat()->getId() == 1) {
  2397.                             $veterinairesPlanning $this->priseAppelHelper->getVeterinairesPlanning($secteur);
  2398.                             # admin/regulateur
  2399.                             if ($this->isGranted('ROLE_ADMIN') || in_array($user->getId(), array_column($veterinairesPlanning'id'))) {
  2400.                                 $sourceMessage->setMessageEtat($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\MessageEtat'2));
  2401.                                 $appel->setRegulateurId($user->getId());
  2402.                             }
  2403.                             if ($action == 'appelValiderLaConsultation') {
  2404.                                 $sourceMessage->setContenu($sourceMessage->getContenu() . $this->translator->trans('page_prise_appel.appel_valider_la_consultation_message_append', [], 'messages'));
  2405.                                 $this->customJsonResponse->setField('message'$this->translator->trans('page_prise_appel.appel_valider_la_consultation_success', [], 'messages'));
  2406.                                 $this->customJsonResponse->setRedirect($this->urlGenerator->generate('app_prise_appel', ['secteurId' => $secteur->getId(), 'tab' => 'resume']));
  2407.                             } else {
  2408.                                 $this->customJsonResponse->setRedirect($this->urlGenerator->generate('app_prise_appel', ['secteurId' => $secteur->getId(), 'tab' => 'messages']));
  2409.                             }
  2410.                         }
  2411.                         else {
  2412.                             $this->customJsonResponse->setRedirect($this->urlGenerator->generate('app_prise_appel', ['secteurId' => $secteur->getId(), 'tab' => 'messages']));
  2413.                         }
  2414.                     }
  2415.                     # redirect to resume
  2416.                     else {
  2417.                         $this->customJsonResponse->setRedirect($this->urlGenerator->generate('app_prise_appel', ['secteurId' => $secteur->getId(), 'tab' => 'resume']));
  2418.                     }
  2419.                     $this->vetoadomEntityManager->flush();
  2420.                     return $this->customJsonResponse->sendResponse();
  2421.                 }
  2422.                 break;
  2423.             case 'getMessages':
  2424.                 {
  2425.                     $this->customJsonResponse->setField('messages'$this->priseAppelHelper->getMessages($secteur));
  2426.                     return $this->customJsonResponse->sendResponse();
  2427.                 }
  2428.                 break;
  2429.             case 'messageSupprimer':
  2430.                 {
  2431.                     if (!$this->isGranted('ROLE_ADMIN')) {
  2432.                         $this->customJsonResponse->setForbidden(true);
  2433.                         $this->customJsonResponse->setField('alert'$this->translator->trans('common.action_unknown', [], 'validators'));
  2434.                         return $this->customJsonResponse->sendResponse();
  2435.                     }
  2436.                     $id = (int)($request->get('id') ?? 0);
  2437.                     $message $id $this->vetoadomEntityManager->getRepository(Message::class)->findOneBy(['id' => $id'active' => 1'secteur' => $secteur]) : null;
  2438.                     if (!$message) {
  2439.                         $this->customJsonResponse->setForbidden(true);
  2440.                         $this->customJsonResponse->setField('alert'$this->translator->trans('page_prise_appel_messages.message_unknown', [], 'validators'));
  2441.                         return $this->customJsonResponse->sendResponse();
  2442.                     }
  2443.                     $validators = ['motifSuppression'];
  2444.                     $message->setActive(0);
  2445.                     $message->setDateSuppression(new \DateTime());
  2446.                     $message->setUserSuppressionId($user->getId());
  2447.                     $message->setMotifSuppression(trim($request->get('motifSuppression') ?? ''));
  2448.                     # message validation
  2449.                     $errors $this->validator->validate($message,null$validators);
  2450.                     if ($errors->count()) {
  2451.                         foreach ($errors as $key => $error) {
  2452.                             $propertyPath "message-{$error->getPropertyPath()}";
  2453.                             if (!$this->customJsonResponse->hasField($propertyPath)) {
  2454.                                 $this->customJsonResponse->setField($propertyPath$error->getMessage());
  2455.                             }
  2456.                         }
  2457.                     }
  2458.                     if ($this->customJsonResponse->hasAnyField()) {
  2459.                         $this->customJsonResponse->setForbidden(true);
  2460.                         return $this->customJsonResponse->sendResponse();
  2461.                     }
  2462.                     $this->vetoadomEntityManager->flush();
  2463.                     $this->customJsonResponse->setField('message'$this->translator->trans('page_prise_appel_messages.message_supprime', [], 'messages'));
  2464.                     $this->customJsonResponse->setField('messages'$this->priseAppelHelper->getMessages($secteur));
  2465.                     return $this->customJsonResponse->sendResponse();
  2466.                 }
  2467.                 break;
  2468.             case 'messageReferantSuiteRegulation':
  2469.                 {
  2470.                     if (!$this->isGranted('ROLE_ADMIN')) {
  2471.                         $this->customJsonResponse->setForbidden(true);
  2472.                         $this->customJsonResponse->setField('alert'$this->translator->trans('common.action_unknown', [], 'validators'));
  2473.                         return $this->customJsonResponse->sendResponse();
  2474.                     }
  2475.                     $id = (int)($request->get('id') ?? 0);
  2476.                     $message $id $this->vetoadomEntityManager->getRepository(Message::class)->findOneBy(['id' => $id'active' => 1'messageEtat' => 2'secteur' => $secteur]) : null;
  2477.                     if (!$message) {
  2478.                         $this->customJsonResponse->setForbidden(true);
  2479.                         $this->customJsonResponse->setField('alert'$this->translator->trans('page_prise_appel_messages.message_unknown', [], 'validators'));
  2480.                         return $this->customJsonResponse->sendResponse();
  2481.                     }
  2482.                     $message->setMessageEtat($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\MessageEtat',3));
  2483.                     $this->vetoadomEntityManager->flush();
  2484.                     # send email
  2485.                     $this->sendEmail->messageReferantSuiteRegulation($message);
  2486.                     $this->customJsonResponse->setField('message'$this->translator->trans('page_prise_appel_messages.email_envoye', [], 'messages'));
  2487.                     $this->customJsonResponse->setField('messages'$this->priseAppelHelper->getMessages($secteur));
  2488.                     return $this->customJsonResponse->sendResponse();
  2489.                 }
  2490.                 break;
  2491.             case 'messageMauvaiseGestion':
  2492.                 {
  2493.                     $id = (int)($request->get('id') ?? 0);
  2494.                     $message $id $this->vetoadomEntityManager->getRepository(Message::class)->findOneBy(['id' => $id'active' => 1'secteur' => $secteur]) : null;
  2495.                     if (!$message) {
  2496.                         $this->customJsonResponse->setForbidden(true);
  2497.                         $this->customJsonResponse->setField('alert'$this->translator->trans('page_prise_appel_messages.message_unknown', [], 'validators'));
  2498.                         return $this->customJsonResponse->sendResponse();
  2499.                     }
  2500.                     $validators = ['motif'];
  2501.                     $messageMauvaiseGestion = new MessageMauvaiseGestion();
  2502.                     $messageMauvaiseGestion->setMessage($message);
  2503.                     $messageMauvaiseGestion->setSaisieUserId($user->getId());
  2504.                     $messageMauvaiseGestion->setMotif(trim($request->get('mauvaiseGestionMotif') ?? ''));
  2505.                     # messageMauvaiseGestion validation
  2506.                     $errors $this->validator->validate($messageMauvaiseGestion,null$validators);
  2507.                     if ($errors->count()) {
  2508.                         foreach ($errors as $key => $error) {
  2509.                             $propertyPath "messageMauvaiseGestion-{$error->getPropertyPath()}";
  2510.                             if (!$this->customJsonResponse->hasField($propertyPath)) {
  2511.                                 $this->customJsonResponse->setField($propertyPath$error->getMessage());
  2512.                             }
  2513.                         }
  2514.                     }
  2515.                     if ($this->customJsonResponse->hasAnyField()) {
  2516.                         $this->customJsonResponse->setForbidden(true);
  2517.                         return $this->customJsonResponse->sendResponse();
  2518.                     }
  2519.                     $this->vetoadomEntityManager->persist($messageMauvaiseGestion);
  2520.                     $this->vetoadomEntityManager->flush();
  2521.                     # send email
  2522.                     $this->sendEmail->messageMauvaiseGestion($messageMauvaiseGestion);
  2523.                     $this->customJsonResponse->setField('message'$this->translator->trans('page_prise_appel_messages.email_envoye', [], 'messages'));
  2524.                     $this->customJsonResponse->setField('messages'$this->priseAppelHelper->getMessages($secteur));
  2525.                     return $this->customJsonResponse->sendResponse();
  2526.                 }
  2527.                 break;
  2528.             case 'envoyerMessagesTraites':
  2529.                 {
  2530.                     $this->priseAppelHelper->envoyerMessagesTraites($secteur);
  2531.                     $this->customJsonResponse->setField('message'$this->translator->trans('page_prise_appel_messages.emails_envoyes', [], 'messages'));
  2532.                     $this->customJsonResponse->setField('messages'$this->priseAppelHelper->getMessages($secteur));
  2533.                     return $this->customJsonResponse->sendResponse();
  2534.                 }
  2535.                 break;
  2536.             case 'getSecteurContent':
  2537.             case 'saveSecteurContent':
  2538.                 {
  2539.                     $contentField $request->get('contentField') ?? '';
  2540.                     if (
  2541.                         !in_array($contentField,['contentInfosAdmin','contentProcessus','contentContactsUtiles','contentInfosSecteur','contentEstimatifTarifs'])
  2542.                         || ($contentField == 'contentInfosAdmin' && !$this->isGranted('ROLE_ADMIN'))
  2543.                     ) {
  2544.                         $this->customJsonResponse->setForbidden(true);
  2545.                         $this->customJsonResponse->setField('alert'$this->translator->trans('common.action_unknown', [], 'validators'));
  2546.                         return $this->customJsonResponse->sendResponse();
  2547.                     }
  2548.                     if ($action == 'getSecteurContent') {
  2549.                         $this->customJsonResponse->setField('contentFieldValue'$secteur->{'get' ucfirst($contentField)}() ?? '');
  2550.                         return $this->customJsonResponse->sendResponse();
  2551.                     }
  2552.                     $secteur->{'set' ucfirst($contentField)}(trim($request->get('contentFieldValue') ?? ''));
  2553.                     $this->vetoadomEntityManager->flush();
  2554.                     return $this->customJsonResponse->sendResponse();
  2555.                 }
  2556.                 break;
  2557.             case 'getCliniqueMapMarkers':
  2558.                 {
  2559.                     if ($secteur->getFonctionnement()->getCode() != 'clinique') {
  2560.                         $this->customJsonResponse->setForbidden(true);
  2561.                         $this->customJsonResponse->setField('alert'$this->translator->trans('common.action_unknown', [], 'validators'));
  2562.                         return $this->customJsonResponse->sendResponse();
  2563.                     }
  2564.                     $clientVilleId = (int)($request->get('clientVilleId') ?? 0);
  2565.                     $clientNom $request->get('clientNom') ?? '';
  2566.                     $this->customJsonResponse->setField('mapMarkers'$this->priseAppelHelper->getCliniqueMapMarkers($secteur,$clientVilleId,$clientNom));
  2567.                     return $this->customJsonResponse->sendResponse();
  2568.                 }
  2569.                 break;
  2570.             case 'getDomicileConsultationsMapMarkers':
  2571.                 {
  2572.                     $this->customJsonResponse->setField('mapMarkers',$this->priseAppelHelper->getDomicileConsultationsMapMarkers($secteur));
  2573.                     return $this->customJsonResponse->sendResponse();
  2574.                 }
  2575.                 break;
  2576.             case 'consultationConfirmVeterinaireIntervenant':
  2577.                 {
  2578.                     $consultationId = (int)($request->get('id') ?? 0);
  2579.                     $consultation $consultationId $this->vetoadomEntityManager->getRepository(Consultation::class)->findOneBy(['id' => $consultationId'active' => 1'consultationEtat' => 7]) : null;
  2580.                     if (
  2581.                         !$consultation
  2582.                         || $consultation->getAppelAnimal()->getAppel()->getSecteur()->getId() != $secteur->getId()
  2583.                     ) {
  2584.                         $this->customJsonResponse->setForbidden(true);
  2585.                         $this->customJsonResponse->setField('alert'$this->translator->trans('page_prise_appel_resume.consultation_unknown', [], 'validators'));
  2586.                         return $this->customJsonResponse->sendResponse();
  2587.                     }
  2588.                     $consultation->setConsultationEtat($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\ConsultationEtat',3));
  2589.                     $consultationEtatHistorique = new ConsultationEtatHistorique();
  2590.                     $consultationEtatHistorique->setConsultation($consultation);
  2591.                     $consultationEtatHistorique->setConsultationEtat($consultation->getConsultationEtat());
  2592.                     $consultationEtatHistorique->setSaisieUserId($user->getId());
  2593.                     $this->vetoadomEntityManager->persist($consultationEtatHistorique);
  2594.                     $userPositionLog = new UserPositionLog();
  2595.                     $userPositionLog->setConsultation($consultation);
  2596.                     $userPositionLog->setUserId($consultation->getVeterinaireIntervenantId());
  2597.                     $userPositionLog->setPlanningJourId($consultation->getPlanningJourId());
  2598.                     $userPositionLog->setUserPositionLogEtat($this->vetoadomEntityManager->getRepository(UserPositionLogEtat::class)->findOneBy(['id' => 2]));
  2599.                     $userPositionLog->setVille($consultation->getAppelAnimal()->getAppel()->getClient()->getVille());
  2600.                     $this->vetoadomEntityManager->persist($userPositionLog);
  2601.                     $this->vetoadomEntityManager->flush();
  2602.                     $this->customJsonResponse->setField('mapMarkers',$this->priseAppelHelper->getDomicileConsultationsMapMarkers($secteur));
  2603.                     return $this->customJsonResponse->sendResponse();
  2604.                 }
  2605.                 break;
  2606.             case 'saveVetForceEtat':
  2607.                 {
  2608.                     $userId = (int)($request->get('userId') ?? 0);
  2609.                     $userPositionLogLast $userId $this->vetoadomEntityManager->getRepository(UserPositionLog::class)->findOneBy(['userId' => $userId],['id' => 'DESC']) : null;
  2610.                     if (!$userPositionLogLast) {
  2611.                         return $this->customJsonResponse->sendResponse();
  2612.                     }
  2613.                     $userPotitionLogEtatId = (int)($request->get('userPotitionLogEtatId') ?? 0);
  2614.                     $userPotitionLogEtat $userPotitionLogEtatId $this->vetoadomEntityManager->getRepository(UserPositionLogEtat::class)->findOneBy(['id' => $userPotitionLogEtatId]) : null;
  2615.                     if (!$userPotitionLogEtat) {
  2616.                         $this->customJsonResponse->setForbidden(true);
  2617.                         $this->customJsonResponse->setField('vetForce-userPotitionLogEtat'$this->translator->trans('common.blank', [], 'validators'));
  2618.                         return $this->customJsonResponse->sendResponse();
  2619.                     }
  2620.                     $userPositionLog = new UserPositionLog();
  2621.                     $userPositionLog->setUserId($userId);
  2622.                     $userPositionLog->setPlanningJourId($userPositionLogLast->getPlanningJourId());
  2623.                     $userPositionLog->setVille($userPositionLogLast->getVille());
  2624.                     $userPositionLog->setUserPositionLogEtat($userPotitionLogEtat);
  2625.                     $this->vetoadomEntityManager->persist($userPositionLog);
  2626.                     $this->vetoadomEntityManager->flush();
  2627.                     $this->customJsonResponse->setField('mapMarkers',$this->priseAppelHelper->getDomicileConsultationsMapMarkers($secteur));
  2628.                     return $this->customJsonResponse->sendResponse();
  2629.                 }
  2630.                 break;
  2631.             case 'saveVetForcePosition':
  2632.                 {
  2633.                     $userId = (int)($request->get('userId') ?? 0);
  2634.                     $userPositionLogLast $userId $this->vetoadomEntityManager->getRepository(UserPositionLog::class)->findOneBy(['userId' => $userId],['id' => 'DESC']) : null;
  2635.                     if (!$userPositionLogLast) {
  2636.                         return $this->customJsonResponse->sendResponse();
  2637.                     }
  2638.                     $villeId = (int)($request->get('villeId') ?? 0);
  2639.                     $ville $villeId $this->vetoadomEntityManager->getRepository(Ville::class)->findOneBy(['id' => $villeId]) : null;
  2640.                     if (!$ville) {
  2641.                         $this->customJsonResponse->setForbidden(true);
  2642.                         $this->customJsonResponse->setField('vetForce-ville'$this->translator->trans('common.blank', [], 'validators'));
  2643.                         return $this->customJsonResponse->sendResponse();
  2644.                     }
  2645.                     $this->APIlocation->setVilleCoordinates($ville);
  2646.                     $userPositionLog = new UserPositionLog();
  2647.                     $userPositionLog->setUserId($userId);
  2648.                     $userPositionLog->setPlanningJourId($userPositionLogLast->getPlanningJourId());
  2649.                     $userPositionLog->setVille($ville);
  2650.                     $userPositionLog->setUserPositionLogEtat($userPositionLogLast->getUserPositionLogEtat());
  2651.                     $this->vetoadomEntityManager->persist($userPositionLog);
  2652.                     $this->vetoadomEntityManager->flush();
  2653.                     $this->customJsonResponse->setField('mapMarkers',$this->priseAppelHelper->getDomicileConsultationsMapMarkers($secteur));
  2654.                     return $this->customJsonResponse->sendResponse();
  2655.                 }
  2656.                 break;
  2657.             case 'getVetInformationTemporaire':
  2658.                 {
  2659.                     $userId = (int)($request->get('userId') ?? 0);
  2660.                     $this->customJsonResponse->setField('vetInformationTemporaire',$this->priseAppelHelper->getVetInformationTemporaire($userId));
  2661.                     return $this->customJsonResponse->sendResponse();
  2662.                 }
  2663.                 break;
  2664.             case 'saveVetInformationTemporaire':
  2665.                 {
  2666.                     $id = (int)($request->get('id') ?? 0);
  2667.                     $vetInformationTemporaire $this->vetoadomEntityManager->getRepository(UserInformationTemporaire::class)->findOneBy(['id' => $id'active' => 1]) ?? new UserInformationTemporaire();
  2668.                     $validators = ['information'];
  2669.                     $vetInformationTemporaire->setInformation(trim($request->get('information') ?? ''));
  2670.                     $dateDebut = \DateTime::createFromFormat("!Y-m-d"$request->get('dateDebut') ?? '');
  2671.                     $heureDebut = \DateTime::createFromFormat("!H:i"$request->get('heureDebut') ?? '');
  2672.                     if ($dateDebut === false) {
  2673.                         $this->customJsonResponse->setField('vetInformationTemporaire-dateDebut'$this->translator->trans('common.blank', [], 'validators'));
  2674.                     }
  2675.                     if ($heureDebut === false) {
  2676.                         $this->customJsonResponse->setField('vetInformationTemporaire-heureDebut'$this->translator->trans('common.blank', [], 'validators'));
  2677.                     }
  2678.                     $dateFin = \DateTime::createFromFormat("!Y-m-d"$request->get('dateFin') ?? '');
  2679.                     $heureFin = \DateTime::createFromFormat("!H:i"$request->get('heureFin') ?? '');
  2680.                     if ($dateFin === false) {
  2681.                         $this->customJsonResponse->setField('vetInformationTemporaire-dateFin'$this->translator->trans('common.blank', [], 'validators'));
  2682.                     }
  2683.                     if ($heureFin === false) {
  2684.                         $this->customJsonResponse->setField('vetInformationTemporaire-heureFin'$this->translator->trans('common.blank', [], 'validators'));
  2685.                     }
  2686.                     # validation
  2687.                     $errors $this->validator->validate($vetInformationTemporaire,null$validators);
  2688.                     if ($errors->count()) {
  2689.                         foreach ($errors as $key => $error) {
  2690.                             $propertyPath "vetInformationTemporaire-{$error->getPropertyPath()}";
  2691.                             if (!$this->customJsonResponse->hasField($propertyPath)) {
  2692.                                 $this->customJsonResponse->setField($propertyPath$error->getMessage());
  2693.                             }
  2694.                         }
  2695.                     }
  2696.                     if ($this->customJsonResponse->hasAnyField()) {
  2697.                         $this->customJsonResponse->setForbidden(true);
  2698.                         return $this->customJsonResponse->sendResponse();
  2699.                     }
  2700.                     $dateDebut->setTime($heureDebut->format('H'),$heureDebut->format('i'));
  2701.                     $dateFin->setTime($heureFin->format('H'),$heureFin->format('i'));
  2702.                     if ($dateDebut >= $dateFin) {
  2703.                         $this->customJsonResponse->setField('vetInformationTemporaire-dateDebut'$this->translator->trans('page_prise_appel_resume.user_information_temporaire_date_wrong', [], 'validators'));
  2704.                     }
  2705.                     if ($this->customJsonResponse->hasAnyField()) {
  2706.                         $this->customJsonResponse->setForbidden(true);
  2707.                         return $this->customJsonResponse->sendResponse();
  2708.                     }
  2709.                     $vetInformationTemporaire->setDateDebut($dateDebut);
  2710.                     $vetInformationTemporaire->setDateFin($dateFin);
  2711.                     if (!$vetInformationTemporaire->getId()) {
  2712.                         $userId = (int)($request->get('userId') ?? 0);
  2713.                         $vetInformationTemporaire->setUserId($userId);
  2714.                         $this->vetoadomEntityManager->persist($vetInformationTemporaire);
  2715.                     }
  2716.                     $this->vetoadomEntityManager->flush();
  2717.                     $this->customJsonResponse->setField('vetInformationTemporaire',$this->priseAppelHelper->getVetInformationTemporaire($vetInformationTemporaire->getUserId()));
  2718.                     return $this->customJsonResponse->sendResponse();
  2719.                 }
  2720.                 break;
  2721.             case 'supprimerVetInformationTemporaire':
  2722.                 {
  2723.                     $id = (int)($request->get('id') ?? 0);
  2724.                     $vetInformationTemporaire $id $this->vetoadomEntityManager->getRepository(UserInformationTemporaire::class)->findOneBy(['id' => $id'active' => 1]) : null;
  2725.                     if ($vetInformationTemporaire) {
  2726.                         $this->vetoadomEntityManager->remove($vetInformationTemporaire);
  2727.                         $this->vetoadomEntityManager->flush();
  2728.                     }
  2729.                     $this->customJsonResponse->setField('vetInformationTemporaire',$this->priseAppelHelper->getVetInformationTemporaire($vetInformationTemporaire->getUserId()));
  2730.                     return $this->customJsonResponse->sendResponse();
  2731.                 }
  2732.                 break;
  2733.             case 'saveInformationsParticulier':
  2734.                 {
  2735.                     $clientId = (int)($request->get('clientId') ?? 0);
  2736.                     $client $clientId $this->vetoadomEntityManager->getRepository(Client::class)->findOneBy(['id' => $clientId'active' => 1]) : null;
  2737.                     if (!$client) {
  2738.                         $this->customJsonResponse->setForbidden(true);
  2739.                         $this->customJsonResponse->setField('alert'$this->translator->trans('page_prise_appel.client_unknown', [], 'validators'));
  2740.                         return $this->customJsonResponse->sendResponse();
  2741.                     }
  2742.                     $validators = ['informationsParticulier'];
  2743.                     $client->setInformationsParticulier(trim($request->get('informationsParticulier') ?? ''));
  2744.                     # client validation
  2745.                     $errors $this->validator->validate($client,null$validators);
  2746.                     if ($errors->count()) {
  2747.                         foreach ($errors as $key => $error) {
  2748.                             $propertyPath 'client-' $error->getPropertyPath();
  2749.                             if (!$this->customJsonResponse->hasField($propertyPath)) {
  2750.                                 $this->customJsonResponse->setField($propertyPath$error->getMessage());
  2751.                             }
  2752.                         }
  2753.                     }
  2754.                     if ($this->customJsonResponse->hasAnyField()) {
  2755.                         $this->customJsonResponse->setForbidden(true);
  2756.                         return $this->customJsonResponse->sendResponse();
  2757.                     }
  2758.                     $this->vetoadomEntityManager->flush();
  2759.                     return $this->customJsonResponse->sendResponse();
  2760.                 }
  2761.                 break;
  2762.             default:
  2763.             {
  2764.                 $this->customJsonResponse->setForbidden(true);
  2765.                 $this->customJsonResponse->setField('alert'$this->translator->trans('common.action_unknown', [], 'validators'));
  2766.                 return $this->customJsonResponse->sendResponse();
  2767.             }
  2768.         }
  2769.     }
  2770.     /**
  2771.      * @Route("/prise-appel-change-secteur", name="app_prise_appel_change_secteur", methods={"POST"})
  2772.      * @param Request $request
  2773.      * @return Response
  2774.      */
  2775.     public function changeSecteur(Request $request): Response
  2776.     {
  2777.         /** @var User $user */
  2778.         $user $this->getUser();
  2779.         $secteurId = (int)($request->get('secteur') ?? 0);
  2780.         $secteur $secteurId $this->vetoadomEntityManager->getRepository(Secteur::class)->getUserSecteur($user$secteurId) : null;
  2781.         if (!$secteur) {
  2782.             $this->customJsonResponse->setForbidden(true);
  2783.             $this->customJsonResponse->setField('alert'$this->translator->trans('page_prise_appel.secteur_unknown', [], 'validators'));
  2784.             return $this->customJsonResponse->sendResponse();
  2785.         }
  2786.         $tab = (string)$request->get('tab') ?? 'resume';
  2787.         if (!in_array($tab$this->tabs)) {
  2788.             $tab 'resume';
  2789.         }
  2790.         $langue = (string)($request->get('langue') ?? '');
  2791.         $langues $secteur->getLanguesArray();
  2792.         if (!in_array($languearray_column($langues'locale'))) {
  2793.             $langue $langues[0]['locale'];
  2794.         }
  2795.         # save temporary data in session
  2796.         $data = [
  2797.             'appel' => $request->get('appel') ?? [],
  2798.             'client' => $request->get('client') ?? [],
  2799.             'consultationTarifId' => (int)($request->get('consultationTarifId') ?? 0),
  2800.         ];
  2801.         $request->getSession()->set('prise-appel',$data);
  2802.         $redirect $this->urlGenerator->generate('app_prise_appel',['secteurId' => $secteur->getId(), '_locale' => $langue]);
  2803.         $redirect .= "?tab={$tab}";
  2804.         if ($data['appel']['messageId'] ?? 0) {
  2805.             $redirect .= "&messageId={$data['appel']['messageId']}";
  2806.         }
  2807.         else if ($data['appel']['consultationId'] ?? 0) {
  2808.             $redirect .= "&consultationId={$data['appel']['consultationId']}";
  2809.         }
  2810.         $this->customJsonResponse->setRedirect($redirect);
  2811.         return $this->customJsonResponse->sendResponse();
  2812.     }
  2813. }