///////////////////////////////////////////////// // LOGGING ///////////////////////////////////////////////// const logger = require("../public/js/app/logger_adhesion"); ///////////////////////////////////////////////// // APPELS DES MODULES ///////////////////////////////////////////////// const moment = require('moment'); const ejs = require('ejs'); const nodemailer = require('nodemailer'); const path = require("path"); const stripe = require('stripe')(process.env.STRIPE_PRIVATE_KEY); const pdf = require("pdf-creator-node"); const fs = require("fs"); const mysql = require('mysql2'); const mysql_promise = require('mysql2/promise'); // ADOBE PDF const PDFServicesSdk = require('@adobe/pdfservices-node-sdk'); ///////////////////////////////////////////////// // APPELS DES FONCTIONS ///////////////////////////////////////////////// // Déterminer les profils de l'adhésion const carte_adherent = require("./../modules/adhesion/carte_adherent"); // FAIRE UNE PAUSE const sleep = require("./../modules/sleep"); //////////////////////////////////////////////////// // FILE NAME //////////////////////////////////////////////////// const filename = path.parse(__filename).base; ///////////////////////////////////////////////// // GOOGLE SHEET PARAMETERS ///////////////////////////////////////////////// const { GoogleSpreadsheet } = require('google-spreadsheet'); const GS_creds = require('../inscriptionsafps-53b60452f63d.json'); const { error } = require("console"); // Initialize the sheet - doc ID is the long id in the sheets URL const GS_adhesion = new GoogleSpreadsheet(process.env.gsheet_adhesion); ///////////////////////////////////////////////// // VARIABLES GLOBALES ///////////////////////////////////////////////// let adherent_type, profil1, profil2, profil3; ///////////////////////////////////////////////// // SAISIE DU MAIL // VÉRIFIER SI DÉJÀ INSCRIT DANS DB ///////////////////////////////////////////////// const checkMail = async function(req, res){ logger.info("======================================"); logger.info("======== FUNCTION checkMail (adhesion) =========="); logger.info("======================================"); logger.info("req.body.identifiant = " + req.body.identifiant, { numsession: req.session.id }); logger.info("req.session.id = " + req.session.id, { numsession: req.session.id }); //////////////////////////////////////////////////// // CONNECTION DB PROMISE //////////////////////////////////////////////////// // on doit faire le "await mysql_promise.createConnection" ici car c'est un promise et seul le résultat du promise amène la connection // on est donc obligé de le faire au moment où l'on a besoin de la connection et avec un await. // on essaie de se connecter à la BD (try) try { const db_connection_promise = await mysql_promise.createConnection({ host: process.env.db_connection_host, port: process.env.db_connection_port, user: process.env.db_connection_user, password: process.env.db_connection_password, database: process.env.db_connection_database }); logger.info("======================================", { label: filename }); logger.info("Connected TO DATABASE test with mysql2 PREMISE !", { label: filename }); logger.info("======================================", { label: filename }); // Vérification dans la base de données si l'identifiant ne serait pas déjà inscrit // ON RÉCUPÈRE LE MAIL (IDENTIFIANT) SAISIE DANS LE FORMULAIRE req.session.identifiant = req.body.identifiant; // Query table adherent let sql = 'SELECT identifiant FROM adherent WHERE identifiant = "' + req.session.identifiant + '" AND saison = "2025/2026"'; logger.info("SQL = " + sql, { numsession: req.session.id }); try { const [results, fields] = await db_connection_promise.execute(sql); logger.info("Nombre de lignes trouvées avec cet identifiant = " + results.length, { numsession: req.session.id, label: filename}); if (results.length < 1) { // adhérent non inscrit logger.info("identifiant non inscrit, on va procéder à son inscription", { numsession: req.session.id, label: filename}); logger.info("Etat case à coché : " + req.body.check_prof, { numsession: req.session.id }); // Prof coché ? if (req.body.check_prof) { // Prof coché : on va vers inscription prof logger.info("CASE A COCHÉ PROF : coché", { numsession: req.session.id }); await db_connection_promise.end(); return res.redirect('/adhesion/adhesion_prof'); } else { // prof non coché : on va vers inscription famille logger.info("CASE A COCHÉ PROF : NON coché", { numsession: req.session.id }); await db_connection_promise.end(); return res.redirect('/adhesion/adhesion_famille'); } } else { // adhérent dajà inscrit // affichage message erreur logger.info("identifiant déjà inscrit", { numsession: req.session.id, label: filename}); req.session.err_mail_form_adhesion_1 = "Cette adresse Email est déjà inscrite pour les adhésions 2025/2026."; req.session.err_mail_form_adhesion_2 = "Si vous n'aviez pas pu finaliser votre paiement veuillez nous envoyer un chèque ou un virement."; req.session.err_mail_form_adhesion_3 = "Pour tout problème veuillez contacter l’Association."; // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur await db_connection_promise.end(); return res.redirect('/adhesion'); } } catch (error) { // Echec de la requête logger.error("Il y a un problème avec la requête select identifiant from adherent! : " + error, { numsession: req.session.id }); req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur await db_connection_promise.end(); return res.redirect('/adhesion'); } } catch (error) { // Echec de connection à la BD logger.error("Il y a un problème avec la connection à la base de données! : " + error, { numsession: req.session.id }); req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur await db_connection_promise.end(); return res.redirect('/adhesion'); } } ///////////////////////////////////////////////// // ENREGISTREMENT DES INFOS // DÉTERMINER LE TYPE D'adhérent // CALCUL DU PRIX ///////////////////////////////////////////////// const post_form_adhesion = async function(req, res){ logger.info("======================================"); logger.info("======== FUNCTION post_form_adhesion (adhesion) =========="); logger.info("======================================"); // Controle que l'identifiant ne soit pas vide (en cas de rafraîchissement de la page) logger.info("req.session.identifiant = " + req.session.identifiant, { numsession: req.session.id }); if (req.session.identifiant){ ///////////////////////////////////////////////// // RÉCUPÉRATION DES DONNÉES DU FORMULAIRE DE LA SESSION EN COURS // INFOS GÉNÉRALES ADHÉRENT req.session.adherent_nom = req.body.adherent_nom; req.session.adherent_prenom = req.body.adherent_prenom; req.session.adherent_adresse_rue = req.body.adherent_adresse_rue; req.session.adherent_adresse_complement = req.body.adherent_adresse_complement; req.session.adherent_adresse_codepostal = req.body.adherent_adresse_codepostal; req.session.adherent_adresse_ville = req.body.adherent_adresse_ville; req.session.adherent_adresse_pays = req.body.adherent_adresse_pays; req.session.adherent_telephone_mobile = req.body.adherent_telephone_mobile; req.session.adherent_telephone_fixe = req.body.adherent_telephone_fixe; // INFOS PROF req.session.adherent_prof_instrument1 = req.body.adherent_prof_instrument1; req.session.adherent_prof_instrument1_esa = req.body.adherent_prof_instrument1_esa; req.session.adherent_prof_instrument2 = req.body.adherent_prof_instrument2; req.session.adherent_prof_instrument2_esa = req.body.adherent_prof_instrument2_esa; req.session.adherent_prof_sece = req.body.adherent_prof_sece; req.session.adherent_prof_ecole1 = req.body.adherent_prof_ecole1; req.session.adherent_prof_ecole1_adresse = req.body.adherent_prof_ecole1_adresse; req.session.adherent_prof_ecole1_cp = req.body.adherent_prof_ecole1_cp; req.session.adherent_prof_ecole1_ville = req.body.adherent_prof_ecole1_ville; req.session.adherent_prof_ecole1_region = req.body.adherent_prof_ecole1_region; req.session.adherent_prof_ecole1_mail = req.body.adherent_prof_ecole1_mail; req.session.adherent_prof_ecole1_web = req.body.adherent_prof_ecole1_web; req.session.adherent_prof_ecole2 = req.body.adherent_prof_ecole2; req.session.adherent_prof_ecole2_adresse = req.body.adherent_prof_ecole2_adresse; req.session.adherent_prof_ecole2_cp = req.body.adherent_prof_ecole2_cp; req.session.adherent_prof_ecole2_ville = req.body.adherent_prof_ecole2_ville; req.session.adherent_prof_ecole2_region = req.body.adherent_prof_ecole2_region; req.session.adherent_prof_ecole2_mail = req.body.adherent_prof_ecole2_mail; req.session.adherent_prof_ecole2_web = req.body.adherent_prof_ecole2_web; req.session.adherent_prof_ecole3 = req.body.adherent_prof_ecole3; req.session.adherent_prof_ecole3_adresse = req.body.adherent_prof_ecole3_adresse; req.session.adherent_prof_ecole3_cp = req.body.adherent_prof_ecole3_cp; req.session.adherent_prof_ecole3_ville = req.body.adherent_prof_ecole3_ville; req.session.adherent_prof_ecole3_region = req.body.adherent_prof_ecole3_region; req.session.adherent_prof_ecole3_mail = req.body.adherent_prof_ecole3_mail; req.session.adherent_prof_ecole3_web = req.body.adherent_prof_ecole3_web; // INFOS FORMATION DU PROF req.session.adherent_prof_stagiaire_instrument1 = req.body.adherent_prof_stagiaire_instrument1; req.session.adherent_prof_stagiaire_instrument1_esa = req.body.adherent_prof_stagiaire_instrument1_esa; req.session.adherent_prof_stagiaire_instrument1_prof = req.body.adherent_prof_stagiaire_instrument1_prof req.session.adherent_prof_stagiaire_instrument2 = req.body.adherent_prof_stagiaire_instrument2; req.session.adherent_prof_stagiaire_instrument2_esa = req.body.adherent_prof_stagiaire_instrument2_esa; req.session.adherent_prof_stagiaire_instrument2_prof = req.body.adherent_prof_stagiaire_instrument2_prof // INFO ÉLÈVES for (let i=1; i<6; i++) { req.session["eleve_"+i+"_nom"] = req.body["eleve_"+i+"_nom"]; req.session["eleve_"+i+"_prenom"] = req.body["eleve_"+i+"_prenom"]; moment.locale('fr'); if (req.body["eleve_"+i+"_datenaissance"]) {req.session["eleve_"+i+"_datenaissance"] = moment(req.body["eleve_"+i+"_datenaissance"]).format('L')}; req.session["eleve_"+i+"_instrumentA"] = req.body["eleve_"+i+"_instrumentA"]; req.session["eleve_"+i+"_instrumentA_cahier"] = req.body["eleve_"+i+"_instrumentA_cahier"]; req.session["eleve_"+i+"_instrumentA_prof"] = req.body["eleve_"+i+"_instrumentA_prof"]; req.session["eleve_"+i+"_instrumentB"] = req.body["eleve_"+i+"_instrumentB"]; req.session["eleve_"+i+"_instrumentB_cahier"] = req.body["eleve_"+i+"_instrumentB_cahier"]; req.session["eleve_"+i+"_instrumentB_prof"] = req.body["eleve_"+i+"_instrumentB_prof"]; req.session["eleve_"+i+"_droitimage"] = req.body["eleve_"+i+"_droitimage"]; req.session["eleve_"+i+"_contactsup_nom"] = req.body["eleve_"+i+"_contactsup_nom"]; req.session["eleve_"+i+"_contactsup_prenom"] = req.body["eleve_"+i+"_contactsup_prenom"]; req.session["eleve_"+i+"_contactsup_mail"] = req.body["eleve_"+i+"_contactsup_mail"]; } ///////////////////////////////////////////////// // DÉTERMINER LE TYPE D'ADHÉRENT logger.info("// DÉTERMINER LE TYPE D'ADHÉRENT"); logger.info("req.session.adherent_type = " + req.session.adherent_type, { numsession: req.session.id }); // req.session.adherent_type est inscrit dans adhesionRouter.js if (req.session.adherent_type === "famille") { adherent_type = "famille"; } else if (req.session.adherent_type === "observateur") { adherent_type = "observateur"; logger.info("adherent_type in if observateur = " + adherent_type, { numsession: req.session.id }); } else { // req.session.adherent_type n'est pas inscrit dans adhesionRouter.js if (req.session.adherent_prof_instrument1 && !req.session.adherent_prof_stagiaire_instrument1 && !req.session.eleve_1_nom) { adherent_type = "professeur"; } if (req.session.adherent_prof_instrument1 && !req.session.adherent_prof_stagiaire_instrument1 && req.session.eleve_1_nom) { adherent_type = "prof_famille"; } if (req.session.adherent_prof_stagiaire_instrument1 && req.session.adherent_prof_stagiaire_instrument1 && !req.session.eleve_1_nom) { adherent_type = "prof_stagiaire"; } if (req.session.adherent_prof_stagiaire_instrument1 && req.session.adherent_prof_stagiaire_instrument1 && req.session.eleve_1_nom) { adherent_type = "prof_stagiaire_famille"; } if (!req.session.adherent_prof_instrument1 && req.session.adherent_prof_stagiaire_instrument1_esa == 'Niveau 1' && !req.session.adherent_prof_stagiaire_instrument2 && !req.session.eleve_1_nom) { adherent_type = "prof_stagiaire1"; } if (!req.session.adherent_prof_instrument1 && req.session.adherent_prof_stagiaire_instrument1_esa == 'Niveau 1' && !req.session.adherent_prof_stagiaire_instrument2 && req.session.eleve_1_nom) { adherent_type = "prof_stagiaire1_famille"; } } // req.session.adherent_type n'a pas pu être déterminé if (!adherent_type) { adherent_type = "non déterminé"; } req.session.adherent_type = adherent_type; logger.info("adherent_type : " + adherent_type, { numsession: req.session.id }); ///////////////////////////////////////////////// // DATE DE L'ADHÉSION let now = moment().format("YYYY-MM-DD HH:mm:ss"); ///////////////////////////////////////////////// // CALCUL DU PRIX if (adherent_type == "professeur" || adherent_type == "prof_famille" || adherent_type == "prof_stagiaire" || adherent_type == "prof_stagiaire_famille") { adherent_paiement_montant_adhesion = 42; }; if (adherent_type == "prof_stagiaire1" || adherent_type == "prof_stagiaire1_famille") { adherent_paiement_montant_adhesion = 22; }; if (adherent_type == "famille") { adherent_paiement_montant_adhesion = 22; }; if (adherent_type == "observateur") { adherent_paiement_montant_adhesion = 22; }; if (adherent_type == "non déterminé" || adherent_type == "") { adherent_paiement_montant_adhesion = 0; }; logger.info("CALCUL DU PRIX : " + adherent_paiement_montant_adhesion, { numsession: req.session.id }); //passer la variable dans la session pour la récupérer req.session.adherent_paiement_montant_adhesion = adherent_paiement_montant_adhesion; // REDIRECTION VERS LA PAGE PAIEMENT logger.info("REDIRECTION VERS LA PAGE PAIEMENT", { numsession: req.session.id }); return res.redirect('/adhesion/adhesion_paiement_total'); } else { logger.info("Identifiant vide, retour page accueil", { numsession: req.session.id }); req.session.err_mail_form_adhesion_1 = "La page a perdu les informations, veuillez les saisir de nouveau."; return res.redirect('/adhesion'); } } ///////////////////////////////////////////////// // AJOUR DU DON DANS LE MONTANT À PAYER ///////////////////////////////////////////////// const post_form_montant_total = async function(req, res){ logger.info("======================================"); logger.info("======== FUNCTION post_form_montant_total (adhesion) =========="); logger.info("======================================"); // MONTANT TOTAL À PAYER //let montant_adhesion = req.session.adherent_paiement_montant_adhesion; req.session.adherent_paiement_montant_don = req.body.adherent_paiement_montant_don; logger.info("req.body.adherent_paiement_montant_don: " + req.body.adherent_paiement_montant_don, { numsession: req.session.id }); logger.info("req.session.adherent_paiement_montant_adhesion: " + req.session.adherent_paiement_montant_adhesion, { numsession: req.session.id }); // parseInt pour rendre la variable en type interger et faire l'addition let montant_adhesion = parseInt(req.session.adherent_paiement_montant_adhesion); let montant_don = parseInt(req.session.adherent_paiement_montant_don); let montant_apayer; if (montant_don>0){ montant_apayer = montant_adhesion + montant_don; logger.info("if (montant_don>0)", { numsession: req.session.id }); } else { logger.info("montant_adhesion: " + montant_adhesion, { numsession: req.session.id }); montant_apayer = montant_adhesion; logger.info("else (montant_don>0)", { numsession: req.session.id }); }; req.session.montant_apayer = montant_apayer; logger.info("montant_apayer: " + montant_apayer, { numsession: req.session.id }); let montant_apayer_cent; montant_apayer_cent = montant_apayer * 100; req.session.montant_apayer_cent = montant_apayer_cent; logger.info("montant_apayer_cent: " + montant_apayer_cent, { numsession: req.session.id }); res.redirect('/adhesion/adhesion_paiement_mode_paiement'); } ///////////////////////////////////////////////// // PAGE FINALE PAIEMENT PAR CHÈQUE ///////////////////////////////////////////////// const post_paiement_cheque_save = async function(req, res){ logger.info("======================================"); logger.info("======== FUNCTION post_paiement_cheque_save (adhesion) =========="); logger.info("======================================"); //////////////////////////////////////////////////// // CONNECTION ADOBE API //////////////////////////////////////////////////// const credentials = PDFServicesSdk.Credentials .servicePrincipalCredentialsBuilder() .withClientId(process.env.PDF_SERVICES_CLIENT_ID) .withClientSecret(process.env.PDF_SERVICES_CLIENT_SECRET) .build(); //timeout Default: 10000 const clientConfig = PDFServicesSdk.ClientConfig .clientConfigBuilder() .withConnectTimeout(20000) .withReadTimeout(40000) .build(); // Create an ExecutionContext using credentials const executionContext = PDFServicesSdk.ExecutionContext.create(credentials); ///////////////////////////////////////////////// // DATE DE L'ADHÉSION let now = moment().format("YYYY-MM-DD HH:mm:ss"); let now_pdf = moment().format("YYYY-MM-DDTHH-mm-ss"); ////////////////////////////////////////////////////////////////////////////// // RÉCUPÉRATION DES DONNÉES DU FORMULAIRE DANS LA SESSION EN COURS req.session.adherent_paiement_cheque_banque = req.body.adherent_paiement_cheque_banque; req.session.adherent_paiement_cheque_numero = req.body.adherent_paiement_cheque_numero; ////////////////////////////////////////////////////////////////////////////// // DÉFINIR LE PROFIL À AJOUTER DANS LA CARTE ADHÉRENT // La fonction est dans le fichier /modules/adherent_type.js let profils = carte_adherent.profil(adherent_type); let profil1 = profils[0]; let profil2 = profils[1]; let profil3 = profils[2]; req.session.profil1 = profil1; req.session.profil2 = profil2; req.session.profil3 = profil3; ////////////////////////////////////////////////////////////////////////////// // MISE À JOUR DES INFORMATIONS SUR LE PAIEMENT DANS LA BASE DE DONNÉES // Vérifier que la session n'a pas expiré if (req.session.identifiant) { try { const db_connection_promise = await mysql_promise.createConnection({ host: process.env.db_connection_host, port: process.env.db_connection_port, user: process.env.db_connection_user, password: process.env.db_connection_password, database: process.env.db_connection_database }); logger.info("======================================", { label: filename }); logger.info("Connected TO DATABASE test with mysql2 PREMISE !", { label: filename }); logger.info("======================================", { label: filename }); ///////////////////////////////////////////////// // VÉRIFICATION DANS LA BD SI IDENTIFIANT DÉJÀ INSCRIT OU NON let sql = 'select identifiant from adherent where identifiant = "' + req.session.identifiant + '" AND saison = "2025/2026"'; logger.info("REQUETE SQL SELECT identifiant from adherent : " + sql , { numsession: req.session.id, label: filename}); try { const [results, fields] = await db_connection_promise.execute(sql); console.log(results); logger.info("Nombre de lignes trouvées avec cet identifiant = " + results.length, { numsession: req.session.id, label: filename}); if (results.length) { // IDENTIFIANT DÉJA INSCRIT // METTRE Â JOUR l'EXISTANT au cas où il ait modifié des informations logger.info("// IDENTIFIANT DÉJA INSCRIT", { numsession: req.session.id, label: filename}); // affichage message erreur logger.info("identifiant déjà inscrit", { numsession: req.session.id, label: filename}); req.session.err_mail_form_adhesion_1 = "Cette adresse Email est déjà inscrite pour les adhésions 2025/2026."; req.session.err_mail_form_adhesion_2 = "Si vous n'aviez pas pu finaliser votre paiement veuillez nous envoyer un chèque ou un virement."; req.session.err_mail_form_adhesion_3 = "Pour tout problème veuillez contacter l’Association."; // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur await db_connection_promise.end(); res.redirect('/adhesion'); } else { // IDENTIFIANT NON TROUVÉ // AJOUTER UNE LIGNE DANS LA TABLE adhrent logger.info("// NON TROUVÉ => AJOUTER UNE LIGNE DANS LA TABLE", { numsession: req.session.id, label: filename}); let sql2 = 'INSERT INTO '; sql2 += 'adherent'; sql2 += ' ('; sql2 += 'date_maj, '; sql2 += 'saison, '; sql2 += 'identifiant, '; sql2 += 'association_suzuki, '; sql2 += 'adherent_type, '; sql2 += 'adherent_nom, '; sql2 += 'adherent_prenom, '; sql2 += 'adherent_mail, '; sql2 += 'adherent_adresse_rue, '; sql2 += 'adherent_adresse_complement, '; sql2 += 'adherent_adresse_codepostal, '; sql2 += 'adherent_adresse_ville, '; sql2 += 'adherent_adresse_pays, '; sql2 += 'adherent_telephone_mobile, '; sql2 += 'adherent_telephone_fixe, '; sql2 += 'carte_envoi'; sql2 += ') VALUES ('; sql2 += '"'+ now +'",'; sql2 += '"2025/2026",'; sql2 += '"'+ req.session.identifiant +'",'; sql2 += '"AFPS",'; sql2 += '"'+ adherent_type +'",'; sql2 += '"'+ req.session.adherent_nom +'",'; sql2 += '"'+ req.session.adherent_prenom +'",'; sql2 += '"'+ req.session.identifiant +'",'; sql2 += '"'+ req.session.adherent_adresse_rue +'",'; sql2 += '"'+ req.session.adherent_adresse_complement +'",'; sql2 += '"'+ req.session.adherent_adresse_codepostal +'",'; sql2 += '"'+ req.session.adherent_adresse_ville +'",'; sql2 += '"'+ req.session.adherent_adresse_pays +'",'; sql2 += '"'+ req.session.adherent_telephone_mobile +'",'; sql2 += '"'+ req.session.adherent_telephone_fixe +'", '; sql2 += '"temporaire"'; sql2 += ')'; logger.info("REQUETE SQL INSERT INTO adherent : " + sql2 , { numsession: req.session.id, label: filename}); // AJOUTER L'ADHÉRENT DANS LA TABLE adherent try { // AJOUTER UNE LIGNE DANS LA TABLE adhrent const [results, fields] = await db_connection_promise.execute(sql2); logger.info("ADHÉRENTS Row ID added : " + results.insertId, { numsession: req.session.id, label: filename}); } catch (error) { // Echec de la requête console.log(error); logger.error("Il y a un problème avec la requête INSERT INTO adherent! : " + error, { numsession: req.session.id }); req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur await db_connection_promise.end(); res.redirect('/adhesion'); } // AJOUTER LES ÉLÈVES DANS LA TABLE adherent_eleve for (let i=1; i<6; i++) { if (req.session["eleve_"+i+"_nom"]) { let sql3 = 'INSERT INTO '; sql3 += 'adherent_eleve'; sql3 += ' ('; sql3 += 'date_maj, '; sql3 += 'saison, '; sql3 += 'identifiant, '; sql3 += 'association_suzuki, '; sql3 += 'eleve_nom, '; sql3 += 'eleve_prenom, '; sql3 += 'adherent_mail, '; sql3 += 'adherent_telephone_mobile, '; sql3 += 'eleve_datenaissance, '; sql3 += 'eleve_instrumentA, '; sql3 += 'eleve_instrumentA_cahier, '; sql3 += 'eleve_instrumentA_prof, '; sql3 += 'eleve_instrumentB, '; sql3 += 'eleve_instrumentB_cahier, '; sql3 += 'eleve_instrumentB_prof, '; sql3 += 'eleve_droitimage, '; sql3 += 'eleve_contactsup_nom, '; sql3 += 'eleve_contactsup_prenom, '; sql3 += 'eleve_contactsup_mail'; sql3 += ') VALUES ('; sql3 += '"'+ now +'",'; sql3 += '"2025/2026",'; sql3 += '"'+ req.session.identifiant +'",'; sql3 += '"AFPS",'; sql3 += '"'+ req.session["eleve_"+i+"_nom"] +'",'; sql3 += '"'+ req.session["eleve_"+i+"_prenom"] +'",'; sql3 += '"'+ req.session.identifiant +'",'; sql3 += '"'+ req.session.adherent_telephone_mobile +'",'; sql3 += '"'+ req.session["eleve_"+i+"_datenaissance"] +'",'; sql3 += '"'+ req.session["eleve_"+i+"_instrumentA"] +'",'; sql3 += '"'+ req.session["eleve_"+i+"_instrumentA_cahier"] +'",'; sql3 += '"'+ req.session["eleve_"+i+"_instrumentA_prof"] +'",'; sql3 += '"'+ req.session["eleve_"+i+"_instrumentB"] +'",'; sql3 += '"'+ req.session["eleve_"+i+"_instrumentB_cahier"] +'",'; if (req.session["eleve_"+i+"_instrumentB_prof"]==undefined){req.session["eleve_"+i+"_instrumentB_prof"]=""}; sql3 += '"'+ req.session["eleve_"+i+"_instrumentB_prof"] +'",'; sql3 += '"'+ req.session["eleve_"+i+"_droitimage"] +'",'; sql3 += '"'+ req.session["eleve_"+i+"_contactsup_nom"] +'",'; sql3 += '"'+ req.session["eleve_"+i+"_contactsup_prenom"] +'",'; sql3 += '"'+ req.session["eleve_"+i+"_contactsup_mail"] +'"'; sql3 += ')'; logger.info("REQUETE SQL INSERT INTO adherent_eleve : " + sql3, { numsession: req.session.id, label: filename}); try { const [results, fields] = await db_connection_promise.execute(sql3); logger.info("ADHÉRENTS Row ID added : " + results.insertId, { numsession: req.session.id, label: filename}); } catch (error) { // Echec de la requête console.log(error); logger.error("Il y a un problème avec la requête INSERT INTO adherent_eleve! : " + error, { numsession: req.session.id }); req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur await db_connection_promise.end(); res.redirect('/adhesion'); } } } // AJOUTER LE PROFESSEUR DANS LA TABLE adherent_professeur if (req.session.adherent_prof_instrument1) { let sql4 = 'INSERT INTO '; sql4 += 'adherent_professeur'; sql4 += ' ('; sql4 += 'date_maj, '; sql4 += 'saison, '; sql4 += 'identifiant, '; sql4 += 'association_suzuki, '; sql4 += 'adherent_nom, '; sql4 += 'adherent_prenom, '; sql4 += 'adherent_mail, '; sql4 += 'adherent_telephone_mobile, '; sql4 += 'adherent_prof_instrument1, '; sql4 += 'adherent_prof_instrument1_esa, '; sql4 += 'adherent_prof_instrument2, '; sql4 += 'adherent_prof_instrument2_esa, '; sql4 += 'adherent_prof_sece, '; sql4 += 'adherent_prof_ecole1, '; sql4 += 'adherent_prof_ecole1_mail, '; sql4 += 'adherent_prof_ecole1_web, '; sql4 += 'adherent_prof_ecole1_adresse, '; sql4 += 'adherent_prof_ecole1_cp, '; sql4 += 'adherent_prof_ecole1_ville, '; sql4 += 'adherent_prof_ecole1_region, '; sql4 += 'adherent_prof_ecole2, '; sql4 += 'adherent_prof_ecole2_mail, '; sql4 += 'adherent_prof_ecole2_web, '; sql4 += 'adherent_prof_ecole2_adresse, '; sql4 += 'adherent_prof_ecole2_cp, '; sql4 += 'adherent_prof_ecole2_ville, '; sql4 += 'adherent_prof_ecole2_region, '; sql4 += 'adherent_prof_ecole3, '; sql4 += 'adherent_prof_ecole3_mail, '; sql4 += 'adherent_prof_ecole3_web, '; sql4 += 'adherent_prof_ecole3_adresse, '; sql4 += 'adherent_prof_ecole3_cp, '; sql4 += 'adherent_prof_ecole3_ville, '; sql4 += 'adherent_prof_ecole3_region'; sql4 += ') VALUES ('; sql4 += '"'+ now +'",'; sql4 += '"2025/2026",'; sql4 += '"'+ req.session.identifiant +'",'; sql4 += '"AFPS",'; sql4 += '"'+ req.session.adherent_nom +'",'; sql4 += '"'+ req.session.adherent_prenom +'",'; sql4 += '"'+ req.session.identifiant +'",'; sql4 += '"'+ req.session.adherent_telephone_mobile +'",'; sql4 += '"'+ req.session.adherent_prof_instrument1 +'",'; sql4 += '"'+ req.session.adherent_prof_instrument1_esa +'",'; sql4 += '"'+ req.session.adherent_prof_instrument2 +'",'; sql4 += '"'+ req.session.adherent_prof_instrument2_esa +'",'; sql4 += '"'+ req.session.adherent_prof_sece +'",'; sql4 += '"'+ req.session.adherent_prof_ecole1 +'",'; sql4 += '"'+ req.session.adherent_prof_ecole1_mail +'",'; sql4 += '"'+ req.session.adherent_prof_ecole1_web +'",'; sql4 += '"'+ req.session.adherent_prof_ecole1_adresse +'",'; sql4 += '"'+ req.session.adherent_prof_ecole1_cp +'",'; sql4 += '"'+ req.session.adherent_prof_ecole1_ville +'",'; sql4 += '"'+ req.session.adherent_prof_ecole1_region +'",'; sql4 += '"'+ req.session.adherent_prof_ecole2 +'",'; sql4 += '"'+ req.session.adherent_prof_ecole2_mail +'",'; sql4 += '"'+ req.session.adherent_prof_ecole2_web +'",'; sql4 += '"'+ req.session.adherent_prof_ecole2_adresse +'",'; sql4 += '"'+ req.session.adherent_prof_ecole2_cp +'",'; sql4 += '"'+ req.session.adherent_prof_ecole2_ville +'",'; sql4 += '"'+ req.session.adherent_prof_ecole2_region +'",'; sql4 += '"'+ req.session.adherent_prof_ecole3 +'",'; sql4 += '"'+ req.session.adherent_prof_ecole3_mail +'",'; sql4 += '"'+ req.session.adherent_prof_ecole3_web +'",'; sql4 += '"'+ req.session.adherent_prof_ecole3_adresse +'",'; sql4 += '"'+ req.session.adherent_prof_ecole3_cp +'",'; sql4 += '"'+ req.session.adherent_prof_ecole3_ville +'",'; sql4 += '"'+ req.session.adherent_prof_ecole3_region +'"'; sql4 += ')'; logger.info("REQUETE SQL INSERT INTO adherent_professeur : " + sql4, { numsession: req.session.id, label: filename}); try { // AJOUTER UNE LIGNE DANS LA TABLE adherent_professeur const [results, fields] = await db_connection_promise.execute(sql4); logger.info("PROFESSEUR Row ID added : " + results.insertId, { numsession: req.session.id, label: filename}); } catch (error) { // Echec de la requête console.log(error); logger.error("Il y a un problème avec la requête INSERT INTO adherent_professeur! : " + error, { numsession: req.session.id }); req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur await db_connection_promise.end(); res.redirect('/adhesion'); } } // AJOUTER LE PROFESSEUR EN FORMATION DANS LA TABLE adherent_formation_prof if (req.session.adherent_prof_stagiaire_instrument1) { let sql5 = 'INSERT INTO '; sql5 += 'adherent_formation_prof'; sql5 += ' ('; sql5 += 'date_maj, '; sql5 += 'saison, '; sql5 += 'identifiant, '; sql5 += 'association_suzuki, '; sql5 += 'adherent_nom, '; sql5 += 'adherent_prenom, '; sql5 += 'adherent_mail, '; sql5 += 'adherent_telephone_mobile, '; sql5 += 'adherent_prof_stagiaire_instrument1, '; sql5 += 'adherent_prof_stagiaire_instrument1_esa, '; sql5 += 'adherent_prof_stagiaire_instrument1_prof, '; sql5 += 'adherent_prof_stagiaire_instrument2, '; sql5 += 'adherent_prof_stagiaire_instrument2_esa, '; sql5 += 'adherent_prof_stagiaire_instrument2_prof'; sql5 += ') VALUES ('; sql5 += '"'+ now +'",'; sql5 += '"2025/2026",'; sql5 += '"'+ req.session.identifiant +'",'; sql5 += '"AFPS",'; sql5 += '"'+ req.session.adherent_nom +'",'; sql5 += '"'+ req.session.adherent_prenom +'",'; sql5 += '"'+ req.session.identifiant +'",'; sql5 += '"'+ req.session.adherent_telephone_mobile +'",'; sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument1 +'",'; sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument1_esa +'",'; sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument1_prof +'",'; sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument2 +'",'; sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument2_esa +'",'; if (req.session.adherent_prof_stagiaire_instrument2_prof==undefined) {req.session.adherent_prof_stagiaire_instrument2_prof = ""}; sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument2_prof +'"'; sql5 += ')'; logger.info("====== REQUETE SQL INSERT INTO adherent_formation_prof : ", { numsession: req.session.id, label: filename}); logger.info(sql5, { numsession: req.session.id, label: filename}); logger.info("=========================================================", { numsession: req.session.id, label: filename}); try { // AJOUTER UNE LIGNE DANS LA TABLE adherent_professeur const [results, fields] = await db_connection_promise.execute(sql5); logger.info("PROFESSEUR EN FORMATION Row ID added : " + results.insertId, { numsession: req.session.id, label: filename}); } catch (error) { // Echec de la requête console.log(error); logger.error("Il y a un problème avec la requête INSERT INTO adherent_formation_prof! : " + error, { numsession: req.session.id }); req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur await db_connection_promise.end(); res.redirect('/adhesion'); } } } } catch (error) { // Echec de la requête console.log(error); logger.error("Il y a un problème avec la requête select identifiant from adherent! : " + error, { numsession: req.session.id }); req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur await db_connection_promise.end(); res.redirect('/adhesion'); }; // METTRE À JOUR LES INFOS DE PAIEMENT DANS adherent_finance let sql6 = 'INSERT INTO '; sql6 += 'adherent_finance'; sql6 += ' ('; sql6 += 'date_maj, '; sql6 += 'saison, '; sql6 += 'identifiant, '; sql6 += 'association_suzuki, '; sql6 += 'adherent_type, '; sql6 += 'adherent_nom, '; sql6 += 'adherent_prenom, '; sql6 += 'adherent_telephone_mobile, '; sql6 += 'adherent_mail, '; sql6 += 'montant_adhesion, '; sql6 += 'montant_don, '; sql6 += 'montant_total, '; sql6 += 'paiement_mode, '; sql6 += 'statut_paiement'; sql6 += ') VALUES ('; sql6 += '"'+ now +'",'; sql6 += '"2025/2026",'; sql6 += '"'+ req.session.identifiant +'",'; sql6 += '"AFPS",'; sql6 += '"'+ adherent_type +'",'; sql6 += '"'+ req.session.adherent_nom +'",'; sql6 += '"'+ req.session.adherent_prenom +'",'; sql6 += '"'+ req.session.adherent_telephone_mobile +'",'; sql6 += '"'+ req.session.identifiant +'",'; if (req.session.adherent_paiement_montant_adhesion == "" || req.session.adherent_paiement_montant_adhesion == "undefined" || !req.session.adherent_paiement_montant_adhesion) {req.session.adherent_paiement_montant_adhesion = 0}; sql6 += '"'+ req.session.adherent_paiement_montant_adhesion +'",'; if (req.session.adherent_paiement_montant_don == "" || req.session.adherent_paiement_montant_don == "undefined" || !req.session.adherent_paiement_montant_don) {req.session.adherent_paiement_montant_don = 0}; sql6 += '"'+ req.session.adherent_paiement_montant_don +'",'; if (req.session.montant_apayer == "" || req.session.montant_apayer == "undefined" || !req.session.montant_apayer) {req.session.montant_apayer = 0}; sql6 += '"'+ req.session.montant_apayer +'",'; sql6 += '"cheque",'; sql6 += '"attente"'; sql6 += ')'; logger.info("REQUETE SQL UPDATE adherent_finance : " + sql6 , { numsession: req.session.id, label: filename}); try { // METTRE À JOUR LES INFOS DE PAIEMENT DANS adherent_finance const [results, fields] = await db_connection_promise.execute(sql6); logger.info("adherent_finance Row ID added : " + results.insertId, { numsession: req.session.id, label: filename}); } catch (error) { // Echec de la requête console.log(error); logger.error("Il y a un problème avec la requête INSERT INTO adherent_finance! : " + error, { numsession: req.session.id }); req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur await db_connection_promise.end(); res.redirect('/adhesion'); } } catch (error) { // Echec de connection à la BD logger.error("Il y a un problème avec la connection à la base de données! : " + error, { numsession: req.session.id }); req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur await db_connection_promise.end(); res.redirect('/adhesion'); }; } else { // les Infos de session ne sont plus dispo logger.info("les Infos de session ne sont plus dispo! : ", { numsession: req.session.id }); req.session.err_mail_form_adhesion_1 = "La session a expiré."; req.session.err_mail_form_adhesion_2 = "Si vous n'aviez pas pu finaliser votre paiement veuillez nous envoyer un chèque ou un virement."; req.session.err_mail_form_adhesion_3 = "Pour tout problème veuillez contacter l’Association."; // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur res.redirect('/adhesion'); } ////////////////////////////////////////////////////////////////////////////// // ADOBE PDF : CRÉATION DE LA CARTE D'ADHÉSION TEMPORAIRE EN PDF let OUTPUT = path.resolve(__dirname, "../pdf/adhesion/2526/attente/")+"/"+req.session.identifiant+"_adhesion_2526_attente_"+now_pdf+".pdf"; let INPUT = path.resolve(__dirname, "../pdf/template/carte_adherent_temp.docx"); moment.locale('fr'); var date_formattee = moment().format('L') var today = date_formattee; if (profil2 == undefined) {profil2 = " "}; if (profil3 == undefined) {profil3 = " "}; JSON_INPUT = { "date": today, "identifiant": req.session.identifiant, "profil1": profil1, "profil2": profil2, "profil3": profil3, "montant": req.session.adherent_paiement_montant_adhesion }; const documentMerge = PDFServicesSdk.DocumentMerge, documentMergeOptions = documentMerge.options, adobe_options = new documentMergeOptions.DocumentMergeOptions(JSON_INPUT, documentMergeOptions.OutputFormat.PDF); // Create a new operation instance using the options instance. const documentMergeOperation = documentMerge.Operation.createNew(adobe_options); // Set operation input document template from a source file. const input = PDFServicesSdk.FileRef.createFromLocalFile(INPUT); documentMergeOperation.setInput(input); // Execute the operation and Save the result to the specified location. await documentMergeOperation .execute(executionContext) .then(result => result.saveAsFile(OUTPUT).then( ) ) .catch(err => { if(err instanceof PDFServicesSdk.Error.ServiceApiError || err instanceof PDFServicesSdk.Error.ServiceUsageError) { console.log('Exception encountered while executing ADOBE PDF', err); } else { console.log('Exception encountered while executing ADOBE PDF', err); } }); ////////////////////////////////////////////////////////////////////////////// // ENVOIE CARTE ADHERENT TEMPORAIRE PAR MAIL logger.info("MAIL ENVOI AVANT", { numsession: req.session.id }); var transporter = nodemailer.createTransport({ service: 'gmail', auth: { user: process.env.nodemailer_user, pass: process.env.nodemailer_pass } }); var attachment_name = req.session.identifiant; attachment_name += "_adhesion_2526_carteadherent_temporaire.pdf"; var mail_objet = "ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI - ADHÉSION 2025/2026 - "; mail_objet += req.session.identifiant; mail_html = "

