Files
aduzuki/controllers/rassemblementController.js
2026-07-20 16:33:04 +02:00

1258 lines
80 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/////////////////////////////////////////////////
// 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 <a target="_blank" href="https://www.inscription.afpedagogiesuzuki.fr/adhesion/"><span class="souligne">Cliquez ici</span></a>';
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 <a target="_blank" href="https://www.inscription.afpedagogiesuzuki.fr/adhesion/"><span class="souligne">Cliquez ici</span></a>';
res.redirect('/rassemblementidf/identifier');
}
if (!req.body.identifiant && !req.body.check_nonadherent) {
req.session.err_mail_form_adhesion_1 = "Veuillez entrer votre identifiant AFPS<br>(Association Française pour la Pédagogie Suzuki),<br><br>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 = '<a target="_blank" href="https://www.inscription.afpedagogiesuzuki.fr/adhesion/"><span class="souligne">Cliquez ici</span></a>';
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 <strong>" + req.session.identifiant + "</strong> 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. <br>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, <a target="_blank" href="https://www.inscription.afpedagogiesuzuki.fr/adhesion/"><span class="souligne">cliquez ici</span></a>';
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 = "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'>Cher adhérent,</p><p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'>Félicitations ! Vous êtes désormais inscrit au rassemblement Ile de France du 19 avril 2026 organisé par lassociation La clef du bonheur, en partenariat avec l'Association Française pour la Pédagogie Suzuki.</p>";
mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'>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.<br>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. <br>La journée se terminera après le concert vers 16h30 et un goûter sera offert aux enfants.</p>";
mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'>Vous voudrez bien apportez votre pique-nique pour le déjeuner de midi.</p>";
mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'>Vous trouverez en pièce jointe le programme à réviser.</p>";
mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'>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.</p>";
mail_html += "<br>";
mail_html += '<p style="color:#E73058;font-size: 13pt; font-family: Arial; text-decoration: none;"><strong>VOTRE FACTURE :</strong></p>';
mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'><strong>Identifiant Suzuki : </strong>";
mail_html += req.session.identifiant;
mail_html += "</p><p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'><strong>Association Suzuki : </strong>";
mail_html += results2[0].association_suzuki;
mail_html += "</p>";
if (results2[0].accompagnant_nom !== "undefined") {
mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'><strong>Personne accompagnante : </strong>";
mail_html += results2[0].accompagnant_nom;
mail_html += " ";
mail_html += results2[0].accompagnant_prenom;;
mail_html += "</p>";
}
if (results2[0].bus_nb > 0) {
mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'><strong>Nombre de personnes pour la navette depuis Maule : </strong>";
mail_html += results2[0].bus_nb;
mail_html += "</p>";
}
mail_html += "<br>";
for (let toto = 0; toto<(results3.length); toto++) {
if (results3[toto].ras_part_nom) {
mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #07475A; text-decoration: underline;'><strong>PARTICIPANT ";
mail_html += toto + 1;
mail_html += "</strong></p>";
mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'><strong style='color:#0D6A87'>Nom : </strong>";
mail_html += results3[toto].ras_part_nom;
mail_html += " ";
mail_html += results3[toto].ras_part_prenom;
mail_html += "</p>";
mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'><strong style='color:#0D6A87'>Catégorie : </strong>";
mail_html += results3[toto].ras_part_role;
mail_html += "</p>";
if (results3[toto].ras_part_role === "professeur") {
mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'><strong style='color:#0D6A87'>Instrument : </strong>";
mail_html += results3[toto].instrument;
mail_html += "</p>";
if (results3[toto].repas_prof === "repas") {
mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'><strong style='color:#0D6A87'>Repas : oui (8€)</strong></p>";
}
}
if (results3[toto].ras_part_role === "instrumentiste") {
mail_html += "</p><p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'><strong style='color:#0D6A87'>Age : </strong>";
mail_html += results3[toto].ras_part_age;
mail_html += "</p>";
mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'><strong style='color:#0D6A87'>Instrument : </strong>";
mail_html += results3[toto].instrument;
mail_html += " - ";
mail_html += results3[toto].cahier;
mail_html += " - ";
mail_html += results3[toto].piece;
mail_html += "</p>";
mail_html += "</p><p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'><strong style='color:#0D6A87'>Professeur : </strong>";
mail_html += results3[toto].prof_nom;
mail_html += "</p>";
}
mail_html += "<br>";
}
}
mail_html += "<br>";
mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'><strong>Coût total : </strong>";
mail_html += results2[0].cout_total + "€";
mail_html += "</p><p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'>Frais bancaire : ";
mail_html += results2[0].frais_bancaire + "€";
mail_html += "<br>Tarif rassemblement : ";
mail_html += results2[0].tarif_rassemblement + "€";
mail_html += "<br>Coût repas professeur(s) : ";
mail_html += results2[0].cout_repas_prof + "€";
mail_html += "</p>";
mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'><br>Nous nous réjouissons de vous accueillir pour cette journée !</p><p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'>LAssociation La clef du bonheur<br>Marie Vélu et Philippe Arestan<br>Pôle organisation du rassemblement</p>";
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 = "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'>Cher adhérent,</p><p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'>Félicitations ! Vous êtes désormais inscrit au rassemblement Ile de France du 19 avril 2026 organisé par lassociation La clef du bonheur, en partenariat avec l'Association Française pour la Pédagogie Suzuki.</p>";
mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'>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.<br>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. <br>La journée se terminera après le concert vers 16h30 et un goûter sera offert aux enfants.</p>";
mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'>Vous voudrez bien apportez votre pique-nique pour le déjeuner de midi.</p>";
mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'>Vous trouverez en pièce jointe le programme à réviser.</p>";
mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'>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.</p>";
mail_html += "<br>";
mail_html += '<p style="color:#E73058;font-size: 13pt; font-family: Arial; text-decoration: none;"><strong>VOTRE INSCRIPTION :</strong></p>';
mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'><strong>Identifiant Suzuki : </strong>";
mail_html += req.session.identifiant;
mail_html += "</p><p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'><strong>Association Suzuki : </strong>";
mail_html += results2[0].association_suzuki;
mail_html += "</p>";
if (results2[0].bus_nb > 0) {
mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'><strong>Nombre de personnes pour la navette depuis Maule : </strong>";
mail_html += results2[0].bus_nb;
mail_html += "</p>";
}
mail_html += "<br>";
for (let toto = 0; toto<(results3.length); toto++) {
if (results3[toto].ras_part_nom) {
mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #07475A; text-decoration: underline;'><strong>PARTICIPANT ";
mail_html += toto + 1;
mail_html += "</strong></p>";
mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'><strong style='color:#0D6A87'>Nom : </strong>";
mail_html += results3[toto].ras_part_nom;
mail_html += " ";
mail_html += results3[toto].ras_part_prenom;
mail_html += "</p>";
mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'><strong style='color:#0D6A87'>Catégorie : </strong>";
mail_html += results3[toto].ras_part_role;
mail_html += "</p>";
if (results3[toto].ras_part_role === "professeur") {
mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'><strong style='color:#0D6A87'>Instrument : </strong>";
mail_html += results3[toto].instrument;
mail_html += "</p>";
}
mail_html += "<br>";
}
}
mail_html += "<br>";
mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'><br>Nous nous réjouissons de vous accueillir pour cette journée !</p><p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'>LAssociation La clef du bonheur<br>Marie Vélu et Philippe Arestan<br>Pôle organisation du rassemblement</p>";
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
}