{
  "graine": 20261010,
  "taille": "reference",
  "total_anomalies": 670,
  "anomalies": [
    {
      "code": "A01",
      "table": "lignes_commande",
      "lignes": 90,
      "anomalie": "lignes dupliquees a l identique, ligne_id compris",
      "regle_de_nettoyage": "dedoublonner sur ligne_id ; un identifiant est unique par definition"
    },
    {
      "code": "A02",
      "table": "expeditions",
      "lignes": 60,
      "anomalie": "date_livraison anterieure a date_expedition",
      "regle_de_nettoyage": "un delai negatif n existe pas : ecarter la ligne, et ne JAMAIS la laisser entrer dans une moyenne de delai"
    },
    {
      "code": "A03",
      "table": "expeditions",
      "lignes": 70,
      "anomalie": "poids exprime en grammes au lieu de kilogrammes",
      "regle_de_nettoyage": "recouper avec la somme des poids des articles commandes : un facteur 1 000 se voit, un contrôle de type non"
    },
    {
      "code": "A04",
      "table": "commandes",
      "lignes": 80,
      "anomalie": "statut ecrit de plusieurs facons : Livree, LIVREE, delivered, livrée",
      "regle_de_nettoyage": "normaliser sur un vocabulaire ferme AVANT tout regroupement ; sinon un meme statut se compte en cinq categories et le taux de service est faux"
    },
    {
      "code": "A05",
      "table": "lignes_commande",
      "lignes": 81,
      "anomalie": "commandes sans aucune ligne : 40 commandes orphelines",
      "regle_de_nettoyage": "jointure externe puis comptage : une commande sans ligne a un montant de zero, et elle ecrase le panier moyen"
    },
    {
      "code": "A06",
      "table": "lignes_commande",
      "lignes": 55,
      "anomalie": "quantite a zero",
      "regle_de_nettoyage": "une ligne de commande a zero n existe pas : decider explicitement — ecarter, ou la traiter comme une annulation de ligne, et le dire"
    },
    {
      "code": "A07",
      "table": "expeditions",
      "lignes": 45,
      "anomalie": "transporteur_id absent du referentiel",
      "regle_de_nettoyage": "jointure externe : sans transporteur, pas de delai contractuel, donc aucun taux de service calculable sur ces lignes"
    },
    {
      "code": "A08",
      "table": "commandes",
      "lignes": 50,
      "anomalie": "date_promesse anterieure a date_commande",
      "regle_de_nettoyage": "une promesse dans le passe rend la commande en retard des sa creation : le taux de service tombe sans qu aucune livraison ait change"
    },
    {
      "code": "A09",
      "table": "expeditions",
      "lignes": 35,
      "anomalie": "expedition_id en double avec deux dates differentes : le delai depend de la ligne gardee",
      "regle_de_nettoyage": "dedoublonner sur expedition_id, et dire laquelle est retenue"
    },
    {
      "code": "A10",
      "table": "mouvements_stock",
      "lignes": 30,
      "anomalie": "ajustement d inventaire negatif rendant le solde cumule negatif",
      "regle_de_nettoyage": "cumuler dans l ordre chronologique et s arreter au premier solde negatif : un stock negatif n est pas une rupture, c est une erreur de saisie"
    },
    {
      "code": "A11",
      "table": "lignes_commande",
      "lignes": 48,
      "anomalie": "prix_unitaire vide",
      "regle_de_nettoyage": "une cellule vide n est pas un zero : recuperer le prix de l article, ou ecarter la ligne et le dire"
    },
    {
      "code": "A12",
      "table": "expeditions",
      "lignes": 26,
      "anomalie": "date_livraison posterieure a la fin de la periode annoncee par le jeu",
      "regle_de_nettoyage": "borner par la periode : une date hors bornes passe tous les contrôles de type et casse l echelle de tout graphique temporel"
    }
  ]
}