Blog de développement

Is_Chorus

Dernière Modification le :
2000-01-01
image

Réutilisation de Chorus Pro, maintenant sur GITHUB !

Is_Chorus, réutilisation de la base Chorus Pro est à disposition de tous sur le répertoire github. Télécharger →

Chorus Pro est une plateforme de l'État français, servant à la réception et au traitement des factures pour toute commande émanant d'un organisme d'État ou affilié. En 2020, 54,6 millions de factures y ont été traitées. Is_Chorus, en OpenSource, simplifie la question préalable: cette commande émane-t-elle d'un organisme inscrit à Chorus Pro ? Il permet à tous les utilisateurs d'y répondre tout en étant à jour . Il est optimisé pour une faible consommation de ressources techniques et de mémoire.

Allez voir l'annuaire de Chorus Pro. Le référentiel original, de grande taille, est efficacement condensé par Is_Chorus. L'annuaire Chorus Pro est mis à jour une fois par semaine, Is_Chorus est mis à jour dans l'heure qui suit.

Les alternatives à Is_Chorus:

Alternativement à l'utilisation d'un référentiel stock, on peut interroger de la page portail ou l'API de Chorus. Cette dernière n'est accessible qu'au prix d'un processus long et épuisant, sans commune mesure avec l'objectif poursuivi (à la différence de SIRENE)

Is_Chorus a l"avantage de ne pas dépendre de la disponibilité ponctuelle d'internet, de la vitesse de réponse et d'analyse. On le télécharge et basta!

Is_Chorus 3 formats de données Raw, Short, SSC

Is_Chorus est proposé selon 3 formats: Raw_ID, Short_ID, SSC_ID:

  • Raw_ID: C'est le SIRET sans les clés informatiques. Taille fixe: 12 caractères. Env. 2 Mb
  • Short_ID: le RAW dont on retire un max de 0...Taille variable. Env. 1,2 Mb
  • SSC_ID: segmenté, dégraissé, compressé: idéal pour la recherche en mode texte. Env. 400 k.

Mise à Jour différentielle: Current, BoY, YtD_ADD_DEL

Trois ZIP sont fournis:

  • Current: C'est l'image à l'instant t de Chorus Pro: on télécharge et basta
  • BoY: le Begining of Year est un point de départ pour differentiel: on télécharge en début d'année et on met à jour régulièrement
  • YtD_ADD_DEL: la mise à jour proprement dite. On ajoute et efface à sa guise. Petit, idéal pour SQL et mode TEXTE.

Is_Chorus 3 formats de fichiers: CSV, TXT et ZIP

Trois formats de fichiers sont fournis: tous sont formellement en UTF-8. Comme il ne s'agit que de chiffres (ou de lettres ANSI), c'est compatible Latin-1, Windows-1252, tous les ANSI, ASCII, ANSI...

  • CSV: la fin de ligne est de type Linux (LF) donc largement compatible y compris avec les outils Windows/DOS (CR + LF)
  • TXT: avec le format SSC, chaque identifiant se termine nécessairement par un chiffre, ce qui rend inutile la fin de ligne (LF)
  • ZIP: Un dossier peut contenir 500 segments. On encapsule avec un ZIP classique, Windows pour faciliter le téléchargement.

Min_Max : plage de validité

Dans chaque segment (code greffe) le SIREN (premiere partie du SIRET) est un registre incrémental, dans l'ordre de 'naissance': un chiffre 'bas' = entité 'ancienne'. Pour chaque segment, Mini et Maxi définissent une plage, hors de laquelle un SIREN (par extension SIRET) n'est pas dans Chorus. C'est un préfiltre, optionnel, très efficace.
Is_Chorus le propose sous 2 formes: un fichier unique .CSV: RAW ou un dossier segmenté : Segmented, déclinées sous 3 versions: Current, Beg. of Year, Update.

Les données sont le SIREN, sans clé de contrôle, soit donc les 8 premiers chiffres d'un SIRET valide.

Les outils

Immporter automatiquement un fichier .CSV dans n'importe quelle base de données avec des outils gratuits est facile. Pour MS-Access (DoCmd.TransferSpreadSheet Method ?) ou MS-SQL, j'utilise BCP. Des outils gratuits, en OpenSource, tels que CSVKIT, CSVTK, QSV permettent de faire directement la recherche GREP dans .CSV

En mode Texte, n'importe quel outil, y compris natif dans Windows (fc en ligne de commande, InStr en VBS/VBA/VB, FART.exe) conviendra. FART.exe est réputé le plus rapide... Comme les fichiers sont très petits, la vitesse n'est probablement pas un enjeu majeur.

Interrogation selon SIREN, TVA, RCS et SIRET

