{
  "graine": 20261010,
  "taille": "reference",
  "total_anomalies": 285,
  "anomalies": [
    {
      "code": "A01",
      "table": "abonnements",
      "lignes": 40,
      "anomalie": "lignes dupliquees a l identique, abonnement_id compris",
      "regle_de_nettoyage": "dedoublonner sur abonnement_id ; un identifiant est unique par definition"
    },
    {
      "code": "A02",
      "table": "abonnements",
      "lignes": 18,
      "anomalie": "date_fin anterieure a date_debut",
      "regle_de_nettoyage": "une periode negative n existe pas : ecarter la ligne ou retablir l ordre des deux dates"
    },
    {
      "code": "A03",
      "table": "abonnements",
      "lignes": 25,
      "anomalie": "periodes qui se chevauchent pour un meme client : son revenu est compte deux fois",
      "regle_de_nettoyage": "un seul abonnement actif par client et par jour ; recouper les periodes et trancher"
    },
    {
      "code": "A04",
      "table": "abonnements",
      "lignes": 30,
      "anomalie": "montant_mensuel exprime en centimes au lieu d euros",
      "regle_de_nettoyage": "comparer a prix_mensuel de l offre : un facteur 100 se voit, un contrôle de type non"
    },
    {
      "code": "A05",
      "table": "clients",
      "lignes": 22,
      "anomalie": "segment vide",
      "regle_de_nettoyage": "une cellule vide n est pas une categorie : decider explicitement — exclure, ou creer « non renseigne », et le dire"
    },
    {
      "code": "A06",
      "table": "abonnements",
      "lignes": 35,
      "anomalie": "date_debut ecrite en JJ/MM/AAAA au lieu de AAAA-MM-JJ",
      "regle_de_nettoyage": "normaliser en ISO ; attention au 03/04 qui se lit dans les deux sens"
    },
    {
      "code": "A07",
      "table": "factures",
      "lignes": 20,
      "anomalie": "client_id absent du referentiel des clients",
      "regle_de_nettoyage": "jointure externe puis comptage : une facture orpheline ne se rattache a aucun revenu"
    },
    {
      "code": "A08",
      "table": "factures",
      "lignes": 28,
      "anomalie": "montant_ttc egal au hors taxes : la TVA manque",
      "regle_de_nettoyage": "recalculer : ttc = ht + tva, au centime — et ne jamais faire confiance a une colonne calculee livree"
    },
    {
      "code": "A09",
      "table": "factures",
      "lignes": 12,
      "anomalie": "montant_ht negatif",
      "regle_de_nettoyage": "un avoir se declare comme tel : soit une colonne de type, soit une table a part"
    },
    {
      "code": "A10",
      "table": "factures",
      "lignes": 15,
      "anomalie": "facture_id en double avec deux montants differents : le total depend de la ligne gardee",
      "regle_de_nettoyage": "dedoublonner sur facture_id, et dire laquelle est retenue — la premiere, la derniere, ou la plus elevee"
    },
    {
      "code": "A11",
      "table": "usage_mensuel",
      "lignes": 26,
      "anomalie": "places_utilisees superieures aux places payees",
      "regle_de_nettoyage": "impossible par construction : la mesure est fausse, ou la ligne appartient a un autre abonnement"
    },
    {
      "code": "A12",
      "table": "abonnements",
      "lignes": 14,
      "anomalie": "offre_id absente du referentiel des offres",
      "regle_de_nettoyage": "jointure externe : un abonnement sans offre n a pas de prix de liste, donc pas d ecart mesurable"
    }
  ]
}