<?php
namespace App\Controller;
use App\Entity\Planning\PlanningJour;
use App\Entity\Planning\Site;
use App\Entity\Planning\User;
use App\Entity\Vetoadom\Animal;
use App\Entity\Vetoadom\AnimalAgeUnit;
use App\Entity\Vetoadom\AnimalEspece;
use App\Entity\Vetoadom\AnimalRace;
use App\Entity\Vetoadom\AnimalSexe;
use App\Entity\Vetoadom\AnimalSite;
use App\Entity\Vetoadom\Appel;
use App\Entity\Vetoadom\AppelAnimal;
use App\Entity\Vetoadom\ChargeService;
use App\Entity\Vetoadom\Client;
use App\Entity\Vetoadom\ClientSite;
use App\Entity\Vetoadom\Consultation;
use App\Entity\Vetoadom\ConsultationAnimalOperationSpecifique;
use App\Entity\Vetoadom\ConsultationDelaiUrgence;
use App\Entity\Vetoadom\ConsultationEtatHistorique;
use App\Entity\Vetoadom\ConsultationNiveauUrgence;
use App\Entity\Vetoadom\Habitation;
use App\Entity\Vetoadom\JourType;
use App\Entity\Vetoadom\Message;
use App\Entity\Vetoadom\MessageMauvaiseGestion;
use App\Entity\Vetoadom\OperationSpecifique;
use App\Entity\Vetoadom\Referant;
use App\Entity\Vetoadom\Secteur;
use App\Entity\Vetoadom\SecteurCliniqueSecondaire;
use App\Entity\Vetoadom\SecteurConsigne;
use App\Entity\Vetoadom\SecteurForcageChargeService;
use App\Entity\Vetoadom\SecteurForcageTarif;
use App\Entity\Vetoadom\SecteurGammeTarif;
use App\Entity\Vetoadom\SecteurPays;
use App\Entity\Vetoadom\SecteurTextePredefini;
use App\Entity\Vetoadom\SecteurZone;
use App\Entity\Vetoadom\Tarif;
use App\Entity\Vetoadom\TarifConsultation;
use App\Entity\Vetoadom\TarifOperationSpecifique;
use App\Entity\Vetoadom\UserInformationTemporaire;
use App\Entity\Vetoadom\UserPositionLog;
use App\Entity\Vetoadom\UserPositionLogEtat;
use App\Entity\Vetoadom\Variable;
use App\Entity\Vetoadom\Ville;
use App\Service\APIlocation;
use App\Service\CustomJsonResponse;
use App\Service\Misc;
use App\Service\PriseAppelHelper;
use App\Service\SendEmail;
use App\Service\SendSms;
use App\Service\Translation;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Asset\Packages;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Validator\Validator\ValidatorInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
class PriseAppelController extends AbstractController
{
private $APIlocation;
private $customJsonResponse;
private $misc;
private $planningEntityManager;
private $vetoadomEntityManager;
private $translation;
private $translator;
private $urlGenerator;
private $validator;
private $packages;
private $priseAppelHelper;
private $sendEmail;
private $sendSms;
private $tabs = ['resume', 'prise-appel', 'messages', 'carte'];
public function __construct(
APIlocation $APIlocation,
CustomJsonResponse $customJsonResponse,
Misc $misc,
EntityManagerInterface $planningEntityManager,
EntityManagerInterface $vetoadomEntityManager,
Packages $packages,
PriseAppelHelper $priseAppelHelper,
SendEmail $sendEmail,
SendSms $sendSms,
Translation $translation,
TranslatorInterface $translator,
UrlGeneratorInterface $urlGenerator,
ValidatorInterface $validator
)
{
$this->APIlocation = $APIlocation;
$this->customJsonResponse = $customJsonResponse;
$this->misc = $misc;
$this->planningEntityManager = $planningEntityManager;
$this->vetoadomEntityManager = $vetoadomEntityManager;
$this->packages = $packages;
$this->priseAppelHelper = $priseAppelHelper;
$this->sendEmail = $sendEmail;
$this->sendSms = $sendSms;
$this->translation = $translation;
$this->translator = $translator;
$this->urlGenerator = $urlGenerator;
$this->validator = $validator;
}
/**
* @Route("/prise-appel/{secteurId}/{_locale}", name="app_prise_appel", methods={"GET","POST"})
* @param Request $request
* @param string $secteurId
* @param string $_locale
* @return Response
* @throws TransportExceptionInterface
*/
public function index(Request $request, string $secteurId = "0", string $_locale = ''): Response
{
/** @var User $user */
$user = $this->getUser();
$secteurId = (int)$secteurId;
$secteur = $secteurId ? $this->vetoadomEntityManager->getRepository(Secteur::class)->getUserSecteur($user, $secteurId) : null;
if (!$secteur) {
$errorMessage = $this->translator->trans('page_prise_appel.secteur_unknown', [], 'validators');
$redirect = $this->urlGenerator->generate('app_dashboard');
if ($request->isXmlHttpRequest()) {
$this->customJsonResponse->setForbidden(true);
$this->customJsonResponse->setField('alert', $errorMessage);
$this->customJsonResponse->setRedirect($redirect);
return $this->customJsonResponse->sendResponse();
}
return $this->render('error.html.twig', [
'user' => $user,
'errorMessage' => $errorMessage,
'redirect' => $redirect
]);
}
if (!in_array($secteur->getFonctionnement()->getCode(),['domicile','clinique'])) {
$errorMessage = "La prise d'appel est inaccessible ici pour les secteurs de type Alvetis ou Medicphone";
$redirect = $this->urlGenerator->generate('app_dashboard');
if ($request->isXmlHttpRequest()) {
$this->customJsonResponse->setForbidden(true);
$this->customJsonResponse->setField('alert', $errorMessage);
$this->customJsonResponse->setRedirect($redirect);
return $this->customJsonResponse->sendResponse();
}
return $this->render('error.html.twig', [
'user' => $user,
'errorMessage' => $errorMessage,
'redirect' => $redirect
]);
}
if (!$secteur->getPlanning1Id()) {
$errorMessage = $this->translator->trans('page_prise_appel.secteur_is_not_configured', [], 'validators');
$redirect = $this->urlGenerator->generate('app_dashboard');
if ($request->isXmlHttpRequest()) {
$this->customJsonResponse->setForbidden(true);
$this->customJsonResponse->setField('alert', $errorMessage);
$this->customJsonResponse->setRedirect($redirect);
return $this->customJsonResponse->sendResponse();
}
return $this->render('error.html.twig', [
'user' => $user,
'errorMessage' => $errorMessage,
'redirect' => $redirect
]);
}
$tab = (string)$request->get('tab') ?? 'resume';
if (!in_array($tab, $this->tabs)) {
$tab = 'resume';
}
# appel modification
$appel = null;
$messageId = 0;
$consultationId = 0;
$sourceMessage = null;
$sourceConsultation = null;
if ($tab == 'prise-appel') {
$messageId = (int)($request->get('messageId') ?? 0);
$sourceMessage = $messageId
? $this->vetoadomEntityManager->getRepository(Message::class)->findOneBy([
'id' => $messageId,
'messageEtat' => [1,2],
'secteur' => $this->vetoadomEntityManager->getRepository(Secteur::class)->getUserSecteurIds($user)
])
: null;
if (
$messageId
&& !$sourceMessage
) {
$errorMessage = $this->translator->trans('page_prise_appel.appel_unknown', [], 'validators');
$redirect = $this->urlGenerator->generate('app_dashboard');
if ($request->isXmlHttpRequest()) {
$this->customJsonResponse->setForbidden(true);
$this->customJsonResponse->setField('alert', $errorMessage);
$this->customJsonResponse->setRedirect($redirect);
return $this->customJsonResponse->sendResponse();
}
return $this->render('error.html.twig', [
'user' => $user,
'errorMessage' => $errorMessage,
'redirect' => $redirect
]);
}
$consultationId = !$messageId ? ((int)($request->get('consultationId')) ?? 0) : 0;
$sourceConsultation = $consultationId
? $this->vetoadomEntityManager->getRepository(Consultation::class)->findOneBy([
'id' => $consultationId,
'active' => 1
])
: null;
if (
$consultationId
&&
(
!$sourceConsultation
|| !in_array($sourceConsultation->getAppelAnimal()->getAppel()->getSecteur()->getId(), $this->vetoadomEntityManager->getRepository(Secteur::class)->getUserSecteurIds($user))
)
) {
$errorMessage = $this->translator->trans('page_prise_appel.appel_unknown', [], 'validators');
$redirect = $this->urlGenerator->generate('app_dashboard');
if ($request->isXmlHttpRequest()) {
$this->customJsonResponse->setForbidden(true);
$this->customJsonResponse->setField('alert', $errorMessage);
$this->customJsonResponse->setRedirect($redirect);
return $this->customJsonResponse->sendResponse();
}
return $this->render('error.html.twig', [
'user' => $user,
'errorMessage' => $errorMessage,
'redirect' => $redirect
]);
}
$appel = $sourceMessage ? $sourceMessage->getAppel() : ($sourceConsultation ? $sourceConsultation->getAppelAnimal()->getAppel() : null);
}
$params = [];
if ($request->getMethod() == 'GET') {
$sessionData = $request->getSession()->remove('prise-appel') ?? [];
# check secteur locale
$langues = $secteur->getLanguesArray();
if (($langueIndex = array_search($_locale, array_column($langues, 'locale'))) === false) {
return new RedirectResponse($this->urlGenerator->generate('app_prise_appel', ['secteurId' => $secteur->getId(), '_locale' => $langues[0]['locale']]));
}
$params['roles'] = $user->getRoles();
$params['dashboardUrl'] = $this->urlGenerator->generate('app_dashboard');
$params['priseAppelChangeSecteurUrl'] = $this->urlGenerator->generate('app_prise_appel_change_secteur');
$params['clientUrl'] = $this->urlGenerator->generate('app_admin_client');
$params['referantUrl'] = $this->urlGenerator->generate('app_referants_horaries_consignes_fiche');
$params['ckeditorURL'] = $this->getParameter('ckeditor_path');
$params['mapStyle'] = $_ENV['MAP_STYLE'];
// resume
$params['consultations'] = [];
$params['consultationNiveauUrgence'] = [];
foreach ($this->vetoadomEntityManager->getRepository(ConsultationNiveauUrgence::class)->findAll() as $item) {
$params['consultationNiveauUrgence'][] = [
'id' => $item->getId(),
'nom' => $this->translator->trans('consultation_niveau_urgence.' . $item->getCode(), [], 'messages'),
'code' => $item->getCode()
];
}
// messages
$params['messages'] = [];
// carte
if ($secteur->getFonctionnement()->getCode() == 'domicile') {
$params['userPositionLogEtat'] = [];
foreach ($this->vetoadomEntityManager->getRepository(UserPositionLogEtat::class)->findAll() as $item) {
$params['userPositionLogEtat'][] = [
'id' => $item->getId(),
'nom' => $this->translator->trans('user_position_log_etat.'.$item->getCode(),[],'messages')
];
}
}
// prise-appel
$veterinairesPlanning = $this->priseAppelHelper->getVeterinairesPlanning($secteur);
# appel
$params['appel'] = $sessionData['appel'] ?? $this->priseAppelHelper->getAppel($appel);
# appel modification
$params['appel']['messageId'] = $messageId;
$params['appel']['consultationId'] = $consultationId;
if ($params['appel']['messageId']) {
$params['appel']['messageEtatId'] = $sourceMessage->getMessageEtat()->getId();
$params['appel']['actions'] = $this->isGranted('ROLE_ADMIN') || in_array($user->getId(),array_column($veterinairesPlanning,'id')) ? 'admin' : 'user';
}
# set secteur ville coordinates
if ($secteur->getVille()) {
$secteur->setVille($this->APIlocation->setVilleCoordinates($secteur->getVille()));
}
$params['secteur'] = [
'id' => $secteur->getId(),
'nom' => $secteur->getNom(),
'couleur' => $secteur->getCouleur(),
'fonctionnementCode' => $secteur->getFonctionnement()->getCode(),
'adresse1' => $secteur->getAdresse1() ?? '',
'villeNom' => $secteur->getVille() ? $secteur->getVille()->getNom() : '',
'villeCp' => $secteur->getVille() ? $secteur->getVille()->getCp() : '',
'villeLat' => $secteur->getVille() ? $secteur->getVille()->getLat() : null,
'villeLon' => $secteur->getVille() ? $secteur->getVille()->getLon() : null,
'paysNom' => $secteur->getVille() ? $secteur->getVille()->getPays()->getNom() : '',
'uniteDeplacement' => $secteur->getVille() ? $secteur->getVille()->getPays()->getUniteDeplacement() : '',
'langue' => $_locale,
'timezone' => 'UTC',
'planningAstreinteChirurgie' => [],
'planningVetCoach' => [],
'consultationTarifId' => 0,
'consultationTarifs' => [],
'consignes' => $this->vetoadomEntityManager->getRepository(SecteurConsigne::class)->getSecteurConsignes($secteur->getId()),
'langues' => $langues,
'langueIndex' => $langueIndex,
'pays' => $this->vetoadomEntityManager->getRepository(SecteurPays::class)->getSecteurPaysArray($secteur->getId()),
'referant' => $secteur->getReferant() ? $secteur->getReferant()->getId() : 0,
'referantNom' => $secteur->getReferant() ? $secteur->getReferant()->getNom() : '',
'secteurTextePredefini' => [],
'secteurCategoriesPoidsEspece' => [],
'secteurZone' => null,
'cliniquesSecondaire' => [],
'stats' => $this->priseAppelHelper->getSecteurStats($secteur),
'tarifOperationSpecifique' => [],
'tab' => $tab,
];
if ($secteur->getFonctionnement()->getCode() == 'clinique') {
foreach ($this->vetoadomEntityManager->getRepository(SecteurCliniqueSecondaire::class)->findBy(['secteur' => $secteur, 'active' => 1]) as $secteurCliniqueSecondaire) {
$secteurCliniqueSecondaire->setVille($this->APIlocation->setVilleCoordinates($secteurCliniqueSecondaire->getVille()));
$params['secteur']['cliniquesSecondaire'][] = [
'id' => $secteurCliniqueSecondaire->getId(),
'nom' => $secteurCliniqueSecondaire->getNom(),
'villeLat' => $secteurCliniqueSecondaire->getVille()->getLat(),
'villeLon' => $secteurCliniqueSecondaire->getVille()->getLon(),
];
}
}
# for clock display
foreach ($secteur->getSecteurPaysCollection() as $secteurPays) {
$params['secteur']['timezone'] = $secteurPays->getPays()->getFuseauHoraire()->getCode();
break;
}
# planning_text
$currentDateTime = new \DateTimeImmutable();
$params['planning_text'] = [];
$params['currentVets'] = [];
if ($secteur->getPlanning1Id()) {
$planning1 = $this->planningEntityManager->getRepository(Site::class)->findOneBy(['id' => $secteur->getPlanning1Id()]);
$planning1CurrentVetsNumber = $this->planningEntityManager->getRepository(PlanningJour::class)->getCurrentVetsNumber($secteur->getPlanning1Id(),$currentDateTime->format('Y-m-d H:i:s'));
if ($planning1NextVetsChangeTime = $this->planningEntityManager->getRepository(PlanningJour::class)->getNextVetsChangeTime($secteur->getPlanning1Id())) {
$planning1NextVetsChangeTimeFormatted = (new \DateTime($planning1NextVetsChangeTime['nextVetsChangeTime']))->format('H:i');
$planning1NextVetsNumber = $this->planningEntityManager->getRepository(PlanningJour::class)->getCurrentVetsNumber($secteur->getPlanning1Id(),$planning1NextVetsChangeTime['nextVetsChangeTime']);
}
else {
$planning1NextVetsChangeTimeFormatted = '--:--';
$planning1NextVetsNumber['vetsNumber'] = 0;
}
$params['planning_text'][] = $this->translator->trans(
'page_prise_appel.planning_text',
[
'{{planningNom}}' => $planning1->getNom(),
'{{currentVetsNumber}}' => $planning1CurrentVetsNumber['vetsNumber'],
'{{nextVetsChangeTime}}' => $planning1NextVetsChangeTimeFormatted,
'{{nextVetsNumber}}' => $planning1NextVetsNumber['vetsNumber']
],
'messages'
);
$params['currentVets'] = array_merge(
$params['currentVets'],
$this->planningEntityManager->getRepository(PlanningJour::class)->getCurrentVetsList($secteur->getPlanning1Id(),$currentDateTime->format('Y-m-d H:i:s'))
);
}
if ($secteur->getPlanning2Id()) {
$planning2 = $this->planningEntityManager->getRepository(Site::class)->findOneBy(['id' => $secteur->getPlanning2Id()]);
$planning2CurrentVetsNumber = $this->planningEntityManager->getRepository(PlanningJour::class)->getCurrentVetsNumber($secteur->getPlanning2Id(),$currentDateTime->format('Y-m-d H:i:s'));
if ($planning2NextVetsChangeTime = $this->planningEntityManager->getRepository(PlanningJour::class)->getNextVetsChangeTime($secteur->getPlanning2Id())) {
$planning2NextVetsChangeTimeFormatted = (new \DateTime($planning2NextVetsChangeTime['nextVetsChangeTime']))->format('H:i');
$planning2NextVetsNumber = $this->planningEntityManager->getRepository(PlanningJour::class)->getCurrentVetsNumber($secteur->getPlanning2Id(),$planning2NextVetsChangeTime['nextVetsChangeTime']);
}
else {
$planning2NextVetsChangeTimeFormatted = '--:--';
$planning2NextVetsNumber['vetsNumber'] = 0;
}
$params['planning_text'][] = $this->translator->trans(
'page_prise_appel.planning_text',
[
'{{planningNom}}' => $planning2->getNom(),
'{{currentVetsNumber}}' => $planning2CurrentVetsNumber['vetsNumber'],
'{{nextVetsChangeTime}}' => $planning2NextVetsChangeTimeFormatted,
'{{nextVetsNumber}}' => $planning2NextVetsNumber['vetsNumber']
],
'messages'
);
$params['currentVets'] = array_merge(
$params['currentVets'],
$this->planningEntityManager->getRepository(PlanningJour::class)->getCurrentVetsList($secteur->getPlanning2Id(),$currentDateTime->format('Y-m-d H:i:s'))
);
}
# planningSuperviseur
$params['secteur']['planningSuperviseur'] = $this->priseAppelHelper->getPlanningSuperviseur($secteur);
# planningRegulateur
$params['secteur']['planningRegulateur'] = $this->priseAppelHelper->getPlanningRegulateur($secteur);
if (!$params['secteur']['planningRegulateur']) {
$params['secteur']['planningRegulateur'] = $params['secteur']['planningSuperviseur'];
}
# planningAstreinteChirurgie
if ($secteur->getAstreinteChirurgiePlanningId()) {
$params['secteur']['planningAstreinteChirurgie'] = $this->planningEntityManager->getRepository(PlanningJour::class)->getAstreinteChirurgie($secteur->getAstreinteChirurgiePlanningId());
}
# planningVetCoach
if ($secteur->getVetcoachPlanningId()) {
$params['secteur']['planningVetCoach'] = $this->planningEntityManager->getRepository(PlanningJour::class)->getVetCoach($secteur->getVetcoachPlanningId());
}
# veterinairesPlanning
$params['secteur']['veterinairesPlanning'] = $veterinairesPlanning;
# light
$secteurForcageChargeService = $this->vetoadomEntityManager->getRepository(SecteurForcageChargeService::class)->findOneBy(['secteur' => $secteur, 'dateSuppression' => null]);
if ($secteurForcageChargeService) {
$params['secteur']['light'] = $secteurForcageChargeService->getChargeService()->getCouleur();
} else {
$lightConsultations = $this->vetoadomEntityManager->getRepository(Consultation::class)->getLightConsultations($secteur->getId());
$lightCode = (
count($params['currentVets']) == 0
|| ($lightConsultations['consultationsNumber'] / count($params['currentVets'])) > $secteur->getCoeffFeux()
) ? 'orange' : 'green';
$params['secteur']['light'] = $this->vetoadomEntityManager->getRepository(ChargeService::class)->findOneBy(['code' => $lightCode])->getCouleur();
}
# new appel
if (!$params['appel']['id']) {
$params['regulateurs'] = [];
foreach ($this->priseAppelHelper->getPlanningRegulateur($secteur,true) as $item) {
$params['regulateurs'][$item['id']] = [
'userId' => $item['id'],
'userNom' => $item['nom'],
'userPrenom' => $item['prenom'],
];
}
foreach ($this->planningEntityManager->getRepository(User::class)->getVeterinairesPlanning([$secteur->getSupervisionPlanningId()]) as $item) {
if (array_key_exists($item['id'],$params['regulateurs'])) continue;
$params['regulateurs'][$item['id']] = [
'userId' => $item['id'],
'userNom' => $item['userNom'],
'userPrenom' => $item['userPrenom'],
];
}
foreach ($params['secteur']['veterinairesPlanning'] as $item) {
if (array_key_exists($item['id'],$params['regulateurs'])) continue;
if (!in_array($item['role'],['ADMIN','SUPERADMIN'])) continue;
$params['regulateurs'][$item['id']] = [
'userId' => $item['id'],
'userNom' => $item['userNom'],
'userPrenom' => $item['userPrenom'],
];
}
$params['regulateurs'] = array_values($params['regulateurs']);
$userNoms = array_column($params['regulateurs'],'userNom');
$userPrenoms = array_column($params['regulateurs'],'userPrenom');
array_multisort($userNoms,SORT_ASC,$userPrenoms,SORT_ASC,$params['regulateurs']);
if (count($params['secteur']['planningRegulateur'])) {
$params['appel']['regulateurId'] = $params['secteur']['planningRegulateur'][0]['id'];
}
}
# consultation
$jourTypeId = $this->vetoadomEntityManager->getRepository(JourType::class)->getJourType();
$params['tarifs'] = [];
foreach ($this->vetoadomEntityManager->getRepository(Tarif::class)->findBy(['active' => 1]) as $tarif) {
$params['tarifs'][] = [
'id' => $tarif->getId(),
'nom' => $this->translator->trans('tarif.'.$tarif->getCode(), [], 'messages'),
];
}
if ($this->vetoadomEntityManager->getRepository(Tarif::class)->checkFilledAllSecteurTarifs($secteur->getId())) {
$secteurForcageTarif = $this->vetoadomEntityManager->getRepository(SecteurForcageTarif::class)->getCurrentForcageTarif($secteur->getId());
if ($secteurForcageTarif) {
$params['secteur']['consultationTarifId'] = $secteurForcageTarif->getTarif()->getId();
}
else if ($tarif = $this->vetoadomEntityManager->getRepository(SecteurGammeTarif::class)->getTarif($secteur->getId(), $jourTypeId)) {
$params['secteur']['consultationTarifId'] = $tarif['id'];
}
if ($params['secteur']['consultationTarifId']) {
foreach ($this->vetoadomEntityManager->getRepository(TarifConsultation::class)->findBy(['secteur' => $secteur]) as $tarifConsultation) {
$params['secteur']['consultationTarifs'][] = [
'tarif' => $tarifConsultation->getTarif()->getId(),
'pays' => $tarifConsultation->getPays()->getId(),
'prix' => (float)$tarifConsultation->getPrix()
];
}
}
}
if (!empty($sessionData['consultationTarifId'])) {
$params['secteur']['consultationTarifId'] = $sessionData['consultationTarifId'];
}
# clinique secteurZone
if ($secteur->getFonctionnement()->getCode() == 'clinique') {
if ($secteur->getSecteurZoneCollection()->count()) {
/** @var SecteurZone $secteurZone */
$secteurZone = $secteur->getSecteurZoneCollection()->first();
$params['secteur']['secteurZone']['textPriseAppel'] = $langueIndex == 0 ? $secteurZone->getTextPriseAppelLangue1() : $secteurZone->getTextPriseAppelLangue2();
}
}
# secteurTextePredefini
foreach ($this->vetoadomEntityManager->getRepository(SecteurTextePredefini::class)->findBy(['secteur' => $secteur->getId(), 'langue' => $langues[$langueIndex]['id'], 'active' => 1]) as $secteurTextePredefini) {
$params['secteur']['secteurTextePredefini'][] = [
'typeCode' => $secteurTextePredefini->getSecteurTextePredefiniType()->getCode(),
'texteCourt' => $secteurTextePredefini->getTexteCourt(),
'texteLong' => $secteurTextePredefini->getTexteLong(),
];
}
# tarifOperationSpecifique
foreach ($secteur->getSecteurCategoriePoidsEspeceCollection() as $secteurCategoriePoidsEspece) {
$params['secteur']['secteurCategoriesPoidsEspece'][] = [
'id' => $secteurCategoriePoidsEspece->getId(),
'secteurEspece' => $secteurCategoriePoidsEspece->getSecteurEspece()->getId(),
'secteurEspeceNom' => $this->translator->trans('secteur_espece.' . $secteurCategoriePoidsEspece->getSecteurEspece()->getCode(), [], 'messages'),
'min' => $secteurCategoriePoidsEspece->getMin(),
'max' => $secteurCategoriePoidsEspece->getMax()
];
}
if ($params['secteur']['consultationTarifId']) {
foreach ($this->vetoadomEntityManager->getRepository(TarifOperationSpecifique::class)->findBy(['secteur' => $secteur, 'tarif' => $params['secteur']['consultationTarifId']]) as $tarifOperationSpecifique) {
$params['secteur']['tarifOperationSpecifique'][] = [
'id' => $tarifOperationSpecifique->getId(),
'pays' => $tarifOperationSpecifique->getPays()->getId(),
'operationSpecifiqueCode' => $tarifOperationSpecifique->getOperationSpecifique()->getCode(),
'secteurCategoriePoidsEspece' => $tarifOperationSpecifique->getSecteurCategoriePoidsEspece()->getId(),
'prix' => (float)$tarifOperationSpecifique->getPrix()
];
}
}
# pays
foreach ($params['secteur']['pays'] as &$pays) {
$pays['flag'] = $this->packages->getUrl("build/images/flag/${pays['id']}.png");
}
# client search
$params['clientSearch'] = [
'pays' => $params['secteur']['pays'][0]['id'],
'indicatif' => $params['secteur']['pays'][0]['indicatif'],
'searchClientTelephoneTimer' => null,
'telephone' => '',
'searchClientNomTimer' => null,
'nom' => '',
'ville' => 0,
'villeCp' => '',
'villeSearchStarted' => false,
'villeSearchTimer' => null,
'villes' => [],
'externeId' => '',
'clients' => [],
'searchClientStarted' => false,
];
# client
$params['client'] = $sessionData['client'] ?? $this->priseAppelHelper->getClient($params['appel']['clientId'],$params['appel']['id']);
$params['habitation'] = [];
foreach ($this->vetoadomEntityManager->getRepository(Habitation::class)->findAll() as $item) {
$params['habitation'][] = [
'id' => $item->getId(),
'nom' => $this->translator->trans('habitation.' . $item->getCode(), [], 'messages'),
];
}
$params['animalEspece'] = [];
foreach ($this->vetoadomEntityManager->getRepository(AnimalEspece::class)->findAll() as $item) {
$params['animalEspece'][] = [
'id' => $item->getId(),
'code' => $item->getCode(),
'nom' => $this->translator->trans('animal_espece.' . $item->getCode(), [], 'messages'),
];
}
$params['animalRace'] = [];
foreach ($this->vetoadomEntityManager->getRepository(AnimalRace::class)->findAll() as $item) {
$params['animalRace'][] = [
'id' => $item->getId(),
'code' => $item->getCode(),
'animalEspece' => $item->getAnimalEspece()->getId(),
'nom' => $this->translator->trans('animal_race.' . $item->getCode(), [], 'messages'),
];
}
$params['animalSexe'] = [];
foreach ($this->vetoadomEntityManager->getRepository(AnimalSexe::class)->findAll() as $item) {
$params['animalSexe'][] = [
'id' => $item->getId(),
'nom' => $this->translator->trans('animal_sexe.' . $item->getCode(), [], 'messages'),
];
}
$params['animalAgeUnit'] = [];
foreach ($this->vetoadomEntityManager->getRepository(AnimalAgeUnit::class)->findAll() as $item) {
$params['animalAgeUnit'][] = [
'code' => $item->getCode(),
'nom' => $this->translator->trans('animal_age_unit.' . $item->getCode(), [], 'messages'),
];
}
# referant
$params['jourTypes'] = [];
foreach ($this->vetoadomEntityManager->getRepository(JourType::class)->findBy(['formulaireReferant' => 1]) as $jourType) {
$params['jourTypes'][] = [
'id' => $jourType->getId(),
'nom' => $this->translator->trans('jour.' . $jourType->getCode(), [], 'messages'),
];
}
# infoConsultation
# get consultation for modification or use new one
if ($messageId) {
$sourceConsultation = $sourceMessage->getConsultation() ?? new Consultation();
}
else if (!$sourceConsultation) {
$sourceConsultation = new Consultation();
}
$params['infoConsultation'] = [
'infoArv' => $sourceConsultation->getInfoArv() ?? '',
'veterinaireIntervenant' => null,
'dateMin' => $sourceConsultation->getDateCreation() ? $sourceConsultation->getDateCreation()->format('Y-m-d') : $currentDateTime->format('Y-m-d'),
];
if ($sourceConsultation->getVeterinaireIntervenantId()) {
foreach ($params['secteur']['veterinairesPlanning'] as $veterinaireIntervenant) {
if ($sourceConsultation->getVeterinaireIntervenantId() != $veterinaireIntervenant['id']) continue;
$params['infoConsultation']['veterinaireIntervenant'] = $veterinaireIntervenant;
break;
}
}
$variableEmplacements = [];
if (!count($params['currentVets'])) {
$params['infoConsultationTextTemplate'] = $secteur->{'getTexteSansLangue'.($langueIndex + 1)}() ?? '';
$variableEmplacements[] = 'secteur_text_sans_veterinaire';
}
else if (count($params['currentVets']) == 1) {
$params['infoConsultationTextTemplate'] = $secteur->{'getTexteMonoLangue'.($langueIndex + 1)}() ?? '';
$variableEmplacements[] = 'secteur_text_mono_veterinaire';
}
else {
$params['infoConsultationTextTemplate'] = $secteur->{'getTexteMultiLangue'.($langueIndex + 1)}() ?? '';
$variableEmplacements[] = 'secteur_text_multi_veterinaire';
}
$params['infoConsultationTextVariables'] = [];
foreach ($this->vetoadomEntityManager->getRepository(Variable::class)->getVariables($variableEmplacements) as $variable) {
$params['infoConsultationTextVariables'][] = $variable->getCode();
}
if ($params['secteur']['fonctionnementCode'] == 'domicile') {
# ConsultationDelaiUrgence
$params['consultationDelaiUrgence'] = [];
foreach ($this->vetoadomEntityManager->getRepository(ConsultationDelaiUrgence::class)->findAll() as $item) {
$params['consultationDelaiUrgence'][] = [
'id' => $item->getId(),
'code' => $item->getCode(),
'nom' => $this->translator->trans('consultation_delai_urgence.' . $item->getCode(), [], 'messages'),
];
if (
(
$secteur->getSecteurDelaiDefaut()->getCode() == 'dans_heure'
&& $item->getCode() == 'dans_heure'
)
||
(
$secteur->getSecteurDelaiDefaut()->getCode() == 'aucun'
&& $item->getCode() == 'delai_a_preciser'
)
) {
$params['infoConsultation']['delaiUrgenceCode'] = $item->getCode();
}
}
if ($sourceConsultation->getConsultationDelaiUrgence()) {
$params['infoConsultation']['delaiUrgenceCode'] = $sourceConsultation->getConsultationDelaiUrgence()->getCode();
}
$params['infoConsultation']['debutHeure'] = $sourceConsultation->getDebutConsultation() ? $sourceConsultation->getDebutConsultation()->format('H:i') : '';
$params['infoConsultation']['finHeure'] = $sourceConsultation->getFinConsultation() ? $sourceConsultation->getFinConsultation()->format('H:i') : '';
$params['infoConsultation']['date'] = $sourceConsultation->getDebutConsultation() ? $sourceConsultation->getDebutConsultation()->format('Y-m-d') : '';
}
else {
$params['infoConsultation']['heure'] = $sourceConsultation->getDebutConsultation() ? $sourceConsultation->getDebutConsultation()->format('H:i') : '';
$params['infoConsultation']['date'] = $sourceConsultation->getDebutConsultation() ? $sourceConsultation->getDebutConsultation()->format('Y-m-d') : $currentDateTime->format('Y-m-d');
}
// scripts translation
$domainContext = [
'scripts' => [
'alert_modal',
'error_alert_modal',
'page_prise_appel',
'page_prise_appel_referant',
'page_prise_appel_animal',
'page_prise_appel_carte',
'consultation_etat_historique_modal',
'consultation_supprimer_modal',
'consultation_eta_modal',
'consultation_niveau_urgence_modal',
'consultation_en_cours_clinique_modal',
'consultation_en_cours_clinique_next_etat_modal',
'consultation_demande_de_nouvelles_modal',
'message_supprimer_modal',
'message_mauvaise_gestion_modal',
'secteur_content_modal',
'vet_force_modal',
'vet_information_temporaire_modal'
],
'validators' => [
'common',
'documents',
],
];
$params['trans'] = $this->translation->getTranslation($domainContext);
return $this->render(
'prise-appel.html.twig',
[
'user' => $user,
'params' => $params
]
);
}
# POST
$action = $request->get('action');
switch ($action) {
case 'getResume':
{
$this->customJsonResponse->setField('consultations', $this->priseAppelHelper->getResumeConsultations($secteur));
return $this->customJsonResponse->sendResponse();
}
break;
case 'getConsultationEtatHistorique':
{
$consultationId = (int)($request->get('id') ?? 0);
$this->customJsonResponse->setField('consultationEtatHistorique', $this->priseAppelHelper->getConsultationEtatHistorique($secteur, $consultationId));
return $this->customJsonResponse->sendResponse();
}
break;
case 'consultationSupprimer':
{
if (
!$this->isGranted('ROLE_ADMIN')
&& !$this->isGranted('ROLE_ARV')
&& !$this->isGranted('ROLE_ASV')
) {
$this->customJsonResponse->setForbidden(true);
$this->customJsonResponse->setField('alert', $this->translator->trans('common.action_unknown', [], 'validators'));
return $this->customJsonResponse->sendResponse();
}
$consultationId = (int)($request->get('id') ?? 0);
$consultation = $consultationId ? $this->vetoadomEntityManager->getRepository(Consultation::class)->findOneBy(['id' => $consultationId, 'active' => 1]) : null;
if (
!$consultation
|| $consultation->getAppelAnimal()->getAppel()->getSecteur()->getId() != $secteur->getId()
|| $consultation->getConsultationEtat()->getCode() == 'comptes_rendus_a_rediger'
) {
$this->customJsonResponse->setForbidden(true);
$this->customJsonResponse->setField('alert', $this->translator->trans('page_prise_appel_resume.consultation_unknown', [], 'validators'));
return $this->customJsonResponse->sendResponse();
}
$validators = ['motifSuppression'];
$consultation->setActive(0);
$consultation->setDateSuppression(new \DateTime());
$consultation->setUserSuppressionId($user->getId());
$consultation->setMotifSuppression(trim($request->get('motifSuppression') ?? ''));
# consultation validation
$errors = $this->validator->validate($consultation,null, $validators);
if ($errors->count()) {
foreach ($errors as $key => $error) {
$propertyPath = "consultation-{$error->getPropertyPath()}";
if (!$this->customJsonResponse->hasField($propertyPath)) {
$this->customJsonResponse->setField($propertyPath, $error->getMessage());
}
}
}
if ($this->customJsonResponse->hasAnyField()) {
$this->customJsonResponse->setForbidden(true);
return $this->customJsonResponse->sendResponse();
}
# consultation = en_cours
# free veterinaire
if (
$consultation->getConsultationEtat()->getId() == 3
&& $consultation->getVeterinaireIntervenantId()
&& $consultation->getPlanningJourId()
) {
$userPositionLog = $this->vetoadomEntityManager->getRepository(UserPositionLog::class)->findOneBy(
[
'consultation' => $consultation,
'userId' => $consultation->getVeterinaireIntervenantId(),
'planningJourId' => $consultation->getPlanningJourId()
],
['id' => 'DESC']
);
if ($userPositionLog) {
$this->vetoadomEntityManager->remove($userPositionLog);
}
}
# message
$message = new Message();
$message->setAppel($consultation->getAppelAnimal()->getAppel());
$message->setMessageEtat($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\MessageEtat', 2));
$message->setMessageOrigine($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\MessageOrigine', 3));
$message->setContenu(
$this->translator->trans('page_prise_appel_resume.supprimer_message_contenu',
[
'{{ dateDebut }}' => $consultation->getDebutConsultation()->format('d/m/Y'),
'{{ heureDebut }}' => $consultation->getDebutConsultation()->format('H:i'),
'{{ dateSuppression }}' => $consultation->getDateSuppression()->format('d/m/Y'),
'{{ heureSuppression }}' => $consultation->getDateSuppression()->format('H:i'),
'{{ motifAppel }}' => $consultation->getAppelAnimal()->getAppel()->getMotifAppel(),
'{{ motifSuppression }}' => $consultation->getMotifSuppression()
],
'messages'
)
);
$message->setReferant($consultation->getAppelAnimal()->getAppel()->getReferant());
$message->setSecteur($secteur);
$message->setSaisieUserId($user->getId());
$message->setConsultation($consultation);
$this->vetoadomEntityManager->persist($message);
$this->vetoadomEntityManager->flush();
# send email
$emails = $this->sendEmail->supprimerConsultation($consultation);
$this->customJsonResponse->setField('message', $this->translator->trans('page_prise_appel.success_supprimer_consultation', ['{{emails}}' => $emails], 'messages'));
$this->customJsonResponse->setField('consultations', $this->priseAppelHelper->getResumeConsultations($secteur));
return $this->customJsonResponse->sendResponse();
}
break;
case 'saveConsultationETA':
{
$consultationId = (int)($request->get('id') ?? 0);
$consultation = $consultationId ? $this->vetoadomEntityManager->getRepository(Consultation::class)->findOneBy(['id' => $consultationId, 'active' => 1]) : null;
if (
!$consultation
|| $consultation->getAppelAnimal()->getAppel()->getSecteur()->getId() != $secteur->getId()
|| $consultation->getConsultationEtat()->getCode() != 'en_attente'
) {
$this->customJsonResponse->setForbidden(true);
$this->customJsonResponse->setField('alert', $this->translator->trans('page_prise_appel_resume.consultation_unknown', [], 'validators'));
return $this->customJsonResponse->sendResponse();
}
$veterinaireIntervenantId = (int)($request->get('veterinaireIntervenantId') ?? 0);
if (!$veterinaireIntervenantId) {
$this->customJsonResponse->setField('consultation-veterinaireIntervenantId', $this->translator->trans('common.blank', [], 'validators'));
}
else {
$currentDateTime = new \DateTimeImmutable();
// vets
$siteIds = [];
$siteIds[] = $secteur->getPlanning1Id();
if ($secteur->getPlanning2Id()) {
$siteIds[] = $secteur->getPlanning2Id();
}
$currentVets = $this->planningEntityManager->getRepository(PlanningJour::class)->getCurrentVetsMapList($siteIds,$currentDateTime);
if (($currentVetIndex = array_search($veterinaireIntervenantId,array_column($currentVets,'userId'))) === false ) {
$this->customJsonResponse->setField('consultation-veterinaireIntervenantId', $this->translator->trans('common.blank', [], 'validators'));
}
else {
$consultation->setPlanningJourId($currentVets[$currentVetIndex]['planningJourId']);
}
}
$dateEta = \DateTime::createFromFormat("!Y-m-d", $request->get('dateEta') ?? '');
$heureEta = \DateTime::createFromFormat("!H:i", $request->get('heureEta') ?? '');
if ($dateEta === false && $heureEta !== false) {
$this->customJsonResponse->setField('consultation-dateEta', $this->translator->trans('common.blank', [], 'validators'));
}
if ($dateEta !== false && $heureEta === false) {
$this->customJsonResponse->setField('consultation-heureEta', $this->translator->trans('common.blank', [], 'validators'));
}
if (
$dateEta !== false
&& $heureEta !== false
) {
$dateEta->setTime($heureEta->format('H'),$heureEta->format('i'));
if ($dateEta < new \DateTime(date('Y-m-d H:i:00'))) {
$this->customJsonResponse->setField('alert', $this->translator->trans('page_prise_appel_resume.date_eta_wrong', [], 'validators'));
}
$consultation->setDateEta($dateEta);
}
else {
$consultation->setDateEta(null);
}
if ($this->customJsonResponse->hasAnyField()) {
$this->customJsonResponse->setForbidden(true);
return $this->customJsonResponse->sendResponse();
}
$consultation->setVeterinaireIntervenantId($veterinaireIntervenantId);
$consultation->setConsultationEtat($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\ConsultationEtat',7));
$consultationEtatHistorique = new ConsultationEtatHistorique();
$consultationEtatHistorique->setConsultation($consultation);
$consultationEtatHistorique->setConsultationEtat($consultation->getConsultationEtat());
$consultationEtatHistorique->setSaisieUserId($user->getId());
$this->vetoadomEntityManager->persist($consultationEtatHistorique);
$this->vetoadomEntityManager->flush();
$source = $request->get('source') ?? 'resume';
if ($source == 'resume') {
$this->customJsonResponse->setField('consultations', $this->priseAppelHelper->getResumeConsultations($secteur));
}
else if ($source == 'map') {
$this->customJsonResponse->setField('mapMarkers', $this->priseAppelHelper->getDomicileConsultationsMapMarkers($secteur));
}
return $this->customJsonResponse->sendResponse();
}
break;
case 'consultationEnAttente':
{
$consultationId = (int)($request->get('id') ?? 0);
$consultation = $consultationId ? $this->vetoadomEntityManager->getRepository(Consultation::class)->findOneBy(['id' => $consultationId, 'active' => 1]) : null;
if (
!$consultation
|| $consultation->getAppelAnimal()->getAppel()->getSecteur()->getId() != $secteur->getId()
|| $consultation->getConsultationEtat()->getCode() != 'transmises'
) {
$this->customJsonResponse->setForbidden(true);
$this->customJsonResponse->setField('alert', $this->translator->trans('page_prise_appel_resume.consultation_unknown', [], 'validators'));
return $this->customJsonResponse->sendResponse();
}
$consultation->setConsultationEtat($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\ConsultationEtat',6));
$consultationEtatHistorique = new ConsultationEtatHistorique();
$consultationEtatHistorique->setConsultation($consultation);
$consultationEtatHistorique->setConsultationEtat($consultation->getConsultationEtat());
$consultationEtatHistorique->setSaisieUserId($user->getId());
$this->vetoadomEntityManager->persist($consultationEtatHistorique);
$this->vetoadomEntityManager->flush();
$this->customJsonResponse->setField('consultations', $this->priseAppelHelper->getResumeConsultations($secteur));
return $this->customJsonResponse->sendResponse();
}
break;
case 'consultationEnCours':
{
$consultationId = (int)($request->get('id') ?? 0);
$consultation = $consultationId ? $this->vetoadomEntityManager->getRepository(Consultation::class)->findOneBy(['id' => $consultationId, 'active' => 1]) : null;
if (
!$consultation
|| $consultation->getAppelAnimal()->getAppel()->getSecteur()->getId() != $secteur->getId()
|| !in_array($consultation->getConsultationEtat()->getCode(),['transmises','patients_hospitalises'])
) {
$this->customJsonResponse->setForbidden(true);
$this->customJsonResponse->setField('alert', $this->translator->trans('page_prise_appel_resume.consultation_unknown', [], 'validators'));
return $this->customJsonResponse->sendResponse();
}
if (
$consultation->getAppelAnimal()->getAppel()->getSecteur()->getFonctionnement()->getCode() == 'domicile'
&& $consultation->getConsultationEtat()->getCode() == 'transmises'
) {
$userPositionLog = new UserPositionLog();
$userPositionLog->setConsultation($consultation);
$userPositionLog->setUserId($consultation->getVeterinaireIntervenantId());
$userPositionLog->setPlanningJourId($consultation->getPlanningJourId());
$userPositionLog->setUserPositionLogEtat($this->vetoadomEntityManager->getRepository(UserPositionLogEtat::class)->findOneBy(['id' => 2]));
$userPositionLog->setVille($consultation->getAppelAnimal()->getAppel()->getClient()->getVille());
$this->vetoadomEntityManager->persist($userPositionLog);
}
$consultation->setConsultationEtat($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\ConsultationEtat',3));
$consultationEtatHistorique = new ConsultationEtatHistorique();
$consultationEtatHistorique->setConsultation($consultation);
$consultationEtatHistorique->setConsultationEtat($consultation->getConsultationEtat());
$consultationEtatHistorique->setSaisieUserId($user->getId());
$this->vetoadomEntityManager->persist($consultationEtatHistorique);
$this->vetoadomEntityManager->flush();
$this->customJsonResponse->setField('consultations', $this->priseAppelHelper->getResumeConsultations($secteur));
return $this->customJsonResponse->sendResponse();
}
break;
case 'consultationTransmises':
{
$consultationId = (int)($request->get('id') ?? 0);
$consultation = $consultationId ? $this->vetoadomEntityManager->getRepository(Consultation::class)->findOneBy(['id' => $consultationId, 'active' => 1]) : null;
if (
!$consultation
|| $consultation->getAppelAnimal()->getAppel()->getSecteur()->getId() != $secteur->getId()
|| $consultation->getConsultationEtat()->getCode() != 'en_cours'
) {
$this->customJsonResponse->setForbidden(true);
$this->customJsonResponse->setField('alert', $this->translator->trans('page_prise_appel_resume.consultation_unknown', [], 'validators'));
return $this->customJsonResponse->sendResponse();
}
if ($consultation->getAppelAnimal()->getAppel()->getSecteur()->getFonctionnement()->getCode() == 'domicile') {
$userPositionLog = $this->vetoadomEntityManager->getRepository(UserPositionLog::class)->findOneBy(['consultation' => $consultation, 'userId' => $consultation->getVeterinaireIntervenantId()]);
if ($userPositionLog) {
$this->vetoadomEntityManager->remove($userPositionLog);
}
}
$consultation->setConsultationEtat($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\ConsultationEtat',7));
$consultationEtatHistorique = new ConsultationEtatHistorique();
$consultationEtatHistorique->setConsultation($consultation);
$consultationEtatHistorique->setConsultationEtat($consultation->getConsultationEtat());
$consultationEtatHistorique->setSaisieUserId($user->getId());
$this->vetoadomEntityManager->persist($consultationEtatHistorique);
$this->vetoadomEntityManager->flush();
$this->customJsonResponse->setField('consultations', $this->priseAppelHelper->getResumeConsultations($secteur));
return $this->customJsonResponse->sendResponse();
}
break;
case 'consultationComptesRendusARediger':
{
$consultationId = (int)($request->get('id') ?? 0);
$consultation = $consultationId ? $this->vetoadomEntityManager->getRepository(Consultation::class)->findOneBy(['id' => $consultationId, 'active' => 1]) : null;
if (
!$consultation
|| $consultation->getAppelAnimal()->getAppel()->getSecteur()->getId() != $secteur->getId()
|| !in_array($consultation->getConsultationEtat()->getCode(),['en_cours','patients_hospitalises'])
) {
$this->customJsonResponse->setForbidden(true);
$this->customJsonResponse->setField('alert', $this->translator->trans('page_prise_appel_resume.consultation_unknown', [], 'validators'));
return $this->customJsonResponse->sendResponse();
}
if (
$consultation->getAppelAnimal()->getAppel()->getSecteur()->getFonctionnement()->getCode() == 'domicile'
&& $consultation->getConsultationEtat()->getCode() == 'en_cours'
) {
$userPositionLog = new UserPositionLog();
$userPositionLog->setConsultation($consultation);
$userPositionLog->setUserId($consultation->getVeterinaireIntervenantId());
$userPositionLog->setPlanningJourId($consultation->getPlanningJourId());
$userPositionLog->setUserPositionLogEtat($this->vetoadomEntityManager->getRepository(UserPositionLogEtat::class)->findOneBy(['id' => 3]));
$userPositionLog->setVille($consultation->getAppelAnimal()->getAppel()->getClient()->getVille());
$this->vetoadomEntityManager->persist($userPositionLog);
}
$consultation->setConsultationEtat($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\ConsultationEtat',5));
$consultationEtatHistorique = new ConsultationEtatHistorique();
$consultationEtatHistorique->setConsultation($consultation);
$consultationEtatHistorique->setConsultationEtat($consultation->getConsultationEtat());
$consultationEtatHistorique->setSaisieUserId($user->getId());
$this->vetoadomEntityManager->persist($consultationEtatHistorique);
$this->vetoadomEntityManager->flush();
$this->customJsonResponse->setField('consultations', $this->priseAppelHelper->getResumeConsultations($secteur));
return $this->customJsonResponse->sendResponse();
}
break;
case 'saveConsultationNiveauUrgence':
{
$consultationId = (int)($request->get('id') ?? 0);
$consultation = $consultationId ? $this->vetoadomEntityManager->getRepository(Consultation::class)->findOneBy(['id' => $consultationId, 'active' => 1]) : null;
if (
!$consultation
|| $consultation->getAppelAnimal()->getAppel()->getSecteur()->getId() != $secteur->getId()
|| $consultation->getConsultationEtat()->getCode() != 'en_route'
) {
$this->customJsonResponse->setForbidden(true);
$this->customJsonResponse->setField('alert', $this->translator->trans('page_prise_appel_resume.consultation_unknown', [], 'validators'));
return $this->customJsonResponse->sendResponse();
}
$validators = ['consultationNiveauUrgence'];
$consultationNiveauUrgenceId = (int)($request->get('consultationNiveauUrgenceId') ?? 0);
$consultationNiveauUrgence = $consultationNiveauUrgenceId ? $this->vetoadomEntityManager->getRepository(ConsultationNiveauUrgence::class)->findOneBy(['id' => $consultationNiveauUrgenceId]) : null;
$consultation->setConsultationNiveauUrgence($consultationNiveauUrgence);
# consultation validation
$errors = $this->validator->validate($consultation,null, $validators);
if ($errors->count()) {
foreach ($errors as $key => $error) {
$propertyPath = "consultation-{$error->getPropertyPath()}";
if (!$this->customJsonResponse->hasField($propertyPath)) {
$this->customJsonResponse->setField($propertyPath, $error->getMessage());
}
}
}
if ($this->customJsonResponse->hasAnyField()) {
$this->customJsonResponse->setForbidden(true);
return $this->customJsonResponse->sendResponse();
}
$consultation->setConsultationEtat($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\ConsultationEtat',2));
$consultationEtatHistorique = new ConsultationEtatHistorique();
$consultationEtatHistorique->setConsultation($consultation);
$consultationEtatHistorique->setConsultationEtat($consultation->getConsultationEtat());
$consultationEtatHistorique->setSaisieUserId($user->getId());
$this->vetoadomEntityManager->persist($consultationEtatHistorique);
$this->vetoadomEntityManager->flush();
$this->customJsonResponse->setField('consultations', $this->priseAppelHelper->getResumeConsultations($secteur));
return $this->customJsonResponse->sendResponse();
}
break;
case 'consultationEnRoute':
{
$consultationId = (int)($request->get('id') ?? 0);
$consultation = $consultationId ? $this->vetoadomEntityManager->getRepository(Consultation::class)->findOneBy(['id' => $consultationId, 'active' => 1]) : null;
if (
!$consultation
|| $consultation->getAppelAnimal()->getAppel()->getSecteur()->getId() != $secteur->getId()
|| $consultation->getConsultationEtat()->getCode() != 'salle_d_attente'
) {
$this->customJsonResponse->setForbidden(true);
$this->customJsonResponse->setField('alert', $this->translator->trans('page_prise_appel_resume.consultation_unknown', [], 'validators'));
return $this->customJsonResponse->sendResponse();
}
$consultation->setConsultationEtat($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\ConsultationEtat',1));
$consultationEtatHistorique = new ConsultationEtatHistorique();
$consultationEtatHistorique->setConsultation($consultation);
$consultationEtatHistorique->setConsultationEtat($consultation->getConsultationEtat());
$consultationEtatHistorique->setSaisieUserId($user->getId());
$this->vetoadomEntityManager->persist($consultationEtatHistorique);
$this->vetoadomEntityManager->flush();
$this->customJsonResponse->setField('consultations', $this->priseAppelHelper->getResumeConsultations($secteur));
return $this->customJsonResponse->sendResponse();
}
break;
case 'saveConsultationEnCoursClinique':
{
$consultationId = (int)($request->get('id') ?? 0);
$consultation = $consultationId ? $this->vetoadomEntityManager->getRepository(Consultation::class)->findOneBy(['id' => $consultationId, 'active' => 1]) : null;
if (
!$consultation
|| $consultation->getAppelAnimal()->getAppel()->getSecteur()->getId() != $secteur->getId()
|| $consultation->getConsultationEtat()->getCode() != 'salle_d_attente'
) {
$this->customJsonResponse->setForbidden(true);
$this->customJsonResponse->setField('alert', $this->translator->trans('page_prise_appel_resume.consultation_unknown', [], 'validators'));
return $this->customJsonResponse->sendResponse();
}
$veterinaireIntervenantId = (int)($request->get('veterinaireIntervenantId') ?? 0);
if (!$veterinaireIntervenantId) {
$this->customJsonResponse->setField('consultation-veterinaireIntervenantId', $this->translator->trans('common.blank', [], 'validators'));
}
if ($this->customJsonResponse->hasAnyField()) {
$this->customJsonResponse->setForbidden(true);
return $this->customJsonResponse->sendResponse();
}
$consultation->setVeterinaireIntervenantId($veterinaireIntervenantId);
$consultation->setConsultationEtat($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\ConsultationEtat',3));
$consultationEtatHistorique = new ConsultationEtatHistorique();
$consultationEtatHistorique->setConsultation($consultation);
$consultationEtatHistorique->setConsultationEtat($consultation->getConsultationEtat());
$consultationEtatHistorique->setSaisieUserId($user->getId());
$this->vetoadomEntityManager->persist($consultationEtatHistorique);
$this->vetoadomEntityManager->flush();
$this->customJsonResponse->setField('consultations', $this->priseAppelHelper->getResumeConsultations($secteur));
return $this->customJsonResponse->sendResponse();
}
break;
case 'consultationSalleDAttente':
{
$consultationId = (int)($request->get('id') ?? 0);
$consultation = $consultationId ? $this->vetoadomEntityManager->getRepository(Consultation::class)->findOneBy(['id' => $consultationId, 'active' => 1]) : null;
if (
!$consultation
|| $consultation->getAppelAnimal()->getAppel()->getSecteur()->getId() != $secteur->getId()
|| $consultation->getConsultationEtat()->getCode() != 'en_cours'
) {
$this->customJsonResponse->setForbidden(true);
$this->customJsonResponse->setField('alert', $this->translator->trans('page_prise_appel_resume.consultation_unknown', [], 'validators'));
return $this->customJsonResponse->sendResponse();
}
$consultation->setConsultationEtat($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\ConsultationEtat',2));
$consultationEtatHistorique = new ConsultationEtatHistorique();
$consultationEtatHistorique->setConsultation($consultation);
$consultationEtatHistorique->setConsultationEtat($consultation->getConsultationEtat());
$consultationEtatHistorique->setSaisieUserId($user->getId());
$this->vetoadomEntityManager->persist($consultationEtatHistorique);
$this->vetoadomEntityManager->flush();
$this->customJsonResponse->setField('consultations', $this->priseAppelHelper->getResumeConsultations($secteur));
return $this->customJsonResponse->sendResponse();
}
break;
case 'saveConsultationEnCoursCliniqueNextEtat':
{
$consultationId = (int)($request->get('id') ?? 0);
$consultation = $consultationId ? $this->vetoadomEntityManager->getRepository(Consultation::class)->findOneBy(['id' => $consultationId, 'active' => 1]) : null;
if (
!$consultation
|| $consultation->getAppelAnimal()->getAppel()->getSecteur()->getId() != $secteur->getId()
|| $consultation->getConsultationEtat()->getCode() != 'en_cours'
) {
$this->customJsonResponse->setForbidden(true);
$this->customJsonResponse->setField('alert', $this->translator->trans('page_prise_appel_resume.consultation_unknown', [], 'validators'));
return $this->customJsonResponse->sendResponse();
}
$consultationEtatId = (int)($request->get('nextEtat') ?? 0);
if (!in_array($consultationEtatId,[4,5])) {
$this->customJsonResponse->setForbidden(true);
$this->customJsonResponse->setField('consultation-consultationEtat', $this->translator->trans('common.blank', [], 'validators'));
return $this->customJsonResponse->sendResponse();
}
$consultation->setConsultationEtat($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\ConsultationEtat',$consultationEtatId));
$consultationEtatHistorique = new ConsultationEtatHistorique();
$consultationEtatHistorique->setConsultation($consultation);
$consultationEtatHistorique->setConsultationEtat($consultation->getConsultationEtat());
$consultationEtatHistorique->setSaisieUserId($user->getId());
$this->vetoadomEntityManager->persist($consultationEtatHistorique);
$this->vetoadomEntityManager->flush();
$this->customJsonResponse->setField('consultations', $this->priseAppelHelper->getResumeConsultations($secteur));
return $this->customJsonResponse->sendResponse();
}
break;
case 'getConsultationDemandeDeNouvelles':
case 'saveConsultationDemandeDeNouvelles':
{
$consultationId = (int)($request->get('id') ?? 0);
$consultation = $consultationId ? $this->vetoadomEntityManager->getRepository(Consultation::class)->findOneBy(['id' => $consultationId, 'active' => 1]) : null;
if (
!$consultation
|| $consultation->getAppelAnimal()->getAppel()->getSecteur()->getId() != $secteur->getId()
|| $consultation->getAppelAnimal()->getAppel()->getSecteur()->getFonctionnement()->getCode() != 'clinique'
|| !in_array($consultation->getConsultationEtat()->getCode(),['en_cours','patients_hospitalises'])
) {
$this->customJsonResponse->setForbidden(true);
$this->customJsonResponse->setField('alert', $this->translator->trans('page_prise_appel_resume.consultation_unknown', [], 'validators'));
return $this->customJsonResponse->sendResponse();
}
if ($action == 'getConsultationDemandeDeNouvelles') {
$this->customJsonResponse->setField('consultationDemandeDeNouvelles', $this->vetoadomEntityManager->getRepository(Consultation::class)->getConsultationDemandeDeNouvelles($consultationId));
return $this->customJsonResponse->sendResponse();
}
# saveConsultationDemandeDeNouvelles
foreach ($this->vetoadomEntityManager->getRepository(Consultation::class)->getConsultationDemandeDeNouvelles($consultationId) as $item) {
$appel = $this->vetoadomEntityManager->getRepository(Appel::class)->find($item['appelId']);
$appel->setDemandeDeNouvelleFaite(1);
}
$this->vetoadomEntityManager->flush();
$this->customJsonResponse->setField('consultations', $this->priseAppelHelper->getResumeConsultations($secteur));
return $this->customJsonResponse->sendResponse();
}
break;
case 'sendEmailReferant':
{
$referantId = (int)($request->get('referant') ?? 0);
$referant = $referantId ? $this->vetoadomEntityManager->getRepository(Referant::class)->findOneBy(['id' => $referantId]) : null;
if (!$referant) {
$this->customJsonResponse->setForbidden(true);
$this->customJsonResponse->setField('referant', $this->translator->trans('common.blank', [], 'validators'));
return $this->customJsonResponse->sendResponse();
}
$body = nl2br((string)($request->get('message') ?? ''));
if ($body === '') {
$this->customJsonResponse->setForbidden(true);
$this->customJsonResponse->setField('referantTexteEmail', $this->translator->trans('common.blank', [], 'validators'));
return $this->customJsonResponse->sendResponse();
}
$subject = $this->translator->trans('page_prise_appel_referant.subject', ['{{secteruNomShort}}' => $secteur->getNomShort()], 'messages');
$this->sendEmail->emailReferant($secteur,$referant,$subject,$body);
# message
$message = new Message();
$message->setMessageEtat($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\MessageEtat', 3));
$message->setMessageOrigine($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\MessageOrigine', 4));
$message->setContenu($body);
$message->setReferant($referant);
$message->setSecteur($secteur);
$message->setSaisieUserId($user->getId());
$this->vetoadomEntityManager->persist($message);
$this->vetoadomEntityManager->flush();
return $this->customJsonResponse->sendResponse();
}
break;
case 'envoyerUnMessageSansRegulation':
case 'demandeDeRenseignement':
case 'validerLaConsultation':
case 'demandeDeNouvelles':
{
# check for exist secteurConsigne with type stop_consultation
if ($action == 'validerLaConsultation') {
$stopConsultationConfirmed = (bool)$request->get('stopConsultationConfirmed');
if (
!$stopConsultationConfirmed
&& count($this->vetoadomEntityManager->getRepository(SecteurConsigne::class)->checkSecteurStopConsultation($secteur->getId()))
) {
$this->customJsonResponse->setForbidden(true);
$this->customJsonResponse->setField('stopConsultationConfirm', $this->translator->trans('page_prise_appel.appel_valider_secteur_consigne_stop_consultation', [], 'validators'));
return $this->customJsonResponse->sendResponse();
}
}
// client
$validators = ['nom','telephone1','telephone2','ville'];
$appelData = $request->get('appel') ?? [];
if (!is_array($appelData)) $appelData = [];
$clientData = $request->get('client') ?? [];
if (!is_array($clientData)) $clientData = [];
$clientId = (int)($clientData['id'] ?? 0);
$client = $clientId ? $this->vetoadomEntityManager->getRepository(Client::class)->findOneBy(['id' => $clientData['id'], 'active' => 1]) : new Client();
if ($clientId && !$client) {
$this->customJsonResponse->setForbidden(true);
$this->customJsonResponse->setField('alert', $this->translator->trans('page_prise_appel.client_unknown', [], 'validators'));
return $this->customJsonResponse->sendResponse();
}
$client->setNom($this->misc->toUpper($clientData['nom'] ?? ''));
$client->setEmail($this->misc->toLower($clientData['email'] ?? ''));
if ($client->getEmail() !== null) {
$validators[] = 'email';
}
$client->setTelephone1(trim($clientData['telephone1'] ?? ''));
$client->setTelephone2(trim($clientData['telephone2'] ?? ''));
$villeId = (int)($clientData['ville'] ?? 0);
$ville = $villeId ? $this->vetoadomEntityManager->getRepository(Ville::class)->findOneBy(['id' => $villeId]) : null;
$client->setVille($ville);
if ($secteur->getFonctionnement()->getCode() == 'domicile') {
$validators = array_merge($validators,['interphone','code','batiment','ascenseur','escalier','etage','appartement','informationsComplementaires']);
$client->setAdresse($this->misc->toUpper($clientData['adresse'] ?? ''));
$client->setComplementAdresse($this->misc->toUpper($clientData['complementAdresse'] ?? ''));
if ($action == 'validerLaConsultation') {
$validators = array_merge($validators,['adresse','complementAdresse','habitation']);
}
else {
if ($client->getAdresse() !== null) {
$validators[] = 'adresse';
}
if ($client->getComplementAdresse() !== null) {
$validators[] = 'complementAdresse';
}
}
$client->setInterphone(trim($clientData['interphone'] ?? ''));
$client->setCode(trim($clientData['code'] ?? ''));
$client->setBatiment(trim($clientData['batiment'] ?? ''));
$client->setAscenseur(trim($clientData['ascenseur'] ?? ''));
$client->setEscalier(trim($clientData['escalier'] ?? ''));
$client->setEtage(trim($clientData['etage'] ?? ''));
$client->setAppartement(trim($clientData['appartement'] ?? ''));
$client->setInformationsComplementaires(trim($clientData['informationsComplementaires'] ?? ''));
$habitationId = (int)($clientData['habitation'] ?? 0);
$habitation = $habitationId ? $this->vetoadomEntityManager->getRepository(Habitation::class)->findOneBy(['id' => $habitationId]) : null;
$client->setHabitation($habitation);
}
$referantId = (int)($appelData['referantId'] ?? 0);
$referant = $referantId ? $this->vetoadomEntityManager->getRepository(Referant::class)->findOneBy(['id' => $referantId]) : null;
if (!$client->getId()) {
$client->setReferant($referant);
# add clientSite
$clientSite = new ClientSite();
$clientSite->setClient($client);
$clientSite->setSiteId($secteur->getSiteId());
$this->vetoadomEntityManager->persist($clientSite);
}
else {
# add clientSite if not exist for this siteId
$clientSite = $this->vetoadomEntityManager->getRepository(ClientSite::class)->findOneBy(['client' => $client, 'siteId' => $secteur->getSiteId()]);
if (!$clientSite) {
$clientSite = new ClientSite();
$clientSite->setClient($client);
$clientSite->setSiteId($secteur->getSiteId());
$this->vetoadomEntityManager->persist($clientSite);
}
}
# client validation
$errors = $this->validator->validate($client,null, $validators);
if ($errors->count()) {
foreach ($errors as $key => $error) {
$propertyPath = "client-{$error->getPropertyPath()}";
if (!$this->customJsonResponse->hasField($propertyPath)) {
$this->customJsonResponse->setField($propertyPath, $error->getMessage());
}
}
}
else if (!$client->getId()) {
$this->vetoadomEntityManager->persist($client);
}
if ($this->customJsonResponse->hasAnyField()) {
$this->customJsonResponse->setForbidden(true);
return $this->customJsonResponse->sendResponse();
}
# set ville coordinates
$client->setVille($this->APIlocation->setVilleCoordinates($client->getVille()));
# animals
$animals = $clientData['animals'] ?? [];
if (!is_array($animals)) $animals = [];
if (!$animals) {
$this->customJsonResponse->setForbidden(true);
$this->customJsonResponse->setField("alert", $this->translator->trans('page_prise_appel.animals_empty', [], 'validators'));
return $this->customJsonResponse->sendResponse();
}
$animalsForAppel = [];
foreach ($animals as $animalIndex => $animalData) {
$animalId = (int)($animalData['id']) ?? 0;
$animal = $animalId ? $this->vetoadomEntityManager->getRepository(Animal::class)->findOneBy([
'id' => $animalId,
'client' => $client,
'active' => 1
]) : new Animal();
if ($animalId && !$animal) {
$this->customJsonResponse->setForbidden(true);
$this->customJsonResponse->setField("animal-nom-{$animalIndex}", $this->translator->trans('page_prise_appel.animal_unknown', [], 'validators'));
return $this->customJsonResponse->sendResponse();
}
$validators = ['nom','animalEspece','animalSexe','dateNaissance'];
$animal->setNom($this->misc->toUpper($animalData['nom'] ?? ''));
$animalEspeceId = (int)($animalData['animalEspece'] ?? 0);
$animalEspece = $animalEspeceId ? $this->vetoadomEntityManager->getRepository(AnimalEspece::class)->findOneBy(['id' => $animalEspeceId]) : null;
$animal->setAnimalEspece($animalEspece);
$animalSexeId = (int)($animalData['animalSexe'] ?? 0);
$animalSexe = $animalSexeId ? $this->vetoadomEntityManager->getRepository(AnimalSexe::class)->findOneBy(['id' => $animalSexeId]) : null;
$animal->setAnimalSexe($animalSexe);
$animalRaceId = (int)($animalData['animalRace'] ?? 0);
$animal->setAnimalRace(
$animalRaceId && $animal->getAnimalEspece()
? $this->vetoadomEntityManager->getRepository(AnimalRace::class)->findOneBy(['id' => $animalRaceId, 'animalEspece' => $animal->getAnimalEspece()])
: null
);
if (
$animal->getAnimalRace()
&& $animal->getAnimalRace()->getCode() == 'autre'
) {
$validators[] = 'animalRaceAutreNom';
$animal->setAnimalRaceAutreNom($this->misc->toUpper($animalData['animalRaceAutreNom'] ?? ''));
}
else {
$animal->setAnimalRaceAutreNom(null);
}
if (($dateNaissance = \DateTime::createFromFormat("!Y-m-d", $animalData['dateNaissance'] ?? '')) !== false) {
$animal->setDateNaissance($dateNaissance);
}
else {
$animal->setDateNaissance(null);
}
if (!$animal->getDeces()) {
$animal->setDeces((bool)($animalData['deces'] ?? false));
}
if (
$action == 'validerLaConsultation'
&&
(
($animalData['euthanasie'] ?? false)
|| ($animalData['cremation'] ?? false)
)
) {
if (!$secteur->hasSecteurCategoriePoidsEspeceById($animalData['categoriePoids'] ?? 0)) {
$this->customJsonResponse->setField("animal-categoriePoids-{$animalIndex}", $this->translator->trans('common.blank', [], 'validators'));
}
}
# animal validation
$errors = $this->validator->validate($animal,null, $validators);
if ($errors->count()) {
foreach ($errors as $key => $error) {
$propertyPath = "animal-{$error->getPropertyPath()}-{$animalIndex}";
if (!$this->customJsonResponse->hasField($propertyPath)) {
$this->customJsonResponse->setField($propertyPath, $error->getMessage());
}
}
}
else if (!$animal->getId()) {
$animal->setClient($client);
$this->vetoadomEntityManager->persist($animal);
# add animalSite
$animalSite = new AnimalSite();
$animalSite->setAnimal($animal);
$animalSite->setSiteId($secteur->getSiteId());
$this->vetoadomEntityManager->persist($animalSite);
}
else {
# add animalSite if not exist for this siteId
$animalSite = $this->vetoadomEntityManager->getRepository(AnimalSite::class)->findOneBy(['animal' => $animal, 'siteId' => $secteur->getSiteId()]);
if (!$animalSite) {
$animalSite = new AnimalSite();
$animalSite->setAnimal($animal);
$animalSite->setSiteId($secteur->getSiteId());
$this->vetoadomEntityManager->persist($animalSite);
}
}
$animalsForAppel[] = [
'animal' => $animal,
'animalData' => $animalData
];
}
# appel
$appelTypeIdAction['envoyerUnMessageSansRegulation'] = 1;
$appelTypeIdAction['demandeDeRenseignement'] = 2;
$appelTypeIdAction['validerLaConsultation'] = 3;
$appelTypeIdAction['demandeDeNouvelles'] = 4;
$validators = ['referant','motifAppel','informationInterne'];
$appel = new Appel();
$appel->setSaisieUserId($user->getId());
$appel->setRegulateurId($request->get('regulateurId') ?? 0);
$appel->setSuperviseurId($request->get('superviseurId') ?? 0);
$appel->setAstreinteChirurgieId($request->get('astreinteChirurgieId'));
$appel->setVetcoachId($request->get('vetcoachId'));
$appel->setSecteur($secteur);
$appel->setClient($client);
$appel->setLangue($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\Langue',$request->get('langueId')));
$appel->setReferant($referant);
$appel->setAppelType($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\AppelType',$appelTypeIdAction[$action]));
$appel->setMotifAppel($appelData['motifAppel'] ?? '');
$appel->setInformationInterne($appelData['informationInterne'] ?? '');
if ($secteur->getFonctionnement()->getCode() == 'domicile') {
$appel->setVille($client->getVille());
$secteurZoneId = (int)($request->get('secteurZoneId') ?? 0);
$secteurZone = $secteurZoneId ? $this->vetoadomEntityManager->getRepository(SecteurZone::class)->findOneBy(['id' => $secteurZoneId,'secteur' => $secteur]) : null;
$appel->setSecteurZone($secteurZone);
if (
!$appel->getSecteurZone()
&& !$this->customJsonResponse->hasField('alert')
) {
$this->customJsonResponse->setField('alert', $this->translator->trans('page_prise_appel_client.tarif_deplacement_secteur_zone_text_hors_du_perimetre_action_no_secteurs', [], 'messages'));
}
}
# appel validation
$errors = $this->validator->validate($appel,null, $validators);
if ($errors->count()) {
foreach ($errors as $key => $error) {
if (!$this->customJsonResponse->hasField($error->getPropertyPath())) {
$this->customJsonResponse->setField($error->getPropertyPath(), $error->getMessage());
}
}
}
if ($this->customJsonResponse->hasAnyField()) {
$this->customJsonResponse->setForbidden(true);
return $this->customJsonResponse->sendResponse();
}
$this->vetoadomEntityManager->persist($appel);
$appelAnimals = [];
foreach ($animalsForAppel as $item) {
$appelAnimal = new AppelAnimal();
$appelAnimal->setAppel($appel);
$appelAnimal->setAnimal($item['animal']);
if (
$action == 'validerLaConsultation'
&&
(
($item['animalData']['euthanasie'] ?? false)
|| ($item['animalData']['cremation'] ?? false)
)
) {
$appelAnimal->setSecteurCategoriePoidsEspece($secteur->getSecteurCategoriePoidsEspeceById($item['animalData']['categoriePoids']));
}
$this->vetoadomEntityManager->persist($appelAnimal);
$appelAnimals[] = $appelAnimal;
}
# envoyerUnMessageSansRegulation
if ($action == 'envoyerUnMessageSansRegulation') {
# message
$message = new Message();
$message->setAppel($appel);
$message->setMessageEtat($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\MessageEtat', 2));
$message->setMessageOrigine($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\MessageOrigine', 2));
$message->setContenu($appel->getMotifAppel());
$message->setReferant($appel->getReferant());
$message->setSecteur($secteur);
$message->setSaisieUserId($user->getId());
$this->vetoadomEntityManager->persist($message);
$this->vetoadomEntityManager->flush();
# send email to referant
$emails = $this->sendEmail->emailReferantSansRegulation($appel);
$message = $this->translator->trans('page_prise_appel.success_envoyer_un_message_sans_regulation', ['{{emails}}' => $emails], 'messages');
# send email to clinique referant
if ($secteur->getFonctionnement()->getCode() == 'domicile') {
$consultationRefereeCliniqueId = (int)($request->get('consultationRefereeCliniqueId') ?? 0);
$referant = $consultationRefereeCliniqueId ? $this->vetoadomEntityManager->getRepository(Referant::class)->findOneBy(['id' => $consultationRefereeCliniqueId]) : null;
if ($referant) {
$appel->setReferant($referant);
$emails = $this->sendEmail->emailReferantSansRegulationClinique($appel);
$message .= '<br>'.$this->translator->trans('page_prise_appel.success_envoyer_un_message_sans_regulation', ['{{emails}}' => $emails], 'messages');
}
}
$this->customJsonResponse->setField('message', $message);
$this->customJsonResponse->setRedirect($this->urlGenerator->generate('app_dashboard'));
return $this->customJsonResponse->sendResponse();
}
# demandeDeRenseignement
if ($action == 'demandeDeRenseignement') {
# message
$message = new Message();
$message->setAppel($appel);
$message->setMessageEtat($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\MessageEtat', 1));
$message->setMessageOrigine($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\MessageOrigine', 1));
$message->setContenu($appel->getMotifAppel());
$message->setReferant($appel->getReferant());
$message->setSecteur($secteur);
$message->setSaisieUserId($user->getId());
$this->vetoadomEntityManager->persist($message);
$this->vetoadomEntityManager->flush();
# send email
$emails = $this->sendEmail->demandeDeRenseignement($appel);
$this->customJsonResponse->setField('message', $this->translator->trans('page_prise_appel.success_demande_de_renseignement', ['{{emails}}' => $emails], 'messages'));
$this->customJsonResponse->setRedirect($this->urlGenerator->generate('app_prise_appel',['secteurId' => $secteur->getId(),'tab' => 'messages']));
return $this->customJsonResponse->sendResponse();
}
if ($action == 'validerLaConsultation') {
# check that secteur has configured parameters for SMS sending
if ($secteur->getSmsExpediteur() === null) {
$this->customJsonResponse->setForbidden(true);
$this->customJsonResponse->setField('alert', $this->translator->trans('page_prise_appel.secteur_sms_not_configured', [], 'validators'));
return $this->customJsonResponse->sendResponse();
}
# consultation
$infoConsultation = $request->get('infoConsultation') ?? [];
if (!is_array($infoConsultation)) $infoConsultation = [];
$validators = ['tarif','infoArv'];
$consultationCommon = new Consultation();
$tarifId = (int)($request->get('consultationTarifId') ?? 0);
$tarif = $tarifId ? $this->vetoadomEntityManager->getRepository(Tarif::class)->findOneBy(['id' => $tarifId, 'active' => 1]) : null;
$consultationCommon->setTarif($tarif);
$consultationCommon->setTarifConsultation($request->get('tarifConsultation') ?? 0);
if ($secteur->getFonctionnement()->getCode() == 'domicile') {
$consultationCommon->setHorsZoneDistance($request->get('horsZoneDistance') ?? 0);
$consultationCommon->setTarifDeplacement($request->get('tarifDeplacement') ?? 0);
$consultationCommon->setConsultationEtat($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\ConsultationEtat',6));
$consultationRefereeCliniqueId = (int)($request->get('consultationRefereeCliniqueId') ?? 0);
$referant = $consultationRefereeCliniqueId ? $this->vetoadomEntityManager->getRepository(Referant::class)->findOneBy(['id' => $consultationRefereeCliniqueId]) : null;
$consultationCommon->setConsultationRefereeClinique($referant);
$consultationDelaiUrgenceCode = $infoConsultation['delaiUrgenceCode'] ?? '';
$consultationDelaiUrgence = $consultationDelaiUrgenceCode !== '' ? $this->vetoadomEntityManager->getRepository(ConsultationDelaiUrgence::class)->findOneBy(['code' => $consultationDelaiUrgenceCode]) : null;
$consultationCommon->setConsultationDelaiUrgence($consultationDelaiUrgence);
if (!$consultationCommon->getConsultationDelaiUrgence()) {
$this->customJsonResponse->setField('infoConsultation-delaiUrgence',$this->translator->trans('common.blank', [], 'validators'));
}
else if ($consultationDelaiUrgenceCode == 'dans_heure'){
$debutHeure = \DateTime::createFromFormat("!H:i", $infoConsultation['debutHeure'] ?? '');
$finHeure = \DateTime::createFromFormat("!H:i", $infoConsultation['finHeure'] ?? '');
if ($debutHeure === false) {
$this->customJsonResponse->setField('infoConsultation-debutHeure',$this->translator->trans('common.blank', [], 'validators'));
}
if ($finHeure === false) {
$this->customJsonResponse->setField('infoConsultation-finHeure',$this->translator->trans('common.blank', [], 'validators'));
}
if ($debutHeure !== false && $finHeure !== false) {
$debutConsultation = new \DateTime();
$debutConsultation->setTime($debutHeure->format('H'),$debutHeure->format('i'));
$consultationCommon->setDebutConsultation($debutConsultation);
$finConsultation = new \DateTime();
$finConsultation->setTime($finHeure->format('H'),$finHeure->format('i'));
if ($debutConsultation >= $finConsultation) {
$finConsultation->add(new \DateInterval('P1D'));
}
$consultationCommon->setFinConsultation($finConsultation);
}
}
else if ($consultationDelaiUrgenceCode == 'prioritaire'){
$consultationCommon->setDebutConsultation(new \DateTime());
}
else if ($consultationDelaiUrgenceCode == 'delai_a_preciser'){
$date = \DateTime::createFromFormat("!Y-m-d", $infoConsultation['date'] ?? '');
if ($date === false) {
$this->customJsonResponse->setField('infoConsultation-date',$this->translator->trans('common.blank', [], 'validators'));
}
$debutHeure = \DateTime::createFromFormat("!H:i", $infoConsultation['debutHeure'] ?? '');
$finHeure = \DateTime::createFromFormat("!H:i", $infoConsultation['finHeure'] ?? '');
if ($debutHeure === false) {
$this->customJsonResponse->setField('infoConsultation-debutHeure',$this->translator->trans('common.blank', [], 'validators'));
}
if ($finHeure === false) {
$this->customJsonResponse->setField('infoConsultation-finHeure',$this->translator->trans('common.blank', [], 'validators'));
}
if ($date !== false && $debutHeure !== false && $finHeure !== false) {
$debutConsultation = clone($date);
$debutConsultation->setTime($debutHeure->format('H'),$debutHeure->format('i'));
$consultationCommon->setDebutConsultation($debutConsultation);
$finConsultation = clone($date);
$finConsultation->setTime($finHeure->format('H'),$finHeure->format('i'));
if ($debutConsultation >= $finConsultation) {
$finConsultation->add(new \DateInterval('P1D'));
}
$consultationCommon->setFinConsultation($finConsultation);
}
}
}
else {
$consultationCommon->setConsultationEtat($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\ConsultationEtat',1));
$date = \DateTime::createFromFormat("!Y-m-d", $infoConsultation['date'] ?? '');
$heure = \DateTime::createFromFormat("!H:i", $infoConsultation['heure'] ?? '');
if ($date === false) {
$this->customJsonResponse->setField('infoConsultation-date',$this->translator->trans('common.blank', [], 'validators'));
}
if ($heure === false) {
$this->customJsonResponse->setField('infoConsultation-heure',$this->translator->trans('common.blank', [], 'validators'));
}
if ($date !== false && $heure !== false) {
$date->setTime($heure->format('H'),$heure->format('i'));
$consultationCommon->setDebutConsultation($date);
}
}
$consultationCommon->setInfoArv(trim($infoConsultation['infoArv'] ?? ''));
$veterinaireIntervenantId = (int)($infoConsultation['veterinaireIntervenantId'] ?? 0);
$veterinairesPlanning = $this->priseAppelHelper->getVeterinairesPlanning($secteur);
if (in_array($veterinaireIntervenantId, array_column($veterinairesPlanning, 'id'))) {
$consultationCommon->setVeterinaireIntervenantId($veterinaireIntervenantId);
}
else {
$consultationCommon->setVeterinaireIntervenantId(null);
}
# consultation validation
$errors = $this->validator->validate($consultationCommon,null, $validators);
if ($errors->count()) {
foreach ($errors as $key => $error) {
$propertyPath = 'infoConsultation-'.$error->getPropertyPath();
if (!$this->customJsonResponse->hasField($propertyPath)) {
$this->customJsonResponse->setField($propertyPath, $error->getMessage());
}
}
}
if ($this->customJsonResponse->hasAnyField()) {
$this->customJsonResponse->setForbidden(true);
return $this->customJsonResponse->sendResponse();
}
foreach ($animals as $animalIndex => $animalData) {
# consultation
$consultation = clone $consultationCommon;
# reset tarifDeplacement for next consultations, save it only in first one
$consultationCommon->setTarifDeplacement(null);
$consultation->setAppelAnimal($appelAnimals[$animalIndex]);
# consultationAnimalOperationSpecifique
$totalTarifSpecifique = 0;
if (($animalData['euthanasie'] ?? false)) {
$consultationAnimalOperationSpecifique = new ConsultationAnimalOperationSpecifique();
$consultationAnimalOperationSpecifique->setConsultation($consultation);
$consultationAnimalOperationSpecifique->setOperationSpecifique($this->vetoadomEntityManager->getRepository(OperationSpecifique::class)->findOneBy(['code' => 'euthanasie']));
$consultationAnimalOperationSpecifique->setTarifOperationSpecifique((int)($animalData['euthanasiePrix']??0));
$this->vetoadomEntityManager->persist($consultationAnimalOperationSpecifique);
$totalTarifSpecifique += $consultationAnimalOperationSpecifique->getTarifOperationSpecifique();
}
if (($animalData['cremation'] ?? false)) {
$operationSpecifiqueCode = $animalData['operationSpecifiqueCode'] ?? 'collective';
if ($operationSpecifiqueCode == 'collective') {
$consultationAnimalOperationSpecifique = new ConsultationAnimalOperationSpecifique();
$consultationAnimalOperationSpecifique->setConsultation($consultation);
$consultationAnimalOperationSpecifique->setOperationSpecifique($this->vetoadomEntityManager->getRepository(OperationSpecifique::class)->findOneBy(['code' => 'cremation_collective']));
$consultationAnimalOperationSpecifique->setTarifOperationSpecifique((int)($animalData['cremationPrix'] ?? 0));
$this->vetoadomEntityManager->persist($consultationAnimalOperationSpecifique);
$totalTarifSpecifique += $consultationAnimalOperationSpecifique->getTarifOperationSpecifique();
$consultationAnimalOperationSpecifique = new ConsultationAnimalOperationSpecifique();
$consultationAnimalOperationSpecifique->setConsultation($consultation);
$consultationAnimalOperationSpecifique->setOperationSpecifique($this->vetoadomEntityManager->getRepository(OperationSpecifique::class)->findOneBy(['code' => 'prise_en_charge_du_corps_pour_collective']));
$consultationAnimalOperationSpecifique->setTarifOperationSpecifique((int)($animalData['pecPrix'] ?? 0));
$this->vetoadomEntityManager->persist($consultationAnimalOperationSpecifique);
$totalTarifSpecifique += $consultationAnimalOperationSpecifique->getTarifOperationSpecifique();
}
else if ($operationSpecifiqueCode == 'individuelle') {
$consultationAnimalOperationSpecifique = new ConsultationAnimalOperationSpecifique();
$consultationAnimalOperationSpecifique->setConsultation($consultation);
$consultationAnimalOperationSpecifique->setOperationSpecifique($this->vetoadomEntityManager->getRepository(OperationSpecifique::class)->findOneBy(['code' => 'cremation_individuelle']));
$consultationAnimalOperationSpecifique->setTarifOperationSpecifique((int)($animalData['cremationPrix'] ?? 0));
$this->vetoadomEntityManager->persist($consultationAnimalOperationSpecifique);
$totalTarifSpecifique += $consultationAnimalOperationSpecifique->getTarifOperationSpecifique();
$consultationAnimalOperationSpecifique = new ConsultationAnimalOperationSpecifique();
$consultationAnimalOperationSpecifique->setConsultation($consultation);
$consultationAnimalOperationSpecifique->setOperationSpecifique($this->vetoadomEntityManager->getRepository(OperationSpecifique::class)->findOneBy(['code' => 'prise_en_charge_du_corps_pour_individuelle']));
$consultationAnimalOperationSpecifique->setTarifOperationSpecifique((int)($animalData['pecPrix'] ?? 0));
$this->vetoadomEntityManager->persist($consultationAnimalOperationSpecifique);
$totalTarifSpecifique += $consultationAnimalOperationSpecifique->getTarifOperationSpecifique();
}
else if ($operationSpecifiqueCode == 'individuelle_assistee') {
$consultationAnimalOperationSpecifique = new ConsultationAnimalOperationSpecifique();
$consultationAnimalOperationSpecifique->setConsultation($consultation);
$consultationAnimalOperationSpecifique->setOperationSpecifique($this->vetoadomEntityManager->getRepository(OperationSpecifique::class)->findOneBy(['code' => 'cremation_individuelle_assistee']));
$consultationAnimalOperationSpecifique->setTarifOperationSpecifique((int)($animalData['cremationPrix'] ?? 0));
$this->vetoadomEntityManager->persist($consultationAnimalOperationSpecifique);
$totalTarifSpecifique += $consultationAnimalOperationSpecifique->getTarifOperationSpecifique();
$consultationAnimalOperationSpecifique = new ConsultationAnimalOperationSpecifique();
$consultationAnimalOperationSpecifique->setConsultation($consultation);
$consultationAnimalOperationSpecifique->setOperationSpecifique($this->vetoadomEntityManager->getRepository(OperationSpecifique::class)->findOneBy(['code' => 'prise_en_charge_du_corps_pour_individuelle_assistee']));
$consultationAnimalOperationSpecifique->setTarifOperationSpecifique((int)($animalData['pecPrix'] ?? 0));
$this->vetoadomEntityManager->persist($consultationAnimalOperationSpecifique);
$totalTarifSpecifique += $consultationAnimalOperationSpecifique->getTarifOperationSpecifique();
}
}
$consultation->setTarifTotal($consultation->getTarifDeplacement() + $consultation->getTarifConsultation() + $totalTarifSpecifique);
$this->vetoadomEntityManager->persist($consultation);
$consultationEtatHistorique = new ConsultationEtatHistorique();
$consultationEtatHistorique->setConsultation($consultation);
$consultationEtatHistorique->setConsultationEtat($consultation->getConsultationEtat());
$consultationEtatHistorique->setSaisieUserId($appel->getSaisieUserId());
$this->vetoadomEntityManager->persist($consultationEtatHistorique);
}
unset($consultationCommon);
$this->vetoadomEntityManager->flush();
# send email
$emails = $this->sendEmail->validerLaConsultation($appel);
# send sms to client for each consultation
$this->sendSms->validerlaConsultation($appel);
$this->customJsonResponse->setField('message', $this->translator->trans('page_prise_appel.success_valider_la_consultation', ['{{emails}}' => $emails], 'messages'));
$this->customJsonResponse->setRedirect($this->urlGenerator->generate('app_prise_appel',['secteurId' => $secteur->getId(),'tab' => 'resume']));
return $this->customJsonResponse->sendResponse();
}
# demandeDeNouvelles
foreach ($appelAnimals as $appelAnimal) {
if (
!$appelAnimal->getAnimal()->getId()
|| !$this->vetoadomEntityManager->getRepository(Consultation::class)->getAnimalConsultations($appelAnimal->getAnimal()->getId(),[3,4])
) {
$this->customJsonResponse->setForbidden(true);
$this->customJsonResponse->setField('alert', $this->translator->trans('page_prise_appel.demande_de_nouvelles_animal_has_no_consultation', ['{{animalNom}}' => $appelAnimal->getAnimal()->getNom()], 'validators'));
return $this->customJsonResponse->sendResponse();
}
}
$this->vetoadomEntityManager->flush();
# send email
$emails = $this->sendEmail->demandeDeNouvelles($appel);
$this->customJsonResponse->setField('message', $this->translator->trans('page_prise_appel.success_demande_de_nouvelles', ['{{emails}}' => $emails], 'messages'));
$this->customJsonResponse->setRedirect($this->urlGenerator->generate('app_dashboard'));
return $this->customJsonResponse->sendResponse();
}
break;
case 'appelModifier':
case 'appelValiderLaConsultation':
{
if (!$appel) {
$this->customJsonResponse->setForbidden(true);
$this->customJsonResponse->setField('alert', $this->translator->trans('page_prise_appel.appel_unknown', [], 'validators'));
return $this->customJsonResponse->sendResponse();
}
if (
$sourceMessage
&& $sourceMessage->getMessageEtat()->getId() == 2
&& $action == 'appelValiderLaConsultation'
) {
$this->customJsonResponse->setForbidden(true);
$this->customJsonResponse->setField('alert', $this->translator->trans('common.action_unknown', [], 'validators'));
return $this->customJsonResponse->sendResponse();
}
# secteur changed
$secteurChanged = false;
$secteurFunctionnementChanged = false;
$appelConsultations = $this->vetoadomEntityManager->getRepository(Consultation::class)->getAppelConsultations($appel->getId());
if ($secteur->getId() != $appel->getSecteur()->getId()) {
$secteurChanged = true;
if ($secteur->getFonctionnement()->getCode() != $appel->getSecteur()->getFonctionnement()->getCode()) {
$secteurFunctionnementChanged = true;
}
$appel->setSecteur($secteur);
foreach ($this->vetoadomEntityManager->getRepository(Message::class)->findBy(['appel' => $appel]) as $message) {
$message->setSecteur($secteur);
}
}
// client
$validators = ['nom','telephone1','telephone2','ville'];
$clientData = $request->get('client') ?? [];
if (!is_array($clientData)) $clientData = [];
$client = $appel->getClient();
$client->setNom($this->misc->toUpper($clientData['nom'] ?? ''));
$client->setEmail($this->misc->toLower($clientData['email'] ?? ''));
if ($client->getEmail() !== null) {
$validators[] = 'email';
}
$client->setTelephone1(trim($clientData['telephone1'] ?? ''));
$client->setTelephone2(trim($clientData['telephone2'] ?? ''));
$villeId = (int)($clientData['ville'] ?? 0);
$ville = $villeId ? $this->vetoadomEntityManager->getRepository(Ville::class)->findOneBy(['id' => $villeId]) : null;
$client->setVille($ville);
if ($secteur->getFonctionnement()->getCode() == 'domicile') {
$validators = array_merge($validators,['interphone','code','batiment','ascenseur','escalier','etage','appartement','informationsComplementaires']);
$client->setAdresse($this->misc->toUpper($clientData['adresse'] ?? ''));
$client->setComplementAdresse($this->misc->toUpper($clientData['complementAdresse'] ?? ''));
if ($action == 'appelValiderConsultation') {
$validators = array_merge($validators,['adresse','complementAdresse','habitation']);
}
else {
if ($client->getAdresse() !== null) {
$validators[] = 'adresse';
}
if ($client->getComplementAdresse() !== null) {
$validators[] = 'complementAdresse';
}
}
$client->setInterphone(trim($clientData['interphone'] ?? ''));
$client->setCode(trim($clientData['code'] ?? ''));
$client->setBatiment(trim($clientData['batiment'] ?? ''));
$client->setAscenseur(trim($clientData['ascenseur'] ?? ''));
$client->setEscalier(trim($clientData['escalier'] ?? ''));
$client->setEtage(trim($clientData['etage'] ?? ''));
$client->setAppartement(trim($clientData['appartement'] ?? ''));
$client->setInformationsComplementaires(trim($clientData['informationsComplementaires'] ?? ''));
$habitationId = (int)($clientData['habitation'] ?? 0);
$habitation = $habitationId ? $this->vetoadomEntityManager->getRepository(Habitation::class)->findOneBy(['id' => $habitationId]) : null;
$client->setHabitation($habitation);
}
# client validation
$errors = $this->validator->validate($client,null, $validators);
if ($errors->count()) {
foreach ($errors as $key => $error) {
$propertyPath = "client-{$error->getPropertyPath()}";
if (!$this->customJsonResponse->hasField($propertyPath)) {
$this->customJsonResponse->setField($propertyPath, $error->getMessage());
}
}
}
if ($this->customJsonResponse->hasAnyField()) {
$this->customJsonResponse->setForbidden(true);
return $this->customJsonResponse->sendResponse();
}
# set ville coordinates
$client->setVille($this->APIlocation->setVilleCoordinates($client->getVille()));
# animals
$animals = $clientData['animals'] ?? [];
if (!is_array($animals)) $animals = [];
if (!$animals) {
$this->customJsonResponse->setForbidden(true);
$this->customJsonResponse->setField("alert", $this->translator->trans('page_prise_appel.animals_empty', [], 'validators'));
return $this->customJsonResponse->sendResponse();
}
$currentAppelAnimals = $this->vetoadomEntityManager->getRepository(AppelAnimal::class)->findBy(['appel' => $appel, 'active' => 1]);
$animalsForAppel = [];
foreach ($animals as $animalIndex => $animalData) {
$animalId = (int)($animalData['id']) ?? 0;
$animal = $animalId ? $this->vetoadomEntityManager->getRepository(Animal::class)->findOneBy([
'id' => $animalId,
'client' => $client,
'active' => 1
]) : new Animal();
if ($animalId && !$animal) {
$this->customJsonResponse->setForbidden(true);
$this->customJsonResponse->setField("animal-nom-{$animalIndex}", $this->translator->trans('page_prise_appel.animal_unknown', [], 'validators'));
return $this->customJsonResponse->sendResponse();
}
$currentConsultation = null;
$appelAnimal = new AppelAnimal();
if ($animalId) {
foreach ($currentAppelAnimals as $currentAppelAnimal) {
if ($currentAppelAnimal->getAnimal()->getId() != $animalId) continue;
$currentConsultation = $this->vetoadomEntityManager->getRepository(Consultation::class)->findOneBy(['appelAnimal' => $currentAppelAnimal, 'active' => 1]);
$appelAnimal = $currentAppelAnimal;
break;
}
}
# need validate data for consultation, when :
# secteurFunctionnementChanged and this animal has currentConsultation
# OR action == 'appelValiderLaConsultation' and this animal has no currentConsultation (we must create it)
# OR action == 'appelModifier' and we modify sourceConsultation of this animal
$validateDataForConsultation = false;
if (
($secteurFunctionnementChanged && $currentConsultation)
|| ($action == 'appelValiderLaConsultation' && !$currentConsultation)
|| ($action == 'appelModifier' && $currentConsultation && $sourceConsultation && $currentConsultation->getId() == $sourceConsultation->getId())
) {
$validateDataForConsultation = true;
}
$validators = ['nom','animalEspece','animalSexe','dateNaissance'];
$animal->setNom($this->misc->toUpper($animalData['nom'] ?? ''));
$animalEspeceId = (int)($animalData['animalEspece'] ?? 0);
$animalEspece = $animalEspeceId ? $this->vetoadomEntityManager->getRepository(AnimalEspece::class)->findOneBy(['id' => $animalEspeceId]) : null;
$animal->setAnimalEspece($animalEspece);
$animalSexeId = (int)($animalData['animalSexe'] ?? 0);
$animalSexe = $animalSexeId ? $this->vetoadomEntityManager->getRepository(AnimalSexe::class)->findOneBy(['id' => $animalSexeId]) : null;
$animal->setAnimalSexe($animalSexe);
$animalRaceId = (int)($animalData['animalRace'] ?? 0);
$animal->setAnimalRace(
$animalRaceId && $animal->getAnimalEspece()
? $this->vetoadomEntityManager->getRepository(AnimalRace::class)->findOneBy(['id' => $animalRaceId, 'animalEspece' => $animal->getAnimalEspece()])
: null
);
if (
$animal->getAnimalRace()
&& $animal->getAnimalRace()->getCode() == 'autre'
) {
$validators[] = 'animalRaceAutreNom';
$animal->setAnimalRaceAutreNom($this->misc->toUpper($animalData['animalRaceAutreNom'] ?? ''));
}
else {
$animal->setAnimalRaceAutreNom(null);
}
if (($dateNaissance = \DateTime::createFromFormat("!Y-m-d", $animalData['dateNaissance'] ?? '')) !== false) {
$animal->setDateNaissance($dateNaissance);
}
else {
$animal->setDateNaissance(null);
}
if (!$animal->getDeces()) {
$animal->setDeces((bool)($animalData['deces'] ?? false));
}
if (
$validateDataForConsultation
&&
(
($animalData['euthanasie'] ?? false)
|| ($animalData['cremation'] ?? false)
)
) {
if (!$secteur->hasSecteurCategoriePoidsEspeceById($animalData['categoriePoids'] ?? 0)) {
$this->customJsonResponse->setField("animal-categoriePoids-{$animalIndex}", $this->translator->trans('common.blank', [], 'validators'));
}
}
# animal validation
$errors = $this->validator->validate($animal,null, $validators);
if ($errors->count()) {
foreach ($errors as $key => $error) {
$propertyPath = "animal-{$error->getPropertyPath()}-{$animalIndex}";
if (!$this->customJsonResponse->hasField($propertyPath)) {
$this->customJsonResponse->setField($propertyPath, $error->getMessage());
}
}
}
else if (!$animal->getId()) {
$animal->setClient($client);
$this->vetoadomEntityManager->persist($animal);
# add animalSite
$animalSite = new AnimalSite();
$animalSite->setAnimal($animal);
$animalSite->setSiteId($secteur->getSiteId());
$this->vetoadomEntityManager->persist($animalSite);
}
else {
# add animalSite if not exist for this siteId
$animalSite = $this->vetoadomEntityManager->getRepository(AnimalSite::class)->findOneBy(['animal' => $animal, 'siteId' => $secteur->getSiteId()]);
if (!$animalSite) {
$animalSite = new AnimalSite();
$animalSite->setAnimal($animal);
$animalSite->setSiteId($secteur->getSiteId());
$this->vetoadomEntityManager->persist($animalSite);
}
}
$animalsForAppel[] = [
'animal' => $animal,
'animalData' => $animalData,
'appelAnimal' => $appelAnimal,
'currentConsultation' => $currentConsultation,
'validateDataForConsultation' => $validateDataForConsultation
];
}
if ($this->customJsonResponse->hasAnyField()) {
$this->customJsonResponse->setForbidden(true);
return $this->customJsonResponse->sendResponse();
}
# delete animalAppel
$animalsToDeleteWithActiveConsultations = [];
foreach ($currentAppelAnimals as $key => $currentAppelAnimal) {
$found = false;
foreach ($animalsForAppel as $animalForAppel) {
if ($currentAppelAnimal->getAnimal()->getId() != $animalForAppel['animal']->getId()) continue;
$found = true;
break;
}
if (!$found) {
# check for exist active consultation
if ($this->vetoadomEntityManager->getRepository(Consultation::class)->findBy(['appelAnimal' => $currentAppelAnimal, 'active' => 1])) {
$animalsToDeleteWithActiveConsultations[] = $currentAppelAnimal->getAnimal()->getNom();
}
else {
$currentAppelAnimal->setActive(0);
unset($currentAppelAnimals[$key]);
}
}
}
if ($animalsToDeleteWithActiveConsultations) {
$this->customJsonResponse->setField('alert', $this->translator->trans('page_prise_appel.appel_supprimer_animals_with_active_consultations', ['{{animalNom}}' => implode(",",$animalsToDeleteWithActiveConsultations)], 'validators'));
$this->customJsonResponse->setForbidden(true);
return $this->customJsonResponse->sendResponse();
}
# if this is not secteur functionnement change
# if action = appelValiderLaConsultation (we create consultations)
# if any animal has currentConsultation
if (
!$secteurFunctionnementChanged
&& $action == 'appelValiderLaConsultation'
&& !$request->get('recreateConsultationsConfirmed')
) {
$animalsWithCurentConsultations = [];
/** @var Consultation $currentConsultation */
$currentConsultation = null;
foreach ($animalsForAppel as $item) {
if (!$item['currentConsultation']) continue;
$animalsWithCurentConsultations[] = $item['animal']->getNom();
$currentConsultation = $item['currentConsultation'];
}
if ($animalsWithCurentConsultations) {
$this->customJsonResponse->setField('recreateConsultationsConfirm', $this->translator->trans('page_prise_appel.appel_valider_consultation_animals_with_active_consultations', [
'{{animalNom}}' => implode(",",$animalsWithCurentConsultations),
'{{dateDebut}}' => $currentConsultation->getDebutConsultation()->format('d/m'),
'{{heureDebut}}' => $currentConsultation->getDebutConsultation()->format('H:i'),
], 'validators'));
$this->customJsonResponse->setForbidden(true);
return $this->customJsonResponse->sendResponse();
}
}
# deactivate current consultations
# if this is secteur functionnement change and there is current consultations
# or action = appelValiderLaConsultation
if (
($secteurFunctionnementChanged && $appelConsultations)
|| $action == 'appelValiderLaConsultation'
) {
foreach ($animalsForAppel as $item) {
if (!$item['currentConsultation']) continue;
/** @var Consultation $currentConsultation */
$currentConsultation = $item['currentConsultation'];
$currentConsultation->setActive(0);
}
}
# appel
$validators = ['referant','motifAppel','informationInterne'];
$appelData = $request->get('appel') ?? [];
if (!is_array($appelData)) $appelData = [];
$referantId = (int)($appelData['referantId'] ?? 0);
$referant = $referantId ? $this->vetoadomEntityManager->getRepository(Referant::class)->findOneBy(['id' => $referantId]) : null;
if ($secteurChanged) {
$appel->setRegulateurId($request->get('regulateurId') ?? 0);
$appel->setSuperviseurId($request->get('superviseurId') ?? 0);
$appel->setAstreinteChirurgieId($request->get('astreinteChirurgieId'));
$appel->setVetcoachId($request->get('vetcoachId'));
}
$appel->setLangue($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\Langue',$request->get('langueId')));
$appel->setReferant($referant);
$appel->setMotifAppel($appelData['motifAppel'] ?? '');
$appel->setInformationInterne($appelData['informationInterne'] ?? '');
if ($secteur->getFonctionnement()->getCode() == 'domicile') {
$appel->setVille($client->getVille());
$secteurZoneId = (int)($request->get('secteurZoneId') ?? 0);
$secteurZone = $secteurZoneId ? $this->vetoadomEntityManager->getRepository(SecteurZone::class)->findOneBy(['id' => $secteurZoneId,'secteur' => $secteur]) : null;
$appel->setSecteurZone($secteurZone);
if (
$appelConsultations
&& !$appel->getSecteurZone()
&& !$this->customJsonResponse->hasField('alert')
) {
$this->customJsonResponse->setField('alert', $this->translator->trans('page_prise_appel_client.tarif_deplacement_secteur_zone_text_hors_du_perimetre_action_no_secteurs', [], 'messages'));
}
}
# appel validation
$errors = $this->validator->validate($appel,null, $validators);
if ($errors->count()) {
foreach ($errors as $key => $error) {
if (!$this->customJsonResponse->hasField($error->getPropertyPath())) {
$this->customJsonResponse->setField($error->getPropertyPath(), $error->getMessage());
}
}
}
if ($this->customJsonResponse->hasAnyField()) {
$this->customJsonResponse->setForbidden(true);
return $this->customJsonResponse->sendResponse();
}
$appelAnimals = [];
foreach ($animalsForAppel as $item) {
$appelAnimal = $item['appelAnimal'];
$appelAnimal->setAppel($appel);
$appelAnimal->setAnimal($item['animal']);
if (
$item['validateDataForConsultation']
&&
(
($item['animalData']['euthanasie'] ?? false)
|| ($item['animalData']['cremation'] ?? false)
)
) {
$appelAnimal->setSecteurCategoriePoidsEspece($secteur->getSecteurCategoriePoidsEspeceById($item['animalData']['categoriePoids']));
}
else {
$appelAnimal->setSecteurCategoriePoidsEspece(null);
}
if (!$appelAnimal->getId()) {
$this->vetoadomEntityManager->persist($appelAnimal);
}
$appelAnimals[] = $appelAnimal;
}
# consultation
# if this is secteur functionnement change and there is current consultations
# or action = appelValiderLaConsultation
# or we have sourceConsultation
if (
($secteurFunctionnementChanged && $appelConsultations)
|| $action == 'appelValiderLaConsultation'
|| $sourceConsultation
) {
$infoConsultation = $request->get('infoConsultation') ?? [];
if (!is_array($infoConsultation)) $infoConsultation = [];
$validators = ['tarif', 'infoArv'];
# consultations creation
# if this is secteur functionnement change and there is current consultations
# or action = appelValiderLaConsultation
if (
($secteurFunctionnementChanged && $appelConsultations)
|| $action == 'appelValiderLaConsultation'
) {
$consultationCommon = new Consultation();
}
# consultaion modification
else {
$consultationCommon = $sourceConsultation;
}
$tarifId = (int)($request->get('consultationTarifId') ?? 0);
$tarif = $tarifId ? $this->vetoadomEntityManager->getRepository(Tarif::class)->findOneBy(['id' => $tarifId, 'active' => 1]) : null;
$consultationCommon->setTarif($tarif);
$consultationCommon->setTarifConsultation($request->get('tarifConsultation') ?? 0);
if ($secteur->getFonctionnement()->getCode() == 'domicile') {
$consultationCommon->setHorsZoneDistance($request->get('horsZoneDistance') ?? 0);
$consultationCommon->setTarifDeplacement($request->get('tarifDeplacement') ?? 0);
$consultationCommon->setConsultationEtat($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\ConsultationEtat', 6));
$consultationRefereeCliniqueId = (int)($request->get('consultationRefereeCliniqueId') ?? 0);
$referant = $consultationRefereeCliniqueId ? $this->vetoadomEntityManager->getRepository(Referant::class)->findOneBy(['id' => $consultationRefereeCliniqueId]) : null;
$consultationCommon->setConsultationRefereeClinique($referant);
$consultationDelaiUrgenceCode = $infoConsultation['delaiUrgenceCode'] ?? '';
$consultationDelaiUrgence = $consultationDelaiUrgenceCode !== '' ? $this->vetoadomEntityManager->getRepository(ConsultationDelaiUrgence::class)->findOneBy(['code' => $consultationDelaiUrgenceCode]) : null;
$consultationDelaiUrgenceChanged = !$consultationCommon->getConsultationDelaiUrgence() || $consultationCommon->getConsultationDelaiUrgence()->getCode() != $consultationDelaiUrgenceCode;
$consultationCommon->setConsultationDelaiUrgence($consultationDelaiUrgence);
if (!$consultationCommon->getConsultationDelaiUrgence()) {
$this->customJsonResponse->setField('infoConsultation-delaiUrgence', $this->translator->trans('common.blank', [], 'validators'));
} else if ($consultationDelaiUrgenceCode == 'dans_heure') {
$debutHeure = \DateTime::createFromFormat("!H:i", $infoConsultation['debutHeure'] ?? '');
$finHeure = \DateTime::createFromFormat("!H:i", $infoConsultation['finHeure'] ?? '');
if ($debutHeure === false) {
$this->customJsonResponse->setField('infoConsultation-debutHeure', $this->translator->trans('common.blank', [], 'validators'));
}
if ($finHeure === false) {
$this->customJsonResponse->setField('infoConsultation-finHeure', $this->translator->trans('common.blank', [], 'validators'));
}
if ($debutHeure !== false && $finHeure !== false) {
$debutConsultation = $consultationDelaiUrgenceChanged ? new \DateTime() : $consultationCommon->getDebutConsultation();
$debutConsultation->setTime($debutHeure->format('H'), $debutHeure->format('i'));
$consultationCommon->setDebutConsultation($debutConsultation);
$finConsultation = $consultationDelaiUrgenceChanged ? new \DateTime() : $consultationCommon->getFinConsultation();
$finConsultation->setTime($finHeure->format('H'), $finHeure->format('i'));
if ($debutConsultation >= $finConsultation) {
$finConsultation->add(new \DateInterval('P1D'));
}
$consultationCommon->setFinConsultation($finConsultation);
}
} else if ($consultationDelaiUrgenceCode == 'prioritaire') {
if ($consultationDelaiUrgenceChanged) {
$consultationCommon->setDebutConsultation(new \DateTime());
}
} else if ($consultationDelaiUrgenceCode == 'delai_a_preciser') {
$date = \DateTime::createFromFormat("!Y-m-d", $infoConsultation['date'] ?? '');
if ($date === false) {
$this->customJsonResponse->setField('infoConsultation-date', $this->translator->trans('common.blank', [], 'validators'));
}
$debutHeure = \DateTime::createFromFormat("!H:i", $infoConsultation['debutHeure'] ?? '');
$finHeure = \DateTime::createFromFormat("!H:i", $infoConsultation['finHeure'] ?? '');
if ($debutHeure === false) {
$this->customJsonResponse->setField('infoConsultation-debutHeure', $this->translator->trans('common.blank', [], 'validators'));
}
if ($finHeure === false) {
$this->customJsonResponse->setField('infoConsultation-finHeure', $this->translator->trans('common.blank', [], 'validators'));
}
if ($date !== false && $debutHeure !== false && $finHeure !== false) {
$debutConsultation = clone($date);
$debutConsultation->setTime($debutHeure->format('H'), $debutHeure->format('i'));
$consultationCommon->setDebutConsultation($debutConsultation);
$finConsultation = clone($date);
$finConsultation->setTime($finHeure->format('H'), $finHeure->format('i'));
if ($debutConsultation >= $finConsultation) {
$finConsultation->add(new \DateInterval('P1D'));
}
$consultationCommon->setFinConsultation($finConsultation);
}
}
} else {
$consultationCommon->setConsultationEtat($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\ConsultationEtat', 1));
$date = \DateTime::createFromFormat("!Y-m-d", $infoConsultation['date'] ?? '');
$heure = \DateTime::createFromFormat("!H:i", $infoConsultation['heure'] ?? '');
if ($date === false) {
$this->customJsonResponse->setField('infoConsultation-date', $this->translator->trans('common.blank', [], 'validators'));
}
if ($heure === false) {
$this->customJsonResponse->setField('infoConsultation-heure', $this->translator->trans('common.blank', [], 'validators'));
}
if ($date !== false && $heure !== false) {
$date->setTime($heure->format('H'), $heure->format('i'));
$consultationCommon->setDebutConsultation($date);
}
}
$consultationCommon->setInfoArv(trim($infoConsultation['infoArv'] ?? ''));
$veterinaireIntervenantId = (int)($infoConsultation['veterinaireIntervenantId'] ?? 0);
$veterinairesPlanning = $this->priseAppelHelper->getVeterinairesPlanning($secteur);
if (in_array($veterinaireIntervenantId, array_column($veterinairesPlanning, 'id'))) {
$consultationCommon->setVeterinaireIntervenantId($veterinaireIntervenantId);
} else {
$consultationCommon->setVeterinaireIntervenantId(null);
}
# consultation validation
$errors = $this->validator->validate($consultationCommon, null, $validators);
if ($errors->count()) {
foreach ($errors as $key => $error) {
$propertyPath = 'infoConsultation-' . $error->getPropertyPath();
if (!$this->customJsonResponse->hasField($propertyPath)) {
$this->customJsonResponse->setField($propertyPath, $error->getMessage());
}
}
}
if ($this->customJsonResponse->hasAnyField()) {
$this->customJsonResponse->setForbidden(true);
return $this->customJsonResponse->sendResponse();
}
foreach ($animals as $animalIndex => $animalData) {
# consultation
# creation
$currentOperationsSpecifique = [];
if (!$consultationCommon->getId()) {
$consultation = clone $consultationCommon;
# reset tarifDeplacement for next consultations, save it only in first one
$consultationCommon->setTarifDeplacement(null);
$consultation->setAppelAnimal($appelAnimals[$animalIndex]);
}
# modification
else {
# skip other animals
if ($appelAnimals[$animalIndex]->getAnimal()->getId() != $consultationCommon->getAppelAnimal()->getAnimal()->getId()) continue;
$consultation = $consultationCommon;
$currentOperationsSpecifique = $this->vetoadomEntityManager->getRepository(ConsultationAnimalOperationSpecifique::class)->findBy(['consultation' => $consultation, 'active' => 1]);
}
# consultationAnimalOperationSpecifique
$totalTarifSpecifique = 0;
$newOperationsSpecifique = [];
if (($animalData['euthanasie'] ?? false)) {
$consultationAnimalOperationSpecifique = new ConsultationAnimalOperationSpecifique();
$consultationAnimalOperationSpecifique->setOperationSpecifique($this->vetoadomEntityManager->getRepository(OperationSpecifique::class)->findOneBy(['code' => 'euthanasie']));
foreach ($currentOperationsSpecifique as $item) {
if ($item->getOperationSpecifique()->getId() != $consultationAnimalOperationSpecifique->getOperationSpecifique()->getId()) continue;
$consultationAnimalOperationSpecifique = $item;
break;
}
$consultationAnimalOperationSpecifique->setConsultation($consultation);
$consultationAnimalOperationSpecifique->setTarifOperationSpecifique((int)($animalData['euthanasiePrix'] ?? 0));
if (!$consultationAnimalOperationSpecifique->getId()) {
$this->vetoadomEntityManager->persist($consultationAnimalOperationSpecifique);
}
else {
$newOperationsSpecifique[] = $consultationAnimalOperationSpecifique->getId();
}
$totalTarifSpecifique += $consultationAnimalOperationSpecifique->getTarifOperationSpecifique();
}
if (($animalData['cremation'] ?? false)) {
$operationSpecifiqueCode = $animalData['operationSpecifiqueCode'] ?? 'collective';
if ($operationSpecifiqueCode == 'collective') {
$consultationAnimalOperationSpecifique = new ConsultationAnimalOperationSpecifique();
$consultationAnimalOperationSpecifique->setConsultation($consultation);
$consultationAnimalOperationSpecifique->setOperationSpecifique($this->vetoadomEntityManager->getRepository(OperationSpecifique::class)->findOneBy(['code' => 'cremation_collective']));
foreach ($currentOperationsSpecifique as $item) {
if ($item->getOperationSpecifique()->getId() != $consultationAnimalOperationSpecifique->getOperationSpecifique()->getId()) continue;
$consultationAnimalOperationSpecifique = $item;
break;
}
$consultationAnimalOperationSpecifique->setTarifOperationSpecifique((int)($animalData['cremationPrix'] ?? 0));
if (!$consultationAnimalOperationSpecifique->getId()) {
$this->vetoadomEntityManager->persist($consultationAnimalOperationSpecifique);
}
else {
$newOperationsSpecifique[] = $consultationAnimalOperationSpecifique->getId();
}
$totalTarifSpecifique += $consultationAnimalOperationSpecifique->getTarifOperationSpecifique();
$consultationAnimalOperationSpecifique = new ConsultationAnimalOperationSpecifique();
$consultationAnimalOperationSpecifique->setConsultation($consultation);
$consultationAnimalOperationSpecifique->setOperationSpecifique($this->vetoadomEntityManager->getRepository(OperationSpecifique::class)->findOneBy(['code' => 'prise_en_charge_du_corps_pour_collective']));
foreach ($currentOperationsSpecifique as $item) {
if ($item->getOperationSpecifique()->getId() != $consultationAnimalOperationSpecifique->getOperationSpecifique()->getId()) continue;
$consultationAnimalOperationSpecifique = $item;
break;
}
$consultationAnimalOperationSpecifique->setTarifOperationSpecifique((int)($animalData['pecPrix'] ?? 0));
if (!$consultationAnimalOperationSpecifique->getId()) {
$this->vetoadomEntityManager->persist($consultationAnimalOperationSpecifique);
}
else {
$newOperationsSpecifique[] = $consultationAnimalOperationSpecifique->getId();
}
$totalTarifSpecifique += $consultationAnimalOperationSpecifique->getTarifOperationSpecifique();
} else if ($operationSpecifiqueCode == 'individuelle') {
$consultationAnimalOperationSpecifique = new ConsultationAnimalOperationSpecifique();
$consultationAnimalOperationSpecifique->setConsultation($consultation);
$consultationAnimalOperationSpecifique->setOperationSpecifique($this->vetoadomEntityManager->getRepository(OperationSpecifique::class)->findOneBy(['code' => 'cremation_individuelle']));
foreach ($currentOperationsSpecifique as $item) {
if ($item->getOperationSpecifique()->getId() != $consultationAnimalOperationSpecifique->getOperationSpecifique()->getId()) continue;
$consultationAnimalOperationSpecifique = $item;
break;
}
$consultationAnimalOperationSpecifique->setTarifOperationSpecifique((int)($animalData['cremationPrix'] ?? 0));
if (!$consultationAnimalOperationSpecifique->getId()) {
$this->vetoadomEntityManager->persist($consultationAnimalOperationSpecifique);
}
else {
$newOperationsSpecifique[] = $consultationAnimalOperationSpecifique->getId();
}
$totalTarifSpecifique += $consultationAnimalOperationSpecifique->getTarifOperationSpecifique();
$consultationAnimalOperationSpecifique = new ConsultationAnimalOperationSpecifique();
$consultationAnimalOperationSpecifique->setConsultation($consultation);
$consultationAnimalOperationSpecifique->setOperationSpecifique($this->vetoadomEntityManager->getRepository(OperationSpecifique::class)->findOneBy(['code' => 'prise_en_charge_du_corps_pour_individuelle']));
foreach ($currentOperationsSpecifique as $item) {
if ($item->getOperationSpecifique()->getId() != $consultationAnimalOperationSpecifique->getOperationSpecifique()->getId()) continue;
$consultationAnimalOperationSpecifique = $item;
break;
}
$consultationAnimalOperationSpecifique->setTarifOperationSpecifique((int)($animalData['pecPrix'] ?? 0));
if (!$consultationAnimalOperationSpecifique->getId()) {
$this->vetoadomEntityManager->persist($consultationAnimalOperationSpecifique);
}
else {
$newOperationsSpecifique[] = $consultationAnimalOperationSpecifique->getId();
}
$totalTarifSpecifique += $consultationAnimalOperationSpecifique->getTarifOperationSpecifique();
} else if ($operationSpecifiqueCode == 'individuelle_assistee') {
$consultationAnimalOperationSpecifique = new ConsultationAnimalOperationSpecifique();
$consultationAnimalOperationSpecifique->setConsultation($consultation);
$consultationAnimalOperationSpecifique->setOperationSpecifique($this->vetoadomEntityManager->getRepository(OperationSpecifique::class)->findOneBy(['code' => 'cremation_individuelle_assistee']));
foreach ($currentOperationsSpecifique as $item) {
if ($item->getOperationSpecifique()->getId() != $consultationAnimalOperationSpecifique->getOperationSpecifique()->getId()) continue;
$consultationAnimalOperationSpecifique = $item;
break;
}
$consultationAnimalOperationSpecifique->setTarifOperationSpecifique((int)($animalData['cremationPrix'] ?? 0));
if (!$consultationAnimalOperationSpecifique->getId()) {
$this->vetoadomEntityManager->persist($consultationAnimalOperationSpecifique);
}
else {
$newOperationsSpecifique[] = $consultationAnimalOperationSpecifique->getId();
}
$totalTarifSpecifique += $consultationAnimalOperationSpecifique->getTarifOperationSpecifique();
$consultationAnimalOperationSpecifique = new ConsultationAnimalOperationSpecifique();
$consultationAnimalOperationSpecifique->setConsultation($consultation);
$consultationAnimalOperationSpecifique->setOperationSpecifique($this->vetoadomEntityManager->getRepository(OperationSpecifique::class)->findOneBy(['code' => 'prise_en_charge_du_corps_pour_individuelle_assistee']));
foreach ($currentOperationsSpecifique as $item) {
if ($item->getOperationSpecifique()->getId() != $consultationAnimalOperationSpecifique->getOperationSpecifique()->getId()) continue;
$consultationAnimalOperationSpecifique = $item;
break;
}
$consultationAnimalOperationSpecifique->setTarifOperationSpecifique((int)($animalData['pecPrix'] ?? 0));
if (!$consultationAnimalOperationSpecifique->getId()) {
$this->vetoadomEntityManager->persist($consultationAnimalOperationSpecifique);
}
else {
$newOperationsSpecifique[] = $consultationAnimalOperationSpecifique->getId();
}
$totalTarifSpecifique += $consultationAnimalOperationSpecifique->getTarifOperationSpecifique();
}
}
$consultation->setTarifTotal($consultation->getTarifDeplacement() + $consultation->getTarifConsultation() + $totalTarifSpecifique);
# creation
if (!$consultation->getId()) {
$this->vetoadomEntityManager->persist($consultation);
$consultationEtatHistorique = new ConsultationEtatHistorique();
$consultationEtatHistorique->setConsultation($consultation);
$consultationEtatHistorique->setConsultationEtat($consultation->getConsultationEtat());
$consultationEtatHistorique->setSaisieUserId($appel->getSaisieUserId());
$this->vetoadomEntityManager->persist($consultationEtatHistorique);
}
# modification
else {
# deactivate current operations specifique, which was removed
foreach ($currentOperationsSpecifique as $currentOperationSpecifique) {
if (in_array($currentOperationSpecifique->getId(),$newOperationsSpecifique)) continue;
$currentOperationSpecifique->setActive(0);
}
# skip other animals
break;
}
}
}
unset($consultationCommon);
# redirect to messages
if ($sourceMessage) {
if ($sourceMessage->getMessageEtat()->getId() == 1) {
$veterinairesPlanning = $this->priseAppelHelper->getVeterinairesPlanning($secteur);
# admin/regulateur
if ($this->isGranted('ROLE_ADMIN') || in_array($user->getId(), array_column($veterinairesPlanning, 'id'))) {
$sourceMessage->setMessageEtat($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\MessageEtat', 2));
$appel->setRegulateurId($user->getId());
}
if ($action == 'appelValiderLaConsultation') {
$sourceMessage->setContenu($sourceMessage->getContenu() . $this->translator->trans('page_prise_appel.appel_valider_la_consultation_message_append', [], 'messages'));
$this->customJsonResponse->setField('message', $this->translator->trans('page_prise_appel.appel_valider_la_consultation_success', [], 'messages'));
$this->customJsonResponse->setRedirect($this->urlGenerator->generate('app_prise_appel', ['secteurId' => $secteur->getId(), 'tab' => 'resume']));
} else {
$this->customJsonResponse->setRedirect($this->urlGenerator->generate('app_prise_appel', ['secteurId' => $secteur->getId(), 'tab' => 'messages']));
}
}
else {
$this->customJsonResponse->setRedirect($this->urlGenerator->generate('app_prise_appel', ['secteurId' => $secteur->getId(), 'tab' => 'messages']));
}
}
# redirect to resume
else {
$this->customJsonResponse->setRedirect($this->urlGenerator->generate('app_prise_appel', ['secteurId' => $secteur->getId(), 'tab' => 'resume']));
}
$this->vetoadomEntityManager->flush();
return $this->customJsonResponse->sendResponse();
}
break;
case 'getMessages':
{
$this->customJsonResponse->setField('messages', $this->priseAppelHelper->getMessages($secteur));
return $this->customJsonResponse->sendResponse();
}
break;
case 'messageSupprimer':
{
if (!$this->isGranted('ROLE_ADMIN')) {
$this->customJsonResponse->setForbidden(true);
$this->customJsonResponse->setField('alert', $this->translator->trans('common.action_unknown', [], 'validators'));
return $this->customJsonResponse->sendResponse();
}
$id = (int)($request->get('id') ?? 0);
$message = $id ? $this->vetoadomEntityManager->getRepository(Message::class)->findOneBy(['id' => $id, 'active' => 1, 'secteur' => $secteur]) : null;
if (!$message) {
$this->customJsonResponse->setForbidden(true);
$this->customJsonResponse->setField('alert', $this->translator->trans('page_prise_appel_messages.message_unknown', [], 'validators'));
return $this->customJsonResponse->sendResponse();
}
$validators = ['motifSuppression'];
$message->setActive(0);
$message->setDateSuppression(new \DateTime());
$message->setUserSuppressionId($user->getId());
$message->setMotifSuppression(trim($request->get('motifSuppression') ?? ''));
# message validation
$errors = $this->validator->validate($message,null, $validators);
if ($errors->count()) {
foreach ($errors as $key => $error) {
$propertyPath = "message-{$error->getPropertyPath()}";
if (!$this->customJsonResponse->hasField($propertyPath)) {
$this->customJsonResponse->setField($propertyPath, $error->getMessage());
}
}
}
if ($this->customJsonResponse->hasAnyField()) {
$this->customJsonResponse->setForbidden(true);
return $this->customJsonResponse->sendResponse();
}
$this->vetoadomEntityManager->flush();
$this->customJsonResponse->setField('message', $this->translator->trans('page_prise_appel_messages.message_supprime', [], 'messages'));
$this->customJsonResponse->setField('messages', $this->priseAppelHelper->getMessages($secteur));
return $this->customJsonResponse->sendResponse();
}
break;
case 'messageReferantSuiteRegulation':
{
if (!$this->isGranted('ROLE_ADMIN')) {
$this->customJsonResponse->setForbidden(true);
$this->customJsonResponse->setField('alert', $this->translator->trans('common.action_unknown', [], 'validators'));
return $this->customJsonResponse->sendResponse();
}
$id = (int)($request->get('id') ?? 0);
$message = $id ? $this->vetoadomEntityManager->getRepository(Message::class)->findOneBy(['id' => $id, 'active' => 1, 'messageEtat' => 2, 'secteur' => $secteur]) : null;
if (!$message) {
$this->customJsonResponse->setForbidden(true);
$this->customJsonResponse->setField('alert', $this->translator->trans('page_prise_appel_messages.message_unknown', [], 'validators'));
return $this->customJsonResponse->sendResponse();
}
$message->setMessageEtat($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\MessageEtat',3));
$this->vetoadomEntityManager->flush();
# send email
$this->sendEmail->messageReferantSuiteRegulation($message);
$this->customJsonResponse->setField('message', $this->translator->trans('page_prise_appel_messages.email_envoye', [], 'messages'));
$this->customJsonResponse->setField('messages', $this->priseAppelHelper->getMessages($secteur));
return $this->customJsonResponse->sendResponse();
}
break;
case 'messageMauvaiseGestion':
{
$id = (int)($request->get('id') ?? 0);
$message = $id ? $this->vetoadomEntityManager->getRepository(Message::class)->findOneBy(['id' => $id, 'active' => 1, 'secteur' => $secteur]) : null;
if (!$message) {
$this->customJsonResponse->setForbidden(true);
$this->customJsonResponse->setField('alert', $this->translator->trans('page_prise_appel_messages.message_unknown', [], 'validators'));
return $this->customJsonResponse->sendResponse();
}
$validators = ['motif'];
$messageMauvaiseGestion = new MessageMauvaiseGestion();
$messageMauvaiseGestion->setMessage($message);
$messageMauvaiseGestion->setSaisieUserId($user->getId());
$messageMauvaiseGestion->setMotif(trim($request->get('mauvaiseGestionMotif') ?? ''));
# messageMauvaiseGestion validation
$errors = $this->validator->validate($messageMauvaiseGestion,null, $validators);
if ($errors->count()) {
foreach ($errors as $key => $error) {
$propertyPath = "messageMauvaiseGestion-{$error->getPropertyPath()}";
if (!$this->customJsonResponse->hasField($propertyPath)) {
$this->customJsonResponse->setField($propertyPath, $error->getMessage());
}
}
}
if ($this->customJsonResponse->hasAnyField()) {
$this->customJsonResponse->setForbidden(true);
return $this->customJsonResponse->sendResponse();
}
$this->vetoadomEntityManager->persist($messageMauvaiseGestion);
$this->vetoadomEntityManager->flush();
# send email
$this->sendEmail->messageMauvaiseGestion($messageMauvaiseGestion);
$this->customJsonResponse->setField('message', $this->translator->trans('page_prise_appel_messages.email_envoye', [], 'messages'));
$this->customJsonResponse->setField('messages', $this->priseAppelHelper->getMessages($secteur));
return $this->customJsonResponse->sendResponse();
}
break;
case 'envoyerMessagesTraites':
{
$this->priseAppelHelper->envoyerMessagesTraites($secteur);
$this->customJsonResponse->setField('message', $this->translator->trans('page_prise_appel_messages.emails_envoyes', [], 'messages'));
$this->customJsonResponse->setField('messages', $this->priseAppelHelper->getMessages($secteur));
return $this->customJsonResponse->sendResponse();
}
break;
case 'getSecteurContent':
case 'saveSecteurContent':
{
$contentField = $request->get('contentField') ?? '';
if (
!in_array($contentField,['contentInfosAdmin','contentProcessus','contentContactsUtiles','contentInfosSecteur','contentEstimatifTarifs'])
|| ($contentField == 'contentInfosAdmin' && !$this->isGranted('ROLE_ADMIN'))
) {
$this->customJsonResponse->setForbidden(true);
$this->customJsonResponse->setField('alert', $this->translator->trans('common.action_unknown', [], 'validators'));
return $this->customJsonResponse->sendResponse();
}
if ($action == 'getSecteurContent') {
$this->customJsonResponse->setField('contentFieldValue', $secteur->{'get' . ucfirst($contentField)}() ?? '');
return $this->customJsonResponse->sendResponse();
}
$secteur->{'set' . ucfirst($contentField)}(trim($request->get('contentFieldValue') ?? ''));
$this->vetoadomEntityManager->flush();
return $this->customJsonResponse->sendResponse();
}
break;
case 'getCliniqueMapMarkers':
{
if ($secteur->getFonctionnement()->getCode() != 'clinique') {
$this->customJsonResponse->setForbidden(true);
$this->customJsonResponse->setField('alert', $this->translator->trans('common.action_unknown', [], 'validators'));
return $this->customJsonResponse->sendResponse();
}
$clientVilleId = (int)($request->get('clientVilleId') ?? 0);
$clientNom = $request->get('clientNom') ?? '';
$this->customJsonResponse->setField('mapMarkers', $this->priseAppelHelper->getCliniqueMapMarkers($secteur,$clientVilleId,$clientNom));
return $this->customJsonResponse->sendResponse();
}
break;
case 'getDomicileConsultationsMapMarkers':
{
$this->customJsonResponse->setField('mapMarkers',$this->priseAppelHelper->getDomicileConsultationsMapMarkers($secteur));
return $this->customJsonResponse->sendResponse();
}
break;
case 'consultationConfirmVeterinaireIntervenant':
{
$consultationId = (int)($request->get('id') ?? 0);
$consultation = $consultationId ? $this->vetoadomEntityManager->getRepository(Consultation::class)->findOneBy(['id' => $consultationId, 'active' => 1, 'consultationEtat' => 7]) : null;
if (
!$consultation
|| $consultation->getAppelAnimal()->getAppel()->getSecteur()->getId() != $secteur->getId()
) {
$this->customJsonResponse->setForbidden(true);
$this->customJsonResponse->setField('alert', $this->translator->trans('page_prise_appel_resume.consultation_unknown', [], 'validators'));
return $this->customJsonResponse->sendResponse();
}
$consultation->setConsultationEtat($this->vetoadomEntityManager->getReference('App\Entity\Vetoadom\ConsultationEtat',3));
$consultationEtatHistorique = new ConsultationEtatHistorique();
$consultationEtatHistorique->setConsultation($consultation);
$consultationEtatHistorique->setConsultationEtat($consultation->getConsultationEtat());
$consultationEtatHistorique->setSaisieUserId($user->getId());
$this->vetoadomEntityManager->persist($consultationEtatHistorique);
$userPositionLog = new UserPositionLog();
$userPositionLog->setConsultation($consultation);
$userPositionLog->setUserId($consultation->getVeterinaireIntervenantId());
$userPositionLog->setPlanningJourId($consultation->getPlanningJourId());
$userPositionLog->setUserPositionLogEtat($this->vetoadomEntityManager->getRepository(UserPositionLogEtat::class)->findOneBy(['id' => 2]));
$userPositionLog->setVille($consultation->getAppelAnimal()->getAppel()->getClient()->getVille());
$this->vetoadomEntityManager->persist($userPositionLog);
$this->vetoadomEntityManager->flush();
$this->customJsonResponse->setField('mapMarkers',$this->priseAppelHelper->getDomicileConsultationsMapMarkers($secteur));
return $this->customJsonResponse->sendResponse();
}
break;
case 'saveVetForceEtat':
{
$userId = (int)($request->get('userId') ?? 0);
$userPositionLogLast = $userId ? $this->vetoadomEntityManager->getRepository(UserPositionLog::class)->findOneBy(['userId' => $userId],['id' => 'DESC']) : null;
if (!$userPositionLogLast) {
return $this->customJsonResponse->sendResponse();
}
$userPotitionLogEtatId = (int)($request->get('userPotitionLogEtatId') ?? 0);
$userPotitionLogEtat = $userPotitionLogEtatId ? $this->vetoadomEntityManager->getRepository(UserPositionLogEtat::class)->findOneBy(['id' => $userPotitionLogEtatId]) : null;
if (!$userPotitionLogEtat) {
$this->customJsonResponse->setForbidden(true);
$this->customJsonResponse->setField('vetForce-userPotitionLogEtat', $this->translator->trans('common.blank', [], 'validators'));
return $this->customJsonResponse->sendResponse();
}
$userPositionLog = new UserPositionLog();
$userPositionLog->setUserId($userId);
$userPositionLog->setPlanningJourId($userPositionLogLast->getPlanningJourId());
$userPositionLog->setVille($userPositionLogLast->getVille());
$userPositionLog->setUserPositionLogEtat($userPotitionLogEtat);
$this->vetoadomEntityManager->persist($userPositionLog);
$this->vetoadomEntityManager->flush();
$this->customJsonResponse->setField('mapMarkers',$this->priseAppelHelper->getDomicileConsultationsMapMarkers($secteur));
return $this->customJsonResponse->sendResponse();
}
break;
case 'saveVetForcePosition':
{
$userId = (int)($request->get('userId') ?? 0);
$userPositionLogLast = $userId ? $this->vetoadomEntityManager->getRepository(UserPositionLog::class)->findOneBy(['userId' => $userId],['id' => 'DESC']) : null;
if (!$userPositionLogLast) {
return $this->customJsonResponse->sendResponse();
}
$villeId = (int)($request->get('villeId') ?? 0);
$ville = $villeId ? $this->vetoadomEntityManager->getRepository(Ville::class)->findOneBy(['id' => $villeId]) : null;
if (!$ville) {
$this->customJsonResponse->setForbidden(true);
$this->customJsonResponse->setField('vetForce-ville', $this->translator->trans('common.blank', [], 'validators'));
return $this->customJsonResponse->sendResponse();
}
$this->APIlocation->setVilleCoordinates($ville);
$userPositionLog = new UserPositionLog();
$userPositionLog->setUserId($userId);
$userPositionLog->setPlanningJourId($userPositionLogLast->getPlanningJourId());
$userPositionLog->setVille($ville);
$userPositionLog->setUserPositionLogEtat($userPositionLogLast->getUserPositionLogEtat());
$this->vetoadomEntityManager->persist($userPositionLog);
$this->vetoadomEntityManager->flush();
$this->customJsonResponse->setField('mapMarkers',$this->priseAppelHelper->getDomicileConsultationsMapMarkers($secteur));
return $this->customJsonResponse->sendResponse();
}
break;
case 'getVetInformationTemporaire':
{
$userId = (int)($request->get('userId') ?? 0);
$this->customJsonResponse->setField('vetInformationTemporaire',$this->priseAppelHelper->getVetInformationTemporaire($userId));
return $this->customJsonResponse->sendResponse();
}
break;
case 'saveVetInformationTemporaire':
{
$id = (int)($request->get('id') ?? 0);
$vetInformationTemporaire = $this->vetoadomEntityManager->getRepository(UserInformationTemporaire::class)->findOneBy(['id' => $id, 'active' => 1]) ?? new UserInformationTemporaire();
$validators = ['information'];
$vetInformationTemporaire->setInformation(trim($request->get('information') ?? ''));
$dateDebut = \DateTime::createFromFormat("!Y-m-d", $request->get('dateDebut') ?? '');
$heureDebut = \DateTime::createFromFormat("!H:i", $request->get('heureDebut') ?? '');
if ($dateDebut === false) {
$this->customJsonResponse->setField('vetInformationTemporaire-dateDebut', $this->translator->trans('common.blank', [], 'validators'));
}
if ($heureDebut === false) {
$this->customJsonResponse->setField('vetInformationTemporaire-heureDebut', $this->translator->trans('common.blank', [], 'validators'));
}
$dateFin = \DateTime::createFromFormat("!Y-m-d", $request->get('dateFin') ?? '');
$heureFin = \DateTime::createFromFormat("!H:i", $request->get('heureFin') ?? '');
if ($dateFin === false) {
$this->customJsonResponse->setField('vetInformationTemporaire-dateFin', $this->translator->trans('common.blank', [], 'validators'));
}
if ($heureFin === false) {
$this->customJsonResponse->setField('vetInformationTemporaire-heureFin', $this->translator->trans('common.blank', [], 'validators'));
}
# validation
$errors = $this->validator->validate($vetInformationTemporaire,null, $validators);
if ($errors->count()) {
foreach ($errors as $key => $error) {
$propertyPath = "vetInformationTemporaire-{$error->getPropertyPath()}";
if (!$this->customJsonResponse->hasField($propertyPath)) {
$this->customJsonResponse->setField($propertyPath, $error->getMessage());
}
}
}
if ($this->customJsonResponse->hasAnyField()) {
$this->customJsonResponse->setForbidden(true);
return $this->customJsonResponse->sendResponse();
}
$dateDebut->setTime($heureDebut->format('H'),$heureDebut->format('i'));
$dateFin->setTime($heureFin->format('H'),$heureFin->format('i'));
if ($dateDebut >= $dateFin) {
$this->customJsonResponse->setField('vetInformationTemporaire-dateDebut', $this->translator->trans('page_prise_appel_resume.user_information_temporaire_date_wrong', [], 'validators'));
}
if ($this->customJsonResponse->hasAnyField()) {
$this->customJsonResponse->setForbidden(true);
return $this->customJsonResponse->sendResponse();
}
$vetInformationTemporaire->setDateDebut($dateDebut);
$vetInformationTemporaire->setDateFin($dateFin);
if (!$vetInformationTemporaire->getId()) {
$userId = (int)($request->get('userId') ?? 0);
$vetInformationTemporaire->setUserId($userId);
$this->vetoadomEntityManager->persist($vetInformationTemporaire);
}
$this->vetoadomEntityManager->flush();
$this->customJsonResponse->setField('vetInformationTemporaire',$this->priseAppelHelper->getVetInformationTemporaire($vetInformationTemporaire->getUserId()));
return $this->customJsonResponse->sendResponse();
}
break;
case 'supprimerVetInformationTemporaire':
{
$id = (int)($request->get('id') ?? 0);
$vetInformationTemporaire = $id ? $this->vetoadomEntityManager->getRepository(UserInformationTemporaire::class)->findOneBy(['id' => $id, 'active' => 1]) : null;
if ($vetInformationTemporaire) {
$this->vetoadomEntityManager->remove($vetInformationTemporaire);
$this->vetoadomEntityManager->flush();
}
$this->customJsonResponse->setField('vetInformationTemporaire',$this->priseAppelHelper->getVetInformationTemporaire($vetInformationTemporaire->getUserId()));
return $this->customJsonResponse->sendResponse();
}
break;
case 'saveInformationsParticulier':
{
$clientId = (int)($request->get('clientId') ?? 0);
$client = $clientId ? $this->vetoadomEntityManager->getRepository(Client::class)->findOneBy(['id' => $clientId, 'active' => 1]) : null;
if (!$client) {
$this->customJsonResponse->setForbidden(true);
$this->customJsonResponse->setField('alert', $this->translator->trans('page_prise_appel.client_unknown', [], 'validators'));
return $this->customJsonResponse->sendResponse();
}
$validators = ['informationsParticulier'];
$client->setInformationsParticulier(trim($request->get('informationsParticulier') ?? ''));
# client validation
$errors = $this->validator->validate($client,null, $validators);
if ($errors->count()) {
foreach ($errors as $key => $error) {
$propertyPath = 'client-' . $error->getPropertyPath();
if (!$this->customJsonResponse->hasField($propertyPath)) {
$this->customJsonResponse->setField($propertyPath, $error->getMessage());
}
}
}
if ($this->customJsonResponse->hasAnyField()) {
$this->customJsonResponse->setForbidden(true);
return $this->customJsonResponse->sendResponse();
}
$this->vetoadomEntityManager->flush();
return $this->customJsonResponse->sendResponse();
}
break;
default:
{
$this->customJsonResponse->setForbidden(true);
$this->customJsonResponse->setField('alert', $this->translator->trans('common.action_unknown', [], 'validators'));
return $this->customJsonResponse->sendResponse();
}
}
}
/**
* @Route("/prise-appel-change-secteur", name="app_prise_appel_change_secteur", methods={"POST"})
* @param Request $request
* @return Response
*/
public function changeSecteur(Request $request): Response
{
/** @var User $user */
$user = $this->getUser();
$secteurId = (int)($request->get('secteur') ?? 0);
$secteur = $secteurId ? $this->vetoadomEntityManager->getRepository(Secteur::class)->getUserSecteur($user, $secteurId) : null;
if (!$secteur) {
$this->customJsonResponse->setForbidden(true);
$this->customJsonResponse->setField('alert', $this->translator->trans('page_prise_appel.secteur_unknown', [], 'validators'));
return $this->customJsonResponse->sendResponse();
}
$tab = (string)$request->get('tab') ?? 'resume';
if (!in_array($tab, $this->tabs)) {
$tab = 'resume';
}
$langue = (string)($request->get('langue') ?? '');
$langues = $secteur->getLanguesArray();
if (!in_array($langue, array_column($langues, 'locale'))) {
$langue = $langues[0]['locale'];
}
# save temporary data in session
$data = [
'appel' => $request->get('appel') ?? [],
'client' => $request->get('client') ?? [],
'consultationTarifId' => (int)($request->get('consultationTarifId') ?? 0),
];
$request->getSession()->set('prise-appel',$data);
$redirect = $this->urlGenerator->generate('app_prise_appel',['secteurId' => $secteur->getId(), '_locale' => $langue]);
$redirect .= "?tab={$tab}";
if ($data['appel']['messageId'] ?? 0) {
$redirect .= "&messageId={$data['appel']['messageId']}";
}
else if ($data['appel']['consultationId'] ?? 0) {
$redirect .= "&consultationId={$data['appel']['consultationId']}";
}
$this->customJsonResponse->setRedirect($redirect);
return $this->customJsonResponse->sendResponse();
}
}