Dans Chorus, l'identifiant est le SIRET qui inclut le SIREN (égal au RCS). Le SIREN peut aussi être déduit du Numéro de TVA Intercommunautaire, en retirant FR et les 2 premiers chiffres. Même en mode comprimé (SSC), la recherche reste possible selon SIREN (donc RCS, TVA...) et SIRET. C'est utile si on ne dispose que du SIREN et qu'on veut vérifier que le client est ou non de Chorus.

Is_Chorus RAW (brut)

Dans Chorus Pro, l'identifiant est le SIRET de l'entreprise, composé de 14 chiffres. Il nous suffit donc d'extraire la colonne 'Identifiant' de la première feuille du tableau Excel, téléchargeable depuis le portail Chorus Pro.

Le SIRET est une suite de 14 chiffres et non pas un nombre. Or, dans le fichier Excel original, il est traité comme un nombre ! Quand le SIRET commence par zéro (rare, mais légitime) ce premier zéro est alors tronqué alors que le SIRET est valide: l'entrée dans chorus Pro est invalide ! Heureusement cela ne concerne que deux ou trois cas que nous aurons pris soin de corriger.

image

Dans le SIRET français, le chiffre en position numéro 9 et le chiffre en position numéro 14 sont des clés de contrôle informatique. Ainsi, la première chose à faire avec un SIRET à tester est de vérifier la validité algorithmique. Normalement, les identifiants dans Chorus sont aussi valides, ces deux clés deviennent inutiles. L'identifiant court sera le SIRET amputé des 9e et 14e chiffres.

Bizarement, dans Chorus PRO, il existe des SIRET algorithmiquement non conformes ainsi que des SIRET illicites, absents de la base légale SIRENE. On les exclut et on les signale au gestionnaire de Chorus PRO: La liste des SIRET invalides est publiée sur GITHUB.

Cet identifiant est Is_Chorus_RAW. On peut l'entrer dans une base de données et l'interroger. La performance sera alors celle de la base de données et de l'ordinateur.

Amaigrissement du NIC: le Short_ID

On peut réduire davantage: le 10e chiffre d'un SIRET est très majoritairement 0, de même que le 11e ! Les SIRET dont le 10e chiffre ou le 11e chiffre n'est pas zéro sont très rares.
On va donc supprimer les 10e, 11e et 12e chiffres du SIRET, s'ils sont nuls. Autrement dit, on transforme le numéro d'ordre NIC en nombre.

On appelle Short_ID l'identifiant (SIRET) dont on aura retiré le 9e 10e(*) 11e(*) 12e(*) et 14e chiffre. (*) = sous condition de nullité
Faire davantage est tentant mais empécherait d'interroger avec le SIREN (9 chiffres).

Is_Chorus_SHORT_ID pèse 1 Mo, et, compressé, ne pèse que 410 Ko !

Bien entendu, il faut raccourcir l'identifiant à rechercher dans la base de la même façon. Il y a une donc une phase de préparation à la recherche.

Is_Chorus SEGMENTED (segmenté)

Contrairement aux apparences, le SIRET n'est pas un chiffre aléatoire: ce sont des données de registre, incrémentales et segmentées par greffe de tribunal, tout comme les codes postaux le sont par département. Ainsi on peut segmenter la base de données Is_Chorus en autant de code 'greffe'. La règle de segmentation par code greffe est administrative, pas heuristique. L'avantage sera une réduction drastique de la taille de la mémoire nécessaire.

Cette segmentation est possible par la construction même du SIREN, qui est identique au numéro de RCS, registre tenu par le greffe du tribunal, lequel imprime son code à 3 chiffres au tout début. Ainsi donc on peut segmenter de façon formelle inintelligente le SIRET de façon à constituer autant de petites bases qu'il existe de codes 'greffe'. Sur trois chiffres, cela fait 1000 codes 'greffe'. Le nombre de codes greffes dans Chorus n'est que de 500.

On constate qu'un seul code greffe (le numéro 200) concentre à lui tout seul 10 % de tous les SIRET concernés, donc on peut sur-segmenter le code 200 pour réduire la taille de segment. On crée donc des segments 2000, 2001... Pour constater que le segment 2000 est très gros, donc on recommence: On crée donc des segments 20000, 20001...

Is_Chorus Format SSC (segmenté, simplifié, compressé)

Une fois la segmentation faite, on identifie que le reste du SIREN est un numéro d'ordre précédé de 0 de remplissage pour obtenir une longueur fixe. Il en est de même pour le NIC.

Le numéro d'ordre N_SIREN et le NIC sont séparés, transformés respectivement en un Nombre. Le Nb_NIC est laissé intact.

