h1. Réservation d'un créneau
La réservation d'un créneau s'effectue par un appel à l’adresse @/api/agenda/SLUG-DE-LAGENDA/fillslot/IDENTIFIANT-DU-CRENEAU/@ via la méthode @HTTP POST@.
Cette procédure est commune aux agendas de type rendez-vous et évènement, seul le format de l'identifiant du créneau diffère.
Cette adresse est mentionnée dans le champ @fillslot_url@ obtenu en demandant la [[Obtenir_les_créneaux_d’un_agenda#Exemple|liste des créneaux disponibles]], ce qui évite la plupart du temps d'avoir à la construire manuellement.
h3. Paramètres JSON, corps de la requête
La plupart des paramètres sont communs aux deux types d’agenda.
| Nom | Description | Exemple |
| backoffice_url | URL de la démarche effectuant la réservation | {{form_url_backoffice}} |
| form_url | URL de la demande | {{form_url}} |
| cancel_callback_url | URL à appeler lors d’une annulation | |
| cancel_booking_id | Identifiant de réservation à annuler | 45 |
| count | Nombre de places à réserver | 2 |
| label | Texte arbitraire pour l’affichage en backoffice | {{form_name
POST /api/agenda/foo-bar/fillslot/event-slug/ { "agenda": { "label": "Foo bar", "slug": "foo-bar" }, "api": { "accept_url": "http://chrono.dev.publik.love/api/booking/8/accept/", "anonymize_url": "http://chrono.dev.publik.love/api/booking/8/anonymize/", "booking_url": "http://chrono.dev.publik.love/api/booking/8/", "cancel_url": "http://chrono.dev.publik.love/api/booking/8/cancel/", "ics_url": "http://chrono.dev.publik.love/api/booking/8/ics/", "suspend_url": "http://chrono.dev.publik.love/api/booking/8/suspend/" }, "booking_id": 8, "datetime": "2017-05-21 17:00:00", "end_datetime": null, "err": 0, "in_waiting_list": False, "places": { "available": 19, "full": False, "has_waiting_list": False, "reserved": 1, "total": 20 } }h2. Agenda rendez-vous Certains paramètres supplémentaires peuvent être inclus : | Nom | Description | Exemple | | use_color_for | Libellé auquel associer la couleur d’un rendez-vous dans le backoffice | | h3. Exemple
POST /api/agenda/rdv-pref/fillslot/18:2020-06-16-1000/ { "agenda": { "label": "rdv pref", "slug": "rdv-pref" }, "api": { "anonymize_url": "https://chrono.dev.publik.love/api/booking/50/anonymize/", "cancel_url": "https://chrono.dev.publik.love/api/booking/50/cancel/", "ics_url": "https://chrono.dev.publik.love/api/booking/50/ics/", "suspend_url": "https://chrono.dev.publik.love/api/booking/50/suspend/" }, "booking_id": 50, "datetime": "2020-06-16 10:00:00", "desk": { "label": "ds", "slug": "ds" }, "duration": 30, "end_datetime": "2020-06-16 10:30:00", "err": 0, "in_waiting_list": false, "resources": [] }h2. Agenda évènement : poser plusieurs réservations Il est possible de réserver plusieurs évènements en une seule fois via un appel @POST@ à l’adresse @/api/agenda/SLUG-DE-LAGENDA/events/fillslots/@. h3. Paramètres JSON, corps de la requête Par rapport à l’appel classique de réservation d’un évènement, deux paramètres doivent obligatoirement être présents. | Nom | Description | Exemple | | user_external_id | Identifiant unique de l’utilisateur. Grâce à cet identifiant, chaque appel aura pour effet de mettre à jour les réservations. | {{form_user_nameid}} | | slots | Slugs des évènements à réserver. Une valeur vide aura pour effet d’annuler les réservations de l’utilisateur. | {{form_var_event_raw
POST /api/agenda/foo-bar/events/fillslots/ { "err": 0, "booking_count": 3, "waiting_list_events": [ { "id": "event-slug", "slug": "event-slug", ... } ], "cancelled_booking_count": 0 }h2. Agenda évènement : poser plusieurs réservations sur plusieurs agendas Il est possible de réserver plusieurs évènements qui se trouvent sur des agendas différents via un appel @HTTP POST@ à l’adresse @/api/agendas/events/fillslots/@. h3. Paramètres de l’URL | Nom | Description | Exemple | | agendas | Slugs des agendas concernés par l’appel. Ils permettent de savoir quelles réservations mettre à jour. | agenda-slug,agenda2-slug,agenda3-slug | h3. Paramètres JSON, corps de la requête Par rapport à l’appel classique de réservation d’un évènement, deux paramètres doivent obligatoirement être présents. | Nom | Description | Exemple | | user_external_id | Identifiant unique de l’utilisateur. Grâce à cet identifiant, chaque appel aura pour effet de mettre à jour les réservations. | {{form_user_nameid}} | | slots | Slugs des évènements à réserver. Une valeur vide aura pour effet d’annuler les réservations de l’utilisateur. | agenda-slug@event-slug,agenda2-slug@event-slug | h3. Exemple
POST /api/agendas/events/fillslots/?agendas=agenda-slug { "err": 0, "booking_count": 3, "waiting_list_events": [ { "id": "event-slug", "slug": "event-slug", ... } ], "cancelled_booking_count": 0 }h2. Agenda évènement : réserver toutes les occurrences d’évènements récurrents Il est possible de réserver un ou plusieurs évènements récurrents, en totalité ou sur une plage temporelle définie, via un appel @POST@ à l’adresse @/api/agendas/recurring-events/fillslots/@. h3. Paramètres de l’URL | Nom | Description | Exemple | | agendas | Slugs des agendas concernés par l’appel. | agenda-slug,agenda2-slug,agenda3-slug | | action | Action à réaliser sur les évènements. | @update@, @book@ ou @unbook@ | | date_start | Réserver seulement les évènements commençant après cette date. | 2021-09-04 | | date_end | Réserver seulement les évènements commençant avant cette date. | 2022-06-21 | h3. Paramètres JSON, corps de la requête Par rapport à l’appel classique de réservation d’un évènement, deux paramètres doivent obligatoirement être présents. | Nom | Description | Exemple | | user_external_id | Identifiant unique de l’utilisateur. Grâce à cet identifiant, chaque appel aura pour effet de mettre à jour les réservations. | {{form_user_nameid}} | | slots | Slugs et jours des évènements à réserver. | agenda-slug@event-slug:0,agenda-slug@event2-slug:1 pour réserver le premier évènement tous les lundis et le second tous les mardis. | h3. Exemple
POST /api/agendas/recurring-events/fillslots/?agendas=agenda-slug { "err": 0, "booking_count": 142, "full_events": [ { "id": "event-slug", "slug": "event-slug", ... } ], "cancelled_booking_count": 0 }