GLO-4002 2026

Carnet · Iter 3a · aubergiste

SERV — Le repas du soir

Description

En tant qu’aubergiste, je dois nourrir mes voyageurs chaque nuit, faute de quoi ils écourtent leur séjour.

Ma réputation est faite, et elle est mauvaise : on dort bien chez moi, mais on y meurt de faim. Un voyageur mal nourri ne fait pourtant aucune scène. Il paie sa nuit, me remercie poliment, et s’en va à l’aube en emportant toutes les nuits qu’il avait réservées.

Ce que mange un voyageur

Un voyageur mange une portion par tranche de quarante kilos, toute tranche entamée comptant pour une. Un Quidam de 100 kg a donc besoin de trois portions ; un Menhir de 200 kg, de cinq.

Son régime décide où il les prend.

Régime Espèces Se sert dans
Carné Pyrophore la réserve carnée
Végétal Plantagenêt, Ondin la réserve végétale
Minéral Menhir la réserve minérale
Omnivore Quidam les deux réserves, végétale et carnée

L’omnivore est ma ruine. Il ne coupe pas son repas en deux moitiés bien nettes : il exige la moitié de son besoin, arrondie vers le haut, dans chacune des deux réserves. Le Quidam de 100 kg, qui a besoin de trois portions, en emporte donc deux d’un côté et deux de l’autre, quatre en tout. Je paie l’arrondi deux fois (voir l’exemple 1).

⚠️ Un manque ne se rattrape jamais ailleurs. L’omnivore qui trouve la réserve végétale vide ne se rabat pas sur la viande : il mange le peu qu’il trouve dans chacune, puis s’en va, même s’il reste dix portions de l’autre côté (voir critère 5 et l’exemple 3).

Dans quel ordre je sers

Mes meilleurs clients d’abord : Royal, puis Confort, puis Modeste. À forfait égal, l’ordre alphabétique du nom ; et comme deux voyageurs peuvent porter le même nom, le numéro d’existence tranche en dernier ressort (voir critère 3).

Dans chaque réserve, j’écoule ce qui va bientôt pourrir avant ce qui vient d’arriver (voir critère 4).

Les départs

Le mal servi s’en va au même moment que les voyageurs dont le séjour s’achevait de toute façon. Ce qu’il a mangé est mangé : rien ne retourne en réserve, et le suivant dans l’ordre de service n’en profite pas (voir critère 6).

Les deux causes frappent parfois le même voyageur : sa dernière nuit s’achève et je l’ai mal servi. Il ne part qu’une fois, et il part STAY_COMPLETED. Il s’en allait de toute façon ; le dîner n’y est pour rien (voir critère 10).

Déroulement d’une nuit

Actions possibles
Commander des denrées, souscrire ou résilier un abonnement.
Aménager ou 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.
2. Ranger les livraisons attendues.
3. Jeter les denrées périmées.
4. Servir le repas du soir.
5. Faire partir les voyageurs dont le séjour s’achève et ceux qui ont été mal servis, et libérer leurs places.
6. Facturer la nuitée de chaque voyageur ayant passé la nuit.

Conditions de succès

📎 Ce que « croissant », « ordre alphabétique » et « arrondi » veulent dire exactement : les départages et les arrondis, dans le fonctionnement.

# Description
1 Le besoin d’un voyageur est d’une portion par tranche de quarante kilos entamée.
2 Un omnivore prélève, dans chacune de ses deux réserves, la moitié de son besoin, et consomme donc plus que son besoin.
3 L’ordre de service est : forfait, puis nom par ordre alphabétique, puis numéro d’existence croissant.
4 Dans chaque réserve, les portions qui seront jetées le plus tôt sont servies en premier.
5 Un voyageur qui n’obtient pas la totalité de ce qu’il lui faut dans au moins une de ses réserves part à l’aube.
6 Ce qu’un voyageur mal servi a reçu est consommé et ne retourne jamais en réserve.
7 Un voyageur qui part à l’aube paie la nuit qui s’achève ; ses nuits suivantes sont annulées et son séjour passe à ENDED.
8 La place d’un partant n’est libérée qu’à l’étape des départs, donc après le repas ; elle n’est utilisable qu’à partir de la nuit suivante.
9 Tant qu’aucune nuit n’a été exécutée, le rapport de la dernière nuit n’existe pas : la ressource retourne 404 en entier, jamais un rapport partiel.
10 Un voyageur ne produit qu’un seul départ, avec un seul motif, même quand plusieurs causes sont réunies le même soir. Précédence : STAY_COMPLETED, puis UNDERFED. Toute story qui ajoute un motif dit où il s’insère dans cette précédence.

