{
  "nom": "logistique",
  "titre": "Logistique : commandes, expeditions, delais, stock",
  "origine": "donnees synthetiques",
  "licence": "libre de reutilisation — aucune donnee personnelle reelle",
  "graine": 20261010,
  "script": "outils/donnees/logistique.py",
  "separateur": ";",
  "encodage": "UTF-8",
  "invariant": "le stock ne devient jamais negatif : le cumul chronologique des mouvements, par entrepot et par article, reste positif ou nul a chaque ligne. Toute commande a au moins une ligne ; toute commande livree a au moins une expedition livree ; une commande annulee n a aucune expedition",
  "pieges_poses": "un taux dont le denominateur se discute (trois taux de service differents et tous defendables), et une distribution de delais a queue longue, ou la moyenne est tres au-dessus de la mediane",
  "tables": {
    "entrepots": {
      "granularite": "une ligne par entrepot",
      "cle": "entrepot_id",
      "colonnes": {
        "entrepot_id": "identifiant — texte, unique",
        "libelle": "nom de l entrepot",
        "region": "region administrative",
        "surface_m2": "surface en metres carres — entier",
        "quais": "nombre de quais de chargement — entier"
      }
    },
    "transporteurs": {
      "granularite": "une ligne par transporteur",
      "cle": "transporteur_id",
      "colonnes": {
        "transporteur_id": "identifiant — texte, unique",
        "nom": "nom commercial — invente",
        "delai_contractuel_jours": "delai promis au contrat, en jours — entier",
        "taux_service_contractuel": "taux de service promis au contrat — proportion de 0 a 1, PAS un pourcentage"
      }
    },
    "articles": {
      "granularite": "une ligne par reference",
      "cle": "article_id",
      "colonnes": {
        "article_id": "identifiant — texte, unique",
        "libelle": "designation",
        "famille": "Mobilier | Electromenager | Jardin | Bricolage | Decoration | Luminaire",
        "poids_kg": "poids unitaire en kilogrammes",
        "volume_dm3": "volume unitaire en decimetres cubes",
        "prix_unitaire": "prix de vente unitaire en euros",
        "stock_securite": "seuil de reapprovisionnement — entier"
      }
    },
    "commandes": {
      "granularite": "une ligne par commande",
      "cle": "commande_id",
      "colonnes": {
        "commande_id": "identifiant — texte, unique",
        "client_ref": "reference client — numero de serie, aucune personne reelle",
        "date_commande": "date de passation — AAAA-MM-JJ",
        "date_promesse": "date de livraison promise — AAAA-MM-JJ, jamais anterieure a la commande",
        "entrepot_id": "cle vers entrepots.entrepot_id",
        "canal": "web | magasin | marketplace | telephone",
        "statut": "livree | en cours | annulee",
        "motif_annulation": "rupture de stock | demande du client | adresse invalide | paiement refuse — VIDE si la commande n est pas annulee"
      }
    },
    "lignes_commande": {
      "granularite": "une ligne par article commande ; une commande en a de une a six",
      "cle": "ligne_id",
      "colonnes": {
        "ligne_id": "identifiant — texte, unique",
        "commande_id": "cle vers commandes.commande_id",
        "article_id": "cle vers articles.article_id",
        "quantite": "nombre d unites — entier strictement positif",
        "prix_unitaire": "prix applique, en euros",
        "montant_ligne": "prix_unitaire x quantite, au centime"
      }
    },
    "expeditions": {
      "granularite": "une ligne par expedition ; une commande peut partir en PLUSIEURS expeditions, ce qui fait que joindre les deux tables multiplie les montants de commande",
      "cle": "expedition_id",
      "colonnes": {
        "expedition_id": "identifiant — texte, unique",
        "commande_id": "cle vers commandes.commande_id",
        "transporteur_id": "cle vers transporteurs.transporteur_id",
        "date_expedition": "date de depart — AAAA-MM-JJ, jamais anterieure a la commande",
        "date_livraison": "date d arrivee — AAAA-MM-JJ, VIDE si la livraison est encore en cours ; une cellule vide est donc une information",
        "poids_kg": "poids expedie, en kilogrammes",
        "nb_colis": "nombre de colis — entier"
      }
    },
    "mouvements_stock": {
      "granularite": "une ligne par mouvement de stock",
      "cle": "mouvement_id",
      "colonnes": {
        "mouvement_id": "identifiant — texte, unique",
        "date": "date du mouvement — AAAA-MM-JJ",
        "entrepot_id": "cle vers entrepots.entrepot_id",
        "article_id": "cle vers articles.article_id",
        "type": "entree | sortie | ajustement",
        "quantite": "quantite du mouvement — entier positif ; le SIGNE vient du type",
        "motif": "stock initial | reapprovisionnement | preparation de commande | inventaire"
      }
    },
    "calendrier": {
      "granularite": "une ligne par jour de la periode, sans trou",
      "cle": "date",
      "colonnes": {
        "date": "jour — AAAA-MM-JJ",
        "annee": "annee sur quatre chiffres",
        "trimestre": "T1 a T4",
        "mois_numero": "numero du mois, 1 a 12",
        "mois_nom": "nom du mois en francais",
        "annee_mois": "AAAA-MM",
        "semaine_iso": "AAAA-Sxx",
        "est_ouvre": "1 du lundi au vendredi, 0 le week-end"
      }
    }
  }
}