Cher adhérent,

Félicitations ! Dès que votre paiement sera validé, vous serez membre de l’Association Française pour la Pédagogie Suzuki (http://www.afpedagogiesuzuki.fr) et de l’European Suzuki Association (https://europeansuzuki.org).
Vous pourrez à ce titre participer à tous les événements Suzuki en France et dans le monde.

Vous trouverez en pièce jointe votre carte d'adhésion annuelle 2025/2026 temporaire.

Votre identifiant est "; mail_html += req.session.identifiant; mail_html += ".

Veuillez noter que votre adhésion ne sera effective qu'à la réception de votre règlement de "; mail_html += req.session.adherent_paiement_montant_adhesion; mail_html += " euros.
"; if (req.session.adherent_paiement_montant_don > 0) { mail_html += "Nous vous remercions pour votre proposition de don de "; mail_html += req.session.adherent_paiement_montant_don; mail_html += " euros que vous pouvez ajouter à votre règlement."; } mail_html += "


Nous vous remercions pour votre intérêt et vous souhaitons une très belle année en musique !

Association Française pour la pédagogie Suzuki
Chez Anne PAGES
30 rue des Tattes
74500 PUBLIER

"; var mailOptions = { from: 'afps.inscription@gmail.com', to: req.session.identifiant, subject: mail_objet, html: mail_html, attachments: [{ filename: attachment_name, path: OUTPUT }], }; transporter.sendMail(mailOptions, function(error, info){ if (error) { logger.info("error" + error, { numsession: req.session.id }); } else { logger.info("Email envoyé: " + info.response, { numsession: req.session.id }); } }); logger.info("MAIL ENVOI APRES", { numsession: req.session.id }); // REDIRECTION VERS LA PAGE DE CONFIRMATION PAIEMENT VIREMENT res.locals.today = date_formattee; res.redirect('/adhesion/adhesion_paiement/attente'); } ///////////////////////////////////////////////// // PAGE FINALE PAIEMENT PAR VIREMENT ///////////////////////////////////////////////// const post_paiement_virement_save = async function(req, res){ logger.info("======================================"); logger.info("======== FUNCTION post_paiement_virement_save (adhesion) =========="); logger.info("======================================"); //////////////////////////////////////////////////// // CONNECTION ADOBE API //////////////////////////////////////////////////// const credentials = PDFServicesSdk.Credentials .servicePrincipalCredentialsBuilder() .withClientId(process.env.PDF_SERVICES_CLIENT_ID) .withClientSecret(process.env.PDF_SERVICES_CLIENT_SECRET) .build(); //timeout Default: 10000 const clientConfig = PDFServicesSdk.ClientConfig .clientConfigBuilder() .withConnectTimeout(20000) .withReadTimeout(40000) .build(); // Create an ExecutionContext using credentials const executionContext = PDFServicesSdk.ExecutionContext.create(credentials); req.session.adherent_paiement_mode = "virement"; ///////////////////////////////////////////////// // DATE DE L'ADHÉSION let now = moment().format("YYYY-MM-DD HH:mm:ss"); let now_pdf = moment().format("YYYY-MM-DDTHH-mm-ss"); ////////////////////////////////////////////////////////////////////////////// // DÉFINIR LE PROFIL À AJOUTER DANS LA CARTE ADHÉRENT // La fonction est dans le fichier /modules/adherent_type.js let profils = carte_adherent.profil(adherent_type); let profil1 = profils[0]; let profil2 = profils[1]; let profil3 = profils[2]; req.session.profil1 = profil1; req.session.profil2 = profil2; req.session.profil3 = profil3; ////////////////////////////////////////////////////////////////////////////// // MISE À JOUR DES INFORMATIONS SUR LE PAIEMENT DANS LA BASE DE DONNÉES adherent_finance // Vérifier que la session n'a pas expiré if (req.session.identifiant) { try { const db_connection_promise = await mysql_promise.createConnection({ host: process.env.db_connection_host, port: process.env.db_connection_port, user: process.env.db_connection_user, password: process.env.db_connection_password, database: process.env.db_connection_database }); logger.info("======================================", { label: filename }); logger.info("Connected TO DATABASE test with mysql2 PREMISE !", { label: filename }); logger.info("======================================", { label: filename }); ///////////////////////////////////////////////// // VÉRIFICATION DANS LA BD SI IDENTIFIANT DÉJÀ INSCRIT OU NON let sql = 'select identifiant from adherent where identifiant = "' + req.session.identifiant + '" AND saison = "2025/2026"'; logger.info("REQUETE SQL SELECT identifiant from adherent : " + sql , { numsession: req.session.id, label: filename}); try { const [results, fields] = await db_connection_promise.execute(sql); console.log(results); logger.info("Nombre de lignes trouvées avec cet identifiant = " + results.length, { numsession: req.session.id, label: filename}); if (results.length) { // IDENTIFIANT DÉJA INSCRIT // METTRE Â JOUR l'EXISTANT au cas où il ait modifié des informations logger.info("// IDENTIFIANT DÉJA INSCRIT", { numsession: req.session.id, label: filename}); // affichage message erreur logger.info("identifiant déjà inscrit", { numsession: req.session.id, label: filename}); req.session.err_mail_form_adhesion_1 = "Cette adresse Email est déjà inscrite pour les adhésions 2025/2026."; req.session.err_mail_form_adhesion_2 = "Si vous n'aviez pas pu finaliser votre paiement veuillez nous envoyer un chèque ou un virement."; req.session.err_mail_form_adhesion_3 = "Pour tout problème veuillez contacter l’Association."; // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur await db_connection_promise.end(); res.redirect('/adhesion'); } else { // IDENTIFIANT NON TROUVÉ // AJOUTER UNE LIGNE DANS LA TABLE adhrent logger.info("// NON TROUVÉ => AJOUTER UNE LIGNE DANS LA TABLE", { numsession: req.session.id, label: filename}); let sql2 = 'INSERT INTO '; sql2 += 'adherent'; sql2 += ' ('; sql2 += 'date_maj, '; sql2 += 'saison, '; sql2 += 'identifiant, '; sql2 += 'association_suzuki, '; sql2 += 'adherent_type, '; sql2 += 'adherent_nom, '; sql2 += 'adherent_prenom, '; sql2 += 'adherent_mail, '; sql2 += 'adherent_adresse_rue, '; sql2 += 'adherent_adresse_complement, '; sql2 += 'adherent_adresse_codepostal, '; sql2 += 'adherent_adresse_ville, '; sql2 += 'adherent_adresse_pays, '; sql2 += 'adherent_telephone_mobile, '; sql2 += 'adherent_telephone_fixe, '; sql2 += 'carte_envoi'; sql2 += ') VALUES ('; sql2 += '"'+ now +'",'; sql2 += '"2025/2026",'; sql2 += '"'+ req.session.identifiant +'",'; sql2 += '"AFPS",'; sql2 += '"'+ adherent_type +'",'; sql2 += '"'+ req.session.adherent_nom +'",'; sql2 += '"'+ req.session.adherent_prenom +'",'; sql2 += '"'+ req.session.identifiant +'",'; sql2 += '"'+ req.session.adherent_adresse_rue +'",'; sql2 += '"'+ req.session.adherent_adresse_complement +'",'; sql2 += '"'+ req.session.adherent_adresse_codepostal +'",'; sql2 += '"'+ req.session.adherent_adresse_ville +'",'; sql2 += '"'+ req.session.adherent_adresse_pays +'",'; sql2 += '"'+ req.session.adherent_telephone_mobile +'",'; sql2 += '"'+ req.session.adherent_telephone_fixe +'", '; sql2 += '"temporaire"'; sql2 += ')'; logger.info("REQUETE SQL INSERT INTO adherent : " + sql2 , { numsession: req.session.id, label: filename}); // AJOUTER L'ADHÉRENT DANS LA TABLE adherent try { // AJOUTER UNE LIGNE DANS LA TABLE adhrent const [results, fields] = await db_connection_promise.execute(sql2); logger.info("ADHÉRENTS Row ID added : " + results.insertId, { numsession: req.session.id, label: filename}); } catch (error) { // Echec de la requête console.log(error); logger.error("Il y a un problème avec la requête INSERT INTO adherent! : " + error, { numsession: req.session.id }); req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur await db_connection_promise.end(); res.redirect('/adhesion'); } // AJOUTER LES ÉLÈVES DANS LA TABLE adherent_eleve for (let i=1; i<6; i++) { if (req.session["eleve_"+i+"_nom"]) { let sql3 = 'INSERT INTO '; sql3 += 'adherent_eleve'; sql3 += ' ('; sql3 += 'date_maj, '; sql3 += 'saison, '; sql3 += 'identifiant, '; sql3 += 'association_suzuki, '; sql3 += 'eleve_nom, '; sql3 += 'eleve_prenom, '; sql3 += 'adherent_mail, '; sql3 += 'adherent_telephone_mobile, '; sql3 += 'eleve_datenaissance, '; sql3 += 'eleve_instrumentA, '; sql3 += 'eleve_instrumentA_cahier, '; sql3 += 'eleve_instrumentA_prof, '; sql3 += 'eleve_instrumentB, '; sql3 += 'eleve_instrumentB_cahier, '; sql3 += 'eleve_instrumentB_prof, '; sql3 += 'eleve_droitimage, '; sql3 += 'eleve_contactsup_nom, '; sql3 += 'eleve_contactsup_prenom, '; sql3 += 'eleve_contactsup_mail'; sql3 += ') VALUES ('; sql3 += '"'+ now +'",'; sql3 += '"2025/2026",'; sql3 += '"'+ req.session.identifiant +'",'; sql3 += '"AFPS",'; sql3 += '"'+ req.session["eleve_"+i+"_nom"] +'",'; sql3 += '"'+ req.session["eleve_"+i+"_prenom"] +'",'; sql3 += '"'+ req.session.identifiant +'",'; sql3 += '"'+ req.session.adherent_telephone_mobile +'",'; sql3 += '"'+ req.session["eleve_"+i+"_datenaissance"] +'",'; sql3 += '"'+ req.session["eleve_"+i+"_instrumentA"] +'",'; sql3 += '"'+ req.session["eleve_"+i+"_instrumentA_cahier"] +'",'; sql3 += '"'+ req.session["eleve_"+i+"_instrumentA_prof"] +'",'; sql3 += '"'+ req.session["eleve_"+i+"_instrumentB"] +'",'; sql3 += '"'+ req.session["eleve_"+i+"_instrumentB_cahier"] +'",'; if (req.session["eleve_"+i+"_instrumentB_prof"]==undefined){req.session["eleve_"+i+"_instrumentB_prof"]=""}; sql3 += '"'+ req.session["eleve_"+i+"_instrumentB_prof"] +'",'; sql3 += '"'+ req.session["eleve_"+i+"_droitimage"] +'",'; sql3 += '"'+ req.session["eleve_"+i+"_contactsup_nom"] +'",'; sql3 += '"'+ req.session["eleve_"+i+"_contactsup_prenom"] +'",'; sql3 += '"'+ req.session["eleve_"+i+"_contactsup_mail"] +'"'; sql3 += ')'; logger.info("REQUETE SQL INSERT INTO adherent_eleve : " + sql3, { numsession: req.session.id, label: filename}); try { const [results, fields] = await db_connection_promise.execute(sql3); logger.info("ADHÉRENTS Row ID added : " + results.insertId, { numsession: req.session.id, label: filename}); } catch (error) { // Echec de la requête console.log(error); logger.error("Il y a un problème avec la requête INSERT INTO adherent_eleve! : " + error, { numsession: req.session.id }); req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur await db_connection_promise.end(); res.redirect('/adhesion'); } } } // AJOUTER LE PROFESSEUR DANS LA TABLE adherent_professeur if (req.session.adherent_prof_instrument1) { let sql4 = 'INSERT INTO '; sql4 += 'adherent_professeur'; sql4 += ' ('; sql4 += 'date_maj, '; sql4 += 'saison, '; sql4 += 'identifiant, '; sql4 += 'association_suzuki, '; sql4 += 'adherent_nom, '; sql4 += 'adherent_prenom, '; sql4 += 'adherent_mail, '; sql4 += 'adherent_telephone_mobile, '; sql4 += 'adherent_prof_instrument1, '; sql4 += 'adherent_prof_instrument1_esa, '; sql4 += 'adherent_prof_instrument2, '; sql4 += 'adherent_prof_instrument2_esa, '; sql4 += 'adherent_prof_sece, '; sql4 += 'adherent_prof_ecole1, '; sql4 += 'adherent_prof_ecole1_mail, '; sql4 += 'adherent_prof_ecole1_web, '; sql4 += 'adherent_prof_ecole1_adresse, '; sql4 += 'adherent_prof_ecole1_cp, '; sql4 += 'adherent_prof_ecole1_ville, '; sql4 += 'adherent_prof_ecole1_region, '; sql4 += 'adherent_prof_ecole2, '; sql4 += 'adherent_prof_ecole2_mail, '; sql4 += 'adherent_prof_ecole2_web, '; sql4 += 'adherent_prof_ecole2_adresse, '; sql4 += 'adherent_prof_ecole2_cp, '; sql4 += 'adherent_prof_ecole2_ville, '; sql4 += 'adherent_prof_ecole2_region, '; sql4 += 'adherent_prof_ecole3, '; sql4 += 'adherent_prof_ecole3_mail, '; sql4 += 'adherent_prof_ecole3_web, '; sql4 += 'adherent_prof_ecole3_adresse, '; sql4 += 'adherent_prof_ecole3_cp, '; sql4 += 'adherent_prof_ecole3_ville, '; sql4 += 'adherent_prof_ecole3_region'; sql4 += ') VALUES ('; sql4 += '"'+ now +'",'; sql4 += '"2025/2026",'; sql4 += '"'+ req.session.identifiant +'",'; sql4 += '"AFPS",'; sql4 += '"'+ req.session.adherent_nom +'",'; sql4 += '"'+ req.session.adherent_prenom +'",'; sql4 += '"'+ req.session.identifiant +'",'; sql4 += '"'+ req.session.adherent_telephone_mobile +'",'; sql4 += '"'+ req.session.adherent_prof_instrument1 +'",'; sql4 += '"'+ req.session.adherent_prof_instrument1_esa +'",'; sql4 += '"'+ req.session.adherent_prof_instrument2 +'",'; sql4 += '"'+ req.session.adherent_prof_instrument2_esa +'",'; sql4 += '"'+ req.session.adherent_prof_sece +'",'; sql4 += '"'+ req.session.adherent_prof_ecole1 +'",'; sql4 += '"'+ req.session.adherent_prof_ecole1_mail +'",'; sql4 += '"'+ req.session.adherent_prof_ecole1_web +'",'; sql4 += '"'+ req.session.adherent_prof_ecole1_adresse +'",'; sql4 += '"'+ req.session.adherent_prof_ecole1_cp +'",'; sql4 += '"'+ req.session.adherent_prof_ecole1_ville +'",'; sql4 += '"'+ req.session.adherent_prof_ecole1_region +'",'; sql4 += '"'+ req.session.adherent_prof_ecole2 +'",'; sql4 += '"'+ req.session.adherent_prof_ecole2_mail +'",'; sql4 += '"'+ req.session.adherent_prof_ecole2_web +'",'; sql4 += '"'+ req.session.adherent_prof_ecole2_adresse +'",'; sql4 += '"'+ req.session.adherent_prof_ecole2_cp +'",'; sql4 += '"'+ req.session.adherent_prof_ecole2_ville +'",'; sql4 += '"'+ req.session.adherent_prof_ecole2_region +'",'; sql4 += '"'+ req.session.adherent_prof_ecole3 +'",'; sql4 += '"'+ req.session.adherent_prof_ecole3_mail +'",'; sql4 += '"'+ req.session.adherent_prof_ecole3_web +'",'; sql4 += '"'+ req.session.adherent_prof_ecole3_adresse +'",'; sql4 += '"'+ req.session.adherent_prof_ecole3_cp +'",'; sql4 += '"'+ req.session.adherent_prof_ecole3_ville +'",'; sql4 += '"'+ req.session.adherent_prof_ecole3_region +'"'; sql4 += ')'; logger.info("REQUETE SQL INSERT INTO adherent_professeur : " + sql4, { numsession: req.session.id, label: filename}); try { // AJOUTER UNE LIGNE DANS LA TABLE adherent_professeur const [results, fields] = await db_connection_promise.execute(sql4); logger.info("PROFESSEUR Row ID added : " + results.insertId, { numsession: req.session.id, label: filename}); } catch (error) { // Echec de la requête console.log(error); logger.error("Il y a un problème avec la requête INSERT INTO adherent_professeur! : " + error, { numsession: req.session.id }); req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur await db_connection_promise.end(); res.redirect('/adhesion'); } } // AJOUTER LE PROFESSEUR EN FORMATION DANS LA TABLE adherent_formation_prof if (req.session.adherent_prof_stagiaire_instrument1) { let sql5 = 'INSERT INTO '; sql5 += 'adherent_formation_prof'; sql5 += ' ('; sql5 += 'date_maj, '; sql5 += 'saison, '; sql5 += 'identifiant, '; sql5 += 'association_suzuki, '; sql5 += 'adherent_nom, '; sql5 += 'adherent_prenom, '; sql5 += 'adherent_mail, '; sql5 += 'adherent_telephone_mobile, '; sql5 += 'adherent_prof_stagiaire_instrument1, '; sql5 += 'adherent_prof_stagiaire_instrument1_esa, '; sql5 += 'adherent_prof_stagiaire_instrument1_prof, '; sql5 += 'adherent_prof_stagiaire_instrument2, '; sql5 += 'adherent_prof_stagiaire_instrument2_esa, '; sql5 += 'adherent_prof_stagiaire_instrument2_prof'; sql5 += ') VALUES ('; sql5 += '"'+ now +'",'; sql5 += '"2025/2026",'; sql5 += '"'+ req.session.identifiant +'",'; sql5 += '"AFPS",'; sql5 += '"'+ req.session.adherent_nom +'",'; sql5 += '"'+ req.session.adherent_prenom +'",'; sql5 += '"'+ req.session.identifiant +'",'; sql5 += '"'+ req.session.adherent_telephone_mobile +'",'; sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument1 +'",'; sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument1_esa +'",'; sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument1_prof +'",'; sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument2 +'",'; sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument2_esa +'",'; if (req.session.adherent_prof_stagiaire_instrument2_prof==undefined) {req.session.adherent_prof_stagiaire_instrument2_prof = ""}; sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument2_prof +'"'; sql5 += ')'; logger.info("====== REQUETE SQL INSERT INTO adherent_formation_prof : ", { numsession: req.session.id, label: filename}); logger.info(sql5, { numsession: req.session.id, label: filename}); logger.info("=========================================================", { numsession: req.session.id, label: filename}); try { // AJOUTER UNE LIGNE DANS LA TABLE adherent_professeur const [results, fields] = await db_connection_promise.execute(sql5); logger.info("PROFESSEUR EN FORMATION Row ID added : " + results.insertId, { numsession: req.session.id, label: filename}); } catch (error) { // Echec de la requête console.log(error); logger.error("Il y a un problème avec la requête INSERT INTO adherent_formation_prof! : " + error, { numsession: req.session.id }); req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur await db_connection_promise.end(); res.redirect('/adhesion'); } } } } catch (error) { // Echec de la requête console.log(error); logger.error("Il y a un problème avec la requête select identifiant from adherent! : " + error, { numsession: req.session.id }); req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur await db_connection_promise.end(); res.redirect('/adhesion'); }; // METTRE À JOUR LES INFOS DE PAIEMENT DANS adherent_finance let sql6 = 'INSERT INTO '; sql6 += 'adherent_finance'; sql6 += ' ('; sql6 += 'date_maj, '; sql6 += 'saison, '; sql6 += 'identifiant, '; sql6 += 'association_suzuki, '; sql6 += 'adherent_type, '; sql6 += 'adherent_nom, '; sql6 += 'adherent_prenom, '; sql6 += 'adherent_telephone_mobile, '; sql6 += 'adherent_mail, '; sql6 += 'montant_adhesion, '; sql6 += 'montant_don, '; sql6 += 'montant_total, '; sql6 += 'paiement_mode, '; sql6 += 'statut_paiement'; sql6 += ') VALUES ('; sql6 += '"'+ now +'",'; sql6 += '"2025/2026",'; sql6 += '"'+ req.session.identifiant +'",'; sql6 += '"AFPS",'; sql6 += '"'+ adherent_type +'",'; sql6 += '"'+ req.session.adherent_nom +'",'; sql6 += '"'+ req.session.adherent_prenom +'",'; sql6 += '"'+ req.session.adherent_telephone_mobile +'",'; sql6 += '"'+ req.session.identifiant +'",'; if (req.session.adherent_paiement_montant_adhesion == "" || req.session.adherent_paiement_montant_adhesion == "undefined" || !req.session.adherent_paiement_montant_adhesion) {req.session.adherent_paiement_montant_adhesion = 0}; sql6 += '"'+ req.session.adherent_paiement_montant_adhesion +'",'; if (req.session.adherent_paiement_montant_don == "" || req.session.adherent_paiement_montant_don == "undefined" || !req.session.adherent_paiement_montant_don) {req.session.adherent_paiement_montant_don = 0}; sql6 += '"'+ req.session.adherent_paiement_montant_don +'",'; if (req.session.montant_apayer == "" || req.session.montant_apayer == "undefined" || !req.session.montant_apayer) {req.session.montant_apayer = 0}; sql6 += '"'+ req.session.montant_apayer +'",'; sql6 += '"virement",'; sql6 += '"attente"'; sql6 += ')'; logger.info("REQUETE SQL UPDATE adherent_finance : " + sql6 , { numsession: req.session.id, label: filename}); try { // METTRE À JOUR LES INFOS DE PAIEMENT DANS adherent_finance const [results, fields] = await db_connection_promise.execute(sql6); logger.info("adherent_finance Row ID added : " + results.insertId, { numsession: req.session.id, label: filename}); } catch (error) { // Echec de la requête console.log(error); logger.error("Il y a un problème avec la requête INSERT INTO adherent_finance! : " + error, { numsession: req.session.id }); req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur await db_connection_promise.end(); res.redirect('/adhesion'); } } catch (error) { // Echec de connection à la BD logger.error("Il y a un problème avec la connection à la base de données! : " + error, { numsession: req.session.id }); req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur await db_connection_promise.end(); res.redirect('/adhesion'); }; } else { // les Infos de session ne sont plus dispo logger.info("les Infos de session ne sont plus dispo! : ", { numsession: req.session.id }); req.session.err_mail_form_adhesion_1 = "La session a expiré."; req.session.err_mail_form_adhesion_2 = "Si vous n'aviez pas pu finaliser votre paiement veuillez nous envoyer un chèque ou un virement."; req.session.err_mail_form_adhesion_3 = "Pour tout problème veuillez contacter l’Association."; // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur res.redirect('/adhesion'); } ////////////////////////////////////////////////////////////////////////////// // ADOBE PDF : CRÉATION DE LA CARTE D'ADHÉSION TEMPORAIRE EN PDF let OUTPUT = path.resolve(__dirname, "../pdf/adhesion/2526/attente/")+"/"+req.session.identifiant+"_adhesion_2526_attente_"+now_pdf+".pdf"; let INPUT = path.resolve(__dirname, "../pdf/template/carte_adherent_temp.docx"); moment.locale('fr'); var date_formattee = moment().format('L') var today = date_formattee; if (profil2 == undefined) {profil2 = " "}; if (profil3 == undefined) {profil3 = " "}; JSON_INPUT = { "date": today, "identifiant": req.session.identifiant, "profil1": profil1, "profil2": profil2, "profil3": profil3, "montant": req.session.adherent_paiement_montant_adhesion }; const documentMerge = PDFServicesSdk.DocumentMerge, documentMergeOptions = documentMerge.options, adobe_options = new documentMergeOptions.DocumentMergeOptions(JSON_INPUT, documentMergeOptions.OutputFormat.PDF); // Create a new operation instance using the options instance. const documentMergeOperation = documentMerge.Operation.createNew(adobe_options); // Set operation input document template from a source file. const input = PDFServicesSdk.FileRef.createFromLocalFile(INPUT); documentMergeOperation.setInput(input); // Execute the operation and Save the result to the specified location. await documentMergeOperation .execute(executionContext) .then(result => result.saveAsFile(OUTPUT).then( ) ) .catch(err => { if(err instanceof PDFServicesSdk.Error.ServiceApiError || err instanceof PDFServicesSdk.Error.ServiceUsageError) { console.log('Exception encountered while executing ADOBE PDF', err); } else { console.log('Exception encountered while executing ADOBE PDF', err); } }); ////////////////////////////////////////////////////////////////////////////// // ENVOIE CARTE ADHERENT TEMPORAIRE PAR MAIL console.log("MAIL ENVOI AVANT"); var transporter = nodemailer.createTransport({ service: 'gmail', auth: { user: process.env.nodemailer_user, pass: process.env.nodemailer_pass } }); var attachment_name = req.session.identifiant; attachment_name += "_adhesion_2526_carteadherent_temporaire.pdf"; var mail_objet = "ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI- ADHÉSION 2025/2026 - "; mail_objet += req.session.identifiant; mail_html = "

Cher adhérent,

Félicitations ! Dès que votre paiement sera validé, vous serez membre de l’Association Française pour la Pédagogie Suzuki (http://www.afpedagogiesuzuki.fr) et de l’European Suzuki Association (https://europeansuzuki.org).
Vous pourrez à ce titre participer à tous les événements Suzuki en France et dans le monde.

Vous trouverez en pièce jointe votre carte d'adhésion annuelle 2025/2026 temporaire.

Votre identifiant est "; mail_html += req.session.identifiant; mail_html += ".

Veuillez toutefois noter que votre adhésion ne sera effective qu'à la réception de votre règlement de "; mail_html += req.session.adherent_paiement_montant_adhesion; mail_html += " euros.
"; if (req.session.adherent_paiement_montant_don > 0) { mail_html += "Merci pour votre proposition de don de "; mail_html += req.session.adherent_paiement_montant_don; mail_html += " euros que vous pouvez ajouter à votre règlement."; } mail_html += "


Nous vous remercions pour votre intérêt et vous souhaitons une très belle année en musique!

Association Française pour la pédagogie Suzuki
Chez Anne PAGES
30 rue des Tattes
74500 PUBLIER

"; var mailOptions = { from: 'afps.inscription@gmail.com', to: req.session.identifiant, subject: mail_objet, html: mail_html, attachments: [{ filename: attachment_name, path: OUTPUT }], }; transporter.sendMail(mailOptions, function(error, info){ if (error) { logger.info("error" + error, { numsession: req.session.id }); } else { console.log('Email sent: ' + info.response); } }); console.log("MAIL ENVOI APRES"); ////////////////////////////////////////////////////////////////////////////// // REDIRECTION VERS LA PAGE DE CONFIRMATION PAIEMENT VIREMENT res.locals.today = date_formattee; res.redirect('/adhesion/adhesion_paiement/attente'); } ///////////////////////////////////////////////// // REQUÈTE VERS LE PAIEMENT STRIPE // OUVERTURE SESSION STRIPE ///////////////////////////////////////////////// const post_req_bank = async function(req, res, next) { logger.info("======================================"); logger.info("======== FUNCTION post_req_bank (adhesion) =========="); logger.info("======================================"); ///////////////////////////////////////////////// // DATE DE L'ADHÉSION let now = moment().format("YYYY-MM-DD HH:mm:ss"); logger.info("req.session.montant_apayer_cent: " + req.session.montant_apayer_cent, { numsession: req.session.id }); logger.info("req.session.identifiant : " + req.session.identifiant, { numsession: req.session.id }); logger.info("req.session.adherent_type : " + req.session.adherent_type, { numsession: req.session.id }); ///////////////////////////////////////////////// // STRIPE - ETAPE 1 - CREER l'INTENTION DE PAIEMENT const session = await stripe.checkout.sessions.create({ metadata: {identifiant: req.session.identifiant, profil:req.session.adherent_type, adherent_paiement_montant_adhesion:adherent_paiement_montant_adhesion, adherent_paiement_montant_don:req.session.adherent_paiement_montant_don, adherent_nom:req.session.adherent_nom, adherent_prenom:req.session.adherent_prenom, adherent_adresse_rue:req.session.adherent_adresse_rue, adherent_adresse_codepostal:req.session.adherent_adresse_codepostal, adherent_adresse_ville:req.session.adherent_adresse_ville,}, customer_email: req.session.identifiant, submit_type: 'pay', success_url: process.env.STRIPE_SUCCESSURL, cancel_url: process.env.STRIPE_CANCELURL, payment_method_types: ['card'], line_items: [{ price_data: { currency: 'eur', product_data: { name: 'Adhesion annuelle ' + req.session.adherent_type, }, unit_amount: req.session.adherent_paiement_montant_adhesion * 100, }, quantity: 1, }, { price_data: { currency: 'eur', product_data: { name: 'Don', }, unit_amount: req.session.adherent_paiement_montant_don * 100, }, quantity: 1, }], //Checkout has three modes: payment, subscription, or setup. mode: 'payment' }); ///////////////////////////////////////////////// // STRIPE - ETAPE 2 - RÉCUPÉRATION DES DONNÉES DE LA SESSION ET ENVOYER LE PAIEMENT // DANS LES INFOS DE LA SESSION ON A l'URL DE PAIEMENT POUR CETTE SESSION AVEC LE ID DE CE PAIEMENT DONNÉE PAR STRIPE EN RETOUR DE L'intention // POUR RÉCUPÉRER LES INFOS DE SESSION ON UTILISE "session.[nom de la données]" logger.info("session.url: " + session.url, { numsession: req.session.id }); // ON REDIRIGE L'INTERNAUTE VERS L'URL STRIPE POUR QU'IL FASSE LE PAIEMENT // POUR LE RETOUR C'EST DANS LES URL success_url et cancel_url sur lesquelles on fait un get dans le js du router et on fait un script // pour continuer le process et récupérer les infos contenues dans le get et envoyé par Stripe, comme par ex le code retour de la banque ////////////////////////////////////////////////////////////////////////////// // MISE À JOUR DES INFORMATIONS SUR LE PAIEMENT DANS LA BASE DE DONNÉES adherent_finance // Vérifier que la session n'a pas expiré if (req.session.identifiant) { try { const db_connection_promise = await mysql_promise.createConnection({ host: process.env.db_connection_host, port: process.env.db_connection_port, user: process.env.db_connection_user, password: process.env.db_connection_password, database: process.env.db_connection_database }); logger.info("======================================", { label: filename }); logger.info("Connected TO DATABASE test with mysql2 PREMISE !", { label: filename }); logger.info("======================================", { label: filename }); ///////////////////////////////////////////////// // VÉRIFICATION DANS LA BD SI IDENTIFIANT DÉJÀ INSCRIT OU NON let sql = 'select identifiant from adherent where identifiant = "' + req.session.identifiant + '" AND saison = "2025/2026"'; logger.info("REQUETE SQL SELECT identifiant from adherent : " + sql , { numsession: req.session.id, label: filename}); try { const [results, fields] = await db_connection_promise.execute(sql); console.log(results); logger.info("Nombre de lignes trouvées avec cet identifiant = " + results.length, { numsession: req.session.id, label: filename}); if (results.length) { // IDENTIFIANT DÉJA INSCRIT // METTRE Â JOUR l'EXISTANT au cas où il ait modifié des informations logger.info("// IDENTIFIANT DÉJA INSCRIT", { numsession: req.session.id, label: filename}); // affichage message erreur logger.info("identifiant déjà inscrit", { numsession: req.session.id, label: filename}); req.session.err_mail_form_adhesion_1 = "Cette adresse Email est déjà inscrite pour les adhésions 2025/2026."; req.session.err_mail_form_adhesion_2 = "Si vous n'aviez pas pu finaliser votre paiement veuillez nous envoyer un chèque ou un virement."; req.session.err_mail_form_adhesion_3 = "Pour tout problème veuillez contacter l’Association."; // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur await db_connection_promise.end(); res.redirect('/adhesion'); } else { // IDENTIFIANT NON TROUVÉ // AJOUTER UNE LIGNE DANS LA TABLE adhrent logger.info("// NON TROUVÉ => AJOUTER UNE LIGNE DANS LA TABLE", { numsession: req.session.id, label: filename}); let sql2 = 'INSERT INTO '; sql2 += 'adherent'; sql2 += ' ('; sql2 += 'date_maj, '; sql2 += 'saison, '; sql2 += 'identifiant, '; sql2 += 'association_suzuki, '; sql2 += 'adherent_type, '; sql2 += 'adherent_nom, '; sql2 += 'adherent_prenom, '; sql2 += 'adherent_mail, '; sql2 += 'adherent_adresse_rue, '; sql2 += 'adherent_adresse_complement, '; sql2 += 'adherent_adresse_codepostal, '; sql2 += 'adherent_adresse_ville, '; sql2 += 'adherent_adresse_pays, '; sql2 += 'adherent_telephone_mobile, '; sql2 += 'adherent_telephone_fixe'; sql2 += ') VALUES ('; sql2 += '"'+ now +'",'; sql2 += '"2025/2026",'; sql2 += '"'+ req.session.identifiant +'",'; sql2 += '"AFPS",'; sql2 += '"'+ adherent_type +'",'; sql2 += '"'+ req.session.adherent_nom +'",'; sql2 += '"'+ req.session.adherent_prenom +'",'; sql2 += '"'+ req.session.identifiant +'",'; sql2 += '"'+ req.session.adherent_adresse_rue +'",'; sql2 += '"'+ req.session.adherent_adresse_complement +'",'; sql2 += '"'+ req.session.adherent_adresse_codepostal +'",'; sql2 += '"'+ req.session.adherent_adresse_ville +'",'; sql2 += '"'+ req.session.adherent_adresse_pays +'",'; sql2 += '"'+ req.session.adherent_telephone_mobile +'",'; sql2 += '"'+ req.session.adherent_telephone_fixe +'"'; sql2 += ')'; logger.info("REQUETE SQL INSERT INTO adherent : " + sql2 , { numsession: req.session.id, label: filename}); // AJOUTER L'ADHÉRENT DANS LA TABLE adherent try { // AJOUTER UNE LIGNE DANS LA TABLE adhrent const [results, fields] = await db_connection_promise.execute(sql2); logger.info("ADHÉRENTS Row ID added : " + results.insertId, { numsession: req.session.id, label: filename}); } catch (error) { // Echec de la requête console.log(error); logger.error("Il y a un problème avec la requête INSERT INTO adherent! : " + error, { numsession: req.session.id }); req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur await db_connection_promise.end(); res.redirect('/adhesion'); } // AJOUTER LES ÉLÈVES DANS LA TABLE adherent_eleve for (let i=1; i<6; i++) { if (req.session["eleve_"+i+"_nom"]) { let sql3 = 'INSERT INTO '; sql3 += 'adherent_eleve'; sql3 += ' ('; sql3 += 'date_maj, '; sql3 += 'saison, '; sql3 += 'identifiant, '; sql3 += 'association_suzuki, '; sql3 += 'eleve_nom, '; sql3 += 'eleve_prenom, '; sql3 += 'adherent_mail, '; sql3 += 'adherent_telephone_mobile, '; sql3 += 'eleve_datenaissance, '; sql3 += 'eleve_instrumentA, '; sql3 += 'eleve_instrumentA_cahier, '; sql3 += 'eleve_instrumentA_prof, '; sql3 += 'eleve_instrumentB, '; sql3 += 'eleve_instrumentB_cahier, '; sql3 += 'eleve_instrumentB_prof, '; sql3 += 'eleve_droitimage, '; sql3 += 'eleve_contactsup_nom, '; sql3 += 'eleve_contactsup_prenom, '; sql3 += 'eleve_contactsup_mail'; sql3 += ') VALUES ('; sql3 += '"'+ now +'",'; sql3 += '"2025/2026",'; sql3 += '"'+ req.session.identifiant +'",'; sql3 += '"AFPS",'; sql3 += '"'+ req.session["eleve_"+i+"_nom"] +'",'; sql3 += '"'+ req.session["eleve_"+i+"_prenom"] +'",'; sql3 += '"'+ req.session.identifiant +'",'; sql3 += '"'+ req.session.adherent_telephone_mobile +'",'; sql3 += '"'+ req.session["eleve_"+i+"_datenaissance"] +'",'; sql3 += '"'+ req.session["eleve_"+i+"_instrumentA"] +'",'; sql3 += '"'+ req.session["eleve_"+i+"_instrumentA_cahier"] +'",'; sql3 += '"'+ req.session["eleve_"+i+"_instrumentA_prof"] +'",'; sql3 += '"'+ req.session["eleve_"+i+"_instrumentB"] +'",'; sql3 += '"'+ req.session["eleve_"+i+"_instrumentB_cahier"] +'",'; if (req.session["eleve_"+i+"_instrumentB_prof"]==undefined){req.session["eleve_"+i+"_instrumentB_prof"]=""}; sql3 += '"'+ req.session["eleve_"+i+"_instrumentB_prof"] +'",'; sql3 += '"'+ req.session["eleve_"+i+"_droitimage"] +'",'; sql3 += '"'+ req.session["eleve_"+i+"_contactsup_nom"] +'",'; sql3 += '"'+ req.session["eleve_"+i+"_contactsup_prenom"] +'",'; sql3 += '"'+ req.session["eleve_"+i+"_contactsup_mail"] +'"'; sql3 += ')'; logger.info("REQUETE SQL INSERT INTO adherent_eleve : " + sql3, { numsession: req.session.id, label: filename}); try { const [results, fields] = await db_connection_promise.execute(sql3); logger.info("ADHÉRENTS Row ID added : " + results.insertId, { numsession: req.session.id, label: filename}); } catch (error) { // Echec de la requête console.log(error); logger.error("Il y a un problème avec la requête INSERT INTO adherent_eleve! : " + error, { numsession: req.session.id }); req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur await db_connection_promise.end(); res.redirect('/adhesion'); } } } // AJOUTER LE PROFESSEUR DANS LA TABLE adherent_professeur if (req.session.adherent_prof_instrument1) { let sql4 = 'INSERT INTO '; sql4 += 'adherent_professeur'; sql4 += ' ('; sql4 += 'date_maj, '; sql4 += 'saison, '; sql4 += 'identifiant, '; sql4 += 'association_suzuki, '; sql4 += 'adherent_nom, '; sql4 += 'adherent_prenom, '; sql4 += 'adherent_mail, '; sql4 += 'adherent_telephone_mobile, '; sql4 += 'adherent_prof_instrument1, '; sql4 += 'adherent_prof_instrument1_esa, '; sql4 += 'adherent_prof_instrument2, '; sql4 += 'adherent_prof_instrument2_esa, '; sql4 += 'adherent_prof_sece, '; sql4 += 'adherent_prof_ecole1, '; sql4 += 'adherent_prof_ecole1_mail, '; sql4 += 'adherent_prof_ecole1_web, '; sql4 += 'adherent_prof_ecole1_adresse, '; sql4 += 'adherent_prof_ecole1_cp, '; sql4 += 'adherent_prof_ecole1_ville, '; sql4 += 'adherent_prof_ecole1_region, '; sql4 += 'adherent_prof_ecole2, '; sql4 += 'adherent_prof_ecole2_mail, '; sql4 += 'adherent_prof_ecole2_web, '; sql4 += 'adherent_prof_ecole2_adresse, '; sql4 += 'adherent_prof_ecole2_cp, '; sql4 += 'adherent_prof_ecole2_ville, '; sql4 += 'adherent_prof_ecole2_region, '; sql4 += 'adherent_prof_ecole3, '; sql4 += 'adherent_prof_ecole3_mail, '; sql4 += 'adherent_prof_ecole3_web, '; sql4 += 'adherent_prof_ecole3_adresse, '; sql4 += 'adherent_prof_ecole3_cp, '; sql4 += 'adherent_prof_ecole3_ville, '; sql4 += 'adherent_prof_ecole3_region'; sql4 += ') VALUES ('; sql4 += '"'+ now +'",'; sql4 += '"2025/2026",'; sql4 += '"'+ req.session.identifiant +'",'; sql4 += '"AFPS",'; sql4 += '"'+ req.session.adherent_nom +'",'; sql4 += '"'+ req.session.adherent_prenom +'",'; sql4 += '"'+ req.session.identifiant +'",'; sql4 += '"'+ req.session.adherent_telephone_mobile +'",'; sql4 += '"'+ req.session.adherent_prof_instrument1 +'",'; sql4 += '"'+ req.session.adherent_prof_instrument1_esa +'",'; sql4 += '"'+ req.session.adherent_prof_instrument2 +'",'; sql4 += '"'+ req.session.adherent_prof_instrument2_esa +'",'; sql4 += '"'+ req.session.adherent_prof_sece +'",'; sql4 += '"'+ req.session.adherent_prof_ecole1 +'",'; sql4 += '"'+ req.session.adherent_prof_ecole1_mail +'",'; sql4 += '"'+ req.session.adherent_prof_ecole1_web +'",'; sql4 += '"'+ req.session.adherent_prof_ecole1_adresse +'",'; sql4 += '"'+ req.session.adherent_prof_ecole1_cp +'",'; sql4 += '"'+ req.session.adherent_prof_ecole1_ville +'",'; sql4 += '"'+ req.session.adherent_prof_ecole1_region +'",'; sql4 += '"'+ req.session.adherent_prof_ecole2 +'",'; sql4 += '"'+ req.session.adherent_prof_ecole2_mail +'",'; sql4 += '"'+ req.session.adherent_prof_ecole2_web +'",'; sql4 += '"'+ req.session.adherent_prof_ecole2_adresse +'",'; sql4 += '"'+ req.session.adherent_prof_ecole2_cp +'",'; sql4 += '"'+ req.session.adherent_prof_ecole2_ville +'",'; sql4 += '"'+ req.session.adherent_prof_ecole2_region +'",'; sql4 += '"'+ req.session.adherent_prof_ecole3 +'",'; sql4 += '"'+ req.session.adherent_prof_ecole3_mail +'",'; sql4 += '"'+ req.session.adherent_prof_ecole3_web +'",'; sql4 += '"'+ req.session.adherent_prof_ecole3_adresse +'",'; sql4 += '"'+ req.session.adherent_prof_ecole3_cp +'",'; sql4 += '"'+ req.session.adherent_prof_ecole3_ville +'",'; sql4 += '"'+ req.session.adherent_prof_ecole3_region +'"'; sql4 += ')'; logger.info("REQUETE SQL INSERT INTO adherent_professeur : " + sql4, { numsession: req.session.id, label: filename}); try { // AJOUTER UNE LIGNE DANS LA TABLE adherent_professeur const [results, fields] = await db_connection_promise.execute(sql4); logger.info("PROFESSEUR Row ID added : " + results.insertId, { numsession: req.session.id, label: filename}); } catch (error) { // Echec de la requête console.log(error); logger.error("Il y a un problème avec la requête INSERT INTO adherent_professeur! : " + error, { numsession: req.session.id }); req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur await db_connection_promise.end(); res.redirect('/adhesion'); } } // AJOUTER LE PROFESSEUR EN FORMATION DANS LA TABLE adherent_formation_prof if (req.session.adherent_prof_stagiaire_instrument1) { let sql5 = 'INSERT INTO '; sql5 += 'adherent_formation_prof'; sql5 += ' ('; sql5 += 'date_maj, '; sql5 += 'saison, '; sql5 += 'identifiant, '; sql5 += 'association_suzuki, '; sql5 += 'adherent_nom, '; sql5 += 'adherent_prenom, '; sql5 += 'adherent_mail, '; sql5 += 'adherent_telephone_mobile, '; sql5 += 'adherent_prof_stagiaire_instrument1, '; sql5 += 'adherent_prof_stagiaire_instrument1_esa, '; sql5 += 'adherent_prof_stagiaire_instrument1_prof, '; sql5 += 'adherent_prof_stagiaire_instrument2, '; sql5 += 'adherent_prof_stagiaire_instrument2_esa, '; sql5 += 'adherent_prof_stagiaire_instrument2_prof'; sql5 += ') VALUES ('; sql5 += '"'+ now +'",'; sql5 += '"2025/2026",'; sql5 += '"'+ req.session.identifiant +'",'; sql5 += '"AFPS",'; sql5 += '"'+ req.session.adherent_nom +'",'; sql5 += '"'+ req.session.adherent_prenom +'",'; sql5 += '"'+ req.session.identifiant +'",'; sql5 += '"'+ req.session.adherent_telephone_mobile +'",'; sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument1 +'",'; sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument1_esa +'",'; sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument1_prof +'",'; sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument2 +'",'; sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument2_esa +'",'; if (req.session.adherent_prof_stagiaire_instrument2_prof==undefined) {req.session.adherent_prof_stagiaire_instrument2_prof = ""}; sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument2_prof +'"'; sql5 += ')'; logger.info("====== REQUETE SQL INSERT INTO adherent_formation_prof : ", { numsession: req.session.id, label: filename}); logger.info(sql5, { numsession: req.session.id, label: filename}); logger.info("=========================================================", { numsession: req.session.id, label: filename}); try { // AJOUTER UNE LIGNE DANS LA TABLE adherent_professeur const [results, fields] = await db_connection_promise.execute(sql5); logger.info("PROFESSEUR EN FORMATION Row ID added : " + results.insertId, { numsession: req.session.id, label: filename}); } catch (error) { // Echec de la requête console.log(error); logger.error("Il y a un problème avec la requête INSERT INTO adherent_formation_prof! : " + error, { numsession: req.session.id }); req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur await db_connection_promise.end(); res.redirect('/adhesion'); } } } } catch (error) { // Echec de la requête console.log(error); logger.error("Il y a un problème avec la requête select identifiant from adherent! : " + error, { numsession: req.session.id }); req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur await db_connection_promise.end(); res.redirect('/adhesion'); }; // AJOUTER UNE LIGNE DANS LA TABLE adherent_finance let sql6 = 'INSERT INTO '; sql6 += 'adherent_finance'; sql6 += ' ('; sql6 += 'date_maj, '; sql6 += 'saison, '; sql6 += 'identifiant, '; sql6 += 'association_suzuki, '; sql6 += 'adherent_type, '; sql6 += 'adherent_nom, '; sql6 += 'adherent_prenom, '; sql6 += 'adherent_telephone_mobile, '; sql6 += 'adherent_mail, '; sql6 += 'montant_adhesion, '; sql6 += 'montant_don, '; sql6 += 'montant_total, '; sql6 += 'paiement_mode'; sql6 += ') VALUES ('; sql6 += '"'+ now +'",'; sql6 += '"2025/2026",'; sql6 += '"'+ req.session.identifiant +'",'; sql6 += '"AFPS",'; sql6 += '"'+ adherent_type +'",'; sql6 += '"'+ req.session.adherent_nom +'",'; sql6 += '"'+ req.session.adherent_prenom +'",'; sql6 += '"'+ req.session.adherent_telephone_mobile +'",'; sql6 += '"'+ req.session.identifiant +'",'; if (req.session.adherent_paiement_montant_adhesion == "" || req.session.adherent_paiement_montant_adhesion == "undefined" || !req.session.adherent_paiement_montant_adhesion) {req.session.adherent_paiement_montant_adhesion = 0}; sql6 += '"'+ req.session.adherent_paiement_montant_adhesion +'",'; if (req.session.adherent_paiement_montant_don == "" || req.session.adherent_paiement_montant_don == "undefined" || !req.session.adherent_paiement_montant_don) {req.session.adherent_paiement_montant_don = 0}; sql6 += '"'+ req.session.adherent_paiement_montant_don +'",'; if (req.session.montant_apayer == "" || req.session.montant_apayer == "undefined" || !req.session.montant_apayer) {req.session.montant_apayer = 0}; sql6 += '"'+ req.session.montant_apayer +'",'; sql6 += '"carte bancaire"'; sql6 += ')'; logger.info("REQUETE SQL INSERT INTO adherent : " + sql6, { numsession: req.session.id, label: filename}); try { // AJOUTER UNE LIGNE DANS LA TABLE adherent_finance const [results, fields] = await db_connection_promise.execute(sql6); logger.info("adherent_finance Row ID added : " + results.insertId, { numsession: req.session.id, label: filename}); ///////////////////////////////////////////////// // REDIRECTION VERS LA PAGE DE PAIEMENT STRIPE //let url_stripe = session.url logger.info("Stripe session.url : " + session.url, { numsession: req.session.id, label: filename}); await db_connection_promise.end(); res.redirect(session.url) } catch (error) { // Echec de la requête console.log(error); logger.error("Il y a un problème avec la requête INSERT INTO adherent_finance! : " + error, { numsession: req.session.id }); req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur await db_connection_promise.end(); res.redirect('/adhesion'); } } catch (error) { // Echec de connection à la BD logger.error("Il y a un problème avec la connection à la base de données! : " + error, { numsession: req.session.id }); req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur res.redirect('/adhesion'); }; } else { // les Infos de session ne sont plus dispo logger.info("les Infos de session ne sont plus dispo! : ", { numsession: req.session.id }); req.session.err_mail_form_adhesion_1 = "La session a expiré."; req.session.err_mail_form_adhesion_2 = "Si vous n'aviez pas pu finaliser votre paiement veuillez nous envoyer un chèque ou un virement."; req.session.err_mail_form_adhesion_3 = "Pour tout problème veuillez contacter l’Association."; // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur res.redirect('/adhesion'); } } ///////////////////////////////////////////////// // RETOUR STRIPE CARTE BANCAIRE PAYÉE ///////////////////////////////////////////////// const get_res_bank = async function(req, res){ logger.info("======================================"); logger.info("======== FUNCTION get_res_banq (adhesion) =========="); logger.info("======================================"); //////////////////////////////////////////////////// // CONNECTION ADOBE API //////////////////////////////////////////////////// const credentials = PDFServicesSdk.Credentials .servicePrincipalCredentialsBuilder() .withClientId(process.env.PDF_SERVICES_CLIENT_ID) .withClientSecret(process.env.PDF_SERVICES_CLIENT_SECRET) .build(); //timeout Default: 10000 const clientConfig = PDFServicesSdk.ClientConfig .clientConfigBuilder() .withConnectTimeout(20000) .withReadTimeout(40000) .build(); // Create an ExecutionContext using credentials const executionContext = PDFServicesSdk.ExecutionContext.create(credentials); var id = req.query.id; logger.info("id = " + id, { numsession: req.session.id }); const session = await stripe.checkout.sessions.retrieve(id); console.log("======================================"); console.log("======== SESSION STRIPE =========="); console.log("======================================"); ///////////////////////////////////////////////// // DATE DE L'ADHÉSION let now = moment().format("YYYY-MM-DD HH:mm:ss"); let now_pdf = moment().format("YYYY-MM-DDTHH-mm-ss"); var customer_email = session.customer_email; var payment_status = session.payment_status; var amount_total = session.amount_total/100; var stripe_customer = session.customer; var stripe_payment_intent = session.payment_intent; var payment_method_types = session.payment_method_types; var stripe_status = session.status; var profil = session.metadata.profil; var identifiant = session.metadata.identifiant; var adherent_paiement_montant_don = session.metadata.adherent_paiement_montant_don; var adherent_nom = session.metadata.adherent_nom; var adherent_prenom = session.metadata.adherent_prenom; var adherent_adresse_rue = session.metadata.adherent_adresse_rue; var adherent_adresse_codepostal = session.metadata.adherent_adresse_codepostal; var adherent_adresse_ville = session.metadata.adherent_adresse_ville; logger.info("session.metadata.adherent_nom = " + session.metadata.adherent_nom, { numsession: req.session.id }); ////////////////////////////////////////////////////////////////////////////// // DÉFINIR LE PROFIL À AJOUTER DANS LA CARTE ADHÉRENT // La fonction est dans le fichier /modules/adherent_type.js profils = carte_adherent.profil(adherent_type); profil1 = profils[0]; profil2 = profils[1]; profil3 = profils[2]; logger.info("customer_email: " + customer_email, { numsession: req.session.id }); logger.info("payment_status: " + payment_status, { numsession: req.session.id }); res.locals.customer_email = customer_email; res.locals.payment_status = payment_status; res.locals.amount_total = amount_total; res.locals.stripe_customer = stripe_customer; res.locals.stripe_payment_intent = stripe_payment_intent; res.locals.payment_method_types = "carte bancaire"; res.locals.stripe_status = stripe_status; res.locals.identifiant = identifiant; res.locals.profil1 = profil1; res.locals.profil2 = profil2; res.locals.profil3 = profil3; logger.info("req.session.identifiant: " + req.session.identifiant, { numsession: req.session.id }); ////////////////////////////////////////////////////////////////////////////// // MISE À JOUR DES INFORMATIONS SUR LE PAIEMENT DANS LA BASE DE DONNÉES adherent_finance let stripe_retour = "payment_status:"+payment_status+",stripe_customer:"+stripe_customer+",stripe_payment_intent:"+stripe_payment_intent+",sessionID:"+session.id+",payment_method_types:"+payment_method_types+",amount_total:"+amount_total+",stripe_status:"+stripe_status; // Vérifier que la session n'a pas expiré if (identifiant) { try { const db_connection_promise = await mysql_promise.createConnection({ host: process.env.db_connection_host, port: process.env.db_connection_port, user: process.env.db_connection_user, password: process.env.db_connection_password, database: process.env.db_connection_database }); logger.info("======================================", { label: filename }); logger.info("Connected TO DATABASE test with mysql2 PREMISE !", { label: filename }); logger.info("======================================", { label: filename }); // METTRE À JOUR LES INFOS DE PAIEMENT DANS adherent_finance let sql = 'UPDATE '; sql += 'adherent_finance'; sql += ' SET '; sql += 'date_paiement = "' + now + '", '; sql += 'stripe_retour = "' + stripe_retour + '", '; sql += 'statut_paiement = "paye"'; sql += ' WHERE identifiant = "' + identifiant + '"'; logger.info("REQUETE SQL UPDATE adherent_finance : " + sql , { numsession: req.session.id, label: filename}); try { // METTRE À JOUR LES INFOS DE PAIEMENT DANS adherent_finance const [results, fields] = await db_connection_promise.execute(sql); logger.info("adherent_finance Row ID changed : " + results.changedRows, { numsession: req.session.id, label: filename}); } catch (error) { // Echec de la requête console.log(error); logger.error("Il y a un problème avec la requête INSERT INTO adherent_finance! : " + error, { numsession: req.session.id }); req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur await db_connection_promise.end(); res.redirect('/adhesion'); } // METTRE À JOUR LE STATUS D'ENVOI DE LA CARTE let sql2 = 'UPDATE '; sql2 += 'adherent'; sql2 += ' SET '; sql2 += 'carte_envoi = "definitive"'; sql2 += ' WHERE identifiant = "' + identifiant + '"'; logger.info("REQUETE SQL UPDATE adherent : " + sql2, { numsession: req.session.id, label: filename}); try { // METTRE À JOUR LES INFOS DE PAIEMENT DANS adherent const [results, fields] = await db_connection_promise.execute(sql2); logger.info("adherent carte envoi Row ID changed : " + results.changedRows, { numsession: req.session.id, label: filename}); } catch (error) { // Echec de la requête console.log(error); logger.error("Il y a un problème avec la requête INSERT INTO adherent_finance! : " + error, { numsession: req.session.id }); req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur await db_connection_promise.end(); res.redirect('/adhesion'); } } catch (error) { // Echec de connection à la BD logger.error("Il y a un problème avec la connection à la base de données! : " + error, { numsession: req.session.id }); req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur await db_connection_promise.end(); res.redirect('/adhesion'); }; } else { // les Infos de session ne sont plus dispo logger.info("les Infos de session ne sont plus dispo! : ", { numsession: req.session.id }); req.session.err_mail_form_adhesion_1 = "La session a expiré."; req.session.err_mail_form_adhesion_2 = "Si vous n'aviez pas pu finaliser votre paiement veuillez nous envoyer un chèque ou un virement."; req.session.err_mail_form_adhesion_3 = "Pour tout problème veuillez contacter l’Association."; // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur res.redirect('/adhesion'); } ////////////////////////////////////////////////////////////////////////////// // ADOBE PDF : CRÉATION DE LA CARTE D'ADHÉSION EN PDF // + JUSTIFICATIF DE DON // OUTPUT = /Users/juliechaumard/Documents/GitHub/Aduzuki_v2/pdf/adhesion/2526/payee/lulliabo@icloud.com.pdf let OUTPUT; let INPUT; // S'il y a un don if (adherent_paiement_montant_don > 0) { OUTPUT = path.resolve(__dirname, "../pdf/adhesion/2526/paye/")+"/"+identifiant+"_adhesion_2526_paye_don_"+now_pdf+".pdf"; INPUT = path.resolve(__dirname, "../pdf/template/carte_adherent_don.docx"); } else { // S'il n'y a pas de don OUTPUT = path.resolve(__dirname, "../pdf/adhesion/2526/paye/")+"/"+identifiant+"_adhesion_2526_paye_"+now_pdf+".pdf"; INPUT = path.resolve(__dirname, "../pdf/template/carte_adherent.docx"); } moment.locale('fr'); var date_formattee = moment().format('L') var today = date_formattee; var adresse = adherent_adresse_rue; adresse += " "; adresse += adherent_adresse_codepostal; adresse += " "; adresse += adherent_adresse_ville; if (profil2 == undefined) {profil2 = " "}; if (profil3 == undefined) {profil3 = ""}; JSON_INPUT = { "date": today, "identifiant": identifiant, "profil1": profil1, "profil2": profil2, "profil3": profil3, "mode_paiement": "carte bancaire", "nom": adherent_nom, "prenom": adherent_prenom, "adresse": adresse, "montant_don": adherent_paiement_montant_don }; const documentMerge = PDFServicesSdk.DocumentMerge, documentMergeOptions = documentMerge.options, adobe_options = new documentMergeOptions.DocumentMergeOptions(JSON_INPUT, documentMergeOptions.OutputFormat.PDF); // Create a new operation instance using the options instance. const documentMergeOperation = documentMerge.Operation.createNew(adobe_options); // Set operation input document template from a source file. const input = PDFServicesSdk.FileRef.createFromLocalFile(INPUT); documentMergeOperation.setInput(input); // Execute the operation and Save the result to the specified location. await documentMergeOperation .execute(executionContext) .then(result => result.saveAsFile(OUTPUT).then( ) ) .catch(err => { if(err instanceof PDFServicesSdk.Error.ServiceApiError || err instanceof PDFServicesSdk.Error.ServiceUsageError) { console.log('Exception encountered while executing ADOBE PDF', err); } else { console.log('Exception encountered while executing ADOBE PDF', err); } }); ////////////////////////////////////////////////////////////////////////////// // ENVOIE CARTE ADHERENT + JUSTIFICATIF DE DON PAR MAIL console.log("MAIL ENVOI AVANT"); var transporter = nodemailer.createTransport({ service: 'gmail', auth: { user: process.env.nodemailer_user, pass: process.env.nodemailer_pass } }); var attachment_name = identifiant; attachment_name += "_adhesion_2526_carteadherent.pdf"; var attachment_don_name = identifiant; attachment_don_name += "_don.pdf"; var mail_objet = "ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI - ADHÉSION 2025/2026 - "; mail_objet += identifiant; mail_html = "

Cher adhérent,

Félicitations ! Vous êtes désormais membre de l’Association Française pour la Pédagogie Suzuki (http://www.afpedagogiesuzuki.fr) et de l’European Suzuki Association (https://europeansuzuki.org) pour l'année 2025/2026. Vous pouvez à ce titre participer à tous les événements Suzuki en France et dans le monde.

Vous trouverez en pièce jointe votre carte d'adhésion annuelle (valable du 1er septembre 2025 au 31 août 2026).

Votre identifiant (valable pour toute la famille) est "; mail_html += identifiant; mail_html += ".

"; if (adherent_paiement_montant_don > 0) { mail_html += "

Nous vous remercions chaleureusement pour votre don. Votre justificatif est également joint à ce mail

"; } mail_html += "


Nous vous remercions pour votre intérêt et vous souhaitons une très belle année en musique !

Association Française pour la pédagogie Suzuki
Chez Anne PAGES
30 rue des Tattes
74500 PUBLIER

"; var mailOptions = { from: 'afps.inscription@gmail.com', to: identifiant, subject: mail_objet, html: mail_html, attachments: [{ filename: attachment_name, path: OUTPUT } ] }; transporter.sendMail(mailOptions, function(error, info){ if (error) { logger.info("error : " + error, { numsession: req.session.id }); } else { console.log('Email sent: ' + info.response); } }); console.log("MAIL ENVOI APRES"); ////////////////////////////////////////////////////////////////////////////// // REDIRECTION VERS LA PAGE DE CONFIRMATION PAIEMENT CARTE BANCAIRE res.locals.today = date_formattee; res.render('adhesion/page_templates/adhesion_paiement_reussi.ejs'); } ///////////////////////////////////////////////// // RETOUR STRIPE CARTE BANCAIRE ANNULÉE OU PROBLÈME ///////////////////////////////////////////////// const get_res_bank_annul = async function(req, res){ logger.info("======================================"); logger.info("======== FUNCTION get_res_bank_annul (adhesion) =========="); logger.info("======================================"); //////////////////////////////////////////////////// // CONNECTION ADOBE API //////////////////////////////////////////////////// const credentials = PDFServicesSdk.Credentials .servicePrincipalCredentialsBuilder() .withClientId(process.env.PDF_SERVICES_CLIENT_ID) .withClientSecret(process.env.PDF_SERVICES_CLIENT_SECRET) .build(); //timeout Default: 10000 const clientConfig = PDFServicesSdk.ClientConfig .clientConfigBuilder() .withConnectTimeout(20000) .withReadTimeout(40000) .build(); // Create an ExecutionContext using credentials const executionContext = PDFServicesSdk.ExecutionContext.create(credentials); console.log ("on est dans la ROUTE /adhesion_paiement/annule"); var id = req.query.id; // type = req.params.type; logger.info("id : " + id, { numsession: req.session.id }); const session = await stripe.checkout.sessions.retrieve(id); console.log("======================================"); console.log("======== SESSION STRIPE =========="); console.log("======================================"); ///////////////////////////////////////////////// // DATE DE L'ADHÉSION let now = moment().format("YYYY-MM-DD HH:mm:ss"); let now_pdf = moment().format("YYYY-MM-DDTHH-mm-ss"); console.info(session); var customer_email = session.customer_email; var payment_status = session.payment_status; var amount_total = session.amount_total/100; var stripe_customer = session.customer; var stripe_payment_intent = session.payment_intent; var payment_method_types = session.payment_method_types; var stripe_status = session.status; var profil = session.metadata.profil; var identifiant = session.metadata.identifiant; var adherent_paiement_montant_don = session.metadata.adherent_paiement_montant_don; var adherent_paiement_montant_adhesion = session.metadata.adherent_paiement_montant_adhesion; var adherent_nom = session.metadata.adherent_nom; ////////////////////////////////////////////////////////////////////////////// // DÉFINIR LE PROFIL À AJOUTER DANS LA CARTE ADHÉRENT // La fonction est dans le fichier /modules/adherent_type.js profils = carte_adherent.profil(adherent_type); profil1 = profils[0]; profil2 = profils[1]; profil3 = profils[2]; console.log("customer_email: ", customer_email); logger.info("payment_status : " + payment_status, { numsession: req.session.id }); console.log("stripe_customer: ", stripe_customer); console.log("amount_total: ", amount_total); console.log("stripe_payment_intent: ", stripe_payment_intent); console.log("payment_method_types: ", payment_method_types); console.log("stripe_status: ", stripe_status); console.log("metadata.profil: ", profil); res.locals.customer_email = customer_email; res.locals.payment_status = payment_status; res.locals.amount_total = amount_total; res.locals.stripe_customer = stripe_customer; res.locals.stripe_payment_intent = stripe_payment_intent; res.locals.payment_method_types = payment_method_types; res.locals.stripe_status = stripe_status; res.locals.identifiant = identifiant; res.locals.profil1 = profil1; res.locals.profil2 = profil2; res.locals.profil3 = profil3; logger.info("req.session.identifiant: " + req.session.identifiant, { numsession: req.session.id }); ////////////////////////////////////////////////////////////////////////////// // MISE À JOUR DES INFORMATIONS SUR LE PAIEMENT DANS LA BASE DE DONNÉES adherent_finance let stripe_retour = "payment_status:"+payment_status+",stripe_customer:"+stripe_customer+",stripe_payment_intent:"+stripe_payment_intent+",sessionID:"+session.id+",payment_method_types:"+payment_method_types+",amount_total:"+amount_total+",stripe_status:"+stripe_status; // Vérifier que la session n'a pas expiré if (identifiant) { try { const db_connection_promise = await mysql_promise.createConnection({ host: process.env.db_connection_host, port: process.env.db_connection_port, user: process.env.db_connection_user, password: process.env.db_connection_password, database: process.env.db_connection_database }); logger.info("======================================", { label: filename }); logger.info("Connected TO DATABASE test with mysql2 PREMISE !", { label: filename }); logger.info("======================================", { label: filename }); // METTRE À JOUR LES INFOS DE PAIEMENT DANS adherent_finance let sql = 'UPDATE '; sql += 'adherent_finance'; sql += ' SET '; sql += 'date_paiement = "' + now + '", '; sql += 'stripe_retour = "' + stripe_retour + '", '; sql += 'statut_paiement = "impaye"'; sql += ' WHERE identifiant = "' + identifiant + '"'; logger.info("REQUETE SQL UPDATE adherent_finance : " + sql , { numsession: req.session.id, label: filename}); try { // METTRE À JOUR LES INFOS DE PAIEMENT DANS adherent_finance const [results, fields] = await db_connection_promise.execute(sql); logger.info("adherent_finance Row ID changed : " + results.changedRows, { numsession: req.session.id, label: filename}); } catch (error) { // Echec de la requête console.log(error); logger.error("Il y a un problème avec la requête INSERT INTO adherent_finance! : " + error, { numsession: req.session.id }); req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur await db_connection_promise.end(); res.redirect('/adhesion'); } // METTRE À JOUR LE STATUS D'ENVOI DE LA CARTE let sql2 = 'UPDATE '; sql2 += 'adherent'; sql2 += ' SET '; sql2 += 'carte_envoi = "temporaire"'; sql2 += ' WHERE identifiant = "' + identifiant + '"'; logger.info("REQUETE SQL UPDATE adherent : " + sql2, { numsession: req.session.id, label: filename}); try { // METTRE À JOUR LES INFOS DE PAIEMENT DANS adherent const [results, fields] = await db_connection_promise.execute(sql2); logger.info("adherent_finance Row ID changed : " + results.changedRows, { numsession: req.session.id, label: filename}); } catch (error) { // Echec de la requête console.log(error); logger.error("Il y a un problème avec la requête INSERT INTO adherent_finance! : " + error, { numsession: req.session.id }); req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur await db_connection_promise.end(); res.redirect('/adhesion'); } } catch (error) { // Echec de connection à la BD logger.error("Il y a un problème avec la connection à la base de données! : " + error, { numsession: req.session.id }); req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur await db_connection_promise.end(); res.redirect('/adhesion'); }; } else { // les Infos de session ne sont plus dispo logger.info("les Infos de session ne sont plus dispo! : ", { numsession: req.session.id }); req.session.err_mail_form_adhesion_1 = "La session a expiré."; req.session.err_mail_form_adhesion_2 = "Si vous n'aviez pas pu finaliser votre paiement veuillez nous envoyer un chèque ou un virement."; req.session.err_mail_form_adhesion_3 = "Pour tout problème veuillez contacter l’Association."; // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur res.redirect('/adhesion'); } ////////////////////////////////////////////////////////////////////////////// // ADOBE PDF : CRÉATION DE LA CARTE D'ADHÉSION TEMPORAIRE EN PDF let OUTPUT = path.resolve(__dirname, "../pdf/adhesion/2526/attente/")+"/"+identifiant+"_adhesion_2526_attente_"+now_pdf+".pdf"; let INPUT = path.resolve(__dirname, "../pdf/template/carte_adherent_temp.docx"); moment.locale('fr'); var date_formattee = moment().format('L') var today = date_formattee; if (profil2 == undefined) {profil2 = " "}; if (profil3 == undefined) {profil3 = ""}; JSON_INPUT = { "date": today, "identifiant": identifiant, "profil1": profil1, "profil2": profil2, "profil3": profil3, "montant": adherent_paiement_montant_adhesion }; const documentMerge = PDFServicesSdk.DocumentMerge, documentMergeOptions = documentMerge.options, adobe_options = new documentMergeOptions.DocumentMergeOptions(JSON_INPUT, documentMergeOptions.OutputFormat.PDF); // Create a new operation instance using the options instance. const documentMergeOperation = documentMerge.Operation.createNew(adobe_options); // Set operation input document template from a source file. const input = PDFServicesSdk.FileRef.createFromLocalFile(INPUT); documentMergeOperation.setInput(input); // Execute the operation and Save the result to the specified location. await documentMergeOperation .execute(executionContext) .then(result => result.saveAsFile(OUTPUT).then( ) ) .catch(err => { if(err instanceof PDFServicesSdk.Error.ServiceApiError || err instanceof PDFServicesSdk.Error.ServiceUsageError) { console.log('Exception encountered while executing ADOBE PDF', err); } else { console.log('Exception encountered while executing ADOBE PDF', err); } }); ////////////////////////////////////////////////////////////////////////////// // ENVOIE CARTE ADHERENT TEMPORAIRE PAR MAIL console.log("MAIL ENVOI AVANT"); var transporter = nodemailer.createTransport({ service: 'gmail', auth: { user: process.env.nodemailer_user, pass: process.env.nodemailer_pass } }); var attachment_name = identifiant; attachment_name += "_adhesion_2526_carteadherent.pdf"; var mail_objet = "ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI - ADHÉSION 2025/2026 - "; mail_objet += adherent_nom; mail_html = "

Cher adhérent,

Félicitations ! Dès que votre paiement sera validé, vous serez membre de l’Association Française pour la Pédagogie Suzuki (http://www.afpedagogiesuzuki.fr) et de l’European Suzuki Association (https://europeansuzuki.org).
Vous pourrez à ce titre participer à tous les événements Suzuki en France et dans le monde.

Vous trouverez en pièce jointe votre carte d'adhésion annuelle 2025/2026 temporaire.

Votre identifiant est "; mail_html += identifiant; mail_html += ".

Veuillez toutefois noter que votre adhésion ne sera effective qu'à la réception de votre règlement de "; mail_html += adherent_paiement_montant_adhesion; mail_html += " euros.
"; if (adherent_paiement_montant_don > 0) { mail_html += "Nous vous remercions pour votre proposition de don de "; mail_html += adherent_paiement_montant_don; mail_html += " euros que vous pouvez ajouter à votre règlement."; } mail_html += "


Nous vous remercions pour votre intérêt et vous souhaitons une très belle année en musique !

Association Française pour la pédagogie Suzuki
Chez Anne PAGES
30 rue des Tattes
74500 PUBLIER

"; var mailOptions = { from: 'afps.inscription@gmail.com', to: identifiant, subject: mail_objet, html: mail_html, attachments: [{ filename: attachment_name, path: OUTPUT }], }; transporter.sendMail(mailOptions, function(error, info){ if (error) { logger.info("error : " + error, { numsession: req.session.id }); } else { console.log('Email sent: ' + info.response); } }); console.log("MAIL ENVOI APRES"); ////////////////////////////////////////////////////////////////////////////// // REDIRECTION VERS LA PAGE DE DE FIN res.locals.adherent_paiement_montant_adhesion = adherent_paiement_montant_adhesion; res.locals.adherent_paiement_montant_don = adherent_paiement_montant_don; res.locals.today = date_formattee; res.render('adhesion/page_templates/adhesion_paiement_annule.ejs'); } ///////////////////////////////////////////////// // ENVOI MANUEL CARTE ADHÉSION ET JUSTIFICATIF DE DON (SI DON) ///////////////////////////////////////////////// ///////////////////////////////////////////////// // SAISIE DU MAIL // VÉRIFIER SI DÉJÀ INSCRIT DANS GOOGLE ///////////////////////////////////////////////// const post_cartemanuelle_verifmail_envoicarte = async function(req, res){ logger.info("======================================"); logger.info("======== FUNCTION checkMail ENVOI MANUEL (adhesion) =========="); logger.info("======================================"); await doc.useServiceAccountAuth(creds); await doc.loadInfo(); // loads document properties and worksheets console.log("NOM FICHIER SHEET: ",doc.title); //nom du fichier const sheet = doc.sheetsByTitle['adhesion_annuelle_web']; console.log("NOM DU TABLEAU (ONGLET): ",sheet.title); //NOM DU TABLEAU (ONGLET) console.log("NOMBRE DE LIGNE DU TABLEAU: ",sheet.rowCount); // NOMBRE DE LIGNE DU TABLEAU const rows = await sheet.getRows(); console.log("rows[0].identifiant: ", rows[0].identifiant); let compteur = sheet.rowCount - 1; console.log("compteur: ",compteur); let rowToBeUpdate = 0; // ON RÉCUPÈRE LE MAIL (IDENTIFIANT) SAISIE DANS LE FORMULAIRE req.session.identifiant = req.body.identifiant; for (let i=0; i { console.log(res); }) .catch((error) => { console.error(error); }); console.log("PDF CREATION APRES"); ////////////////////////////////////////////////////////////////////////////// // CRÉATION DU PDF JUSTIFICATIF DE DON if (rows[rowToBeUpdate].adherent_paiement_montant_don > 0) { console.log("IF DON = OUI"); var html_don = fs.readFileSync(path.resolve(__dirname, "../pdf/template/don_justificatif.html"), "utf8"); //var html_don = fs.readFileSync("/Users/julie/Documents/GitHub/aduzuki/pdf/template/don_justificatif.html", "utf8"); var options_don = { format: "A4", orientation: "portrait", border: "10mm", }; var adresse = rows[rowToBeUpdate].adherent_adresse_rue; adresse += " "; adresse += rows[rowToBeUpdate].adherent_adresse_codepostal; adresse += " "; adresse += rows[rowToBeUpdate].adherent_adresse_ville; var donneur = [ { today: today, identifiant: rows[rowToBeUpdate].identifiant, nom: rows[rowToBeUpdate].adherent_nom, prenom: rows[rowToBeUpdate].adherent_prenom, adresse: adresse, adherent_paiement_mode: "carte bancaire", montant_don: rows[rowToBeUpdate].adherent_paiement_montant_don }, ]; var pdfname_don = path.resolve(__dirname, "../pdf/adhesion/2526/don/"); pdfname_don += "/"; pdfname_don += rows[rowToBeUpdate].identifiant; pdfname_don += "_adhesion_2526_don.pdf"; var document_don = { html: html_don, data: { donneur: donneur, }, path: pdfname_don, type: "" }; await pdf .create(document_don, options_don) .then((res) => { console.log(res); }) .catch((error) => { console.error(error); }); } ////////////////////////////////////////////////////////////////////////////// // ENVOIE CARTE ADHERENT + JUSTIFICATIF DE DON PAR MAIL console.log("MAIL ENVOI AVANT"); var transporter = nodemailer.createTransport({ service: 'gmail', auth: { // TEST JULIE //user: 'juliechaumard@gmail.com', //pass: 'etfq umof iwbx ltxk' // SUZUKI user: 'afpedagogiesuzuki@gmail.com', pass: 'tlxx kjwx ahyx irnl' } }); var attachment_name = rows[rowToBeUpdate].identifiant; attachment_name += "_adhesion_2526_carteadherent.pdf"; var attachment_don_name = rows[rowToBeUpdate].identifiant; attachment_don_name += "_adhesion_2526_don.pdf"; var mail_objet = "ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI - ADHÉSION 2025/2026 - "; mail_objet += rows[rowToBeUpdate].adherent_nom; mail_html = "

Cher adhérent,

Félicitations ! Vous êtes désormais membre de l’Association Française pour la Pédagogie Suzuki (http://www.afpedagogiesuzuki.fr) et de l’European Suzuki Association (https://europeansuzuki.org).
Vous pouvez à ce titre participer à tous les événements Suzuki en France et dans le monde.

Vous trouverez en pièce jointe votre carte d'adhésion annuelle (valable du 1er septembre 2025 au 31 août 2026).

Votre identifiant (valable pour toute la famille) est "; mail_html += rows[rowToBeUpdate].identifiant; mail_html += ".

"; if (rows[rowToBeUpdate].adherent_paiement_montant_don > 0) { mail_html += "

Nous vous remercions chaleureusement pour votre don. Votre justificatif est également joint à ce mail

"; } mail_html += "


Nous vous remercions pour votre intérêt et vous souhaitons une très belle année en musique !

Association Française pour la pédagogie Suzuki
Chez Anne PAGES
30 rue des Tattes
74500 PUBLIER

"; if (req.session.adherent_paiement_montant_don > 0) { var mailOptions = { from: 'afpedagogiesuzuki@gmail.com', to: req.session.identifiant, subject: mail_objet, html: mail_html, attachments: [{ filename: attachment_name, path: pdfname }, { filename: attachment_don_name, path: pdfname_don } ], }; } else { var mailOptions = { from: 'afpedagogiesuzuki@gmail.com', to: req.session.identifiant, subject: mail_objet, html: mail_html, attachments: [{ filename: attachment_name, path: pdfname } ], }; } transporter.sendMail(mailOptions, function(error, info){ if (error) { console.log(error); } else { console.log('Email sent: ' + info.response); } }); console.log("MAIL ENVOI APRES"); ////////////////////////////////////////////////////////////////////////////// // AFFICHAGE DANS LA PAGE WEB QUE LA CARTE EST ENVOYÉE req.session.err_mail_form_adhesion_1 = "Carte adhérent envoyée"; } else { req.session.err_mail_form_adhesion_1 = "Cette adresse Email n'est pas inscrite pour les adhésions 2025/2026."; req.session.err_mail_form_adhesion_2 = "Vous ne pouvez pas lui envoyer la carte d'adhérent."; } res.redirect('/inscription/adhesion/carte_manuelle'); } ///////////////////////////////////////////////// // ENVOI MANUEL CARTE ADHÉSION ET JUSTIFICATIF DE DON (SI DON) // Si "x" dans la colonne "filtre" de la Google Sheet (TABLEAU adhesion_annuelle_web ET adhesion_ass_locales) // GET URL https://www.adhesion.afpedagogiesuzuki.fr/inscription/adhesion/carte_manuelle ///////////////////////////////////////////////// const post_cartes_manuelles_envoi = async function(req, res){ logger.info("======================================"); logger.info("======== FUNCTION ENVOI CARTES MANUELLES (adhesion) =========="); logger.info("======================================"); // RÉCUPÉRATION DU CONTENU DE LA GOOGLE SHEET await doc.useServiceAccountAuth(creds); await doc.loadInfo(); // loads document properties and worksheets console.log("NOM FICHIER SHEET: ",doc.title); //nom du fichier const sheet = doc.sheetsByTitle['adhesion_annuelle_web']; const sheet_asslocales = doc.sheetsByTitle['adhesion_ass_locales']; console.log("NOM DU TABLEAU (ONGLET): ",sheet.title); //NOM DU TABLEAU (ONGLET) console.log("NOMBRE DE LIGNE DU TABLEAU: ",sheet.rowCount); // NOMBRE DE LIGNE DU TABLEAU console.log("NOM DU TABLEAU (ONGLET) ASS LOCALES: ",sheet_asslocales.title); //NOM DU TABLEAU (ONGLET) console.log("NOMBRE DE LIGNE DU TABLEAU ASS LOCALES: ",sheet_asslocales.rowCount); // NOMBRE DE LIGNE DU TABLEAU const rows = await sheet.getRows(); console.log("rows[0].identifiant: ", rows[0].identifiant); const rows_asslocales = await sheet_asslocales.getRows(); console.log("rows[0].identifiant: ", rows_asslocales[0].identifiant); // COMBIEN DE LIGNES A LE TABLEAU POUR DÉFINIR LE NOMBRE D'ITÉRATION DE LA BOUCLE // LA GOOGLE SHEET NE DOIT PAS CONTENIR DE LIGNE VIDE let compteur = sheet.rowCount - 1; console.log("compteur: ",compteur); let compteur_asslocales = sheet_asslocales.rowCount - 1; console.log("compteur ASS LOCALES: ",compteur_asslocales); // DATE DU JOUR moment().format(); moment.locale('fr'); var date_formattee = moment().format('L') console.log("date_formattee:", date_formattee); let message_envoye = "carte envoyée le "; message_envoye += date_formattee; // BOUCLE D'ENVOI POUR LE TABLEAU GOOGLE SHEET 'adhesion_annuelle_web' // SI LA CELLULE "filtre" CONTIENT un "x" ON ENVOIE LA CARTE let lesmails = new Array; let nbenvoi = 0; for (let i=0; i { console.log(res); }) .catch((error) => { console.error(error); }); console.log("PDF CREATION APRES"); ////////////////////////////////////////////////////////////////////////////// // CRÉATION DU PDF JUSTIFICATIF DE DON if (rows[i].adherent_paiement_montant_don > 0) { console.log("IF DON = OUI"); var html_don = fs.readFileSync(path.resolve(__dirname, "../pdf/template/don_justificatif.html"), "utf8"); var options_don = { format: "A4", orientation: "portrait", border: "10mm", }; var adresse = rows[i].adherent_adresse_rue; adresse += " "; adresse += rows[i].adherent_adresse_codepostal; adresse += " "; adresse += rows[i].adherent_adresse_ville; var donneur = [ { today: date_formattee, identifiant: rows[i].identifiant, nom: rows[i].adherent_nom, prenom: rows[i].adherent_prenom, adresse: adresse, adherent_paiement_mode: rows[i].adherent_paiement_mode, montant_don: rows[i].adherent_paiement_montant_don }, ]; var pdfname_don = path.resolve(__dirname, "../pdf/adhesion/2526/don/"); pdfname_don += "/"; pdfname_don += rows[i].identifiant; pdfname_don += "_adhesion_2526_don.pdf"; var document_don = { html: html_don, data: { donneur: donneur, }, path: pdfname_don, type: "" }; await pdf .create(document_don, options_don) .then((res) => { console.log(res); }) .catch((error) => { console.error(error); }); } ////////////////////////////////////////////////////////////////////////////// // ENVOIE CARTE ADHERENT + JUSTIFICATIF DE DON PAR MAIL console.log("MAIL ENVOI AVANT"); var transporter = nodemailer.createTransport({ service: 'gmail', auth: { // MAIL JULIE //user: 'juliechaumard@gmail.com', //pass: 'etfq umof iwbx ltxk' // SUZUKI user: 'afpedagogiesuzuki@gmail.com', pass: 'tlxx kjwx ahyx irnl' } }); var attachment_name = rows[i].identifiant; attachment_name += "_adhesion_2526_carteadherent.pdf"; var attachment_don_name = rows[i].identifiant; attachment_don_name += "_adhesion_2526_don.pdf"; var mail_objet = "ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI - ADHÉSION 2025/2026 - "; mail_objet += rows[i].adherent_nom; mail_html = "

Cher adhérent,

Félicitations ! Vous êtes désormais membre de l’Association Française pour la Pédagogie Suzuki (http://www.afpedagogiesuzuki.fr) et de l’European Suzuki Association (https://europeansuzuki.org).
Vous pouvez à ce titre participer à tous les événements Suzuki en France et dans le monde.

Vous trouverez en pièce jointe votre carte d'adhésion annuelle (valable du 1er septembre 2025 au 31 août 2026).

Votre identifiant (valable pour toute la famille) est "; mail_html += rows[i].identifiant; mail_html += ".

"; if (rows[i].adherent_paiement_montant_don > 0) { mail_html += "

Nous vous remercions chaleureusement pour votre don. Votre justificatif est également joint à ce mail

"; } mail_html += "


Nous vous remercions pour votre intérêt et vous souhaitons une très belle année en musique !

Association Française pour la pédagogie Suzuki
Chez Anne PAGES
30 rue des Tattes
74500 PUBLIER

"; if (rows[i].adherent_paiement_montant_don > 0) { var mailOptions = { from: 'afpedagogiesuzuki@gmail.com', to: rows[i].identifiant, subject: mail_objet, html: mail_html, attachments: [{ filename: attachment_name, path: pdfname }, { filename: attachment_don_name, path: pdfname_don } ], }; } else { var mailOptions = { from: 'afpedagogiesuzuki@gmail.com', to: rows[i].identifiant, subject: mail_objet, html: mail_html, attachments: [{ filename: attachment_name, path: pdfname } ], }; } transporter.sendMail(mailOptions, function(error, info){ if (error) { console.log(error); } else { console.log('Email sent: ' + info.response); } }); console.log("MAIL ENVOI APRES"); rows[i].filtre = message_envoye; await rows[i].save(); } } console.log("LISTE lesmails :"); // Supprimer les items vides de l'array lesmails lesmails = lesmails.filter(Boolean); console.log(lesmails); console.log("nbenvoi :",nbenvoi); // BOUCLE D'ENVOI POUR LE TABLEAU GOOGLE SHEET 'adhesion_ass_locales' // SI LA CELLULE "filtre" CONTIENT un "x" ON ENVOIE LA CARTE let nbenvoi2 = 0; let lesmails_asslocales = new Array; for (let i=0; i { console.log(res); }) .catch((error) => { console.error(error); }); console.log("PDF CREATION APRES"); ////////////////////////////////////////////////////////////////////////////// // CRÉATION DU PDF JUSTIFICATIF DE DON if (rows_asslocales[i].adherent_paiement_montant_don > 0) { console.log("IF DON = OUI"); var html_don = fs.readFileSync(path.resolve(__dirname, "../pdf/template/don_justificatif.html"), "utf8"); var options_don = { format: "A4", orientation: "portrait", border: "10mm", }; var adresse = rows_asslocales[i].adherent_adresse_rue; adresse += " "; adresse += rows_asslocales[i].adherent_adresse_codepostal; adresse += " "; adresse += rows_asslocales[i].adherent_adresse_ville; var donneur = [ { today: date_formattee, identifiant: rows_asslocales[i].identifiant, nom: rows_asslocales[i].adherent_nom, prenom: rows_asslocales[i].adherent_prenom, adresse: adresse, adherent_paiement_mode: rows_asslocales[i].adherent_paiement_mode, montant_don: rows_asslocales[i].adherent_paiement_montant_don }, ]; var pdfname_don = path.resolve(__dirname, "../pdf/adhesion/2526/don/"); pdfname_don += "/"; pdfname_don += rows_asslocales[i].identifiant; pdfname_don += "_adhesion_2526_don.pdf"; var document_don = { html: html_don, data: { donneur: donneur, }, path: pdfname_don, type: "" }; await pdf .create(document_don, options_don) .then((res) => { console.log(res); }) .catch((error) => { console.error(error); }); } ////////////////////////////////////////////////////////////////////////////// // ENVOIE CARTE ADHERENT + JUSTIFICATIF DE DON PAR MAIL console.log("MAIL ENVOI AVANT"); var transporter = nodemailer.createTransport({ service: 'gmail', auth: { // MAIL JULIE //user: 'juliechaumard@gmail.com', //pass: 'etfq umof iwbx ltxk' // SUZUKI user: 'afpedagogiesuzuki@gmail.com', pass: 'tlxx kjwx ahyx irnl' } }); var attachment_name = rows_asslocales[i].identifiant; attachment_name += "_adhesion_2526_carteadherent.pdf"; var attachment_don_name = rows_asslocales[i].identifiant; attachment_don_name += "_adhesion_2526_don.pdf"; var mail_objet = "ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI - ADHÉSION 2025/2026 - "; mail_objet += rows_asslocales[i].adherent_nom; mail_html = "

Cher adhérent,

Félicitations ! Vous êtes désormais membre de l’Association Française pour la Pédagogie Suzuki (http://www.afpedagogiesuzuki.fr) et de l’European Suzuki Association (https://europeansuzuki.org).
Vous pouvez à ce titre participer à tous les événements Suzuki en France et dans le monde.

Vous trouverez en pièce jointe votre carte d'adhésion annuelle (valable du 1er septembre 2025 au 31 août 2026).

Votre identifiant (valable pour toute la famille) est "; mail_html += rows_asslocales[i].identifiant; mail_html += ".

"; if (rows_asslocales[i].adherent_paiement_montant_don > 0) { mail_html += "

Nous vous remercions chaleureusement pour votre don. Votre justificatif est également joint à ce mail

"; } mail_html += "


Nous vous remercions pour votre intérêt et vous souhaitons une très belle année en musique !

Association Française pour la pédagogie Suzuki
Chez Anne PAGES
30 rue des Tattes
74500 PUBLIER

"; if (rows_asslocales[i].adherent_paiement_montant_don > 0) { var mailOptions = { from: 'afpedagogiesuzuki@gmail.com', to: rows_asslocales[i].identifiant, subject: mail_objet, html: mail_html, attachments: [{ filename: attachment_name, path: pdfname }, { filename: attachment_don_name, path: pdfname_don } ], }; } else { var mailOptions = { from: 'afpedagogiesuzuki@gmail.com', to: rows_asslocales[i].identifiant, subject: mail_objet, html: mail_html, attachments: [{ filename: attachment_name, path: pdfname } ], }; } transporter.sendMail(mailOptions, function(error, info){ if (error) { console.log(error); } else { console.log('Email sent: ' + info.response); } }); console.log("MAIL ENVOI APRES"); rows_asslocales[i].filtre = message_envoye; await rows_asslocales[i].save(); } } console.log("LISTE lesmails_asslocales :"); // Supprimer les items vides de l'array lesmails_asslocales lesmails_asslocales = lesmails_asslocales.filter(Boolean); console.log(lesmails_asslocales); console.log("nbenvoi2 :",nbenvoi2); // TRAITEMENT FINI, ON AFFICHE LA PAGE AVEC LE RESULTAT req.session.err_mail_form_adhesion_1 = "Cartes adhérents envoyées"; req.session.err_mail_form_adhesion_2 = lesmails; req.session.err_mail_form_adhesion_3 = lesmails_asslocales; res.redirect('/inscription/adhesion/cartes_manuelles'); } ///////////////////////////////////////////////// // GOOGLE SHEET // DÉCHARGEMENT DES DONNÉES DANS GOOGLE SHEET AUTOMATIQUE // IL NE FAUT PAS DE LIGNE VIDES DANS LE GOOGLE SHEET //// mysql2 | moment | google-spreadsheet //// //// ///////////////////////////////////////////////// const maj_googlesheet_auto = async function(req, res) { logger.info("======================================", { label: filename }); logger.info("======== FUNCTION maj_googlesheet_auto (adhesion maj_googlesheet) ==========", { label: filename }); logger.info("======================================", { label: filename }); ///////////////////////////////////////////////// // CONNEXION GSHEET await GS_adhesion.useServiceAccountAuth(GS_creds); await GS_adhesion.loadInfo(); ///////////////////////////////////////////////// // VARIABLES const GS_adhesion_adherent = GS_adhesion.sheetsByTitle['adherent']; const GS_adhesion_professeurs = GS_adhesion.sheetsByTitle['professeurs']; const GS_adhesion_professeurs_stagiaires = GS_adhesion.sheetsByTitle['professeurs_stagiaires']; const GS_adhesion_eleves = GS_adhesion.sheetsByTitle['eleves']; const GS_adhesion_finance = GS_adhesion.sheetsByTitle['finance']; const GS_adhesion_adherent_en_attente = GS_adhesion.sheetsByTitle['adherent_en_attente']; let sql, sql2, sql_recup_prof, sql_update_prof, sql_recup_prof_stagiaires, sql_update_prof_stagiaires, sql_recup_eleves, sql_update_eleves, sql_recup_adh_att, sql_update_adh_att, sql_recup_finance, sql_update_finance; let nb_onglet_adherent = 0; let nb_onglet_prof = 0; let nb_onglet_stagiaires = 0; let nb_onglet_eleves = 0; let nb_onglet_adh_att = 0; let nb_onglet_finance = 0; ///////////////////////////////////////////////// // DATE let now = moment().format("YYYY-MM-DD HH:mm:ss"); ///////////////////////////////////////////////// // CONNECTION DB try { const db_connection_promise = await mysql_promise.createConnection({ host: process.env.db_connection_host, port: process.env.db_connection_port, user: process.env.db_connection_user, password: process.env.db_connection_password, database: process.env.db_connection_database }); //////////////////////////////////////// // MAJ ONGLET adherent // EXECUTE SQL RÉCUPÉRATION INFORMATIONS sql = "SELECT adherent.date_maj, adherent.saison, adherent.identifiant, adherent.association_suzuki, adherent.adherent_type, adherent.adherent_nom, adherent.adherent_prenom, adherent.adherent_telephone_mobile, adherent.adherent_mail, adherent.adherent_adresse_rue, adherent.adherent_adresse_complement, adherent.adherent_adresse_codepostal, adherent.adherent_adresse_ville, adherent.adherent_adresse_pays, adherent.adherent_telephone_fixe, adherent.carte_envoi, adherent_finance.statut_paiement FROM adherent INNER JOIN adherent_finance ON adherent.identifiant = adherent_finance.identifiant WHERE (adherent.gsheet = '' OR adherent.gsheet IS NULL)"; //logger.info("REQUETE SQL - MAJ ONGLET adherent : " + sql , { numsession: req.session.id, label: filename}); const [results, fields] = await db_connection_promise.execute(sql); // Execution SQL logger.info("REQUETE SQL - SELECT ONGLET adherent - Nombre de lignes = " + results.length, { numsession: req.session.id, label: filename}); if (results.length > 0) { logger.info("ON EST DANS if (results.length > 0)", { numsession: req.session.id, label: filename}); // TABLEAU POUR METTRE LES INFORMATIONS const rowsToAdd_adherent = []; for (let i = 0; i < results.length; i++ ) { // Pour chaque ligne trouvée dans la table, on le met dans le tableau rowsToAdd //logger.info("Préparation des données pour injection dans la Google Sheet pour le membre : " + results[i].identifiant, { numsession: req.session.id, label: filename}); if (results[i].statut_paiement === "paye") { nb_onglet_adherent++; rowsToAdd_adherent.push({ 'saison': results[i].saison, 'association': results[i].association_suzuki, 'identifiant': results[i].identifiant, 'adhesion_date': results[i].date_maj, 'adhesion_statut': results[i].statut_paiement, 'adherent_type': results[i].adherent_type, 'adherent_nom': results[i].adherent_nom, 'adherent_prenom': results[i].adherent_prenom, 'adherent_telephone_mobile': "'" + results[i].adherent_telephone_mobile, 'adherent_mail': results[i].adherent_mail, 'adherent_adresse_rue': results[i].adherent_adresse_rue, 'adherent_adresse_complement': results[i].adherent_adresse_complement, 'adherent_adresse_codepostal': results[i].adherent_adresse_codepostal, 'adherent_adresse_ville': results[i].adherent_adresse_ville, 'adherent_adresse_pays': results[i].adherent_adresse_pays, 'adherent_telephone_fixe': "'" + results[i].adherent_telephone_fixe, 'carte_envoi': results[i].carte_envoi, 'date_maj_gsheet': now }); } } // AJOUT DES INFOS DANS GOOGLE SHEET if (rowsToAdd_adherent.length > 0) { try { const ajout_gs_adherents = await GS_adhesion_adherent.addRows(rowsToAdd_adherent); logger.info("Insertion dans Google Sheets adhérents réussie", { numsession: req.session.id, label: filename }); // EXECUTE SQL UPDATE "gsheet" // UNE FOIS LA GOOGLE SHEET MISE A JOUR AVEC LES NOUVEAUX ADHERENTS, ON MODIFIE LE CHAMP "gsheet" de la table dans la BD pour marquer que cette ligne a été importée // Construire la partie SQL pour Faire un UPDATE de plusieurs lignes à la fois try { sql2 = 'UPDATE adherent SET gsheet = CASE '; const identifiants = []; for (let i = 0; i < results.length; i++) { if (results[i].statut_paiement === "paye") { // Ajouter une clause `WHEN` pour chaque identifiant sql2 += `WHEN identifiant = '${results[i].identifiant}' THEN '${now}' `; // Collecter les identifiants pour la clause WHERE identifiants.push(`'${results[i].identifiant}'`); } } // Ajouter la clause WHERE pour limiter les mises à jour aux identifiants concernés sql2 += `END WHERE identifiant IN (${identifiants.join(',')})`; //logger.info("REQUETE SQL - sql2 - MAJ gsheet dans adherent : " + sql2 , { numsession: req.session.id, label: filename}); const [results2, fields2] = await db_connection_promise.execute(sql2); logger.info("UPDATE adherent SET gsheet effectué pour plusieurs lignes : " + results2.changedRows, { numsession: req.session.id, label: filename }); } catch (error) { logger.error("Échec de la mise à jour BD adhérents : " + error.message, { numsession: req.session.id, label: filename }); await db_connection_promise.end(); return; }; } catch (error) { logger.error("Erreur lors de l'ajout des lignes à Google Sheets adhérents : " + error.message, { numsession: req.session.id, label: filename }); await db_connection_promise.end(); return; }; } //////////////////////////////////////// // MAJ ONGLET professeur // EXECUTE SQL RÉCUPÉRATION INFORMATIONS sql_recup_prof = "SELECT adherent_professeur.date_maj, adherent_professeur.saison, adherent_professeur.identifiant, adherent_professeur.association_suzuki, adherent_professeur.adherent_nom, adherent_professeur.adherent_prenom, adherent_professeur.adherent_mail, adherent_professeur.adherent_telephone_mobile, adherent_professeur.adherent_prof_instrument1, adherent_professeur.adherent_prof_instrument1_esa, adherent_professeur.adherent_prof_instrument2, adherent_professeur.adherent_prof_instrument2_esa, adherent_professeur.adherent_prof_sece, adherent_professeur.adherent_prof_ecole1, adherent_professeur.adherent_prof_ecole1_mail, adherent_professeur.adherent_prof_ecole1_web, adherent_professeur.adherent_prof_ecole1_adresse, adherent_professeur.adherent_prof_ecole1_cp, adherent_professeur.adherent_prof_ecole1_ville, adherent_professeur.adherent_prof_ecole2, adherent_professeur.adherent_prof_ecole2_mail, adherent_professeur.adherent_prof_ecole2_web, adherent_professeur.adherent_prof_ecole2_adresse, adherent_professeur.adherent_prof_ecole2_cp, adherent_professeur.adherent_prof_ecole2_ville, adherent_professeur.adherent_prof_ecole3, adherent_professeur.adherent_prof_ecole3_mail, adherent_professeur.adherent_prof_ecole3_web, adherent_professeur.adherent_prof_ecole3_adresse, adherent_professeur.adherent_prof_ecole3_cp, adherent_professeur.adherent_prof_ecole3_ville, adherent_finance.statut_paiement FROM adherent_professeur INNER JOIN adherent_finance ON adherent_finance.identifiant = adherent_professeur.identifiant WHERE (adherent_professeur.gsheet = '' OR adherent_professeur.gsheet IS NULL) AND adherent_finance.statut_paiement = 'paye'"; //logger.info("REQUETE SQL - MAJ ONGLET professeur : " + sql_recup_prof , { numsession: req.session.id, label: filename}); const [results_recup_prof, fields_recup_prof] = await db_connection_promise.execute(sql_recup_prof); // Execution SQL logger.info("REQUETE SQL - SELECT ONGLET professeur - Nombre de lignes = " + results_recup_prof.length, { numsession: req.session.id, label: filename}); nb_onglet_prof = results_recup_prof.length; // Pour afficher le résultat du nombre d'adhérents copiés dans la page web if (results_recup_prof.length > 0) { // TABLEAU POUR METTRE LES INFORMATIONS const rowsToAdd_prof = []; for (let i = 0; i < results_recup_prof.length; i++ ) { // Pour chaque ligne trouvée dans la table, on le met dans le tableau rowsToAdd //logger.info("Préparation des données pour injection dans la Google Sheet pour le membre : " + results_recup_prof[i].identifiant, { numsession: req.session.id, label: filename}); rowsToAdd_prof.push({ 'saison': results_recup_prof[i].saison, 'association': results_recup_prof[i].association_suzuki, 'identifiant': results_recup_prof[i].identifiant, 'adhesion_date': results_recup_prof[i].date_maj, 'adherent_nom': results_recup_prof[i].adherent_nom, 'adherent_prenom': results_recup_prof[i].adherent_prenom, 'adherent_mail': results_recup_prof[i].adherent_mail, 'adherent_telephone_mobile': "'" + results_recup_prof[i].adherent_telephone_mobile, 'adherent_prof_instrument1': results_recup_prof[i].adherent_prof_instrument1, 'adherent_prof_instrument1_esa': results_recup_prof[i].adherent_prof_instrument1_esa, 'adherent_prof_instrument2': results_recup_prof[i].adherent_prof_instrument2, 'adherent_prof_instrument2_esa': results_recup_prof[i].adherent_prof_instrument2_esa, 'adherent_prof_sece': results_recup_prof[i].adherent_prof_sece, 'adherent_prof_ecole1': results_recup_prof[i].adherent_prof_ecole1, 'adherent_prof_ecole1_adresse': results_recup_prof[i].adherent_prof_ecole1_adresse, 'adherent_prof_ecole1_cp': results_recup_prof[i].adherent_prof_ecole1_cp, 'adherent_prof_ecole1_ville': results_recup_prof[i].adherent_prof_ecole1_ville, 'adherent_prof_ecole1_mail': results_recup_prof[i].adherent_prof_ecole1_mail, 'adherent_prof_ecole1_web': results_recup_prof[i].adherent_prof_ecole1_web, 'adherent_prof_ecole2': results_recup_prof[i].adherent_prof_ecole2, 'adherent_prof_ecole2_adresse': results_recup_prof[i].adherent_prof_ecole2_adresse, 'adherent_prof_ecole2_cp': results_recup_prof[i].adherent_prof_ecole2_cp, 'adherent_prof_ecole2_ville': results_recup_prof[i].adherent_prof_ecole2_ville, 'adherent_prof_ecole2_mail': results_recup_prof[i].adherent_prof_ecole2_mail, 'adherent_prof_ecole2_web': results_recup_prof[i].adherent_prof_ecole2_web, 'adherent_prof_ecole3': results_recup_prof[i].adherent_prof_ecole3, 'adherent_prof_ecole3_adresse': results_recup_prof[i].adherent_prof_ecole3_adresse, 'adherent_prof_ecole3_cp': results_recup_prof[i].adherent_prof_ecole3_cp, 'adherent_prof_ecole3_ville': results_recup_prof[i].adherent_prof_ecole3_ville, 'adherent_prof_ecole3_mail': results_recup_prof[i].adherent_prof_ecole3_mail, 'adherent_prof_ecole3_web': results_recup_prof[i].adherent_prof_ecole3_web, 'date_maj_gsheet': now }); } // AJOUT DES INFOS DANS GOOGLE SHEET if (rowsToAdd_prof.length > 0) { try { const ajout_gs_prof = await GS_adhesion_professeurs.addRows(rowsToAdd_prof); logger.info("Insertion dans Google Sheets professeur réussie", { numsession: req.session.id, label: filename }); // EXECUTE SQL UPDATE "gsheet" // UNE FOIS LA GOOGLE SHEET MISE A JOUR AVEC LES NOUVEAUX ADHERENTS, ON MODIFIE LE CHAMP "gsheet" de la table dans la BD pour marquer que cette ligne a été importée // Construire la partie SQL pour Faire un UPDATE de plusieurs lignes à la fois try { sql_update_prof = 'UPDATE adherent_professeur SET gsheet = CASE '; const identifiants_prof = []; for (let i = 0; i < results_recup_prof.length; i++) { // Ajouter une clause `WHEN` pour chaque identifiant sql_update_prof += `WHEN identifiant = '${results_recup_prof[i].identifiant}' THEN '${now}' `; // Collecter les identifiants pour la clause WHERE identifiants_prof.push(`'${results_recup_prof[i].identifiant}'`); } // Ajouter la clause WHERE pour limiter les mises à jour aux identifiants concernés sql_update_prof += `END WHERE identifiant IN (${identifiants_prof.join(',')})`; //logger.info("REQUETE SQL - sql_update_prof - MAJ gsheet dans professeur : " + sql_update_prof , { numsession: req.session.id, label: filename}); const [results_update_prof, fields_update_prof] = await db_connection_promise.execute(sql_update_prof); logger.info("UPDATE professeur SET gsheet effectué pour plusieurs lignes : " + results_update_prof.changedRows, { numsession: req.session.id, label: filename }); } catch (error) { logger.error("Échec de la mise à jour BD prof : " + error.message, { numsession: req.session.id, label: filename }); await db_connection_promise.end(); return; }; } catch (error) { logger.error("Erreur lors de l'ajout des lignes à Google Sheets prof : " + error.message, { numsession: req.session.id, label: filename }); await db_connection_promise.end(); return; }; } } //////////////////////////////////////// // MAJ ONGLET professeurs_stagiaires // EXECUTE SQL RÉCUPÉRATION INFORMATIONS sql_recup_prof_stagiaires = "SELECT adherent_formation_prof.date_maj, adherent_formation_prof.saison, adherent_formation_prof.identifiant, adherent_formation_prof.association_suzuki, adherent_formation_prof.adherent_nom, adherent_formation_prof.adherent_prenom, adherent_formation_prof.adherent_mail, adherent_formation_prof.adherent_telephone_mobile, adherent_formation_prof.adherent_prof_stagiaire_instrument1, adherent_formation_prof.adherent_prof_stagiaire_instrument1_esa, adherent_formation_prof.adherent_prof_stagiaire_instrument1_prof, adherent_formation_prof.adherent_prof_stagiaire_instrument2, adherent_formation_prof.adherent_prof_stagiaire_instrument2_esa, adherent_formation_prof.adherent_prof_stagiaire_instrument2_prof, adherent_finance.statut_paiement FROM adherent_formation_prof INNER JOIN adherent_finance ON adherent_finance.identifiant = adherent_formation_prof.identifiant WHERE (adherent_formation_prof.gsheet = '' OR adherent_formation_prof.gsheet IS NULL) AND adherent_finance.statut_paiement = 'paye'"; //logger.info("REQUETE SQL - MAJ ONGLET professeurs_stagiaires : " + sql_recup_prof_stagiaires , { numsession: req.session.id, label: filename}); const [results_recup_prof_stagiaires, fields_recup_prof_stagiaires] = await db_connection_promise.execute(sql_recup_prof_stagiaires); // Execution SQL logger.info("REQUETE SQL - SELECT ONGLET professeurs_stagiaires - Nombre de lignes = " + results_recup_prof_stagiaires.length, { numsession: req.session.id, label: filename}); nb_onglet_stagiaires = results_recup_prof_stagiaires.length; // Pour afficher le résultat du nombre d'adhérents copiés dans la page web if (results_recup_prof_stagiaires.length > 0) { // TABLEAU POUR METTRE LES INFORMATIONS const rowsToAdd_prof_stagiaires = []; for (let i = 0; i < results_recup_prof_stagiaires.length; i++ ) { // Pour chaque ligne trouvée dans la table, on le met dans le tableau rowsToAdd //logger.info("Préparation des données pour injection dans la Google Sheet pour le membre : " + results_recup_prof_stagiaires[i].identifiant, { numsession: req.session.id, label: filename}); rowsToAdd_prof_stagiaires.push({ 'saison': results_recup_prof_stagiaires[i].saison, 'association': results_recup_prof_stagiaires[i].association_suzuki, 'identifiant': results_recup_prof_stagiaires[i].identifiant, 'adhesion_date': results_recup_prof_stagiaires[i].date_maj, 'adherent_nom': results_recup_prof_stagiaires[i].adherent_nom, 'adherent_prenom': results_recup_prof_stagiaires[i].adherent_prenom, 'adherent_mail': results_recup_prof_stagiaires[i].adherent_mail, 'adherent_telephone_mobile': "'" + results_recup_prof_stagiaires[i].adherent_telephone_mobile, 'adherent_prof_stagiaire_instrument1': results_recup_prof_stagiaires[i].adherent_prof_stagiaire_instrument1, 'adherent_prof_stagiaire_instrument1_esa': results_recup_prof_stagiaires[i].adherent_prof_stagiaire_instrument1_esa, 'adherent_prof_stagiaire_instrument1_prof': results_recup_prof_stagiaires[i].adherent_prof_stagiaire_instrument1_prof, 'adherent_prof_stagiaire_instrument2': results_recup_prof_stagiaires[i].adherent_prof_stagiaire_instrument2, 'adherent_prof_stagiaire_instrument2_esa': results_recup_prof_stagiaires[i].adherent_prof_stagiaire_instrument2_esa, 'adherent_prof_stagiaire_instrument2_prof': results_recup_prof_stagiaires[i].adherent_prof_stagiaire_instrument2_prof, 'date_maj_gsheet': now }); } // AJOUT DES INFOS DANS GOOGLE SHEET if (rowsToAdd_prof_stagiaires.length > 0) { try { const ajout_gs_prof_stagiaires = await GS_adhesion_professeurs_stagiaires.addRows(rowsToAdd_prof_stagiaires); logger.info("Insertion dans Google Sheets professeurs_stagiaires réussie", { numsession: req.session.id, label: filename }); // EXECUTE SQL UPDATE "gsheet" // UNE FOIS LA GOOGLE SHEET MISE A JOUR AVEC LES NOUVEAUX ADHERENTS, ON MODIFIE LE CHAMP "gsheet" de la table dans la BD pour marquer que cette ligne a été importée // Construire la partie SQL pour Faire un UPDATE de plusieurs lignes à la fois try { sql_update_prof_stagiaires = 'UPDATE adherent_formation_prof SET gsheet = CASE '; const identifiants_prof_stagiaires = []; for (let i = 0; i < results_recup_prof_stagiaires.length; i++) { // Ajouter une clause `WHEN` pour chaque identifiant sql_update_prof_stagiaires += `WHEN identifiant = '${results_recup_prof_stagiaires[i].identifiant}' THEN '${now}' `; // Collecter les identifiants pour la clause WHERE identifiants_prof_stagiaires.push(`'${results_recup_prof_stagiaires[i].identifiant}'`); } // Ajouter la clause WHERE pour limiter les mises à jour aux identifiants concernés sql_update_prof_stagiaires += `END WHERE identifiant IN (${identifiants_prof_stagiaires.join(',')})`; //logger.info("REQUETE SQL - sql_update_prof_stagiaires - MAJ gsheet dans professeurs_stagiaires : " + sql_update_prof_stagiaires , { numsession: req.session.id, label: filename}); const [results_update_prof_stagiaires, fields_update_prof_stagiaires] = await db_connection_promise.execute(sql_update_prof_stagiaires); logger.info("UPDATE professeurs_stagiaires SET gsheet effectué pour plusieurs lignes : " + results_update_prof_stagiaires.changedRows, { numsession: req.session.id, label: filename }); } catch (error) { logger.error("Échec de la mise à jour BD prof stagiaires : " + error.message, { numsession: req.session.id, label: filename }); await db_connection_promise.end(); return; }; } catch (error) { logger.error("Erreur lors de l'ajout des lignes à Google Sheets prof stagiaires : " + error.message, { numsession: req.session.id, label: filename }); await db_connection_promise.end(); return; }; } } //////////////////////////////////////// // MAJ ONGLET eleves // EXECUTE SQL RÉCUPÉRATION INFORMATIONS sql_recup_eleves = "SELECT adherent_eleve.date_maj, adherent_eleve.saison, adherent_eleve.identifiant, adherent_eleve.association_suzuki, adherent_eleve.eleve_nom, adherent_eleve.eleve_prenom, adherent_eleve.adherent_mail, adherent_eleve.adherent_telephone_mobile, adherent_eleve.eleve_datenaissance, adherent_eleve.eleve_instrumentA, adherent_eleve.eleve_instrumentA_cahier, adherent_eleve.eleve_instrumentA_prof, adherent_eleve.eleve_instrumentB, adherent_eleve.eleve_instrumentB_cahier, adherent_eleve.eleve_instrumentB_prof, adherent_eleve.eleve_droitimage, adherent_eleve.eleve_contactsup_nom, adherent_eleve.eleve_contactsup_prenom, adherent_eleve.eleve_contactsup_mail, adherent_finance.statut_paiement FROM adherent_eleve INNER JOIN adherent_finance ON adherent_finance.identifiant = adherent_eleve.identifiant WHERE (adherent_eleve.gsheet = '' OR adherent_eleve.gsheet IS NULL) AND adherent_finance.statut_paiement = 'paye'"; //logger.info("REQUETE SQL - MAJ ONGLET eleves : " + sql_recup_eleves , { numsession: req.session.id, label: filename}); const [results_recup_eleves, fields_recup_eleves] = await db_connection_promise.execute(sql_recup_eleves); // Execution SQL logger.info("REQUETE SQL - SELECT ONGLET eleves - Nombre de lignes = " + results_recup_eleves.length, { numsession: req.session.id, label: filename}); nb_onglet_eleves = results_recup_eleves.length; // Pour afficher le résultat du nombre d'adhérents copiés dans la page web if (results_recup_eleves.length > 0) { // TABLEAU POUR METTRE LES INFORMATIONS const rowsToAdd_eleves = []; for (let i = 0; i < results_recup_eleves.length; i++ ) { // Pour chaque ligne trouvée dans la table, on le met dans le tableau rowsToAdd //logger.info("Préparation des données pour injection dans la Google Sheet pour le membre : " + results_recup_eleves[i].identifiant, { numsession: req.session.id, label: filename}); rowsToAdd_eleves.push({ 'saison': results_recup_eleves[i].saison, 'association': results_recup_eleves[i].association_suzuki, 'identifiant': results_recup_eleves[i].identifiant, 'adhesion_date': results_recup_eleves[i].date_maj, 'eleve_nom': results_recup_eleves[i].eleve_nom, 'eleve_prenom': results_recup_eleves[i].eleve_prenom, 'eleve_datenaissance': results_recup_eleves[i].eleve_datenaissance, 'adherent_mail': results_recup_eleves[i].adherent_mail, 'adherent_telephone_mobile': "'" + results_recup_eleves[i].adherent_telephone_mobile, 'eleve_instrumentA': results_recup_eleves[i].eleve_instrumentA, 'eleve_instrumentA_cahier': results_recup_eleves[i].eleve_instrumentA_cahier, 'eleve_instrumentA_prof': results_recup_eleves[i].eleve_instrumentA_prof, 'eleve_instrumentB': results_recup_eleves[i].eleve_instrumentB, 'eleve_instrumentB_cahier': results_recup_eleves[i].eleve_instrumentB_cahier, 'eleve_instrumentB_prof': results_recup_eleves[i].eleve_instrumentB_prof, 'eleve_droitimage': results_recup_eleves[i].eleve_droitimage, 'eleve_contactsup_nom': results_recup_eleves[i].eleve_contactsup_nom, 'eleve_contactsup_prenom': results_recup_eleves[i].eleve_contactsup_prenom, 'eleve_contactsup_mail': results_recup_eleves[i].eleve_contactsup_mail, 'date_maj_gsheet': now }); } // AJOUT DES INFOS DANS GOOGLE SHEET if (rowsToAdd_eleves.length > 0) { try { const ajout_gs_eleves = await GS_adhesion_eleves.addRows(rowsToAdd_eleves); logger.info("Insertion dans Google Sheets eleves réussie", { numsession: req.session.id, label: filename }); // EXECUTE SQL UPDATE "gsheet" // UNE FOIS LA GOOGLE SHEET MISE A JOUR AVEC LES NOUVEAUX ADHERENTS, ON MODIFIE LE CHAMP "gsheet" de la table dans la BD pour marquer que cette ligne a été importée // Construire la partie SQL pour Faire un UPDATE de plusieurs lignes à la fois try { sql_update_eleves = 'UPDATE adherent_eleve SET gsheet = CASE '; const identifiants_eleves = []; for (let i = 0; i < results_recup_eleves.length; i++) { // Ajouter une clause `WHEN` pour chaque identifiant sql_update_eleves += `WHEN identifiant = '${results_recup_eleves[i].identifiant}' THEN '${now}' `; // Collecter les identifiants pour la clause WHERE identifiants_eleves.push(`'${results_recup_eleves[i].identifiant}'`); } // Ajouter la clause WHERE pour limiter les mises à jour aux identifiants concernés sql_update_eleves += `END WHERE identifiant IN (${identifiants_eleves.join(',')})`; //logger.info("REQUETE SQL - sql_update_eleves - MAJ gsheet dans eleves : " + sql_update_eleves , { numsession: req.session.id, label: filename}); const [results_update_eleves, fields_update_eleves] = await db_connection_promise.execute(sql_update_eleves); logger.info("UPDATE eleves SET gsheet effectué pour plusieurs lignes : " + results_update_eleves.changedRows, { numsession: req.session.id, label: filename }); } catch (error) { logger.error("Échec de la mise à jour BD eleves : " + error.message, { numsession: req.session.id, label: filename }); await db_connection_promise.end(); return; }; } catch (error) { logger.error("Erreur lors de l'ajout des lignes à Google Sheets eleves : " + error.message, { numsession: req.session.id, label: filename }); await db_connection_promise.end(); return; }; } } //////////////////////////////////////// // MAJ ONGLET adherent_en_attente // EXECUTE SQL RÉCUPÉRATION INFORMATIONS sql_recup_adh_att = "SELECT adherent_finance.date_maj, adherent_finance.saison, adherent_finance.identifiant, adherent_finance.association_suzuki, adherent_finance.adherent_type, adherent_finance.adherent_nom, adherent_finance.adherent_prenom, adherent_finance.adherent_telephone_mobile, adherent_finance.adherent_mail, adherent_finance.montant_adhesion, adherent_finance.montant_don, adherent_finance.montant_total, adherent_finance.paiement_mode, adherent_finance.date_paiement, adherent_finance.stripe_retour, adherent_finance.cheque_banque, adherent_finance.cheque_numero, adherent_finance.statut_paiement FROM adherent_finance WHERE (adherent_finance.gs_adherent_att = '' OR adherent_finance.gs_adherent_att IS NULL) AND (adherent_finance.statut_paiement <> 'paye' OR adherent_finance.statut_paiement IS NULL OR adherent_finance.statut_paiement = '')"; //logger.info("REQUETE SQL - MAJ ONGLET adherent_en_attente : " + sql_recup_adh_att , { numsession: req.session.id, label: filename}); const [results_recup_adh_att, fields_recup_adh_att] = await db_connection_promise.execute(sql_recup_adh_att); // Execution SQL logger.info("REQUETE SQL - SELECT ONGLET adherent_en_attente - Nombre de lignes = " + results_recup_adh_att.length, { numsession: req.session.id, label: filename}); nb_onglet_adh_att = results_recup_adh_att.length; // Pour afficher le résultat du nombre d'adhérents copiés dans la page web if (results_recup_adh_att.length > 0) { // TABLEAU POUR METTRE LES INFORMATIONS const rowsToAdd_adh_att = []; for (let i = 0; i < results_recup_adh_att.length; i++ ) { // Pour chaque ligne trouvée dans la table, on le met dans le tableau rowsToAdd //logger.info("Préparation des données pour injection dans la Google Sheet pour le membre : " + results_recup_adh_att[i].identifiant, { numsession: req.session.id, label: filename}); rowsToAdd_adh_att.push({ 'saison': results_recup_adh_att[i].saison, 'association': results_recup_adh_att[i].association_suzuki, 'identifiant': results_recup_adh_att[i].identifiant, 'adhesion_date': results_recup_adh_att[i].date_maj, 'adherent_type': results_recup_adh_att[i].adherent_type, 'adherent_nom': results_recup_adh_att[i].adherent_nom, 'adherent_prenom': results_recup_adh_att[i].adherent_prenom, 'adherent_telephone_mobile': "'" + results_recup_adh_att[i].adherent_telephone_mobile, 'adherent_mail': results_recup_adh_att[i].adherent_mail, 'montant_adhesion': results_recup_adh_att[i].montant_adhesion, 'montant_don': results_recup_adh_att[i].montant_don, 'montant_total': results_recup_adh_att[i].montant_total, 'paiement_mode': results_recup_adh_att[i].paiement_mode, 'date_paiement': results_recup_adh_att[i].date_paiement, 'stripe_retour': results_recup_adh_att[i].stripe_retour, 'cheque_banque': results_recup_adh_att[i].cheque_banque, 'cheque_numero': results_recup_adh_att[i].cheque_numero, 'statut_paiement': results_recup_adh_att[i].statut_paiement, 'date_maj_gsheet': now }); } // AJOUT DES INFOS DANS GOOGLE SHEET if (rowsToAdd_adh_att.length > 0) { try { const ajout_gs_adh_att = await GS_adhesion_adherent_en_attente.addRows(rowsToAdd_adh_att); logger.info("Insertion dans Google Sheets adhérent en attente réussie", { numsession: req.session.id, label: filename }); // EXECUTE SQL UPDATE "gsheet" // UNE FOIS LA GOOGLE SHEET MISE A JOUR AVEC LES NOUVEAUX ADHERENTS, ON MODIFIE LE CHAMP "gsheet" de la table dans la BD pour marquer que cette ligne a été importée // Construire la partie SQL pour Faire un UPDATE de plusieurs lignes à la fois try { sql_update_adh_att = 'UPDATE adherent_finance SET gs_adherent_att = CASE '; const identifiants_adh_att = []; for (let i = 0; i < results_recup_adh_att.length; i++) { // Ajouter une clause `WHEN` pour chaque identifiant sql_update_adh_att += `WHEN identifiant = '${results_recup_adh_att[i].identifiant}' THEN '${now}' `; // Collecter les identifiants pour la clause WHERE identifiants_adh_att.push(`'${results_recup_adh_att[i].identifiant}'`); } // Ajouter la clause WHERE pour limiter les mises à jour aux identifiants concernés sql_update_adh_att += `END WHERE identifiant IN (${identifiants_adh_att.join(',')})`; //logger.info("REQUETE SQL - sql_update_adh_att - MAJ gsheet dans adherent_en_attente : " + sql_update_adh_att , { numsession: req.session.id, label: filename}); const [results_update_adh_att, fields_update_adh_att] = await db_connection_promise.execute(sql_update_adh_att); logger.info("UPDATE adherent_finance SET gs_adherent_att effectué pour plusieurs lignes : " + results_update_adh_att.changedRows, { numsession: req.session.id, label: filename }); } catch (error) { logger.error("Échec de la mise à jour BD adherent_finance : " + error.message, { numsession: req.session.id, label: filename }); await db_connection_promise.end(); return; }; } catch (error) { logger.error("Erreur lors de l'ajout des lignes à Google Sheets adherent_en_attente : " + error.message, { numsession: req.session.id, label: filename }); await db_connection_promise.end(); return; }; } } //////////////////////////////////////// // MAJ ONGLET finance // EXECUTE SQL RÉCUPÉRATION INFORMATIONS sql_recup_finance = "SELECT adherent_finance.date_maj, adherent_finance.saison, adherent_finance.identifiant, adherent_finance.association_suzuki, adherent_finance.adherent_type, adherent_finance.adherent_nom, adherent_finance.adherent_prenom, adherent_finance.adherent_telephone_mobile, adherent_finance.adherent_mail, adherent_finance.montant_adhesion, adherent_finance.montant_don, adherent_finance.montant_total, adherent_finance.paiement_mode, adherent_finance.date_paiement, adherent_finance.stripe_retour, adherent_finance.cheque_banque, adherent_finance.cheque_numero, adherent_finance.statut_paiement FROM adherent_finance WHERE (adherent_finance.gsheet = '' OR adherent_finance.gsheet IS NULL) AND adherent_finance.statut_paiement = 'paye'"; //logger.info("REQUETE SQL - MAJ ONGLET finances : " + sql_recup_finance , { numsession: req.session.id, label: filename}); const [results_recup_finance, fields_recup_finance] = await db_connection_promise.execute(sql_recup_finance); // Execution SQL logger.info("REQUETE SQL - SELECT ONGLET finance - Nombre de lignes = " + results_recup_finance.length, { numsession: req.session.id, label: filename}); nb_onglet_finance = results_recup_finance.length; // Pour afficher le résultat du nombre d'adhérents copiés dans la page web if (results_recup_finance.length > 0) { // TABLEAU POUR METTRE LES INFORMATIONS const rowsToAdd_finance = []; for (let i = 0; i < results_recup_finance.length; i++ ) { // Pour chaque ligne trouvée dans la table, on le met dans le tableau rowsToAdd //logger.info("Préparation des données pour injection dans la Google Sheet pour le membre : " + results_recup_finance[i].identifiant, { numsession: req.session.id, label: filename}); rowsToAdd_finance.push({ 'saison': results_recup_finance[i].saison, 'association': results_recup_finance[i].association_suzuki, 'identifiant': results_recup_finance[i].identifiant, 'adhesion_date': results_recup_finance[i].date_maj, 'adherent_type': results_recup_finance[i].adherent_type, 'adherent_nom': results_recup_finance[i].adherent_nom, 'adherent_prenom': results_recup_finance[i].adherent_prenom, 'adherent_telephone_mobile': "'" + results_recup_finance[i].adherent_telephone_mobile, 'adherent_mail': results_recup_finance[i].adherent_mail, 'montant_adhesion': results_recup_finance[i].montant_adhesion, 'montant_don': results_recup_finance[i].montant_don, 'montant_total': results_recup_finance[i].montant_total, 'paiement_mode': results_recup_finance[i].paiement_mode, 'date_paiement': results_recup_finance[i].date_paiement, 'stripe_retour': results_recup_finance[i].stripe_retour, 'cheque_banque': results_recup_finance[i].cheque_banque, 'cheque_numero': results_recup_finance[i].cheque_numero, 'statut_paiement': results_recup_finance[i].statut_paiement, 'date_maj_gsheet': now }); } // AJOUT DES INFOS DANS GOOGLE SHEET if (rowsToAdd_finance.length > 0) { try { const ajout_gs_finance = await GS_adhesion_finance.addRows(rowsToAdd_finance); logger.info("Insertion dans Google Sheets finance réussie", { numsession: req.session.id, label: filename }); // EXECUTE SQL UPDATE "gsheet" // UNE FOIS LA GOOGLE SHEET MISE A JOUR AVEC LES NOUVEAUX ADHERENTS, ON MODIFIE LE CHAMP "gsheet" de la table dans la BD pour marquer que cette ligne a été importée // Construire la partie SQL pour Faire un UPDATE de plusieurs lignes à la fois try { sql_update_finance = 'UPDATE adherent_finance SET gsheet = CASE '; const identifiants_finance = []; for (let i = 0; i < results_recup_finance.length; i++) { // Ajouter une clause `WHEN` pour chaque identifiant sql_update_finance += `WHEN identifiant = '${results_recup_finance[i].identifiant}' THEN '${now}' `; // Collecter les identifiants pour la clause WHERE identifiants_finance.push(`'${results_recup_finance[i].identifiant}'`); } // Ajouter la clause WHERE pour limiter les mises à jour aux identifiants concernés sql_update_finance += `END WHERE identifiant IN (${identifiants_finance.join(',')})`; //logger.info("REQUETE SQL - sql_update_finance - MAJ gsheet dans finance : " + sql_update_finance , { numsession: req.session.id, label: filename}); const [results_update_finance, fields_update_finance] = await db_connection_promise.execute(sql_update_finance); logger.info("UPDATE finance SET gsheet effectué pour plusieurs lignes : " + results_update_finance.changedRows, { numsession: req.session.id, label: filename }); } catch (error) { logger.error("Échec de la mise à jour BD finance : " + error.message, { numsession: req.session.id, label: filename }); await db_connection_promise.end(); return; }; } catch (error) { logger.error("Erreur lors de l'ajout des lignes à Google Sheets finance : " + error.message, { numsession: req.session.id, label: filename }); await db_connection_promise.end(); return; }; } } } else { logger.info("PAS D'ADHÉRENTS À METTRE À JOUR", { numsession: req.session.id, label: filename}); } /////////////////////////////////////////////////////////////////////// // ENVOIE MAIL APRES EXECUTION logger.info("MAIL ENVOI AVANT", { numsession: req.session.id }); var transporter = nodemailer.createTransport({ service: 'gmail', auth: { user: process.env.nodemailer_user, pass: process.env.nodemailer_pass } }); var mail_objet = "ADUZUKI - CRON WEBHOOK MAJ GS ADHESION"; mail_html = "

Pour l'administrateur de l'application ADUZUKI,


Ceci est le mail d'envoi pour confirmer l'exécution du Webhook de mise à jour de la Google Sheet des adhésions qui se fait la nuit à 3h.

"; mail_html += "

- nombre d'adhérents mis à jour : "; mail_html += nb_onglet_adherent; mail_html += "

"; mail_html += "

- nombre de professeurs mis à jour : "; mail_html += nb_onglet_prof; mail_html += "

"; mail_html += "

- nombre de professeurs stagiaires mis à jour : "; mail_html += nb_onglet_stagiaires; mail_html += "

"; mail_html += "

- nombre d'élèves mis à jour : "; mail_html += nb_onglet_eleves; mail_html += "

"; mail_html += "

- nombre d'adhésions en attente mis à jour : "; mail_html += nb_onglet_adh_att; mail_html += "

"; mail_html += "

- nombre de lignes finance mis à jour : "; mail_html += nb_onglet_finance; mail_html += "

"; mail_html += "

Julie Chaumard

Développeuse web de l'agence Parisweb.art

"; var mailOptions = { from: 'afps.inscription@gmail.com', to: "projet@parisweb.art", subject: mail_objet, html: mail_html }; transporter.sendMail(mailOptions, function(error, info){ if (error) { logger.info("error" + error, { numsession: req.session.id }); } else { logger.info("Email envoyé: " + info.response, { numsession: req.session.id }); } }); logger.info("MAIL ENVOI APRES", { numsession: req.session.id }); /////////////////////////////////////////////////////////////////////// // FERMETURE DU PROGRAMME await db_connection_promise.end(); logger.info("ON EST DANS LA FERMETURE", { numsession: req.session.id, label: filename}); return { nb_onglet_adherent, nb_onglet_prof, nb_onglet_stagiaires, nb_onglet_eleves,nb_onglet_adh_att, nb_onglet_finance }; } catch (error) { // Echec de connection à la BD logger.error("Il y a un problème avec la connection à la base de données! : " + error, { numsession: req.session.id }); await db_connection_promise.end(); //Fermeture connexion DB return; }; } ///////////////////////////////////////////////// // GOOGLE SHEET // DÉCHARGEMENT DES DONNÉES DANS GOOGLE SHEET // IL NE FAUT PAS DE LIGNE VIDES DANS LE GOOGLE SHEET //// mysql2 | moment | google-spreadsheet //// //// ///////////////////////////////////////////////// const maj_googlesheet = async function(req, res) { logger.info("======================================", { label: filename }); logger.info("======== FUNCTION maj_googlesheet (adhesion maj_googlesheet) ==========", { label: filename }); logger.info("======================================", { label: filename }); ///////////////////////////////////////////////// // CONNEXION GSHEET await GS_adhesion.useServiceAccountAuth(GS_creds); await GS_adhesion.loadInfo(); ///////////////////////////////////////////////// // VARIABLES const GS_adhesion_adherent = GS_adhesion.sheetsByTitle['adherent']; const GS_adhesion_professeurs = GS_adhesion.sheetsByTitle['professeurs']; const GS_adhesion_professeurs_stagiaires = GS_adhesion.sheetsByTitle['professeurs_stagiaires']; const GS_adhesion_eleves = GS_adhesion.sheetsByTitle['eleves']; const GS_adhesion_finance = GS_adhesion.sheetsByTitle['finance']; const GS_adhesion_adherent_en_attente = GS_adhesion.sheetsByTitle['adherent_en_attente']; let sql, sql2, sql3, sql4, sql5, sql6, sql7, sql8, sql9, sql10, sql11, sql12; ///////////////////////////////////////////////// // DATE let now = moment().format("YYYY-MM-DD HH:mm:ss"); ///////////////////////////////////////////////// // RÉCUPÉRATION DES DONNÉES DES TABLES DE LA BD // CONNECTION DB try { const db_connection_promise = await mysql_promise.createConnection({ host: process.env.db_connection_host, port: process.env.db_connection_port, user: process.env.db_connection_user, password: process.env.db_connection_password, database: process.env.db_connection_database }); logger.info("======================================", { label: filename }); logger.info("Connected TO DATABASE test with mysql2 PREMISE !", { label: filename }); logger.info("======================================", { label: filename }); // MAJ ONGLET adherent sql = "SELECT adherent.date_maj, adherent.saison, adherent.identifiant, adherent.association_suzuki, adherent.adherent_type, adherent.adherent_nom, adherent.adherent_prenom, adherent.adherent_telephone_mobile, adherent.adherent_mail, adherent.adherent_adresse_rue, adherent.adherent_adresse_complement, adherent.adherent_adresse_codepostal, adherent.adherent_adresse_ville, adherent.adherent_adresse_pays, adherent.adherent_telephone_fixe, adherent.carte_envoi, adherent_finance.statut_paiement FROM adherent INNER JOIN adherent_finance ON adherent_finance.identifiant = adherent.identifiant WHERE (adherent.gsheet = '' OR adherent.gsheet IS NULL) AND adherent_finance.statut_paiement = 'paye'"; logger.info("REQUETE SQL - MAJ ONGLET adherent : " + sql , { numsession: req.session.id, label: filename}); const [results, fields] = await db_connection_promise.execute(sql); // Execution SQL logger.info("REQUETE SQL - MAJ ONGLET adherent - Nombre de lignes = " + results.length, { numsession: req.session.id, label: filename}); req.session.nb_adherent_maj = results.length; // Pour afficher le résultat du nombre d'adhérents copiés dans la page web if (results.length) { for (let i = 0; i < results.length; i++ ) { // Pour chaque ligne trouvée dans la table, on l'écrit dans les onglets correspondants logger.info("avant const ajout_gs_adherents = await GS_adhesion_adherent.addRows" + results[i].identifiant, { numsession: req.session.id, label: filename}); const ajout_gs_adherents = await GS_adhesion_adherent.addRows( [ { 'saison': results[i].saison, 'association': results[i].association_suzuki, 'identifiant': results[i].identifiant, 'adhesion_date': results[i].date_maj, 'adhesion_statut': results[i].statut_paiement, 'adherent_type': results[i].adherent_type, 'adherent_nom': results[i].adherent_nom, 'adherent_prenom': results[i].adherent_prenom, 'adherent_telephone_mobile': "'" + results[i].adherent_telephone_mobile, 'adherent_mail': results[i].adherent_mail, 'adherent_adresse_rue': results[i].adherent_adresse_rue, 'adherent_adresse_complement': results[i].adherent_adresse_complement, 'adherent_adresse_codepostal': results[i].adherent_adresse_codepostal, 'adherent_adresse_ville': results[i].adherent_adresse_ville, 'adherent_adresse_pays': results[i].adherent_adresse_pays, 'adherent_telephone_fixe': results[i].adherent_telephone_fixe, 'carte_envoi': results[i].carte_envoi, 'date_maj_gsheet': now } ] ); // POUR EVITER DE DÉPASSER LE QUOTA DE GOOGLE API REQUEST PER MINUTE await sleep.wait(5000); logger.info("await delay(15000)", { numsession: req.session.id, label: filename}); // TAGUER DB COMME DÉCHARGÉE DANS GOOGLE SHEET sql2 = 'UPDATE adherent SET gsheet = "' + now + '" WHERE identifiant = "' + results[i].identifiant + '"'; const [results2, fields2] = await db_connection_promise.execute(sql2); logger.info("UPDATE adherent SET gsheet Row ID changed : " + results2.changedRows, { numsession: req.session.id, label: filename}); } } // MAJ ONGLET professeurs sql3 = "SELECT adherent_professeur.date_maj, adherent_professeur.saison, adherent_professeur.identifiant, adherent_professeur.association_suzuki, adherent_professeur.adherent_nom, adherent_professeur.adherent_prenom, adherent_professeur.adherent_mail, adherent_professeur.adherent_telephone_mobile, adherent_professeur.adherent_prof_instrument1, adherent_professeur.adherent_prof_instrument1_esa, adherent_professeur.adherent_prof_instrument2, adherent_professeur.adherent_prof_instrument2_esa, adherent_professeur.adherent_prof_sece, adherent_professeur.adherent_prof_ecole1, adherent_professeur.adherent_prof_ecole1_mail, adherent_professeur.adherent_prof_ecole1_web, adherent_professeur.adherent_prof_ecole1_adresse, adherent_professeur.adherent_prof_ecole1_cp, adherent_professeur.adherent_prof_ecole1_ville, adherent_professeur.adherent_prof_ecole2, adherent_professeur.adherent_prof_ecole2_mail, adherent_professeur.adherent_prof_ecole2_web, adherent_professeur.adherent_prof_ecole2_adresse, adherent_professeur.adherent_prof_ecole2_cp, adherent_professeur.adherent_prof_ecole2_ville, adherent_professeur.adherent_prof_ecole3, adherent_professeur.adherent_prof_ecole3_mail, adherent_professeur.adherent_prof_ecole3_web, adherent_professeur.adherent_prof_ecole3_adresse, adherent_professeur.adherent_prof_ecole3_cp, adherent_professeur.adherent_prof_ecole3_ville, adherent_finance.statut_paiement FROM adherent_professeur INNER JOIN adherent_finance ON adherent_finance.identifiant = adherent_professeur.identifiant WHERE (adherent_professeur.gsheet = '' OR adherent_professeur.gsheet IS NULL) AND adherent_finance.statut_paiement = 'paye'"; logger.info("REQUETE SQL - ONGLET professeurs : " + sql3, { numsession: req.session.id, label: filename}); const [results3, fields3] = await db_connection_promise.execute(sql3); logger.info("REQUETE SQL - ONGLET professeurs - Nombre de lignes = " + results3.length, { numsession: req.session.id, label: filename}); req.session.nb_prof_maj = results3.length; // Pour afficher le résultat du nombre de prof copiés dans la page web if (results3.length) { for (let i = 0; i < results3.length; i++ ) { // Pour chaque ligne trouvée dans la table, on l'écrit dans les onglets correspondants const ajout_gs_prof = await GS_adhesion_professeurs.addRows( [ { 'saison': results3[i].saison, 'association': results3[i].association_suzuki, 'identifiant': results3[i].identifiant, 'adhesion_date': results3[i].date_maj, 'adherent_nom': results3[i].adherent_nom, 'adherent_prenom': results3[i].adherent_prenom, 'adherent_mail': results3[i].adherent_mail, 'adherent_telephone_mobile': "'" + results3[i].adherent_telephone_mobile, 'adherent_prof_instrument1': results3[i].adherent_prof_instrument1, 'adherent_prof_instrument1_esa': results3[i].adherent_prof_instrument1_esa, 'adherent_prof_instrument2': results3[i].adherent_prof_instrument2, 'adherent_prof_instrument2_esa': results3[i].adherent_prof_instrument2_esa, 'adherent_prof_sece': results3[i].adherent_prof_sece, 'adherent_prof_ecole1': results3[i].adherent_prof_ecole1, 'adherent_prof_ecole1_adresse': results3[i].adherent_prof_ecole1_adresse, 'adherent_prof_ecole1_cp': results3[i].adherent_prof_ecole1_cp, 'adherent_prof_ecole1_ville': results3[i].adherent_prof_ecole1_ville, 'adherent_prof_ecole1_mail': results3[i].adherent_prof_ecole1_mail, 'adherent_prof_ecole1_web': results3[i].adherent_prof_ecole1_web, 'adherent_prof_ecole2': results3[i].adherent_prof_ecole2, 'adherent_prof_ecole2_adresse': results3[i].adherent_prof_ecole2_adresse, 'adherent_prof_ecole2_cp': results3[i].adherent_prof_ecole2_cp, 'adherent_prof_ecole2_ville': results3[i].adherent_prof_ecole2_ville, 'adherent_prof_ecole2_mail': results3[i].adherent_prof_ecole2_mail, 'adherent_prof_ecole2_web': results3[i].adherent_prof_ecole2_web, 'adherent_prof_ecole3': results3[i].adherent_prof_ecole3, 'adherent_prof_ecole3_adresse': results3[i].adherent_prof_ecole3_adresse, 'adherent_prof_ecole3_cp': results3[i].adherent_prof_ecole3_cp, 'adherent_prof_ecole3_ville': results3[i].adherent_prof_ecole3_ville, 'adherent_prof_ecole3_mail': results3[i].adherent_prof_ecole3_mail, 'adherent_prof_ecole3_web': results3[i].adherent_prof_ecole3_web, 'date_maj_gsheet': now } ] ); // POUR EVITER DE DÉPASSER LE QUOTA DE GOOGLE API REQUEST PER MINUTE await sleep.wait(5000); console.log("await delay(15000)"); // TAGUER DB COMME DÉCHARGÉE DANS GOOGLE SHEET sql4 = 'UPDATE adherent_professeur SET gsheet = "' + now + '" WHERE identifiant = "' + results3[i].identifiant + '"'; const [results4, fields4] = await db_connection_promise.execute(sql4); logger.info("UPDATE adherent SET gsheet Row ID changed : " + results4.changedRows, { numsession: req.session.id, label: filename}); } } // MAJ ONGLET professeurs_stagiaires sql5 = "SELECT adherent_formation_prof.date_maj, adherent_formation_prof.saison, adherent_formation_prof.identifiant, adherent_formation_prof.association_suzuki, adherent_formation_prof.adherent_nom, adherent_formation_prof.adherent_prenom, adherent_formation_prof.adherent_mail, adherent_formation_prof.adherent_telephone_mobile, adherent_formation_prof.adherent_prof_stagiaire_instrument1, adherent_formation_prof.adherent_prof_stagiaire_instrument1_esa, adherent_formation_prof.adherent_prof_stagiaire_instrument1_prof, adherent_formation_prof.adherent_prof_stagiaire_instrument2, adherent_formation_prof.adherent_prof_stagiaire_instrument2_esa, adherent_formation_prof.adherent_prof_stagiaire_instrument2_prof, adherent_finance.statut_paiement FROM adherent_formation_prof INNER JOIN adherent_finance ON adherent_finance.identifiant = adherent_formation_prof.identifiant WHERE (adherent_formation_prof.gsheet = '' OR adherent_formation_prof.gsheet IS NULL) AND adherent_finance.statut_paiement = 'paye'"; logger.info("REQUETE SQL - MAJ ONGLET professeurs_stagiaires : " + sql5, { numsession: req.session.id, label: filename}); const [results5, fields5] = await db_connection_promise.execute(sql5); logger.info("REQUETE SQL - MAJ ONGLET professeurs_stagiaires - Nombre de lignes = " + results5.length, { numsession: req.session.id, label: filename}); req.session.nb_prof_form_maj = results5.length; // Pour afficher le résultat du nombre de prof en formation copiés dans la page web if (results5.length) { for (let i = 0; i < results5.length; i++ ) { // Pour chaque ligne trouvée dans la table, on l'écrit dans les onglets correspondants logger.info("i = " + i, { numsession: req.session.id, label: filename}); logger.info("results5[i].identifiant = " + results5[i].identifiant, { numsession: req.session.id, label: filename}); const ajout_gs_prof_formation = await GS_adhesion_professeurs_stagiaires.addRows( [ { 'saison': results5[i].saison, 'association': results5[i].association_suzuki, 'identifiant': results5[i].identifiant, 'adhesion_date': results5[i].date_maj, 'adherent_nom': results5[i].adherent_nom, 'adherent_prenom': results5[i].adherent_prenom, 'adherent_mail': results5[i].adherent_mail, 'adherent_telephone_mobile': "'" + results5[i].adherent_telephone_mobile, 'adherent_prof_stagiaire_instrument1': results5[i].adherent_prof_stagiaire_instrument1, 'adherent_prof_stagiaire_instrument1_esa': results5[i].adherent_prof_stagiaire_instrument1_esa, 'adherent_prof_stagiaire_instrument1_prof': results5[i].adherent_prof_stagiaire_instrument1_prof, 'adherent_prof_stagiaire_instrument2': results5[i].adherent_prof_stagiaire_instrument2, 'adherent_prof_stagiaire_instrument2_esa': results5[i].adherent_prof_stagiaire_instrument2_esa, 'adherent_prof_stagiaire_instrument2_prof': results5[i].adherent_prof_stagiaire_instrument2_prof, 'date_maj_gsheet': now } ] ); // POUR EVITER DE DÉPASSER LE QUOTA DE GOOGLE API REQUEST PER MINUTE await sleep.wait(5000); console.log("await delay(15000)"); // TAGUER DB COMME DÉCHARGÉE DANS GOOGLE SHEET sql6 = 'UPDATE adherent_formation_prof SET gsheet = "' + now + '" WHERE identifiant = "' + results5[i].identifiant + '"'; const [results6, fields6] = await db_connection_promise.execute(sql6); logger.info("UPDATE adherent_formation_prof SET gsheet Row ID changed : " + results6.changedRows, { numsession: req.session.id, label: filename}); } } // MAJ ONGLET élèves sql7 = "SELECT adherent_eleve.date_maj, adherent_eleve.saison, adherent_eleve.identifiant, adherent_eleve.association_suzuki, adherent_eleve.eleve_nom, adherent_eleve.eleve_prenom, adherent_eleve.adherent_mail, adherent_eleve.adherent_telephone_mobile, adherent_eleve.eleve_datenaissance, adherent_eleve.eleve_instrumentA, adherent_eleve.eleve_instrumentA_cahier, adherent_eleve.eleve_instrumentA_prof, adherent_eleve.eleve_instrumentB, adherent_eleve.eleve_instrumentB_cahier, adherent_eleve.eleve_instrumentB_prof, adherent_eleve.eleve_droitimage, adherent_eleve.eleve_contactsup_nom, adherent_eleve.eleve_contactsup_prenom, adherent_eleve.eleve_contactsup_mail, adherent_finance.statut_paiement FROM adherent_eleve INNER JOIN adherent_finance ON adherent_finance.identifiant = adherent_eleve.identifiant WHERE (adherent_eleve.gsheet = '' OR adherent_eleve.gsheet IS NULL) AND adherent_finance.statut_paiement = 'paye'"; logger.info("REQUETE SQL - MAJ ONGLET élèves : " + sql7, { numsession: req.session.id, label: filename}); const [results7, fields7] = await db_connection_promise.execute(sql7); logger.info("REQUETE SQL - MAJ ONGLET élèves - Nombre de lignes = " + results7.length, { numsession: req.session.id, label: filename}); req.session.nb_eleve_maj = results7.length; // Pour afficher le résultat du nombre d'élèves copiés dans la page web if (results7.length) { for (let i = 0; i < results7.length; i++ ) { // Pour chaque ligne trouvée dans la table, on l'écrit dans l'onglet GoogleS correspondant const ajout_gs_eleves = await GS_adhesion_eleves.addRows( [ { 'saison': results7[i].saison, 'association': results7[i].association_suzuki, 'identifiant': results7[i].identifiant, 'adhesion_date': results7[i].date_maj, 'eleve_nom': results7[i].eleve_nom, 'eleve_prenom': results7[i].eleve_prenom, 'eleve_datenaissance': results7[i].eleve_datenaissance, 'adherent_mail': results7[i].adherent_mail, 'adherent_telephone_mobile': "'" + results7[i].adherent_telephone_mobile, 'eleve_instrumentA': results7[i].eleve_instrumentA, 'eleve_instrumentA_cahier': results7[i].eleve_instrumentA_cahier, 'eleve_instrumentA_prof': results7[i].eleve_instrumentA_prof, 'eleve_instrumentB': results7[i].eleve_instrumentB, 'eleve_instrumentB_cahier': results7[i].eleve_instrumentB_cahier, 'eleve_instrumentB_prof': results7[i].eleve_instrumentB_prof, 'eleve_droitimage': results7[i].eleve_droitimage, 'eleve_contactsup_nom': results7[i].eleve_contactsup_nom, 'eleve_contactsup_prenom': results7[i].eleve_contactsup_prenom, 'eleve_contactsup_mail': results7[i].eleve_contactsup_mail, 'date_maj_gsheet': now } ] ); // POUR EVITER DE DÉPASSER LE QUOTA DE GOOGLE API REQUEST PER MINUTE await sleep.wait(5000); console.log("await delay(15000)"); // TAGUER DB COMME DÉCHARGÉE DANS GOOGLE SHEET sql8 = 'UPDATE adherent_eleve SET gsheet = "' + now + '" where identifiant = "' + results7[i].identifiant + '"'; const [results8, fields8] = await db_connection_promise.execute(sql8); logger.info("UPDATE adherent_eleve SET gsheet Row ID changed : " + results8.changedRows, { numsession: req.session.id, label: filename}); } } // MAJ ONGLET finances sql9 = "SELECT adherent_finance.date_maj, adherent_finance.saison, adherent_finance.identifiant, adherent_finance.association_suzuki, adherent_finance.adherent_type, adherent_finance.adherent_nom, adherent_finance.adherent_prenom, adherent_finance.adherent_telephone_mobile, adherent_finance.adherent_mail, adherent_finance.montant_adhesion, adherent_finance.montant_don, adherent_finance.montant_total, adherent_finance.paiement_mode, adherent_finance.date_paiement, adherent_finance.stripe_retour, adherent_finance.cheque_banque, adherent_finance.cheque_numero, adherent_finance.statut_paiement FROM adherent_finance WHERE (adherent_finance.gsheet = '' OR adherent_finance.gsheet IS NULL) AND adherent_finance.statut_paiement = 'paye'"; logger.info("REQUETE SQL - MAJ ONGLET finances : " + sql9, { numsession: req.session.id, label: filename}); const [results9, fields9] = await db_connection_promise.execute(sql9); logger.info("REQUETE SQL - MAJ ONGLET finances - Nombre de lignes = " + results9.length, { numsession: req.session.id, label: filename}); req.session.nb_finance_maj = results9.length; // Pour afficher le résultat du nombre d'élèves copiés dans la page web if (results9.length) { for (let i = 0; i < results9.length; i++ ) { // Pour chaque ligne trouvée dans la table, on l'écrit dans l'onglet GoogleS correspondant const ajout_gs_finance = await GS_adhesion_finance.addRows( [ { 'saison': results9[i].saison, 'association': results9[i].association_suzuki, 'identifiant': results9[i].identifiant, 'adhesion_date': results9[i].date_maj, 'adherent_type': results9[i].adherent_type, 'adherent_nom': results9[i].adherent_nom, 'adherent_prenom': results9[i].adherent_prenom, 'adherent_telephone_mobile': "'" + results9[i].adherent_telephone_mobile, 'adherent_mail': results9[i].adherent_mail, 'montant_adhesion': results9[i].montant_adhesion, 'montant_don': results9[i].montant_don, 'montant_total': results9[i].montant_total, 'paiement_mode': results9[i].paiement_mode, 'date_paiement': results9[i].date_paiement, 'stripe_retour': results9[i].stripe_retour, 'cheque_banque': results9[i].cheque_banque, 'cheque_numero': results9[i].cheque_numero, 'statut_paiement': results9[i].statut_paiement, 'date_maj_gsheet': now } ] ); // POUR EVITER DE DÉPASSER LE QUOTA DE GOOGLE API REQUEST PER MINUTE await sleep.wait(5000); console.log("await delay(15000)"); // TAGUER DB COMME DÉCHARGÉE DANS GOOGLE SHEET sql10 = 'UPDATE adherent_finance SET gsheet = "' + now + '" WHERE identifiant = "' + results9[i].identifiant + '"'; const [results10, fields10] = await db_connection_promise.execute(sql10); logger.info("UPDATE adherent_finance SET gsheet Row ID changed : " + results10.changedRows, { numsession: req.session.id, label: filename}); } } // MAJ ONGLET adherent_en_attente sql11 = "SELECT adherent_finance.date_maj, adherent_finance.saison, adherent_finance.identifiant, adherent_finance.association_suzuki, adherent_finance.adherent_type, adherent_finance.adherent_nom, adherent_finance.adherent_prenom, adherent_finance.adherent_telephone_mobile, adherent_finance.adherent_mail, adherent_finance.montant_adhesion, adherent_finance.montant_don, adherent_finance.montant_total, adherent_finance.paiement_mode, adherent_finance.date_paiement, adherent_finance.stripe_retour, adherent_finance.cheque_banque, adherent_finance.cheque_numero, adherent_finance.statut_paiement FROM adherent_finance WHERE (adherent_finance.gs_adherent_att = '' OR adherent_finance.gs_adherent_att IS NULL) AND (adherent_finance.statut_paiement <> 'paye' OR adherent_finance.statut_paiement IS NULL OR adherent_finance.statut_paiement = '')"; logger.info("REQUETE SQL - MAJ ONGLET adherent_en_attente : " + sql11, { numsession: req.session.id, label: filename}); const [results11, fields11] = await db_connection_promise.execute(sql11); logger.info("REQUETE SQL - MAJ ONGLET adherent_en_attente - Nombre de lignes = " + results11.length, { numsession: req.session.id, label: filename}); req.session.nb_adherent_en_attente_maj = results11.length; // Pour afficher le résultat du nombre d'élèves copiés dans la page web if (results11.length) { for (let i = 0; i < results11.length; i++ ) { // Pour chaque ligne trouvée dans la table, on l'écrit dans l'onglet GoogleS correspondant const ajout_gs_adherent_en_attente = await GS_adhesion_adherent_en_attente.addRows( [ { 'saison': results11[i].saison, 'association': results11[i].association_suzuki, 'identifiant': results11[i].identifiant, 'adhesion_date': results11[i].date_maj, 'adherent_type': results11[i].adherent_type, 'adherent_nom': results11[i].adherent_nom, 'adherent_prenom': results11[i].adherent_prenom, 'adherent_telephone_mobile': "'" + results11[i].adherent_telephone_mobile, 'adherent_mail': results11[i].adherent_mail, 'montant_adhesion': results11[i].montant_adhesion, 'montant_don': results11[i].montant_don, 'montant_total': results11[i].montant_total, 'paiement_mode': results11[i].paiement_mode, 'date_paiement': results11[i].date_paiement, 'stripe_retour': results11[i].stripe_retour, 'cheque_banque': results11[i].cheque_banque, 'cheque_numero': results11[i].cheque_numero, 'statut_paiement': results11[i].statut_paiement, 'date_maj_gsheet': now } ] ); // POUR EVITER DE DÉPASSER LE QUOTA DE GOOGLE API REQUEST PER MINUTE await sleep.wait(5000); console.log("await delay(15000)"); // TAGUER DB COMME DÉCHARGÉE DANS GOOGLE SHEET sql12 = 'UPDATE adherent_finance SET gs_adherent_att = "' + now + '" WHERE identifiant = "' + results11[i].identifiant + '"'; const [results12, fields12] = await db_connection_promise.execute(sql12); logger.info("UPDATE adherent_finance SET gs_adherent_att Row ID changed : " + results12.changedRows, { numsession: req.session.id, label: filename}); } } /////////////////////////////////////////////////////////////////////// // REDIRECTION DE FIN VERS LA PAGE DE RÉSULTATS await db_connection_promise.end(); res.redirect('/adhesion/maj_googlesheet'); } catch (error) { // Echec de connection à la BD logger.error("Il y a un problème avec la connection à la base de données! : " + error, { numsession: req.session.id }); req.session.message = "Il y a un problème système, veuillez recommencer."; await db_connection_promise.end(); //Fermeture connexion DB res.redirect('/adhesion/maj_googlesheet'); }; } ///////////////////////////////////////////////// // METTRE À JOUR LE STATUS DE PAIEMENT // MANUELLEMENT DANS LA BD // CLIC SUR LE BOUTON "Valider" de la page /maj_googlesheet ///////////////////////////////////////////////// const maj_statut_paiement_manuel = async function(req, res) { logger.info("======================================"); logger.info("======== FUNCTION maj_statut_paiement_manuel (adhesion maj_googlesheet) =========="); logger.info("======================================"); ///////////////////////////////////////////////// // DATE let now = moment().format("YYYY-MM-DD HH:mm:ss"); let now_pdf = moment().format("YYYY-MM-DDTHH-mm-ss"); let today = moment().format('L') // RÉCUPÉRATION DES DONNÉES DU FORMULAIRE DE LA SESSION EN COURS req.session.maj_identifiant = req.body.maj_identifiant; req.session.maj_mode_paiement = req.body.maj_mode_paiement; req.session.maj_statut_paiement = req.body.maj_statut_paiement; req.session.maj_montant_adhesion = req.body.maj_montant_adhesion; req.session.maj_montant_don = req.body.maj_montant_don; // CONNECTION DB try { const db_connection_promise = await mysql_promise.createConnection({ host: process.env.db_connection_host, port: process.env.db_connection_port, user: process.env.db_connection_user, password: process.env.db_connection_password, database: process.env.db_connection_database }); if (req.session.maj_identifiant) { // On vérifie que l'identifiant a bien été saisie et conservé dans la session en cours /////////////////////////////////////////////////////////////////////// // MISE À JOUR DU STATUT DU PAIEMENT let sql = 'UPDATE adherent_finance SET date_maj = "' + now + '",statut_paiement = "' + req.session.maj_statut_paiement + '", paiement_mode = "' + req.session.maj_mode_paiement + '", montant_adhesion = "' + req.session.maj_montant_adhesion + '", montant_don = "' + req.session.maj_montant_don + '", gs_adherent_att = "" WHERE identifiant = "' + req.session.maj_identifiant + '"'; logger.info("REQUETE SQL - MISE À JOUR DU STATUT DU PAIEMENT : " + sql , { numsession: req.session.id, label: filename}); const [results, fields] = await db_connection_promise.execute(sql); // Execution SQL logger.info("UPDATE - MISE À JOUR DU STATUT DU PAIEMENT - Row ID changed : " + results.changedRows, { numsession: req.session.id, label: filename}); // UPDATE À ÉTÉ FAIT (IDENTIFIANT BIEN TROUVÉ DANS BD) if (results.changedRows > 0) { // SI STATUT = PAYE => ON ENVOIE LA CARTE DÉFINITIVE if (req.session.maj_mode_paiement = "paye") { logger.info("Le statut est bien paye on peut envoyer la carte définitive : " + req.session.maj_mode_paiement , { numsession: req.session.id, label: filename}); /////////////////////////////////////////////////////////////////////// // RÉCUPÉRATION DES INFOS NÉCESSAIRES À L'ENVOIE DE LA CARTE ADHÉRENT (+ ÉVENTUEL DON) let sql2 = 'SELECT adherent.adherent_type, adherent.adherent_adresse_rue, adherent.adherent_adresse_codepostal, adherent.adherent_adresse_ville, adherent.adherent_nom, adherent.adherent_prenom, adherent.adherent_mail FROM adherent WHERE adherent.identifiant = "' + req.session.maj_identifiant + '"'; logger.info("REQUETE SQL - RÉCUPÉRATION DES INFOS : " + sql2 , { numsession: req.session.id, label: filename}); const [results2, fields2] = await db_connection_promise.execute(sql2); // Execution SQL logger.info("REQUETE SQL - RÉCUPÉRATION DES INFOS - Nombre de ligne : = " + results2.length, { numsession: req.session.id }); if (results2.length > 0) { /////////////////////////////////////////////////////////////////////// // ENVOIE DE LA CARTE ADHÉRENT DÉFINITIVE ////////////////////////////////////////////////////////////////////////////// // TABLE adherent - MISE À JOUR DU STATUT D'ENVOI DE LA CARTE let sql3 = 'UPDATE adherent SET date_maj = "' + now + '", carte_envoi = "definitive" WHERE identifiant = "' + req.session.maj_identifiant + '"'; const [results3, fields3] = await db_connection_promise.execute(sql3); logger.info("UPDATE adherent SET carte_envoi - Row ID changed : " + results3.changedRows, { numsession: req.session.id, label: filename}); // CONNECTION ADOBE API const credentials = PDFServicesSdk.Credentials .servicePrincipalCredentialsBuilder() .withClientId(process.env.PDF_SERVICES_CLIENT_ID) .withClientSecret(process.env.PDF_SERVICES_CLIENT_SECRET) .build(); //timeout Default: 10000 const clientConfig = PDFServicesSdk.ClientConfig .clientConfigBuilder() .withConnectTimeout(20000) .withReadTimeout(40000) .build(); // Create an ExecutionContext using credentials const executionContext = PDFServicesSdk.ExecutionContext.create(credentials); let adherent_type = results2[0].adherent_type; ////////////////////////////////////////////////////////////////////////////// // DÉFINIR LE PROFIL À AJOUTER DANS LA CARTE ADHÉRENT // La fonction est dans le fichier /modules/adherent_type.js profils = carte_adherent.profil(adherent_type); profil1 = profils[0]; profil2 = profils[1]; profil3 = profils[2]; if (profil2 == undefined) {profil2 = " "}; if (profil3 == undefined) {profil3 = ""}; ////////////////////////////////////////////////////////////////////////////// // ADOBE PDF : CRÉATION DE LA CARTE D'ADHÉSION EN PDF // + JUSTIFICATIF DE DON let OUTPUT; let INPUT // S'il y a un don if (req.session.maj_montant_don > 0) { OUTPUT = path.resolve(__dirname, "../pdf/adhesion/2526/paye/")+"/"+req.session.maj_identifiant+"_adhesion_2526_paye_don_"+now_pdf+".pdf"; INPUT = path.resolve(__dirname, "../pdf/template/carte_adherent_don.docx"); } else { // S'il n'y a pas de don OUTPUT = path.resolve(__dirname, "../pdf/adhesion/2526/paye/")+"/"+req.session.maj_identifiant+"_adhesion_2526_paye_"+now_pdf+".pdf"; INPUT = path.resolve(__dirname, "../pdf/template/carte_adherent.docx"); } let adresse = results2[0].adherent_adresse_rue; adresse += " "; adresse += results2[0].adherent_adresse_codepostal; adresse += " "; adresse += results2[0].adherent_adresse_ville; JSON_INPUT = { "date": today, "identifiant": req.session.maj_identifiant, "profil1": profil1, "profil2": profil2, "profil3": profil3, "mode_paiement": "carte bancaire", "nom": results2[0].adherent_nom, "prenom": results2[0].adherent_prenom, "adresse": adresse, "montant_don": req.session.maj_montant_don }; const documentMerge = PDFServicesSdk.DocumentMerge, documentMergeOptions = documentMerge.options, adobe_options = new documentMergeOptions.DocumentMergeOptions(JSON_INPUT, documentMergeOptions.OutputFormat.PDF); // Create a new operation instance using the options instance. const documentMergeOperation = documentMerge.Operation.createNew(adobe_options); // Set operation input document template from a source file. const input = PDFServicesSdk.FileRef.createFromLocalFile(INPUT); documentMergeOperation.setInput(input); // Execute the operation and Save the result to the specified location. await documentMergeOperation .execute(executionContext) .then(result => result.saveAsFile(OUTPUT).then( ) ) .catch(err => { if(err instanceof PDFServicesSdk.Error.ServiceApiError || err instanceof PDFServicesSdk.Error.ServiceUsageError) { console.log('Exception encountered while executing ADOBE PDF', err); } else { console.log('Exception encountered while executing ADOBE PDF', err); } }); ////////////////////////////////////////////////////////////////////////////// // ENVOIE CARTE ADHERENT + JUSTIFICATIF DE DON PAR MAIL console.log("MAIL ENVOI AVANT"); var transporter = nodemailer.createTransport({ service: 'gmail', auth: { user: process.env.nodemailer_user, pass: process.env.nodemailer_pass } }); var attachment_name = req.session.maj_identifiant; attachment_name += "_adhesion_2526_carteadherent.pdf"; var mail_objet = "ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI - ADHÉSION 2025/2026 - "; mail_objet += req.session.maj_identifiant; mail_html = "

Cher adhérent,

Félicitations ! Vous êtes désormais membre de l’Association Française pour la Pédagogie Suzuki (http://www.afpedagogiesuzuki.fr) et de l’European Suzuki Association (https://europeansuzuki.org) pour l'année 2025/2026. Vous pouvez à ce titre participer à tous les événements Suzuki en France et dans le monde.

Vous trouverez en pièce jointe votre carte d'adhésion annuelle (valable du 1er septembre 2025 au 31 août 2026).

Votre identifiant (valable pour toute la famille) est "; mail_html += req.session.maj_identifiant; mail_html += ".

"; if (req.session.maj_montant_don > 0) { mail_html += "

Nous vous remercions chaleureusement pour votre don. Votre justificatif est également joint à ce mail

"; } mail_html += "


Nous vous remercions pour votre intérêt et vous souhaitons une très belle année en musique !

Association Française pour la pédagogie Suzuki
Chez Anne PAGES
30 rue des Tattes
74500 PUBLIER

"; await transporter.sendMail({ from: 'afps.inscription@gmail.com', to: results2[0].adherent_mail, subject: mail_objet, html: mail_html, attachments: [{ filename: attachment_name, path: OUTPUT } ] }); console.log("MAIL ENVOI APRES"); /////////////////////////////////////////////////////////////////////// // REDIRECTION DE FIN VERS LA PAGE DE RÉSULTATS await db_connection_promise.end(); req.session.message2 = 'Paiement mis à jour pour ' + req.session.maj_identifiant + '. Carte adhérent définitive envoyée avec justificatif de don le cas échéant'; res.redirect('/adhesion/maj_googlesheet'); } else { logger.info("Infos Adhérent non trouvées dans la base de données.", { numsession: req.session.id }); req.session.message2 = "Infos Adhérent non trouvées dans la base de données."; await db_connection_promise.end(); //Fermeture connexion DB res.redirect('/adhesion/maj_googlesheet'); } } // SI STATUT = ON MET À JOUR GOOGLE SHEET await db_connection_promise.end(); /////////////////////////////////////////////////////////////////////// // REDIRECTION DE FIN VERS LA PAGE DE RÉSULTATS req.session.message2 = 'Paiement mis à jour pour ' + req.session.maj_identifiant; res.redirect('/adhesion/maj_googlesheet'); } else { logger.info("Adhérent non trouvé dans la base de données.", { numsession: req.session.id }); req.session.message2 = "Adhérent non trouvé dans la base de données."; await db_connection_promise.end(); //Fermeture connexion DB res.redirect('/adhesion/maj_googlesheet'); } } else { logger.info("Problème de session sur le navigateur.", { numsession: req.session.id }); req.session.message2 = "Problème de session sur le navigateur, veuillez recommencez."; await db_connection_promise.end(); //Fermeture connexion DB res.redirect('/adhesion/maj_googlesheet'); } } catch (error) { // Echec de connection à la BD logger.error("Il y a un problème avec la connection à la base de données! : " + error, { numsession: req.session.id }); req.session.message2 = "Il y a un problème système, veuillez recommencer."; res.redirect('/adhesion/maj_googlesheet'); }; } ///////////////////////////////////////////////// // SUPPRIMER UN ADHERENT // METTRE "supprime" à la place de son identifiant // CLIC SUR LE BOUTON "Valider" de la page /maj_googlesheet ///////////////////////////////////////////////// const suppr_adherent = async function(req, res) { logger.info("======================================"); logger.info("======== FUNCTION suppr_adherent (adhesion maj_googlesheet) =========="); logger.info("======================================"); ///////////////////////////////////////////////// // DATE let now = moment().format("YYYY-MM-DD HH:mm:ss"); // RÉCUPÉRATION DES DONNÉES DU FORMULAIRE DE LA SESSION EN COURS req.session.supp_identifiant = req.body.supp_identifiant; // CONNECTION DB try { const pool = mysql.createPool({ host: process.env.db_connection_host, port: process.env.db_connection_port, user: process.env.db_connection_user, password: process.env.db_connection_password, database: process.env.db_connection_database, rowsAsArray: true }); const promisePool = pool.promise(); if (req.session.supp_identifiant) { // On vérifie que l'identifiant a bien été saisie et conservé dans la session en cours // SUPPRESSION DE L'ADHÉRENT DANS LES TABLES let sql = 'UPDATE adherent SET identifiant = "supprime", date_maj = ?, identifiant_supprime = ? WHERE identifiant = ?'; let sql2 = 'UPDATE adherent_eleve SET identifiant = "supprime", date_maj = ?, identifiant_supprime = ? WHERE identifiant = ?'; let sql3 = 'UPDATE adherent_finance SET identifiant = "supprime", date_maj = ?, identifiant_supprime = ? WHERE identifiant = ?'; let sql4 = 'UPDATE adherent_formation_prof SET identifiant = "supprime", date_maj = ?, identifiant_supprime = ? WHERE identifiant = ?'; let sql5 = 'UPDATE adherent_professeur SET identifiant = "supprime", date_maj = ?, identifiant_supprime = ? WHERE identifiant = ?'; let sql_values = [now, req.session.supp_identifiant, req.session.supp_identifiant]; logger.info("REQUETE SQL - SUPPRESSION DE L'ADHÉRENT : " + sql , { numsession: req.session.id, label: filename}); const [results, fields] = await promisePool.query(sql, sql_values); // Execution SQL console.log("results = ", results); logger.info("UPDATE - SUPPRESSION DE L'ADHÉRENT - Row ID changed 1 : " + results.changedRows, { numsession: req.session.id, label: filename}); const [results2, fields2] = await promisePool.query(sql2, sql_values); // Execution SQL logger.info("UPDATE - SUPPRESSION DE L'ADHÉRENT - Row ID changed 2 : " + results2.changedRows, { numsession: req.session.id, label: filename}); const [results3, fields3] = await promisePool.query(sql3, sql_values); // Execution SQL logger.info("UPDATE - SUPPRESSION DE L'ADHÉRENT - Row ID changed 3 : " + results3.changedRows, { numsession: req.session.id, label: filename}); const [results4, fields4] = await promisePool.query(sql4, sql_values); // Execution SQL logger.info("UPDATE - SUPPRESSION DE L'ADHÉRENT - Row ID changed 4 : " + results4.changedRows, { numsession: req.session.id, label: filename}); const [results5, fields5] = await promisePool.query(sql5, sql_values); // Execution SQL logger.info("UPDATE - SUPPRESSION DE L'ADHÉRENT - Row ID changed 5 : " + results5.changedRows, { numsession: req.session.id, label: filename}); await promisePool.end(); // UPDATE À ÉTÉ FAIT (IDENTIFIANT BIEN TROUVÉ DANS BD) if (results.changedRows > 0) { req.session.message3 = 'Identifiant supprimé : '+req.session.supp_identifiant; } else { req.session.message3 = 'Identifiant non trouvé : '+req.session.supp_identifiant; } res.redirect('/adhesion/maj_googlesheet'); } } catch (error) { // Echec de connection à la BD logger.error("Il y a un problème avec la connection à la base de données! : " + error, { numsession: req.session.id }); req.session.message3 = "Il y a un problème système, veuillez recommencer."; await promisePool.end(); res.redirect('/adhesion/maj_googlesheet'); }; } ///////////////////////////////////////////////// // ASSOCIATIONS LOCACLES // IMPORTS ADHÉRENTS DANS DB // CLIC SUR LE BOUTON "Valider" de la page /maj_googlesheet ///////////////////////////////////////////////// const import_ass_loacles = async function(req, res) { logger.info("======================================", { label: filename }); logger.info("======== FUNCTION import_ass_loacles (adhesion maj_googlesheet) ==========", { label: filename }); logger.info("======================================", { label: filename }); ///////////////////////////////////////////////// // DATE let now = moment().format("YYYY-MM-DD HH:mm:ss"); let now_pdf = moment().format("YYYY-MM-DDTHH-mm-ss"); ///////////////////////////////////////////////// // VARIABLE let nb_import = 0; ///////////////////////////////////////////////// // CONNEXION GSHEET try { await GS_adhesion.useServiceAccountAuth(GS_creds); } catch (error) { // Echec de connection à GS logger.error("Il y a un problème avec la connection à Google Sheet. : " + error, { numsession: req.session.id }); req.session.message4 = "Il y a un problème système, veuillez recommencer."; res.redirect('/adhesion/maj_googlesheet'); }; await GS_adhesion.loadInfo(); const GS_asso_locales = GS_adhesion.sheetsByTitle['adhesion_ass_locales']; const GS_asso_locales_rows = await GS_asso_locales.getRows(); console.log("GS_asso_locales.rowCount = ", GS_asso_locales.rowCount); console.log("GS_asso_locales_rows[0].identifiant = ", GS_asso_locales_rows[0].identifiant); console.log("GS_asso_locales_rows[1].identifiant = ", GS_asso_locales_rows[1].identifiant); // NOMBRE DE LIGNE DANS L'ONGLET adhesion_ass_locales let compteur = GS_asso_locales.rowCount - 1; // POUR DÉCOMPTER LA LIGNE D'EN-TÊTE console.log("compteur = ", compteur); //////////////////////////////////////////////////// // CONNECTION ADOBE API //////////////////////////////////////////////////// const credentials = PDFServicesSdk.Credentials .servicePrincipalCredentialsBuilder() .withClientId(process.env.PDF_SERVICES_CLIENT_ID) .withClientSecret(process.env.PDF_SERVICES_CLIENT_SECRET) .build(); //timeout Default: 10000 const clientConfig = PDFServicesSdk.ClientConfig .clientConfigBuilder() .withConnectTimeout(40000) .withReadTimeout(80000) .build(); // Create an ExecutionContext using credentials const executionContext = PDFServicesSdk.ExecutionContext.create(credentials); ///////////////////////////////////////////////// // CONNECTION DB try { const pool = mysql.createPool({ host: process.env.db_connection_host, port: process.env.db_connection_port, user: process.env.db_connection_user, password: process.env.db_connection_password, database: process.env.db_connection_database, rowsAsArray: true }); const promisePool = pool.promise(); ///////////////////////////////////////////////// // ON LIT TOUTES LES LIGNES DU GOOGLE SHEET LES UNES APRÈS LES AUTRES for (i=0; i 0) { OUTPUT = path.resolve(__dirname, "../pdf/adhesion/2526/paye/")+"/"+GS_asso_locales_rows[i].identifiant+"_adhesion_2526_paye_don_"+now_pdf+".pdf"; INPUT = path.resolve(__dirname, "../pdf/template/carte_adherent_don.docx"); } else { // S'il n'y a pas de don OUTPUT = path.resolve(__dirname, "../pdf/adhesion/2526/paye/")+"/"+GS_asso_locales_rows[i].identifiant+"_adhesion_2526_paye_"+now_pdf+".pdf"; INPUT = path.resolve(__dirname, "../pdf/template/carte_adherent.docx"); } moment.locale('fr'); var date_formattee = moment().format('L') var today = date_formattee; var adresse = GS_asso_locales_rows[i].adherent_adresse_rue; adresse += " "; adresse += GS_asso_locales_rows[i].adherent_adresse_codepostal; adresse += " "; adresse += GS_asso_locales_rows[i].adherent_adresse_ville; if (profil2 == undefined) {profil2 = " "}; if (profil3 == undefined) {profil3 = ""}; JSON_INPUT = { "date": today, "identifiant": GS_asso_locales_rows[i].identifiant, "profil1": profil1, "profil2": profil2, "profil3": profil3, "mode_paiement": GS_asso_locales_rows[i].adherent_paiement_mode, "nom": GS_asso_locales_rows[i].adherent_nom, "prenom": GS_asso_locales_rows[i].adherent_prenom, "adresse": adresse, "montant_don": GS_asso_locales_rows[i].adherent_paiement_montant_don }; const documentMerge = PDFServicesSdk.DocumentMerge, documentMergeOptions = documentMerge.options, adobe_options = new documentMergeOptions.DocumentMergeOptions(JSON_INPUT, documentMergeOptions.OutputFormat.PDF); // Create a new operation instance using the options instance. const documentMergeOperation = documentMerge.Operation.createNew(adobe_options); // Set operation input document template from a source file. const input = PDFServicesSdk.FileRef.createFromLocalFile(INPUT); documentMergeOperation.setInput(input); // Execute the operation and Save the result to the specified location. await documentMergeOperation .execute(executionContext) .then(result => result.saveAsFile(OUTPUT).then( ) ) .catch(err => { if(err instanceof PDFServicesSdk.Error.ServiceApiError || err instanceof PDFServicesSdk.Error.ServiceUsageError) { console.log('Exception encountered while executing ADOBE PDF', err); } else { console.log('Exception encountered while executing ADOBE PDF', err); } }); ////////////////////////////////////////////////////////////////////////////// // ENVOIE CARTE ADHERENT + JUSTIFICATIF DE DON PAR MAIL console.log("MAIL ENVOI AVANT"); var transporter = nodemailer.createTransport({ service: 'gmail', auth: { user: process.env.nodemailer_user, pass: process.env.nodemailer_pass } }); var attachment_name = GS_asso_locales_rows[i].identifiant; attachment_name += "_adhesion_2526_carteadherent.pdf"; var attachment_don_name = GS_asso_locales_rows[i].identifiant; attachment_don_name += "_don.pdf"; var mail_objet = "ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI - ADHÉSION 2025/2026 - "; mail_objet += GS_asso_locales_rows[i].identifiant; mail_html = "

Cher adhérent,

Félicitations ! Vous êtes désormais membre de l’Association Française pour la Pédagogie Suzuki (http://www.afpedagogiesuzuki.fr) et de l’European Suzuki Association (https://europeansuzuki.org) pour l'année 2025/2026. Vous pouvez à ce titre participer à tous les événements Suzuki en France et dans le monde.

Vous trouverez en pièce jointe votre carte d'adhésion annuelle (valable du 1er septembre 2025 au 31 août 2026).

Votre identifiant (valable pour toute la famille) est "; mail_html += GS_asso_locales_rows[i].identifiant; mail_html += ".

"; if (GS_asso_locales_rows[i].adherent_paiement_montant_don > 0) { mail_html += "

Nous vous remercions chaleureusement pour votre don. Votre justificatif est également joint à ce mail

"; } mail_html += "


Nous vous remercions pour votre intérêt et vous souhaitons une très belle année en musique !

Association Française pour la pédagogie Suzuki
Chez Anne PAGES
30 rue des Tattes
74500 PUBLIER

"; var mailOptions = { from: 'afps.inscription@gmail.com', to: GS_asso_locales_rows[i].adherent_mail, subject: mail_objet, html: mail_html, attachments: [{ filename: attachment_name, path: OUTPUT } ] }; transporter.sendMail(mailOptions, function(error, info){ if (error) { logger.info("error : " + error, { numsession: req.session.id }); } else { console.log('Email sent: ' + info.response); } }); console.log("MAIL ENVOI APRES"); // METTRE À JOUR LE STATUS D'ENVOI DE LA CARTE let sql10 = 'UPDATE '; sql10 += 'adherent'; sql10 += ' SET '; sql10 += 'carte_envoi = "definitive"'; sql10 += ' WHERE identifiant = "' + GS_asso_locales_rows[i].identifiant + '"'; const [results10, fields10] = await promisePool.query(sql10); // Execution SQL logger.info("adherent carte envoi Row ID changed : " + results10.changedRows, { numsession: req.session.id, label: filename}); ///////////////////////////////////////////////// // GS - Taguer l'adhérent comme importé dans le tableau Google Sheet GS_asso_locales_rows[i].date_export = now; await GS_asso_locales_rows[i].save(); await sleep.wait(2000); nb_import++; } } ///////////////////////////////////////////////// // ON AFFICHE LE NOMBRE DE LIGNES IMPORTÉES req.session.message4 = 'Adhérents associations locales importées : ' + nb_import; res.redirect('/adhesion/maj_googlesheet'); } catch (error) { // Echec de connection à la BD logger.error("Il y a un problème avec la connection à la base de données : " + error, { numsession: req.session.id }); req.session.message4 = "Il y a un problème système, veuillez recommencer. " + error; //pool.end(); res.redirect('/adhesion/maj_googlesheet'); }; } ///////////////////////////////////////////////// // EXPORT DE MODULE POUR QU'IL SOIT LU DANS LES AUTRES FICHIERS JS ///////////////////////////////////////////////// module.exports = { checkMail, post_form_adhesion, post_form_montant_total, post_paiement_cheque_save, post_paiement_virement_save, post_req_bank, get_res_bank, get_res_bank_annul, post_cartemanuelle_verifmail_envoicarte, post_cartes_manuelles_envoi, maj_googlesheet, maj_googlesheet_auto, maj_statut_paiement_manuel, suppr_adherent, import_ass_loacles }