///////////////////////////////////////////////// // APPELS DES MODULES ///////////////////////////////////////////////// const path = require("path"); // CALCUL DE DATE const moment = require('moment'); // STRIPE const stripe = require('stripe')(process.env.STRIPE_RI_PRIVATE_KEY); //const stripe = require('stripe')(process.env.STRIPE_PRIVATE_KEY_TEST); ///////////////////////////////////////////////// // APPELS DES MODULES PERSOS ///////////////////////////////////////////////// // loggings const logger = require("../public/js/app/logger_rassemblement"); // DB const { connect_DB_promise } = require('../modules/db/databaseconnect'); // recherche si identifiant saisie est bien dans la base de données des adhérents const { checkAdherent } = require('../modules/db/checkAdherent'); // Envoie mail const envoie_mail = require("../modules/envoie_mail"); //////////////////////////////////////////////////// // FILE NAME //////////////////////////////////////////////////// const filename = path.parse(__filename).base; // GOOGLE SHEET PARAMETERS ///////////////////////////////////////////////// const { GoogleSpreadsheet } = require('google-spreadsheet'); const GS_creds_rassemblementidf = require('../inscriptionsafps-53b60452f63d.json'); const GS_rassemblementidf = new GoogleSpreadsheet('19Y1M7mZFSJrycQTtNxV2Cmmyz2OaeXHmwCKVCgy1r7Q'); const { error } = require("console"); ///////////////////////////////////////////////// // FONCTIONS ///////////////////////////////////////////////// const RI_checkidentifiant = async function(req, res) { logger.info("======================================", { label: filename }); logger.info("======== FUNCTION RI_checkidentifiant ==========", { label: filename }); logger.info("======================================", { label: filename }); // un tag pour ne pas ajouter plusieurs fois le même participant en cas de rafraîchissement de la page req.session.participant_ajoute = "non"; ///////////////////////////////////////////////// // ON RÉCUPÈRE L'IDENTIFIANT SAISIE DANS LE FORMULAIRE req.session.identifiant = req.body.identifiant; logger.info("identifiant saisi : " + req.body.identifiant, { numsession: req.session.id, label: filename}); // ON REGARDE S'il à bien rempli l'identifiant et s'il a coché la case "je ne suis pas adhérent" if (req.body.identifiant && req.body.check_nonadherent) { req.session.err_mail_form_adhesion_1 = "Pour vous inscrire au rassemblement, vous devez au préalable être adhérent à l'Association Française pour la Pédagogie Suzuki (AFPS)."; req.session.err_mail_form_adhesion_2 = 'Si vous faites partie d\'une association non française veulliez cocher la case "Je suis adhérent à une Association Suzuki dans un autre pays en renseignant votre identifiant ou votre mail.'; req.session.err_mail_form_adhesion_3 = 'Pour adhérer Cliquez ici'; res.redirect('/rassemblementidf/identifier'); } if (!req.body.identifiant && req.body.check_nonadherent) { req.session.err_mail_form_adhesion_1 = "Pour vous inscrire au rassemblement, vous devez au préalable être adhérent à l'Association Française pour la Pédagogie Suzuki (AFPS)."; req.session.err_mail_form_adhesion_2 = 'Si vous faites partie d\'une association non française veulliez cocher la case "Je suis adhérent à une Association Suzuki dans un autre pays en renseignant votre identifiant ou votre mail.'; req.session.err_mail_form_adhesion_3 = 'Pour adhérer Cliquez ici'; res.redirect('/rassemblementidf/identifier'); } if (!req.body.identifiant && !req.body.check_nonadherent) { req.session.err_mail_form_adhesion_1 = "Veuillez entrer votre identifiant AFPS
(Association Française pour la Pédagogie Suzuki),

