-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathreserver-vaccination-covid-arn-messager.php
93 lines (71 loc) · 3.16 KB
/
reserver-vaccination-covid-arn-messager.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
<?php
declare(strict_types=1);
use Doctolib\Client;
use Doctolib\Exception\UnavailableSlotException;
use Doctolib\Model\Appointment;
use Doctolib\SerializerFactory;
use Doctolib\Utils\UrlUtils;
use Symfony\Component\HttpClient\NativeHttpClient;
require __DIR__.'/../vendor/autoload.php';
$httpClient = new NativeHttpClient();
$serializer = SerializerFactory::create();
$client = new Client($httpClient, $serializer);
// On recherche un "centre de vaccination" à proximité de Paris 9ème
// en filtrant par VisitMotive (raison de la consultation)
$visitMotiveIds = [
6970, // "1re injection vaccin COVID-19 (Pfizer-BioNTech)"
7005, // "1re injection vaccin COVID-19 (Moderna)"
];
$profiles = $client->searchProfilesBySpecialityAndLocation(
'vaccination-covid-19',
'75009-paris',
[
'ref_visit_motive_ids' => $visitMotiveIds,
],
);
// on vérifie que la recherche a retournée au moins un résultat.
if (0 === count($profiles)) {
exit("Pas de résultat.\n");
}
// on recupère les infos Booking du 1er résultat retourné.
// $profile = $profiles[0];
// $profileSlug = UrlUtils::getSlugFromPath($profile->getLink()); // de rien ;-)
// echo sprintf("Recupération du booking de \"%s\"\n", $profile->getNameWithTitle());
// $booking = $client->getBooking($profileSlug);
// Ou on sélectionne son centre de vaccination, comme ici le Stade de France
$booking = $client->getBooking('centre-de-vaccination-covid-19-stade-de-france');
// On récupère les agendas
$agendas = $booking->getAgendas();
// on recupère les disponiblités à partir de maintenant en spécifiant les `VisitMotive` (parentes) qui nous interessent
$now = new DateTime('2021-05-28');
$availabilities = $client->getAvailabilities($agendas, $now, $visitMotiveIds[0]);
if (0 === count($availabilities)) {
exit("Pas de RDV disponibles\n");
}
$firstAvailability = $availabilities[0];
$firstSlot = $firstAvailability->getSlots()[0];
echo sprintf("Prochain RDV disponible : %s\n", $firstSlot->getStartDate()->format('l jS F Y H:i'));
// on crée un RDV. Vous devez être authentifié. L'authentification n'étant pas possible
// du à la protection de Cloudflare, vous devez passer la valeur de la session au Client
// qui se trouve dans le cookie "_doctolib_session" du navigateur après authentfication.
$client->setSessionId('Change Me');
// parfois les RDV se font en plusieurs étapes, comme c'est le cas pour la vaccination COVID-19
try {
$appointment = $client->createMultiStepAppointment($booking, $firstSlot);
} catch (UnavailableSlotException $e) {
exit("Le Slot n'est plus disponible, veuillez choisir un autre Slot.\n");
}
if (!$appointment instanceof Appointment) {
exit("Echec de la prise de RDV.\n");
}
if ('/account/new' === $appointment->getRedirection()) {
exit("Vous avez créé un RDV sans être authentifié\n");
}
// récupération du Patient authentifié.
$patient = $client->getMasterPatient();
// confirmation du RDV
$appointment = $client->confirmAppointment($appointment, $patient);
if (false === $appointment->isFinalStep()) {
exit("La confirmation du RDV a échouée.\n");
}
echo sprintf("RDV confirmé : https://www.doctolib.fr%s\n", $appointment->getRedirection());