Le numéro d'ordre N_SIREN est transformé en un nombre Nb_SIREN. Le processus est réversible car la longueur que doit avoir N_SIREN est connue.

On encode Nb_SIREN en un ASCII primaire, sur 1 byte, donc, selon une table qui exclut les chiffres, les caractères non-imprimables et ceux réservés à CSV.

On s'inspire du codage en base 85 Lire →. Sont exclus sont exclus " ' , et les chiffres. Lire →


Dim Ar_81(80)
Ar_81(0) = "A": Ar_81(1) = "B": Ar_81(2) = "C": Ar_81(3) = "D": Ar_81(4) = "E": Ar_81(5) = "F": Ar_81(6) = "G": Ar_81(7) = "H": Ar_81(8) = "I": Ar_81(9) = "J"
Ar_81(10) = "K": Ar_81(11) = "L": Ar_81(12) = "M": Ar_81(13) = "N": Ar_81(14) = "O": Ar_81(15) = "P": Ar_81(16) = "Q": Ar_81(17) = "R": Ar_81(18) = "S": Ar_81(19) = "T"
Ar_81(20) = "U": Ar_81(21) = "V": Ar_81(22) = "W": Ar_81(23) = "X": Ar_81(24) = "Y": Ar_81(25) = "Z": Ar_81(26) = "a": Ar_81(27) = "b": Ar_81(28) = "c": Ar_81(29) = "d"
Ar_81(30) = "e": Ar_81(31) = "f": Ar_81(32) = "g": Ar_81(33) = "h": Ar_81(34) = "i": Ar_81(35) = "j": Ar_81(36) = "k": Ar_81(37) = "l": Ar_81(38) = "m": Ar_81(39) = "n"
Ar_81(40) = "o": Ar_81(41) = "p": Ar_81(42) = "q": Ar_81(43) = "r": Ar_81(44) = "s": Ar_81(45) = "t": Ar_81(46) = "u": Ar_81(47) = "v": Ar_81(48) = "w": Ar_81(49) = "x"
Ar_81(50) = "y": Ar_81(51) = "z": Ar_81(52) = "!": Ar_81(53) = "#": Ar_81(54) = "$": Ar_81(55) = "%": Ar_81(56) = "]": Ar_81(57) = "(": Ar_81(58) = ")": Ar_81(59) = "*"
Ar_81(60) = "+": Ar_81(61) = "-": Ar_81(62) = ";": Ar_81(63) = "<": Ar_81(64) = "=": Ar_81(65) = ">": Ar_81(66) = "?": Ar_81(67) = "@": Ar_81(68) = "^": Ar_81(69) = "_"
Ar_81(70) = "`": Ar_81(71) = "{": Ar_81(72) = "|": Ar_81(73) = "}": Ar_81(74) = "~": Ar_81(75) = "[": Ar_81(76) = "&": Ar_81(77) = ".": Ar_81(78) = "/": Ar_81(79) = ":"
Ar_81(80) = "\"

Maintenance YTD

Chorus ne publie qu'une mise à jour par semaine. Le jour est variable...
Une mise à jour ne veut pas nécessairement dire que la liste des participants à Chorus ait changé. Ainsi on peut avoir des semaines sans que Is_Chorus ne constate la moindre modification pertinente des identifiants concernés.

Si on dispose d'une base de données, on constitue une table une première fois puis on ajuste à la marge avec notre YTD (Year to date), par exemple avec un driver/recordset ou une instruction SQL.

Sans base de données, en mode texte, on pourra aussi venir corriger le dossier des fichiers texte par une simple modification marginale par copier/coller automatisable. La modification marginale est proposée à partir de la dernière base chorus connue de l'année précédente ce qui a peu de chose près revient à dire que le point de départ est le 1er Janvier de l'année en cours. En pratique il suffit donc de télécharger Is_Chorus en mode RAW ou en Segmented puis de le mettre à jour régulièrement. Une fois l'an (par exmple au premier de l'an) on fait une remise à zéro. Outre les deux zip de base de Is_Chorus, on propose donc deux zip de simple mise à jour dite YTD (Year to date)

MERGE INTO TargetTable AS target
USING SourceTable AS source
ON target.PrimaryKeyColumn = source.PrimaryKeyColumn
WHEN MATCHED THEN
    UPDATE SET
        target.Column1 = source.Column1,
        target.Column2 = source.Column2,
        -- ajoutez toutes les colonnes que vous voulez mettre à jour
WHEN NOT MATCHED BY TARGET THEN
    INSERT (PrimaryKeyColumn, Column1, Column2, ...)
    VALUES (source.PrimaryKeyColumn, source.Column1, source.Column2, ...);

Racine et tige