lumnik. / scénarios Tous les scénarios · English

Une date de livraison que chaque entrepôt calcule autrement

Objectif Promettre au client la date que son entrepôt peut tenir: une seule règle de calcul, réglée par entrepôt (pays, délai, jours fermés).

La date promise = la date de commande plus N jours ouvrés. Mais chaque entrepôt compte à sa façon:

L'opérateur écrit la règle une fois; l'intégrateur la règle par entrepôt.

manifests/promised-date.kts
// Operator-provided: the delivery date promised to a customer — the order date plus `lead_days` working days.// A working day is Monday to Friday, not a public holiday of the warehouse's `country`, and not one of the// warehouse's own `closed` days. The integrator sets all three in the hook's context.@Suppress("UNCHECKED_CAST")val cells = bindings["cells"] as MutableMap<String, Any?>val context = bindings["context"] as Map<*, *>// The operator's 2026 calendar: fixed days and the Easter-dependent ones (Easter Monday, Ascension, Whit Monday).val holidays = mapOf(    "FR" to setOf("2026-01-01", "2026-04-06", "2026-05-01", "2026-05-08", "2026-05-14", "2026-05-25",                  "2026-07-14", "2026-08-15", "2026-11-01", "2026-11-11", "2026-12-25"),    "BE" to setOf("2026-01-01", "2026-04-06", "2026-05-01", "2026-05-14", "2026-05-25",                  "2026-07-21", "2026-08-15", "2026-11-01", "2026-11-11", "2026-12-25"))val off = holidays.getValue(context["country"] as String) + (context["closed"] as List<*>? ?: emptyList<Any>()).map { it.toString() }var day = java.time.LocalDate.parse(cells["order_date"] as String)var left = (context["lead_days"] as Number).toInt()while (left > 0) {    day = day.plusDays(1)    if (day.dayOfWeek.value <= 5 && day.toString() !in off) left--}cells["promised_date"] = day.toString()cells["warehouse"] = context["warehouse"] as String
orders.csv
order_no;customer;order_date
CMD-3101;Durand;2026-04-30
CMD-3102;Morel;2026-05-12
CMD-3103;Nguyen;2026-07-10
CMD-3104;Faure;2026-08-13
manifests/20-liege.yaml
apiVersion: connectors.lumnik.io/v1kind: Connectormetadata:  name: scenario-promise-liege-b  connector_type: csv-file  scopes: [sales-b]spec:  transport:    kind: local    path: /tmp/lumnik-scenario/delivery-date-two-warehouses/b/orders.csv  parser:    delimiter: ";"  after_process: none  mapping:    cell:      - kotlin:          script: hooks:promised-date-b.kts   # one rule, the operator's          context:                            # this warehouse's part of it            warehouse: LIEGE            country: BE            lead_days: 5
manifests/30-promise.yaml
kind: Entityname: delivery_promise_blabel: Date de livraison promisedescription: "An order's delivery date as each warehouse promises it: one rule, each warehouse's lead time, holidays and closed days."match: [order_no, warehouse]scopes: [sales-b]columns:  order_no: { label: "Commande" }  customer: { label: "Client" }  order_date: { label: "Commandé le" }  warehouse: { label: "Entrepôt" }  promised_date: { label: "Livraison promise" }sources:  - table: t_scenario_promise_lyon_b    map: { order_no: order_no, customer: customer, order_date: order_date, warehouse: warehouse, promised_date: promised_date }  - table: t_scenario_promise_liege_b    map: { order_no: order_no, customer: customer, order_date: order_date, warehouse: warehouse, promised_date: promised_date }

Limites

  • Le calendrier des fériés est celui que l'opérateur écrit dans le script: il le tient à jour chaque année.
  • Le délai compte des jours ouvrés, pas des heures: une commande passée le soir part comme une commande du matin.
  • Commandes synthétiques.

Service client · livraison

Quand le client sera-t-il livré?

Ça dépend de l'entrepôt.

Lyon: 3 jours et des inventaires. Liège: 5 jours et d'autres fériés.

Commandes synthétiques

Le problème

Une règle, deux calendriers.

  • Le 8 mai est férié en France, pas en Belgique.
  • Lyon ferme pour inventaire.
  • Chaque entrepôt a son délai.

Rien n'est modifié

Les commandes restent telles quelles.

  • L'opérateur écrit la règle une fois.
  • L'intégrateur la règle par entrepôt.
  • Chaque commande reçoit sa date.

Ce qu'il a fallu écrire

context:
  country: FR
  lead_days: 3
  closed: ["2026-05-05"]

Le réglage de Lyon, en quatre lignes.

Le scénario complet tient en 4 fichiers, 83 lignes, dont un script de 23 lignes.

Les réponses

Une commande, deux dates justes.

  • CMD-3101: le 7 mai à Lyon, le 8 mai à Liège.
  • CMD-3102: le 18 mai à Lyon, le 20 mai à Liège.

La limite

Le calendrier se tient à jour.

  • Les fériés sont dans le script de l'opérateur.
  • Des jours, pas des heures.

Essayer

Le scénario se rejoue de bout en bout.

Un script, deux connecteurs, une entité: chaque étape est publiée avec sa sortie.

Ce scénario tourne sur lumnik Open, gratuit et open source.

Essayer lumnik Open →