horaires (depuis juin 2025)

1.74 – juin 2025

Les horaires sont une sous-donnée du noeud ouverture.periodesOuvertures[]. Leur composition se trouve sur la page horaires (consultation) : ce format est identique en écriture.

Champ facultatif

La présence du noeud horaires dans une periodesOuvertures[] est facultative : c’est un comportement inhabituel des API d’écriture.

Habituellement, un sous-champ manquant en écriture est considéré comme vide, et une donnée présente sur une offre existante est alors supprimée lors de l’écriture.

Par exemple, si un offre existante possède des periodesOuvertures[0].ouverturesExceptionnelles=[{"dateOuverture":"2025-01-01"}], un payload d’écriture de modification de periodesOuvertures[0] sans ouverturesExceptionnelles entraîne la perte des données d’ouvertures exceptionnelles.

Le champ horaires est en revanche facultatif, de façon à assurer une rétrocompatibilité des écritures lors de sa mise en place sans perte de données : une écriture sans la sous-donnée horaires (passerelle, formulaire de modification externe…) n’entraîne donc pas la perte des données horaires qui auraient pu être saisies par ailleurs (IHM…).

En synthèse, lors de la modification de la période d’ouverture d’une offre existante, et possédant des horaires :

{
        "dateDebut": "2025-01-01",
        "dateFin": "2025-02-01",
        "horaires": [
            {
                "type": { "elementReferenceType": "HoraireType", "id": 7487 },
                "timePeriods": [
                    {
                        "closed": false,
                        "weekdays": ["MON", "TUE", "WED", "THU", "FRI"],
                        "timeFrames": [
                            { "startTime": "08:00", "endTime": "12:00" },
                            { "startTime": "14:00", "endTime": "18:00" }
                        ]
                    }
                ]
            }
        ]
    }
  • Absence de periodesOuvertures[].horaires : les données horaires sont conservées
  • periodesOuvertures[].horaires=null : les données sont supprimées
  • periodesOuvertures[].horaires=[] : les données sont supprimées
  • periodesOuvertures[].horaires=[...Nouvelles données ou données identiques...] : les données sont écrasées

Réutilisation d’horaires d’une période à l’autre

Les mêmes horaires peuvent être utilisés sur plusieurs horaires (ex: saisie d’horaires « vacances scolaires » sur la première période en février, et réutilisation sur les autres périodes de vacances).

Cette fonctionnalité permet à l’utilisateur de ne pas avoir à saisir plusieurs fois les mêmes horaires, avec les risques d’erreur associés.

Lorsqu’on veut utiliser les mêmes horaires sur plusieurs périodes, l’une des périodes est déclarée comme « source » par l’ajout d’un ouverture.periodesOuvertures[].nom, et les périodes qui réutilisent ces horaires la référencent à partir de ouverture.periodesOuvertures[].sourceHoraireId (l’identifiant de la période d’origine, celle qui a un nom).

Cas d’une période source existante

Si la période d’origine (« source ») existe déjà sur l’offre (donc forcément sur une modification d’offre), la période « cible » peut réutiliser ses horaires en ajoutant un sourceHoraireId=identifiantSource

Offre existante :

"periodesOuvertures" : [
    {
        "identifiant": 12345678,
        "nom": "Vacances scolaires",
        "dateDebut": "2026-02-07",
        "dateFin": "2026-02-23",
        "horaires": [
            {
                "type": {
                    "elementReferenceType": "HoraireType",
                    "id": 7487
                },
                "timePeriods": [
                    {
                        "closed": false,
                        "weekdays": ["MON", "TUE", "WED", "THU", "FRI"],
                        "timeFrames": [
                            { "startTime": "08:00", "endTime": "12:00" },
                            { "startTime": "14:00", "endTime": "18:00" }
                        ]
                    }
                ]
            }
        ]
    }
]

Payload d’écriture pour créer une période en avril réutilisant les mêmes horaires :

"periodesOuvertures" : [
    {
        "identifiant": 12345678,
        "nom": "Vacances scolaires",
        "dateDebut": "2026-02-07",
        "dateFin": "2026-02-23",
        "horaires": [
            {
                "type": {
                    "elementReferenceType": "HoraireType",
                    "id": 7487
                },
                "timePeriods": [
                    {
                        "closed": false,
                        "weekdays": ["MON", "TUE", "WED", "THU", "FRI"],
                        "timeFrames": [
                            { "startTime": "08:00", "endTime": "12:00" },
                            { "startTime": "14:00", "endTime": "18:00" }
                        ]
                    }
                ]
            }
        ]
    },
    {
        "dateDebut": "2026-04-04",
        "dateFin": "2026-04-20",
        "sourceHoraireId": 12345678
    }
]

Cas d’une période source créée en même temps que la cible

Lors de la création de nouvelles périodes, l’identifiant n’existe pas encore : dans ce cas vous pouvez ajouter un identifiantTemporaire fictif sur la période source, puis l’utiliser dans sourceHoraireId dans les périodes réutilisantes.

Exemple ici avec une création d’offre et l’utilisation d’un identifiantTemporaire=99 :

{
    "type": "PATRIMOINE_CULTUREL",
    "nom": {
        "libelleFr": "Test"
    },
    "localisation": {
        "adresse": { "commune": { "id": 14707 } }
    },
    "ouverture": {
        "periodesOuvertures": [
            {
                "nom": "Vacances scolaires",
                "identifiantTemporaire": 99,
                "dateDebut": "2025-01-01",
                "dateFin": "2025-12-31",
                "horaires": [
                    {
                        "type": {
                            "elementReferenceType": "HoraireType",
                            "id": 7487
                        },
                        "timePeriods": [
                            {
                                "closed": false,
                                "weekdays": ["MON","TUE","WED","THU","FRI"],
                                "timeFrames": [
                                    {"startTime": "08:00","endTime": "12:00"},
                                    {"startTime": "14:00","endTime": "18:00"}
                                ]
                            },
                            {
                                "closed": false,
                                "weekdays": ["SAT"],
                                "timeFrames": [
                                    {"startTime": "08:00","endTime": "19:00"}
                                ]
                            }
                        ]
                    }
                ]
            },
            {
                "dateDebut": "2026-01-01",
                "dateFin": "2026-12-31",
                "sourceHoraireId": 99
            }
        ]
    }
}