Description
En tant qu’aubergiste, je peux aménager mes chambres et enregistrer la réservation d’un voyageur.
Les chambres
L’auberge démarre sans aucune chambre, et c’est à moi de les aménager, autant que je veux : il n’y a pas de maximum. C’est une action comme une autre : accumulée, puis exécutée pendant la nuit.
Une chambre du Carrefour n’a rien d’ordinaire. Trois réglages en règlent l’ambiance, et il faut les tourner à la main. L’ambiance d’une chambre, c’est son triplet de réglages pris ensemble : deux chambres ont la même ambiance quand leurs trois réglages sont identiques.
| Réglage | Positions |
|---|---|
| Atmosphère | standard, humide |
| Gravité | légère, normale, lourde |
| Température | froide, tempérée, chaude |
Je choisis moi-même le numéro de chaque chambre, et deux chambres ne peuvent pas porter le même : aménager sur un numéro déjà pris échoue (voir critère 4). Pour retoucher les réglages d’une chambre existante, je la rerègle, ce qui suppose évidemment qu’elle soit vide (voir critère 5).
Une chambre aménagée sert immédiatement, y compris à une réservation exécutée plus tard dans la même nuit (voir critère 3).
Plusieurs voyageurs peuvent partager une chambre tant qu’il y reste des places et qu’elle convient à chacun d’eux.
Les séjours
Un voyageur me tend son relevé d’existence et me déclare son nom, son espèce, sa masse en kilogrammes, sa dimension d’origine, un forfait de séjour et un nombre de nuits.
| Forfait | Tarif par nuitée |
|---|---|
| Royal | 300 pièces |
| Confort | 150 pièces |
| Modeste | 60 pièces |
C’est le numéro d’existence qui fait foi, jamais le nom. Un voyageur ne peut pas avoir deux séjours à la fois (voir critère 9), mais rien ne l’empêche de revenir plus tard, ni d’avoir un homonyme dans la chambre d’à côté.
Note : la masse et la dimension d’origine ne servent à rien pour l’instant. Il faut quand même les recueillir et les conserver, car elles deviendront importantes dans une prochaine story.
Comment j’attribue une chambre
Je tasse mes clients. J’ai appris à mes dépens qu’une chambre à moitié vide est une chambre perdue.
Parmi les chambres dont les trois réglages conviennent exactement à l’espèce du voyageur et qui ont encore une place, je prends celle où il reste le moins de place ; à égalité, la plus petite numérotation (voir critère 7). S’il n’y en a aucune, je refuse le séjour, et je ne reviens pas dessus (voir critère 8).
Arrivées, départs, facturation
Il n’est pas possible de réserver à l’avance des nuitées. Nous sommes automatiquement informés de la venue dès qu’un corps entre au Carrefour, et il lui faut encore une nuit pour cheminer jusqu’à l’auberge.
Ainsi, une demande de réservation est toujours faite lors de l’entrée pour la nuit suivante car cela prend 1 journée pour cheminer jusqu’à l’Auberge.
Exemple:
- Nuit 4
- Nouvelle réservation X
- Nuit 5 –> réservation X traitée –> chambre réservée
- Nuit 6 –> le corps de la réservation X arrive –> occupe sa chambre et mange <– sera facturé.
La première nuit sera celle de son arrivée, soit la nuit 6 dans l’exemple.
Le voyageur dont la dernière nuit s’achève s’en va, et sa place redevient libre, mais seulement une fois les actions passées, donc trop tard pour qui que ce soit ce soir-là (voir critère 15 et l’exemple 3). Il paie tout de même sa dernière nuit : il l’a bien passée sous mon toit.
| État d’un séjour | Quand |
|---|---|
BOOKED |
accepté ; la chambre est retenue, le voyageur n’est pas encore arrivé |
ACTIVE |
le voyageur est là, depuis la première conséquence de sa première nuit |
ENDED |
sa dernière nuit est passée |
REFUSED |
rejeté à l’exécution, avec un motif |
Déroulement d’une nuit
| Actions possibles |
|---|
| Commander des denrées, souscrire ou résilier un abonnement. |
| Aménager une chambre. |
| Rerégler une chambre. |
| Réserver un séjour. |
| Conséquences d’une nuit (en ordre) |
|---|
1. Faire arriver les voyageurs dont le séjour commence cette nuit ; leur séjour passe à ACTIVE. |
| 2. Ranger les livraisons attendues. |
| 3. Jeter les denrées périmées. |
| 4. Faire partir les voyageurs dont le séjour s’achève et libérer leurs places. |
| 5. Facturer la nuitée de chaque voyageur ayant passé la nuit. |
Conditions de succès
📎 Ce que « croissant » et « ordre alphabétique » veulent dire exactement : les départages, dans le fonctionnement.
| # | Description |
|---|---|
| 1 | Un voyageur est identifié par son numéro d’existence. Le nom n’identifie rien et peut être porté par plusieurs voyageurs simultanément. |
| 2 | Les aménagements, les reréglages et les réservations sont exécutés en ordre d’arrivée. |
| 3 | Une chambre aménagée est utilisable par les actions qui suivent dans la même nuit. |
| 4 | Un aménagement portant sur un numéro déjà attribué est rejeté à l’exécution avec le motif ROOM_NUMBER_ALREADY_USED ; la chambre existante conserve ses réglages et ses occupants. |
| 5 | Un reréglage est rejeté à l’exécution avec le motif ROOM_NOT_FOUND si la chambre n’existe pas, et ROOM_NOT_EMPTY si quelqu’un y dort ou y est attendu ; dans les deux cas rien n’est modifié. |
| 6 | La chambre attribuée satisfait exactement les trois exigences de l’espèce du voyageur. |
| 7 | Entre plusieurs chambres compatibles ayant au moins une place libre, celle qui a le moins de places libres est choisie ; à égalité, celle dont le numéro est le plus petit. |
| 8 | Si aucune chambre compatible n’a de place libre, le séjour est refusé avec le motif NO_COMPATIBLE_ROOM. Le refus est définitif et reste consultable avec la nuit où il a eu lieu. |
| 9 | Si le numéro d’existence porte déjà un séjour attendu ou en cours, le nouveau séjour est refusé avec le motif ALREADY_STAYING. Un numéro dont le séjour est terminé ou refusé peut réserver de nouveau. |
| 10 | Un séjour refusé n’occupe aucune place et n’est jamais facturé. |
| 11 | La place est retenue dès l’exécution de la réservation, et non à l’arrivée du voyageur. |
| 12 | firstNight est la nuit de son arrivée. |
| 13 | Chaque voyageur ayant passé la nuit est facturé une fois, au tarif de son forfait. Celui que l’étape des départs vient de faire partir en fait partie : il a dormi sous mon toit, il paie (voir le glossaire). |
| 14 | Le montant dû est incrémenté après chaque nuit passée à l’Auberge |
| 15 | Une place libérée par un départ n’est utilisable qu’à partir de la nuit suivante, parce que le départ est une conséquence et qu’aucune action ne le suit (voir les libérations de place). |
| 16 | Un séjour BOOKED dont la première nuit est celle qui commence passe à ACTIVE à la première conséquence de cette nuit, donc après les actions et avant tout le reste. Un arrivant est un occupant à part entière pour toutes les conséquences qui suivent : il est logé, il est servi, il est facturé. |
| 17 | L’arrivée ne dépend d’aucune action et ne peut pas échouer. La chambre a été retenue à l’exécution de la réservation (voir critère 11) et personne n’a pu la lui prendre entre-temps. |
🖥️ À l’écran
- Le plan des chambres : numéro, position des trois réglages, places totales et libres, et les occupants avec leur numéro d’existence. C’est ce plan qui permet de vérifier la règle du tassement à l’œil nu.
- Pour chaque voyageur, tous ses séjours, y compris refusés : état, chambre, nuits, motif de refus et nuit du refus.
- Les aménagements et reréglages rejetés, avec leur motif et la nuit. Comme un rejet ne change rien, c’est le seul endroit où l’on peut le constater.
- Le tableau des exigences par espèce, pour que personne n’ait à le deviner.
API
| Dans le texte | Dans l’API |
|---|---|
| standard, humide | STANDARD, HUMID |
| légère, normale, lourde | LIGHT, NORMAL, HEAVY |
| froide, tempérée, chaude | COLD, TEMPERATE, HOT |
| Royal, Confort, Modeste | ROYAL, COMFORT, MODEST |
✅ Aménager une chambre
POST /rooms
{
"roomNumber": 1::int,
"atmosphere": "STANDARD"::string(STANDARD | HUMID),
"gravity": "NORMAL"::string(LIGHT | NORMAL | HEAVY),
"temperature": "TEMPERATE"::string(COLD | TEMPERATE | HOT),
"capacity": 2::int
}
➡️ HTTP 202 Accepted
✅ Rerégler une chambre
PUT /rooms/<roomNumber::int>
{
"atmosphere": "HUMID"::string(STANDARD | HUMID),
"gravity": "LIGHT"::string(LIGHT | NORMAL | HEAVY),
"temperature": "COLD"::string(COLD | TEMPERATE | HOT),
"capacity": 4::int
}
➡️ HTTP 202 Accepted — que la chambre existe et qu’elle soit vide sont des règles d’affaires, constatées à l’exécution.
✅ Consulter les chambres
GET /rooms
➡️ HTTP 200 Ok
[
{
"roomNumber": 1::int,
"atmosphere": "STANDARD"::string,
"gravity": "NORMAL"::string,
"temperature": "TEMPERATE"::string,
"capacity": 2::int,
"freePlaces": 0::int,
"occupants": [
{
"existenceNumber": "EX-4417-Q"::string,
"travellerName": "Aliqua"::string
}, ...
]
}, ...
]
Les chambres sont retournées par numéro croissant, les occupants par numéro d’existence croissant.
✅ Consulter les aménagements et reréglages rejetés
GET /rooms/rejections
➡️ HTTP 200 Ok
[
{
"roomNumber": 3::int,
"operation": "SETUP"::string(SETUP | RECONFIGURE),
"rejectedAtNight": 5::int,
"reason": "ROOM_NOT_FOUND"::string(ROOM_NUMBER_ALREADY_USED | ROOM_NOT_FOUND | ROOM_NOT_EMPTY)
}, ...
]
✅ Réserver un séjour
POST /stays
{
"existenceNumber": "EX-4417-Q"::string,
"travellerName": "Aliqua"::string,
"species": "QUIDAM"::string(QUIDAM | PYROPHORE | PLANTAGENET | MERFOLK | MENHIR),
"massKg": 100::int,
"homeDimension": "SALARIA"::string(SALARIA | BOUCANIA | HYLEE | NIMBE | NOCTAMBULIE | TESSELLE),
"package": "COMFORT"::string(ROYAL | COMFORT | MODEST),
"nights": 3::int
}
➡️ HTTP 202 Accepted
✅ Consulter un voyageur
GET /travellers/<existenceNumber::string>
➡️ HTTP 200 Ok
{
"existenceNumber": "EX-4417-Q"::string,
"travellerName": "Aliqua"::string,
"species": "QUIDAM"::string,
"massKg": 100::int,
"homeDimension": "SALARIA"::string(SALARIA | BOUCANIA | HYLEE | NIMBE | NOCTAMBULIE | TESSELLE),
"stays": [
{
"status": "ACTIVE"::string(BOOKED | ACTIVE | ENDED | REFUSED),
"reservedAtNight": 3::int,
"package": "COMFORT"::string,
"nights": 5::int,
"roomNumber": 1::int,
"firstNight": 4::int,
"lastNight": 8::int,
"refusalReason": "NO_COMPATIBLE_ROOM"::string(NO_COMPATIBLE_ROOM | ALREADY_STAYING) || null,
"totalBilledAmount": 300.00::float
}, ...
]
}
Les séjours sont retournés dans l’ordre d’exécution. roomNumber, firstNight et lastNight sont null pour un séjour REFUSED, et renseignés dès qu’un séjour est BOOKED. Les informations de tête proviennent du plus récent séjour exécuté pour ce numéro d’existence.
reservedAtNight est la nuit d’exécution, la seule que l’auberge ait datée : firstNight vaut toujours reservedAtNight + 1 (voir critère 12).
⚠️ Une réservation déposée mais pas encore exécutée n’apparaît nulle part : un numéro d’existence dont c’est la seule réservation retourne 404.
➡️ HTTP 404 Not Found
{
"error": "TRAVELLER_NOT_FOUND"::string,
"description": "traveller with existence number XX not found"::string
}
💡 Exemple 1 — le tassement, pas à pas
Nous sommes à la nuit 0. On dépose, dans cet ordre :
- chambre 1 — standard / normale / tempérée, 2 places
- chambre 2 — standard / normale / tempérée, 4 places
- chambre 3 — humide / légère / froide, 2 places
EX-01Aliqua — Quidam de Salaria, Confort, 3 nuitsEX-02Cyd — Quidam de Noctambulie, Confort, 3 nuitsEX-03Lorem — Quidam de Salaria, Confort, 3 nuitsEX-04Aquarelle — Ondine de Boucania, Modeste, 2 nuitsEX-05Brann — Pyrophore de Tesselle, Royal, 5 nuits
POST /nights → { "number": 1 }
| Voyageur | Chambres possibles | Choix | Pourquoi |
|---|---|---|---|
| Aliqua | 1 (2 places libres), 2 (4 libres) | chambre 1 | il y reste moins de place |
| Cyd | 1 (1 libre), 2 (4 libres) | chambre 1 | idem — la chambre 1 est maintenant pleine |
| Lorem | 2 (4 libres) | chambre 2 | la chambre 1 n’a plus de place |
| Aquarelle | 3 (2 libres) | chambre 3 | seule compatible |
| Brann | aucune — il lui faut standard / normale / chaude | refusé | NO_COMPATIBLE_ROOM |
Si deux chambres compatibles avaient toutes deux 2 places libres, disons les numéros 4 et 7, c’est la chambre 4 qui l’emporterait.
💡 Exemple 2 — l’ordre des actions condamne une réservation
Nous sommes à la nuit 0. On dépose, dans cet ordre :
EX-01Aliqua — Quidam de Salaria, Confort, 3 nuits- chambre 1 — standard / normale / tempérée, 2 places
POST /nights → { "number": 1 }
La réservation d’Aliqua s’exécute en premier, et l’auberge ne possède alors aucune chambre. Aliqua est refusée avec le motif NO_COMPATIBLE_ROOM. La chambre 1 est aménagée juste après, et restera vide.
⚠️ Un refus est définitif. Rien ne réessaie une réservation refusée à la nuit suivante ; il faut en déposer une nouvelle.
💡 Exemple 3 — la facturation et le départ
Aliqua est Confort, à 150 pièces la nuitée. Elle arrive à la nuit 2 et repart après la nuit 4.
| Nuit | Ce qui lui arrive | Facturée | totalBilledAmount |
|---|---|---|---|
| 1 | acceptée, sa place est retenue | non | 0.00 |
| 2 | elle arrive | oui | 150.00 |
| 3 | — | oui | 300.00 |
| 4 | sa dernière nuit : elle s’en va et libère sa place | oui | 450.00 |
| 5 | ENDED |
non | 450.00 |
Une réservation déposée avant la nuit 4 pour prendre cette place aurait été refusée : les actions s’exécutent avant les départs. La place n’est disponible qu’à partir de la nuit 5.