Mettre en service une interface Oracle Xchange (OXI) 2 voies entre OPERA 5 on-premise et Bridg_. Chaque valeur ci-dessous a été relevée sur une installation OXI 5.5 réelle et validée contre les schémas XML officiels d'Oracle. À remettre tel quel à l'intégrateur OPERA de l'établissement.
Avant de commencer
Cinq points à réunir avant de toucher à un écran OXI. Le premier conditionne le calendrier de toute l'installation.
| Point | Ce qu'il faut |
|---|---|
| OPERA | OPERA 5 on-premise. OPERA Cloud n'est pas couvert par ce modèle de branchement. |
| OXI | Module servlet HTTP/S. La passerelle PL/SQL (dépréciée) ne fait ni HTTPS ni messages > 32 Ko. |
| Licence | OPX_GN2 — Opera Xchange Generic 2-way, add-on Oracle licencié par interface et par propriété. Sans elle, les Business Events (le flux OPERA → Bridg_) ne s'activent pas. |
| Réseau | Sortie HTTPS (443) depuis le serveur OXI vers staging.bridgchannel.app. Aucun flux entrant : OXI est toujours le client, toutes les connexions partent de l'hôtel. |
| Côté Bridg_ | Une connexion créée avec le dialecte opera-oxi et le code resort OPERA. Vous récupérez alors le connectionId et le secret. |
1. Créer l'interface
OXI → Interface Configuration → New Interface.
| Champ | Valeur |
|---|---|
| Interface | OXI-2W — Opera Xchange Generic 2-way |
| OPERA Property | Le code resort OPERA (ex. ATLALG). C'est la valeur externalPropertyCode saisie dans Bridg_ — les deux doivent coïncider. |
| External System Property | Le code de la base externe, propre à Bridg_ (ex. BRIDG). OXI le renverra dans chaque requête sous propertyName. |
| Message Format | XML |
| Data Flow | 2 sens : OPERA → External et External → OPERA |
| Delta Mode | Y — n'émettre que les changements, pas l'état complet à chaque fois |
| Deletion Indicator | Caractère ~ · Numérique -99999 · Date 12/12/1800 (valeurs usuelles ; Bridg_ ne s'en sert pas mais OXI l'exige) |
2. Méthodes de communication
Interface Configuration → Comm Methods, à renseigner dans les deux sens. C'est ici que vit l'URL de Bridg_ — identique pour les deux sens :
https://staging.bridgchannel.app/api/pms/v1/connections/<connectionId>/messages?key=<secret>
OXI ajoute lui-même &propertyName=…&zipData=… à chaque requête — il détecte la query existante et
concatène avec &, donc le paramètre key reste intact.
| Sens | Comm Type | Mode | Sleep Time | Timeout |
|---|---|---|---|---|
| Opera → External (OXI pousse) | HTTP/S |
Client |
.01 min (≈ 0,6 s) |
60 s |
| External → Opera (OXI vient chercher) | HTTP/S |
Client |
1 à 2 min |
60 s |
3. Versions de schéma XML
Edit Interface → XML Version. Alignez chaque type sur la version que Bridg_ traduit.
| Type | Version | Namespace | Statut Bridg_ |
|---|---|---|---|
RATE |
V6 | rate.fidelio.6.0 |
traduit |
RTAV |
V4 | rtav.fidelio.4.0 |
traduit |
RESERVATION |
V5 | reservation.fidelio.5.0 |
traduit |
RESTRICTION |
V4 | restriction.opera.4.0 |
traduit |
RESULT |
V4 | result.fidelio.4.0 |
traduit |
RAVL / RAVR |
V2 | ravl/ravr.fidelio.2.0 |
RAVL oui · RAVR refusé |
PROFILE |
V5 | — | lu dans les réservations |
INVENTORY · ALLOTMENT · STAY · HURDLE |
— | — | non traduits |
4. Paramètres clés
Trois réglages décident si l'interface parle ou reste muette.
| Paramètre | Valeur | Pourquoi |
|---|---|---|
Change_To_Inventory_Generates |
RTAV |
La disponibilité doit voyager en RTAV. En INVENTORY, Bridg_ ne la traduit pas. |
Business Events |
Actifs |
Sans eux, OPERA n'émet aucun changement live vers Bridg_. |
| Restrictions | RAVL ou RESTRICTION |
Par code tarifaire (RAVL) ou tarif × type (RESTRICTION). RAVR (par type seul) est refusé. |
5. Correspondance des codes
Interface Configuration → Conversion Codes. Le pont entre les codes OPERA et ceux de Bridg_.
Relevez les codes de types de chambre et de codes tarifaires réellement distribués, puis mappez-les dans Bridg_ (écran Interface PMS → Correspondance des codes).
- Seuls les tarifs et types de chambre effectivement distribués ont besoin d'un mapping — inutile de traiter les 200+ codes internes.
- Un code non mappé est refusé item par item (le reste du message passe) et apparaît dans le journal Bridg_ avec le code fautif :
UNMAPPED_UNIT_TYPEouUNMAPPED_RATE. - Le mapping se complète au fil de l'eau : ajoutez le code manquant côté Bridg_, relancez, l'item passe.
6. Recette
Cinq contrôles, dans l'ordre, avant de passer la connexion en ACTIVE.
| # | Contrôle | Attendu |
|---|---|---|
| 1 | Ping. Au redémarrage du processeur OXI, le GET de drainage sort. |
200 avec Content-Length: 0 (file vide) — visible dans le log OXI. |
| 2 | Resync (Utilities → Resync) : Rates, Restriction, Inventory sur une plage de dates courte. | Messages PROCESSED côté Bridg_, calendrier qui reflète les valeurs. |
| 3 | Date de fin des prix. Poussez un tarif du 01 au 03. | Si la nuit du 03 manque, réglez rateEndDateInclusive à false côté Bridg_. |
| 4 | Réservation OPERA → Bridg_. Créez une résa à la réception. | Elle apparaît dans Bridg_ (source PMS), départs 0 nuit inclus. |
| 5 | Boucle retour. Créez une résa de test dans Bridg_. | OXI la récupère (Message Status → From External System) et renvoie un RESULT SUCCESS. |
Limites connues
Ce que Bridg_ refuse volontairement plutôt que de le traduire à moitié — un item refusé est toujours journalisé, jamais perdu en silence.
- Tarifs par durée de séjour (tiered) et prix week-end : refusés.
- Restrictions par classe de chambre, catégorie de tarif, hôtel entier ou bloc : refusées (granularité non supportée).
RAVR(restriction par type de chambre) : refusé — passez parRAVLouRESTRICTION.- Prix : seule l'occupation double est distribuée aujourd'hui.
Dépannage
Les symptômes les plus fréquents et leur cause.
| Symptôme | Cause probable | Correctif |
|---|---|---|
| Rien n'arrive dans Bridg_, calendrier vide | Business Events inactifs, ou Change_To_Inventory_Generates ≠ RTAV, ou resync jamais lancé |
Étape 4, puis un resync (étape 6) |
Le GET ne renvoie pas 200 / Content-Length: 0 |
URL ou ?key= erroné, ou connexion non trouvée |
Recopier l'URL de l'étape 2 ; vérifier connectionId et secret |
401 Unauthorized |
Clé ?key= invalide |
Régénérer / recopier le secret côté Bridg_ |
RESULT FAILED — UNMAPPED_* |
Code type de chambre / tarif absent du mapping | Ajouter le code dans Conversion Codes (étape 5) |
RESULT FAILED — UNSUPPORTED_* |
Granularité non supportée (classe, hôtel, bloc, RAVR) | Voir Limites connues ; émettre par tarif |
400 MALFORMED_GZIP |
Corps annoncé gzip mais illisible (rare) | Repasser zipData à N pour isoler |
Erreur Oracle (ORA-…) au Save de l'interface |
Problème de base OPERA côté serveur, hors périmètre interface | Escalader au DBA / à l'hébergeur OPERA |