From 419897dc2727bdca70f1ce2df0e11dfe9d5d77d0 Mon Sep 17 00:00:00 2001 From: jfontaine35 <76435797+jfontaine35@users.noreply.github.com> Date: Thu, 11 Jan 2024 14:18:16 +0100 Subject: [PATCH] Version primaire --- Accrochage.py | 160 ++++++ Dico.csv | 9 + Dico.ods | Bin 0 -> 27735 bytes Dico2.csv | 9 + Fichier XML v2.0.0.xml | 190 +++++++ Fichier XSD v2.0.0.xsd | 489 +++++++++++++++++ GUI-Accrochage.py | 42 ++ GUI-convert_csv-xml.py | 52 ++ convert_csv-xml.py | 159 ++++++ example.xml | 190 +++++++ file.xml | 142 +++++ package-lock.json | 1130 ++++++++++++++++++++++++++++++++++++++++ package.json | 8 + setup.bat | 40 ++ validation.py | 34 ++ validation.xsd | 489 +++++++++++++++++ xml.csv | 5 + 17 files changed, 3148 insertions(+) create mode 100644 Accrochage.py create mode 100644 Dico.csv create mode 100644 Dico.ods create mode 100644 Dico2.csv create mode 100644 Fichier XML v2.0.0.xml create mode 100644 Fichier XSD v2.0.0.xsd create mode 100644 GUI-Accrochage.py create mode 100644 GUI-convert_csv-xml.py create mode 100644 convert_csv-xml.py create mode 100644 example.xml create mode 100644 file.xml create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 setup.bat create mode 100644 validation.py create mode 100644 validation.xsd create mode 100644 xml.csv diff --git a/Accrochage.py b/Accrochage.py new file mode 100644 index 0000000..af7427b --- /dev/null +++ b/Accrochage.py @@ -0,0 +1,160 @@ +import xml.etree.ElementTree as ET +import csv +import random +import logging +import datetime +import subprocess +import pytz +import os + +# Emplacement du fichier CSV et XML +csv_file = "Dico2.csv" +xml_file = "file.xml" +tz_paris = pytz.timezone('Europe/Paris') + +#Efface la console +def clear_console(): + os.system('cls' if os.name == 'nt' else 'clear') +clear_console() + +# Configuration du logging +logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s') + +def indent(elem, level=0): + """ Ajoute des indentations aux éléments pour une meilleure lisibilité du fichier XML. """ + i = "\n" + level * " " + if len(elem): + if not elem.text or not elem.text.strip(): + elem.text = i + " " + if not elem.tail or not elem.tail.strip(): + elem.tail = i + for elem in elem: + indent(elem, level + 1) + if not elem.tail or not elem.tail.strip(): + elem.tail = i + else: + if level and (not elem.tail or not elem.tail.strip()): + elem.tail = i + + +# Fonction pour lire les données CSV et générer le fichier XML +def create_xml_from_csv(csv_filepath, xml_filepath): + logging.info("Ouverture du CSV...") + # Ouvrir le fichier CSV pour la lecture + with open(csv_filepath, newline='', encoding='utf-8') as csvfile: + reader = csv.reader(csvfile) + Allrows = list(reader) + + # Vérification de la présence des données nécessaires + if len(Allrows) < 5: + logging.error("Les données CSV requises sont manquantes.") + exit() + + headers = Allrows[4][2:] # Sauter les deux premiers en-têtes + logging.info("Création de l'arborescence du fichier XML...") + + # Créer l'élément racine avec l'espace de noms 'cpf' + root = ET.Element("cpf:flux") + root.set("xmlns:cpf", "urn:cdc:cpf:pc5:schema:1.0.0") + root.set("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance") + + #Reglage du fuseau horaire + now = datetime.datetime.now(tz_paris) + value = now.strftime("%Y-%m-%dT%H:%M:%S+01:00") + + ET.SubElement(root, "cpf:idFlux").text = headers[0] + #str(random.randint(1000000000, 99999999999)) + ET.SubElement(root, "cpf:horodatage").text = value + + # Création et ajout de l'élément emetteur + emetteur = ET.SubElement(root, "cpf:emetteur") + logging.info("Emmetteur du fchier ...") + + # Création de la structure des certificateurs + idClient = str(random.randint(10000000, 99999999)) if Allrows[5][2] == '' else Allrows[5][2] + ET.SubElement(emetteur, "cpf:idClient").text = idClient + certificateurs = ET.SubElement(emetteur, "cpf:certificateurs") + certificateur = ET.SubElement(certificateurs, "cpf:certificateur") + logging.info(f"Certificateur {idClient}...") + + # Traitement pour NumClient pour le certificateur + idClient2 = str(random.randint(10000000, 99999999)) if Allrows[5][3] == '' else Allrows[5][3] + ET.SubElement(certificateur, "cpf:idClient").text = idClient2 + + # Traitement pour NumContrat pour le certificateur + idContrat = str(random.randint(10000000, 99999999)) if Allrows[5][4] == '' else Allrows[5][4] + ET.SubElement(certificateur, "cpf:idContrat").text = idContrat + + # Création de la structure des certifications + certifications = ET.SubElement(certificateur, "cpf:certifications") + certification = ET.SubElement(certifications, "cpf:certification") + + ET.SubElement(certification, "cpf:type").text = headers[5] + ET.SubElement(certification, "cpf:code").text = headers[6] + + # Ajout d'un seul passage de certification + passage_certifications = ET.SubElement(certification, "cpf:passageCertifications") + + # Itérer sur chaque ligne du fichier CSV + for row in Allrows[5:]: + # Sauter les lignes vides + if not row[0].strip(): + continue + + #Ajout des certifications + logging.info(f"Ajout des certifications : {row[7]}") + passage_certification = ET.SubElement(passage_certifications, "cpf:passageCertification") + ET.SubElement(passage_certification, "cpf:idTechnique").text = row[7] + ET.SubElement(passage_certification, "cpf:obtentionCertification").text = row[8] + ET.SubElement(passage_certification, "cpf:donneeCertifiee").text = row[9] + ET.SubElement(passage_certification, "cpf:dateDebutValidite").text = row[10] + # Vérification si la date de fin de validité est 'nil;' + if row[11].strip().lower() == 'nil': + ET.SubElement(passage_certification, "cpf:dateFinValidite", {"xsi:nil": "true"}) + else: + ET.SubElement(passage_certification, "cpf:dateFinValidite").text = row[11] + ET.SubElement(passage_certification, "cpf:presenceNiveauLangueEuro").text = row[12] + ET.SubElement(passage_certification, "cpf:presenceNiveauNumeriqueEuro").text = row[13] + if row[14].strip().lower() == 'nil': + ET.SubElement(passage_certification, "cpf:scoring", {"xsi:nil": "true"}) + else: + ET.SubElement(passage_certification, "cpf:scoring").text = row[14] + if row[15].strip().lower() == 'nil': + ET.SubElement(passage_certification, "cpf:mentionValidee", {"xsi:nil": "true"}) + else: + ET.SubElement(passage_certification, "cpf:mentionValidee").text = row[15] + + # Modalite inscription + modalites_inscription = ET.SubElement(passage_certification, "cpf:modalitesInscription") + ET.SubElement(modalites_inscription, "cpf:modaliteAcces").text = row[16] + + #Identification Titulaire + identification_titulaire = ET.SubElement(passage_certification, "cpf:identificationTitulaire") + titulaire = ET.SubElement(identification_titulaire, "cpf:titulaire") + + logging.info(f"Titulaire : {row[18]} {row[19]}") + ET.SubElement(titulaire, "cpf:nomNaissance").text = row[17] + ET.SubElement(titulaire, "cpf:nomUsage").text = row[18] + ET.SubElement(titulaire, "cpf:prenom1").text = row[19] + ET.SubElement(titulaire, "cpf:anneeNaissance").text = row[20] + ET.SubElement(titulaire, "cpf:moisNaissance").text = row[21] + ET.SubElement(titulaire, "cpf:jourNaissance").text = row[22] + ET.SubElement(titulaire, "cpf:sexe").text = row[23] + code_commune_naissance = ET.SubElement(titulaire, "cpf:codeCommuneNaissance") + code_postal_naissance = ET.SubElement(code_commune_naissance, "cpf:codePostalNaissance") + ET.SubElement(code_postal_naissance, "cpf:codePostal").text = row[24] + + + # Appliquer l'indentation + indent(root) + + # Enregistrement du fichier XML + logging.info(f"Ecriture du XML...") + tree = ET.ElementTree(root) + with open(xml_filepath, "wb") as file: + tree.write(file, encoding="utf-8", xml_declaration=True) + +# Appel de la fonction pour créer le fichier XML +create_xml_from_csv(csv_file, xml_file) +logging.info("Fichier XML créé avec succès.") + diff --git a/Dico.csv b/Dico.csv new file mode 100644 index 0000000..f0fdc37 --- /dev/null +++ b/Dico.csv @@ -0,0 +1,9 @@ +BLOC 1,,BLOC 2,BLOC 3,,BLOC 4,,BLOC 5,,,,,,,,,BLOC 7,BLOC 8,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,, +1.1,1.2,2.1,3.1,3.2,4.1,4.2,5.1,5.4,5.5,5.10,5.11,5.12,5.14,5.15,5.16,7.1,8.1,8.2,8.3,8.6,8.7,8.8,8.9,8.11 +Identifiant du flux,Horodatage,N° de la fiche client de l'emetteur,N° de la fiche client Certificateur,Numéro de contrat spécifique Certificateur,Type de certification,Code,ID Technique du passage de la certification,Obtention de la certification par admission ou scoring,Donnée certifiée,Date de début de validité et de délivrance de la certification,Date de fin de validité de la certification,Présence du niveau de langue européen,Présence du niveau numérique européen,Scoring ou base de notation,Mention(s) validée(s),Modalité d'accès à la certification,Nom de naissance du titulaire,Nom d'usage ou marital,Prénom 1,Année de naissance,Mois de naissance,Jour de naissance,Sexe,Code postal de la commune de naissance du titulaire +idFlux,horodatage,idClient,idClient,idContrat,type,code,idTechnique,obtentionCertification,donneeCertifiee,dateDebutValidite,dateFinValidite,presenceNiveauLangueEuro,presenceNiveauNumeriqueEuro,scoring,mentionValidee,modaliteAcces,nomNaissance,nomUsage,prenom1,anneeNaissance,moisNaissance,jourNaissance,sexe,codePostal +..0,03/01/2024,,,,RNCP;,RNCP35726,#VALUE!,PAR_ADMISSION;,true;,,nil;,false;,false;,nil;,nil;,,,,,,,,, +..1,03/01/2024,,,,RNCP;,RNCP35726,#VALUE!,PAR_ADMISSION;,true;,,nil;,false;,false;,nil;,nil;,,,,,,,,, +..2,03/01/2024,,,,RNCP;,RNCP35726,#VALUE!,PAR_ADMISSION;,true;,,nil;,false;,false;,nil;,nil;,,,,,,,,, +..3,03/01/2024,,,,RNCP;,RNCP35726,#VALUE!,PAR_ADMISSION;,true;,,nil;,false;,false;,nil;,nil;,,,,,,,,, diff --git a/Dico.ods b/Dico.ods new file mode 100644 index 0000000000000000000000000000000000000000..5d01f041b5b932721e1c8be041cbed39967efd60 GIT binary patch literal 27735 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,,,,,,,,,,,,,,,,,,,,,,,, +1.1,1.2,2.1,3.1,3.2,4.1,4.2,5.1,,5.5,5.10,5.11,5.12,5.14,5.15,5.16,7.1,8.1,8.2,8.3,8.6,8.7,8.8,8.9,8.11 +Identifiant du flux,Horodatage,N° de la fiche client de l'emetteur,N° de la fiche client Certificateur,Numéro de contrat spécifique Certificateur,Type de certification,Code,ID Technique du passage de la certification,Obtention de la certification par admission ou scoring,Donnée certifiée,Date de début de validité et de délivrance de la certification,Date de fin de validité de la certification,Présence du niveau de langue européen,Présence du niveau numérique européen,Scoring ou base de notation,Mention(s) validée(s),Modalité d'accès à la certification,Nom de naissance du titulaire,Nom d'usage ou marital,Prénom 1,Année de naissance,Mois de naissance,Jour de naissance,Sexe,Code postal de la commune de naissance du titulaire +idFlux,horodatage,idClient,idClient,idContrat,type,code,idTechnique,obtentionCertification,donneeCertifiee,dateDebutValidite,dateFinValidite,presenceNiveauLangueEuro,presenceNiveauNumeriqueEuro,scoring,mentionValidee,modaliteAcces,nomNaissance,nomUsage,prenom1,anneeNaissance,moisNaissance,jourNaissance,sexe,codeCommuneNaissance +156258,2024-01-10T14:24:12+01:00,,,,RNCP,RNCP35726,#VALEUR !,PAR_ADMISSION,true,2022-01-18,nil,false,false,nil,nil,FORMATION_CONTINUE_CONTRAT_DE_PROFESSIONNALISATION,toto,toto,test1,1980,7,1,M,75001 +856269,2024-01-10T14:24:12+01:01,,,,RNCP,RNCP35726,#VALEUR !,PAR_ADMISSION,true,2022-01-19,nil,false,false,nil,nil,FORMATION_CONTINUE_CONTRAT_DE_PROFESSIONNALISATION,tata,tata,test2,1981,8,2,F,75002 +147893,2024-01-10T14:24:12+01:02,,,,RNCP,RNCP35726,#VALEUR !,PAR_ADMISSION,true,2022-01-20,nil,false,false,nil,nil,FORMATION_CONTINUE_CONTRAT_DE_PROFESSIONNALISATION,titi,titi,test3,1982,9,3,F,75003 +258964,2024-01-10T14:24:12+01:03,,,,RNCP,RNCP35726,#VALEUR !,PAR_ADMISSION,true,2022-01-21,nil,false,false,nil,nil,FORMATION_CONTINUE_CONTRAT_DE_PROFESSIONNALISATION,tonton,tonton,test4,1983,10,4,M,75004 diff --git a/Fichier XML v2.0.0.xml b/Fichier XML v2.0.0.xml new file mode 100644 index 0000000..9392673 --- /dev/null +++ b/Fichier XML v2.0.0.xml @@ -0,0 +1,190 @@ + + + 6e3c7378-bda4-497a-9bd6-dc203f903ed9 + 2020-12-18T14:24:12+01:00 + + AB123CDE + + + E564ACB0 + 2560080000127J + + + RNCP + RNCP19117 + CERTIFICATEUR + + + db855769-bcd6-4253-93cf-e666db666c0a + https://www.google.fr + Mention spéciale + PAR_ADMISSION + true + 2020-12-20 + 2020-12-22 + EN_PRESENTIEL + 75009 + 2020-12-12 + + true + A1 + true + + 890 + + + 5 + 3 + 4 + + + 7 + 1 + 1 + + + + 12.4 + MENTION_ASSEZ_BIEN + + FORMATION_INITIALE_APPRENTISSAGE + VAE_CLASSIQUE + CERTIFIE + 2019-02-10 + + + + Dupont + Dupont + Antoine + Julien + Philippe + 1996 + 11 + 15 + M + + + 31555 + + + Toulouse + France + + + TOSA + + + 10c54fd2-f3a3-4dea-b975-4d7258bd10b3 + https://www.google.fr + Mention spéciale + PAR_ADMISSION + true + 2020-12-20 + 2020-12-22 + EN_PRESENTIEL + 75009 + 2020-12-12 + 2030-12-13 + true + A1 + true + + 890 + + + 5 + 3 + 4 + + + 7 + 1 + 1 + + + + 12.4 + MENTION_ASSEZ_BIEN + + FORMATION_INITIALE_APPRENTISSAGE + VAE_CLASSIQUE + CERTIFIE + 2019-02-10 + + + + 1234567891011 + Dupont + Antoine + + + TOSA + + + 0785a873-acf7-4632-ad7b-b11cfff05b13 + https://www.google.fr + Mention spéciale + PAR_ADMISSION + true + 2020-12-20 + 2020-12-22 + EN_PRESENTIEL + 75009 + 2020-12-12 + 2030-12-13 + true + A1 + true + + 890 + + + 7 + 1 + 1 + + + 5 + 3 + 4 + + + + 12.4 + MENTION_ASSEZ_BIEN + + FORMATION_INITIALE_APPRENTISSAGE + VAE_CLASSIQUE + CERTIFIE + 2019-02-10 + + + + Dupont + Dupont + Antoine + Julien + Philippe + 1996 + 11 + 15 + M + + + 31555 + + + Toulouse + France + + + TOSA + + + + + + + + diff --git a/Fichier XSD v2.0.0.xsd b/Fichier XSD v2.0.0.xsd new file mode 100644 index 0000000..1f95403 --- /dev/null +++ b/Fichier XSD v2.0.0.xsd @@ -0,0 +1,489 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/GUI-Accrochage.py b/GUI-Accrochage.py new file mode 100644 index 0000000..58a4395 --- /dev/null +++ b/GUI-Accrochage.py @@ -0,0 +1,42 @@ +import PySimpleGUI as sg +import subprocess + +def run_script(script_path): + try: + result = subprocess.run(['python3', script_path], stdout=subprocess.PIPE, stderr=subprocess.PIPE) + return result.stdout.decode('utf-8'), result.stderr.decode('utf-8') + except Exception as e: + return '', str(e) + +# Définir le layout de la fenêtre +layout = [ + [sg.Text("Conversion du XML", size=(30, 1), justification="center", font=("Arial", 16, "bold"))], + [sg.Text("Préparation du XML :")], + [sg.Button("Executer la conversion"), sg.Button("Validation"), sg.Button("Fermer")], + [sg.Output(size=(50, 20))], + [sg.Text("", size=(50, 1), key="-VALIDATION-RESULT-", text_color="black")] # Ajout d'un élément Text pour les résultats de validation +] + +# Créer la fenêtre +window = sg.Window("Accrochage caisse des dépots", layout) + +# Boucle d'événements pour traiter les events et obtenir les values +while True: + event, values = window.read() + + if event == "Executer la conversion": + stdout, stderr = run_script('Accrochage.py') + print(stdout) + if stderr: + print("Erreur:", stderr) + elif event == "Validation": + stdout, stderr = run_script('validation.py') + if not stderr: + window["-VALIDATION-RESULT-"].update("Fichier valide", text_color="lime") + else: + window["-VALIDATION-RESULT-"].update("Erreur de validation,consulter le l'affichage...", text_color="red") + print(stdout if stdout else stderr) + elif event == sg.WIN_CLOSED or event == "Fermer": + break + +window.close() diff --git a/GUI-convert_csv-xml.py b/GUI-convert_csv-xml.py new file mode 100644 index 0000000..a293b00 --- /dev/null +++ b/GUI-convert_csv-xml.py @@ -0,0 +1,52 @@ +import csv +import os +import subprocess +import PySimpleGUI as sg + +csv_file = 'Dico2.csv' + +# Vérifiez le système d'exploitation pour déterminer la commande appropriée pour effacer l'écran +if os.name == 'posix': # Linux ou macOS + subprocess.run(['clear'], text=True, encoding='utf-8', check=False) +elif os.name == 'nt': # Windows + subprocess.run(['cls'], text=True, encoding='utf-8', check=False) + +# Créez une liste vide pour stocker les lignes du CSV +csv_data = [] + +# Ouverture du fichier CSV en mode lecture +with open(csv_file, 'r', encoding='utf-8') as csvfile: + # Créer un objet reader + csvreader = csv.reader(csvfile) + + # Parcourir les lignes du fichier CSV et les ajouter à la liste csv_data + for row in csvreader: + csv_data.append(row) + +# Créer une interface utilisateur simple pour afficher les données +layout = [ + [sg.Text('Balises :'), sg.Text('', size=(30, 1), key='balises')], + [sg.Text('Nombre d\'éléments :'), sg.Text('', size=(30, 1), key='nb_elements')], + [sg.Button('Afficher la deuxième ligne'), sg.Button('Afficher la cinquième ligne'), sg.Exit()] +] + +window = sg.Window('Affichage de données CSV', layout) + +while True: + event, values = window.read() + if event == sg.WINDOW_CLOSED or event == 'Exit': + break + elif event == 'Afficher la deuxième ligne': + if len(csv_data) >= 2: + window['balises'].update(', '.join(csv_data[1])) + window['nb_elements'].update(len(csv_data[1])) + else: + sg.popup_error("Le fichier CSV ne contient pas assez de lignes pour accéder à l'indice 1.") + elif event == 'Afficher la cinquième ligne': + if len(csv_data) >= 5: + window['balises'].update(', '.join(csv_data[4])) + window['nb_elements'].update(len(csv_data[4])) + else: + sg.popup_error("Le fichier CSV ne contient pas assez de lignes pour accéder à l'indice 4.") + +window.close() diff --git a/convert_csv-xml.py b/convert_csv-xml.py new file mode 100644 index 0000000..c8155a3 --- /dev/null +++ b/convert_csv-xml.py @@ -0,0 +1,159 @@ +import xml.etree.ElementTree as ET +import csv +import random +import logging +import datetime +import subprocess +import pytz +import os + +# Emplacement du fichier CSV et XML +csv_file = "Dico2.csv" +xml_file = "file.xml" +tz_paris = pytz.timezone('Europe/Paris') + +#Efface la console +def clear_console(): + os.system('cls' if os.name == 'nt' else 'clear') +clear_console() + +# Configuration du logging +logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s') + +def indent(elem, level=0): + """ Ajoute des indentations aux éléments pour une meilleure lisibilité du fichier XML. """ + i = "\n" + level * " " + if len(elem): + if not elem.text or not elem.text.strip(): + elem.text = i + " " + if not elem.tail or not elem.tail.strip(): + elem.tail = i + for elem in elem: + indent(elem, level + 1) + if not elem.tail or not elem.tail.strip(): + elem.tail = i + else: + if level and (not elem.tail or not elem.tail.strip()): + elem.tail = i + + +# Fonction pour lire les données CSV et générer le fichier XML +def create_xml_from_csv(csv_filepath, xml_filepath): + logging.info("Ouverture du CSV...") + # Ouvrir le fichier CSV pour la lecture + with open(csv_filepath, newline='', encoding='utf-8') as csvfile: + reader = csv.reader(csvfile) + Allrows = list(reader) + + # Vérification de la présence des données nécessaires + if len(Allrows) < 5: + logging.error("Les données CSV requises sont manquantes.") + exit() + + headers = Allrows[4][2:] # Sauter les deux premiers en-têtes + logging.info("Création de l'arborescence du fichier XML...") + + # Créer l'élément racine avec l'espace de noms 'cpf' + root = ET.Element("cpf:flux") + root.set("xmlns:cpf", "urn:cdc:cpf:pc5:schema:1.0.0") + root.set("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance") + + #Reglage du fuseau horaire + now = datetime.datetime.now(tz_paris) + value = now.strftime("%Y-%m-%dT%H:%M:%S+01:00") + + ET.SubElement(root, "cpf:idFlux").text = headers[0] + #str(random.randint(1000000000, 99999999999)) + ET.SubElement(root, "cpf:horodatage").text = value + + # Création et ajout de l'élément emetteur + emetteur = ET.SubElement(root, "cpf:emetteur") + logging.info("Emmetteur du fchier ...") + + # Création de la structure des certificateurs + idClient = str(random.randint(10000000, 99999999)) if Allrows[5][2] == '' else Allrows[5][2] + ET.SubElement(emetteur, "cpf:idClient").text = idClient + certificateurs = ET.SubElement(emetteur, "cpf:certificateurs") + certificateur = ET.SubElement(certificateurs, "cpf:certificateur") + logging.info(f"Certificateur {idClient}...") + + # Traitement pour NumClient pour le certificateur + idClient2 = str(random.randint(10000000, 99999999)) if Allrows[5][3] == '' else Allrows[5][3] + ET.SubElement(certificateur, "cpf:idClient").text = idClient2 + + # Traitement pour NumContrat pour le certificateur + idContrat = str(random.randint(10000000, 99999999)) if Allrows[5][4] == '' else Allrows[5][4] + ET.SubElement(certificateur, "cpf:idContrat").text = idContrat + + # Création de la structure des certifications + certifications = ET.SubElement(certificateur, "cpf:certifications") + certification = ET.SubElement(certifications, "cpf:certification") + + ET.SubElement(certification, "cpf:type").text = headers[5] + ET.SubElement(certification, "cpf:code").text = headers[6] + + # Ajout d'un seul passage de certification + passage_certifications = ET.SubElement(certification, "cpf:passageCertifications") + + # Itérer sur chaque ligne du fichier CSV + for row in Allrows[5:]: + # Sauter les lignes vides + if not row[0].strip(): + continue + + #Ajout des certifications + logging.info(f"Ajout des certifications : {row[7]}") + passage_certification = ET.SubElement(passage_certifications, "cpf:passageCertification") + ET.SubElement(passage_certification, "cpf:idTechnique").text = row[7] + ET.SubElement(passage_certification, "cpf:obtentionCertification").text = row[8] + ET.SubElement(passage_certification, "cpf:donneeCertifiee").text = row[9] + ET.SubElement(passage_certification, "cpf:dateDebutValidite").text = row[10] + # Vérification si la date de fin de validité est 'nil;' + if row[11].strip().lower() == 'nil': + ET.SubElement(passage_certification, "cpf:dateFinValidite", {"xsi:nil": "true"}) + else: + ET.SubElement(passage_certification, "cpf:dateFinValidite").text = row[11] + ET.SubElement(passage_certification, "cpf:presenceNiveauLangueEuro").text = row[12] + ET.SubElement(passage_certification, "cpf:presenceNiveauNumeriqueEuro").text = row[13] + if row[14].strip().lower() == 'nil': + ET.SubElement(passage_certification, "cpf:scoring", {"xsi:nil": "true"}) + else: + ET.SubElement(passage_certification, "cpf:scoring").text = row[14] + if row[15].strip().lower() == 'nil': + ET.SubElement(passage_certification, "cpf:mentionValidee", {"xsi:nil": "true"}) + else: + ET.SubElement(passage_certification, "cpf:mentionValidee").text = row[15] + + # Modalite inscription + modalites_inscription = ET.SubElement(passage_certification, "cpf:modalitesInscription") + ET.SubElement(modalites_inscription, "cpf:modaliteAcces").text = row[16] + + #Identification Titulaire + identification_titulaire = ET.SubElement(passage_certification, "cpf:identificationTitulaire") + titulaire = ET.SubElement(identification_titulaire, "cpf:titulaire") + + logging.info(f"Titulaire : {row[18]} {row[19]}") + ET.SubElement(titulaire, "cpf:nomNaissance").text = row[17] + ET.SubElement(titulaire, "cpf:nomUsage").text = row[18] + ET.SubElement(titulaire, "cpf:prenom1").text = row[19] + ET.SubElement(titulaire, "cpf:anneeNaissance").text = row[20] + ET.SubElement(titulaire, "cpf:moisNaissance").text = row[21] + ET.SubElement(titulaire, "cpf:jourNaissance").text = row[22] + ET.SubElement(titulaire, "cpf:sexe").text = row[23] + code_commune_naissance = ET.SubElement(titulaire, "cpf:codeCommuneNaissance") + code_postal_naissance = ET.SubElement(code_commune_naissance, "cpf:codePostalNaissance") + ET.SubElement(code_postal_naissance, "cpf:codePostal").text = row[24] + + + # Appliquer l'indentation + indent(root) + + # Enregistrement du fichier XML + logging.info(f"Ecriture du XML...") + tree = ET.ElementTree(root) + with open(xml_filepath, "wb") as file: + tree.write(file, encoding="utf-8", xml_declaration=True) + +# Appel de la fonction pour créer le fichier XML +create_xml_from_csv(csv_file, xml_file) +logging.info("Fichier XML créé avec succès.") \ No newline at end of file diff --git a/example.xml b/example.xml new file mode 100644 index 0000000..9392673 --- /dev/null +++ b/example.xml @@ -0,0 +1,190 @@ + + + 6e3c7378-bda4-497a-9bd6-dc203f903ed9 + 2020-12-18T14:24:12+01:00 + + AB123CDE + + + E564ACB0 + 2560080000127J + + + RNCP + RNCP19117 + CERTIFICATEUR + + + db855769-bcd6-4253-93cf-e666db666c0a + https://www.google.fr + Mention spéciale + PAR_ADMISSION + true + 2020-12-20 + 2020-12-22 + EN_PRESENTIEL + 75009 + 2020-12-12 + + true + A1 + true + + 890 + + + 5 + 3 + 4 + + + 7 + 1 + 1 + + + + 12.4 + MENTION_ASSEZ_BIEN + + FORMATION_INITIALE_APPRENTISSAGE + VAE_CLASSIQUE + CERTIFIE + 2019-02-10 + + + + Dupont + Dupont + Antoine + Julien + Philippe + 1996 + 11 + 15 + M + + + 31555 + + + Toulouse + France + + + TOSA + + + 10c54fd2-f3a3-4dea-b975-4d7258bd10b3 + https://www.google.fr + Mention spéciale + PAR_ADMISSION + true + 2020-12-20 + 2020-12-22 + EN_PRESENTIEL + 75009 + 2020-12-12 + 2030-12-13 + true + A1 + true + + 890 + + + 5 + 3 + 4 + + + 7 + 1 + 1 + + + + 12.4 + MENTION_ASSEZ_BIEN + + FORMATION_INITIALE_APPRENTISSAGE + VAE_CLASSIQUE + CERTIFIE + 2019-02-10 + + + + 1234567891011 + Dupont + Antoine + + + TOSA + + + 0785a873-acf7-4632-ad7b-b11cfff05b13 + https://www.google.fr + Mention spéciale + PAR_ADMISSION + true + 2020-12-20 + 2020-12-22 + EN_PRESENTIEL + 75009 + 2020-12-12 + 2030-12-13 + true + A1 + true + + 890 + + + 7 + 1 + 1 + + + 5 + 3 + 4 + + + + 12.4 + MENTION_ASSEZ_BIEN + + FORMATION_INITIALE_APPRENTISSAGE + VAE_CLASSIQUE + CERTIFIE + 2019-02-10 + + + + Dupont + Dupont + Antoine + Julien + Philippe + 1996 + 11 + 15 + M + + + 31555 + + + Toulouse + France + + + TOSA + + + + + + + + diff --git a/file.xml b/file.xml new file mode 100644 index 0000000..3a7db74 --- /dev/null +++ b/file.xml @@ -0,0 +1,142 @@ + + + idClient + 2024-01-11T13:24:05+01:00 + + 86478630 + + + 71541698 + 40802928 + + + idTechnique + obtentionCertification + + + #VALEUR ! + PAR_ADMISSION + true + 2022-01-18 + + false + false + + + + FORMATION_CONTINUE_CONTRAT_DE_PROFESSIONNALISATION + + + + toto + toto + test1 + 1980 + 7 + 1 + M + + + 75001 + + + + + + + #VALEUR ! + PAR_ADMISSION + true + 2022-01-19 + + false + false + + + + FORMATION_CONTINUE_CONTRAT_DE_PROFESSIONNALISATION + + + + tata + tata + test2 + 1981 + 8 + 2 + F + + + 75002 + + + + + + + #VALEUR ! + PAR_ADMISSION + true + 2022-01-20 + + false + false + + + + FORMATION_CONTINUE_CONTRAT_DE_PROFESSIONNALISATION + + + + titi + titi + test3 + 1982 + 9 + 3 + F + + + 75003 + + + + + + + #VALEUR ! + PAR_ADMISSION + true + 2022-01-21 + + false + false + + + + FORMATION_CONTINUE_CONTRAT_DE_PROFESSIONNALISATION + + + + tonton + tonton + test4 + 1983 + 10 + 4 + M + + + 75004 + + + + + + + + + + + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..0959d26 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1130 @@ +{ + "name": "Acrochage", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "dependencies": { + "three": "^0.160.0" + }, + "devDependencies": { + "vite": "^5.0.11" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz", + "integrity": "sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.11.tgz", + "integrity": "sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz", + "integrity": "sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.11.tgz", + "integrity": "sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz", + "integrity": "sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz", + "integrity": "sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz", + "integrity": "sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz", + "integrity": "sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz", + "integrity": "sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz", + "integrity": "sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz", + "integrity": "sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz", + "integrity": "sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz", + "integrity": "sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz", + "integrity": "sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz", + "integrity": "sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz", + "integrity": "sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz", + "integrity": "sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz", + "integrity": "sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz", + "integrity": "sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz", + "integrity": "sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz", + "integrity": "sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz", + "integrity": "sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz", + "integrity": "sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.3.tgz", + "integrity": "sha512-nvh9bB41vXEoKKvlWCGptpGt8EhrEwPQFDCY0VAto+R+qpSbaErPS3OjMZuXR8i/2UVw952Dtlnl2JFxH31Qvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.3.tgz", + "integrity": "sha512-kffYCJ2RhDL1DlshLzYPyJtVeusHlA8Q1j6k6s4AEVKLq/3HfGa2ADDycLsmPo3OW83r4XtOPqRMbcFzFsEIzQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.3.tgz", + "integrity": "sha512-Fo7DR6Q9/+ztTyMBZ79+WJtb8RWZonyCgkBCjV51rW5K/dizBzImTW6HLC0pzmHaAevwM0jW1GtB5LCFE81mSw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.3.tgz", + "integrity": "sha512-5HcxDF9fqHucIlTiw/gmMb3Qv23L8bLCg904I74Q2lpl4j/20z9ogaD3tWkeguRuz+/17cuS321PT3PAuyjQdg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.3.tgz", + "integrity": "sha512-cO6hKV+99D1V7uNJQn1chWaF9EGp7qV2N8sGH99q9Y62bsbN6Il55EwJppEWT+JiqDRg396vWCgwdHwje8itBQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.3.tgz", + "integrity": "sha512-xANyq6lVg6KMO8UUs0LjA4q7di3tPpDbzLPgVEU2/F1ngIZ54eli8Zdt3uUUTMXVbgTCafIO+JPeGMhu097i3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.3.tgz", + "integrity": "sha512-TZJUfRTugVFATQToCMD8DNV6jv/KpSwhE1lLq5kXiQbBX3Pqw6dRKtzNkh5wcp0n09reBBq/7CGDERRw9KmE+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.3.tgz", + "integrity": "sha512-4/QVaRyaB5tkEAGfjVvWrmWdPF6F2NoaoO5uEP7N0AyeBw7l8SeCWWKAGrbx/00PUdHrJVURJiYikazslSKttQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.3.tgz", + "integrity": "sha512-koLC6D3pj1YLZSkTy/jsk3HOadp7q2h6VQl/lPX854twOmmLNekHB6yuS+MkWcKdGGdW1JPuPBv/ZYhr5Yhtdg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.3.tgz", + "integrity": "sha512-0OAkQ4HBp+JO2ip2Lgt/ShlrveOMzyhwt2D0KvqH28jFPqfZco28KSq76zymZwmU+F6GRojdxtQMJiNSXKNzeA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.3.tgz", + "integrity": "sha512-z5uvoMvdRWggigOnsb9OOCLERHV0ykRZoRB5O+URPZC9zM3pkoMg5fN4NKu2oHqgkzZtfx9u4njqqlYEzM1v9A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.3.tgz", + "integrity": "sha512-wxomCHjBVKws+O4N1WLnniKCXu7vkLtdq9Fl9CN/EbwEldojvUrkoHE/fBLZzC7IT/x12Ut6d6cRs4dFvqJkMg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.3.tgz", + "integrity": "sha512-1Qf/qk/iEtx0aOi+AQQt5PBoW0mFngsm7bPuxHClC/hWh2hHBktR6ktSfUg5b5rC9v8hTwNmHE7lBWXkgqluUQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.11.tgz", + "integrity": "sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.11", + "@esbuild/android-arm": "0.19.11", + "@esbuild/android-arm64": "0.19.11", + "@esbuild/android-x64": "0.19.11", + "@esbuild/darwin-arm64": "0.19.11", + "@esbuild/darwin-x64": "0.19.11", + "@esbuild/freebsd-arm64": "0.19.11", + "@esbuild/freebsd-x64": "0.19.11", + "@esbuild/linux-arm": "0.19.11", + "@esbuild/linux-arm64": "0.19.11", + "@esbuild/linux-ia32": "0.19.11", + "@esbuild/linux-loong64": "0.19.11", + "@esbuild/linux-mips64el": "0.19.11", + "@esbuild/linux-ppc64": "0.19.11", + "@esbuild/linux-riscv64": "0.19.11", + "@esbuild/linux-s390x": "0.19.11", + "@esbuild/linux-x64": "0.19.11", + "@esbuild/netbsd-x64": "0.19.11", + "@esbuild/openbsd-x64": "0.19.11", + "@esbuild/sunos-x64": "0.19.11", + "@esbuild/win32-arm64": "0.19.11", + "@esbuild/win32-ia32": "0.19.11", + "@esbuild/win32-x64": "0.19.11" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/postcss": { + "version": "8.4.33", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", + "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/rollup": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.3.tgz", + "integrity": "sha512-JnchF0ZGFiqGpAPjg3e89j656Ne4tTtCY1VZc1AxtoQcRIxjTu9jyYHBAtkDXE+X681n4un/nX9SU52AroSRzg==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.9.3", + "@rollup/rollup-android-arm64": "4.9.3", + "@rollup/rollup-darwin-arm64": "4.9.3", + "@rollup/rollup-darwin-x64": "4.9.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.9.3", + "@rollup/rollup-linux-arm64-gnu": "4.9.3", + "@rollup/rollup-linux-arm64-musl": "4.9.3", + "@rollup/rollup-linux-riscv64-gnu": "4.9.3", + "@rollup/rollup-linux-x64-gnu": "4.9.3", + "@rollup/rollup-linux-x64-musl": "4.9.3", + "@rollup/rollup-win32-arm64-msvc": "4.9.3", + "@rollup/rollup-win32-ia32-msvc": "4.9.3", + "@rollup/rollup-win32-x64-msvc": "4.9.3", + "fsevents": "~2.3.2" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/three": { + "version": "0.160.0", + "resolved": "https://registry.npmjs.org/three/-/three-0.160.0.tgz", + "integrity": "sha512-DLU8lc0zNIPkM7rH5/e1Ks1Z8tWCGRq6g8mPowdDJpw1CFBJMU7UoJjC6PefXW7z//SSl0b2+GCw14LB+uDhng==" + }, + "node_modules/vite": { + "version": "5.0.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.11.tgz", + "integrity": "sha512-XBMnDjZcNAw/G1gEiskiM1v6yzM4GE5aMGvhWTlHAYYhxb7S3/V1s3m2LDHa8Vh6yIWYYB0iJwsEaS523c4oYA==", + "dev": true, + "dependencies": { + "esbuild": "^0.19.3", + "postcss": "^8.4.32", + "rollup": "^4.2.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + } + }, + "dependencies": { + "@esbuild/aix-ppc64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz", + "integrity": "sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.11.tgz", + "integrity": "sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz", + "integrity": "sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.11.tgz", + "integrity": "sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz", + "integrity": "sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz", + "integrity": "sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz", + "integrity": "sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz", + "integrity": "sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz", + "integrity": "sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz", + "integrity": "sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz", + "integrity": "sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz", + "integrity": "sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz", + "integrity": "sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz", + "integrity": "sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz", + "integrity": "sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz", + "integrity": "sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz", + "integrity": "sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz", + "integrity": "sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz", + "integrity": "sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz", + "integrity": "sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz", + "integrity": "sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz", + "integrity": "sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz", + "integrity": "sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-android-arm-eabi": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.3.tgz", + "integrity": "sha512-nvh9bB41vXEoKKvlWCGptpGt8EhrEwPQFDCY0VAto+R+qpSbaErPS3OjMZuXR8i/2UVw952Dtlnl2JFxH31Qvg==", + "dev": true, + "optional": true + }, + "@rollup/rollup-android-arm64": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.3.tgz", + "integrity": "sha512-kffYCJ2RhDL1DlshLzYPyJtVeusHlA8Q1j6k6s4AEVKLq/3HfGa2ADDycLsmPo3OW83r4XtOPqRMbcFzFsEIzQ==", + "dev": true, + "optional": true + }, + "@rollup/rollup-darwin-arm64": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.3.tgz", + "integrity": "sha512-Fo7DR6Q9/+ztTyMBZ79+WJtb8RWZonyCgkBCjV51rW5K/dizBzImTW6HLC0pzmHaAevwM0jW1GtB5LCFE81mSw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-darwin-x64": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.3.tgz", + "integrity": "sha512-5HcxDF9fqHucIlTiw/gmMb3Qv23L8bLCg904I74Q2lpl4j/20z9ogaD3tWkeguRuz+/17cuS321PT3PAuyjQdg==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.3.tgz", + "integrity": "sha512-cO6hKV+99D1V7uNJQn1chWaF9EGp7qV2N8sGH99q9Y62bsbN6Il55EwJppEWT+JiqDRg396vWCgwdHwje8itBQ==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm64-gnu": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.3.tgz", + "integrity": "sha512-xANyq6lVg6KMO8UUs0LjA4q7di3tPpDbzLPgVEU2/F1ngIZ54eli8Zdt3uUUTMXVbgTCafIO+JPeGMhu097i3w==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm64-musl": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.3.tgz", + "integrity": "sha512-TZJUfRTugVFATQToCMD8DNV6jv/KpSwhE1lLq5kXiQbBX3Pqw6dRKtzNkh5wcp0n09reBBq/7CGDERRw9KmE+g==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-riscv64-gnu": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.3.tgz", + "integrity": "sha512-4/QVaRyaB5tkEAGfjVvWrmWdPF6F2NoaoO5uEP7N0AyeBw7l8SeCWWKAGrbx/00PUdHrJVURJiYikazslSKttQ==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-x64-gnu": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.3.tgz", + "integrity": "sha512-koLC6D3pj1YLZSkTy/jsk3HOadp7q2h6VQl/lPX854twOmmLNekHB6yuS+MkWcKdGGdW1JPuPBv/ZYhr5Yhtdg==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-x64-musl": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.3.tgz", + "integrity": "sha512-0OAkQ4HBp+JO2ip2Lgt/ShlrveOMzyhwt2D0KvqH28jFPqfZco28KSq76zymZwmU+F6GRojdxtQMJiNSXKNzeA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-arm64-msvc": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.3.tgz", + "integrity": "sha512-z5uvoMvdRWggigOnsb9OOCLERHV0ykRZoRB5O+URPZC9zM3pkoMg5fN4NKu2oHqgkzZtfx9u4njqqlYEzM1v9A==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-ia32-msvc": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.3.tgz", + "integrity": "sha512-wxomCHjBVKws+O4N1WLnniKCXu7vkLtdq9Fl9CN/EbwEldojvUrkoHE/fBLZzC7IT/x12Ut6d6cRs4dFvqJkMg==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-x64-msvc": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.3.tgz", + "integrity": "sha512-1Qf/qk/iEtx0aOi+AQQt5PBoW0mFngsm7bPuxHClC/hWh2hHBktR6ktSfUg5b5rC9v8hTwNmHE7lBWXkgqluUQ==", + "dev": true, + "optional": true + }, + "@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "esbuild": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.11.tgz", + "integrity": "sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==", + "dev": true, + "requires": { + "@esbuild/aix-ppc64": "0.19.11", + "@esbuild/android-arm": "0.19.11", + "@esbuild/android-arm64": "0.19.11", + "@esbuild/android-x64": "0.19.11", + "@esbuild/darwin-arm64": "0.19.11", + "@esbuild/darwin-x64": "0.19.11", + "@esbuild/freebsd-arm64": "0.19.11", + "@esbuild/freebsd-x64": "0.19.11", + "@esbuild/linux-arm": "0.19.11", + "@esbuild/linux-arm64": "0.19.11", + "@esbuild/linux-ia32": "0.19.11", + "@esbuild/linux-loong64": "0.19.11", + "@esbuild/linux-mips64el": "0.19.11", + "@esbuild/linux-ppc64": "0.19.11", + "@esbuild/linux-riscv64": "0.19.11", + "@esbuild/linux-s390x": "0.19.11", + "@esbuild/linux-x64": "0.19.11", + "@esbuild/netbsd-x64": "0.19.11", + "@esbuild/openbsd-x64": "0.19.11", + "@esbuild/sunos-x64": "0.19.11", + "@esbuild/win32-arm64": "0.19.11", + "@esbuild/win32-ia32": "0.19.11", + "@esbuild/win32-x64": "0.19.11" + } + }, + "fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "optional": true + }, + "nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "postcss": { + "version": "8.4.33", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", + "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", + "dev": true, + "requires": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "rollup": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.3.tgz", + "integrity": "sha512-JnchF0ZGFiqGpAPjg3e89j656Ne4tTtCY1VZc1AxtoQcRIxjTu9jyYHBAtkDXE+X681n4un/nX9SU52AroSRzg==", + "dev": true, + "requires": { + "@rollup/rollup-android-arm-eabi": "4.9.3", + "@rollup/rollup-android-arm64": "4.9.3", + "@rollup/rollup-darwin-arm64": "4.9.3", + "@rollup/rollup-darwin-x64": "4.9.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.9.3", + "@rollup/rollup-linux-arm64-gnu": "4.9.3", + "@rollup/rollup-linux-arm64-musl": "4.9.3", + "@rollup/rollup-linux-riscv64-gnu": "4.9.3", + "@rollup/rollup-linux-x64-gnu": "4.9.3", + "@rollup/rollup-linux-x64-musl": "4.9.3", + "@rollup/rollup-win32-arm64-msvc": "4.9.3", + "@rollup/rollup-win32-ia32-msvc": "4.9.3", + "@rollup/rollup-win32-x64-msvc": "4.9.3", + "@types/estree": "1.0.5", + "fsevents": "~2.3.2" + } + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true + }, + "three": { + "version": "0.160.0", + "resolved": "https://registry.npmjs.org/three/-/three-0.160.0.tgz", + "integrity": "sha512-DLU8lc0zNIPkM7rH5/e1Ks1Z8tWCGRq6g8mPowdDJpw1CFBJMU7UoJjC6PefXW7z//SSl0b2+GCw14LB+uDhng==" + }, + "vite": { + "version": "5.0.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.11.tgz", + "integrity": "sha512-XBMnDjZcNAw/G1gEiskiM1v6yzM4GE5aMGvhWTlHAYYhxb7S3/V1s3m2LDHa8Vh6yIWYYB0iJwsEaS523c4oYA==", + "dev": true, + "requires": { + "esbuild": "^0.19.3", + "fsevents": "~2.3.3", + "postcss": "^8.4.32", + "rollup": "^4.2.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..70269be --- /dev/null +++ b/package.json @@ -0,0 +1,8 @@ +{ + "dependencies": { + "three": "^0.160.0" + }, + "devDependencies": { + "vite": "^5.0.11" + } +} diff --git a/setup.bat b/setup.bat new file mode 100644 index 0000000..94107fa --- /dev/null +++ b/setup.bat @@ -0,0 +1,40 @@ +@echo off + +:: Vérifie si Python est déjà installé +python --version >nul 2>&1 +if %ERRORLEVEL% equ 0 ( + echo Python est déjà installé. + goto :InstallPackages +) + +:: Télécharge l'installateur Python (ajustez la version si nécessaire) +echo Téléchargement de l'installateur Python... +bitsadmin /transfer "DownloadPythonInstaller" https://www.python.org/ftp/python/3.9.6/python-3.9.6-amd64.exe "%CD%\python-installer.exe" + +:: Installe Python (ajoutez la version que vous souhaitez installer) +echo Installation de Python... +start /wait "" "%CD%\python-installer.exe" /quiet InstallAllUsers=1 PrependPath=1 Include_test=0 + +:: Vérifie si l'installation de Python a réussi +python --version >nul 2>&1 +if %ERRORLEVEL% neq 0 ( + echo L'installation de Python a échoué. + exit /b 1 +) + +:InstallPackages +echo Installation des packages nécessaires... + +:: Mise à jour de pip +python -m pip install --upgrade pip + +:: Installation des packages avec pip +pip install lxml +pip install pytz +pip install pysimplegui + +mkdir Accrochage + +echo Installation terminée. +pause +exit /b 0 diff --git a/validation.py b/validation.py new file mode 100644 index 0000000..faf82a8 --- /dev/null +++ b/validation.py @@ -0,0 +1,34 @@ +from lxml import etree +import sys + +# Emplacement du fichier CSV et XML +xsdfile = "validation.xsd" +xmlfile = "file.xml" + + +def valider_xml(xml_path, xsd_path): + try: + # Charger le schéma XSD + with open(xsd_path, 'rb') as schema_file: + schema_root = etree.XML(schema_file.read()) + schema = etree.XMLSchema(schema_root) + + # Parser avec prise en compte des namespaces + parser = etree.XMLParser(ns_clean=True) + + # Charger le fichier XML en mode binaire avec le parser + with open(xml_path, 'rb') as xml_file: + xml_doc = etree.parse(xml_file, parser) + + # Valider le fichier XML + schema.assertValid(xml_doc) + print("Le fichier XML est valide.") + + except etree.XMLSchemaError as e: + print("Erreur de schéma XSD:", e) + except etree.DocumentInvalid as e: + print("Le fichier XML est invalide:", e) + except Exception as e: + print("Erreur lors de la validation du fichier XML:", e) + +valider_xml(xmlfile, xsdfile) diff --git a/validation.xsd b/validation.xsd new file mode 100644 index 0000000..1f95403 --- /dev/null +++ b/validation.xsd @@ -0,0 +1,489 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/xml.csv b/xml.csv new file mode 100644 index 0000000..6f0a9b6 --- /dev/null +++ b/xml.csv @@ -0,0 +1,5 @@ +cpf:idFlux,cpf:horodatage,cpf:emetteur,cpf:certificateur,cpf:idClient,cpf:idContrat,cpf:type,cpf:code,cpf:idTechnique,cpf:obtentionCertification,cpf:donneeCertifiee,cpf:dateDebutValidite,cpf:dateFinValidite,cpf:presenceNiveauLangueEuro,cpf:presenceNiveauNumeriqueEuro,cpf:scoring,cpf:mentionValidee,cpf:modaliteAcces,cpf:nomNaissance,cpf:nomUsage,cpf:prenom1,cpf:anneeNaissance,cpf:moisNaissance,cpf:jourNaissance,cpf:sexe,cpf:codePostal +1,2024-01-04T14:30:00+01:00,,E564ACB0,AB123CDE,2560080000127J,RNCP,RNCP19117,db855769-bcd6-4253-93cf-e666db666c0a,PAR_ADMISSION,true,2020-12-20,2020-12-22,true,true,12.4,MENTION_ASSEZ_BIEN,FORMATION_INITIALE_APPRENTISSAGE,Dupont,Dupont,Antoine,1996,11,15,M,75009 +2,2024-01-04T14:35:00+01:00,,E564ACB0,AB123CDE,2560080000127J,RNCP,RNCP19118,10c54fd2-f3a3-4dea-b975-4d7258bd10b3,PAR_ADMISSION,true,2020-12-20,2030-12-13,true,true,12.4,MENTION_ASSEZ_BIEN,FORMATION_INITIALE_APPRENTISSAGE,Dupont,Dupont,Antoine,1996,11,15,M,75009 +3,2024-01-04T14:40:00+01:00,,E564ACB0,AB123CDE,2560080000127J,RNCP,RNCP19119,0785a873-acf7-4632-ad7b-b11cfff05b13,PAR_ADMISSION,true,2020-12-20,2030-12-13,true,true,12.4,MENTION_ASSEZ_BIEN,FORMATION_INITIALE_APPRENTISSAGE,Dupont,Dupont,Antoine,1996,11,15,M,75009 +