///////////////////////////////////////////////// // LOGGING ///////////////////////////////////////////////// const logger = require("../../public/js/app/logger_concert"); ///////////////////////////////////////////////// // APPELS DES MODULES ///////////////////////////////////////////////// const path = require("path"); const fs = require("fs"); // CALCUL DE DATE const moment = require('moment'); // ENVOIE MAIL GOOGLE MAIL const nodemailer = require('nodemailer'); // CONNECTION BASE DE DONNÉES const mysql = require('mysql2'); const mysql_promise = require('mysql2/promise'); // STRIPE const stripe = require('stripe')(process.env.STRIPE_PRIVATE_KEY); // FETCH (utile pour nodejs version < 18) const fetch = require("node-fetch"); ///////////////////////////////////////////////// // GOOGLE SHEET PARAMETERS ///////////////////////////////////////////////// const { GoogleSpreadsheet } = require('google-spreadsheet'); const GS_creds = require('../../inscriptionsafps-53b60452f63d.json'); const { error } = require("console"); // Fichier Google Sheet "afps_concert_annuel" (Mon Drive/inscriptions/base_donees) // doc ID is the long id in the sheets URL const GS_concert = new GoogleSpreadsheet(process.env.gsheet_concertannuel); ///////////////////////////////////////////////// // APPELS DES FONCTIONS ///////////////////////////////////////////////// const sleep = require("./../../modules/sleep"); const envoie_mail = require("./../../modules/envoie_mail"); //////////////////////////////////////////////////// // FILE NAME //////////////////////////////////////////////////// const filename = path.parse(__filename).base; //////////////////////////////////////////////////// // CONNECTION DB //////////////////////////////////////////////////// async function connect_DB_promise() { return db_connection_promise = await mysql_promise.createConnection({ host: process.env.db_connection_host, port: process.env.db_connection_port, user: process.env.db_connection_user, password: process.env.db_connection_password, database: process.env.db_connection_database }); } ///////////////////////////////////////////////// // 4 - PAGE RECAP // CLIC sur PAYER // enregistrement dans la BD des participants // Envoie vers Stripe ///////////////////////////////////////////////// const payer = async function (req, res) { logger.info("======================================", { label: filename }); logger.info("======== FUNCTION payer (enregistrement BD + envoie vers Stripe) ==========", { label: filename }); logger.info("======================================", { label: filename }); logger.info("req.session.adherent_mail = " + req.session.adherent_mail , { numsession: req.session.id, label: filename}); logger.info("req.session.deja_inscrit_concert = " + req.session.deja_inscrit_concert , { numsession: req.session.id, label: filename}); let sql; let table; let champs; let values; let saison = "2025/2026"; moment.locale('fr'); let now = moment().format("YYYY-MM-DD HH:mm:ss"); var today = moment().format('L'); let commande_nbr_places_concertiste = 0; let commande_nbr_places_encadrant_parent = 0; let commande_nbr_places_encadrant_prof = 0; let piano_commandes = 0; let alto_commandes = 0; let flute_commandes = 0; let trompette_commandes = 0; let harpe_commandes = 0; let violon1_commandes = 0; let violon2_commandes = 0; let violoncelle1_commandes = 0; let violoncelle2_commandes = 0; var mail_objet; var mail_html; function affiche_page_identifier() { //////////////////////////////////////////////////// // AFFIHER LA PAGE /identifier // AFFICHAGE DES ERREURS // EN CAS DE RETOUR SUR LA PAGE AVEC ERREUR : // - SI IDENTIFIANT NON ADHÉRENT // - SI RIEN SAISIE //////////////////////////////////////////////////// if (req.session.err_mail_form_adhesion_1) { res.locals.err_mail_form_adhesion_1 = req.session.err_mail_form_adhesion_1; res.locals.err_mail_form_adhesion_2 = req.session.err_mail_form_adhesion_2; res.locals.err_mail_form_adhesion_3 = req.session.err_mail_form_adhesion_3; // on supprime le contenu après affichage req.session.err_mail_form_adhesion_1 = undefined; req.session.err_mail_form_adhesion_2 = undefined; req.session.err_mail_form_adhesion_3 = undefined; } res.render('concert/page_templates/erreur'); }; ///////////////////////////////////////////////// // 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"; affiche_page_identifier(); } else { ///////////////////////////////////////////////// // AJOUT DANS LA BASE DE DONNÉES ///////////////////////////////////////////////// if (req.session.deja_inscrit_concert == "non") { logger.info("NOUVELLE INSCRIPTION AU CONCERT", { numsession: req.session.id, label: filename}); } else if (req.session.deja_inscrit_concert == "oui") { logger.info("AJOUT DE BILLETS POUR UN ADHÉRENT DÉJÀ INSCRIT AU CONCERT", { numsession: req.session.id, label: filename}); } // CONNECTION DB PROMISE try { //Connexion let db_connection_promise = await connect_DB_promise(); //Queries ///////////////////////////////////////////////// // AJOUT CONCERTISTES for (let toto = 1; toto < 5; toto++) { if (req.session["eleve_"+toto+"_nom"]) { table = "ca_concertiste"; if (req.session.deja_inscrit_concert == "non") { champs = "date_maj,saison,identifiant,concertiste_nom,concertiste_prenom,concertiste_age,concertiste_intrument,concertiste_cahier,concertiste_piece,concertiste_prof_nom,concertiste_prof_mail"; values = '"'+ now + '","' + saison + '"' + ',"' + req.session.identifiant + '","' + req.session["eleve_"+toto+"_nom"] + '","' + req.session["eleve_"+toto+"_prenom"] + '",' + req.session["eleve_"+toto+"_age"] + ',"' + req.session["eleve_"+toto+"_instrument"] + '","' + req.session["eleve_"+toto+"_cahier"] + '","' + req.session["eleve_"+toto+"_piece"] + '","' + req.session["eleve_"+toto+"_prof_nom"] + '","' + req.session["eleve_"+toto+"_prof_mail"] + '"'; } else if (req.session.deja_inscrit_concert == "oui") { champs = "date_maj,saison,identifiant,concertiste_nom,concertiste_prenom,concertiste_age,concertiste_intrument,concertiste_cahier,concertiste_piece,concertiste_prof_nom,concertiste_prof_mail,ajout"; values = '"'+ now + '","' + saison + '"' + ',"' + req.session.identifiant + '","' + req.session["eleve_"+toto+"_nom"] + '","' + req.session["eleve_"+toto+"_prenom"] + '",' + req.session["eleve_"+toto+"_age"] + ',"' + req.session["eleve_"+toto+"_instrument"] + '","' + req.session["eleve_"+toto+"_cahier"] + '","' + req.session["eleve_"+toto+"_piece"] + '","' + req.session["eleve_"+toto+"_prof_nom"] + '","' + req.session["eleve_"+toto+"_prof_mail"] + '","' + now + '"'; } sql = 'INSERT INTO ' + table + ' (' + champs + ') VALUES (' + values + ')'; logger.info("REQUETE SQL ca_concertiste : " + sql , { numsession: req.session.id, label: filename}); const [results, fields] = await db_connection_promise.execute(sql); logger.info("CONCERTISTES Row ID added : " + results.insertId, { numsession: req.session.id, label: filename}); // COMPTEUR DE PLACES commande_nbr_places_concertiste += 1; if (req.session["eleve_"+toto+"_instrument"] == "Piano") { piano_commandes += 1; } if (req.session["eleve_"+toto+"_instrument"] == "Alto") { alto_commandes += 1; } if (req.session["eleve_"+toto+"_instrument"] == "Flute") { flute_commandes += 1; } if (req.session["eleve_"+toto+"_instrument"] == "Trompette") { trompette_commandes += 1; } if (req.session["eleve_"+toto+"_instrument"] == "Harpe") { harpe_commandes += 1; } if (req.session["eleve_"+toto+"_instrument"] == "Violon") { switch (req.session["eleve_"+toto+"_cahier"]) { case 'Cahier 1': violon1_commandes += 1; break; case 'Cahier 2': violon1_commandes += 1; break; case 'Cahier 3': violon1_commandes += 1; break; case 'Cahier 4': violon1_commandes += 1; break; case 'Cahier 5': violon1_commandes += 1; break; case 'Cahier 6': violon2_commandes += 1; break; case 'Cahier 7': violon2_commandes += 1; break; case 'Cahier 8': violon2_commandes += 1; break; case 'Cahier 9': violon2_commandes += 1; break; case 'Cahier 10': violon2_commandes += 1; break; default: logger.info("Erreur détecté dans le switch req.session[eleve_+toto+_instrument] == Violon", { numsession: req.session.id, label: filename}); } } if (req.session["eleve_"+toto+"_instrument"] == "Violoncelle") { switch (req.session["eleve_"+toto+"_cahier"]) { case 'Cahier 1': violoncelle1_commandes += 1; break; case 'Cahier 2': violoncelle1_commandes += 1; break; case 'Cahier 3': violoncelle1_commandes += 1; break; case 'Cahier 4': violoncelle1_commandes += 1; break; case 'Cahier 5': violoncelle2_commandes += 1; break; case 'Cahier 6': violoncelle2_commandes += 1; break; case 'Cahier 7': violoncelle2_commandes += 1; break; case 'Cahier 8': violoncelle2_commandes += 1; break; case 'Cahier 9': violoncelle2_commandes += 1; break; case 'Cahier 10': violoncelle2_commandes += 1; break; default: logger.info("Erreur détecté dans le switch req.session[eleve_+toto+_instrument] == Violoncelle", { numsession: req.session.id, label: filename}); } } } } ///////////////////////////////////////////////// // AJOUT ENCADRANTS let compteur_encadrants = 0; for (let toto = 1; toto < 5; toto++) { if (req.session["encadrant_"+toto+"_nom"]) { // SI PARENT, ne rien mettre dans instrument (évite qu'il y ait "undefined") if (!req.session["encadrant_"+toto+"_prof_instrument"]) {req.session["encadrant_"+toto+"_prof_instrument"] = ''}; table = "ca_encadrant"; if (req.session.deja_inscrit_concert == "non") { champs = "date_maj,saison,identifiant,encadrant_type,encadrant_nom,encadrant_prenom,encadrant_telephone_mobile,encadrant_mail,encadrant__prof_instrument"; values = '"'+ now + '","' + saison + '"' + ',"' + req.session.identifiant + '","' + req.session["encadrant_"+toto+"_type"] + '","' + req.session["encadrant_"+toto+"_nom"] + '","' + req.session["encadrant_"+toto+"_prenom"] + '","' + req.session["encadrant_"+toto+"_telephone_mobile"] + '","' + req.session["encadrant_"+toto+"_mail"] + '","' + req.session["encadrant_"+toto+"_prof_instrument"] + '"'; } else if (req.session.deja_inscrit_concert == "oui") { champs = "date_maj,saison,identifiant,encadrant_type,encadrant_nom,encadrant_prenom,encadrant_telephone_mobile,encadrant_mail,encadrant__prof_instrument, ajout"; values = '"'+ now + '","' + saison + '"' + ',"' + req.session.identifiant + '","' + req.session["encadrant_"+toto+"_type"] + '","' + req.session["encadrant_"+toto+"_nom"] + '","' + req.session["encadrant_"+toto+"_prenom"] + '","' + req.session["encadrant_"+toto+"_telephone_mobile"] + '","' + req.session["encadrant_"+toto+"_mail"] + '","' + req.session["encadrant_"+toto+"_prof_instrument"] + '","' + now + '"'; } sql = 'INSERT INTO ' + table + ' (' + champs + ') VALUES (' + values + ')'; logger.info("REQUETE SQL ca_encadrant : " + sql , { numsession: req.session.id, label: filename}); const [results, fields] = await db_connection_promise.execute(sql); // COMPTEUR DE PLACES if (req.session["encadrant_"+toto+"_type"]=="Professeur") { commande_nbr_places_encadrant_prof += 1; }; if (req.session["encadrant_"+toto+"_type"]=="Parent") { commande_nbr_places_encadrant_parent += 1; }; compteur_encadrants++; } } ///////////////////////////////////////////////// // AJOUT DB INFORMATIONS ADHÉRENTS // SI C'EST SA PREMIÈRE INSCRIPTION if (req.session.deja_inscrit_concert == "non") { table = "ca_adherent"; sql = 'INSERT INTO '; sql += table; sql += ' ('; sql += 'date_inscription, '; sql += 'date_maj, '; sql += 'saison, '; sql += 'identifiant, '; sql += 'association_suzuki, '; sql += 'adherent_nom, '; sql += 'adherent_prenom, '; sql += 'adherent_telephone_mobile, '; sql += 'adherent_mail, '; sql += 'hebergement_ville, '; sql += 'hebergement_places, '; sql += 'commande_nb_spectateur, '; sql += 'comment, '; sql += 'commande_nb_concertiste, '; sql += 'commande_nb_encadr_prof, '; sql += 'commande_nb_encadr_par, '; sql += 'commande_cout_concertiste, '; sql += 'commande_cout_spectateur, '; sql += 'don, '; sql += 'stripe_statut_paiement, '; sql += 'montant_total'; sql += ') VALUES ('; sql += '"'+ now +'",'; sql += '"'+ now +'",'; sql += '"'+ saison +'",'; sql += '"'+ req.session.identifiant +'",'; sql += '"'+ req.session.association_suzuki +'",'; sql += '"'+ req.session.adherent_nom +'",'; sql += '"'+ req.session.adherent_prenom +'",'; sql += '"'+ req.session.adherent_telephone_mobile +'",'; sql += '"'+ req.session.adherent_mail +'",'; sql += '"'+ req.session.hebergement_ville +'",'; sql += ''+ req.session.hebergement_nb +','; sql += ''+ req.session.spectateur_nb_place +','; sql += '"'+ req.session.commentaire_adherent +'",'; sql += ''+ commande_nbr_places_concertiste +','; sql += ''+ commande_nbr_places_encadrant_prof +','; sql += ''+ commande_nbr_places_encadrant_parent +','; sql += ''+ req.session.cout_concertiste +','; sql += ''+ req.session.cout_spectateur +','; sql += ''+ parseInt(req.session.don) +','; if (req.session.montant_total > 0) { sql += '"attente",'; } else { sql += '"gratuit",'; } sql += ''+ req.session.montant_total; sql += ')'; logger.info("REQUETE SQL ca_adherent : " + sql , { numsession: req.session.id, label: filename}); const [results_insert_ca_adherent, fields_insert_ca_adherent] = await db_connection_promise.execute(sql); logger.info("ADHÉRENTS Row ID added : " + results_insert_ca_adherent.insertId, { numsession: req.session.id, label: filename}); } else if (req.session.deja_inscrit_concert == "oui") { // SI C'EST UN AJOUT DE BILLET table = "ca_ajout"; sql = 'INSERT INTO '; sql += table; sql += ' ('; sql += 'date_maj, '; sql += 'saison, '; sql += 'identifiant, '; sql += 'commande_nb_spectateur, '; sql += 'commande_nb_concertiste, '; sql += 'commande_nb_encadr_prof, '; sql += 'commande_nb_encadr_par, '; sql += 'commande_cout_concertiste, '; sql += 'commande_cout_spectateur, '; sql += 'don, '; sql += 'stripe_statut_paiement, '; sql += 'montant_total'; sql += ') VALUES ('; sql += '"'+ now +'",'; sql += '"'+ saison +'",'; sql += '"'+ req.session.identifiant +'",'; sql += ''+ req.session.spectateur_nb_place +','; sql += ''+ commande_nbr_places_concertiste +','; sql += ''+ commande_nbr_places_encadrant_prof +','; sql += ''+ commande_nbr_places_encadrant_parent +','; sql += ''+ req.session.cout_concertiste +','; sql += ''+ req.session.cout_spectateur +','; sql += ''+ parseInt(req.session.don) +','; if (req.session.montant_total > 0) { sql += '"attente",'; } else { sql += '"gratuit",'; } sql += ''+ req.session.montant_total; sql += ')'; logger.info("REQUETE SQL ca_ajout : " + sql , { numsession: req.session.id, label: filename}); const [results_insert_ca_adherent, fields_insert_ca_adherent] = await db_connection_promise.execute(sql); logger.info("ca_ajout Row ID added : " + results_insert_ca_adherent.insertId, { numsession: req.session.id, label: filename}); } ///////////////////////////////////////////////// // ENVOIE VERS STRIPE // SI MONTANT TOTAL > 0 ///////////////////////////////////////////////// if (req.session.montant_total > 0) { logger.info("======================================", { label: filename }); logger.info("======== ENVOIE VERS STRIPE ==========", { label: filename }); logger.info("======================================", { label: filename }); ///////////////////////////////////////////////// // STRIPE - ETAPE 1 - CREER l'INTENTION DE PAIEMENT logger.info("req.session.adherent_mail = " + req.session.adherent_mail , { numsession: req.session.id, label: filename}); const session_stripe = await stripe.checkout.sessions.create({ metadata: {identifiant: req.session.identifiant, ajoutbillet:req.session.deja_inscrit_concert}, customer_email: req.session.adherent_mail, submit_type: 'pay', success_url: process.env.STRIPE_CONCERT_SUCCESSURL, cancel_url: process.env.STRIPE_CONCERT_CANCELURL, payment_method_types: ['card'], line_items: [{ price_data: { currency: 'eur', product_data: { name: 'Billets Concert UNESCO', }, unit_amount: req.session.montant_commande * 100, }, quantity: 1, }, { price_data: { currency: 'eur', product_data: { name: 'Don', }, unit_amount: parseInt(req.session.don) * 100, }, quantity: 1, }], //Checkout has three modes: payment, subscription, or setup. mode: 'payment' }); logger.info("session_stripe.id : " + session_stripe.id , { numsession: req.session.id, label: filename}); ///////////////////////////////////////////////// // REDIRECTION VERS LA PAGE DE PAIEMENT STRIPE logger.info("Stripe session_stripe.url : " + session_stripe.url, { numsession: req.session.id, label: filename}); res.redirect(session_stripe.url); } else { // AJOUT DÉCOMPTE DES PLACES // !!! Au démarrage de la campagne les champs de la table doivent être à 0 (zéro) et non vide ou null table = "ca_decompte_place"; sql = 'UPDATE '; sql += table; sql += ' SET '; sql += 'date_maj = "' + now + '", '; sql += 'encadr_prof_commandes = encadr_prof_commandes + ' + commande_nbr_places_encadrant_prof + ', '; sql += 'encadr_parent_commandes = encadr_parent_commandes + ' + commande_nbr_places_encadrant_parent; logger.info("REQUETE SQL UPDATE ca_decompte_place : " + sql , { numsession: req.session.id, label: filename}); const [results, fields] = await db_connection_promise.execute(sql); logger.info("REQUETE SQL UPDATE ca_decompte_place TERMINÉE ", { numsession: req.session.id, label: filename}); ///////////////////////////////////////////////// // SI PAS DE PAIEMENT À FAIRE CAR MONTANT < 0 // ON CONTINUE ET ON ENVOIE LES BILLETS logger.info("Montant à payer inférieur à zéro, on ne passe pas par stripe", { numsession: req.session.id, label: filename}); ////////////////////////// // ENVOI MAIL À L'ADHÉRENT mail_objet = 'AFPS - CONCERT UNESCO 2024 - INSCRIPTION - ' + req.session.identifiant; mail_html = "
Cher(e) adhérent(e),
Félicitations ! Vous êtes inscrit au Concert national Unesco 2024 organisé par l'Association Française pour la Pédagogie Suzuki.";
mail_html += "
Vous allez recevoir vos billets par mail de la part de la plateforme de Billetterie WEEZEVENT.
RÉCAPITULATIF
'; mail_html += "Identifiant Suzuki : " + req.session.identifiant; if (req.session.hebergement_nb > 0) {mail_html += "
HÉBERGEMENT PROPOSÉ :
Ville : " + req.session.hebergement_ville + ", nombre de personnes : " + req.session.hebergement_nb > 0 + "
" + compteur_encadrants + " ENCADRANT(S) :
"; mail_html += "Les encadrants s'engagent à être présents les 2 journées du 20 et 21 avril 2024.
"; for (let toto = 1; toto < 5; toto++) { if (req.session["encadrant_"+toto+"_nom"]) { mail_html += "Nom : " + req.session["encadrant_"+toto+"_nom"] + " " + req.session["encadrant_"+toto+"_prenom"] + " - " + req.session["encadrant_"+toto+"_type"] + "
";
mail_html += "coordonnées : " + req.session["encadrant_"+toto+"_telephone_mobile"] + " - " + req.session["encadrant_"+toto+"_mail"] + "
";
if (req.session["encadrant_"+toto+"_prof_instrument"]) {mail_html += "instrument : " + req.session["encadrant_"+toto+"_prof_instrument"]};
mail_html += "
Association Française pour la pédagogie Suzuki
Marie Rossot - Pôle organisation du Concert national Unesco 2024