ou l'identifiant d'adhésion à votre Association Nationale Suzuki."; req.session.err_mail_form_adhesion_2 = "Si vous n'êtes pas encore adhérent, vous pouvez adhérer en"; req.session.err_mail_form_adhesion_3 = 'Cliquez ici'; res.redirect('/rassemblementidf/identifier'); } // SAISIE OK ON PEUT CONTINUER if (req.body.identifiant && !req.body.check_nonadherent) { // EST-CE QUE L'IDENTIFIANT SAISI EST DÉJA INSCRIT AU RASSEMBLEMENT TABLE ras_adherent // CONNECTION DB PROMISE // TRY 2 try { //Connexion const db_connection_promise = await connect_DB_promise(); //Query let sql = 'select identifiant, association_suzuki, adherent_mail from ras_adherent where identifiant = "' + req.session.identifiant + '" AND lieu = "IDF" AND saison = "' + process.env.SAISON + '" AND statut_suppression = 0'; logger.info("sql ras_adherent : " + sql, { numsession: req.session.id, label: filename}); const [results_checkinscrit, fields] = await db_connection_promise.execute(sql); await db_connection_promise.end(); logger.info("TABLE ras_adherent nombre de row avec identifiant saisie : " + results_checkinscrit.length, { numsession: req.session.id, label: filename}); if (results_checkinscrit.length) { // DÉJA INSCRIT AU RASSEMBLEMENT logger.info("Identifant déjà inscrit au RASSEMBLEMENT : " + req.session.identifiant, { numsession: req.session.id, label: filename}); // ON AFFICHE LA PAGE DE SAISIE DE L'IDENTIFIANT AVEC ERREUR "déjà inscrit" req.session.err_mail_form_adhesion_1 = "L'identifiant " + req.session.identifiant + " est déjà inscrit au rassemblement."; res.redirect('/rassemblementidf/identifier'); } else { // NON INSCRIT AU RASSEMBLEMENT logger.info("Identifant non inscrit au rassemblement : "+req.session.identifiant, { numsession: req.session.id, label: filename}); // IDENTIFIANT SAISIE ET CASE AUTRE PAYS COCHÉ // ON AFFICHE LA PAGE DU FORMULAIRE DE SAISIE DES INFORMATIONS DE L'INSCRIPTION if (req.body.identifiant && !req.body.check_nonadherent && req.body.check_autrepays) { req.session.association_suzuki = "autre pays"; res.redirect('/rassemblementidf/formulaire'); } else { ///////////////////////////////////////////////// // RECHERCHE SI PERSONNE EST ADHÉRENTE À L'AFPS // DANS BD ADHESION adherent sql = 'select identifiant,association_suzuki from adherent where identifiant = "' + req.session.identifiant + '"'; const retour_checkAdherent = await checkAdherent(sql); if (retour_checkAdherent.error) { logger.info("Il y a un problème avec la connection à la base de données adherent ! : " + retour_checkAdherent.error, { numsession: req.session.id, label: filename}); req.session.err_mail_form_adhesion_1 = "Il y a un problème système connexion base de données, veuillez recommencer." + retour_checkAdherent.error; res.redirect('/rassemblementidf/identifier'); } else if (retour_checkAdherent.found) { // LA PERSONNE EST BIEN ADHÉRENTE req.session.association_suzuki = retour_checkAdherent.results_checkAdherent.association_suzuki; logger.info("req.session.association_suzuki : " + retour_checkAdherent.results_checkAdherent.association_suzuki, { numsession: req.session.id, label: filename}); // ON AFFICHE LA PAGE DU FORMULAIRE DE SAISIE DES INFORMATIONS DE L'INSCRIPTION res.redirect('/rassemblementidf/formulaire'); } else { // LA PERSONNE N'EST PAS ADHÉRENTE logger.info("Identifant NON adhérent : " + req.session.identifiant, { numsession: req.session.id, label: filename}); req.session.err_mail_form_adhesion_1 = "L'identifiant saisi n'est pas reconnu comme adhérent de l'Association Française pour la Pédagogie Suzuki (AFPS) pour 2025/2026."; req.session.err_mail_form_adhesion_2 = 'Vous devez adhérer avant de vous inscrire au rassemblement.
Si vous êtes membre d\'une association Suzuki non française, veuillez cocher la case "Je suis adhérent à une Association Suzuki dans un autre pays" et renseigner votre identifiant ou votre adresse e-mail.'; req.session.err_mail_form_adhesion_3 = 'Pour adhérer à l\'Association Française pour la Pédagogie Suzuki, cliquez ici'; res.redirect('/rassemblementidf/identifier'); } } } } catch (error) { // Echec de connection à la BD logger.error("Il y a un problème avec la connection à la base de données ras_adherent (TRY 2) : " + error, { numsession: req.session.id }); req.session.err_mail_form_adhesion_1 = "Il y a un problème système connexion base de données, veuillez recommencer."; res.redirect('/rassemblementidf/identifier'); } } } const RI_checkinfos = async function(req, res) { logger.info("======================================"); logger.info("======== FUNCTION RI_checkinfos =========="); logger.info("======================================"); // RÉCUPÉRATION DES DONNÉES DU FORMULAIRE DANS LA SESSION EN COURS if (req.body.association) {req.session.association_suzuki = req.body.association;}; if (req.body.adherent_nom) {req.session.adherent_nom = req.body.adherent_nom;}; logger.info("req.session.adherent_nom : " + req.session.adherent_nom, { numsession: req.session.id, label: filename }); if (req.body.adherent_prenom) {req.session.adherent_prenom = req.body.adherent_prenom;}; if (req.body.adherent_adresse_rue) {req.session.adherent_adresse_rue = req.body.adherent_adresse_rue;}; if (req.body.adherent_adresse_complement) {req.session.adherent_adresse_complement = req.body.adherent_adresse_complement;}; logger.info("req.body.adherent_adresse_complement : " + req.body.adherent_adresse_complement, { numsession: req.session.id, label: filename }); logger.info("req.session.adherent_adresse_complement : " + req.session.adherent_adresse_complement, { numsession: req.session.id, label: filename }); if (req.body.adherent_adresse_codepostal) {req.session.adherent_adresse_codepostal = req.body.adherent_adresse_codepostal;}; if (req.body.adherent_adresse_ville) {req.session.adherent_adresse_ville = req.body.adherent_adresse_ville;}; if (req.body.adherent_adresse_pays) {req.session.adherent_adresse_pays = req.body.adherent_adresse_pays;}; if (req.body.adherent_telephone_mobile) {req.session.adherent_telephone_mobile = req.body.adherent_telephone_mobile;}; if (req.body.adherent_telephone_fixe) {req.session.adherent_telephone_fixe = req.body.adherent_telephone_fixe;}; if (req.body.adherent_mail) {req.session.adherent_mail = req.body.adherent_mail;}; if (req.body.bus_nb) {req.session.bus_nb = req.body.bus_nb;}; if (req.body.commentaire_adherent) {req.session.commentaire_adherent = req.body.commentaire_adherent;}; //// INITIALISATION DES MONTANTS PAR FAMILLE req.session.cout_rassemblement = 0; req.session.cout_repas = 0; req.session.accompte_frais_bancaire = 0; req.session.cout_total = 0; var nbr_eleve = 0; var nbr_repas = 0; for (let toto = 1; toto < 7; toto++) { if (req.body["personne_" + toto + "_nom"]) { req.session["personne_" + toto + "_nom"] = req.body["personne_" + toto + "_nom"]; } if (req.body["personne_" + toto + "_prenom"]) { req.session["personne_" + toto + "_prenom"] = req.body["personne_" + toto + "_prenom"]; } if (req.body["personne_" + toto + "_datenaissance"]) { req.session["personne_" + toto + "_datenaissance"] = req.body["personne_" + toto + "_datenaissance"]; } if (req.body["personne_" + toto + "_role"]) { req.session["personne_" + toto + "_role"] = req.body["personne_" + toto + "_role"]; } if (req.body["personne_" + toto + "_instrument"]) { req.session["personne_" + toto + "_instrument"] = req.body["personne_" + toto + "_instrument"]; } if (req.body["personne_" + toto + "_cahier"]) { req.session["personne_" + toto + "_cahier"] = req.body["personne_" + toto + "_cahier"]; } if (req.body["personne_" + toto + "_piece"]) { req.session["personne_" + toto + "_piece"] = req.body["personne_" + toto + "_piece"]; } if (req.body["personne_" + toto + "_prof"]) { req.session["personne_" + toto + "_prof"] = req.body["personne_" + toto + "_prof"]; } if (req.body["personne_" + toto + "_repas"]) { req.session["personne_" + toto + "_repas"] = req.body["personne_" + toto + "_repas"]; } logger.info('req.session["personne_"'+toto+'"_prenom"] = ' + req.session["personne_"+toto+"_prenom"], { numsession: req.session.id, label: filename }); logger.info('req.body["personne_"+toto+"_cahier"] = ' + req.body["personne_"+toto+"_cahier"], { numsession: req.session.id, label: filename }); logger.info('req.session["personne_"+toto+"_cahier"] = ' + req.session["personne_"+toto+"_cahier"], { numsession: req.session.id, label: filename }); logger.info('req.session["personne_"+toto+"_prof"] = ' + req.session["personne_"+toto+"_prof"], { numsession: req.session.id, label: filename }); // CALCUL ÂGE PERSONNE if (req.session["personne_"+toto+"_datenaissance"]) { let datenaissance_concat = req.session["personne_"+toto+"_datenaissance"]; var an=datenaissance_concat.substr(6,4); // l'année (les quatre premiers caractères de la chaîne à partir de 6) var mois=datenaissance_concat.substr(3,2);// On selectionne le mois de la date de naissance var day= datenaissance_concat.substr(0,2); // On selectionne la jour de la date de naissance var birthDate = new Date(an + "-" + mois + "-" + day); var debutrassemblement = new Date('2026-04-19'); var age = debutrassemblement.getFullYear() - birthDate.getFullYear(); var m = debutrassemblement.getMonth() - birthDate.getMonth(); if (m < 0 || (m === 0 && debutrassemblement.getDate() < birthDate.getDate())) { age--; } req.session["personne_"+toto+"_age"] = age; logger.info('req.session["personne_"+toto+"_age"] = ' + req.session["personne_"+toto+"_age"], { numsession: req.session.id, label: filename }); //// +1 nombre d'élève if (req.session["personne_"+toto+"_role"] === "instrumentiste") { nbr_eleve++; } } //// +1 repas if (req.session["personne_"+toto+"_role"] === "professeur" && req.session["personne_"+toto+"_repas"] === "repas") { nbr_repas++; } } ///// CALCUL COUT TOTAL logger.info('nbr_eleve TOTAL : ' + nbr_eleve, { numsession: req.session.id, label: filename }); if (nbr_eleve == 1){ req.session.cout_rassemblement = 31; req.session.cout_total += req.session.cout_rassemblement; }; if (nbr_eleve > 1){ req.session.cout_rassemblement = 51; req.session.cout_total += req.session.cout_rassemblement; } if (nbr_repas > 0) { req.session.cout_repas = 8*nbr_repas; req.session.cout_total += req.session.cout_repas; } if (req.session.cout_total > 0) { req.session.accompte_frais_bancaire = 1; req.session.cout_total += req.session.accompte_frais_bancaire; } logger.info('req.session.cout_rassemblement : ' + req.session.cout_rassemblement, { numsession: req.session.id, label: filename }); logger.info('req.session.cout_repas : ' + req.session.cout_repas, { numsession: req.session.id, label: filename }); logger.info('req.session.accompte_frais_bancaire : ' + req.session.accompte_frais_bancaire, { numsession: req.session.id, label: filename }); logger.info('req.session.cout_total : ' + req.session.cout_total, { numsession: req.session.id, label: filename }); res.redirect('/rassemblementidf/recap'); } const post_recap_modifier = async function(req, res) { res.redirect('/rassemblementidf/identifier'); } const post_payer_ri = async function(req, res) { logger.info("======================================"); logger.info("======== FUNCTION post_payer_ri =========="); logger.info("======================================"); // VARIABLES ///////////////////////////////////////////////// let saison = process.env.SAISON; moment.locale('fr'); let now = moment().format("YYYY-MM-DD HH:mm:ss"); let sql; let table; let champs; let values; ///////////////////////////////////////////////// // SI IDENTIFIANT PERDU ///////////////////////////////////////////////// logger.info("req.session.identifiant : " + req.session.identifiant , { numsession: req.session.id, label: filename}); if (req.session.identifiant === undefined) { logger.info("IDENTIFIANT PERDU", { numsession: req.session.id }); req.session.err_mail_form_adhesion_1 = "Session expirée, veuillez recommencer"; res.redirect('/rassemblementidf/identifier'); } else { ///////////////////////////////////////////////// // RÉCUPÉRATION ACCOMPAGNANT if (req.body.accompagnant_nom) {req.session.accompagnant_nom = req.body.accompagnant_nom;}; if (req.body.accompagnant_prenom) {req.session.accompagnant_prenom = req.body.accompagnant_prenom;}; ///////////////////////////////////////////////// // AJOUT DANS LA BASE DE DONNÉES // TRY 3 try { //Connexion let db_connection_promise = await connect_DB_promise(); ///////////////////////////////////////////////// // AJOUT PARTICIPANTS for (let toto = 1; toto < 7; toto++) { if (req.session["personne_"+toto+"_nom"]) { // QUERY ADD ras_participant table = "ras_participant"; if (req.session["personne_" + toto + "_role"] === "professeur") { champs = "lieu, saison, identifiant, date_maj, ras_part_nom, ras_part_prenom, ras_part_date_naiss, ras_part_age, ras_part_role, instrument, repas_prof, statut_suppression"; values = '"IDF", "'+process.env.SAISON+'", "' + req.session.identifiant + '", "' + now + '", "' + req.session["personne_" + toto + "_nom"] + '", "' + req.session["personne_" + toto + "_prenom"] + '", "' + req.session["personne_" + toto + "_datenaissance"] + '", "' + req.session["personne_" + toto + "_age"] + '", "' + req.session["personne_" + toto + "_role"] + '", "' + req.session["personne_" + toto + "_instrument"] + '", "' + req.session["personne_" + toto + "_repas"] + '", 0'; } if (req.session["personne_" + toto + "_role"] === "instrumentiste") { champs = "lieu, saison, identifiant, date_maj, ras_part_nom, ras_part_prenom, ras_part_date_naiss, ras_part_age, ras_part_role, instrument, cahier, piece, prof_nom, statut_suppression"; values = '"IDF", "'+process.env.SAISON+'", "' + req.session.identifiant + '", "' + now + '", "' + req.session["personne_" + toto + "_nom"] + '", "' + req.session["personne_" + toto + "_prenom"] + '", "' + req.session["personne_" + toto + "_datenaissance"] + '", "' + req.session["personne_" + toto + "_age"] + '", "' + req.session["personne_" + toto + "_role"] + '", "' + req.session["personne_" + toto + "_instrument"] + '", "' + req.session["personne_" + toto + "_cahier"] + '", "' + req.session["personne_" + toto + "_piece"] + '", "' + req.session["personne_" + toto + "_prof"] + '", 0'; } sql = 'INSERT INTO ' + table + ' (' + champs + ') VALUES (' + values + ')'; logger.info("REQUETE SQL INSERT INTO ras_participant : " + sql , { numsession: req.session.id, label: filename}); const [results_ras_participant, fields] = await db_connection_promise.execute(sql); logger.info("ras_participant Row ID added : " + results_ras_participant.insertId, { numsession: req.session.id, label: filename}); } } ///////////////////////////////////////////////// // AJOUT DB ADHÉRENTS // QUERY ADD ras_adherent if (!req.session.bus_nb) {req.session.bus_nb = 0}; table = "ras_adherent"; champs = "lieu, identifiant, association_suzuki, saison, date_maj, adherent_nom, adherent_prenom, adherent_telephone, adherent_mail, adherent_adresse_rue, adherent_adresse_complement, adherent_adresse_codepostal, adherent_adresse_ville, adherent_adresse_pays, ras_commentaire, accompagnant_nom, accompagnant_prenom, bus_nb, tarif_rassemblement, cout_repas_prof, frais_bancaire, cout_total, statut_paiement, statut_suppression"; values = '"IDF", "' + req.session.identifiant + '", "' + req.session.association_suzuki + '", "' + saison + '", "' + now + '", "' + req.session.adherent_nom + '", "' + req.session.adherent_prenom + '", "' + req.session.adherent_telephone_mobile + '", "' + req.session.adherent_mail + '", "' + req.session.adherent_adresse_rue + '", "' + req.session.adherent_adresse_complement + '", "' + req.session.adherent_adresse_codepostal + '", "' + req.session.adherent_adresse_ville + '", "' + req.session.adherent_adresse_pays + '", "' + req.session.commentaire_adherent + '", "' + req.session.accompagnant_nom + '", "' + req.session.accompagnant_prenom + '",' + req.session.bus_nb + ',' + req.session.cout_rassemblement + ',' + req.session.cout_repas + ',' + req.session.accompte_frais_bancaire + ',' + req.session.cout_total + ',"attente",0'; sql = 'INSERT INTO ' + table + ' (' + champs + ') VALUES (' + values + ')'; logger.info("REQUETE SQL INSERT INTO ras_adherent : " + sql , { numsession: req.session.id, label: filename}); const [results_ras_adherent, fields] = await db_connection_promise.execute(sql); logger.info("ras_adherent Row ID added : " + results_ras_adherent.insertId, { numsession: req.session.id, label: filename}); await db_connection_promise.end(); if (req.session.cout_total > 1) { ///////////////////////////////////////////////// // STRIPE - ETAPE 1 - CREER l'INTENTION DE PAIEMENT logger.info("======================================", { label: filename }); logger.info("======== ENVOIE VERS STRIPE ==========", { label: filename }); logger.info("======================================", { label: filename }); const session = await stripe.checkout.sessions.create({ metadata: {identifiant: req.session.identifiant, cout_rassemblement: req.session.cout_rassemblement, accompte_frais_bancaire: req.session.accompte_frais_bancaire}, customer_email: req.session.adherent_mail, submit_type: 'pay', success_url: process.env.STRIPE_RI_SUCCESSURL, cancel_url: process.env.STRIPE_RI_CANCELURL, payment_method_types: ['card'], line_items: [{ price_data: { currency: 'eur', product_data: { name: 'Rassemblement IDF', }, unit_amount: req.session.cout_total * 100, }, quantity: 1, },], //Checkout has three modes: payment, subscription, or setup. mode: 'payment' }); res.redirect(session.url) } } catch (error) { // Echec de connection à la BD logger.error("Il y a un problème avec la connection à la base de données (TRY 3) : " + error, { numsession: req.session.id }); req.session.err_mail_form_adhesion_1 = '"Il y a un problème système connexion base de données, veuillez recommencer, "' + error; res.redirect('/rassemblementidf/identifier'); } } } const RI_accompte_reussi = async function(req, res) { logger.info("======================================", { label: filename }); logger.info("======== FUNCTION RI_accompte_reussi ==========", { label: filename }); logger.info("======================================", { label: filename }); // VARIABLES let CB_retour; let stripe_retour; // DATE moment().format(); moment.locale('fr'); ////////////////////////////////////////////////////////////////////////////// // RETOUR STRIPE let id = req.query.id; const session_stripe = await stripe.checkout.sessions.retrieve(id); let customer_email = session_stripe.customer_email; req.session.adherent_mail = customer_email; let payment_status = session_stripe.payment_status; let amount_total = session_stripe.amount_total/100; let stripe_customer = session_stripe.customer; let stripe_payment_intent = session_stripe.payment_intent; let payment_method_types = session_stripe.payment_method_types; let stripe_status = session_stripe.status; let identifiant = session_stripe.metadata.identifiant; req.session.identifiant = identifiant; CB_retour = payment_status + ", " + stripe_customer + ", " + stripe_payment_intent + ", " + session_stripe.id + ", " + payment_method_types + ", " + stripe_status; stripe_retour = session_stripe.id; logger.info("customer_email : " + customer_email, { numsession: req.session.id, label: filename}); logger.info("payment_status : " + payment_status, { numsession: req.session.id, label: filename}); ////////////////////////////////////////////////////////////////////////////// // MAJ infos paiements DB ///////////////////////////////////////////////// // une vérification pour ne pas ajouter plusieurs fois le même participant en cas de rafraîchissement de la page logger.info("req.session.participant_ajoute : " + req.session.participant_ajoute, { numsession: req.session.id, label: filename}); if (req.session.participant_ajoute === "oui") { req.session.err_mail_form_adhesion_1 = "Votre session est terminée, les participants ont déjà été ajoutés."; res.redirect('/rassemblementidf/identifier'); } else { // Query MAJ infos paiements DB // TRY 1 try { let db_connection_promise = await connect_DB_promise(); let sql = 'UPDATE '; sql += 'ras_adherent'; sql += ' SET '; sql += 'stripe_retour = "' + CB_retour + '", '; sql += 'statut_paiement = "paye" '; sql += ' WHERE identifiant = "' + req.session.identifiant + '" AND lieu = "IDF" AND saison = "'+process.env.SAISON+'" AND statut_suppression = 0'; logger.info("sql UPDATE ras_adherent : " + sql, { numsession: req.session.id, label: filename}); const [results, fields] = await db_connection_promise.execute(sql); logger.info("Row ras_adherent UPDATE payé: " + results.changedRows, { numsession: req.session.id, label: filename}); ////////////////////////////////////////////////////////////////////////////// // Query Récupération des infos pour copie dans Google Sheet + envoie du mail // adhérent let sql2 = 'select * from '; sql2 += 'ras_adherent'; sql2 += ' WHERE identifiant = "' + req.session.identifiant + '" AND statut_suppression = 0 AND lieu = "IDF" AND saison = "' + process.env.SAISON + '"'; const [results2, fields2] = await db_connection_promise.execute(sql2); logger.info("Row ras_adherent SELECT : " + results2.length, { numsession: req.session.id, label: filename}); // participants let sql3 = 'SELECT DISTINCT ras_adherent.identifiant, ras_adherent.association_suzuki, ras_adherent.saison, ras_adherent.date_maj, ras_adherent.adherent_nom, ras_adherent.adherent_prenom, ras_adherent.adherent_telephone, ras_adherent.adherent_mail, ras_participant.ID_participant, ras_participant.ras_part_nom, ras_participant.ras_part_prenom, ras_participant.ras_part_date_naiss, ras_participant.ras_part_role, ras_participant.ras_part_age, ras_participant.instrument, ras_participant.cahier, ras_participant.piece, ras_participant.prof_nom, ras_participant.repas_prof FROM ras_participant JOIN ras_adherent ON ras_participant.identifiant = ras_adherent.identifiant WHERE ras_participant.identifiant = "' + req.session.identifiant + '" AND ras_participant.statut_suppression = 0 AND ras_participant.lieu = "IDF" AND ras_participant.saison = "' + process.env.SAISON + '"'; const [results3, fields3] = await db_connection_promise.execute(sql3); await db_connection_promise.end(); logger.info("Row ras_participant SELECT nombre de participants : " + results3.length, { numsession: req.session.id, label: filename}); ////////////////////////////////////////////////////////////////////////////// // PRÉPARATION PAGE PAIEMENT RÉUSSI res.locals.identifiant = req.session.identifiant; res.locals.association_suzuki = results2[0].association_suzuki; res.locals.bus_nb = results2[0].bus_nb; res.locals.accompagnant_prenom = results2[0].accompagnant_prenom; res.locals.accompagnant_nom = results2[0].accompagnant_nom; for (let toto = 0; toto < (results3.length); toto++) { res.locals["personne_"+toto+"_numero"] = toto; res.locals["personne_"+toto+"_nom"] = results3[toto].ras_part_nom.toUpperCase(); res.locals["personne_"+toto+"_prenom"] = results3[toto].ras_part_prenom; res.locals["personne_"+toto+"_role"] = results3[toto].ras_part_role; res.locals["personne_"+toto+"_instrument"] = results3[toto].instrument; res.locals["personne_"+toto+"_cahier"] = results3[toto].cahier; res.locals["personne_"+toto+"_piece"] = results3[toto].piece; res.locals["personne_"+toto+"_prof"] = results3[toto].prof_nom; res.locals["personne_"+toto+"_repas"] = results3[toto].repas_prof; } res.locals.cout_total = results2[0].cout_total; res.locals.frais_bancaire = results2[0].frais_bancaire; res.locals.tarif_rassemblement = results2[0].tarif_rassemblement; res.locals.cout_repas = results2[0].cout_repas_prof; ////////////////////////////////////////////////////////////////////////////// // AJOUT INFOS DANS GOOGLE SHEET // TRY 4 try { await GS_rassemblementidf.useServiceAccountAuth(GS_creds_rassemblementidf); await GS_rassemblementidf.loadInfo(); let GS_rassemblementidf_Adherents = GS_rassemblementidf.sheetsByTitle['Adherents']; let GS_rassemblementidf_Paiements = GS_rassemblementidf.sheetsByTitle['Paiements']; let GS_rassemblementidf_NAVETTE = GS_rassemblementidf.sheetsByTitle['NAVETTE']; let GS_rassemblementidf_Instrumentistes = GS_rassemblementidf.sheetsByTitle['Instrumentistes']; let GS_rassemblementidf_Professeurs = GS_rassemblementidf.sheetsByTitle['Professeurs']; let GS_rassemblementidf_Repas = GS_rassemblementidf.sheetsByTitle['Repas']; let GS_rassemblementidf_VIOLON = GS_rassemblementidf.sheetsByTitle['VIOLON']; let GS_rassemblementidf_ALTO = GS_rassemblementidf.sheetsByTitle['ALTO']; let GS_rassemblementidf_VIOLONCELLE = GS_rassemblementidf.sheetsByTitle['VIOLONCELLE']; let GS_rassemblementidf_HARPE = GS_rassemblementidf.sheetsByTitle['HARPE']; let GS_rassemblementidf_PIANO = GS_rassemblementidf.sheetsByTitle['PIANO']; if (results2[0].accompagnant_nom === "undefined") {results2[0].accompagnant_nom = ""}; if (results2[0].accompagnant_prenom === "undefined") {results2[0].accompagnant_prenom = ""}; await GS_rassemblementidf_Adherents.addRows ( [ { ID_adherent: results2[0].ID_adherent, saison: results2[0].saison, identifiant: req.session.identifiant, association_suzuki: results2[0].association_suzuki, date: moment(results2[0].date_maj).format("YYYY-MM-DD HH:mm:ss"), adherent_nom: results2[0].adherent_nom.toUpperCase(), adherent_prenom: results2[0].adherent_prenom, adherent_mail: results2[0].adherent_mail, adherent_telephone: "'" + results2[0].adherent_telephone, adherent_adresse_rue: results2[0].adherent_adresse_rue, adherent_adresse_complement: results2[0].adherent_adresse_complement, adherent_adresse_codepostal: results2[0].adherent_adresse_codepostal, adherent_adresse_ville: results2[0].adherent_adresse_ville, adherent_adresse_pays: results2[0].adherent_adresse_pays, accompagnant_nom: results2[0].accompagnant_nom, accompagnant_prenom: results2[0].accompagnant_prenom, commentaire: results2[0].ras_commentaire } ] ); await GS_rassemblementidf_Paiements.addRows ( [ { ID_adherent: results2[0].ID_adherent, identifiant: req.session.identifiant, adherent_nom: results2[0].adherent_nom.toUpperCase(), adherent_prenom: results2[0].adherent_prenom, adherent_mail: results2[0].adherent_mail, tarif_rassemblement: parseFloat(results2[0].tarif_rassemblement), cout_repas_prof: parseFloat(results2[0].cout_repas_prof), frais_bancaire: parseFloat(results2[0].frais_bancaire), cout_total: parseFloat(results2[0].cout_total), statut_paiement: results2[0].statut_paiement } ] ); if (results2[0].bus_nb > 0) { await GS_rassemblementidf_NAVETTE.addRows ( [ { ID_adherent: results2[0].ID_adherent, identifiant: req.session.identifiant, adherent_nom: results2[0].adherent_nom.toUpperCase(), adherent_prenom: results2[0].adherent_prenom, adherent_telephone: "'" + results2[0].adherent_telephone, bus_nb : results2[0].bus_nb } ] ); } let ajout_instrumentistes = []; let instruments_trouve = ""; for (let i = 0; i < results3.length; i++) { if (results3[i].ras_part_role === "instrumentiste") { ajout_instrumentistes.push({ ID_participant: results3[i].ID_participant, identifiant: req.session.identifiant, participant_nom: results3[i].ras_part_nom.toUpperCase(), participant_prenom: results3[i].ras_part_prenom, participant_age: results3[i].ras_part_age, adherent_mail: results3[i].adherent_mail, adherent_telephone: "'" + results3[i].adherent_telephone, instrument: results3[i].instrument, cahier: results3[i].cahier, piece: results3[i].piece, prof_nom: results3[i].prof_nom }); instruments_trouve = "oui"; } } if (instruments_trouve === "oui") { await GS_rassemblementidf_Instrumentistes.addRows(ajout_instrumentistes);} let ajout_professeur = []; let professeur_trouve = ""; for (let i = 0; i < results3.length; i++) { if (results3[i].ras_part_role === "professeur") { ajout_professeur.push({ ID_participant: results3[i].ID_participant, identifiant: req.session.identifiant, participant_nom: results3[i].ras_part_nom.toUpperCase(), participant_prenom: results3[i].ras_part_prenom, participant_age: results3[i].ras_part_age, adherent_mail: results3[i].adherent_mail, adherent_telephone: "'" + results3[i].adherent_telephone, instrument: results3[i].instrument, repas: results3[i].repas_prof }); professeur_trouve = "oui"; } } if (professeur_trouve === "oui") { await GS_rassemblementidf_Professeurs.addRows(ajout_professeur);} let ajout_repas = []; let repas_trouve = ""; for (let i = 0; i < results3.length; i++) { if (results3[i].repas_prof === "repas") { ajout_repas.push({ ID_participant: results3[i].ID_participant, identifiant: req.session.identifiant, participant_nom: results3[i].ras_part_nom.toUpperCase(), participant_prenom: results3[i].ras_part_prenom, adherent_mail: results3[i].adherent_mail, adherent_telephone: "'" + results3[i].adherent_telephone, repas: results3[i].repas_prof }); repas_trouve = "oui"; } } if (repas_trouve === "oui") { await GS_rassemblementidf_Repas.addRows(ajout_repas);} let ajout_violon = []; let violon_trouve = ""; for (let i = 0; i < results3.length; i++) { if (results3[i].ras_part_role === "instrumentiste" && results3[i].instrument === "violon") { ajout_violon.push({ ID_participant: results3[i].ID_participant, identifiant: req.session.identifiant, participant_nom: results3[i].ras_part_nom.toUpperCase(), participant_prenom: results3[i].ras_part_prenom, participant_age: results3[i].ras_part_age, adherent_mail: results3[i].adherent_mail, adherent_telephone: "'" + results3[i].adherent_telephone, instrument: results3[i].instrument, cahier: results3[i].cahier, piece: results3[i].piece, prof_nom: results3[i].prof_nom }); violon_trouve = "oui"; } } if (violon_trouve === "oui") { await GS_rassemblementidf_VIOLON.addRows(ajout_violon);} let ajout_alto = []; let alto_trouve = ""; for (let i = 0; i < results3.length; i++) { if (results3[i].ras_part_role === "instrumentiste" && results3[i].instrument === "alto") { ajout_alto.push({ ID_participant: results3[i].ID_participant, identifiant: req.session.identifiant, participant_nom: results3[i].ras_part_nom.toUpperCase(), participant_prenom: results3[i].ras_part_prenom, participant_age: results3[i].ras_part_age, adherent_mail: results3[i].adherent_mail, adherent_telephone: "'" + results3[i].adherent_telephone, instrument: results3[i].instrument, cahier: results3[i].cahier, piece: results3[i].piece, prof_nom: results3[i].prof_nom }); alto_trouve = "oui"; } } if (alto_trouve === "oui") { await GS_rassemblementidf_ALTO.addRows(ajout_alto);} let ajout_violoncelle = []; let violoncelle_trouve = ""; for (let i = 0; i < results3.length; i++) { if (results3[i].ras_part_role === "instrumentiste" && results3[i].instrument === "violoncelle") { ajout_violoncelle.push({ ID_participant: results3[i].ID_participant, identifiant: req.session.identifiant, participant_nom: results3[i].ras_part_nom.toUpperCase(), participant_prenom: results3[i].ras_part_prenom, participant_age: results3[i].ras_part_age, adherent_mail: results3[i].adherent_mail, adherent_telephone: "'" + results3[i].adherent_telephone, instrument: results3[i].instrument, cahier: results3[i].cahier, piece: results3[i].piece, prof_nom: results3[i].prof_nom }); violoncelle_trouve = "oui"; } } if (violoncelle_trouve === "oui") { await GS_rassemblementidf_VIOLONCELLE.addRows(ajout_violoncelle);} let ajout_harpe = []; let harpe_trouve = ""; for (let i = 0; i < results3.length; i++) { if (results3[i].ras_part_role === "instrumentiste" && results3[i].instrument === "harpe") { ajout_harpe.push({ ID_participant: results3[i].ID_participant, identifiant: req.session.identifiant, participant_nom: results3[i].ras_part_nom.toUpperCase(), participant_prenom: results3[i].ras_part_prenom, participant_age: results3[i].ras_part_age, adherent_mail: results3[i].adherent_mail, adherent_telephone: "'" + results3[i].adherent_telephone, instrument: results3[i].instrument, cahier: results3[i].cahier, piece: results3[i].piece, prof_nom: results3[i].prof_nom }); harpe_trouve = "oui"; } } if (harpe_trouve === "oui") { await GS_rassemblementidf_HARPE.addRows(ajout_harpe);} let ajout_piano = []; let piano_trouve = ""; for (let i = 0; i < results3.length; i++) { if (results3[i].ras_part_role === "instrumentiste" && results3[i].instrument === "piano") { ajout_piano.push({ ID_participant: results3[i].ID_participant, identifiant: req.session.identifiant, participant_nom: results3[i].ras_part_nom.toUpperCase(), participant_prenom: results3[i].ras_part_prenom, participant_age: results3[i].ras_part_age, adherent_mail: results3[i].adherent_mail, adherent_telephone: "'" + results3[i].adherent_telephone, instrument: results3[i].instrument, cahier: results3[i].cahier, piece: results3[i].piece, prof_nom: results3[i].prof_nom }); piano_trouve = "oui"; } } if (piano_trouve === "oui") { await GS_rassemblementidf_PIANO.addRows(ajout_piano);} logger.info("AJOUT GOOGLESHEET FIN", { numsession: req.session.id, label: filename}); } catch (error) { // Echec de connection à la GOOGLE SHEET logger.error("Il y a un problème avec la connection à Google sheet (TRY 4) : " + error, { numsession: req.session.id, label: filename}); req.session.err_mail_form_adhesion_1 = '"Il y a un problème système, "' + error; res.redirect('/rassemblementidf/identifier'); } ////////////////////////////////////////////////////////////////////////////// // ENVOIE CONFIRMATION PAR MAIL let mail_objet = "ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI - RASSEMBLEMENT IDF 2026 - "; mail_objet += results2[0].adherent_nom; let mail_html = "

Cher adhérent,

Félicitations ! Vous êtes désormais inscrit au rassemblement Ile de France du 19 avril 2026 organisé par l’association La clef du bonheur, en partenariat avec l'Association Française pour la Pédagogie Suzuki.

"; mail_html += "

L'accueil est ouvert à partir de 9h30. Premier atelier à 10h30, prévoir d'être dans la salle pour l'accord à partir de 10h15. Prévoyez d'arriver en avance pour vous familiariser avec le lieu et l'emploi du temps.
Un point café est proposé par les parents d'élèves, vous y trouverez des boissons, gâteaux, viennoiseries ....prévoyez un peu d'argent en liquide pour pouvoir en profiter.
La journée se terminera après le concert vers 16h30 et un goûter sera offert aux enfants.

"; mail_html += "

Vous voudrez bien apportez votre pique-nique pour le déjeuner de midi.

"; mail_html += "

Vous trouverez en pièce jointe le programme à réviser.

"; mail_html += "

ACCÈS : parking de la salle des fêtes de Maule, place Henri Dunand, Chaussée Saint Vincent 78580 Maule. Accueil : École René Coty. Des T-shirt orange seront là pour vous diriger et vous accueillir.

"; mail_html += "
"; mail_html += '

VOTRE FACTURE :

'; mail_html += "

Identifiant Suzuki : "; mail_html += req.session.identifiant; mail_html += "

Association Suzuki : "; mail_html += results2[0].association_suzuki; mail_html += "

"; if (results2[0].accompagnant_nom !== "undefined") { mail_html += "

Personne accompagnante : "; mail_html += results2[0].accompagnant_nom; mail_html += " "; mail_html += results2[0].accompagnant_prenom;; mail_html += "

"; } if (results2[0].bus_nb > 0) { mail_html += "

Nombre de personnes pour la navette depuis Maule : "; mail_html += results2[0].bus_nb; mail_html += "

"; } mail_html += "
"; for (let toto = 0; toto<(results3.length); toto++) { if (results3[toto].ras_part_nom) { mail_html += "

PARTICIPANT "; mail_html += toto + 1; mail_html += "

"; mail_html += "

Nom : "; mail_html += results3[toto].ras_part_nom; mail_html += " "; mail_html += results3[toto].ras_part_prenom; mail_html += "

"; mail_html += "

Catégorie : "; mail_html += results3[toto].ras_part_role; mail_html += "

"; if (results3[toto].ras_part_role === "professeur") { mail_html += "

Instrument : "; mail_html += results3[toto].instrument; mail_html += "

"; if (results3[toto].repas_prof === "repas") { mail_html += "

Repas : oui (8€)

"; } } if (results3[toto].ras_part_role === "instrumentiste") { mail_html += "

Age : "; mail_html += results3[toto].ras_part_age; mail_html += "

"; mail_html += "

Instrument : "; mail_html += results3[toto].instrument; mail_html += " - "; mail_html += results3[toto].cahier; mail_html += " - "; mail_html += results3[toto].piece; mail_html += "

"; mail_html += "

Professeur : "; mail_html += results3[toto].prof_nom; mail_html += "

"; } mail_html += "
"; } } mail_html += "
"; mail_html += "

Coût total : "; mail_html += results2[0].cout_total + "€"; mail_html += "

Frais bancaire : "; mail_html += results2[0].frais_bancaire + "€"; mail_html += "
Tarif rassemblement : "; mail_html += results2[0].tarif_rassemblement + "€"; mail_html += "
Coût repas professeur(s) : "; mail_html += results2[0].cout_repas_prof + "€"; mail_html += "

"; mail_html += "


Nous nous réjouissons de vous accueillir pour cette journée !

L’Association La clef du bonheur
Marie Vélu et Philippe Arestan
Pôle organisation du rassemblement

"; let OUTPUT2 = path.resolve(__dirname, "../pdf/rassemblement/documents/")+"/rassemblementidf_programme.pdf"; var attachment_name_2 = "rassemblementidf_programme.pdf"; let mailOptions = { from: 'afps.inscription@gmail.com', to: req.session.adherent_mail, subject: mail_objet, html: mail_html, attachments: [{ filename: attachment_name_2, path: OUTPUT2 }], }; envoie_mail.envoie_mail(mailOptions); ////////////////////////////////////////////////////////////////////////////// // un tag pour ne pas ajouter plusieurs fois le même participant en cas de rafraîchissement de la page ////////////////////////////////////////////////////////////////////////////// req.session.participant_ajoute = "oui"; ////////////////////////////////////////////////////////////////////////////// // AFFICHAGE PAGE PAIEMENT RÉUSSI ////////////////////////////////////////////////////////////////////////////// res.render('rassemblementidf/page_templates/paiement_reussi.ejs'); } catch (error) { // Echec de connection à la BD logger.error("Il y a un problème avec la connection à la base de données (TRY 1) : " + error, { numsession: req.session.id, label: filename}); req.session.err_mail_form_adhesion_1 = '"Il y a un problème système, "' + error; res.redirect('/rassemblementidf/identifier'); } } } const RI_accompte_annule = async function(req, res) { logger.info("======================================"); logger.info("======== FUNCTION RI_accompte_annule =========="); logger.info("======================================"); // VARIABLES let CB_retour; let stripe_retour; // DATE moment().format(); moment.locale('fr'); ////////////////////////////////////////////////////////////////////////////// // RETOUR STRIPE let id = req.query.id; const session_stripe = await stripe.checkout.sessions.retrieve(id); let customer_email = session_stripe.customer_email; req.session.adherent_mail = customer_email; let payment_status = session_stripe.payment_status; let amount_total = session_stripe.amount_total/100; let stripe_customer = session_stripe.customer; let stripe_payment_intent = session_stripe.payment_intent; let payment_method_types = session_stripe.payment_method_types; let stripe_status = session_stripe.status; let identifiant = session_stripe.metadata.identifiant; req.session.identifiant = identifiant; CB_retour = payment_status + ", " + stripe_customer + ", " + stripe_payment_intent + ", " + session_stripe.id + ", " + payment_method_types + ", " + stripe_status; stripe_retour = session_stripe.id; logger.info("customer_email : " + customer_email, { numsession: req.session.id, label: filename}); logger.info("payment_status : " + payment_status, { numsession: req.session.id, label: filename}); try { //Connexion let db_connection_promise = await connect_DB_promise(); /// Vérifier que le paiement n'existe pas déjà /// pour ne pas faire le traitement 2 fois en cas de rafraichissement de la page let sql0 = 'select identifiant from ras_adherent where stripe_retour = "' + CB_retour + '"'; const [results0, fields0] = await db_connection_promise.execute(sql0); logger.info("Row ras_adherent stripe_retour : " + results0.length, { numsession: req.session.id, label: filename}); if (results0.length < 1) { //Query MAJ ras_adherent let sql = 'UPDATE '; sql += 'ras_adherent'; sql += ' SET '; sql += 'identifiant = concat(identifiant, ID_adherent), '; sql += 'stripe_retour = "' + CB_retour + '", '; sql += 'statut_paiement = "non paye", '; sql += 'statut_suppression = 1'; sql += ' WHERE identifiant = "' + identifiant + '" AND statut_suppression = 0 AND lieu = "IDF" AND saison = "'+process.env.SAISON+'"'; logger.info("sql UPDATE ras_adherent : " + sql, { numsession: req.session.id, label: filename}); const [results, fields] = await db_connection_promise.execute(sql); logger.info("Row stn_adherent UPDATE STRIPE: " + results.changedRows, { numsession: req.session.id, label: filename}); //Query MAJ stn_participant let sql1 = 'UPDATE '; sql1 += 'ras_participant'; sql1 += ' SET '; sql1 += 'identifiant = concat(identifiant, ID_participant), '; sql1 += 'statut_suppression = 1'; sql1 += ' WHERE identifiant = "' + identifiant + '" AND statut_suppression = 0 AND lieu = "IDF" AND saison = "'+process.env.SAISON+'"'; logger.info("sql UPDATE ras_participant : " + sql1, { numsession: req.session.id, label: filename}); const [results1, fields1] = await db_connection_promise.execute(sql1); logger.info("Row ras_participant UPDATE suppression: " + results1.changedRows, { numsession: req.session.id, label: filename}); await db_connection_promise.end(); ////////////////////////////////////////////////////////////////////////////// // AFFICHAGE DE LA PAGE ANNULÉ res.locals.identifiant = identifiant; res.render('rassemblementidf/page_templates/paiement_annule'); } } catch (error) { // Echec de connection à la BD logger.error("Il y a un problème système : " + error, { numsession: req.session.id }); req.session.err_mail_form_adhesion_1 = '"Il y a un problème système, "' + error; //await db_connection_promise.end(); res.redirect('/rassemblementidf/identifier'); } } const RI_post_valid_ss_paiement = async function (req, res) { logger.info("======================================"); logger.info("======== FUNCTION RI_post_valid_ss_paiement =========="); logger.info("======================================"); // VARIABLES ///////////////////////////////////////////////// let saison = process.env.SAISON; moment.locale('fr'); let now = moment().format("YYYY-MM-DD HH:mm:ss"); let sql; let table; let champs; let values; ///////////////////////////////////////////////// // SI IDENTIFIANT PERDU ///////////////////////////////////////////////// logger.info("req.session.identifiant : " + req.session.identifiant , { numsession: req.session.id, label: filename}); if (req.session.identifiant === undefined) { logger.info("IDENTIFIANT PERDU", { numsession: req.session.id }); req.session.err_mail_form_adhesion_1 = "Session expirée, veuillez recommencer"; res.redirect('/rassemblementidf/identifier'); } else { ///////////////////////////////////////////////// // AJOUT DANS LA BASE DE DONNÉES // TRY 5 try { //Connexion let db_connection_promise = await connect_DB_promise(); // une vérification pour ne pas ajouter plusieurs fois le même participant en cas de rafraîchissement de la page logger.info("req.session.participant_ajoute : " + req.session.participant_ajoute, { numsession: req.session.id, label: filename}); if (req.session.participant_ajoute === "oui") { req.session.err_mail_form_adhesion_1 = "Votre session est terminée, les participants ont déjà été ajoutés."; res.redirect('/rassemblementidf/identifier'); } else { ///////////////////////////////////////////////// // AJOUT PARTICIPANTS for (let toto = 1; toto < 7; toto++) { if (req.session["personne_"+toto+"_nom"]) { // QUERY ADD ras_participant table = "ras_participant"; if (req.session["personne_"+toto+"_role"] === "professeur"){ champs = "lieu, saison, identifiant, date_maj, ras_part_nom, ras_part_prenom, ras_part_date_naiss, ras_part_age, ras_part_role, instrument, repas_prof, statut_suppression"; values = '"IDF", "'+process.env.SAISON+'", "'+ req.session.identifiant + '", "'+ now + '", "'+ req.session["personne_"+toto+"_nom"] + '", "' + req.session["personne_"+toto+"_prenom"] + '", "'+ req.session["personne_"+toto+"_datenaissance"] + '", "'+ req.session["personne_"+toto+"_age"] + '", "' + req.session["personne_"+toto+"_role"] + '", "' + req.session["personne_"+toto+"_instrument"] + '", "'+ req.session["personne_"+toto+"_repas"] + '", 0'; } sql = 'INSERT INTO ' + table + ' (' + champs + ') VALUES (' + values + ')'; logger.info("REQUETE SQL INSERT INTO ras_participant : " + sql , { numsession: req.session.id, label: filename}); const [results_ras_participant, fields] = await db_connection_promise.execute(sql); logger.info("ras_participant Row ID added : " + results_ras_participant.insertId, { numsession: req.session.id, label: filename}); } } ///////////////////////////////////////////////// // AJOUT DB ADHÉRENTS // QUERY ADD ras_adherent if (!req.session.bus_nb) {req.session.bus_nb = 0}; table = "ras_adherent"; champs = "lieu, identifiant, association_suzuki, saison, date_maj, adherent_nom, adherent_prenom, adherent_telephone, adherent_mail, adherent_adresse_rue, adherent_adresse_complement, adherent_adresse_codepostal, adherent_adresse_ville, adherent_adresse_pays, ras_commentaire, accompagnant_nom, accompagnant_prenom, bus_nb, tarif_rassemblement, cout_repas_prof, frais_bancaire, cout_total, statut_paiement, statut_suppression"; values = '"IDF", "' + req.session.identifiant + '", "' + req.session.association_suzuki + '", "' + saison + '", "' + now + '", "' + req.session.adherent_nom + '", "' + req.session.adherent_prenom + '", "' + req.session.adherent_telephone_mobile + '", "' + req.session.adherent_mail + '", "' + req.session.adherent_adresse_rue + '", "' + req.session.adherent_adresse_complement + '", "' + req.session.adherent_adresse_codepostal + '", "' + req.session.adherent_adresse_ville + '", "' + req.session.adherent_adresse_pays + '", "' + req.session.commentaire_adherent + '", "' + req.session.accompagnant_nom + '", "' + req.session.accompagnant_prenom + '",' + req.session.bus_nb + ',' + req.session.cout_rassemblement + ',' + req.session.cout_repas + ',' + req.session.accompte_frais_bancaire + ',' + req.session.cout_total + ',"gratuit",0'; sql = 'INSERT INTO ' + table + ' (' + champs + ') VALUES (' + values + ')'; logger.info("REQUETE SQL INSERT INTO ras_adherent : " + sql , { numsession: req.session.id, label: filename}); const [results_ras_adherent, fields] = await db_connection_promise.execute(sql); logger.info("ras_adherent Row ID added : " + results_ras_adherent.insertId, { numsession: req.session.id, label: filename}); ////////////////////////////////////////////////////////////////////////////// // Query Récupération des infos pour copie dans Google Sheet + envoie du mail // obligatoire pour récupérer le numéro adhérent // adhérent let sql2 = 'select * from '; sql2 += 'ras_adherent'; sql2 += ' WHERE identifiant = "' + req.session.identifiant + '" AND statut_suppression = 0 AND lieu = "IDF" AND saison = "' + process.env.SAISON + '"'; const [results2, fields2] = await db_connection_promise.execute(sql2); logger.info("Row ras_adherent SELECT : " + results2.length, { numsession: req.session.id, label: filename}); // participants let sql3 = 'SELECT ras_adherent.identifiant, ras_adherent.association_suzuki, ras_adherent.saison, ras_adherent.date_maj, ras_adherent.adherent_nom, ras_adherent.adherent_prenom, ras_adherent.adherent_telephone, ras_adherent.adherent_mail, ras_participant.ID_participant, ras_participant.ras_part_nom, ras_participant.ras_part_prenom, ras_participant.ras_part_date_naiss, ras_participant.ras_part_role, ras_participant.ras_part_age, ras_participant.instrument, ras_participant.cahier, ras_participant.piece, ras_participant.prof_nom, ras_participant.repas_prof FROM ras_participant JOIN ras_adherent ON ras_participant.identifiant = ras_adherent.identifiant WHERE ras_participant.identifiant = "' + req.session.identifiant + '" AND ras_participant.statut_suppression = 0 AND ras_participant.lieu = "IDF" AND ras_participant.saison = "' + process.env.SAISON + '"'; const [results3, fields3] = await db_connection_promise.execute(sql3); await db_connection_promise.end(); logger.info("Row ras_participant SELECT nombre de participants : " + results3.length, { numsession: req.session.id, label: filename}); await db_connection_promise.end(); ////////////////////////////////////////////////////////////////////////////// // PRÉPARATION PAGE PAIEMENT RÉUSSI res.locals.identifiant = req.session.identifiant; res.locals.association_suzuki = req.session.association_suzuki; res.locals.bus_nb = req.session.bus_nb; for (let toto = 1; toto <= (results3.length); toto++) { res.locals["personne_"+toto+"_numero"] = toto; res.locals["personne_"+toto+"_nom"] = req.session["personne_"+toto+"_nom"]; res.locals["personne_"+toto+"_prenom"] = req.session["personne_"+toto+"_prenom"]; res.locals["personne_"+toto+"_role"] = req.session["personne_"+toto+"_role"]; res.locals["personne_"+toto+"_instrument"] = req.session["personne_"+toto+"_instrument"]; res.locals["personne_"+toto+"_repas"] = req.session["personne_"+toto+"_repas"]; logger.info('toto = ' + toto, { numsession: req.session.id, label: filename }); logger.info('res.locals["personne_"+toto+"_prenom"] = ' + res.locals["personne_"+toto+"_prenom"], { numsession: req.session.id, label: filename }); } res.locals.tag_ss_paiement = "oui"; ////////////////////////////////////////////////////////////////////////////// // AJOUT INFOS DANS GOOGLE SHEET // TRY 6 try { await GS_rassemblementidf.useServiceAccountAuth(GS_creds_rassemblementidf); await GS_rassemblementidf.loadInfo(); let GS_rassemblementidf_Adherents = GS_rassemblementidf.sheetsByTitle['Adherents']; let GS_rassemblementidf_Paiements = GS_rassemblementidf.sheetsByTitle['Paiements']; let GS_rassemblementidf_NAVETTE = GS_rassemblementidf.sheetsByTitle['NAVETTE']; let GS_rassemblementidf_Professeurs = GS_rassemblementidf.sheetsByTitle['Professeurs']; await GS_rassemblementidf_Adherents.addRows ( [ { ID_adherent: results2[0].ID_adherent, saison: results2[0].saison, identifiant: req.session.identifiant, association_suzuki: results2[0].association_suzuki, date: moment(results2[0].date_maj).format("YYYY-MM-DD HH:mm:ss"), adherent_nom: results2[0].adherent_nom.toUpperCase(), adherent_prenom: results2[0].adherent_prenom, adherent_mail: results2[0].adherent_mail, adherent_telephone: "'" + results2[0].adherent_telephone, adherent_adresse_rue: results2[0].adherent_adresse_rue, adherent_adresse_complement: results2[0].adherent_adresse_complement, adherent_adresse_codepostal: results2[0].adherent_adresse_codepostal, adherent_adresse_ville: results2[0].adherent_adresse_ville, adherent_adresse_pays: results2[0].adherent_adresse_pays, commentaire: results2[0].ras_commentaire } ] ); if (results2[0].bus_nb > 0) { await GS_rassemblementidf_NAVETTE.addRows ( [ { ID_adherent: results2[0].ID_adherent, identifiant: req.session.identifiant, adherent_nom: results2[0].adherent_nom.toUpperCase(), adherent_prenom: results2[0].adherent_prenom, adherent_telephone: "'" + results2[0].adherent_telephone, bus_nb : results2[0].bus_nb } ] ); } let ajout_professeur = []; let professeur_trouve = ""; for (let i = 0; i < results3.length; i++) { if (results3[i].ras_part_role === "professeur") { ajout_professeur.push({ ID_participant: results3[i].ID_participant, identifiant: req.session.identifiant, participant_nom: results3[i].ras_part_nom.toUpperCase(), participant_prenom: results3[i].ras_part_prenom, participant_age: results3[i].ras_part_age, adherent_mail: results3[i].adherent_mail, adherent_telephone: "'" + results3[i].adherent_telephone, instrument: results3[i].instrument, repas: results3[i].repas_prof }); professeur_trouve = "oui"; } } if (professeur_trouve === "oui") { await GS_rassemblementidf_Professeurs.addRows(ajout_professeur);} logger.info("AJOUT GOOGLESHEET FIN", { numsession: req.session.id, label: filename}); } catch (error) { // Echec de connection à la GOOGLE SHEET logger.error("Il y a un problème avec la connection à Google sheet (TRY 6) : " + error, { numsession: req.session.id, label: filename}); req.session.err_mail_form_adhesion_1 = '"Il y a un problème système, "' + error; res.redirect('/rassemblementidf/identifier'); } ////////////////////////////////////////////////////////////////////////////// // ENVOIE CONFIRMATION PAR MAIL let mail_objet = "ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI - RASSEMBLEMENT IDF 2026 - "; mail_objet += results2[0].adherent_nom; let mail_html = "

Cher adhérent,

Félicitations ! Vous êtes désormais inscrit au rassemblement Ile de France du 19 avril 2026 organisé par l’association La clef du bonheur, en partenariat avec l'Association Française pour la Pédagogie Suzuki.

"; mail_html += "

L'accueil est ouvert à partir de 9h30. Premier atelier à 10h30, prévoir d'être dans la salle pour l'accord à partir de 10h15. Prévoyez d'arriver en avance pour vous familiariser avec le lieu et l'emploi du temps.
Un point café est proposé par les parents d'élèves, vous y trouverez des boissons, gâteaux, viennoiseries ....prévoyez un peu d'argent en liquide pour pouvoir en profiter.
La journée se terminera après le concert vers 16h30 et un goûter sera offert aux enfants.

"; mail_html += "

Vous voudrez bien apportez votre pique-nique pour le déjeuner de midi.

"; mail_html += "

Vous trouverez en pièce jointe le programme à réviser.

"; mail_html += "

ACCÈS : parking de la salle des fêtes de Maule, place Henri Dunand, Chaussée Saint Vincent 78580 Maule. Accueil : École René Coty. Des T-shirt orange seront là pour vous diriger et vous accueillir.

"; mail_html += "
"; mail_html += '

VOTRE INSCRIPTION :

'; mail_html += "

Identifiant Suzuki : "; mail_html += req.session.identifiant; mail_html += "

Association Suzuki : "; mail_html += results2[0].association_suzuki; mail_html += "

"; if (results2[0].bus_nb > 0) { mail_html += "

Nombre de personnes pour la navette depuis Maule : "; mail_html += results2[0].bus_nb; mail_html += "

"; } mail_html += "
"; for (let toto = 0; toto<(results3.length); toto++) { if (results3[toto].ras_part_nom) { mail_html += "

PARTICIPANT "; mail_html += toto + 1; mail_html += "

"; mail_html += "

Nom : "; mail_html += results3[toto].ras_part_nom; mail_html += " "; mail_html += results3[toto].ras_part_prenom; mail_html += "

"; mail_html += "

Catégorie : "; mail_html += results3[toto].ras_part_role; mail_html += "

"; if (results3[toto].ras_part_role === "professeur") { mail_html += "

Instrument : "; mail_html += results3[toto].instrument; mail_html += "

"; } mail_html += "
"; } } mail_html += "
"; mail_html += "


Nous nous réjouissons de vous accueillir pour cette journée !

L’Association La clef du bonheur
Marie Vélu et Philippe Arestan
Pôle organisation du rassemblement

"; let OUTPUT = path.resolve(__dirname, "../pdf/rassemblement/documents/")+"/rassemblementidf_plan_lieu.pdf"; var attachment_name = "rassemblementidf_plan_lieu.pdf"; let OUTPUT2 = path.resolve(__dirname, "../pdf/rassemblement/documents/")+"/rassemblementidf_programme.pdf"; var attachment_name_2 = "rassemblementidf_programme.pdf"; let mailOptions = { from: 'afps.inscription@gmail.com', to: req.session.adherent_mail, subject: mail_objet, html: mail_html, attachments: [{ filename: attachment_name_2, path: OUTPUT2 }], }; envoie_mail.envoie_mail(mailOptions); ////////////////////////////////////////////////////////////////////////////// // un tag pour ne pas ajouter plusieurs fois le même participant en cas de rafraîchissement de la page ////////////////////////////////////////////////////////////////////////////// req.session.participant_ajoute = "oui"; ////////////////////////////////////////////////////////////////////////////// // AFFICHAGE PAGE PAIEMENT RÉUSSI ////////////////////////////////////////////////////////////////////////////// res.render('rassemblementidf/page_templates/paiement_reussi.ejs'); } } catch (error) { // Echec de connection à la BD logger.error("Il y a un problème avec la connection à la base de données (TRY 5) : " + error, { numsession: req.session.id }); req.session.err_mail_form_adhesion_1 = '"Il y a un problème système connexion base de données, veuillez recommencer, "' + error; res.redirect('/rassemblementidf/identifier'); } } } ///////////////////////////////////////////////// // EXPORT DE MODULE POUR QU'IL SOIT LU DANS LES AUTRES FICHIERS JS ///////////////////////////////////////////////// module.exports = { RI_checkidentifiant, RI_checkinfos, post_recap_modifier, post_payer_ri, RI_accompte_reussi, RI_accompte_annule, RI_post_valid_ss_paiement }