🖥️ À l’écran

  • Le service de la dernière nuit, dans l’ordre où il a eu lieu : qui, quelle réserve, ce qu’il fallait, ce qu’il a reçu. C’est le seul moyen de comprendre pourquoi je perds des clients.
  • Les départs de la nuit, avec leur cause : séjour terminé ou mal servi.
  • La consommation de la nuit, réserve par réserve.

API

✅ Consulter les voyageurs présents

GET /inn/travellers

➡️ HTTP 200 Ok

[
  {
    "existenceNumber": "EX-01"::string,
    "travellerName": "Aliqua"::string,
    "species": "QUIDAM"::string,
    "roomNumber": 1::int,
    "lastMealSatisfied": true::boolean || null
  }, ...
]

Seuls les séjours BOOKED et ACTIVE figurent ici, dans l’ordre de service.

Un BOOKED est quelqu’un dont la chambre est retenue et qui arrivera une nuit prochaine. Il occupe une place, il figure donc dans la liste, mais il n’a pas été servi et ne le sera pas avant d’être arrivé. Un voyageur qui arrive cette nuit n’est plus BOOKED au moment du repas : il est passé ACTIVE à la première conséquence (voir RESA critère 16).

lastMealSatisfied est null pour un voyageur qui n’a pas encore passé de nuit.


✅ Consulter le service de la dernière nuit

GET /nights/last

➡️ HTTP 200 Ok

{
  "night": 7::int,
  "servings": [
    {
      "existenceNumber": "EX-01"::string,
      "foodType": "PLANT"::string,
      "required": 2::int,
      "received": 2::int
    }, ...
  ],
  "departures": [
    {
      "existenceNumber": "EX-02"::string,
      "cause": "STAY_COMPLETED"::string(STAY_COMPLETED | UNDERFED)
    }, ...
  ]
}

Les services sont retournés dans l’ordre où ils ont eu lieu. Un voyageur ne figure qu’une fois dans departures, avec le seul motif retenu par la précédence (voir critère 10).

➡️ HTTP 404 Not Found — aucune nuit n’a encore été exécutée

{
  "error": "NO_NIGHT_EXECUTED"::string,
  "description": "no night has been executed yet"::string
}

Toute l’information sur la dernière nuit passe par cette seule ressource, et les stories suivantes y ajoutent des sections dans le même JSON. Le 404 porte donc sur le rapport entier : il n’existe pas de nuit dont une partie seulement serait consultable.

💡 Exemple 1 — l’arrondi que je paie deux fois

Aliqua est Quidam et pèse 100 kg.

Elle a besoin d’une portion par tranche de quarante kilos entamée : 40, 80, puis une troisième tranche entamée à 100. Trois portions.

Étant omnivore, elle prend la moitié de ces trois portions dans chaque réserve, arrondie vers le haut : deux portions végétales et deux portions carnées. Quatre au total, pour un besoin de trois.

💡 Exemple 2 — un service complet qui tourne mal

Réserves au moment du repas : 3 végétales, 5 carnées, 5 minérales.

Voyageur Espèce Forfait Masse Il lui faut
Brann Pyrophore Royal 160 kg 4 carnées
Aliqua Quidam Confort 100 kg 2 végétales + 2 carnées
Céleste Plantagenêt Confort 60 kg 2 végétales
Basaltazar Menhir Modeste 200 kg 5 minérales

Ordre de service : Brann (Royal), puis Aliqua et Céleste (Confort, alphabétique), puis Basaltazar (Modeste).

  1. Brann prend 4 carnées sur 5 → servi. Reste : 3 végétales, 1 carnée.
  2. Aliqua prend ses 2 végétales, mais il ne reste qu’1 carnée pour un besoin de 2 → manque. Elle consomme quand même les 2 végétales et la carnée, puis part à l’aube. Reste : 1 végétale, 0 carnée.
  3. Céleste a besoin de 2 végétales, il n’en reste qu’1manque. Elle consomme la portion restante et part à l’aube. Reste : 0, 0.
  4. Basaltazar prend ses 5 minérales → servi.

Aliqua et Céleste sont facturées pour cette nuit, et leurs nuits suivantes sont annulées. Notez que si Aliqua avait été servie après Céleste, c’est Céleste qui aurait mangé et Aliqua qui serait partie : l’ordre de service décide qui survit.

💡 Exemple 3 — l’omnivore ne compense pas

Réserves : 0 végétale, 10 carnées.

Aliqua reçoit 0 végétale et 2 carnées. La réserve carnée est largement suffisante, mais elle part quand même à l’aube : le manque du côté végétal n’est pas rattrapable.