Audit de qualité des données avant migration ERP
Base auditée : dqbench_negoce_small_l20_sansddl · audit dqbench_negoce_small_l20_sansddl-1 · 2026-11-04
34 tables, 202 068 lignes lues ; aucune donnée n'a quitté la machine de l'audit.
En bref
94,5 %des lignes sont saines
191 026 lignes saines sur 202 068 ; 11 042 lignes concernées par au moins un constat, chacune comptée à sa criticité la plus haute :
Hypothèses de coût du profil, à ajuster avec le client : taux horaire de reprise et coût d'un document rejeté sont des ordres de grandeur, pas des mesures.
Les 10 constats les plus sûrs
Une ligne par règle, de la plus sûre à la moins sûre (54 règles en tout, toutes dans la section 2). La preuve est la requête qui désigne les lignes à corriger.
| # | Constat | Table | Lignes | Coût | Preuve |
|---|---|---|---|---|---|
| 1 | unite_id est le unite_id de la ligne de article visée par article_id (chemin découvert) score 1,00 · DEC:CHE:ligne_commande_client.unite_id=article.unite_id@article_id | ligne_commande_client.unite_id | 71 | 1 278 € | SQLSELECT t."id"::text FROM "ligne_commande_client" t JOIN "article" m ON m."id"::text = t."article_id"::text WHERE t."unite_id"::text IS NOT NULL AND m."unite_id"::text IS NOT NULL AND NOT (t."unite_id"::text = m."unite_id"::text) AND m."id"::text NOT IN (SELECT m."id"::text FROM "ligne_commande_client" t JOIN "article" m ON m."id"::text = t."article_id"::text WHERE t."unite_id"::text IS NOT NULL AND m."unite_id"::text IS NOT NULL GROUP BY 1 HAVING count(*) FILTER (WHERE NOT (t."unite_id"::text = m."unite_id"::text)) >= 5 AND 2 * count(*) FILTER (WHERE NOT (t."unite_id"::text = m."unite_id"::text)) >= count(*) ORDER BY 1) ORDER BY 1 |
| 2 | article_id d'une ligne de ligne_commande_client contredit par la plupart des lignes qui la visent (ligne_facture, ligne_livraison ; chemin découvert, imputé à la mère) score 1,00 · DEC:CHM:ligne_commande_client.article_id | ligne_commande_client.article_id | 389 | 7 002 € | SQLSELECT m."id"::text FROM "ligne_facture" t JOIN "ligne_commande_client" m ON m."id"::text = t."ligne_commande_client_id"::text WHERE t."article_id"::text IS NOT NULL AND m."article_id"::text IS NOT NULL GROUP BY 1 HAVING count(*) FILTER (WHERE NOT (t."article_id"::text = m."article_id"::text)) >= 2 AND 2 * count(*) FILTER (WHERE NOT (t."article_id"::text = m."article_id"::text)) >= count(*) ORDER BY 1 |
| 3 | Chaque valeur de facture.tiers_id existe dans tiers.id (lien retrouvé par le graphe de la base) score 0,99 · lien:facture.tiers_id->tiers.id | facture.tiers_id | 281 | 10 959 € | SQLSELECT a."id"::text FROM "facture" a WHERE a."tiers_id" IS NOT NULL AND NOT EXISTS (SELECT 1 FROM "tiers" b WHERE b."id" = a."tiers_id") ORDER BY 1 |
| 4 | Le montant d'une ligne vaut quantité × prix (× (1 − remise)), sa taxe vaut montant × taux, et ses montants s'additionnent (TTC = HT + TVA) score 0,95 · ERP05:ligne_commande_client.montant_ht | ligne_commande_client.montant_ht | 1 684 | 22 453 € | SQLSELECT t."id"::text FROM "ligne_commande_client" t WHERE t."montant_ht"::numeric IS NOT NULL AND t."quantite"::numeric IS NOT NULL AND t."prix_unitaire"::numeric IS NOT NULL AND t."remise_pct"::numeric IS NOT NULL AND NOT (abs(t."montant_ht"::numeric - round(t."quantite"::numeric * t."prix_unitaire"::numeric * (1 - t."remise_pct"::numeric / 100.0), 2)) <= 0.01) ORDER BY 1 |
| 5 | Le montant d'une ligne vaut quantité × prix (× (1 − remise)), sa taxe vaut montant × taux, et ses montants s'additionnent (TTC = HT + TVA) score 0,95 · ERP05:ligne_facture.montant_ttc | ligne_facture.montant_ttc | 650 | 8 667 € | SQLSELECT t."id"::text FROM "ligne_facture" t WHERE t."montant_ttc"::numeric IS NOT NULL AND t."montant_ht"::numeric IS NOT NULL AND t."montant_tva"::numeric IS NOT NULL AND NOT (abs(t."montant_ttc"::numeric - (t."montant_ht"::numeric + t."montant_tva"::numeric)) <= 0.01) AND (abs(t."montant_ht"::numeric - round(t."quantite"::numeric * t."prix_unitaire"::numeric * (1 - t."remise_pct"::numeric / 100.0), 2)) <= 0.01 OR NOT (t."montant_ht"::numeric IS NOT NULL AND t."quantite"::numeric IS NOT NULL AND t."prix_unitaire"::numeric IS NOT NULL AND t."remise_pct"::numeric IS NOT NULL)) AND (abs(t."montant_tva"::numeric - round(t."taux_tva"::numeric * t."montant_ht"::numeric / 100.0, 2)) <= 0.01 OR NOT (t."montant_tva"::numeric IS NOT NULL AND t."taux_tva"::numeric IS NOT NULL AND t."montant_ht"::numeric IS NOT NULL)) ORDER BY 1 |
| 6 | Le code postal d'une adresse française est celui de sa commune (référentiel des communes) score 0,95 · ERP03:tiers_adresse.code_postal+commune | tiers_adresse.code_postal | 406 | 2 368 € | SQLSELECT t."id"::text FROM "tiers_adresse" t WHERE (t."code_postal" IS NOT NULL AND btrim(t."code_postal"::text) <> '') AND (t."commune" IS NOT NULL AND btrim(t."commune"::text) <> '') AND btrim(t."pays"::text) = ANY('{… 1 valeur …}') AND (regexp_replace(t."code_postal"::text, '\s+', '', 'g'), btrim(regexp_replace(lower(replace(replace(replace(replace(translate(t."commune"::text, '…', '…'), '…', '…'), '…', '…'), '…', '…'), '…', '…')), '[^a-z0-9]+', ' ', 'g'))) NOT IN (SELECT x.a, x.b FROM unnest('{… 2536 valeurs …}'::text[], '{… 2536 valeurs …}'::text[]) AS x(a, b)) ORDER BY 1 |
| 7 | Une valeur sentinelle (N/A, 00000, 1900-01-01) tient la place d'une valeur manquante score 0,95 · ERP08:tiers_adresse.code_postal | tiers_adresse.code_postal | 172 | 2 007 € | SQLSELECT t."id"::text FROM "tiers_adresse" t WHERE t."code_postal"::text = ANY('{… 2 valeurs …}') ORDER BY 1 |
| 8 | Un identifiant d'entreprise (SIREN, SIRET) a une clé de Luhn juste, et le SIRET commence par le SIREN de sa ligne score 0,95 · ERP01:tiers.siret | tiers.siret | 238 | 1 388 € | SQLSELECT t."id"::text FROM "tiers" t WHERE (t."siret" IS NOT NULL AND btrim(t."siret"::text) <> '') AND (NOT (upper(regexp_replace(t."siret"::text, '\s+', '', 'g')) ~ '^([0-9]{14})$' AND (CASE WHEN upper(regexp_replace(t."siret"::text, '\s+', '', 'g')) ~ '^[0-9]+$' THEN (SELECT sum(CASE WHEN s.i % 2 = 1 THEN CASE WHEN s.d * 2 > 9 THEN s.d * 2 - 9 ELSE s.d * 2 END ELSE s.d END) % 10 = 0 FROM (SELECT g.i, substr(upper(regexp_replace(t."siret"::text, '\s+', '', 'g')), length(upper(regexp_replace(t."siret"::text, '\s+', '', 'g'))) - g.i, 1)::int AS d FROM generate_series(0, length(upper(regexp_replace(t."siret"::text, '\s+', '', 'g'))) - 1) AS g(i)) s) ELSE false END)) OR ((t."siren" IS NOT NULL AND btrim(t."siren"::text) <> '') AND left(upper(regexp_replace(t."siret"::text, '\s+', '', 'g')), length(upper(regexp_replace(t."siren"::text, '\s+', '', 'g')))) <> upper(regexp_replace(t."siren"::text, '\s+', '', 'g')))) ORDER BY 1 |
| 9 | Une date d'événement n'est pas antérieure à la date de création ou de référence de sa ligne score 0,95 · ERP06:facture_fournisseur.date_echeance>=date_facture | facture_fournisseur.date_echeance | 210 | 7 210 € | SQLSELECT t."id"::text FROM "facture_fournisseur" t WHERE t."date_echeance"::date < t."date_facture"::date ORDER BY 1 |
| 10 | Le montant d'une ligne vaut quantité × prix (× (1 − remise)), sa taxe vaut montant × taux, et ses montants s'additionnent (TTC = HT + TVA) score 0,95 · ERP05:ligne_commande_fournisseur.montant_ttc | ligne_commande_fournisseur.montant_ttc | 198 | 2 640 € | SQLSELECT t."id"::text FROM "ligne_commande_fournisseur" t WHERE t."montant_ttc"::numeric IS NOT NULL AND t."montant_ht"::numeric IS NOT NULL AND t."montant_tva"::numeric IS NOT NULL AND NOT (abs(t."montant_ttc"::numeric - (t."montant_ht"::numeric + t."montant_tva"::numeric)) <= 0.01) AND (abs(t."montant_ht"::numeric - round(t."quantite"::numeric * t."prix_unitaire"::numeric, 2)) <= 0.01 OR NOT (t."montant_ht"::numeric IS NOT NULL AND t."quantite"::numeric IS NOT NULL AND t."prix_unitaire"::numeric IS NOT NULL)) AND (abs(t."montant_tva"::numeric - round(t."taux_tva"::numeric * t."montant_ht"::numeric / 100.0, 2)) <= 0.01 OR NOT (t."montant_tva"::numeric IS NOT NULL AND t."taux_tva"::numeric IS NOT NULL AND t."montant_ht"::numeric IS NOT NULL)) ORDER BY 1 |
Les 5 premières questions
Ce que les données ne tranchent pas seules : votre réponse « oui » en fait une règle de l'audit suivant (6 questions en tout, section 4).
- La colonne tiers_adresse.code_postal doit-elle toujours être remplie (pour une valeur de tiers_adresse.pays) ? 354 ligne(s) concernée(s).
- La colonne reglement.tiers_banque_id doit-elle toujours être remplie (pour une valeur de reglement.mode) ? 344 ligne(s) concernée(s).
- La colonne tiers_contact.telephone doit-elle toujours être remplie (pour une valeur de tiers_contact.est_principal) ? 81 ligne(s) concernée(s).
- La colonne article.poids_kg doit-elle toujours être remplie (pour une valeur de article.statut) ? 54 ligne(s) concernée(s).
- La colonne reglement.tiers_banque_id doit-elle toujours être remplie (pour une valeur de reglement.mode) ? 16 ligne(s) concernée(s).
1. La carte
Lignes concernées et montant estimé, par table et par dimension de qualité. La couleur suit la part des lignes de la table.
| Table | Compl. | Valid. | Unic. | Coh. int. | Coh. ext. | Plaus. |
|---|---|---|---|---|---|---|
| facture factures clients 6 059 lignes · 131 389 € | 72026 400 € | non jugée | 30813 090 € | 63221 699 € | 1 80070 200 € | 0 |
| ligne_commande_client lignes de commande client 21 143 lignes · 37 498 € | non jugée | non jugée | 0 | 1 68422 453 € | 5489 864 € | 4715 181 € |
| commande_client commandes clients 5 000 lignes · 30 980 € | 32912 063 € | non jugée | 1054 462 € | 42114 454 € | 0 | non jugée |
| facture_fournisseur factures fournisseur 940 lignes · 15 886 € | 1023 740 € | non jugée | 622 635 € | 2107 210 € | 592 301 € | 0 |
| ligne_facture lignes de facture client 20 027 lignes · 15 110 € | non jugée | non jugée | 0 | 6508 667 € | 1522 736 € | 3373 707 € |
| tiers tiers (clients et fournisseurs) 723 lignes · 6 755 € | 1301 517 € | 2381 388 € | 2203 850 € | 0 | 0 | 0 |
| tiers_adresse adresses des tiers 1 511 lignes · 5 565 € | 1722 007 € | 4062 368 € | 681 190 € | 0 | 0 | non jugée |
| ligne_facture_fournisseur lignes de facture fournisseur 3 914 lignes · 4 862 € | 0 | non jugée | 0 | 0 | 0 | 4424 862 € |
| avoir avoirs clients 174 lignes · 4 657 € | 0 | non jugée | 381 615 € | non jugée | 783 042 € | non jugée |
| tiers_contact contacts des tiers 1 145 lignes · 4 503 € | 2603 033 € | non jugée | 841 470 € | non jugée | 0 | non jugée |
| article articles 426 lignes · 4 074 € | 0 | non jugée | 1322 310 € | 0 | 1261 764 € | 0 |
| ligne_commande_fournisseur lignes de commande fournisseur 4 024 lignes · 2 640 € | 0 | non jugée | 0 | 1982 640 € | 0 | 0 |
| livraison bons de livraison client 6 059 lignes · 2 263 € | 1942 263 € | non jugée | 0 | 0 | 0 | non jugée |
| tiers_banque coordonnées bancaires des tiers 390 lignes · 1 166 € | 0 | 1951 138 € | 0 | non jugée | 228 € | non jugée |
| reglement règlements clients et fournisseurs 6 671 lignes · 1 029 € | 0 | non jugée | 0 | 0 | 0 | 1471 029 € |
| reception réceptions de commandes fournisseur 940 lignes · 502 € | 43502 € | non jugée | 0 | 0 | 0 | non jugée |
| ligne_livraison lignes de livraison client 20 191 lignes · 238 € | non jugée | non jugée | 0 | non jugée | 17238 € | 0 |
17 table(s) sans constat
affectation_reglement(6 711 lignes ; dimensions jugées : complétude, unicité, cohérence entre tables, plausibilité)commande_fournisseur(800 lignes ; dimensions jugées : complétude, unicité, cohérence interne, cohérence entre tables)compte_general(37 lignes ; dimensions jugées : unicité)cours_devise(36 lignes ; dimensions jugées : unicité)depot(3 lignes ; dimensions jugées : validité)ecriture(13 844 lignes ; dimensions jugées : complétude, unicité, cohérence interne, cohérence entre tables, plausibilité)famille_article(14 lignes ; dimensions jugées : aucune)journal(4 lignes ; dimensions jugées : aucune)ligne_avoir(208 lignes ; dimensions jugées : complétude, unicité, cohérence interne, cohérence entre tables, plausibilité)ligne_ecriture(47 081 lignes ; dimensions jugées : complétude, unicité, cohérence entre tables)ligne_reception(3 699 lignes ; dimensions jugées : unicité, cohérence entre tables, plausibilité)mouvement_stock(25 292 lignes ; dimensions jugées : complétude, unicité, cohérence interne, cohérence entre tables, plausibilité)ref_commune_cp(2 536 lignes ; dimensions jugées : complétude)stock(899 lignes ; dimensions jugées : complétude, unicité, cohérence entre tables, plausibilité)tarif(1 152 lignes ; dimensions jugées : complétude, unicité, cohérence interne, cohérence entre tables)tarif_client(403 lignes ; dimensions jugées : complétude, unicité, cohérence entre tables, plausibilité)unite(12 lignes ; dimensions jugées : aucune)
2. Les constats
Une carte par règle, de la plus sûre à la moins sûre (score de fusion : probabilité estimée qu'un constat soit une vraie erreur). Exemples : clés de ligne seulement, jamais de valeurs.
unite_id est le unite_id de la ligne de article visée par article_id (chemin découvert)
- Où
ligne_commande_client.unite_id- Lignes
- 71 (0,3 % des lignes jugées)
- Coût
- 1 278 € (18,00 € par ligne)
- Exemples
10266, 1089, 11400, 1183, 12155
Preuve SQL
SELECT t."id"::text FROM "ligne_commande_client" t JOIN "article" m ON m."id"::text = t."article_id"::text WHERE t."unite_id"::text IS NOT NULL AND m."unite_id"::text IS NOT NULL AND NOT (t."unite_id"::text = m."unite_id"::text) AND m."id"::text NOT IN (SELECT m."id"::text FROM "ligne_commande_client" t JOIN "article" m ON m."id"::text = t."article_id"::text WHERE t."unite_id"::text IS NOT NULL AND m."unite_id"::text IS NOT NULL GROUP BY 1 HAVING count(*) FILTER (WHERE NOT (t."unite_id"::text = m."unite_id"::text)) >= 5 AND 2 * count(*) FILTER (WHERE NOT (t."unite_id"::text = m."unite_id"::text)) >= count(*) ORDER BY 1) ORDER BY 1
DEC:CHE:ligne_commande_client.unite_id=article.unite_id@article_id
article_id d'une ligne de ligne_commande_client contredit par la plupart des lignes qui la visent (ligne_facture, ligne_livraison ; chemin découvert, imputé à la mère)
- Où
ligne_commande_client.article_id- Lignes
- 389 (1,8 % des lignes jugées)
- Coût
- 7 002 € (18,00 € par ligne)
- Exemples
10256, 10405, 10437, 10520, 10963
Preuve SQL
SELECT m."id"::text FROM "ligne_facture" t JOIN "ligne_commande_client" m ON m."id"::text = t."ligne_commande_client_id"::text WHERE t."article_id"::text IS NOT NULL AND m."article_id"::text IS NOT NULL GROUP BY 1 HAVING count(*) FILTER (WHERE NOT (t."article_id"::text = m."article_id"::text)) >= 2 AND 2 * count(*) FILTER (WHERE NOT (t."article_id"::text = m."article_id"::text)) >= count(*) ORDER BY 1
DEC:CHM:ligne_commande_client.article_id
Chaque valeur de facture.tiers_id existe dans tiers.id (lien retrouvé par le graphe de la base)
- Où
facture.tiers_id- Lignes
- 281 (4,6 % des lignes jugées)
- Coût
- 10 959 € (39,00 € par ligne)
- Exemples
1227, 1392, 1426, 1455, 1491
Preuve SQL
SELECT a."id"::text FROM "facture" a WHERE a."tiers_id" IS NOT NULL AND NOT EXISTS (SELECT 1 FROM "tiers" b WHERE b."id" = a."tiers_id") ORDER BY 1
lien:facture.tiers_id->tiers.id
Le montant d'une ligne vaut quantité × prix (× (1 − remise)), sa taxe vaut montant × taux, et ses montants s'additionnent (TTC = HT + TVA)
- Où
ligne_commande_client.montant_ht- Lignes
- 1 684 (8,0 % des lignes jugées)
- Coût
- 22 453 € (13,33 € par ligne)
- Exemples
10002, 1002, 10055, 10062, 10101
Preuve SQL
SELECT t."id"::text FROM "ligne_commande_client" t WHERE t."montant_ht"::numeric IS NOT NULL AND t."quantite"::numeric IS NOT NULL AND t."prix_unitaire"::numeric IS NOT NULL AND t."remise_pct"::numeric IS NOT NULL AND NOT (abs(t."montant_ht"::numeric - round(t."quantite"::numeric * t."prix_unitaire"::numeric * (1 - t."remise_pct"::numeric / 100.0), 2)) <= 0.01) ORDER BY 1
ERP05:ligne_commande_client.montant_ht
Le montant d'une ligne vaut quantité × prix (× (1 − remise)), sa taxe vaut montant × taux, et ses montants s'additionnent (TTC = HT + TVA)
- Où
ligne_facture.montant_ttc- Lignes
- 650 (3,2 % des lignes jugées)
- Coût
- 8 667 € (13,33 € par ligne)
- Exemples
10015, 10030, 10050, 10060, 10066
Preuve SQL
SELECT t."id"::text FROM "ligne_facture" t WHERE t."montant_ttc"::numeric IS NOT NULL AND t."montant_ht"::numeric IS NOT NULL AND t."montant_tva"::numeric IS NOT NULL AND NOT (abs(t."montant_ttc"::numeric - (t."montant_ht"::numeric + t."montant_tva"::numeric)) <= 0.01) AND (abs(t."montant_ht"::numeric - round(t."quantite"::numeric * t."prix_unitaire"::numeric * (1 - t."remise_pct"::numeric / 100.0), 2)) <= 0.01 OR NOT (t."montant_ht"::numeric IS NOT NULL AND t."quantite"::numeric IS NOT NULL AND t."prix_unitaire"::numeric IS NOT NULL AND t."remise_pct"::numeric IS NOT NULL)) AND (abs(t."montant_tva"::numeric - round(t."taux_tva"::numeric * t."montant_ht"::numeric / 100.0, 2)) <= 0.01 OR NOT (t."montant_tva"::numeric IS NOT NULL AND t."taux_tva"::numeric IS NOT NULL AND t."montant_ht"::numeric IS NOT NULL)) ORDER BY 1
ERP05:ligne_facture.montant_ttc
Le code postal d'une adresse française est celui de sa commune (référentiel des communes)
- Où
tiers_adresse.code_postal- Lignes
- 406 (52,0 % des lignes jugées)
- Coût
- 2 368 € (5,83 € par ligne)
- Exemples
10, 1000, 1002, 1005, 1007
Preuve SQL
SELECT t."id"::text FROM "tiers_adresse" t WHERE (t."code_postal" IS NOT NULL AND btrim(t."code_postal"::text) <> '') AND (t."commune" IS NOT NULL AND btrim(t."commune"::text) <> '') AND btrim(t."pays"::text) = ANY('{… 1 valeur …}') AND (regexp_replace(t."code_postal"::text, '\s+', '', 'g'), btrim(regexp_replace(lower(replace(replace(replace(replace(translate(t."commune"::text, '…', '…'), '…', '…'), '…', '…'), '…', '…'), '…', '…')), '[^a-z0-9]+', ' ', 'g'))) NOT IN (SELECT x.a, x.b FROM unnest('{… 2536 valeurs …}'::text[], '{… 2536 valeurs …}'::text[]) AS x(a, b)) ORDER BY 1ERP03:tiers_adresse.code_postal+commune
Une valeur sentinelle (N/A, 00000, 1900-01-01) tient la place d'une valeur manquante
- Où
tiers_adresse.code_postal- Lignes
- 172 (15,5 % des lignes jugées)
- Coût
- 2 007 € (11,67 € par ligne)
- Exemples
1006, 1018, 1024, 1030, 1031
Preuve SQL
SELECT t."id"::text FROM "tiers_adresse" t WHERE t."code_postal"::text = ANY('{… 2 valeurs …}') ORDER BY 1ERP08:tiers_adresse.code_postal
Un identifiant d'entreprise (SIREN, SIRET) a une clé de Luhn juste, et le SIRET commence par le SIREN de sa ligne
- Où
tiers.siret- Lignes
- 238 (35,2 % des lignes jugées)
- Coût
- 1 388 € (5,83 € par ligne)
- Exemples
1, 10, 101, 102, 104
Preuve SQL
SELECT t."id"::text FROM "tiers" t WHERE (t."siret" IS NOT NULL AND btrim(t."siret"::text) <> '') AND (NOT (upper(regexp_replace(t."siret"::text, '\s+', '', 'g')) ~ '^([0-9]{14})$' AND (CASE WHEN upper(regexp_replace(t."siret"::text, '\s+', '', 'g')) ~ '^[0-9]+$' THEN (SELECT sum(CASE WHEN s.i % 2 = 1 THEN CASE WHEN s.d * 2 > 9 THEN s.d * 2 - 9 ELSE s.d * 2 END ELSE s.d END) % 10 = 0 FROM (SELECT g.i, substr(upper(regexp_replace(t."siret"::text, '\s+', '', 'g')), length(upper(regexp_replace(t."siret"::text, '\s+', '', 'g'))) - g.i, 1)::int AS d FROM generate_series(0, length(upper(regexp_replace(t."siret"::text, '\s+', '', 'g'))) - 1) AS g(i)) s) ELSE false END)) OR ((t."siren" IS NOT NULL AND btrim(t."siren"::text) <> '') AND left(upper(regexp_replace(t."siret"::text, '\s+', '', 'g')), length(upper(regexp_replace(t."siren"::text, '\s+', '', 'g')))) <> upper(regexp_replace(t."siren"::text, '\s+', '', 'g')))) ORDER BY 1ERP01:tiers.siret
Une date d'événement n'est pas antérieure à la date de création ou de référence de sa ligne
- Où
facture_fournisseur.date_echeance- Lignes
- 210 (29,2 % des lignes jugées)
- Coût
- 7 210 € (34,33 € par ligne)
- Exemples
108, 113, 116, 120, 124
Preuve SQL
SELECT t."id"::text FROM "facture_fournisseur" t WHERE t."date_echeance"::date < t."date_facture"::date ORDER BY 1
ERP06:facture_fournisseur.date_echeance>=date_facture
Le montant d'une ligne vaut quantité × prix (× (1 − remise)), sa taxe vaut montant × taux, et ses montants s'additionnent (TTC = HT + TVA)
- Où
ligne_commande_fournisseur.montant_ttc- Lignes
- 198 (4,9 % des lignes jugées)
- Coût
- 2 640 € (13,33 € par ligne)
- Exemples
1002, 1024, 1053, 1069, 1078
Preuve SQL
SELECT t."id"::text FROM "ligne_commande_fournisseur" t WHERE t."montant_ttc"::numeric IS NOT NULL AND t."montant_ht"::numeric IS NOT NULL AND t."montant_tva"::numeric IS NOT NULL AND NOT (abs(t."montant_ttc"::numeric - (t."montant_ht"::numeric + t."montant_tva"::numeric)) <= 0.01) AND (abs(t."montant_ht"::numeric - round(t."quantite"::numeric * t."prix_unitaire"::numeric, 2)) <= 0.01 OR NOT (t."montant_ht"::numeric IS NOT NULL AND t."quantite"::numeric IS NOT NULL AND t."prix_unitaire"::numeric IS NOT NULL)) AND (abs(t."montant_tva"::numeric - round(t."taux_tva"::numeric * t."montant_ht"::numeric / 100.0, 2)) <= 0.01 OR NOT (t."montant_tva"::numeric IS NOT NULL AND t."taux_tva"::numeric IS NOT NULL AND t."montant_ht"::numeric IS NOT NULL)) ORDER BY 1
ERP05:ligne_commande_fournisseur.montant_ttc
Une valeur sentinelle (N/A, 00000, 1900-01-01) tient la place d'une valeur manquante
- Où
tiers_contact.email- Lignes
- 166 (26,5 % des lignes jugées)
- Coût
- 1 937 € (11,67 € par ligne)
- Exemples
1001, 1006, 1027, 1028, 1034
Preuve SQL
SELECT t."id"::text FROM "tiers_contact" t WHERE t."email"::text = ANY('{… 3 valeurs …}') ORDER BY 1ERP08:tiers_contact.email
Une valeur sentinelle (N/A, 00000, 1900-01-01) tient la place d'une valeur manquante
- Où
tiers.code_naf- Lignes
- 130 (44,1 % des lignes jugées)
- Coût
- 1 517 € (11,67 € par ligne)
- Exemples
10, 110, 115, 122, 123
Preuve SQL
SELECT t."id"::text FROM "tiers" t WHERE t."code_naf"::text = ANY('{… 2 valeurs …}') ORDER BY 1ERP08:tiers.code_naf
Un numéro métier est unique dans sa table
- Où
tiers.code_tiers- Lignes
- 126 (17,4 % des lignes jugées)
- Coût
- 2 205 € (17,50 € par ligne)
- Exemples
501, 502, 503, 504, 505
Méthode
Calcul hors SQL : rangs de chaque série dans l'ordre chronologique, plus longue suite croissante ; un numéro hors de toute plus longue suite est renuméroté, ou en double s'il est déjà porté dans la série.
ERP10:tiers.code_tiers
Une valeur sentinelle (N/A, 00000, 1900-01-01) tient la place d'une valeur manquante
- Où
tiers_contact.telephone- Lignes
- 109 (11,2 % des lignes jugées)
- Coût
- 1 272 € (11,67 € par ligne)
- Exemples
1000, 1002, 1006, 1019, 103
Preuve SQL
SELECT t."id"::text FROM "tiers_contact" t WHERE t."telephone"::text = ANY('{… 2 valeurs …}') ORDER BY 1ERP08:tiers_contact.telephone
Une valeur sentinelle (N/A, 00000, 1900-01-01) tient la place d'une valeur manquante
- Où
facture_fournisseur.numero_fournisseur- Lignes
- 102 (14,7 % des lignes jugées)
- Coût
- 3 740 € (36,67 € par ligne)
- Exemples
100, 103, 106, 114, 116
Preuve SQL
SELECT t."id"::text FROM "facture_fournisseur" t WHERE t."numero_fournisseur"::text = ANY('{… 3 valeurs …}') ORDER BY 1ERP08:facture_fournisseur.numero_fournisseur
Fiche saisie deux fois sous deux formes (doublon flou)
- Où
tiers- Lignes
- 94 (13,0 % des lignes jugées)
- Coût
- 1 645 € (17,50 € par ligne)
- Exemples
627, 628, 630, 631, 632
Méthode
Calcul hors SQL : libellés normalisés, blocage, similarité par trigrammes et identifiants forts (paires sûres).
DBL:tiers
Ligne identique à une autre sur toutes les colonnes hors clé technique
- Où
tiers_contact- Lignes
- 84 (7,3 % des lignes jugées)
- Coût
- 1 470 € (17,50 € par ligne)
- Exemples
1062, 1063, 1064, 1065, 1066
Preuve SQL
SELECT pk, n FROM (SELECT t."id"::text AS pk, row_number() OVER (PARTITION BY h ORDER BY t."id") AS r, count(*) OVER (PARTITION BY h) AS n FROM (SELECT t.*, md5(row(t."tiers_id", t."civilite", t."nom", t."prenom", t."fonction", t."email", t."telephone", t."est_principal")::text) AS h FROM "tiers_contact" t) t) s WHERE r > 1 ORDER BY 1
EXACT:tiers_contact
Ligne identique à une autre sur toutes les colonnes hors clé technique
- Où
tiers_adresse- Lignes
- 68 (4,5 % des lignes jugées)
- Coût
- 1 190 € (17,50 € par ligne)
- Exemples
1217, 1218, 1220, 1221, 1223
Preuve SQL
SELECT pk, n FROM (SELECT t."id"::text AS pk, row_number() OVER (PARTITION BY h ORDER BY t."id") AS r, count(*) OVER (PARTITION BY h) AS n FROM (SELECT t.*, md5(row(t."tiers_id", t."type_adresse", t."ligne1", t."ligne2", t."code_postal", t."commune", t."code_insee", t."pays", t."est_principale")::text) AS h FROM "tiers_adresse" t) t) s WHERE r > 1 ORDER BY 1
EXACT:tiers_adresse
Chaque valeur de ligne_facture.ligne_commande_client_id existe dans ligne_commande_client.id (lien retrouvé par le graphe de la base)
- Où
ligne_facture.ligne_commande_client_id- Lignes
- 140 (0,7 % des lignes jugées)
- Coût
- 2 520 € (18,00 € par ligne)
- Exemples
10383, 11468, 11482, 11980, 12279
Preuve SQL
SELECT a."id"::text FROM "ligne_facture" a WHERE a."ligne_commande_client_id" IS NOT NULL AND NOT EXISTS (SELECT 1 FROM "ligne_commande_client" b WHERE b."id" = a."ligne_commande_client_id") ORDER BY 1
lien:ligne_facture.ligne_commande_client_id->ligne_commande_client.id
Un document correctif (avoir) est rattaché à un document, et ne le dépasse pas
- Où
avoir.total_ttc- Lignes
- 7 (4,0 % des lignes jugées)
- Coût
- 273 € (39,00 € par ligne)
- Exemples
102, 128, 133, 171, 51
Preuve SQL
SELECT f."id"::text FROM "avoir" f WHERE f."facture_id" IS NULL OR f."facture_id" IN (SELECT d."id" FROM "facture" d JOIN (SELECT g."facture_id" AS k, sum(g."total_ttc"::numeric) AS s FROM "avoir" g GROUP BY 1) s ON s.k = d."id" WHERE s.s > d."total_ttc"::numeric + 0.01) ORDER BY 1
ERP07:avoir.total_ttc<=facture.total_ttc
Ligne identique à une autre sur toutes les colonnes hors clé technique
- Où
article- Lignes
- 6 (1,4 % des lignes jugées)
- Coût
- 105 € (17,50 € par ligne)
- Exemples
335, 351, 363, 387, 406
Preuve SQL
SELECT pk, n FROM (SELECT t."id"::text AS pk, row_number() OVER (PARTITION BY h ORDER BY t."id") AS r, count(*) OVER (PARTITION BY h) AS n FROM (SELECT t.*, md5(row(t."code_article", t."libelle", t."famille_article_id", t."unite_id", t."prix_achat", t."prix_vente", t."poids_kg", t."code_barre", t."statut", t."date_creation", t."date_modification")::text) AS h FROM "article" t) t) s WHERE r > 1 ORDER BY 1
EXACT:article
Un numéro métier est unique dans sa table
- Où
facture.numero_facture- Lignes
- 308 (5,1 % des lignes jugées)
- Coût
- 13 090 € (42,50 € par ligne)
- Exemples
1002, 1014, 1058, 1082, 1096
Méthode
Calcul hors SQL : rangs de chaque série dans l'ordre chronologique, plus longue suite croissante ; un numéro hors de toute plus longue suite est renuméroté, ou en double s'il est déjà porté dans la série.
ERP10:facture.numero_facture
La numérotation d'une série de documents est continue et chronologique ; un document hors de la suite a été renuméroté et son numéro d'origine manque (obligation de numérotation continue des factures, CGI annexe II art. 242 nonies A)
- Où
facture.numero_facture- Lignes
- 175 (2,9 % des lignes jugées)
- Coût
- 6 825 € (39,00 € par ligne)
- Exemples
1131, 1194, 1200, 1206, 1254
Méthode
Calcul hors SQL : rangs de chaque série dans l'ordre chronologique, plus longue suite croissante ; un numéro hors de toute plus longue suite est renuméroté, ou en double s'il est déjà porté dans la série.
ERP12:facture.numero_facture
Un numéro métier est unique dans sa table
- Où
commande_client.numero_commande- Lignes
- 105 (2,1 % des lignes jugées)
- Coût
- 4 462 € (42,50 € par ligne)
- Exemples
1016, 1040, 1056, 1145, 1155
Méthode
Calcul hors SQL : rangs de chaque série dans l'ordre chronologique, plus longue suite croissante ; un numéro hors de toute plus longue suite est renuméroté, ou en double s'il est déjà porté dans la série.
ERP10:commande_client.numero_commande
Un total de document est la somme des montants de ses lignes, à la tolérance près
- Où
facture.total_ttc- Lignes
- 748 (15,3 % des lignes jugées)
- Coût
- 29 172 € (39,00 € par ligne)
- Exemples
1007, 1018, 1019, 1032, 1044
Preuve SQL
SELECT d."id"::text, (s.r IS NOT NULL AND abs(d."total_ttc"::numeric - s.r) <= 0.01) FROM "facture" d JOIN (SELECT l."facture_id" AS k, sum(l."montant_ttc"::numeric) AS s, sum(coalesce((l."montant_ht"::numeric + l."montant_tva"::numeric), l."montant_ttc"::numeric)) AS r FROM "ligne_facture" l WHERE l."facture_id" IS NOT NULL GROUP BY 1) s ON s.k = d."id" WHERE d."total_ttc"::numeric IS NOT NULL AND abs(d."total_ttc"::numeric - s.s) > 0.01 ORDER BY 1
ERP04:facture.total_ttc=ligne_facture.montant_ttc
prix_unitaire vraisemblable dans son groupe (article_id > article_id>article.famille_article_id)
- Où
ligne_commande_client.prix_unitaire- Lignes
- 458 (2,2 % des lignes jugées)
- Coût
- 5 038 € (11,00 € par ligne)
- Exemples
10096, 10177, 10181, 10186, 10205
Méthode
Calcul hors SQL : score robuste |ln x − médiane| / (1,4826 × MAD) dans le groupe choisi par le graphe, et bimodalité à rapport 100 ou 1 000.
STAT:ligne_commande_client.prix_unitaire
prix_unitaire n'est pas 100 ou 1 000 fois sa référence (somme de ligne_facture.prix_unitaire)
- Où
ligne_commande_client.prix_unitaire- Lignes
- 13 (1,8 % des lignes jugées)
- Coût
- 143 € (11,00 € par ligne)
- Exemples
13252, 17191, 17247, 17289, 17300
Preuve SQL
SELECT t."id"::text FROM "ligne_commande_client" t JOIN (SELECT c."ligne_commande_client_id"::text AS cle_ref, sum(c."prix_unitaire"::numeric) AS "prix_unitaire" FROM "ligne_facture" c WHERE c."ligne_commande_client_id" IS NOT NULL GROUP BY 1) r ON r.cle_ref = t."id"::text WHERE t."prix_unitaire"::numeric > 0 AND r."prix_unitaire" > 0 AND (abs(t."prix_unitaire"::numeric / r."prix_unitaire" - 100.0) <= 1.0 OR abs(t."prix_unitaire"::numeric / r."prix_unitaire" - 1000.0) <= 10.0) ORDER BY 1
REF:ligne_commande_client.prix_unitaire
prix_unitaire n'est pas 100 ou 1 000 fois sa référence (ligne_commande_fournisseur.prix_unitaire)
- Où
ligne_facture_fournisseur.prix_unitaire- Lignes
- 442 (11,3 % des lignes jugées)
- Coût
- 4 862 € (11,00 € par ligne)
- Exemples
1009, 1022, 103, 1030, 1033
Preuve SQL
SELECT t."id"::text FROM "ligne_facture_fournisseur" t JOIN "ligne_commande_fournisseur" r ON r."id"::text = t."ligne_commande_fournisseur_id"::text WHERE t."prix_unitaire"::numeric > 0 AND r."prix_unitaire"::numeric > 0 AND (abs(t."prix_unitaire"::numeric / r."prix_unitaire"::numeric - 100.0) <= 1.0 OR abs(t."prix_unitaire"::numeric / r."prix_unitaire"::numeric - 1000.0) <= 10.0) ORDER BY 1
REF:ligne_facture_fournisseur.prix_unitaire
prix_unitaire vraisemblable dans son groupe (article_id > article_id>article.famille_article_id)
- Où
ligne_facture.prix_unitaire- Lignes
- 337 (1,7 % des lignes jugées)
- Coût
- 3 707 € (11,00 € par ligne)
- Exemples
10072, 10116, 10161, 10191, 10195
Méthode
Calcul hors SQL : score robuste |ln x − médiane| / (1,4826 × MAD) dans le groupe choisi par le graphe, et bimodalité à rapport 100 ou 1 000.
STAT:ligne_facture.prix_unitaire
montant n'est pas 100 ou 1 000 fois sa référence (somme de affectation_reglement.montant_affecte)
- Où
reglement.montant- Lignes
- 147 (2,2 % des lignes jugées)
- Coût
- 1 029 € (7,00 € par ligne)
- Exemples
1011, 1156, 1917, 1945, 1965
Preuve SQL
SELECT t."id"::text FROM "reglement" t JOIN (SELECT c."reglement_id"::text AS cle_ref, sum(c."montant_affecte"::numeric) AS "montant_affecte" FROM "affectation_reglement" c WHERE c."reglement_id" IS NOT NULL GROUP BY 1) r ON r.cle_ref = t."id"::text WHERE t."montant"::numeric > 0 AND r."montant_affecte" > 0 AND (abs(t."montant"::numeric / r."montant_affecte" - 100.0) <= 1.0 OR abs(t."montant"::numeric / r."montant_affecte" - 1000.0) <= 10.0) ORDER BY 1
REF:reglement.montant
Chaque valeur de article.unite_id existe dans unite.id (lien retrouvé par le graphe de la base)
- Où
article.unite_id- Lignes
- 126 (29,6 % des lignes jugées)
- Coût
- 1 764 € (14,00 € par ligne)
- Exemples
1, 10, 102, 105, 107
Preuve SQL
SELECT a."id"::text FROM "article" a WHERE a."unite_id" IS NOT NULL AND NOT EXISTS (SELECT 1 FROM "unite" b WHERE b."id" = a."unite_id") ORDER BY 1
lien:article.unite_id->unite.id
Un numéro métier est unique dans sa table
- Où
facture_fournisseur.numero_interne- Lignes
- 62 (6,6 % des lignes jugées)
- Coût
- 2 635 € (42,50 € par ligne)
- Exemples
127, 154, 179, 203, 232
Méthode
Calcul hors SQL : rangs de chaque série dans l'ordre chronologique, plus longue suite croissante ; un numéro hors de toute plus longue suite est renuméroté, ou en double s'il est déjà porté dans la série.
ERP10:facture_fournisseur.numero_interne
La numérotation d'une série de documents est continue et chronologique ; un document hors de la suite a été renuméroté et son numéro d'origine manque (obligation de numérotation continue des factures, CGI annexe II art. 242 nonies A)
- Où
facture_fournisseur.numero_interne- Lignes
- 59 (6,3 % des lignes jugées)
- Coût
- 2 301 € (39,00 € par ligne)
- Exemples
180, 199, 229, 34, 346
Méthode
Calcul hors SQL : rangs de chaque série dans l'ordre chronologique, plus longue suite croissante ; un numéro hors de toute plus longue suite est renuméroté, ou en double s'il est déjà porté dans la série.
ERP12:facture_fournisseur.numero_interne
Un numéro métier est unique dans sa table
- Où
article.code_article- Lignes
- 126 (29,6 % des lignes jugées)
- Coût
- 2 205 € (17,50 € par ligne)
- Exemples
105, 109, 112, 133, 135
Preuve SQL
WITH o AS (SELECT t."id"::text AS pk, btrim(t."code_article"::text) AS k, lag(btrim(t."code_article"::text)) OVER w AS avant, lead(btrim(t."code_article"::text)) OVER w AS apres, count(*) OVER (PARTITION BY btrim(t."code_article"::text)) AS n, row_number() OVER (PARTITION BY btrim(t."code_article"::text) ORDER BY t."id") AS r FROM "article" t WHERE (t."code_article" IS NOT NULL AND btrim(t."code_article"::text) <> '') WINDOW w AS (ORDER BY t."id")), h AS (SELECT o.*, NOT (coalesce(o.avant, o.k) <= o.k AND o.k <= coalesce(o.apres, o.k)) AS hors FROM o WHERE o.n > 1), g AS (SELECT h.*, count(*) FILTER (WHERE h.hors) OVER (PARTITION BY h.k) AS nh FROM h) SELECT pk FROM g WHERE (g.nh > 0 AND g.nh < g.n AND g.hors) OR ((g.nh = 0 OR g.nh = g.n) AND g.r > 1) ORDER BY 1
ERP10:article.code_article
transporteur est rempli (dépendance découverte)
- Où
livraison.transporteur- Lignes
- 110 (1,8 % des lignes jugées)
- Coût
- 1 283 € (11,67 € par ligne)
- Exemples
1033, 1097, 1121, 170, 1838
Preuve SQL
SELECT t."id"::text FROM "livraison" t WHERE (t."transporteur" IS NULL OR btrim(t."transporteur"::text) = '') ORDER BY 1
DEC:NV:livraison.transporteur
Une date d'événement n'est pas antérieure à la date de création ou de référence de sa ligne
- Où
commande_client.date_livraison_prevue- Lignes
- 421 (9,0 % des lignes jugées)
- Coût
- 14 454 € (34,33 € par ligne)
- Exemples
100, 104, 1130, 1136, 1144
Preuve SQL
SELECT t."id"::text FROM "commande_client" t WHERE t."date_livraison_prevue"::date < t."date_commande"::date ORDER BY 1
ERP06:commande_client.date_livraison_prevue>=date_commande
Une date d'événement n'est pas antérieure à la date de création ou de référence de sa ligne
- Où
facture.date_echeance- Lignes
- 632 (12,6 % des lignes jugées)
- Coût
- 21 699 € (34,33 € par ligne)
- Exemples
1002, 1009, 1028, 1037, 1038
Preuve SQL
SELECT t."id"::text FROM "facture" t WHERE t."date_echeance"::date < t."date_facture"::date ORDER BY 1
ERP06:facture.date_echeance>=date_facture
Une valeur sentinelle (N/A, 00000, 1900-01-01) tient la place d'une valeur manquante
- Où
facture.date_echeance- Lignes
- 155 (2,8 % des lignes jugées)
- Coût
- 5 683 € (36,67 € par ligne)
- Exemples
1016, 115, 1407, 1445, 1478
Preuve SQL
SELECT t."id"::text FROM "facture" t WHERE t."date_echeance"::date::text = ANY('{… 2 valeurs …}') ORDER BY 1ERP08:facture.date_echeance
Un IBAN a une clé (ISO 7064 mod 97) juste
- Où
tiers_banque.iban- Lignes
- 195 (50,0 % des lignes jugées)
- Coût
- 1 138 € (5,83 € par ligne)
- Exemples
1, 101, 102, 103, 105
Preuve SQL
SELECT t."id"::text FROM "tiers_banque" t WHERE (t."iban" IS NOT NULL AND btrim(t."iban"::text) <> '') AND NOT (upper(regexp_replace(t."iban"::text, '\s+', '', 'g')) ~ '^([A-Z]{2}[0-9]{2}[A-Z0-9]{11,30})$' AND (CASE WHEN upper(regexp_replace(t."iban"::text, '\s+', '', 'g')) ~ '^[A-Z0-9]{5,}$' THEN (SELECT string_agg(CASE WHEN s.c ~ '[A-Z]' THEN (ascii(s.c) - 55)::text ELSE s.c END, '' ORDER BY s.i)::numeric % 97 = 1 FROM (SELECT g.i, substr((substr(upper(regexp_replace(t."iban"::text, '\s+', '', 'g')), 5) || substr(upper(regexp_replace(t."iban"::text, '\s+', '', 'g')), 1, 4)), g.i, 1) AS c FROM generate_series(1, length((substr(upper(regexp_replace(t."iban"::text, '\s+', '', 'g')), 5) || substr(upper(regexp_replace(t."iban"::text, '\s+', '', 'g')), 1, 4)))) AS g(i)) s) ELSE false END)) ORDER BY 1ERP02:tiers_banque.iban
La numérotation d'une série de documents est continue et chronologique ; un document hors de la suite a été renuméroté et son numéro d'origine manque (obligation de numérotation continue des factures, CGI annexe II art. 242 nonies A)
- Où
avoir.numero_avoir- Lignes
- 73 (42,0 % des lignes jugées)
- Coût
- 2 847 € (39,00 € par ligne)
- Exemples
100, 101, 102, 103, 104
Méthode
Calcul hors SQL : rangs de chaque série dans l'ordre chronologique, plus longue suite croissante ; un numéro hors de toute plus longue suite est renuméroté, ou en double s'il est déjà porté dans la série.
ERP12:avoir.numero_avoir
Un numéro métier est unique dans sa table
- Où
avoir.numero_avoir- Lignes
- 38 (21,8 % des lignes jugées)
- Coût
- 1 615 € (42,50 € par ligne)
- Exemples
12, 13, 15, 160, 167
Méthode
Calcul hors SQL : rangs de chaque série dans l'ordre chronologique, plus longue suite croissante ; un numéro hors de toute plus longue suite est renuméroté, ou en double s'il est déjà porté dans la série.
ERP10:avoir.numero_avoir
une ligne de facture a au moins une ligne de ligne_facture qui la vise par facture_id (inclusion inverse découverte)
- Où
facture- Lignes
- 126 (2,1 % des lignes jugées)
- Coût
- 4 620 € (36,67 € par ligne)
- Exemples
1158, 1234, 1400, 1411, 2070
Preuve SQL
SELECT d."id"::text FROM "facture" d WHERE TRUE AND NOT EXISTS (SELECT 1 FROM "ligne_facture" f WHERE f."facture_id"::text = d."id"::text) ORDER BY 1
DEC:EXI:facture<-ligne_facture.facture_id
une ligne de livraison a au moins une ligne de ligne_livraison qui la vise par livraison_id (inclusion inverse découverte)
- Où
livraison- Lignes
- 84 (1,4 % des lignes jugées)
- Coût
- 980 € (11,67 € par ligne)
- Exemples
1342, 1550, 2036, 2179, 266
Preuve SQL
SELECT d."id"::text FROM "livraison" d WHERE TRUE AND NOT EXISTS (SELECT 1 FROM "ligne_livraison" f WHERE f."livraison_id"::text = d."id"::text) ORDER BY 1
DEC:EXI:livraison<-ligne_livraison.livraison_id
une ligne de reception a au moins une ligne de ligne_reception qui la vise par reception_id (inclusion inverse découverte)
- Où
reception- Lignes
- 43 (4,6 % des lignes jugées)
- Coût
- 502 € (11,67 € par ligne)
- Exemples
100, 131, 132, 133, 134
Preuve SQL
SELECT d."id"::text FROM "reception" d WHERE TRUE AND NOT EXISTS (SELECT 1 FROM "ligne_reception" f WHERE f."reception_id"::text = d."id"::text) ORDER BY 1
DEC:EXI:reception<-ligne_reception.reception_id
article_id est le article_id de la ligne de ligne_commande_client visée par ligne_commande_client_id (chemin découvert)
- Où
ligne_livraison.article_id- Lignes
- 17 (0,1 % des lignes jugées)
- Coût
- 238 € (14,00 € par ligne)
- Exemples
16956, 16992, 16993, 17041, 17042
Preuve SQL
SELECT t."id"::text FROM "ligne_livraison" t JOIN "ligne_commande_client" m ON m."id"::text = t."ligne_commande_client_id"::text WHERE t."article_id"::text IS NOT NULL AND m."article_id"::text IS NOT NULL AND NOT (t."article_id"::text = m."article_id"::text) AND m."id"::text NOT IN (SELECT m."id"::text FROM "ligne_livraison" t JOIN "ligne_commande_client" m ON m."id"::text = t."ligne_commande_client_id"::text WHERE t."article_id"::text IS NOT NULL AND m."article_id"::text IS NOT NULL GROUP BY 1 HAVING count(*) FILTER (WHERE NOT (t."article_id"::text = m."article_id"::text)) >= 5 AND 2 * count(*) FILTER (WHERE NOT (t."article_id"::text = m."article_id"::text)) >= count(*) ORDER BY 1) ORDER BY 1
DEC:CHE:ligne_livraison.article_id=ligne_commande_client.article_id@ligne_commande_client_id
unite_id est le unite_id de la ligne de ligne_commande_client visée par ligne_commande_client_id (chemin découvert)
- Où
ligne_facture.unite_id- Lignes
- 10 (0,1 % des lignes jugées)
- Coût
- 180 € (18,00 € par ligne)
- Exemples
13981, 14615, 17794, 1822, 1837
Preuve SQL
SELECT t."id"::text FROM "ligne_facture" t JOIN "ligne_commande_client" m ON m."id"::text = t."ligne_commande_client_id"::text WHERE t."unite_id"::text IS NOT NULL AND m."unite_id"::text IS NOT NULL AND NOT (t."unite_id"::text = m."unite_id"::text) AND m."id"::text NOT IN (SELECT m."id"::text FROM "ligne_facture" t JOIN "ligne_commande_client" m ON m."id"::text = t."ligne_commande_client_id"::text WHERE t."unite_id"::text IS NOT NULL AND m."unite_id"::text IS NOT NULL GROUP BY 1 HAVING count(*) FILTER (WHERE NOT (t."unite_id"::text = m."unite_id"::text)) >= 5 AND 2 * count(*) FILTER (WHERE NOT (t."unite_id"::text = m."unite_id"::text)) >= count(*) ORDER BY 1) ORDER BY 1
DEC:CHE:ligne_facture.unite_id=ligne_commande_client.unite_id@ligne_commande_client_id
Chaque valeur de ligne_commande_client.unite_id existe dans unite.id (lien retrouvé par le graphe de la base)
- Où
ligne_commande_client.unite_id- Lignes
- 56 (0,6 % des lignes jugées)
- Coût
- 1 008 € (18,00 € par ligne)
- Exemples
11123, 11892, 12108, 12590, 12772
Preuve SQL
SELECT a."id"::text FROM "ligne_commande_client" a WHERE a."unite_id" IS NOT NULL AND NOT EXISTS (SELECT 1 FROM "unite" b WHERE b."id" = a."unite_id") ORDER BY 1
lien:ligne_commande_client.unite_id->unite.id
Chaque valeur de ligne_commande_client.article_id existe dans article.id (lien retrouvé par le graphe de la base)
- Où
ligne_commande_client.article_id- Lignes
- 32 (2,0 % des lignes jugées)
- Coût
- 576 € (18,00 € par ligne)
- Exemples
12149, 12338, 14291, 17170, 17218
Preuve SQL
SELECT a."id"::text FROM "ligne_commande_client" a WHERE a."article_id" IS NOT NULL AND NOT EXISTS (SELECT 1 FROM "article" b WHERE b."id" = a."article_id") ORDER BY 1
lien:ligne_commande_client.article_id->article.id
article_id est le article_id de la ligne de ligne_commande_client visée par ligne_commande_client_id (chemin découvert)
- Où
ligne_facture.article_id- Lignes
- 2 (0,0 % des lignes jugées)
- Coût
- 36 € (18,00 € par ligne)
- Exemples
11986, 12175
Preuve SQL
SELECT t."id"::text FROM "ligne_facture" t JOIN "ligne_commande_client" m ON m."id"::text = t."ligne_commande_client_id"::text WHERE t."article_id"::text IS NOT NULL AND m."article_id"::text IS NOT NULL AND NOT (t."article_id"::text = m."article_id"::text) AND m."id"::text NOT IN (SELECT m."id"::text FROM "ligne_facture" t JOIN "ligne_commande_client" m ON m."id"::text = t."ligne_commande_client_id"::text WHERE t."article_id"::text IS NOT NULL AND m."article_id"::text IS NOT NULL GROUP BY 1 HAVING count(*) FILTER (WHERE NOT (t."article_id"::text = m."article_id"::text)) >= 5 AND 2 * count(*) FILTER (WHERE NOT (t."article_id"::text = m."article_id"::text)) >= count(*) ORDER BY 1) ORDER BY 1
DEC:CHE:ligne_facture.article_id=ligne_commande_client.article_id@ligne_commande_client_id
tiers_id est le tiers_id de la ligne de commande_client visée par commande_client_id (chemin découvert)
- Où
facture.tiers_id- Lignes
- 791 (17,3 % des lignes jugées)
- Coût
- 30 849 € (39,00 € par ligne)
- Exemples
1, 10, 1018, 1023, 1032
Preuve SQL
SELECT t."id"::text FROM "facture" t JOIN "commande_client" m ON m."id"::text = t."commande_client_id"::text WHERE t."tiers_id"::text IS NOT NULL AND m."tiers_id"::text IS NOT NULL AND NOT (t."tiers_id"::text = m."tiers_id"::text) AND m."id"::text NOT IN (SELECT m."id"::text FROM "facture" t JOIN "commande_client" m ON m."id"::text = t."commande_client_id"::text WHERE t."tiers_id"::text IS NOT NULL AND m."tiers_id"::text IS NOT NULL GROUP BY 1 HAVING count(*) FILTER (WHERE NOT (t."tiers_id"::text = m."tiers_id"::text)) >= 5 AND 2 * count(*) FILTER (WHERE NOT (t."tiers_id"::text = m."tiers_id"::text)) >= count(*) ORDER BY 1) ORDER BY 1
DEC:CHE:facture.tiers_id=commande_client.tiers_id@commande_client_id
tiers_id est le tiers_id de la ligne de livraison visée par livraison_id (chemin découvert)
- Où
facture.tiers_id- Lignes
- 9 (17,6 % des lignes jugées)
- Coût
- 351 € (39,00 € par ligne)
- Exemples
1840, 2084, 2085, 252, 2537
Preuve SQL
SELECT t."id"::text FROM "facture" t JOIN "livraison" m ON m."id"::text = t."livraison_id"::text WHERE t."tiers_id"::text IS NOT NULL AND m."tiers_id"::text IS NOT NULL AND NOT (t."tiers_id"::text = m."tiers_id"::text) AND m."id"::text NOT IN (SELECT m."id"::text FROM "facture" t JOIN "livraison" m ON m."id"::text = t."livraison_id"::text WHERE t."tiers_id"::text IS NOT NULL AND m."tiers_id"::text IS NOT NULL GROUP BY 1 HAVING count(*) FILTER (WHERE NOT (t."tiers_id"::text = m."tiers_id"::text)) >= 5 AND 2 * count(*) FILTER (WHERE NOT (t."tiers_id"::text = m."tiers_id"::text)) >= count(*) ORDER BY 1) ORDER BY 1
DEC:CHE:facture.tiers_id=livraison.tiers_id@livraison_id
tiers_id d'une ligne de tiers_banque contredit par la plupart des lignes qui la visent (reglement ; chemin découvert, imputé à la mère)
- Où
tiers_banque.tiers_id- Lignes
- 2 (0,5 % des lignes jugées)
- Coût
- 28 € (14,00 € par ligne)
- Exemples
239, 295
Preuve SQL
SELECT m."id"::text FROM "reglement" t JOIN "tiers_banque" m ON m."id"::text = t."tiers_banque_id"::text WHERE t."tiers_id"::text IS NOT NULL AND m."tiers_id"::text IS NOT NULL GROUP BY 1 HAVING count(*) FILTER (WHERE NOT (t."tiers_id"::text = m."tiers_id"::text)) >= 2 AND 2 * count(*) FILTER (WHERE NOT (t."tiers_id"::text = m."tiers_id"::text)) >= count(*) ORDER BY 1
DEC:CHM:tiers_banque.tiers_id
date_echeance est rempli (dépendance découverte)
- Où
facture.date_echeance- Lignes
- 439 (7,2 % des lignes jugées)
- Coût
- 16 097 € (36,67 € par ligne)
- Exemples
1004, 1011, 1012, 1053, 1076
Preuve SQL
SELECT t."id"::text FROM "facture" t WHERE (t."date_echeance" IS NULL OR btrim(t."date_echeance"::text) = '') ORDER BY 1
DEC:NV:facture.date_echeance
date_livraison_prevue est rempli (dépendance découverte)
- Où
commande_client.date_livraison_prevue- Lignes
- 329 (6,6 % des lignes jugées)
- Coût
- 12 063 € (36,67 € par ligne)
- Exemples
1000, 1001, 1002, 1003, 1004
Preuve SQL
SELECT t."id"::text FROM "commande_client" t WHERE (t."date_livraison_prevue" IS NULL OR btrim(t."date_livraison_prevue"::text) = '') ORDER BY 1
DEC:NV:commande_client.date_livraison_prevue
Programme de remédiation
54 action(s), une par règle qui trouve des lignes, en 3 vague(s) ; charge : 1 895 h, montant : 277 326 €. Charge = lignes × minutes de correction du profil pour la dimension ; montant = charge × taux horaire, plus le supplément du rôle de la table. Une ligne visée par deux règles compte dans les deux actions : le total peut dépasser le coût de reprise des lignes distinctes donné plus haut.
| Action | Table | Lignes | Propriétaire | Charge | Montant | Statut |
|---|---|---|---|---|---|---|
| Un numéro métier est unique dans sa table | article | 126 | à désigner | 31,5 h | 2 205 € | À faire |
| Chaque valeur de article.unite_id existe dans unite.id (lien retrouvé par le graphe de la base) | article | 126 | à désigner | 25,2 h | 1 764 € | À faire |
| Ligne identique à une autre sur toutes les colonnes hors clé technique | article | 6 | à désigner | 1,5 h | 105 € | À faire |
| La numérotation d'une série de documents est continue et chronologique ; un document hors de la suite a été renuméroté et son numéro d'origine manque (obligation de numérotation continue des factures, CGI annexe II art. 242 nonies A) | avoir | 73 | à désigner | 14,6 h | 2 847 € | À faire |
| Un numéro métier est unique dans sa table | avoir | 38 | à désigner | 9,5 h | 1 615 € | À faire |
| Un document correctif (avoir) est rattaché à un document, et ne le dépasse pas | avoir | 7 | à désigner | 1,4 h | 273 € | À faire |
| date_livraison_prevue est rempli (dépendance découverte) | commande_client | 329 | à désigner | 54,8 h | 12 063 € | À faire |
| Un numéro métier est unique dans sa table | commande_client | 105 | à désigner | 26,2 h | 4 462 € | À faire |
| tiers_id est le tiers_id de la ligne de commande_client visée par commande_client_id (chemin découvert) | facture | 791 | à désigner | 158,2 h | 30 849 € | À faire |
| Un total de document est la somme des montants de ses lignes, à la tolérance près | facture | 748 | à désigner | 149,6 h | 29 172 € | À faire |
| date_echeance est rempli (dépendance découverte) | facture | 439 | à désigner | 73,2 h | 16 097 € | À faire |
| Un numéro métier est unique dans sa table | facture | 308 | à désigner | 77,0 h | 13 090 € | À faire |
| Chaque valeur de facture.tiers_id existe dans tiers.id (lien retrouvé par le graphe de la base) | facture | 281 | à désigner | 56,2 h | 10 959 € | À faire |
| La numérotation d'une série de documents est continue et chronologique ; un document hors de la suite a été renuméroté et son numéro d'origine manque (obligation de numérotation continue des factures, CGI annexe II art. 242 nonies A) | facture | 175 | à désigner | 35,0 h | 6 825 € | À faire |
| Une valeur sentinelle (N/A, 00000, 1900-01-01) tient la place d'une valeur manquante | facture | 155 | à désigner | 25,8 h | 5 683 € | À faire |
| une ligne de facture a au moins une ligne de ligne_facture qui la vise par facture_id (inclusion inverse découverte) | facture | 126 | à désigner | 21,0 h | 4 620 € | À faire |
| tiers_id est le tiers_id de la ligne de livraison visée par livraison_id (chemin découvert) | facture | 9 | à désigner | 1,8 h | 351 € | À faire |
| Une valeur sentinelle (N/A, 00000, 1900-01-01) tient la place d'une valeur manquante | facture_fournisseur | 102 | à désigner | 17,0 h | 3 740 € | À faire |
| Un numéro métier est unique dans sa table | facture_fournisseur | 62 | à désigner | 15,5 h | 2 635 € | À faire |
| La numérotation d'une série de documents est continue et chronologique ; un document hors de la suite a été renuméroté et son numéro d'origine manque (obligation de numérotation continue des factures, CGI annexe II art. 242 nonies A) | facture_fournisseur | 59 | à désigner | 11,8 h | 2 301 € | À faire |
| article_id d'une ligne de ligne_commande_client contredit par la plupart des lignes qui la visent (ligne_facture, ligne_livraison ; chemin découvert, imputé à la mère) | ligne_commande_client | 389 | à désigner | 77,8 h | 7 002 € | À faire |
| unite_id est le unite_id de la ligne de article visée par article_id (chemin découvert) | ligne_commande_client | 71 | à désigner | 14,2 h | 1 278 € | À faire |
| Chaque valeur de ligne_commande_client.unite_id existe dans unite.id (lien retrouvé par le graphe de la base) | ligne_commande_client | 56 | à désigner | 11,2 h | 1 008 € | À faire |
| Chaque valeur de ligne_commande_client.article_id existe dans article.id (lien retrouvé par le graphe de la base) | ligne_commande_client | 32 | à désigner | 6,4 h | 576 € | À faire |
| Chaque valeur de ligne_facture.ligne_commande_client_id existe dans ligne_commande_client.id (lien retrouvé par le graphe de la base) | ligne_facture | 140 | à désigner | 28,0 h | 2 520 € | À faire |
| unite_id est le unite_id de la ligne de ligne_commande_client visée par ligne_commande_client_id (chemin découvert) | ligne_facture | 10 | à désigner | 2,0 h | 180 € | À faire |
| article_id est le article_id de la ligne de ligne_commande_client visée par ligne_commande_client_id (chemin découvert) | ligne_facture | 2 | à désigner | 0,4 h | 36 € | À faire |
| article_id est le article_id de la ligne de ligne_commande_client visée par ligne_commande_client_id (chemin découvert) | ligne_livraison | 17 | à désigner | 3,4 h | 238 € | À faire |
| transporteur est rempli (dépendance découverte) | livraison | 110 | à désigner | 18,3 h | 1 283 € | À faire |
| une ligne de livraison a au moins une ligne de ligne_livraison qui la vise par livraison_id (inclusion inverse découverte) | livraison | 84 | à désigner | 14,0 h | 980 € | À faire |
| une ligne de reception a au moins une ligne de ligne_reception qui la vise par reception_id (inclusion inverse découverte) | reception | 43 | à désigner | 7,2 h | 502 € | À faire |
| Une valeur sentinelle (N/A, 00000, 1900-01-01) tient la place d'une valeur manquante | tiers | 130 | à désigner | 21,7 h | 1 517 € | À faire |
| Un numéro métier est unique dans sa table | tiers | 126 | à désigner | 31,5 h | 2 205 € | À faire |
| Fiche saisie deux fois sous deux formes (doublon flou) | tiers | 94 | à désigner | 23,5 h | 1 645 € | À faire |
| Une valeur sentinelle (N/A, 00000, 1900-01-01) tient la place d'une valeur manquante | tiers_adresse | 172 | à désigner | 28,7 h | 2 007 € | À faire |
| Ligne identique à une autre sur toutes les colonnes hors clé technique | tiers_adresse | 68 | à désigner | 17,0 h | 1 190 € | À faire |
| tiers_id d'une ligne de tiers_banque contredit par la plupart des lignes qui la visent (reglement ; chemin découvert, imputé à la mère) | tiers_banque | 2 | à désigner | 0,4 h | 28 € | À faire |
| Une valeur sentinelle (N/A, 00000, 1900-01-01) tient la place d'une valeur manquante | tiers_contact | 166 | à désigner | 27,7 h | 1 937 € | À faire |
| Une valeur sentinelle (N/A, 00000, 1900-01-01) tient la place d'une valeur manquante | tiers_contact | 109 | à désigner | 18,2 h | 1 272 € | À faire |
| Ligne identique à une autre sur toutes les colonnes hors clé technique | tiers_contact | 84 | à désigner | 21,0 h | 1 470 € | À faire |
| Action | Table | Lignes | Propriétaire | Charge | Montant | Statut |
|---|---|---|---|---|---|---|
| Une date d'événement n'est pas antérieure à la date de création ou de référence de sa ligne | commande_client | 421 | à désigner | 56,1 h | 14 454 € | À faire |
| Une date d'événement n'est pas antérieure à la date de création ou de référence de sa ligne | facture | 632 | à désigner | 84,3 h | 21 699 € | À faire |
| Une date d'événement n'est pas antérieure à la date de création ou de référence de sa ligne | facture_fournisseur | 210 | à désigner | 28,0 h | 7 210 € | À faire |
| Le montant d'une ligne vaut quantité × prix (× (1 − remise)), sa taxe vaut montant × taux, et ses montants s'additionnent (TTC = HT + TVA) | ligne_commande_client | 1 684 | à désigner | 224,5 h | 22 453 € | À faire |
| Le montant d'une ligne vaut quantité × prix (× (1 − remise)), sa taxe vaut montant × taux, et ses montants s'additionnent (TTC = HT + TVA) | ligne_commande_fournisseur | 198 | à désigner | 26,4 h | 2 640 € | À faire |
| Le montant d'une ligne vaut quantité × prix (× (1 − remise)), sa taxe vaut montant × taux, et ses montants s'additionnent (TTC = HT + TVA) | ligne_facture | 650 | à désigner | 86,7 h | 8 667 € | À faire |
| Un identifiant d'entreprise (SIREN, SIRET) a une clé de Luhn juste, et le SIRET commence par le SIREN de sa ligne | tiers | 238 | à désigner | 19,8 h | 1 388 € | À faire |
| Le code postal d'une adresse française est celui de sa commune (référentiel des communes) | tiers_adresse | 406 | à désigner | 33,8 h | 2 368 € | À faire |
| Un IBAN a une clé (ISO 7064 mod 97) juste | tiers_banque | 195 | à désigner | 16,2 h | 1 138 € | À faire |
| Action | Table | Lignes | Propriétaire | Charge | Montant | Statut |
|---|---|---|---|---|---|---|
| prix_unitaire vraisemblable dans son groupe (article_id > article_id>article.famille_article_id) | ligne_commande_client | 458 | à désigner | 45,8 h | 5 038 € | À faire |
| prix_unitaire n'est pas 100 ou 1 000 fois sa référence (somme de ligne_facture.prix_unitaire) | ligne_commande_client | 13 | à désigner | 1,3 h | 143 € | À faire |
| prix_unitaire vraisemblable dans son groupe (article_id > article_id>article.famille_article_id) | ligne_facture | 337 | à désigner | 33,7 h | 3 707 € | À faire |
| prix_unitaire n'est pas 100 ou 1 000 fois sa référence (ligne_commande_fournisseur.prix_unitaire) | ligne_facture_fournisseur | 442 | à désigner | 44,2 h | 4 862 € | À faire |
| montant n'est pas 100 ou 1 000 fois sa référence (somme de affectation_reglement.montant_affecte) | reglement | 147 | à désigner | 14,7 h | 1 029 € | À faire |
3. Ce qu'on n'a pas vu
L'audit a regardé 222 colonnes sur 317 avec au moins une règle. Il ne chiffre pas encore les erreurs qui restent dans ce qu'il a regardé : ce chiffre demande un échantillon de constats vérifiés avec vous, ou plusieurs contrôles qui se recoupent. Les colonnes sans aucune règle et les règles écartées sont détaillées ci-dessous.
Règles écartées
- 23 règle(s) rejetée(s) par le filtre (1 par le test binomial de solidité, 22 par le test de support), jamais montrées ;
- 2 règle(s) sous le seuil d'utilité (2 constat(s) non montré(s)) ;
- 11 règle(s) à confirmer (montrées, en zone grise du juge) ;
- 13 règle(s) équivalente(s) à une autre sur cette base (mêmes lignes), fusionnées ;
- 223 paire(s) de fiches peut-être en double, laissées en zone grise.
Le juge
Chaque élément est jugé deux fois, dans deux ordres ; deux avis différents laissent l'élément en zone grise. Le juge ne voit aucune ligne : des noms, des types, des comptes, au plus cinq valeurs d'une colonne codée.
- liens départagés par le nom ou ambigus : 33 jugé(e)s, 33 avis concordants ;
- paires en zone grise : 17 jugé(e)s, 17 avis concordants ;
- règles à confirmer : 45 jugé(e)s, 43 avis concordants ;
- tables : 34 jugé(e)s, 33 avis concordants ;
- effets : 1 règle(s) écartée(s), 40 confirmée(s), 17 doublon(s) confirmé(s), 0 lien(s) changé(s) de table mère, 0 retiré(s) ;
- coût des réponses du modèle : 0.79 $ (288 appels).
Colonnes non jugées
42 colonne(s) numérique(s) dont la dispersion n'est expliquée par aucun groupe
affectation_reglement.montant_affecte: aucun groupe ne réduit assez la dispersionarticle.prix_achat: aucun groupe ne réduit assez la dispersionarticle.prix_vente: aucun groupe ne réduit assez la dispersionarticle.poids_kg: aucun groupe ne réduit assez la dispersionfacture.montant_regle: aucun groupe ne réduit assez la dispersionfacture_fournisseur.total_ht: aucun groupe ne réduit assez la dispersionfacture_fournisseur.total_tva: aucun groupe ne réduit assez la dispersionfacture_fournisseur.total_ttc: aucun groupe ne réduit assez la dispersionfacture_fournisseur.montant_regle: aucun groupe ne réduit assez la dispersionligne_avoir.quantite: aucun groupe ne réduit assez la dispersionligne_avoir.prix_unitaire: aucun groupe ne réduit assez la dispersionligne_avoir.taux_tva: aucun groupe ne réduit assez la dispersionligne_avoir.montant_ht: aucun groupe ne réduit assez la dispersionligne_commande_client.quantite: aucun groupe ne réduit assez la dispersionligne_commande_client.taux_tva: aucun groupe ne réduit assez la dispersionligne_commande_client.quantite_livree: aucun groupe ne réduit assez la dispersionligne_commande_fournisseur.quantite: aucun groupe ne réduit assez la dispersionligne_commande_fournisseur.prix_unitaire: aucun groupe ne réduit assez la dispersionligne_commande_fournisseur.taux_tva: aucun groupe ne réduit assez la dispersionligne_commande_fournisseur.quantite_recue: aucun groupe ne réduit assez la dispersionligne_ecriture.debit: aucun groupe ne réduit assez la dispersionligne_ecriture.credit: aucun groupe ne réduit assez la dispersionligne_facture.quantite: aucun groupe ne réduit assez la dispersionligne_facture.remise_pct: aucun groupe ne réduit assez la dispersionligne_facture.taux_tva: aucun groupe ne réduit assez la dispersionligne_facture_fournisseur.quantite: aucun groupe ne réduit assez la dispersionligne_facture_fournisseur.prix_unitaire: aucun groupe ne réduit assez la dispersionligne_facture_fournisseur.taux_tva: aucun groupe ne réduit assez la dispersionligne_livraison.quantite: aucun groupe ne réduit assez la dispersionligne_reception.quantite: aucun groupe ne réduit assez la dispersionmouvement_stock.quantite: aucun groupe ne réduit assez la dispersionref_commune_cp.departement: aucun groupe dans le graphereglement.montant: aucun groupe ne réduit assez la dispersionstock.quantite: aucun groupe ne réduit assez la dispersionstock.quantite_reservee: aucun groupe ne réduit assez la dispersiontarif.prix_unitaire: aucun groupe ne réduit assez la dispersiontarif_client.remise_pct: aucun groupe ne réduit assez la dispersiontiers.siren: aucun groupe ne réduit assez la dispersiontiers.siret: aucun groupe ne réduit assez la dispersiontiers.encours_autorise: aucun groupe ne réduit assez la dispersiontiers_adresse.code_postal: aucun groupe ne réduit assez la dispersiontiers_adresse.code_insee: aucun groupe ne réduit assez la dispersion
95 colonne(s) sans aucune règle exécutée, dans 30 table(s)
ligne_ecriture: 6tiers: 6facture_fournisseur: 5famille_article: 5tiers_contact: 5article: 4commande_client: 4commande_fournisseur: 4cours_devise: 4depot: 4reglement: 4tiers_adresse: 4compte_general: 3facture: 3journal: 3ligne_avoir: 3livraison: 3mouvement_stock: 3reception: 3unite: 3avoir: 2ecriture: 2ligne_commande_client: 2ligne_facture: 2ligne_facture_fournisseur: 2stock: 2ligne_commande_fournisseur: 1tarif: 1tarif_client: 1tiers_banque: 1
Paramètres
Filtre : une règle est sûre si la borne haute de Wilson de son taux de violation est au plus ε = 0,05 (risque α = 0,05) ; support minimal 30 lignes ; utilité minimale 1,0. Fusion : Dawid-Skene, sensibilité a priori 0,9, force de l'a priori 1,0, couverture minimale des estimateurs 0,5.
4. Questions pour vous
Règles qu'un expert de la reprise exigerait peut-être, mais que les données ne confirment pas seules : elles ne sont pas comptées comme constats. Une réponse « oui » en fait une règle de l'audit suivant ; les lignes concernées sont prêtes.
- La colonne tiers_adresse.code_postal doit-elle toujours être remplie (pour une valeur de tiers_adresse.pays) ? Aujourd'hui, 354 ligne(s) sur 1 466 ne la respectent pas (24,1 %).
- La colonne reglement.tiers_banque_id doit-elle toujours être remplie (pour une valeur de reglement.mode) ? Aujourd'hui, 344 ligne(s) sur 4 107 ne la respectent pas (8,4 %).
- La colonne tiers_contact.telephone doit-elle toujours être remplie (pour une valeur de tiers_contact.est_principal) ? Aujourd'hui, 81 ligne(s) sur 537 ne la respectent pas (15,1 %).
- La colonne article.poids_kg doit-elle toujours être remplie (pour une valeur de article.statut) ? Aujourd'hui, 54 ligne(s) sur 370 ne la respectent pas (14,6 %).
- La colonne reglement.tiers_banque_id doit-elle toujours être remplie (pour une valeur de reglement.mode) ? Aujourd'hui, 16 ligne(s) sur 203 ne la respectent pas (7,9 %).
- La colonne facture_fournisseur.date_echeance doit-elle toujours être remplie (pour une valeur de facture_fournisseur.statut) ? Aujourd'hui, 4 ligne(s) sur 30 ne la respectent pas (13,3 %).