diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..7a73a41 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,2 @@ +{ +} \ No newline at end of file diff --git a/_gsdata_/2026-0619-164510-MacBook Pro de Julie-ADUZUKI PROD - VPS AFPS.log b/_gsdata_/2026-0619-164510-MacBook Pro de Julie-ADUZUKI PROD - VPS AFPS.log new file mode 100644 index 0000000..2c2a978 --- /dev/null +++ b/_gsdata_/2026-0619-164510-MacBook Pro de Julie-ADUZUKI PROD - VPS AFPS.log @@ -0,0 +1,9 @@ +2026-06-19 16:45:33: == Sync Started by User Command +2026-06-19 16:45:33: Start only 2 threads, limited by tasks to run +2026-06-19 16:45:33: ConnectCloned connected to file:///Users/juliechaumard/Documents/GitHub/Aduzuki_v2 +2026-06-19 16:45:33: ConnectCloned connected to file:///Users/juliechaumard/Documents/GitHub/Aduzuki_v2 +2026-06-19 16:45:33: GsConnectAndSetRoot1 connected to sftp://vps-923e4630.vps.ovh.net:49170/var/www/aduzuki +2026-06-19 16:45:33: GsConnectAndSetRoot1 connected to sftp://vps-923e4630.vps.ovh.net:49170/var/www/aduzuki +2026-06-19 16:45:34: Ecrasement '/Users/juliechaumard/Documents/GitHub/Aduzuki_v2/public/js/stagenat/stagenational_formulaire_personne.js' -> 'sftp://vps-923e4630.vps.ovh.net:49170/var/www/aduzuki/public/js/stagenat/stagenational_formulaire_personne.js' (45,973) +2026-06-19 16:45:35: Ecrasement '/Users/juliechaumard/Documents/GitHub/Aduzuki_v2/readme.md' -> 'sftp://vps-923e4630.vps.ovh.net:49170/var/www/aduzuki/readme.md' (8,417) +2026-06-19 16:45:38: == Sync Complete. Time: 00:00:06, Speed: 18,13 KB/s, Elements synchronisés : 2, Erreurs : 0 diff --git a/_gsdata_/_file_state_v4._gs b/_gsdata_/_file_state_v4._gs new file mode 100644 index 0000000..b71a471 Binary files /dev/null and b/_gsdata_/_file_state_v4._gs differ diff --git a/_gsdata_/_insync_v4.gsl b/_gsdata_/_insync_v4.gsl new file mode 100644 index 0000000..205cb0d --- /dev/null +++ b/_gsdata_/_insync_v4.gsl @@ -0,0 +1,2 @@ +By: S3 BACKUP PWA - Github_local_TO_S3_pariswebart-website_github.juliechaumard@MacBook Pro de Julie at: 2026.07.06 20:07:34 CEST +/Users/juliechaumard/Documents/GitHub/Aduzuki_v2 \ No newline at end of file diff --git a/adhesion_envoi_carte.md b/adhesion_envoi_carte.md new file mode 100644 index 0000000..2318617 --- /dev/null +++ b/adhesion_envoi_carte.md @@ -0,0 +1,19 @@ +# DOC ENVOI DES CARTES ADHERENT + +1. Récupération de l'identifiant AFPS passé dans l'URL (identifiant_afps) +2. Connexion à Adobe API pour pouvoir générer des PDF +3. Connexion à la DB Aduzuki + 1. Récupération des données nécessaires à la création du la carte adhérent, éventuellement au dispositif de don + adherent_nom + adherent_prenom + adherent_mail + adherent_type + adherent_paiement_montant_don + adherent_adresse_rue + adherent_adresse_codepostal + adherent_adresse_ville + adherent_paiement_mode + 2. Récupération des données nécessaires à l'envoi par mail + 3. Définition des profils à ajouter à la carte adhérent pour les rendre plus lisibles + + diff --git a/app.js b/app_aduzuki.js similarity index 77% rename from app.js rename to app_aduzuki.js index e02b860..b72553c 100644 --- a/app.js +++ b/app_aduzuki.js @@ -58,11 +58,14 @@ app.use(session(session_cookie)) // JSON //// Read datas on API //// needed by Express to read post from HTML Form +// not for STRIPE WEBHOOK +app.use('/wh_stripe', express.raw({ type: 'application/json' })); +// for the others app.use(express.json()); // BODY-PARSER -//// Pour la méthode post du formulaire -app.use(bodyparser.urlencoded({ extended: false})); +//// Pour récupérer les saisies des formulaires des pages via express (req.body) +app.use(bodyparser.urlencoded({ extended: true})); app.use(bodyparser.json()); @@ -92,27 +95,31 @@ app.set('views', './views') // avec le répertoire à partir duquel vous lancez votre processus node. // Si vous exécutez l’application express à partir d’un autre répertoire, // il est plus sûr d’utiliser le chemin d’accès absolu que vous voulez servir -// ex : http://localhost:8080/assets/images/kitten.jpg +// ex : DOMAIN/assets/images/kitten.jpg app.use('/public', express.static('public')); ///////////////////////////////////////////////// // ROUTES ///////////////////////////////////////////////// -// APPELER LE FICHIER ROUTE -// Exemple à modifier : const appRouter = require("./routes/appRouter"); const adhesionRouter = require("./routes/adhesionRouter"); const stagenatRouter = require("./routes/stagenatRouter"); const rassemblementRouter = require("./routes/rassemblementRouter"); +const rassemblementraRouter = require("./routes/rassemblementraRouter"); +const concertRouter = require("./routes/concertRouter"); +const donRouter = require("./routes/donRouter"); +const ventevideoRouter = require("./routes/ventevideoRouter"); +const wuzukiRouter = require("./routes/wuzukiRouter"); // Accueil du site // [DOMAIN]/ app.use("/", appRouter); + // Adhésion -// [DOMAIN]/inscription adhésion -app.use("/inscription", adhesionRouter); +// [DOMAIN]/adhésion +app.use("/adhesion", adhesionRouter); // STAGE NATIONAL // [DOMAIN]/stagenational @@ -120,4 +127,24 @@ app.use("/stagenational", stagenatRouter); // RASSEMBLEMENT IDF // [DOMAIN]/rassemblementidf -app.use("/rassemblementidf", rassemblementRouter); \ No newline at end of file +app.use("/rassemblementidf", rassemblementRouter); + +// RASSEMBLEMENT IDF +// [DOMAIN]/rassemblementidf +app.use("/rassemblementra", rassemblementraRouter); + +// CONCERT ANNUEL +// [DOMAIN]/concert +app.use("/concert", concertRouter); + +// DON +// [DOMAIN]/don +app.use("/don", donRouter); + +// VENTE VIDEO +// [DOMAIN]/boutique +app.use("/boutique", ventevideoRouter); + +// WUZUKI +// [DOMAIN]/wuzuki +app.use("/wuzuki", wuzukiRouter); \ No newline at end of file diff --git a/arborescence.txt b/arborescence.txt new file mode 100644 index 0000000..54d1222 --- /dev/null +++ b/arborescence.txt @@ -0,0 +1,580 @@ + +app_aduzuki.js +arborescence.txt +code_secret_client_222874178146-m2ul49riou277tjl431nbfdb8ibp2nl5.apps.googleusercontent.com.json +code_secret_client_738202486676-su2vn8602qqfehool3jqkjvdrdlrl1kd.apps.googleusercontent.com.json +controllers +documentation +generatedReceipt.pdf +inscriptionsafps-53b60452f63d.json +juju.pdf +logs +modules +node_modules +package-lock.json +package.json +pdf +pdfservices-api-credentials.json +public +readme.docx +readme.html +readme.md +receipt.json +receiptTemplate.docx +routes +sql.sql +src +testapi336520-3105cc3caa46.json +views +workspaces + +./controllers: +adhesionController_20241102.js +adhesionController_20241129.js +adhesionController.js +codesController.js +concert_annuel +donController.js +rassemblementController_OLD.js +rassemblementController.js +rassemblementraController.js +stage_national +test.js +vente_video +webhook_stripe_exemple.js +whstripeController.js +wuzukiController copie.js +wuzukiController.js + +./controllers/concert_annuel: +adminController.js +affiche_identiferController.js +ajout_concertController.js +ajout_familleController.js +ajout_payerController.js +identiferController.js +inscrip_spectateur_tousController.js +inscription_familleController.js +inscription_listeattenteController.js +inscription_spectateur_tous_recapController.js +inscription_spectateurController.js +maj_gs_concertController.js +payerController.js +retourStripeController.js +weez_concertController.js +weeztoken_concertController.js + +./controllers/stage_national: +stn_formulaireController.js +stn_identifierController.js +stn_payeracompteController.js +stn_retourstripeController.js + +./controllers/vente_video: +files +generate_linkController copie.js +generate_linkController.js +vente_videoController.js + +./controllers/vente_video/files: +film_suzuki_unesco_2024_test.mp4 +film_suzuki_unesco_2024.mp4 +yourfile.txt + + +./logs: +adhesion +concert +lienventetemp + +rassemblement +stagenat +whstripe +wuzuki + +./logs/adhesion: + +./logs/concert: + +./logs/lienventetemp: + +./logs/rassemblement: + +./logs/stagenat: + +./logs/whstripe: + +./logs/wuzuki: + +./modules: +adhesion +db +envoie_mail.js +pdf.js +sleep.js +stripe.js +verif_codesecret.js + +./modules/adhesion: +carte_adherent.js +majgs_webhook.js + +./modules/db: +checkAdherent.js +databaseconnect.js +sqlqueries.js + + +./pdf: +adhesion +concert_annuel +don +rassemblement +stage_national +template + +./pdf/adhesion: +2223 +2324 +2425 + +./pdf/adhesion/2223: +attente +don +payee + +./pdf/adhesion/2223/attente: + +./pdf/adhesion/2223/don: + +./pdf/adhesion/2223/payee: + +./pdf/adhesion/2324: +attente +don +paye + +./pdf/adhesion/2324/attente: + + +./pdf/adhesion/2324/don: + +./pdf/adhesion/2324/paye: + + +./pdf/adhesion/2425: +attente +paye + +./pdf/adhesion/2425/attente: + + +./pdf/adhesion/2425/paye: + + +./pdf/concert_annuel: +don + +./pdf/concert_annuel/don: +2324 + +./pdf/concert_annuel/don/2324: + +./pdf/don: + +output.pdf + +./pdf/rassemblement: +documents + +./pdf/rassemblement/documents: +rassemblementidf_plan_lieu.pdf +rassemblementidf_programme_2023.pdf +rassemblementidf_programme.pdf + +./pdf/stage_national: +documents + +./pdf/stage_national/documents: +stage_national_tarifs_2024.pdf +stage_national_tarifs_2025_old.pdf +stage_national_tarifs_2025.pdf + +./pdf/template: +carte_adherent_don.docx +carte_adherent_don.pages +carte_adherent_temp_20240902.docx +carte_adherent_temp.docx +carte_adherent_temp.pages +carte_adherent.docx +carte_adherent.html +carte_adherent.pages +carte_adherent1.docx +carte_adherentold.docx +don_justificatif.docx +don_justificatif.html +don_justificatif.pages +don_wp.html +receiptTemplate.docx + +./public: +css +fonts +images +js + +./public/css: +app.css +app.css.map + +./public/fonts: +cabin_bold.ttf +cabin_bolditalic.ttf +cabin_italic.ttf +cabin_medium.ttf +cabin_mediumitalic.ttf +cabin_regular.ttf +cabin_semibold.ttf +cabin_semibolditalic.ttf +montserrat_black.ttf +montserrat_blackitalic.ttf +montserrat_bold.ttf +montserrat_bolditalic.ttf +montserrat_extrabold.ttf +montserrat_extrabolditalic.ttf +montserrat_extralight.ttf +montserrat_extralightitalic.ttf +montserrat_italic.ttf +montserrat_light.ttf +montserrat_lightitalic.ttf +montserrat_medium.ttf +montserrat_mediumitalic.ttf +montserrat_regular.ttf +montserrat_semibold.ttf +montserrat_semibolditalic.ttf +montserrat_thin.ttf +montserrat_thinitalic.ttf +playfairdisplay_black.ttf +playfairdisplay_blackitalic.ttf +playfairdisplay_bold.ttf +playfairdisplay_bolditalic.ttf +playfairdisplay_italic.ttf +playfairdisplay_regular.ttf +sourceserifpro_black.ttf +sourceserifpro_blackitalic.ttf +sourceserifpro_bold.ttf +sourceserifpro_bolditalic.ttf +sourceserifpro_extralight.ttf +sourceserifpro_extralightitalic.ttf +sourceserifpro_italic.ttf +sourceserifpro_light.ttf +sourceserifpro_lightitalic.ttf +sourceserifpro_regular.ttf +sourceserifpro_semibold.ttf +sourceserifpro_semibolditalic.ttf +ubuntu_bold.ttf +ubuntu_courant.ttf +ubuntu_fin.ttf +ubuntu_leger_italic.ttf +ubuntu_leger.ttf +ubuntu_moyen.ttf +ubuntu-moyen_italique.ttf + +./public/images: +icones +logos +rassemblementidf_2023_programme.pdf +rassemblementidf_plan_lieu.pdf +ventevideo + +./public/images/icones: +encadrant.webp +favicon.ico +icone_accompagnant.png +icone_bus.png +icone_close.png +icone_compte.png +icone_house.png +icone_infos.png +icone_personne.png +musican.webp +pause.webp +spectator.webp + +./public/images/logos: +logosuzukigris.png + +./public/images/ventevideo: +concert_unesco_illustration.jpeg +concert_unesco_illustration1.jpeg + +./public/js: +adhesion +app +concert +localstore.js +rassemblementidf +rassemblementra +stagenat + +./public/js/adhesion: +accueil_modal.js +adhesion_prof copie.js +adhesion_prof.js +eleve.js +form_paiement.js +hidden_visible.js +professeurs.js + +./public/js/app: +logger_adhesion.js +logger_concert.js +logger_lienventetemp.js +logger_rassemblement.js +logger_stagenat.js +logger_whstripe.js +logger_wuzuki.js +logger.js + +./public/js/concert: +concert_formulaire_famille.js + +./public/js/rassemblementidf: +rassemblementidf_formulaire_personne_20250127.js +rassemblementidf_formulaire_personne.js + +./public/js/rassemblementra: +rassemblementra_formulaire_personne.js + +./public/js/stagenat: +stagenational_formulaire_personne.js + +./routes: +adhesionRouter.js +appRouter.js +concertRouter_prod.js +concertRouter_surlafin.js +concertRouter.js +donRouter.js +rassemblementraRouter.js +rassemblementRouter.js +stagenatRouter.js +ventevideoRouter copie 2.js +ventevideoRouter copie.js +ventevideoRouter.js +wuzukiRouter.js + +./src: +scss + +./src/scss: +app.scss +base +components +global +templates + +./src/scss/base: +_colors.scss +_fontawesome.scss +_fonts.scss +_grille.scss +_reset.scss +_space.scss + +./src/scss/components: +_check_mail.scss +_fin_inscription.scss +_footer.scss +_header_inscription.scss +_header_tunnel.scss +_inputs.scss +_savoirplus.scss +_titres.scss +_weasyprint.scss + +./src/scss/global: +_main.scss +_mediaqueries.scss + +./src/scss/templates: +_adhesion_end.scss +_adhesion_mail.scss +_adhesion.scss +_admin.scss +_concert_annuel.scss +_don_form.scss +_maj_manuelle.scss +_paiement.scss +_stageformulaire.scss +_ventevideo copie.scss +_ventevideo.scss + +./views: +adhesion +app +concert +don +rassemblementidf +rassemblementra +stagenat +template_parts +ventevideo +wuzuki + +./views/adhesion: +page_templates +template_parts + +./views/adhesion/page_templates: +adhesion_cartes_manuelles.ejs +adhesion_paiement_annule.ejs +adhesion_paiement_attente.ejs +adhesion_paiement_mode_paiement.ejs +adhesion_paiement_reussi.ejs +adhesion_paiement_total.ejs +formulaire_adhesion_choix.ejs +formulaire_adhesion_famille.ejs +formulaire_adhesion_mail.ejs +formulaire_adhesion_observateur.ejs +formulaire_adhesion_prof.ejs +formulaire_cartemanuelle_mail.ejs +inscription_terminee.ejs +maj_googlesheet_20241026.ejs +maj_googlesheet.ejs + +./views/adhesion/template_parts: +adhesion_titrepage.ejs +eleves_famille.ejs +eleves_famille.ejs copie +eleves.ejs +prof_diplome.ejs +prof_formation.ejs +prof_infosgenerale.ejs + +./views/app: +page_templates +template_parts + +./views/app/page_templates: +inscription_accueil.ejs + +./views/app/template_parts: +header_inscription.ejs + +./views/concert: +page_templates +template_parts + +./views/concert/page_templates: +achat_spectateur_20240406.ejs +achat_spectateur_tous.ejs +achat_spectateur.ejs +admin.ejs +ajout_billet.ejs +ajout_formulaire_famille.ejs +erreur.ejs +inscrip_formulaire_famille.ejs +inscrip_formulaire_identifier.ejs +inscrip_liste_attente.ejs +inscrip_paiement.ejs +inscrip_recap_famille_sanspaiement.ejs +inscrip_recap_famille.ejs +inscrip_termine.ejs +paiement_annule.ejs +paiement_reussi.ejs + +./views/concert/template_parts: +concert_titrepage.ejs + +./views/don: +page_templates +template_parts + +./views/don/page_templates: +don_paiement_annule.ejs +don_paiement_reussi.ejs +formulaire_don.ejs + +./views/don/template_parts: +don_titrepage.ejs + +./views/rassemblementidf: +page_templates +template_parts + +./views/rassemblementidf/page_templates: +fermeture.ejs +inscrip_formulaire_identifier.ejs +inscrip_formulaire.ejs +paiement_annule.ejs +paiement_reussi.ejs +panne.ejs +recap.ejs + +./views/rassemblementidf/template_parts: +rassemblementidf_titrepage.ejs + +./views/rassemblementra: +page_templates +template_parts + +./views/rassemblementra/page_templates: +fermeture.ejs +inscrip_formulaire_identifier.ejs +inscrip_formulaire.ejs +paiement_annule.ejs +paiement_reussi.ejs +panne.ejs +recap.ejs + +./views/rassemblementra/template_parts: +rassemblementidf_titrepage.ejs + +./views/stagenat: +page_templates +template_parts + +./views/stagenat/page_templates: +inscrip_formulaire_identifier.ejs +inscrip_formulaire.ejs +inscription_reussi.ejs +paiement_annule.ejs +paiement_reussi.ejs +recap.ejs +recapssacompte.ejs + +./views/stagenat/template_parts: +check_identifiant.ejs +stagenational_titrepage.ejs + +./views/template_parts: +footer.ejs +head.ejs +header_tunnel.ejs + +./views/ventevideo: +page_templates +template_parts + +./views/ventevideo/page_templates: +ventelien_boutonacheter.ejs +ventelien_paiement_echec.ejs +ventelien_paiement_reussi.ejs +ventelien_telechargement_encours.ejs + +./views/ventevideo/template_parts: +ventevideo_titrepage.ejs + +./views/wuzuki: +page_templates +template_parts + +./views/wuzuki/page_templates: +formulaire_envoie_message.ejs + +./views/wuzuki/template_parts: +envoie_message_titrepage.ejs + +./workspaces: +rassemblement_ra.code-workspace diff --git a/combined.log.2023-02-26 b/combined.log.2023-02-26 deleted file mode 100644 index b10a894..0000000 --- a/combined.log.2023-02-26 +++ /dev/null @@ -1,18 +0,0 @@ -2023-02-26 18:25:06 info [undefined] SID[undefined] bonjour Julie -2023-02-26 18:25:06 info [undefined] SID[undefined] process.env.PORT : 8888 -2023-02-26 18:25:06 info [undefined] SID[undefined] process.env.ENV : production -2023-02-26 18:25:06 info [undefined] SID[undefined] express-session secured -2023-02-26 18:25:06 info [undefined] SID[undefined] NOUS SOMMES DANS LE FICHIER : /home/jivciei/adusuki/routes/appRouter.js -2023-02-26 18:25:06 info [undefined] SID[undefined] NOUS SOMMES DANS LE FICHIER : /home/jivciei/adusuki/routes/adhesionRouter.js -2023-02-26 18:25:06 info [undefined] SID[undefined] NOUS SOMMES DANS LE FICHIER : /home/jivciei/adusuki/controllers/adhesionController.js -2023-02-26 18:25:06 info [undefined] SID[undefined] NOUS SOMMES DANS LE FICHIER : /home/jivciei/adusuki/routes/stagenatRouter.js -2023-02-26 18:25:06 info [undefined] SID[undefined] NOUS SOMMES DANS LE FICHIER : /home/jivciei/adusuki/controllers/stagenatController.js -2023-02-26 18:36:27 info [undefined] SID[undefined] bonjour Julie -2023-02-26 18:36:27 info [undefined] SID[undefined] process.env.PORT : 8888 -2023-02-26 18:36:27 info [undefined] SID[undefined] process.env.ENV : production -2023-02-26 18:36:27 info [undefined] SID[undefined] express-session secured -2023-02-26 18:36:27 info [undefined] SID[undefined] NOUS SOMMES DANS LE FICHIER : /home/jivciei/adusuki/routes/appRouter.js -2023-02-26 18:36:27 info [undefined] SID[undefined] NOUS SOMMES DANS LE FICHIER : /home/jivciei/adusuki/routes/adhesionRouter.js -2023-02-26 18:36:27 info [undefined] SID[undefined] NOUS SOMMES DANS LE FICHIER : /home/jivciei/adusuki/controllers/adhesionController.js -2023-02-26 18:36:28 info [undefined] SID[undefined] NOUS SOMMES DANS LE FICHIER : /home/jivciei/adusuki/routes/stagenatRouter.js -2023-02-26 18:36:28 info [undefined] SID[undefined] NOUS SOMMES DANS LE FICHIER : /home/jivciei/adusuki/controllers/stagenatController.js diff --git a/controllers/adhesionController.js b/controllers/adhesionController.js index 58af46c..76c7254 100644 --- a/controllers/adhesionController.js +++ b/controllers/adhesionController.js @@ -1,647 +1,326 @@ ///////////////////////////////////////////////// // LOGGING ///////////////////////////////////////////////// -const logger = require("../public/js/app/logger"); -logger.info("NOUS SOMMES DANS LE FICHIER : " + __filename); - +const logger = require("../public/js/app/logger_adhesion"); ///////////////////////////////////////////////// // APPELS DES MODULES ///////////////////////////////////////////////// const moment = require('moment'); const ejs = require('ejs'); -var nodemailer = require('nodemailer'); +const nodemailer = require('nodemailer'); const path = require("path"); const stripe = require('stripe')(process.env.STRIPE_PRIVATE_KEY); -var pdf = require("pdf-creator-node"); -var fs = require("fs"); +const pdf = require("pdf-creator-node"); +const fs = require("fs"); +const mysql = require('mysql2'); +const mysql_promise = require('mysql2/promise'); +// ADOBE PDF +const PDFServicesSdk = require('@adobe/pdfservices-node-sdk'); + + +///////////////////////////////////////////////// +// APPELS DES FONCTIONS +///////////////////////////////////////////////// // Déterminer les profils de l'adhésion const carte_adherent = require("./../modules/adhesion/carte_adherent"); +// FAIRE UNE PAUSE +const sleep = require("./../modules/sleep"); +//////////////////////////////////////////////////// +// FILE NAME +//////////////////////////////////////////////////// +const filename = path.parse(__filename).base; ///////////////////////////////////////////////// // GOOGLE SHEET PARAMETERS ///////////////////////////////////////////////// const { GoogleSpreadsheet } = require('google-spreadsheet'); -const creds = require('../testapi336520-3105cc3caa46.json'); +const GS_creds = require('../inscriptionsafps-53b60452f63d.json'); +const { error } = require("console"); // Initialize the sheet - doc ID is the long id in the sheets URL -// google sheet TestAPISheets -// google sheet aduzuki_DB -const doc = new GoogleSpreadsheet('1BhpYj-KtsyC8inXIDVl-zldDYRuhEqPwBFvP45FtJkI'); +const GS_adhesion = new GoogleSpreadsheet(process.env.gsheet_adhesion); ///////////////////////////////////////////////// // VARIABLES GLOBALES ///////////////////////////////////////////////// -let adherent_type,profil1, profil2, profil3; +let adherent_type, profil1, profil2, profil3; ///////////////////////////////////////////////// // SAISIE DU MAIL -// VÉRIFIER SI DÉJÀ INSCRIT DANS GOOGLE SHEET -// (TABLEAU adhesion_annuelle_web ET adhesion_ass_locales) +// VÉRIFIER SI DÉJÀ INSCRIT DANS DB ///////////////////////////////////////////////// const checkMail = async function(req, res){ + + logger.info("======================================"); + logger.info("======== FUNCTION checkMail (adhesion) =========="); + logger.info("======================================"); + logger.info("req.body.identifiant = " + req.body.identifiant, { numsession: req.session.id }); + logger.info("req.session.id = " + req.session.id, { numsession: req.session.id }); + + //////////////////////////////////////////////////// + // CONNECTION DB PROMISE + //////////////////////////////////////////////////// - logger.info("======================================"); - logger.info("======== FUNCTION checkMail =========="); - logger.info("======================================"); - logger.info("req.body.identifiant = " + req.body.identifiant, { numsession: req.session.id }); - logger.info("req.session.id = " + req.session.id, { numsession: req.session.id }); + // on doit faire le "await mysql_promise.createConnection" ici car c'est un promise et seul le résultat du promise amène la connection + // on est donc obligé de le faire au moment où l'on a besoin de la connection et avec un await. + // on essaie de se connecter à la BD (try) - await doc.useServiceAccountAuth(creds); - await doc.loadInfo(); // loads document properties and worksheets - logger.info("NOM FICHIER SHEET: " + doc.title, { numsession: req.session.id }); - - //const sheet = doc.sheetsByIndex[1]; // or use doc.sheetsById[id] or doc.sheetsByTitle[title] - //var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("feuilleTOTO"); - // const sheet = doc.sheetsByTitle['feuilleTOTO']; // or use doc.sheetsById[id] or doc.sheetsByTitle[title] - const sheet = doc.sheetsByTitle['adhesion_annuelle_web']; - const sheet_asslocales = doc.sheetsByTitle['adhesion_ass_locales']; - logger.info("NOM DU TABLEAU (ONGLET): " + sheet.title, { numsession: req.session.id }); - logger.info("NOMBRE DE LIGNE DU TABLEAU: " + sheet.rowCount, { numsession: req.session.id }); - logger.info("NOM DU TABLEAU (ONGLET) ASS LOCALES: " + sheet_asslocales.title, { numsession: req.session.id }); - logger.info("NOMBRE DE LIGNE DU TABLEAU ASS LOCALES: " + sheet_asslocales.rowCount, { numsession: req.session.id }); - + try { + const db_connection_promise = await mysql_promise.createConnection({ + host: process.env.db_connection_host, + port: process.env.db_connection_port, + user: process.env.db_connection_user, + password: process.env.db_connection_password, + database: process.env.db_connection_database + }); + logger.info("======================================", { label: filename }); + logger.info("Connected TO DATABASE test with mysql2 PREMISE !", { label: filename }); + logger.info("======================================", { label: filename }); + + + // Vérification dans la base de données si l'identifiant ne serait pas déjà inscrit + + // ON RÉCUPÈRE LE MAIL (IDENTIFIANT) SAISIE DANS LE FORMULAIRE + req.session.identifiant = req.body.identifiant; - const rows = await sheet.getRows(); - logger.info("rows[0].identifiant: " + rows[0].identifiant, { numsession: req.session.id }); - logger.info("nombre de row : " + sheet.rowCount, { numsession: req.session.id }); - const rows_asslocales = await sheet_asslocales.getRows(); - logger.info("rows[0].identifiant: " + rows_asslocales[0].identifiant, { numsession: req.session.id }); + // Query table adherent + let sql = 'SELECT identifiant FROM adherent WHERE identifiant = "' + req.session.identifiant + '" AND saison = "2025/2026"'; + logger.info("SQL = " + sql, { numsession: req.session.id }); - // mettre les mails dans un array - let lesmails = new Array; - let compteur = sheet.rowCount - 1; - let compteur_asslocales = sheet_asslocales.rowCount - 1; - logger.info("compteur: " + compteur, { numsession: req.session.id }); - - // METTRE LES MAILS DU TABLEAU adhesion_annuelle_web - for (let i=0; i 1) && req.body.adherent_prof_stagiaire_instrument1_prof[2]){ - logger.info("req.body.adherent_prof_stagiaire_instrument1_prof[0].length > 1", { numsession: req.session.id }); - req.session.adherent_prof_stagiaire_instrument1_prof = req.body.adherent_prof_stagiaire_instrument1_prof[0]+", "+req.body.adherent_prof_stagiaire_instrument1_prof[1]+", "+req.body.adherent_prof_stagiaire_instrument1_prof[2]} - else if (req.body.adherent_prof_stagiaire_instrument1_prof && (req.body.adherent_prof_stagiaire_instrument1_prof[0].length > 1) && req.body.adherent_prof_stagiaire_instrument1_prof[1]){ - logger.info("req.body.adherent_prof_stagiaire_instrument1_prof[0].length > 1 ELSE", { numsession: req.session.id }); - req.session.adherent_prof_stagiaire_instrument1_prof = req.body.adherent_prof_stagiaire_instrument1_prof[0]+", "+req.body.adherent_prof_stagiaire_instrument1_prof[1] - }; - if (!req.body.adherent_prof_stagiaire_instrument1_prof){ - req.session.adherent_prof_stagiaire_instrument1_prof = "" - }; - req.session.adherent_prof_stagiaire_instrument2 = req.body.adherent_prof_stagiaire_instrument2; - req.session.adherent_prof_stagiaire_instrument2_esa = req.body.adherent_prof_stagiaire_instrument2_esa; - // Si un seul nom est sélectionné alors l'input ne sera pas sous fome de Array et le [0] sera le premier caractère du nom du professeur sélectionné - if (req.body.adherent_prof_stagiaire_instrument2_prof && (req.body.adherent_prof_stagiaire_instrument2_prof[0].length = 1)){ - req.session.adherent_prof_stagiaire_instrument2_prof = req.body.adherent_prof_stagiaire_instrument2_prof - }; - if (req.body.adherent_prof_stagiaire_instrument2_prof && (req.body.adherent_prof_stagiaire_instrument2_prof[0].length > 1) && req.body.adherent_prof_stagiaire_instrument2_prof[2]){ - logger.info("req.body.adherent_prof_stagiaire_instrument2_prof[0].length > 1", { numsession: req.session.id }); - req.session.adherent_prof_stagiaire_instrument2_prof = req.body.adherent_prof_stagiaire_instrument2_prof[0]+", "+req.body.adherent_prof_stagiaire_instrument2_prof[1]+", "+req.body.adherent_prof_stagiaire_instrument2_prof[2]} - else if (req.body.adherent_prof_stagiaire_instrument2_prof && (req.body.adherent_prof_stagiaire_instrument2_prof[0].length > 1) && req.body.adherent_prof_stagiaire_instrument2_prof[1]){ - logger.info("req.body.adherent_prof_stagiaire_instrument2_prof[0].length > 1 ELSE", { numsession: req.session.id }); - req.session.adherent_prof_stagiaire_instrument2_prof = req.body.adherent_prof_stagiaire_instrument2_prof[0]+", "+req.body.adherent_prof_stagiaire_instrument2_prof[1] - }; - if (!req.body.adherent_prof_stagiaire_instrument2_prof){ - req.session.adherent_prof_stagiaire_instrument2_prof = "" - }; - req.session.adherent_eleve1_nom = req.body.adherent_eleve1_nom; - req.session.adherent_eleve1_prenom = req.body.adherent_eleve1_prenom; - if (req.body.adherent_eleve1_datenaissance){req.session.adherent_eleve1_datenaissance = moment(req.body.adherent_eleve1_datenaissance).format('L')}; - req.session.adherent_eleve1_contactsup_nom = req.body.adherent_eleve1_contactsup_nom; - req.session.adherent_eleve1_contactsup_prenom = req.body.adherent_eleve1_contactsup_prenom; - req.session.adherent_eleve1_contactsup_mail = req.body.adherent_eleve1_contactsup_mail; - req.session.adherent_eleve1_InstrumentA = req.body.adherent_eleve1_InstrumentA; - req.session.adherent_eleve1_InstrumentA_prof = req.body.adherent_eleve1_InstrumentA_prof; - req.session.adherent_eleve1_InstrumentA_cahier = req.body.adherent_eleve1_InstrumentA_cahier; - req.session.adherent_eleve1_InstrumentB = req.body.adherent_eleve1_InstrumentB; - req.session.adherent_eleve1_InstrumentB_prof = req.body.adherent_eleve1_InstrumentB_prof; - req.session.adherent_eleve1_InstrumentB_cahier = req.body.adherent_eleve1_InstrumentB_cahier; - req.session.adherent_eleve1_droitimage = req.body.adherent_eleve1_droitimage; - req.session.adherent_eleve2_nom = req.body.adherent_eleve2_nom; - req.session.adherent_eleve2_prenom = req.body.adherent_eleve2_prenom; - if (req.body.adherent_eleve2_datenaissance){req.session.adherent_eleve2_datenaissance = moment(req.body.adherent_eleve2_datenaissance).format('L')}; - req.session.adherent_eleve2_contactsup_nom = req.body.adherent_eleve2_contactsup_nom; - req.session.adherent_eleve2_contactsup_prenom = req.body.adherent_eleve2_contactsup_prenom; - req.session.adherent_eleve2_contactsup_mail = req.body.adherent_eleve2_contactsup_mail; - req.session.adherent_eleve2_InstrumentA = req.body.adherent_eleve2_InstrumentA; - req.session.adherent_eleve2_InstrumentA_prof = req.body.adherent_eleve2_InstrumentA_prof; - req.session.adherent_eleve2_InstrumentA_cahier = req.body.adherent_eleve2_InstrumentA_cahier; - req.session.adherent_eleve2_InstrumentB = req.body.adherent_eleve2_InstrumentB; - req.session.adherent_eleve2_InstrumentB_prof = req.body.adherent_eleve2_InstrumentB_prof; - req.session.adherent_eleve2_InstrumentB_cahier = req.body.adherent_eleve2_InstrumentB_cahier; - req.session.adherent_eleve2_droitimage = req.body.adherent_eleve2_droitimage; - req.session.adherent_eleve3_nom = req.body.adherent_eleve3_nom; - req.session.adherent_eleve3_prenom = req.body.adherent_eleve3_prenom; - if (req.body.adherent_eleve3_datenaissance){req.session.adherent_eleve3_datenaissance = moment(req.body.adherent_eleve3_datenaissance).format('L')}; - req.session.adherent_eleve3_contactsup_nom = req.body.adherent_eleve3_contactsup_nom; - req.session.adherent_eleve3_contactsup_prenom = req.body.adherent_eleve3_contactsup_prenom; - req.session.adherent_eleve3_contactsup_mail = req.body.adherent_eleve3_contactsup_mail; - req.session.adherent_eleve3_InstrumentA = req.body.adherent_eleve3_InstrumentA; - req.session.adherent_eleve3_InstrumentA_prof = req.body.adherent_eleve3_InstrumentA_prof; - req.session.adherent_eleve3_InstrumentA_cahier = req.body.adherent_eleve3_InstrumentA_cahier; - req.session.adherent_eleve3_InstrumentB = req.body.adherent_eleve3_InstrumentB; - req.session.adherent_eleve3_InstrumentB_prof = req.body.adherent_eleve3_InstrumentB_prof; - req.session.adherent_eleve3_InstrumentB_cahier = req.body.adherent_eleve3_InstrumentB_cahier; - req.session.adherent_eleve3_droitimage = req.body.adherent_eleve3_droitimage; - req.session.adherent_eleve4_nom = req.body.adherent_eleve4_nom; - req.session.adherent_eleve4_prenom = req.body.adherent_eleve4_prenom; - if (req.body.adherent_eleve4_datenaissance){req.session.adherent_eleve4_datenaissance = moment(req.body.adherent_eleve4_datenaissance).format('L')}; - req.session.adherent_eleve4_contactsup_nom = req.body.adherent_eleve4_contactsup_nom; - req.session.adherent_eleve4_contactsup_prenom = req.body.adherent_eleve4_contactsup_prenom; - req.session.adherent_eleve4_contactsup_mail = req.body.adherent_eleve4_contactsup_mail; - req.session.adherent_eleve4_InstrumentA = req.body.adherent_eleve4_InstrumentA; - req.session.adherent_eleve4_InstrumentA_prof = req.body.adherent_eleve4_InstrumentA_prof; - req.session.adherent_eleve4_InstrumentA_cahier = req.body.adherent_eleve4_InstrumentA_cahier; - req.session.adherent_eleve4_InstrumentB = req.body.adherent_eleve4_InstrumentB; - req.session.adherent_eleve4_InstrumentB_prof = req.body.adherent_eleve4_InstrumentB_prof; - req.session.adherent_eleve4_InstrumentB_cahier = req.body.adherent_eleve4_InstrumentB_cahier; - req.session.adherent_eleve4_droitimage = req.body.adherent_eleve4_droitimage; - req.session.adherent_eleve5_nom = req.body.adherent_eleve5_nom; - req.session.adherent_eleve5_prenom = req.body.adherent_eleve5_prenom; - if (req.body.adherent_eleve5_datenaissance){req.session.adherent_eleve5_datenaissance = moment(req.body.adherent_eleve5_datenaissance).format('L')}; - req.session.adherent_eleve5_contactsup_nom = req.body.adherent_eleve5_contactsup_nom; - req.session.adherent_eleve5_contactsup_prenom = req.body.adherent_eleve5_contactsup_prenom; - req.session.adherent_eleve5_contactsup_mail = req.body.adherent_eleve5_contactsup_mail; - req.session.adherent_eleve5_InstrumentA = req.body.adherent_eleve5_InstrumentA; - req.session.adherent_eleve5_InstrumentA_prof = req.body.adherent_eleve5_InstrumentA_prof; - req.session.adherent_eleve5_InstrumentA_cahier = req.body.adherent_eleve5_InstrumentA_cahier; - req.session.adherent_eleve5_InstrumentB = req.body.adherent_eleve5_InstrumentB; - req.session.adherent_eleve5_InstrumentB_prof = req.body.adherent_eleve5_InstrumentB_prof; - req.session.adherent_eleve5_InstrumentB_cahier = req.body.adherent_eleve5_InstrumentB_cahier; - req.session.adherent_eleve5_droitimage = req.body.adherent_eleve5_droitimage; + if (req.body["eleve_"+i+"_datenaissance"]) {req.session["eleve_"+i+"_datenaissance"] = moment(req.body["eleve_"+i+"_datenaissance"]).format('L')}; + req.session["eleve_"+i+"_instrumentA"] = req.body["eleve_"+i+"_instrumentA"]; + req.session["eleve_"+i+"_instrumentA_cahier"] = req.body["eleve_"+i+"_instrumentA_cahier"]; + req.session["eleve_"+i+"_instrumentA_prof"] = req.body["eleve_"+i+"_instrumentA_prof"]; + req.session["eleve_"+i+"_instrumentB"] = req.body["eleve_"+i+"_instrumentB"]; + req.session["eleve_"+i+"_instrumentB_cahier"] = req.body["eleve_"+i+"_instrumentB_cahier"]; + req.session["eleve_"+i+"_instrumentB_prof"] = req.body["eleve_"+i+"_instrumentB_prof"]; + req.session["eleve_"+i+"_droitimage"] = req.body["eleve_"+i+"_droitimage"]; + req.session["eleve_"+i+"_contactsup_nom"] = req.body["eleve_"+i+"_contactsup_nom"]; + req.session["eleve_"+i+"_contactsup_prenom"] = req.body["eleve_"+i+"_contactsup_prenom"]; + req.session["eleve_"+i+"_contactsup_mail"] = req.body["eleve_"+i+"_contactsup_mail"]; + } + - logger.info("req.body.adherent_nom: " + req.body.adherent_nom, { numsession: req.session.id }); - logger.info("req.session.identifiant: " + req.session.identifiant, { numsession: req.session.id }); - logger.info("req.session.adherent_nom: " + req.session.adherent_nom, { numsession: req.session.id }); + ///////////////////////////////////////////////// + // DÉTERMINER LE TYPE D'ADHÉRENT + logger.info("// DÉTERMINER LE TYPE D'ADHÉRENT"); + logger.info("req.session.adherent_type = " + req.session.adherent_type, { numsession: req.session.id }); - - - // DÉTERMINER LE TYPE D'ADHÉRENT - logger.info("// DÉTERMINER LE TYPE D'ADHÉRENT"); - logger.info("req.session.adherent_prof_stagiaire_instrument1_esa: " + req.session.adherent_prof_stagiaire_instrument1_esa, { numsession: req.session.id }); - - logger.info("req.session.adherent_type = " + req.session.adherent_type, { numsession: req.session.id }); - - if (req.session.adherent_type === "famille") { - adherent_type = "famille"; - } else if (req.session.adherent_type === "observateur") { - adherent_type = "observateur"; - logger.info("adherent_type in if observateur = " + adherent_type, { numsession: req.session.id }); - } else { - if (req.session.adherent_prof_instrument1 && !req.session.adherent_prof_stagiaire_instrument1 && !req.session.adherent_eleve1_nom) { - adherent_type = "professeur"; - } - - if (req.session.adherent_prof_instrument1 && !req.session.adherent_prof_stagiaire_instrument1 && req.session.adherent_eleve1_nom) { - adherent_type = "prof_famille"; - } - - if (req.session.adherent_prof_stagiaire_instrument1 && req.session.adherent_prof_stagiaire_instrument1 && !req.session.adherent_eleve1_nom) { - adherent_type = "prof_stagiaire"; - } - - if (req.session.adherent_prof_stagiaire_instrument1 && req.session.adherent_prof_stagiaire_instrument1 && req.session.adherent_eleve1_nom) { - adherent_type = "prof_stagiaire_famille"; - } - - if (!req.session.adherent_prof_instrument1 && !req.session.adherent_prof_instrument1 && req.session.adherent_prof_stagiaire_instrument1_esa == 'Niveau 1' && !req.session.adherent_prof_stagiaire_instrument2 && !req.session.adherent_eleve1_nom) { - adherent_type = "prof_stagiaire1"; - } - - if (!req.session.adherent_prof_instrument1 && !req.session.adherent_prof_instrument1 && req.session.adherent_prof_stagiaire_instrument1_esa == 'Niveau 1' && !req.session.adherent_prof_stagiaire_instrument2 && req.session.adherent_eleve1_nom) { - adherent_type = "prof_stagiaire1_famille"; - } + // req.session.adherent_type est inscrit dans adhesionRouter.js + if (req.session.adherent_type === "famille") { + adherent_type = "famille"; + } else if (req.session.adherent_type === "observateur") { + adherent_type = "observateur"; + logger.info("adherent_type in if observateur = " + adherent_type, { numsession: req.session.id }); + } else { + // req.session.adherent_type n'est pas inscrit dans adhesionRouter.js + if (req.session.adherent_prof_instrument1 && !req.session.adherent_prof_stagiaire_instrument1 && !req.session.eleve_1_nom) { + adherent_type = "professeur"; } - - - if (!adherent_type) { - adherent_type = "non déterminé"; + if (req.session.adherent_prof_instrument1 && !req.session.adherent_prof_stagiaire_instrument1 && req.session.eleve_1_nom) { + adherent_type = "prof_famille"; } - req.session.adherent_type = adherent_type; - logger.info("adherent_type : " + adherent_type, { numsession: req.session.id }); - // DATE DE L'ADHÉSION - moment().format(); - moment.locale('fr'); - var date_formattee = moment().format('L'); - logger.info("date_formattee : " + date_formattee, { numsession: req.session.id }); + if (req.session.adherent_prof_stagiaire_instrument1 && req.session.adherent_prof_stagiaire_instrument1 && !req.session.eleve_1_nom) { + adherent_type = "prof_stagiaire"; + } - - // CALCUL DU PRIX - - if (adherent_type == "professeur" || adherent_type == "prof_famille" || adherent_type == "prof_stagiaire" || adherent_type == "prof_stagiaire_famille") { - adherent_paiement_montant_adhesion = 42; - }; - if (adherent_type == "prof_stagiaire1" || adherent_type == "prof_stagiaire1_famille") { - adherent_paiement_montant_adhesion = 22; - }; - if (adherent_type == "famille") { - adherent_paiement_montant_adhesion = 22; - }; - if (adherent_type == "observateur") { + if (req.session.adherent_prof_stagiaire_instrument1 && req.session.adherent_prof_stagiaire_instrument1 && req.session.eleve_1_nom) { + adherent_type = "prof_stagiaire_famille"; + } + + if (!req.session.adherent_prof_instrument1 && req.session.adherent_prof_stagiaire_instrument1_esa == 'Niveau 1' && !req.session.adherent_prof_stagiaire_instrument2 && !req.session.eleve_1_nom) { + adherent_type = "prof_stagiaire1"; + } + + if (!req.session.adherent_prof_instrument1 && req.session.adherent_prof_stagiaire_instrument1_esa == 'Niveau 1' && !req.session.adherent_prof_stagiaire_instrument2 && req.session.eleve_1_nom) { + adherent_type = "prof_stagiaire1_famille"; + } + } + // req.session.adherent_type n'a pas pu être déterminé + if (!adherent_type) { + adherent_type = "non déterminé"; + } + req.session.adherent_type = adherent_type; + logger.info("adherent_type : " + adherent_type, { numsession: req.session.id }); + + ///////////////////////////////////////////////// + // DATE DE L'ADHÉSION + let now = moment().format("YYYY-MM-DD HH:mm:ss"); + + ///////////////////////////////////////////////// + // CALCUL DU PRIX + + if (adherent_type == "professeur" || adherent_type == "prof_famille" || adherent_type == "prof_stagiaire" || adherent_type == "prof_stagiaire_famille") { + adherent_paiement_montant_adhesion = 42; + }; + if (adherent_type == "prof_stagiaire1" || adherent_type == "prof_stagiaire1_famille") { adherent_paiement_montant_adhesion = 22; }; - if (adherent_type == "non déterminé" || adherent_type == "") { - adherent_paiement_montant_adhesion = 0; - }; - logger.info("CALCUL DU PRIX : " + adherent_paiement_montant_adhesion, { numsession: req.session.id }); - //passer la variable dans la session pour la récupérer - req.session.adherent_paiement_montant_adhesion = adherent_paiement_montant_adhesion; - - - ///////////////////////////////////////////////// - // AJOUT DE l'ADHÉRENT - // DANS LA GOOGLE SHEET - ///////////////////////////////////////////////// - - await doc.useServiceAccountAuth(creds); - await doc.loadInfo(); // loads document properties and worksheets - logger.info("NOM FICHIER SHEET: : " + doc.title, { numsession: req.session.id }); //nom du fichier - - const sheet = doc.sheetsByTitle['adhesion_annuelle_web']; - logger.info("NOM DU TABLEAU (ONGLET): " + sheet.title, { numsession: req.session.id }); //nom du fichier - logger.info("NOMBRE DE LIGNE DU TABLEAU: " + sheet.rowCount, { numsession: req.session.id }); - - // SI IDENTIFIANT NON EXISTANT ON AJOUTE LA NOUVELLE LIGNE - // SI IDENTIFIANT EXISTANT, cela veut dire que l'internaute à fait retour arrière depuis la page paiement - // et va enregistrer de nouveau et donc cela ajouterai encore une ligne. - // du coup on ne va pas ajouter une nouvelle ligne mais METTRE Â JOUR l'EXISTANTE au cas où il ait modifié des informations - - // ON CHECK DE NOUVEAU SI L'IDENTIFIANT EST DÉJA PRÉSENT - - const rows = await sheet.getRows(); - - logger.info("rows[0].identifiant: " + rows[0].identifiant, { numsession: req.session.id }); - logger.info("nombre de row : " + sheet.rowCount, { numsession: req.session.id }); - - // mettre les mails dans un array - let lesmails = new Array; - let compteur = sheet.rowCount - 1; - let rowToBeUpdate; - logger.info("compteur : " + compteur, { numsession: req.session.id }); + if (adherent_type == "famille") { + adherent_paiement_montant_adhesion = 22; + }; + if (adherent_type == "observateur") { + adherent_paiement_montant_adhesion = 22; + }; + if (adherent_type == "non déterminé" || adherent_type == "") { + adherent_paiement_montant_adhesion = 0; + }; + logger.info("CALCUL DU PRIX : " + adherent_paiement_montant_adhesion, { numsession: req.session.id }); + //passer la variable dans la session pour la récupérer + req.session.adherent_paiement_montant_adhesion = adherent_paiement_montant_adhesion; - for (let i=0; i AJOUTER UNE LIGNE DANS LA GOOGLE SHEET - const moreRows = await sheet.addRows([ - { - 'identifiant': req.session.identifiant, - 'saison': "2022/2023", - 'adhesion_date': date_formattee, - 'adherent_type': adherent_type, - 'adherent_paiement_montant_adhesion': adherent_paiement_montant_adhesion, - 'adherent_nom': req.session.adherent_nom, - 'adherent_prenom': req.session.adherent_prenom, - 'adherent_datenaissance': req.session.adherent_datenaissance, - 'adherent_adresse_rue': req.session.adherent_adresse_rue, - 'adherent_adresse_complement': req.session.adherent_adresse_complement, - 'adherent_adresse_codepostal': req.session.adherent_adresse_codepostal, - 'adherent_adresse_ville': req.session.adherent_adresse_ville, - 'adherent_adresse_pays': req.session.adherent_adresse_pays, - 'adherent_telephone_mobile': req.session.adherent_telephone_mobile, - 'adherent_telephone_fixe': req.session.adherent_telephone_fixe, - 'adherent_mail': req.session.identifiant, - 'adherent_prof_instrument1': req.session.adherent_prof_instrument1, - 'adherent_prof_instrument1_esa': req.session.adherent_prof_instrument1_esa, - 'adherent_prof_instrument2': req.session.adherent_prof_instrument2, - 'adherent_prof_instrument2_esa': req.session.adherent_prof_instrument2_esa, - 'adherent_prof_sece': req.session.adherent_prof_sece, - 'adherent_prof_ecole1': req.session.adherent_prof_ecole1, - 'adherent_prof_ecole1_adresse': req.session.adherent_prof_ecole1_adresse, - 'adherent_prof_ecole1_cp': req.session.adherent_prof_ecole1_cp, - 'adherent_prof_ecole1_mail': req.session.adherent_prof_ecole1_mail, - 'adherent_prof_ecole1_ville': req.session.adherent_prof_ecole1_ville, - 'adherent_prof_ecole1_web': req.session.adherent_prof_ecole1_web, - 'adherent_prof_ecole2': req.session.adherent_prof_ecole2, - 'adherent_prof_ecole2_adresse': req.session.adherent_prof_ecole2_adresse, - 'adherent_prof_ecole2_cp': req.session.adherent_prof_ecole2_cp, - 'adherent_prof_ecole2_ville': req.session.adherent_prof_ecole2_ville, - 'adherent_prof_ecole2_mail': req.session.adherent_prof_ecole2_mail, - 'adherent_prof_ecole2_web': req.session.adherent_prof_ecole2_web, - 'adherent_prof_ecole3': req.session.adherent_prof_ecole3, - 'adherent_prof_ecole3_adresse': req.session.adherent_prof_ecole3_adresse, - 'adherent_prof_ecole3_cp': req.session.adherent_prof_ecole3_cp, - 'adherent_prof_ecole3_ville': req.session.adherent_prof_ecole3_ville, - 'adherent_prof_ecole3_mail': req.session.adherent_prof_ecole3_mail, - 'adherent_prof_ecole3_web': req.session.adherent_prof_ecole3_web, - 'adherent_prof_stagiaire_instrument1': req.session.adherent_prof_stagiaire_instrument1, - 'adherent_prof_stagiaire_instrument1_esa': req.session.adherent_prof_stagiaire_instrument1_esa, - 'adherent_prof_stagiaire_instrument1_prof': req.session.adherent_prof_stagiaire_instrument1_prof, - 'adherent_prof_stagiaire_instrument2': req.session.adherent_prof_stagiaire_instrument2, - 'adherent_prof_stagiaire_instrument2_esa': req.session.adherent_prof_stagiaire_instrument2_esa, - 'adherent_prof_stagiaire_instrument2_prof': req.session.adherent_prof_stagiaire_instrument2_prof, - 'adherent_eleve1_nom': req.session.adherent_eleve1_nom, - 'adherent_eleve1_prenom': req.session.adherent_eleve1_prenom, - 'adherent_eleve1_datenaissance': req.session.adherent_eleve1_datenaissance, - 'adherent_eleve1_contactsup_nom': req.session.adherent_eleve1_contactsup_nom, - 'adherent_eleve1_contactsup_prenom': req.session.adherent_eleve1_contactsup_prenom, - 'adherent_eleve1_contactsup_mail': req.session.adherent_eleve1_contactsup_mail, - 'adherent_eleve1_InstrumentA': req.session.adherent_eleve1_InstrumentA, - 'adherent_eleve1_InstrumentA_prof': req.session.adherent_eleve1_InstrumentA_prof, - 'adherent_eleve1_InstrumentA_cahier': req.session.adherent_eleve1_InstrumentA_cahier, - 'adherent_eleve1_InstrumentB': req.session.adherent_eleve1_InstrumentB, - 'adherent_eleve1_InstrumentB_prof': req.session.adherent_eleve1_InstrumentB_prof, - 'adherent_eleve1_InstrumentB_cahier': req.session.adherent_eleve1_InstrumentB_cahier, - 'adherent_eleve1_droitimage': req.session.adherent_eleve1_droitimage, - 'adherent_eleve2_nom': req.session.adherent_eleve2_nom, - 'adherent_eleve2_prenom': req.session.adherent_eleve2_prenom, - 'adherent_eleve2_datenaissance': req.session.adherent_eleve2_datenaissance, - 'adherent_eleve2_contactsup_nom': req.session.adherent_eleve2_contactsup_nom, - 'adherent_eleve2_contactsup_prenom': req.session.adherent_eleve2_contactsup_prenom, - 'adherent_eleve2_contactsup_mail': req.session.adherent_eleve2_contactsup_mail, - 'adherent_eleve2_InstrumentA': req.session.adherent_eleve2_InstrumentA, - 'adherent_eleve2_InstrumentA_prof': req.session.adherent_eleve2_InstrumentA_prof, - 'adherent_eleve2_InstrumentA_cahier': req.session.adherent_eleve2_InstrumentA_cahier, - 'adherent_eleve2_InstrumentB': req.session.adherent_eleve2_InstrumentB, - 'adherent_eleve2_InstrumentB_prof': req.session.adherent_eleve2_InstrumentB_prof, - 'adherent_eleve2_InstrumentB_cahier': req.session.adherent_eleve2_InstrumentB_cahier, - 'adherent_eleve2_droitimage': req.session.adherent_eleve2_droitimage, - 'adherent_eleve3_nom': req.session.adherent_eleve3_nom, - 'adherent_eleve3_prenom': req.session.adherent_eleve3_prenom, - 'adherent_eleve3_datenaissance': req.session.adherent_eleve3_datenaissance, - 'adherent_eleve3_contactsup_nom': req.session.adherent_eleve3_contactsup_nom, - 'adherent_eleve3_contactsup_prenom': req.session.adherent_eleve3_contactsup_prenom, - 'adherent_eleve3_contactsup_mail': req.session.adherent_eleve3_contactsup_mail, - 'adherent_eleve3_InstrumentA': req.session.adherent_eleve3_InstrumentA, - 'adherent_eleve3_InstrumentA_prof': req.session.adherent_eleve3_InstrumentA_prof, - 'adherent_eleve3_InstrumentA_cahier': req.session.adherent_eleve3_InstrumentA_cahier, - 'adherent_eleve3_InstrumentB': req.session.adherent_eleve3_InstrumentB, - 'adherent_eleve3_InstrumentB_prof': req.session.adherent_eleve3_InstrumentB_prof, - 'adherent_eleve3_InstrumentB_cahier': req.session.adherent_eleve3_InstrumentB_cahier, - 'adherent_eleve3_droitimage': req.session.adherent_eleve3_droitimage, - 'adherent_eleve4_nom': req.session.adherent_eleve4_nom, - 'adherent_eleve4_prenom': req.session.adherent_eleve4_prenom, - 'adherent_eleve4_datenaissance': req.session.adherent_eleve4_datenaissance, - 'adherent_eleve4_contactsup_nom': req.session.adherent_eleve4_contactsup_nom, - 'adherent_eleve4_contactsup_prenom': req.session.adherent_eleve4_contactsup_prenom, - 'adherent_eleve4_contactsup_mail': req.session.adherent_eleve4_contactsup_mail, - 'adherent_eleve4_InstrumentA': req.session.adherent_eleve4_InstrumentA, - 'adherent_eleve4_InstrumentA_prof': req.session.adherent_eleve4_InstrumentA_prof, - 'adherent_eleve4_InstrumentA_cahier': req.session.adherent_eleve4_InstrumentA_cahier, - 'adherent_eleve4_InstrumentB': req.session.adherent_eleve4_InstrumentB, - 'adherent_eleve4_InstrumentB_prof': req.session.adherent_eleve4_InstrumentB_prof, - 'adherent_eleve4_InstrumentB_cahier': req.session.adherent_eleve4_InstrumentB_cahier, - 'adherent_eleve4_droitimage': req.session.adherent_eleve4_droitimage, - 'adherent_eleve5_nom': req.session.adherent_eleve5_nom, - 'adherent_eleve5_prenom': req.session.adherent_eleve5_prenom, - 'adherent_eleve5_datenaissance': req.session.adherent_eleve5_datenaissance, - 'adherent_eleve5_contactsup_nom': req.session.adherent_eleve5_contactsup_nom, - 'adherent_eleve5_contactsup_prenom': req.session.adherent_eleve5_contactsup_prenom, - 'adherent_eleve5_contactsup_mail': req.session.adherent_eleve5_contactsup_mail, - 'adherent_eleve5_InstrumentA': req.session.adherent_eleve5_InstrumentA, - 'adherent_eleve5_InstrumentA_prof': req.session.adherent_eleve5_InstrumentA_prof, - 'adherent_eleve5_InstrumentA_cahier': req.session.adherent_eleve5_InstrumentA_cahier, - 'adherent_eleve5_InstrumentB': req.session.adherent_eleve5_InstrumentB, - 'adherent_eleve5_InstrumentB_prof': req.session.adherent_eleve5_InstrumentB_prof, - 'adherent_eleve5_InstrumentB_cahier': req.session.adherent_eleve5_InstrumentB_cahier, - 'adherent_eleve5_droitimage': req.session.adherent_eleve5_droitimage, - }, - ]); - - } - - // REDIRECTION VERS LA PAGE PAIEMENT - res.redirect('/inscription/adhesion_paiement_total'); } else { logger.info("Identifiant vide, retour page accueil", { numsession: req.session.id }); req.session.err_mail_form_adhesion_1 = "La page a perdu les informations, veuillez les saisir de nouveau."; - res.redirect('/inscription/adhesion'); + return res.redirect('/adhesion'); } } +///////////////////////////////////////////////// +// AJOUR DU DON DANS LE MONTANT À PAYER +///////////////////////////////////////////////// const post_form_montant_total = async function(req, res){ logger.info("======================================"); - logger.info("======== FUNCTION post_form_montant_total =========="); + logger.info("======== FUNCTION post_form_montant_total (adhesion) =========="); logger.info("======================================"); // MONTANT TOTAL À PAYER @@ -668,7 +347,7 @@ const post_form_montant_total = async function(req, res){ montant_apayer_cent = montant_apayer * 100; req.session.montant_apayer_cent = montant_apayer_cent; logger.info("montant_apayer_cent: " + montant_apayer_cent, { numsession: req.session.id }); - res.redirect('/inscription/adhesion_paiement_mode_paiement'); + res.redirect('/adhesion/adhesion_paiement_mode_paiement'); } ///////////////////////////////////////////////// @@ -676,187 +355,555 @@ const post_form_montant_total = async function(req, res){ ///////////////////////////////////////////////// const post_paiement_cheque_save = async function(req, res){ - logger.info("======================================"); - logger.info("======== FUNCTION post_paiement_cheque_save =========="); - logger.info("======================================"); - ////////////////////////////////////////////////////////////////////////////// - // RÉCUPÉRATION DES DONNÉES DU FORMULAIRE DANS LA SESSION EN COURS - req.session.adherent_paiement_cheque_banque = req.body.adherent_paiement_cheque_banque; - req.session.adherent_paiement_cheque_numero = req.body.adherent_paiement_cheque_numero; + logger.info("======================================"); + logger.info("======== FUNCTION post_paiement_cheque_save (adhesion) =========="); + logger.info("======================================"); + + //////////////////////////////////////////////////// + // CONNECTION ADOBE API + //////////////////////////////////////////////////// + const credentials = PDFServicesSdk.Credentials + .servicePrincipalCredentialsBuilder() + .withClientId(process.env.PDF_SERVICES_CLIENT_ID) + .withClientSecret(process.env.PDF_SERVICES_CLIENT_SECRET) + .build(); + //timeout Default: 10000 + const clientConfig = PDFServicesSdk.ClientConfig + .clientConfigBuilder() + .withConnectTimeout(20000) + .withReadTimeout(40000) + .build(); + // Create an ExecutionContext using credentials + const executionContext = PDFServicesSdk.ExecutionContext.create(credentials); + + ///////////////////////////////////////////////// + // DATE DE L'ADHÉSION + let now = moment().format("YYYY-MM-DD HH:mm:ss"); + let now_pdf = moment().format("YYYY-MM-DDTHH-mm-ss"); + + + ////////////////////////////////////////////////////////////////////////////// + // RÉCUPÉRATION DES DONNÉES DU FORMULAIRE DANS LA SESSION EN COURS + req.session.adherent_paiement_cheque_banque = req.body.adherent_paiement_cheque_banque; + req.session.adherent_paiement_cheque_numero = req.body.adherent_paiement_cheque_numero; + + ////////////////////////////////////////////////////////////////////////////// + // DÉFINIR LE PROFIL À AJOUTER DANS LA CARTE ADHÉRENT + // La fonction est dans le fichier /modules/adherent_type.js + + let profils = carte_adherent.profil(adherent_type); + let profil1 = profils[0]; + let profil2 = profils[1]; + let profil3 = profils[2]; + req.session.profil1 = profil1; + req.session.profil2 = profil2; + req.session.profil3 = profil3; + + ////////////////////////////////////////////////////////////////////////////// + // MISE À JOUR DES INFORMATIONS SUR LE PAIEMENT DANS LA BASE DE DONNÉES + + // Vérifier que la session n'a pas expiré + if (req.session.identifiant) { + try { + const db_connection_promise = await mysql_promise.createConnection({ + host: process.env.db_connection_host, + port: process.env.db_connection_port, + user: process.env.db_connection_user, + password: process.env.db_connection_password, + database: process.env.db_connection_database + }); + logger.info("======================================", { label: filename }); + logger.info("Connected TO DATABASE test with mysql2 PREMISE !", { label: filename }); + logger.info("======================================", { label: filename }); + + + ///////////////////////////////////////////////// + // VÉRIFICATION DANS LA BD SI IDENTIFIANT DÉJÀ INSCRIT OU NON + let sql = 'select identifiant from adherent where identifiant = "' + req.session.identifiant + '" AND saison = "2025/2026"'; + logger.info("REQUETE SQL SELECT identifiant from adherent : " + sql , { numsession: req.session.id, label: filename}); + try { + const [results, fields] = await db_connection_promise.execute(sql); + console.log(results); + logger.info("Nombre de lignes trouvées avec cet identifiant = " + results.length, { numsession: req.session.id, label: filename}); + if (results.length) { + // IDENTIFIANT DÉJA INSCRIT + // METTRE Â JOUR l'EXISTANT au cas où il ait modifié des informations + logger.info("// IDENTIFIANT DÉJA INSCRIT", { numsession: req.session.id, label: filename}); + // affichage message erreur + logger.info("identifiant déjà inscrit", { numsession: req.session.id, label: filename}); + req.session.err_mail_form_adhesion_1 = "Cette adresse Email est déjà inscrite pour les adhésions 2025/2026."; + req.session.err_mail_form_adhesion_2 = "Si vous n'aviez pas pu finaliser votre paiement veuillez nous envoyer un chèque ou un virement."; + req.session.err_mail_form_adhesion_3 = "Pour tout problème veuillez contacter l’Association."; + // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur + await db_connection_promise.end(); + res.redirect('/adhesion'); + + } else { + // IDENTIFIANT NON TROUVÉ + // AJOUTER UNE LIGNE DANS LA TABLE adhrent + logger.info("// NON TROUVÉ => AJOUTER UNE LIGNE DANS LA TABLE", { numsession: req.session.id, label: filename}); + let sql2 = 'INSERT INTO '; + sql2 += 'adherent'; + sql2 += ' ('; + sql2 += 'date_maj, '; + sql2 += 'saison, '; + sql2 += 'identifiant, '; + sql2 += 'association_suzuki, '; + sql2 += 'adherent_type, '; + sql2 += 'adherent_nom, '; + sql2 += 'adherent_prenom, '; + sql2 += 'adherent_mail, '; + sql2 += 'adherent_adresse_rue, '; + sql2 += 'adherent_adresse_complement, '; + sql2 += 'adherent_adresse_codepostal, '; + sql2 += 'adherent_adresse_ville, '; + sql2 += 'adherent_adresse_pays, '; + sql2 += 'adherent_telephone_mobile, '; + sql2 += 'adherent_telephone_fixe, '; + sql2 += 'carte_envoi'; + sql2 += ') VALUES ('; + sql2 += '"'+ now +'",'; + sql2 += '"2025/2026",'; + sql2 += '"'+ req.session.identifiant +'",'; + sql2 += '"AFPS",'; + sql2 += '"'+ adherent_type +'",'; + sql2 += '"'+ req.session.adherent_nom +'",'; + sql2 += '"'+ req.session.adherent_prenom +'",'; + sql2 += '"'+ req.session.identifiant +'",'; + sql2 += '"'+ req.session.adherent_adresse_rue +'",'; + sql2 += '"'+ req.session.adherent_adresse_complement +'",'; + sql2 += '"'+ req.session.adherent_adresse_codepostal +'",'; + sql2 += '"'+ req.session.adherent_adresse_ville +'",'; + sql2 += '"'+ req.session.adherent_adresse_pays +'",'; + sql2 += '"'+ req.session.adherent_telephone_mobile +'",'; + sql2 += '"'+ req.session.adherent_telephone_fixe +'", '; + sql2 += '"temporaire"'; + sql2 += ')'; + logger.info("REQUETE SQL INSERT INTO adherent : " + sql2 , { numsession: req.session.id, label: filename}); + + // AJOUTER L'ADHÉRENT DANS LA TABLE adherent + try { + // AJOUTER UNE LIGNE DANS LA TABLE adhrent + const [results, fields] = await db_connection_promise.execute(sql2); + logger.info("ADHÉRENTS Row ID added : " + results.insertId, { numsession: req.session.id, label: filename}); + + } catch (error) { + // Echec de la requête + console.log(error); + logger.error("Il y a un problème avec la requête INSERT INTO adherent! : " + error, { numsession: req.session.id }); + req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; + // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur + await db_connection_promise.end(); + res.redirect('/adhesion'); + } + + // AJOUTER LES ÉLÈVES DANS LA TABLE adherent_eleve + for (let i=1; i<6; i++) { + if (req.session["eleve_"+i+"_nom"]) { + let sql3 = 'INSERT INTO '; + sql3 += 'adherent_eleve'; + sql3 += ' ('; + sql3 += 'date_maj, '; + sql3 += 'saison, '; + sql3 += 'identifiant, '; + sql3 += 'association_suzuki, '; + sql3 += 'eleve_nom, '; + sql3 += 'eleve_prenom, '; + sql3 += 'adherent_mail, '; + sql3 += 'adherent_telephone_mobile, '; + sql3 += 'eleve_datenaissance, '; + sql3 += 'eleve_instrumentA, '; + sql3 += 'eleve_instrumentA_cahier, '; + sql3 += 'eleve_instrumentA_prof, '; + sql3 += 'eleve_instrumentB, '; + sql3 += 'eleve_instrumentB_cahier, '; + sql3 += 'eleve_instrumentB_prof, '; + sql3 += 'eleve_droitimage, '; + sql3 += 'eleve_contactsup_nom, '; + sql3 += 'eleve_contactsup_prenom, '; + sql3 += 'eleve_contactsup_mail'; + sql3 += ') VALUES ('; + sql3 += '"'+ now +'",'; + sql3 += '"2025/2026",'; + sql3 += '"'+ req.session.identifiant +'",'; + sql3 += '"AFPS",'; + sql3 += '"'+ req.session["eleve_"+i+"_nom"] +'",'; + sql3 += '"'+ req.session["eleve_"+i+"_prenom"] +'",'; + sql3 += '"'+ req.session.identifiant +'",'; + sql3 += '"'+ req.session.adherent_telephone_mobile +'",'; + sql3 += '"'+ req.session["eleve_"+i+"_datenaissance"] +'",'; + sql3 += '"'+ req.session["eleve_"+i+"_instrumentA"] +'",'; + sql3 += '"'+ req.session["eleve_"+i+"_instrumentA_cahier"] +'",'; + sql3 += '"'+ req.session["eleve_"+i+"_instrumentA_prof"] +'",'; + sql3 += '"'+ req.session["eleve_"+i+"_instrumentB"] +'",'; + sql3 += '"'+ req.session["eleve_"+i+"_instrumentB_cahier"] +'",'; + if (req.session["eleve_"+i+"_instrumentB_prof"]==undefined){req.session["eleve_"+i+"_instrumentB_prof"]=""}; + sql3 += '"'+ req.session["eleve_"+i+"_instrumentB_prof"] +'",'; + sql3 += '"'+ req.session["eleve_"+i+"_droitimage"] +'",'; + sql3 += '"'+ req.session["eleve_"+i+"_contactsup_nom"] +'",'; + sql3 += '"'+ req.session["eleve_"+i+"_contactsup_prenom"] +'",'; + sql3 += '"'+ req.session["eleve_"+i+"_contactsup_mail"] +'"'; + sql3 += ')'; + logger.info("REQUETE SQL INSERT INTO adherent_eleve : " + sql3, { numsession: req.session.id, label: filename}); + + try { + const [results, fields] = await db_connection_promise.execute(sql3); + logger.info("ADHÉRENTS Row ID added : " + results.insertId, { numsession: req.session.id, label: filename}); + + } catch (error) { + // Echec de la requête + console.log(error); + logger.error("Il y a un problème avec la requête INSERT INTO adherent_eleve! : " + error, { numsession: req.session.id }); + req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; + // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur + await db_connection_promise.end(); + res.redirect('/adhesion'); + } + } + } + + // AJOUTER LE PROFESSEUR DANS LA TABLE adherent_professeur + if (req.session.adherent_prof_instrument1) { + let sql4 = 'INSERT INTO '; + sql4 += 'adherent_professeur'; + sql4 += ' ('; + sql4 += 'date_maj, '; + sql4 += 'saison, '; + sql4 += 'identifiant, '; + sql4 += 'association_suzuki, '; + sql4 += 'adherent_nom, '; + sql4 += 'adherent_prenom, '; + sql4 += 'adherent_mail, '; + sql4 += 'adherent_telephone_mobile, '; + sql4 += 'adherent_prof_instrument1, '; + sql4 += 'adherent_prof_instrument1_esa, '; + sql4 += 'adherent_prof_instrument2, '; + sql4 += 'adherent_prof_instrument2_esa, '; + sql4 += 'adherent_prof_sece, '; + sql4 += 'adherent_prof_ecole1, '; + sql4 += 'adherent_prof_ecole1_mail, '; + sql4 += 'adherent_prof_ecole1_web, '; + sql4 += 'adherent_prof_ecole1_adresse, '; + sql4 += 'adherent_prof_ecole1_cp, '; + sql4 += 'adherent_prof_ecole1_ville, '; + sql4 += 'adherent_prof_ecole1_region, '; + sql4 += 'adherent_prof_ecole2, '; + sql4 += 'adherent_prof_ecole2_mail, '; + sql4 += 'adherent_prof_ecole2_web, '; + sql4 += 'adherent_prof_ecole2_adresse, '; + sql4 += 'adherent_prof_ecole2_cp, '; + sql4 += 'adherent_prof_ecole2_ville, '; + sql4 += 'adherent_prof_ecole2_region, '; + sql4 += 'adherent_prof_ecole3, '; + sql4 += 'adherent_prof_ecole3_mail, '; + sql4 += 'adherent_prof_ecole3_web, '; + sql4 += 'adherent_prof_ecole3_adresse, '; + sql4 += 'adherent_prof_ecole3_cp, '; + sql4 += 'adherent_prof_ecole3_ville, '; + sql4 += 'adherent_prof_ecole3_region'; + sql4 += ') VALUES ('; + sql4 += '"'+ now +'",'; + sql4 += '"2025/2026",'; + sql4 += '"'+ req.session.identifiant +'",'; + sql4 += '"AFPS",'; + sql4 += '"'+ req.session.adherent_nom +'",'; + sql4 += '"'+ req.session.adherent_prenom +'",'; + sql4 += '"'+ req.session.identifiant +'",'; + sql4 += '"'+ req.session.adherent_telephone_mobile +'",'; + sql4 += '"'+ req.session.adherent_prof_instrument1 +'",'; + sql4 += '"'+ req.session.adherent_prof_instrument1_esa +'",'; + sql4 += '"'+ req.session.adherent_prof_instrument2 +'",'; + sql4 += '"'+ req.session.adherent_prof_instrument2_esa +'",'; + sql4 += '"'+ req.session.adherent_prof_sece +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole1 +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole1_mail +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole1_web +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole1_adresse +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole1_cp +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole1_ville +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole1_region +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole2 +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole2_mail +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole2_web +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole2_adresse +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole2_cp +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole2_ville +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole2_region +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole3 +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole3_mail +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole3_web +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole3_adresse +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole3_cp +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole3_ville +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole3_region +'"'; + sql4 += ')'; + logger.info("REQUETE SQL INSERT INTO adherent_professeur : " + sql4, { numsession: req.session.id, label: filename}); + + try { + // AJOUTER UNE LIGNE DANS LA TABLE adherent_professeur + const [results, fields] = await db_connection_promise.execute(sql4); + logger.info("PROFESSEUR Row ID added : " + results.insertId, { numsession: req.session.id, label: filename}); + } catch (error) { + // Echec de la requête + console.log(error); + logger.error("Il y a un problème avec la requête INSERT INTO adherent_professeur! : " + error, { numsession: req.session.id }); + req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; + // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur + await db_connection_promise.end(); + res.redirect('/adhesion'); + } + } + + // AJOUTER LE PROFESSEUR EN FORMATION DANS LA TABLE adherent_formation_prof + if (req.session.adherent_prof_stagiaire_instrument1) { + let sql5 = 'INSERT INTO '; + sql5 += 'adherent_formation_prof'; + sql5 += ' ('; + sql5 += 'date_maj, '; + sql5 += 'saison, '; + sql5 += 'identifiant, '; + sql5 += 'association_suzuki, '; + sql5 += 'adherent_nom, '; + sql5 += 'adherent_prenom, '; + sql5 += 'adherent_mail, '; + sql5 += 'adherent_telephone_mobile, '; + sql5 += 'adherent_prof_stagiaire_instrument1, '; + sql5 += 'adherent_prof_stagiaire_instrument1_esa, '; + sql5 += 'adherent_prof_stagiaire_instrument1_prof, '; + sql5 += 'adherent_prof_stagiaire_instrument2, '; + sql5 += 'adherent_prof_stagiaire_instrument2_esa, '; + sql5 += 'adherent_prof_stagiaire_instrument2_prof'; + sql5 += ') VALUES ('; + sql5 += '"'+ now +'",'; + sql5 += '"2025/2026",'; + sql5 += '"'+ req.session.identifiant +'",'; + sql5 += '"AFPS",'; + sql5 += '"'+ req.session.adherent_nom +'",'; + sql5 += '"'+ req.session.adherent_prenom +'",'; + sql5 += '"'+ req.session.identifiant +'",'; + sql5 += '"'+ req.session.adherent_telephone_mobile +'",'; + sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument1 +'",'; + sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument1_esa +'",'; + sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument1_prof +'",'; + sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument2 +'",'; + sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument2_esa +'",'; + if (req.session.adherent_prof_stagiaire_instrument2_prof==undefined) {req.session.adherent_prof_stagiaire_instrument2_prof = ""}; + sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument2_prof +'"'; + sql5 += ')'; + logger.info("====== REQUETE SQL INSERT INTO adherent_formation_prof : ", { numsession: req.session.id, label: filename}); + logger.info(sql5, { numsession: req.session.id, label: filename}); + logger.info("=========================================================", { numsession: req.session.id, label: filename}); + + try { + // AJOUTER UNE LIGNE DANS LA TABLE adherent_professeur + const [results, fields] = await db_connection_promise.execute(sql5); + logger.info("PROFESSEUR EN FORMATION Row ID added : " + results.insertId, { numsession: req.session.id, label: filename}); + } catch (error) { + // Echec de la requête + console.log(error); + logger.error("Il y a un problème avec la requête INSERT INTO adherent_formation_prof! : " + error, { numsession: req.session.id }); + req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; + // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur + await db_connection_promise.end(); + res.redirect('/adhesion'); + } + } - ////////////////////////////////////////////////////////////////////////////// - // MISE À JOUR DES INFORMATIONS SUR LE PAIEMENT DANS LA BASE DE DONNÉES GSHEET - await doc.useServiceAccountAuth(creds); - await doc.loadInfo(); // loads document properties and worksheets - const sheet = doc.sheetsByTitle['adhesion_annuelle_web']; - // on récupère le contenu de la GSheet dans un array nommé "rows" - const rows = await sheet.getRows(); - // on récupère quelle ligne contient l'identifiant concerné pour mettre à jour cette ligne - let lesmails = new Array; - let compteur = sheet.rowCount - 1; - let rowToBeUpdate; - for (let i=0; i 0) { - description += " Nous vous remercions de votre proposition de don de "; - description += req.session.adherent_paiement_montant_don; - description += " euros que vous pouvez ajouter à votre règlement."; - }; - - var membres = [ - { - today: today, - description: description, - identifiant: req.session.identifiant, - profil1: profil1, - profil2: profil2, - profil3: profil3, - type_card: "TEMPORAIRE", - adherent_paiement_mode: "Adhésion en attente de paiement par chèque" - }, - ]; - - //var pdfname = "/Users/julie/Documents/GitHub/aduzuki/pdf/adhesion/2223/attente/"; - var pdfname = path.resolve(__dirname, "../pdf/adhesion/2223/attente/"); - pdfname += "/"; - pdfname += req.session.identifiant; - pdfname += "_adhesion_2223_attente.pdf"; - logger.info("pdfname = " + pdfname, { numsession: req.session.id }); - - var document = { - html: html, - data: { - membres: membres, - }, - path: pdfname, - type: "" + } catch (error) { + // Echec de la requête + console.log(error); + logger.error("Il y a un problème avec la requête select identifiant from adherent! : " + error, { numsession: req.session.id }); + req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; + // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur + await db_connection_promise.end(); + res.redirect('/adhesion'); }; - await pdf - .create(document, options) - .then((res) => { - logger.info("PDF CREATION OK", { numsession: req.session.id }); - }) - .catch((error) => { - logger.info("error" + error, { numsession: req.session.id }); - }); - logger.info("PDF CREATION APRES", { numsession: req.session.id }); - ////////////////////////////////////////////////////////////////////////////// - // ENVOIE CARTE ADHERENT TEMPORAIRE PAR MAIL + // METTRE À JOUR LES INFOS DE PAIEMENT DANS adherent_finance + let sql6 = 'INSERT INTO '; + sql6 += 'adherent_finance'; + sql6 += ' ('; + sql6 += 'date_maj, '; + sql6 += 'saison, '; + sql6 += 'identifiant, '; + sql6 += 'association_suzuki, '; + sql6 += 'adherent_type, '; + sql6 += 'adherent_nom, '; + sql6 += 'adherent_prenom, '; + sql6 += 'adherent_telephone_mobile, '; + sql6 += 'adherent_mail, '; + sql6 += 'montant_adhesion, '; + sql6 += 'montant_don, '; + sql6 += 'montant_total, '; + sql6 += 'paiement_mode, '; + sql6 += 'statut_paiement'; + sql6 += ') VALUES ('; + sql6 += '"'+ now +'",'; + sql6 += '"2025/2026",'; + sql6 += '"'+ req.session.identifiant +'",'; + sql6 += '"AFPS",'; + sql6 += '"'+ adherent_type +'",'; + sql6 += '"'+ req.session.adherent_nom +'",'; + sql6 += '"'+ req.session.adherent_prenom +'",'; + sql6 += '"'+ req.session.adherent_telephone_mobile +'",'; + sql6 += '"'+ req.session.identifiant +'",'; + if (req.session.adherent_paiement_montant_adhesion == "" || req.session.adherent_paiement_montant_adhesion == "undefined" || !req.session.adherent_paiement_montant_adhesion) {req.session.adherent_paiement_montant_adhesion = 0}; + sql6 += '"'+ req.session.adherent_paiement_montant_adhesion +'",'; + if (req.session.adherent_paiement_montant_don == "" || req.session.adherent_paiement_montant_don == "undefined" || !req.session.adherent_paiement_montant_don) {req.session.adherent_paiement_montant_don = 0}; + sql6 += '"'+ req.session.adherent_paiement_montant_don +'",'; + if (req.session.montant_apayer == "" || req.session.montant_apayer == "undefined" || !req.session.montant_apayer) {req.session.montant_apayer = 0}; + sql6 += '"'+ req.session.montant_apayer +'",'; + sql6 += '"cheque",'; + sql6 += '"attente"'; + sql6 += ')'; - logger.info("MAIL ENVOI AVANT", { numsession: req.session.id }); - var transporter = nodemailer.createTransport({ - service: 'gmail', - auth: { - // TEST JULIE - //user: 'juliechaumard@gmail.com', - //pass: 'etfq umof iwbx ltxk' - // SUZUKI - user: 'afpedagogiesuzuki@gmail.com', - pass: 'tlxx kjwx ahyx irnl' - } - }); + logger.info("REQUETE SQL UPDATE adherent_finance : " + sql6 , { numsession: req.session.id, label: filename}); - var attachment_name = req.session.identifiant; - attachment_name += "_adhesion_2223_carteadherent.pdf"; - - var mail_objet = "ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI - ADHÉSION 2022/2023 - "; - mail_objet += req.session.adherent_nom; + try { + // METTRE À JOUR LES INFOS DE PAIEMENT DANS adherent_finance + const [results, fields] = await db_connection_promise.execute(sql6); + logger.info("adherent_finance Row ID added : " + results.insertId, { numsession: req.session.id, label: filename}); - mail_html = "

Cher adhérent,

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

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

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

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


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

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

"; - var mailOptions = { - from: 'afpedagogiesuzuki@gmail.com', - to: req.session.identifiant, - subject: mail_objet, - html: mail_html, - attachments: [{ - filename: attachment_name, - path: pdfname - }], + } catch (error) { + // Echec de la requête + console.log(error); + logger.error("Il y a un problème avec la requête INSERT INTO adherent_finance! : " + error, { numsession: req.session.id }); + req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; + // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur + await db_connection_promise.end(); + res.redirect('/adhesion'); + } + + } catch (error) { + // Echec de connection à la BD + logger.error("Il y a un problème avec la connection à la base de données! : " + error, { numsession: req.session.id }); + req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; + // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur + await db_connection_promise.end(); + res.redirect('/adhesion'); }; - transporter.sendMail(mailOptions, function(error, info){ - if (error) { - logger.info("error" + error, { numsession: req.session.id }); - } else { - logger.info("Email envoyé: " + info.response, { numsession: req.session.id }); - } - }); - logger.info("MAIL ENVOI APRES", { numsession: req.session.id }); + } else { + // les Infos de session ne sont plus dispo + logger.info("les Infos de session ne sont plus dispo! : ", { numsession: req.session.id }); + req.session.err_mail_form_adhesion_1 = "La session a expiré."; + req.session.err_mail_form_adhesion_2 = "Si vous n'aviez pas pu finaliser votre paiement veuillez nous envoyer un chèque ou un virement."; + req.session.err_mail_form_adhesion_3 = "Pour tout problème veuillez contacter l’Association."; + // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur + res.redirect('/adhesion'); + } - // REDIRECTION VERS LA PAGE DE CONFIRMATION PAIEMENT VIREMENT - res.redirect('/inscription/adhesion_paiement/attente'); + + + ////////////////////////////////////////////////////////////////////////////// + // ADOBE PDF : CRÉATION DE LA CARTE D'ADHÉSION TEMPORAIRE EN PDF + + let OUTPUT = path.resolve(__dirname, "../pdf/adhesion/2526/attente/")+"/"+req.session.identifiant+"_adhesion_2526_attente_"+now_pdf+".pdf"; + let INPUT = path.resolve(__dirname, "../pdf/template/carte_adherent_temp.docx"); + + + moment.locale('fr'); + var date_formattee = moment().format('L') + var today = date_formattee; + + if (profil2 == undefined) {profil2 = " "}; + if (profil3 == undefined) {profil3 = " "}; + + JSON_INPUT = + { + "date": today, + "identifiant": req.session.identifiant, + "profil1": profil1, + "profil2": profil2, + "profil3": profil3, + "montant": req.session.adherent_paiement_montant_adhesion + }; + + const documentMerge = PDFServicesSdk.DocumentMerge, + documentMergeOptions = documentMerge.options, + adobe_options = new documentMergeOptions.DocumentMergeOptions(JSON_INPUT, documentMergeOptions.OutputFormat.PDF); + + // Create a new operation instance using the options instance. + const documentMergeOperation = documentMerge.Operation.createNew(adobe_options); + + // Set operation input document template from a source file. + const input = PDFServicesSdk.FileRef.createFromLocalFile(INPUT); + documentMergeOperation.setInput(input); + + // Execute the operation and Save the result to the specified location. + await documentMergeOperation + .execute(executionContext) + .then(result => result.saveAsFile(OUTPUT).then( + ) + ) + .catch(err => { + if(err instanceof PDFServicesSdk.Error.ServiceApiError + || err instanceof PDFServicesSdk.Error.ServiceUsageError) { + console.log('Exception encountered while executing ADOBE PDF', err); + } else { + console.log('Exception encountered while executing ADOBE PDF', err); + } + }); + + ////////////////////////////////////////////////////////////////////////////// + // ENVOIE CARTE ADHERENT TEMPORAIRE PAR MAIL + + logger.info("MAIL ENVOI AVANT", { numsession: req.session.id }); + var transporter = nodemailer.createTransport({ + service: 'gmail', + auth: { + user: process.env.nodemailer_user, + pass: process.env.nodemailer_pass + } + }); + + var attachment_name = req.session.identifiant; + attachment_name += "_adhesion_2526_carteadherent_temporaire.pdf"; + + var mail_objet = "ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI - ADHÉSION 2025/2026 - "; + mail_objet += req.session.identifiant; + + mail_html = "

Cher adhérent,

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

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

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

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


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

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

"; + + var mailOptions = { + from: 'afps.inscription@gmail.com', + to: req.session.identifiant, + subject: mail_objet, + html: mail_html, + attachments: [{ + filename: attachment_name, + path: OUTPUT + }], + }; + + transporter.sendMail(mailOptions, function(error, info){ + if (error) { + logger.info("error" + error, { numsession: req.session.id }); + } else { + logger.info("Email envoyé: " + info.response, { numsession: req.session.id }); + } + }); + logger.info("MAIL ENVOI APRES", { numsession: req.session.id }); + + // REDIRECTION VERS LA PAGE DE CONFIRMATION PAIEMENT VIREMENT + res.locals.today = date_formattee; + res.redirect('/adhesion/adhesion_paiement/attente'); } @@ -865,805 +912,1624 @@ const post_paiement_cheque_save = async function(req, res){ ///////////////////////////////////////////////// const post_paiement_virement_save = async function(req, res){ - logger.info("======================================"); - logger.info("======== FUNCTION post_paiement_virement_save =========="); - logger.info("======================================"); + logger.info("======================================"); + logger.info("======== FUNCTION post_paiement_virement_save (adhesion) =========="); + logger.info("======================================"); + + //////////////////////////////////////////////////// + // CONNECTION ADOBE API + //////////////////////////////////////////////////// + const credentials = PDFServicesSdk.Credentials + .servicePrincipalCredentialsBuilder() + .withClientId(process.env.PDF_SERVICES_CLIENT_ID) + .withClientSecret(process.env.PDF_SERVICES_CLIENT_SECRET) + .build(); + //timeout Default: 10000 + const clientConfig = PDFServicesSdk.ClientConfig + .clientConfigBuilder() + .withConnectTimeout(20000) + .withReadTimeout(40000) + .build(); + // Create an ExecutionContext using credentials + const executionContext = PDFServicesSdk.ExecutionContext.create(credentials); + + req.session.adherent_paiement_mode = "virement"; + + ///////////////////////////////////////////////// + // DATE DE L'ADHÉSION + let now = moment().format("YYYY-MM-DD HH:mm:ss"); + let now_pdf = moment().format("YYYY-MM-DDTHH-mm-ss"); + + ////////////////////////////////////////////////////////////////////////////// + // DÉFINIR LE PROFIL À AJOUTER DANS LA CARTE ADHÉRENT + // La fonction est dans le fichier /modules/adherent_type.js + let profils = carte_adherent.profil(adherent_type); + let profil1 = profils[0]; + let profil2 = profils[1]; + let profil3 = profils[2]; + + req.session.profil1 = profil1; + req.session.profil2 = profil2; + req.session.profil3 = profil3; + + ////////////////////////////////////////////////////////////////////////////// + // MISE À JOUR DES INFORMATIONS SUR LE PAIEMENT DANS LA BASE DE DONNÉES adherent_finance + + // Vérifier que la session n'a pas expiré + if (req.session.identifiant) { + try { + const db_connection_promise = await mysql_promise.createConnection({ + host: process.env.db_connection_host, + port: process.env.db_connection_port, + user: process.env.db_connection_user, + password: process.env.db_connection_password, + database: process.env.db_connection_database + }); + logger.info("======================================", { label: filename }); + logger.info("Connected TO DATABASE test with mysql2 PREMISE !", { label: filename }); + logger.info("======================================", { label: filename }); + + ///////////////////////////////////////////////// + // VÉRIFICATION DANS LA BD SI IDENTIFIANT DÉJÀ INSCRIT OU NON + let sql = 'select identifiant from adherent where identifiant = "' + req.session.identifiant + '" AND saison = "2025/2026"'; + logger.info("REQUETE SQL SELECT identifiant from adherent : " + sql , { numsession: req.session.id, label: filename}); + try { + const [results, fields] = await db_connection_promise.execute(sql); + console.log(results); + logger.info("Nombre de lignes trouvées avec cet identifiant = " + results.length, { numsession: req.session.id, label: filename}); + if (results.length) { + // IDENTIFIANT DÉJA INSCRIT + // METTRE Â JOUR l'EXISTANT au cas où il ait modifié des informations + logger.info("// IDENTIFIANT DÉJA INSCRIT", { numsession: req.session.id, label: filename}); + // affichage message erreur + logger.info("identifiant déjà inscrit", { numsession: req.session.id, label: filename}); + req.session.err_mail_form_adhesion_1 = "Cette adresse Email est déjà inscrite pour les adhésions 2025/2026."; + req.session.err_mail_form_adhesion_2 = "Si vous n'aviez pas pu finaliser votre paiement veuillez nous envoyer un chèque ou un virement."; + req.session.err_mail_form_adhesion_3 = "Pour tout problème veuillez contacter l’Association."; + // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur + await db_connection_promise.end(); + res.redirect('/adhesion'); + + } else { + // IDENTIFIANT NON TROUVÉ + // AJOUTER UNE LIGNE DANS LA TABLE adhrent + logger.info("// NON TROUVÉ => AJOUTER UNE LIGNE DANS LA TABLE", { numsession: req.session.id, label: filename}); + let sql2 = 'INSERT INTO '; + sql2 += 'adherent'; + sql2 += ' ('; + sql2 += 'date_maj, '; + sql2 += 'saison, '; + sql2 += 'identifiant, '; + sql2 += 'association_suzuki, '; + sql2 += 'adherent_type, '; + sql2 += 'adherent_nom, '; + sql2 += 'adherent_prenom, '; + sql2 += 'adherent_mail, '; + sql2 += 'adherent_adresse_rue, '; + sql2 += 'adherent_adresse_complement, '; + sql2 += 'adherent_adresse_codepostal, '; + sql2 += 'adherent_adresse_ville, '; + sql2 += 'adherent_adresse_pays, '; + sql2 += 'adherent_telephone_mobile, '; + sql2 += 'adherent_telephone_fixe, '; + sql2 += 'carte_envoi'; + sql2 += ') VALUES ('; + sql2 += '"'+ now +'",'; + sql2 += '"2025/2026",'; + sql2 += '"'+ req.session.identifiant +'",'; + sql2 += '"AFPS",'; + sql2 += '"'+ adherent_type +'",'; + sql2 += '"'+ req.session.adherent_nom +'",'; + sql2 += '"'+ req.session.adherent_prenom +'",'; + sql2 += '"'+ req.session.identifiant +'",'; + sql2 += '"'+ req.session.adherent_adresse_rue +'",'; + sql2 += '"'+ req.session.adherent_adresse_complement +'",'; + sql2 += '"'+ req.session.adherent_adresse_codepostal +'",'; + sql2 += '"'+ req.session.adherent_adresse_ville +'",'; + sql2 += '"'+ req.session.adherent_adresse_pays +'",'; + sql2 += '"'+ req.session.adherent_telephone_mobile +'",'; + sql2 += '"'+ req.session.adherent_telephone_fixe +'", '; + sql2 += '"temporaire"'; + sql2 += ')'; + logger.info("REQUETE SQL INSERT INTO adherent : " + sql2 , { numsession: req.session.id, label: filename}); + + // AJOUTER L'ADHÉRENT DANS LA TABLE adherent + try { + // AJOUTER UNE LIGNE DANS LA TABLE adhrent + const [results, fields] = await db_connection_promise.execute(sql2); + logger.info("ADHÉRENTS Row ID added : " + results.insertId, { numsession: req.session.id, label: filename}); + + } catch (error) { + // Echec de la requête + console.log(error); + logger.error("Il y a un problème avec la requête INSERT INTO adherent! : " + error, { numsession: req.session.id }); + req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; + // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur + await db_connection_promise.end(); + res.redirect('/adhesion'); + } + + // AJOUTER LES ÉLÈVES DANS LA TABLE adherent_eleve + for (let i=1; i<6; i++) { + if (req.session["eleve_"+i+"_nom"]) { + let sql3 = 'INSERT INTO '; + sql3 += 'adherent_eleve'; + sql3 += ' ('; + sql3 += 'date_maj, '; + sql3 += 'saison, '; + sql3 += 'identifiant, '; + sql3 += 'association_suzuki, '; + sql3 += 'eleve_nom, '; + sql3 += 'eleve_prenom, '; + sql3 += 'adherent_mail, '; + sql3 += 'adherent_telephone_mobile, '; + sql3 += 'eleve_datenaissance, '; + sql3 += 'eleve_instrumentA, '; + sql3 += 'eleve_instrumentA_cahier, '; + sql3 += 'eleve_instrumentA_prof, '; + sql3 += 'eleve_instrumentB, '; + sql3 += 'eleve_instrumentB_cahier, '; + sql3 += 'eleve_instrumentB_prof, '; + sql3 += 'eleve_droitimage, '; + sql3 += 'eleve_contactsup_nom, '; + sql3 += 'eleve_contactsup_prenom, '; + sql3 += 'eleve_contactsup_mail'; + sql3 += ') VALUES ('; + sql3 += '"'+ now +'",'; + sql3 += '"2025/2026",'; + sql3 += '"'+ req.session.identifiant +'",'; + sql3 += '"AFPS",'; + sql3 += '"'+ req.session["eleve_"+i+"_nom"] +'",'; + sql3 += '"'+ req.session["eleve_"+i+"_prenom"] +'",'; + sql3 += '"'+ req.session.identifiant +'",'; + sql3 += '"'+ req.session.adherent_telephone_mobile +'",'; + sql3 += '"'+ req.session["eleve_"+i+"_datenaissance"] +'",'; + sql3 += '"'+ req.session["eleve_"+i+"_instrumentA"] +'",'; + sql3 += '"'+ req.session["eleve_"+i+"_instrumentA_cahier"] +'",'; + sql3 += '"'+ req.session["eleve_"+i+"_instrumentA_prof"] +'",'; + sql3 += '"'+ req.session["eleve_"+i+"_instrumentB"] +'",'; + sql3 += '"'+ req.session["eleve_"+i+"_instrumentB_cahier"] +'",'; + if (req.session["eleve_"+i+"_instrumentB_prof"]==undefined){req.session["eleve_"+i+"_instrumentB_prof"]=""}; + sql3 += '"'+ req.session["eleve_"+i+"_instrumentB_prof"] +'",'; + sql3 += '"'+ req.session["eleve_"+i+"_droitimage"] +'",'; + sql3 += '"'+ req.session["eleve_"+i+"_contactsup_nom"] +'",'; + sql3 += '"'+ req.session["eleve_"+i+"_contactsup_prenom"] +'",'; + sql3 += '"'+ req.session["eleve_"+i+"_contactsup_mail"] +'"'; + sql3 += ')'; + logger.info("REQUETE SQL INSERT INTO adherent_eleve : " + sql3, { numsession: req.session.id, label: filename}); + + try { + const [results, fields] = await db_connection_promise.execute(sql3); + logger.info("ADHÉRENTS Row ID added : " + results.insertId, { numsession: req.session.id, label: filename}); + + } catch (error) { + // Echec de la requête + console.log(error); + logger.error("Il y a un problème avec la requête INSERT INTO adherent_eleve! : " + error, { numsession: req.session.id }); + req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; + // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur + await db_connection_promise.end(); + res.redirect('/adhesion'); + } + } + } + + // AJOUTER LE PROFESSEUR DANS LA TABLE adherent_professeur + if (req.session.adherent_prof_instrument1) { + let sql4 = 'INSERT INTO '; + sql4 += 'adherent_professeur'; + sql4 += ' ('; + sql4 += 'date_maj, '; + sql4 += 'saison, '; + sql4 += 'identifiant, '; + sql4 += 'association_suzuki, '; + sql4 += 'adherent_nom, '; + sql4 += 'adherent_prenom, '; + sql4 += 'adherent_mail, '; + sql4 += 'adherent_telephone_mobile, '; + sql4 += 'adherent_prof_instrument1, '; + sql4 += 'adherent_prof_instrument1_esa, '; + sql4 += 'adherent_prof_instrument2, '; + sql4 += 'adherent_prof_instrument2_esa, '; + sql4 += 'adherent_prof_sece, '; + sql4 += 'adherent_prof_ecole1, '; + sql4 += 'adherent_prof_ecole1_mail, '; + sql4 += 'adherent_prof_ecole1_web, '; + sql4 += 'adherent_prof_ecole1_adresse, '; + sql4 += 'adherent_prof_ecole1_cp, '; + sql4 += 'adherent_prof_ecole1_ville, '; + sql4 += 'adherent_prof_ecole1_region, '; + sql4 += 'adherent_prof_ecole2, '; + sql4 += 'adherent_prof_ecole2_mail, '; + sql4 += 'adherent_prof_ecole2_web, '; + sql4 += 'adherent_prof_ecole2_adresse, '; + sql4 += 'adherent_prof_ecole2_cp, '; + sql4 += 'adherent_prof_ecole2_ville, '; + sql4 += 'adherent_prof_ecole2_region, '; + sql4 += 'adherent_prof_ecole3, '; + sql4 += 'adherent_prof_ecole3_mail, '; + sql4 += 'adherent_prof_ecole3_web, '; + sql4 += 'adherent_prof_ecole3_adresse, '; + sql4 += 'adherent_prof_ecole3_cp, '; + sql4 += 'adherent_prof_ecole3_ville, '; + sql4 += 'adherent_prof_ecole3_region'; + sql4 += ') VALUES ('; + sql4 += '"'+ now +'",'; + sql4 += '"2025/2026",'; + sql4 += '"'+ req.session.identifiant +'",'; + sql4 += '"AFPS",'; + sql4 += '"'+ req.session.adherent_nom +'",'; + sql4 += '"'+ req.session.adherent_prenom +'",'; + sql4 += '"'+ req.session.identifiant +'",'; + sql4 += '"'+ req.session.adherent_telephone_mobile +'",'; + sql4 += '"'+ req.session.adherent_prof_instrument1 +'",'; + sql4 += '"'+ req.session.adherent_prof_instrument1_esa +'",'; + sql4 += '"'+ req.session.adherent_prof_instrument2 +'",'; + sql4 += '"'+ req.session.adherent_prof_instrument2_esa +'",'; + sql4 += '"'+ req.session.adherent_prof_sece +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole1 +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole1_mail +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole1_web +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole1_adresse +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole1_cp +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole1_ville +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole1_region +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole2 +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole2_mail +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole2_web +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole2_adresse +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole2_cp +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole2_ville +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole2_region +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole3 +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole3_mail +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole3_web +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole3_adresse +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole3_cp +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole3_ville +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole3_region +'"'; + sql4 += ')'; + logger.info("REQUETE SQL INSERT INTO adherent_professeur : " + sql4, { numsession: req.session.id, label: filename}); + + try { + // AJOUTER UNE LIGNE DANS LA TABLE adherent_professeur + const [results, fields] = await db_connection_promise.execute(sql4); + logger.info("PROFESSEUR Row ID added : " + results.insertId, { numsession: req.session.id, label: filename}); + } catch (error) { + // Echec de la requête + console.log(error); + logger.error("Il y a un problème avec la requête INSERT INTO adherent_professeur! : " + error, { numsession: req.session.id }); + req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; + // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur + await db_connection_promise.end(); + res.redirect('/adhesion'); + } + } + + // AJOUTER LE PROFESSEUR EN FORMATION DANS LA TABLE adherent_formation_prof + if (req.session.adherent_prof_stagiaire_instrument1) { + let sql5 = 'INSERT INTO '; + sql5 += 'adherent_formation_prof'; + sql5 += ' ('; + sql5 += 'date_maj, '; + sql5 += 'saison, '; + sql5 += 'identifiant, '; + sql5 += 'association_suzuki, '; + sql5 += 'adherent_nom, '; + sql5 += 'adherent_prenom, '; + sql5 += 'adherent_mail, '; + sql5 += 'adherent_telephone_mobile, '; + sql5 += 'adherent_prof_stagiaire_instrument1, '; + sql5 += 'adherent_prof_stagiaire_instrument1_esa, '; + sql5 += 'adherent_prof_stagiaire_instrument1_prof, '; + sql5 += 'adherent_prof_stagiaire_instrument2, '; + sql5 += 'adherent_prof_stagiaire_instrument2_esa, '; + sql5 += 'adherent_prof_stagiaire_instrument2_prof'; + sql5 += ') VALUES ('; + sql5 += '"'+ now +'",'; + sql5 += '"2025/2026",'; + sql5 += '"'+ req.session.identifiant +'",'; + sql5 += '"AFPS",'; + sql5 += '"'+ req.session.adherent_nom +'",'; + sql5 += '"'+ req.session.adherent_prenom +'",'; + sql5 += '"'+ req.session.identifiant +'",'; + sql5 += '"'+ req.session.adherent_telephone_mobile +'",'; + sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument1 +'",'; + sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument1_esa +'",'; + sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument1_prof +'",'; + sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument2 +'",'; + sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument2_esa +'",'; + if (req.session.adherent_prof_stagiaire_instrument2_prof==undefined) {req.session.adherent_prof_stagiaire_instrument2_prof = ""}; + sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument2_prof +'"'; + sql5 += ')'; + logger.info("====== REQUETE SQL INSERT INTO adherent_formation_prof : ", { numsession: req.session.id, label: filename}); + logger.info(sql5, { numsession: req.session.id, label: filename}); + logger.info("=========================================================", { numsession: req.session.id, label: filename}); + + try { + // AJOUTER UNE LIGNE DANS LA TABLE adherent_professeur + const [results, fields] = await db_connection_promise.execute(sql5); + logger.info("PROFESSEUR EN FORMATION Row ID added : " + results.insertId, { numsession: req.session.id, label: filename}); + } catch (error) { + // Echec de la requête + console.log(error); + logger.error("Il y a un problème avec la requête INSERT INTO adherent_formation_prof! : " + error, { numsession: req.session.id }); + req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; + // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur + await db_connection_promise.end(); + res.redirect('/adhesion'); + } + } + - ////////////////////////////////////////////////////////////////////////////// - // MISE À JOUR DES INFORMATIONS SUR LE PAIEMENT DANS LA BASE DE DONNÉES GSHEET - await doc.useServiceAccountAuth(creds); - await doc.loadInfo(); // loads document properties and worksheets - const sheet = doc.sheetsByTitle['adhesion_annuelle_web']; - // on récupère le contenu de la GSheet dans un array nommé "rows" - const rows = await sheet.getRows(); - // on récupère quelle ligne contient l'identifiant concerné pour mettre à jour cette ligne - let lesmails = new Array; - let compteur = sheet.rowCount - 1; - let rowToBeUpdate; - for (let i=0; i 0) { - description += " Nous vous remercions de votre proposition de don de "; - description += req.session.adherent_paiement_montant_don; - description += " euros que vous pouvez ajouter à votre règlement."; - }; - - var membres = [ - { - today: today, - description: description, - identifiant: req.session.identifiant, - profil1: profil1, - profil2: profil2, - profil3: profil3, - type_card: "TEMPORAIRE", - adherent_paiement_mode: "Adhésion en attente de paiement par virement" - }, - ]; - - //var pdfname = "/home/cghdxfq/aduzuki/pdf/adhesion/2223/attente/" - ///home/cghdxfq/aduzuki/ - - //var pdfname = "/Users/julie/Documents/GitHub/aduzuki/pdf/adhesion/2223/attente/"; - var pdfname = path.resolve(__dirname, "../pdf/adhesion/2223/attente/"); - pdfname += "/"; - pdfname += req.session.identifiant; - pdfname += "_adhesion_2223_attente.pdf"; - console.log("pdfname = ",pdfname); - - var document = { - html: html, - data: { - membres: membres, - }, - path: pdfname, - type: "" + } catch (error) { + // Echec de la requête + console.log(error); + logger.error("Il y a un problème avec la requête select identifiant from adherent! : " + error, { numsession: req.session.id }); + req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; + // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur + await db_connection_promise.end(); + res.redirect('/adhesion'); }; - await pdf - .create(document, options) - .then((res) => { - console.log(res); - }) - .catch((error) => { - logger.info("error" + error, { numsession: req.session.id }); - }); - console.log("PDF CREATION APRES"); - ////////////////////////////////////////////////////////////////////////////// - // ENVOIE CARTE ADHERENT TEMPORAIRE PAR MAIL - console.log("MAIL ENVOI AVANT"); - var transporter = nodemailer.createTransport({ - service: 'gmail', - auth: { - // TEST JULIE - //user: 'juliechaumard@gmail.com', - //pass: 'etfq umof iwbx ltxk' - // SUZUKI - user: 'afpedagogiesuzuki@gmail.com', - pass: 'tlxx kjwx ahyx irnl' - } - }); - var attachment_name = req.session.identifiant; - attachment_name += "_adhesion_2223_carteadherent.pdf"; - - var mail_objet = "ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI- ADHÉSION 2022/2023 - "; - mail_objet += req.session.adherent_nom; + // METTRE À JOUR LES INFOS DE PAIEMENT DANS adherent_finance + let sql6 = 'INSERT INTO '; + sql6 += 'adherent_finance'; + sql6 += ' ('; + sql6 += 'date_maj, '; + sql6 += 'saison, '; + sql6 += 'identifiant, '; + sql6 += 'association_suzuki, '; + sql6 += 'adherent_type, '; + sql6 += 'adherent_nom, '; + sql6 += 'adherent_prenom, '; + sql6 += 'adherent_telephone_mobile, '; + sql6 += 'adherent_mail, '; + sql6 += 'montant_adhesion, '; + sql6 += 'montant_don, '; + sql6 += 'montant_total, '; + sql6 += 'paiement_mode, '; + sql6 += 'statut_paiement'; + sql6 += ') VALUES ('; + sql6 += '"'+ now +'",'; + sql6 += '"2025/2026",'; + sql6 += '"'+ req.session.identifiant +'",'; + sql6 += '"AFPS",'; + sql6 += '"'+ adherent_type +'",'; + sql6 += '"'+ req.session.adherent_nom +'",'; + sql6 += '"'+ req.session.adherent_prenom +'",'; + sql6 += '"'+ req.session.adherent_telephone_mobile +'",'; + sql6 += '"'+ req.session.identifiant +'",'; + if (req.session.adherent_paiement_montant_adhesion == "" || req.session.adherent_paiement_montant_adhesion == "undefined" || !req.session.adherent_paiement_montant_adhesion) {req.session.adherent_paiement_montant_adhesion = 0}; + sql6 += '"'+ req.session.adherent_paiement_montant_adhesion +'",'; + if (req.session.adherent_paiement_montant_don == "" || req.session.adherent_paiement_montant_don == "undefined" || !req.session.adherent_paiement_montant_don) {req.session.adherent_paiement_montant_don = 0}; + sql6 += '"'+ req.session.adherent_paiement_montant_don +'",'; + if (req.session.montant_apayer == "" || req.session.montant_apayer == "undefined" || !req.session.montant_apayer) {req.session.montant_apayer = 0}; + sql6 += '"'+ req.session.montant_apayer +'",'; + sql6 += '"virement",'; + sql6 += '"attente"'; + sql6 += ')'; - mail_html = "

Cher adhérent,

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

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

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

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


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

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

"; + logger.info("REQUETE SQL UPDATE adherent_finance : " + sql6 , { numsession: req.session.id, label: filename}); - var mailOptions = { - from: 'afpedagogiesuzuki@gmail.com', + try { + // METTRE À JOUR LES INFOS DE PAIEMENT DANS adherent_finance + const [results, fields] = await db_connection_promise.execute(sql6); + logger.info("adherent_finance Row ID added : " + results.insertId, { numsession: req.session.id, label: filename}); + + + } catch (error) { + // Echec de la requête + console.log(error); + logger.error("Il y a un problème avec la requête INSERT INTO adherent_finance! : " + error, { numsession: req.session.id }); + req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; + // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur + await db_connection_promise.end(); + res.redirect('/adhesion'); + } + + } catch (error) { + // Echec de connection à la BD + logger.error("Il y a un problème avec la connection à la base de données! : " + error, { numsession: req.session.id }); + req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; + // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur + await db_connection_promise.end(); + res.redirect('/adhesion'); + }; + + } else { + // les Infos de session ne sont plus dispo + logger.info("les Infos de session ne sont plus dispo! : ", { numsession: req.session.id }); + req.session.err_mail_form_adhesion_1 = "La session a expiré."; + req.session.err_mail_form_adhesion_2 = "Si vous n'aviez pas pu finaliser votre paiement veuillez nous envoyer un chèque ou un virement."; + req.session.err_mail_form_adhesion_3 = "Pour tout problème veuillez contacter l’Association."; + // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur + res.redirect('/adhesion'); + } + + + ////////////////////////////////////////////////////////////////////////////// + // ADOBE PDF : CRÉATION DE LA CARTE D'ADHÉSION TEMPORAIRE EN PDF + + let OUTPUT = path.resolve(__dirname, "../pdf/adhesion/2526/attente/")+"/"+req.session.identifiant+"_adhesion_2526_attente_"+now_pdf+".pdf"; + let INPUT = path.resolve(__dirname, "../pdf/template/carte_adherent_temp.docx"); + + + moment.locale('fr'); + var date_formattee = moment().format('L') + var today = date_formattee; + + if (profil2 == undefined) {profil2 = " "}; + if (profil3 == undefined) {profil3 = " "}; + + JSON_INPUT = + { + "date": today, + "identifiant": req.session.identifiant, + "profil1": profil1, + "profil2": profil2, + "profil3": profil3, + "montant": req.session.adherent_paiement_montant_adhesion + }; + + const documentMerge = PDFServicesSdk.DocumentMerge, + documentMergeOptions = documentMerge.options, + adobe_options = new documentMergeOptions.DocumentMergeOptions(JSON_INPUT, documentMergeOptions.OutputFormat.PDF); + + // Create a new operation instance using the options instance. + const documentMergeOperation = documentMerge.Operation.createNew(adobe_options); + + // Set operation input document template from a source file. + const input = PDFServicesSdk.FileRef.createFromLocalFile(INPUT); + documentMergeOperation.setInput(input); + + // Execute the operation and Save the result to the specified location. + await documentMergeOperation + .execute(executionContext) + .then(result => result.saveAsFile(OUTPUT).then( + ) + ) + .catch(err => { + if(err instanceof PDFServicesSdk.Error.ServiceApiError + || err instanceof PDFServicesSdk.Error.ServiceUsageError) { + console.log('Exception encountered while executing ADOBE PDF', err); + } else { + console.log('Exception encountered while executing ADOBE PDF', err); + } + }); + + ////////////////////////////////////////////////////////////////////////////// + // ENVOIE CARTE ADHERENT TEMPORAIRE PAR MAIL + + console.log("MAIL ENVOI AVANT"); + var transporter = nodemailer.createTransport({ + service: 'gmail', + auth: { + user: process.env.nodemailer_user, + pass: process.env.nodemailer_pass + } + }); + + var attachment_name = req.session.identifiant; + attachment_name += "_adhesion_2526_carteadherent_temporaire.pdf"; + + var mail_objet = "ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI- ADHÉSION 2025/2026 - "; + mail_objet += req.session.identifiant; + + mail_html = "

Cher adhérent,

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

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

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

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


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

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

"; + + var mailOptions = { + from: 'afps.inscription@gmail.com', to: req.session.identifiant, subject: mail_objet, html: mail_html, attachments: [{ filename: attachment_name, - path: pdfname + path: OUTPUT }], - }; + }; - transporter.sendMail(mailOptions, function(error, info){ - if (error) { - logger.info("error" + error, { numsession: req.session.id }); - } else { - console.log('Email sent: ' + info.response); - } - }); - console.log("MAIL ENVOI APRES"); + transporter.sendMail(mailOptions, function(error, info){ + if (error) { + logger.info("error" + error, { numsession: req.session.id }); + } else { + console.log('Email sent: ' + info.response); + } + }); + console.log("MAIL ENVOI APRES"); - ////////////////////////////////////////////////////////////////////////////// - // REDIRECTION VERS LA PAGE DE CONFIRMATION PAIEMENT VIREMENT - res.redirect('/inscription/adhesion_paiement/attente'); + ////////////////////////////////////////////////////////////////////////////// + // REDIRECTION VERS LA PAGE DE CONFIRMATION PAIEMENT VIREMENT + res.locals.today = date_formattee; + res.redirect('/adhesion/adhesion_paiement/attente'); } ///////////////////////////////////////////////// -// REQUÈTE VERS LA SOLUTION DE PAIEMENT STRIPE +// REQUÈTE VERS LE PAIEMENT STRIPE +// OUVERTURE SESSION STRIPE ///////////////////////////////////////////////// +const post_req_bank = async function(req, res, next) { -const post_req_bank = async function(req, res, next){ + logger.info("======================================"); + logger.info("======== FUNCTION post_req_bank (adhesion) =========="); + logger.info("======================================"); - logger.info("======================================"); - logger.info("======== FUNCTION post_req_bank =========="); - logger.info("======================================"); + ///////////////////////////////////////////////// + // DATE DE L'ADHÉSION + let now = moment().format("YYYY-MM-DD HH:mm:ss"); - logger.info("req.session.montant_apayer_cent: " + req.session.montant_apayer_cent, { numsession: req.session.id }); - logger.info("req.session.identifiant : " + req.session.identifiant, { numsession: req.session.id }); - console.log ("req.session.adherent_type: ",req.session.adherent_type); - logger.info("process.env.STRIPE_PRIVATE_KEY : " + process.env.STRIPE_PRIVATE_KEY, { numsession: req.session.id }); - - // STRIPE - ETAPE 1 - CREER l'INTENTION DE PAIEMENT - const session = await stripe.checkout.sessions.create({ - metadata: {identifiant: req.session.identifiant, profil:req.session.adherent_type, adherent_paiement_montant_adhesion:adherent_paiement_montant_adhesion, adherent_paiement_montant_don:req.session.adherent_paiement_montant_don, adherent_nom:req.session.adherent_nom, adherent_prenom:req.session.adherent_prenom, adherent_adresse_rue:req.session.adherent_adresse_rue, adherent_adresse_codepostal:req.session.adherent_adresse_codepostal, adherent_adresse_ville:req.session.adherent_adresse_ville,}, - customer_email: req.session.identifiant, + logger.info("req.session.montant_apayer_cent: " + req.session.montant_apayer_cent, { numsession: req.session.id }); + logger.info("req.session.identifiant : " + req.session.identifiant, { numsession: req.session.id }); + logger.info("req.session.adherent_type : " + req.session.adherent_type, { numsession: req.session.id }); + + ///////////////////////////////////////////////// + // STRIPE - ETAPE 1 - CREER l'INTENTION DE PAIEMENT - submit_type: 'pay', + const session = await stripe.checkout.sessions.create({ + metadata: {identifiant: req.session.identifiant, profil:req.session.adherent_type, adherent_paiement_montant_adhesion:adherent_paiement_montant_adhesion, adherent_paiement_montant_don:req.session.adherent_paiement_montant_don, adherent_nom:req.session.adherent_nom, adherent_prenom:req.session.adherent_prenom, adherent_adresse_rue:req.session.adherent_adresse_rue, adherent_adresse_codepostal:req.session.adherent_adresse_codepostal, adherent_adresse_ville:req.session.adherent_adresse_ville,}, + customer_email: req.session.identifiant, - success_url: process.env.STRIPE_SUCCESSURL, - cancel_url: process.env.STRIPE_CANCELURL, + submit_type: 'pay', + success_url: process.env.STRIPE_SUCCESSURL, + cancel_url: process.env.STRIPE_CANCELURL, - payment_method_types: ['card'], - line_items: [{ - price_data: { - currency: 'eur', - product_data: { - name: 'Adhesion annuelle ' + req.session.adherent_type, - }, - unit_amount: req.session.adherent_paiement_montant_adhesion * 100, - }, - quantity: 1, + payment_method_types: ['card'], + line_items: [{ + price_data: { + currency: 'eur', + product_data: { + name: 'Adhesion annuelle ' + req.session.adherent_type, }, - { - price_data: { - currency: 'eur', - product_data: { - name: 'Don', - }, - unit_amount: req.session.adherent_paiement_montant_don * 100, - }, - quantity: 1, - }], - //Checkout has three modes: payment, subscription, or setup. - mode: 'payment' - - }); - - - // STRIPE - ETAPE 2 - RÉCUPÉRATION DES DONNÉES DE LA SESSION ET ENVOYER LE PAIEMENT - - // DANS LES INFOS DE LA SESSION ON A l'URL DE PAIEMENT POUR CETTE SESSION AVEC LE ID DE CE PAIEMENT - // POUR RÉCUPÉRER LES INFOS DE SESSION ON UTILISE "session.[nom de la données]" - console.log("session: ",session) - console.log("session.id: ",session.id); - logger.info("session.url: " + session.url, { numsession: req.session.id }); - + unit_amount: req.session.adherent_paiement_montant_adhesion * 100, + }, + quantity: 1, + }, + { + price_data: { + currency: 'eur', + product_data: { + name: 'Don', + }, + unit_amount: req.session.adherent_paiement_montant_don * 100, + }, + quantity: 1, + }], + //Checkout has three modes: payment, subscription, or setup. + mode: 'payment' - // ON REDIRIGE L'INTERNAUTE VERS L'URL STRIPE POUR QU'IL FASSE LE PAIEMENT - // POUR LE RETOUR C'EST DANS LES URL success_url et cancel_url sur lesquelles on fait un get dans le js du router et on fait un script - // pour continuer le process et récupérer les infos contenues dans le get et envoyé par Stripe, comme par ex le code retour de la banque - - - - - - ////////////////////////////////////////////////////////////////////////////// - // MISE À JOUR DES INFORMATIONS SUR LE PAIEMENT DANS LA BASE DE DONNÉES GSHEET - await doc.useServiceAccountAuth(creds); - await doc.loadInfo(); // loads document properties and worksheets - const sheet = doc.sheetsByTitle['adhesion_annuelle_web']; - - // on récupère le contenu de la GSheet dans un array nommé "rows" - const rows = await sheet.getRows(); - // on récupère quelle ligne contient l'identifiant concerné pour mettre à jour cette ligne - let lesmails = new Array; - let compteur = sheet.rowCount - 1; - let rowToBeUpdate; - for (let i=0; i AJOUTER UNE LIGNE DANS LA TABLE", { numsession: req.session.id, label: filename}); + let sql2 = 'INSERT INTO '; + sql2 += 'adherent'; + sql2 += ' ('; + sql2 += 'date_maj, '; + sql2 += 'saison, '; + sql2 += 'identifiant, '; + sql2 += 'association_suzuki, '; + sql2 += 'adherent_type, '; + sql2 += 'adherent_nom, '; + sql2 += 'adherent_prenom, '; + sql2 += 'adherent_mail, '; + sql2 += 'adherent_adresse_rue, '; + sql2 += 'adherent_adresse_complement, '; + sql2 += 'adherent_adresse_codepostal, '; + sql2 += 'adherent_adresse_ville, '; + sql2 += 'adherent_adresse_pays, '; + sql2 += 'adherent_telephone_mobile, '; + sql2 += 'adherent_telephone_fixe'; + sql2 += ') VALUES ('; + sql2 += '"'+ now +'",'; + sql2 += '"2025/2026",'; + sql2 += '"'+ req.session.identifiant +'",'; + sql2 += '"AFPS",'; + sql2 += '"'+ adherent_type +'",'; + sql2 += '"'+ req.session.adherent_nom +'",'; + sql2 += '"'+ req.session.adherent_prenom +'",'; + sql2 += '"'+ req.session.identifiant +'",'; + sql2 += '"'+ req.session.adherent_adresse_rue +'",'; + sql2 += '"'+ req.session.adherent_adresse_complement +'",'; + sql2 += '"'+ req.session.adherent_adresse_codepostal +'",'; + sql2 += '"'+ req.session.adherent_adresse_ville +'",'; + sql2 += '"'+ req.session.adherent_adresse_pays +'",'; + sql2 += '"'+ req.session.adherent_telephone_mobile +'",'; + sql2 += '"'+ req.session.adherent_telephone_fixe +'"'; + sql2 += ')'; + logger.info("REQUETE SQL INSERT INTO adherent : " + sql2 , { numsession: req.session.id, label: filename}); + + // AJOUTER L'ADHÉRENT DANS LA TABLE adherent + try { + // AJOUTER UNE LIGNE DANS LA TABLE adhrent + const [results, fields] = await db_connection_promise.execute(sql2); + logger.info("ADHÉRENTS Row ID added : " + results.insertId, { numsession: req.session.id, label: filename}); + + } catch (error) { + // Echec de la requête + console.log(error); + logger.error("Il y a un problème avec la requête INSERT INTO adherent! : " + error, { numsession: req.session.id }); + req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; + // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur + await db_connection_promise.end(); + res.redirect('/adhesion'); } + + // AJOUTER LES ÉLÈVES DANS LA TABLE adherent_eleve + for (let i=1; i<6; i++) { + if (req.session["eleve_"+i+"_nom"]) { + let sql3 = 'INSERT INTO '; + sql3 += 'adherent_eleve'; + sql3 += ' ('; + sql3 += 'date_maj, '; + sql3 += 'saison, '; + sql3 += 'identifiant, '; + sql3 += 'association_suzuki, '; + sql3 += 'eleve_nom, '; + sql3 += 'eleve_prenom, '; + sql3 += 'adherent_mail, '; + sql3 += 'adherent_telephone_mobile, '; + sql3 += 'eleve_datenaissance, '; + sql3 += 'eleve_instrumentA, '; + sql3 += 'eleve_instrumentA_cahier, '; + sql3 += 'eleve_instrumentA_prof, '; + sql3 += 'eleve_instrumentB, '; + sql3 += 'eleve_instrumentB_cahier, '; + sql3 += 'eleve_instrumentB_prof, '; + sql3 += 'eleve_droitimage, '; + sql3 += 'eleve_contactsup_nom, '; + sql3 += 'eleve_contactsup_prenom, '; + sql3 += 'eleve_contactsup_mail'; + sql3 += ') VALUES ('; + sql3 += '"'+ now +'",'; + sql3 += '"2025/2026",'; + sql3 += '"'+ req.session.identifiant +'",'; + sql3 += '"AFPS",'; + sql3 += '"'+ req.session["eleve_"+i+"_nom"] +'",'; + sql3 += '"'+ req.session["eleve_"+i+"_prenom"] +'",'; + sql3 += '"'+ req.session.identifiant +'",'; + sql3 += '"'+ req.session.adherent_telephone_mobile +'",'; + sql3 += '"'+ req.session["eleve_"+i+"_datenaissance"] +'",'; + sql3 += '"'+ req.session["eleve_"+i+"_instrumentA"] +'",'; + sql3 += '"'+ req.session["eleve_"+i+"_instrumentA_cahier"] +'",'; + sql3 += '"'+ req.session["eleve_"+i+"_instrumentA_prof"] +'",'; + sql3 += '"'+ req.session["eleve_"+i+"_instrumentB"] +'",'; + sql3 += '"'+ req.session["eleve_"+i+"_instrumentB_cahier"] +'",'; + if (req.session["eleve_"+i+"_instrumentB_prof"]==undefined){req.session["eleve_"+i+"_instrumentB_prof"]=""}; + sql3 += '"'+ req.session["eleve_"+i+"_instrumentB_prof"] +'",'; + sql3 += '"'+ req.session["eleve_"+i+"_droitimage"] +'",'; + sql3 += '"'+ req.session["eleve_"+i+"_contactsup_nom"] +'",'; + sql3 += '"'+ req.session["eleve_"+i+"_contactsup_prenom"] +'",'; + sql3 += '"'+ req.session["eleve_"+i+"_contactsup_mail"] +'"'; + sql3 += ')'; + logger.info("REQUETE SQL INSERT INTO adherent_eleve : " + sql3, { numsession: req.session.id, label: filename}); + + try { + const [results, fields] = await db_connection_promise.execute(sql3); + logger.info("ADHÉRENTS Row ID added : " + results.insertId, { numsession: req.session.id, label: filename}); + + } catch (error) { + // Echec de la requête + console.log(error); + logger.error("Il y a un problème avec la requête INSERT INTO adherent_eleve! : " + error, { numsession: req.session.id }); + req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; + // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur + await db_connection_promise.end(); + res.redirect('/adhesion'); + } + } + } + + // AJOUTER LE PROFESSEUR DANS LA TABLE adherent_professeur + if (req.session.adherent_prof_instrument1) { + let sql4 = 'INSERT INTO '; + sql4 += 'adherent_professeur'; + sql4 += ' ('; + sql4 += 'date_maj, '; + sql4 += 'saison, '; + sql4 += 'identifiant, '; + sql4 += 'association_suzuki, '; + sql4 += 'adherent_nom, '; + sql4 += 'adherent_prenom, '; + sql4 += 'adherent_mail, '; + sql4 += 'adherent_telephone_mobile, '; + sql4 += 'adherent_prof_instrument1, '; + sql4 += 'adherent_prof_instrument1_esa, '; + sql4 += 'adherent_prof_instrument2, '; + sql4 += 'adherent_prof_instrument2_esa, '; + sql4 += 'adherent_prof_sece, '; + sql4 += 'adherent_prof_ecole1, '; + sql4 += 'adherent_prof_ecole1_mail, '; + sql4 += 'adherent_prof_ecole1_web, '; + sql4 += 'adherent_prof_ecole1_adresse, '; + sql4 += 'adherent_prof_ecole1_cp, '; + sql4 += 'adherent_prof_ecole1_ville, '; + sql4 += 'adherent_prof_ecole1_region, '; + sql4 += 'adherent_prof_ecole2, '; + sql4 += 'adherent_prof_ecole2_mail, '; + sql4 += 'adherent_prof_ecole2_web, '; + sql4 += 'adherent_prof_ecole2_adresse, '; + sql4 += 'adherent_prof_ecole2_cp, '; + sql4 += 'adherent_prof_ecole2_ville, '; + sql4 += 'adherent_prof_ecole2_region, '; + sql4 += 'adherent_prof_ecole3, '; + sql4 += 'adherent_prof_ecole3_mail, '; + sql4 += 'adherent_prof_ecole3_web, '; + sql4 += 'adherent_prof_ecole3_adresse, '; + sql4 += 'adherent_prof_ecole3_cp, '; + sql4 += 'adherent_prof_ecole3_ville, '; + sql4 += 'adherent_prof_ecole3_region'; + sql4 += ') VALUES ('; + sql4 += '"'+ now +'",'; + sql4 += '"2025/2026",'; + sql4 += '"'+ req.session.identifiant +'",'; + sql4 += '"AFPS",'; + sql4 += '"'+ req.session.adherent_nom +'",'; + sql4 += '"'+ req.session.adherent_prenom +'",'; + sql4 += '"'+ req.session.identifiant +'",'; + sql4 += '"'+ req.session.adherent_telephone_mobile +'",'; + sql4 += '"'+ req.session.adherent_prof_instrument1 +'",'; + sql4 += '"'+ req.session.adherent_prof_instrument1_esa +'",'; + sql4 += '"'+ req.session.adherent_prof_instrument2 +'",'; + sql4 += '"'+ req.session.adherent_prof_instrument2_esa +'",'; + sql4 += '"'+ req.session.adherent_prof_sece +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole1 +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole1_mail +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole1_web +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole1_adresse +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole1_cp +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole1_ville +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole1_region +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole2 +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole2_mail +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole2_web +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole2_adresse +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole2_cp +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole2_ville +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole2_region +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole3 +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole3_mail +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole3_web +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole3_adresse +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole3_cp +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole3_ville +'",'; + sql4 += '"'+ req.session.adherent_prof_ecole3_region +'"'; + sql4 += ')'; + logger.info("REQUETE SQL INSERT INTO adherent_professeur : " + sql4, { numsession: req.session.id, label: filename}); + + try { + // AJOUTER UNE LIGNE DANS LA TABLE adherent_professeur + const [results, fields] = await db_connection_promise.execute(sql4); + logger.info("PROFESSEUR Row ID added : " + results.insertId, { numsession: req.session.id, label: filename}); + } catch (error) { + // Echec de la requête + console.log(error); + logger.error("Il y a un problème avec la requête INSERT INTO adherent_professeur! : " + error, { numsession: req.session.id }); + req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; + // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur + await db_connection_promise.end(); + res.redirect('/adhesion'); + } + } + + // AJOUTER LE PROFESSEUR EN FORMATION DANS LA TABLE adherent_formation_prof + if (req.session.adherent_prof_stagiaire_instrument1) { + let sql5 = 'INSERT INTO '; + sql5 += 'adherent_formation_prof'; + sql5 += ' ('; + sql5 += 'date_maj, '; + sql5 += 'saison, '; + sql5 += 'identifiant, '; + sql5 += 'association_suzuki, '; + sql5 += 'adherent_nom, '; + sql5 += 'adherent_prenom, '; + sql5 += 'adherent_mail, '; + sql5 += 'adherent_telephone_mobile, '; + sql5 += 'adherent_prof_stagiaire_instrument1, '; + sql5 += 'adherent_prof_stagiaire_instrument1_esa, '; + sql5 += 'adherent_prof_stagiaire_instrument1_prof, '; + sql5 += 'adherent_prof_stagiaire_instrument2, '; + sql5 += 'adherent_prof_stagiaire_instrument2_esa, '; + sql5 += 'adherent_prof_stagiaire_instrument2_prof'; + sql5 += ') VALUES ('; + sql5 += '"'+ now +'",'; + sql5 += '"2025/2026",'; + sql5 += '"'+ req.session.identifiant +'",'; + sql5 += '"AFPS",'; + sql5 += '"'+ req.session.adherent_nom +'",'; + sql5 += '"'+ req.session.adherent_prenom +'",'; + sql5 += '"'+ req.session.identifiant +'",'; + sql5 += '"'+ req.session.adherent_telephone_mobile +'",'; + sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument1 +'",'; + sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument1_esa +'",'; + sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument1_prof +'",'; + sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument2 +'",'; + sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument2_esa +'",'; + if (req.session.adherent_prof_stagiaire_instrument2_prof==undefined) {req.session.adherent_prof_stagiaire_instrument2_prof = ""}; + sql5 += '"'+ req.session.adherent_prof_stagiaire_instrument2_prof +'"'; + sql5 += ')'; + logger.info("====== REQUETE SQL INSERT INTO adherent_formation_prof : ", { numsession: req.session.id, label: filename}); + logger.info(sql5, { numsession: req.session.id, label: filename}); + logger.info("=========================================================", { numsession: req.session.id, label: filename}); + + try { + // AJOUTER UNE LIGNE DANS LA TABLE adherent_professeur + const [results, fields] = await db_connection_promise.execute(sql5); + logger.info("PROFESSEUR EN FORMATION Row ID added : " + results.insertId, { numsession: req.session.id, label: filename}); + } catch (error) { + // Echec de la requête + console.log(error); + logger.error("Il y a un problème avec la requête INSERT INTO adherent_formation_prof! : " + error, { numsession: req.session.id }); + req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; + // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur + await db_connection_promise.end(); + res.redirect('/adhesion'); + } + } + } + + } catch (error) { + // Echec de la requête + console.log(error); + logger.error("Il y a un problème avec la requête select identifiant from adherent! : " + error, { numsession: req.session.id }); + req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; + // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur + await db_connection_promise.end(); + res.redirect('/adhesion'); + }; + + // AJOUTER UNE LIGNE DANS LA TABLE adherent_finance + let sql6 = 'INSERT INTO '; + sql6 += 'adherent_finance'; + sql6 += ' ('; + sql6 += 'date_maj, '; + sql6 += 'saison, '; + sql6 += 'identifiant, '; + sql6 += 'association_suzuki, '; + sql6 += 'adherent_type, '; + sql6 += 'adherent_nom, '; + sql6 += 'adherent_prenom, '; + sql6 += 'adherent_telephone_mobile, '; + sql6 += 'adherent_mail, '; + sql6 += 'montant_adhesion, '; + sql6 += 'montant_don, '; + sql6 += 'montant_total, '; + sql6 += 'paiement_mode'; + sql6 += ') VALUES ('; + sql6 += '"'+ now +'",'; + sql6 += '"2025/2026",'; + sql6 += '"'+ req.session.identifiant +'",'; + sql6 += '"AFPS",'; + sql6 += '"'+ adherent_type +'",'; + sql6 += '"'+ req.session.adherent_nom +'",'; + sql6 += '"'+ req.session.adherent_prenom +'",'; + sql6 += '"'+ req.session.adherent_telephone_mobile +'",'; + sql6 += '"'+ req.session.identifiant +'",'; + if (req.session.adherent_paiement_montant_adhesion == "" || req.session.adherent_paiement_montant_adhesion == "undefined" || !req.session.adherent_paiement_montant_adhesion) {req.session.adherent_paiement_montant_adhesion = 0}; + sql6 += '"'+ req.session.adherent_paiement_montant_adhesion +'",'; + if (req.session.adherent_paiement_montant_don == "" || req.session.adherent_paiement_montant_don == "undefined" || !req.session.adherent_paiement_montant_don) {req.session.adherent_paiement_montant_don = 0}; + sql6 += '"'+ req.session.adherent_paiement_montant_don +'",'; + if (req.session.montant_apayer == "" || req.session.montant_apayer == "undefined" || !req.session.montant_apayer) {req.session.montant_apayer = 0}; + sql6 += '"'+ req.session.montant_apayer +'",'; + sql6 += '"carte bancaire"'; + sql6 += ')'; + logger.info("REQUETE SQL INSERT INTO adherent : " + sql6, { numsession: req.session.id, label: filename}); + + try { + // AJOUTER UNE LIGNE DANS LA TABLE adherent_finance + const [results, fields] = await db_connection_promise.execute(sql6); + logger.info("adherent_finance Row ID added : " + results.insertId, { numsession: req.session.id, label: filename}); + + ///////////////////////////////////////////////// + // REDIRECTION VERS LA PAGE DE PAIEMENT STRIPE + + //let url_stripe = session.url + logger.info("Stripe session.url : " + session.url, { numsession: req.session.id, label: filename}); + await db_connection_promise.end(); + res.redirect(session.url) + + } catch (error) { + // Echec de la requête + console.log(error); + logger.error("Il y a un problème avec la requête INSERT INTO adherent_finance! : " + error, { numsession: req.session.id }); + req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; + // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur + await db_connection_promise.end(); + res.redirect('/adhesion'); } - - rows[rowToBeUpdate].adherent_paiement_montant_don = req.session.adherent_paiement_montant_don; - rows[rowToBeUpdate].adherent_paiement_montant_total = req.session.montant_apayer; - rows[rowToBeUpdate].adherent_paiement_mode = "carte bancaire"; - - await rows[rowToBeUpdate].save(); - - - - - - - let url_stripe = session.url - - 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! : " + error, { numsession: req.session.id }); + req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; + // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur + res.redirect('/adhesion'); + }; + + } else { + // les Infos de session ne sont plus dispo + logger.info("les Infos de session ne sont plus dispo! : ", { numsession: req.session.id }); + req.session.err_mail_form_adhesion_1 = "La session a expiré."; + req.session.err_mail_form_adhesion_2 = "Si vous n'aviez pas pu finaliser votre paiement veuillez nous envoyer un chèque ou un virement."; + req.session.err_mail_form_adhesion_3 = "Pour tout problème veuillez contacter l’Association."; + // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur + res.redirect('/adhesion'); } + +} ///////////////////////////////////////////////// // RETOUR STRIPE CARTE BANCAIRE PAYÉE ///////////////////////////////////////////////// - const get_res_bank = async function(req, res){ +const get_res_bank = async function(req, res){ - logger.info("======================================"); - logger.info("======== FUNCTION get_res_banq =========="); - logger.info("======================================"); - - var id = req.query.id; - // type = req.params.type; - logger.info("id = " + id, { numsession: req.session.id }); - const session = await stripe.checkout.sessions.retrieve(id); - - console.log("======================================"); - console.log("======== SESSION =========="); - console.log("======================================"); + logger.info("======================================"); + logger.info("======== FUNCTION get_res_banq (adhesion) =========="); + logger.info("======================================"); - - var customer_email = session.customer_email; - var payment_status = session.payment_status; - var amount_total = session.amount_total/100; - var stripe_customer = session.customer; - var stripe_payment_intent = session.payment_intent; - var payment_method_types = session.payment_method_types; - var stripe_status = session.status; + //////////////////////////////////////////////////// + // CONNECTION ADOBE API + //////////////////////////////////////////////////// + const credentials = PDFServicesSdk.Credentials + .servicePrincipalCredentialsBuilder() + .withClientId(process.env.PDF_SERVICES_CLIENT_ID) + .withClientSecret(process.env.PDF_SERVICES_CLIENT_SECRET) + .build(); + //timeout Default: 10000 + const clientConfig = PDFServicesSdk.ClientConfig + .clientConfigBuilder() + .withConnectTimeout(20000) + .withReadTimeout(40000) + .build(); + // Create an ExecutionContext using credentials + const executionContext = PDFServicesSdk.ExecutionContext.create(credentials); - var profil = session.metadata.profil; - var identifiant = session.metadata.identifiant; - var adherent_paiement_montant_don = session.metadata.adherent_paiement_montant_don; - var adherent_paiement_montant_adhesion = session.metadata.adherent_paiement_montant_adhesion; - var adherent_nom = session.metadata.adherent_nom; - var adherent_prenom = session.metadata.adherent_prenom; - var adherent_adresse_rue = session.metadata.adherent_adresse_rue; - var adherent_adresse_codepostal = session.metadata.adherent_adresse_codepostal; - var adherent_adresse_ville = session.metadata.adherent_adresse_ville; - - - ////////////////////////////////////////////////////////////////////////////// - // DÉFINIR LE PROFIL À AJOUTER DANS LA CARTE ADHÉRENT - // La fonction est dans le fichier /modules/adherent_type.js - profils = carte_adherent.profil(adherent_type); - profil1 = profils[0]; - profil2 = profils[1]; - profil3 = profils[2]; - - - - logger.info("customer_email: " + customer_email, { numsession: req.session.id }); - logger.info("payment_status: " + payment_status, { numsession: req.session.id }); - console.log("stripe_customer: ", stripe_customer); - console.log("amount_total: ", amount_total); - console.log("stripe_payment_intent: ", stripe_payment_intent); - console.log("payment_method_types: ", payment_method_types); - console.log("stripe_status: ", stripe_status); - console.log("metadata.profil: ", profil); - - res.locals.customer_email = customer_email; - res.locals.payment_status = payment_status; - res.locals.amount_total = amount_total; - res.locals.stripe_customer = stripe_customer; - res.locals.stripe_payment_intent = stripe_payment_intent; - res.locals.payment_method_types = "carte bancaire"; - res.locals.stripe_status = stripe_status; - res.locals.identifiant = identifiant; - res.locals.profil1 = profil1; - res.locals.profil2 = profil2; - res.locals.profil3 = profil3; - - ////////////////////////////////////////////////////////////////////////////// - // MISE À JOUR DES INFORMATIONS SUR LE PAIEMENT DANS LA BASE DE DONNÉES GSHEET - - await doc.useServiceAccountAuth(creds); - await doc.loadInfo(); // loads document properties and worksheets - const sheet = doc.sheetsByTitle['adhesion_annuelle_web']; - - // on récupère le contenu de la GSheet dans un array nommé "rows" - const rows = await sheet.getRows(); - // on récupère quelle ligne contient l'identifiant concerné pour mettre à jour cette ligne - let lesmails = new Array; - let compteur = sheet.rowCount - 1; - let rowToBeUpdate; - for (let i=0; i { - console.log(res); - logger.info("res : " + res, { numsession: req.session.id }); - }) - .catch((error) => { - console.error(error); - logger.info("error : " + error, { numsession: req.session.id }); - }); - console.log("PDF CREATION APRES"); - - ////////////////////////////////////////////////////////////////////////////// - // CRÉATION DU PDF JUSTIFICATIF DE DON - - if (adherent_paiement_montant_don > 0) { - console.log("IF DON = OUI"); - logger.info("IF DON = OUI", { numsession: req.session.id }); - var html_don = fs.readFileSync(path.resolve(__dirname, "../pdf/template/don_justificatif.html"), "utf8"); - //var html_don = fs.readFileSync("/Users/julie/Documents/GitHub/aduzuki/pdf/template/don_justificatif.html", "utf8"); - var options_don = { - format: "A4", - orientation: "portrait", - border: "10mm", - }; - - var adresse = adherent_adresse_rue; - adresse += " "; - adresse += adherent_adresse_codepostal; - adresse += " "; - adresse += adherent_adresse_ville; - - var donneur = [ - { - today: today, - identifiant: identifiant, - nom: adherent_nom, - prenom: adherent_prenom, - adresse: adresse, - adherent_paiement_mode: "carte bancaire", - montant_don: adherent_paiement_montant_don - }, - ]; - - var pdfname_don = path.resolve(__dirname, "../pdf/adhesion/2223/don/"); - //var pdfname_don = "/Users/julie/Documents/GitHub/aduzuki/pdf/adhesion/2223/payee/"; - pdfname_don += "/"; - pdfname_don += identifiant; - pdfname_don += "_adhesion_2223_don.pdf"; - - var document_don = { - html: html_don, - data: { - donneur: donneur, - }, - path: pdfname_don, - type: "" - }; - - await pdf - .create(document_don, options_don) - .then((res) => { - logger.info("res : " + res, { numsession: req.session.id }); - }) - .catch((error) => { - logger.info("error : " + error, { numsession: req.session.id }); - }); - - } - - ////////////////////////////////////////////////////////////////////////////// - // ENVOIE CARTE ADHERENT + JUSTIFICATIF DE DON PAR MAIL - - console.log("MAIL ENVOI AVANT"); - var transporter = nodemailer.createTransport({ - service: 'gmail', - auth: { - // TEST JULIE - //user: 'juliechaumard@gmail.com', - //pass: 'etfq umof iwbx ltxk' - // SUZUKI - user: 'afpedagogiesuzuki@gmail.com', - pass: 'tlxx kjwx ahyx irnl' - } - }); - - var attachment_name = identifiant; - attachment_name += "_adhesion_2223_carteadherent.pdf"; - var attachment_don_name = identifiant; - attachment_don_name += "_adhesion_2223_don.pdf"; - - var mail_objet = "ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI - ADHÉSION 2022/2023 - "; - mail_objet += adherent_nom; - mail_html = "

Cher adhérent,

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

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

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

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

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

"; - } - mail_html += "


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

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

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

Cher adhérent,

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

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

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

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

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

"; + } + mail_html += "


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

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

"; + + + var mailOptions = { + from: 'afps.inscription@gmail.com', + to: identifiant, + subject: mail_objet, + html: mail_html, + attachments: [{ + filename: attachment_name, + path: OUTPUT + } + ] + }; + + transporter.sendMail(mailOptions, function(error, info){ + if (error) { + logger.info("error : " + error, { numsession: req.session.id }); + } else { + console.log('Email sent: ' + info.response); + } + }); + console.log("MAIL ENVOI APRES"); + + + ////////////////////////////////////////////////////////////////////////////// + // REDIRECTION VERS LA PAGE DE CONFIRMATION PAIEMENT CARTE BANCAIRE + res.locals.today = date_formattee; + res.render('adhesion/page_templates/adhesion_paiement_reussi.ejs'); +} + +///////////////////////////////////////////////// // RETOUR STRIPE CARTE BANCAIRE ANNULÉE OU PROBLÈME ///////////////////////////////////////////////// - const get_res_bank_annul = async function(req, res){ - - logger.info("======================================"); - logger.info("======== FUNCTION get_res_bank_annul =========="); - logger.info("======================================"); - - console.log ("on est dans la ROUTE /adhesion_paiement/annule"); - var id = req.query.id; - // type = req.params.type; - logger.info("id : " + id, { numsession: req.session.id }); - const session = await stripe.checkout.sessions.retrieve(id); - - console.log("======================================"); - console.log("======== SESSION =========="); - console.log("======================================"); - console.info(session); - var customer_email = session.customer_email; - var payment_status = session.payment_status; - var amount_total = session.amount_total/100; - var stripe_customer = session.customer; - var stripe_payment_intent = session.payment_intent; - var payment_method_types = session.payment_method_types; - var stripe_status = session.status; - var profil = session.metadata.profil; - var identifiant = session.metadata.identifiant; +const get_res_bank_annul = async function(req, res){ - var adherent_paiement_montant_don = session.metadata.adherent_paiement_montant_don; - var adherent_paiement_montant_adhesion = session.metadata.adherent_paiement_montant_adhesion; - var adherent_nom = session.metadata.adherent_nom; - var adherent_prenom = session.metadata.adherent_prenom; - var adherent_adresse_rue = session.metadata.adherent_adresse_rue; - var adherent_adresse_codepostal = session.metadata.adherent_adresse_codepostal; - var adherent_adresse_ville = session.metadata.adherent_adresse_ville; - - ////////////////////////////////////////////////////////////////////////////// - // DÉFINIR LE PROFIL À AJOUTER DANS LA CARTE ADHÉRENT - // La fonction est dans le fichier /modules/adherent_type.js - profils = carte_adherent.profil(adherent_type); - profil1 = profils[0]; - profil2 = profils[1]; - profil3 = profils[2]; - - console.log("customer_email: ", customer_email); - logger.info("payment_status : " + payment_status, { numsession: req.session.id }); - console.log("stripe_customer: ", stripe_customer); - console.log("amount_total: ", amount_total); - console.log("stripe_payment_intent: ", stripe_payment_intent); - console.log("payment_method_types: ", payment_method_types); - console.log("stripe_status: ", stripe_status); - console.log("metadata.profil: ", profil); - - res.locals.customer_email = customer_email; - res.locals.payment_status = payment_status; - res.locals.amount_total = amount_total; - res.locals.stripe_customer = stripe_customer; - res.locals.stripe_payment_intent = stripe_payment_intent; - res.locals.payment_method_types = payment_method_types; - res.locals.stripe_status = stripe_status; - res.locals.identifiant = identifiant; - res.locals.profil1 = profil1; - res.locals.profil2 = profil2; - res.locals.profil3 = profil3; - - ////////////////////////////////////////////////////////////////////////////// - // MISE À JOUR DES INFORMATIONS SUR LE PAIEMENT DANS LA BASE DE DONNÉES GSHEET - await doc.useServiceAccountAuth(creds); - await doc.loadInfo(); // loads document properties and worksheets - const sheet = doc.sheetsByTitle['adhesion_annuelle_web']; - - // on récupère le contenu de la GSheet dans un array nommé "rows" - const rows = await sheet.getRows(); - // on récupère quelle ligne contient l'identifiant concerné pour mettre à jour cette ligne - let lesmails = new Array; - let compteur = sheet.rowCount - 1; - let rowToBeUpdate; - for (let i=0; i 0) { - description += " Nous vous remercions de votre proposition de don de "; - description += adherent_paiement_montant_don; - description += " euros que vous pouvez ajouter à votre règlement."; - }; - - var membres = [ - { - today: today, - description: description, - identifiant: identifiant, - profil1: profil1, - profil2: profil2, - profil3: profil3, - type_card: "TEMPORAIRE", - adherent_paiement_mode: "Adhésion en attente de paiement" - }, - ]; - var pdfname = path.resolve(__dirname, "../pdf/adhesion/2223/attente/"); - //var pdfname = "/Users/julie/Documents/GitHub/aduzuki/pdf/adhesion/2223/attente/"; - pdfname += "/"; - pdfname += identifiant; - pdfname += "_adhesion_2223_attente.pdf"; - - var document = { - html: html, - data: { - membres: membres, - }, - path: pdfname, - type: "" - }; - - await pdf - .create(document, options) - .then((res) => { - logger.info("res : " + res, { numsession: req.session.id }); - }) - .catch((error) => { - logger.info("error : " + error, { numsession: req.session.id }); - }); - console.log("PDF CREATION APRES"); - - - ////////////////////////////////////////////////////////////////////////////// - // ENVOIE CARTE ADHERENT TEMPORAIRE PAR MAIL - - console.log("MAIL ENVOI AVANT"); - var transporter = nodemailer.createTransport({ - service: 'gmail', - auth: { - // TEST JULIE - //user: 'juliechaumard@gmail.com', - //pass: 'etfq umof iwbx ltxk' - // SUZUKI - user: 'afpedagogiesuzuki@gmail.com', - pass: 'tlxx kjwx ahyx irnl' - } + logger.info("======================================"); + logger.info("======== FUNCTION get_res_bank_annul (adhesion) =========="); + logger.info("======================================"); + + //////////////////////////////////////////////////// + // CONNECTION ADOBE API + //////////////////////////////////////////////////// + const credentials = PDFServicesSdk.Credentials + .servicePrincipalCredentialsBuilder() + .withClientId(process.env.PDF_SERVICES_CLIENT_ID) + .withClientSecret(process.env.PDF_SERVICES_CLIENT_SECRET) + .build(); + //timeout Default: 10000 + const clientConfig = PDFServicesSdk.ClientConfig + .clientConfigBuilder() + .withConnectTimeout(20000) + .withReadTimeout(40000) + .build(); + // Create an ExecutionContext using credentials + const executionContext = PDFServicesSdk.ExecutionContext.create(credentials); + + console.log ("on est dans la ROUTE /adhesion_paiement/annule"); + var id = req.query.id; + // type = req.params.type; + logger.info("id : " + id, { numsession: req.session.id }); + const session = await stripe.checkout.sessions.retrieve(id); + + console.log("======================================"); + console.log("======== SESSION STRIPE =========="); + console.log("======================================"); + + ///////////////////////////////////////////////// + // DATE DE L'ADHÉSION + let now = moment().format("YYYY-MM-DD HH:mm:ss"); + let now_pdf = moment().format("YYYY-MM-DDTHH-mm-ss"); + + console.info(session); + var customer_email = session.customer_email; + var payment_status = session.payment_status; + var amount_total = session.amount_total/100; + var stripe_customer = session.customer; + var stripe_payment_intent = session.payment_intent; + var payment_method_types = session.payment_method_types; + var stripe_status = session.status; + var profil = session.metadata.profil; + var identifiant = session.metadata.identifiant; + + var adherent_paiement_montant_don = session.metadata.adherent_paiement_montant_don; + var adherent_paiement_montant_adhesion = session.metadata.adherent_paiement_montant_adhesion; + var adherent_nom = session.metadata.adherent_nom; + + ////////////////////////////////////////////////////////////////////////////// + // DÉFINIR LE PROFIL À AJOUTER DANS LA CARTE ADHÉRENT + // La fonction est dans le fichier /modules/adherent_type.js + profils = carte_adherent.profil(adherent_type); + profil1 = profils[0]; + profil2 = profils[1]; + profil3 = profils[2]; + + console.log("customer_email: ", customer_email); + logger.info("payment_status : " + payment_status, { numsession: req.session.id }); + console.log("stripe_customer: ", stripe_customer); + console.log("amount_total: ", amount_total); + console.log("stripe_payment_intent: ", stripe_payment_intent); + console.log("payment_method_types: ", payment_method_types); + console.log("stripe_status: ", stripe_status); + console.log("metadata.profil: ", profil); + + res.locals.customer_email = customer_email; + res.locals.payment_status = payment_status; + res.locals.amount_total = amount_total; + res.locals.stripe_customer = stripe_customer; + res.locals.stripe_payment_intent = stripe_payment_intent; + res.locals.payment_method_types = payment_method_types; + res.locals.stripe_status = stripe_status; + res.locals.identifiant = identifiant; + res.locals.profil1 = profil1; + res.locals.profil2 = profil2; + res.locals.profil3 = profil3; + + logger.info("req.session.identifiant: " + req.session.identifiant, { numsession: req.session.id }); + + ////////////////////////////////////////////////////////////////////////////// + // MISE À JOUR DES INFORMATIONS SUR LE PAIEMENT DANS LA BASE DE DONNÉES adherent_finance + + let stripe_retour = "payment_status:"+payment_status+",stripe_customer:"+stripe_customer+",stripe_payment_intent:"+stripe_payment_intent+",sessionID:"+session.id+",payment_method_types:"+payment_method_types+",amount_total:"+amount_total+",stripe_status:"+stripe_status; + + // Vérifier que la session n'a pas expiré + if (identifiant) { + try { + const db_connection_promise = await mysql_promise.createConnection({ + host: process.env.db_connection_host, + port: process.env.db_connection_port, + user: process.env.db_connection_user, + password: process.env.db_connection_password, + database: process.env.db_connection_database }); - - var attachment_name = identifiant; - attachment_name += "_adhesion_2223_carteadherent.pdf"; - - - var mail_objet = "ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI - ADHÉSION 2022/2023 - "; - mail_objet += adherent_nom; - mail_html = "

Cher adhérent,

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

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

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

Veuillez toutefois noter que votre adhésion ne sera effective qu'à la réception de votre règlement de "; - mail_html += adherent_paiement_montant_adhesion; - mail_html += " euros.
"; - if (adherent_paiement_montant_don > 0) { - mail_html += "Nous vous remercions pour votre proposition de don de "; - mail_html += adherent_paiement_montant_don; - mail_html += " euros que vous pouvez ajouter à votre règlement."; + logger.info("======================================", { label: filename }); + logger.info("Connected TO DATABASE test with mysql2 PREMISE !", { label: filename }); + logger.info("======================================", { label: filename }); + + // METTRE À JOUR LES INFOS DE PAIEMENT DANS adherent_finance + let sql = 'UPDATE '; + sql += 'adherent_finance'; + sql += ' SET '; + sql += 'date_paiement = "' + now + '", '; + sql += 'stripe_retour = "' + stripe_retour + '", '; + sql += 'statut_paiement = "impaye"'; + sql += ' WHERE identifiant = "' + identifiant + '"'; + + logger.info("REQUETE SQL UPDATE adherent_finance : " + sql , { numsession: req.session.id, label: filename}); + + try { + // METTRE À JOUR LES INFOS DE PAIEMENT DANS adherent_finance + const [results, fields] = await db_connection_promise.execute(sql); + logger.info("adherent_finance Row ID changed : " + results.changedRows, { numsession: req.session.id, label: filename}); + + + } catch (error) { + // Echec de la requête + console.log(error); + logger.error("Il y a un problème avec la requête INSERT INTO adherent_finance! : " + error, { numsession: req.session.id }); + req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; + // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur + await db_connection_promise.end(); + res.redirect('/adhesion'); } - mail_html += "


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

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

"; - - - var mailOptions = { - from: 'afpedagogiesuzuki@gmail.com', - to: identifiant, - subject: mail_objet, - html: mail_html, - attachments: [{ - filename: attachment_name, - path: pdfname - }], - }; - - transporter.sendMail(mailOptions, function(error, info){ - if (error) { - logger.info("error : " + error, { numsession: req.session.id }); - } else { - console.log('Email sent: ' + info.response); - } - }); - console.log("MAIL ENVOI APRES"); - - ////////////////////////////////////////////////////////////////////////////// - // REDIRECTION VERS LA PAGE DE DE FIN - res.locals.adherent_paiement_montant_adhesion = adherent_paiement_montant_adhesion; - res.locals.adherent_paiement_montant_don = adherent_paiement_montant_don; - res.render('adhesion/page_templates/adhesion_paiement_annule.ejs'); + + + + // METTRE À JOUR LE STATUS D'ENVOI DE LA CARTE + let sql2 = 'UPDATE '; + sql2 += 'adherent'; + sql2 += ' SET '; + sql2 += 'carte_envoi = "temporaire"'; + sql2 += ' WHERE identifiant = "' + identifiant + '"'; + + logger.info("REQUETE SQL UPDATE adherent : " + sql2, { numsession: req.session.id, label: filename}); + + try { + // METTRE À JOUR LES INFOS DE PAIEMENT DANS adherent + const [results, fields] = await db_connection_promise.execute(sql2); + logger.info("adherent_finance Row ID changed : " + results.changedRows, { numsession: req.session.id, label: filename}); + + + } catch (error) { + // Echec de la requête + console.log(error); + logger.error("Il y a un problème avec la requête INSERT INTO adherent_finance! : " + error, { numsession: req.session.id }); + req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; + // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur + await db_connection_promise.end(); + res.redirect('/adhesion'); + } + + + + + } catch (error) { + // Echec de connection à la BD + logger.error("Il y a un problème avec la connection à la base de données! : " + error, { numsession: req.session.id }); + req.session.err_mail_form_adhesion_1 = "Il y a un problème système, veuillez recommencer."; + // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur + await db_connection_promise.end(); + res.redirect('/adhesion'); + }; + + } else { + // les Infos de session ne sont plus dispo + logger.info("les Infos de session ne sont plus dispo! : ", { numsession: req.session.id }); + req.session.err_mail_form_adhesion_1 = "La session a expiré."; + req.session.err_mail_form_adhesion_2 = "Si vous n'aviez pas pu finaliser votre paiement veuillez nous envoyer un chèque ou un virement."; + req.session.err_mail_form_adhesion_3 = "Pour tout problème veuillez contacter l’Association."; + // redirection vers la page d'accueil des adhésions pour afficher le message d'erreur + res.redirect('/adhesion'); } + ////////////////////////////////////////////////////////////////////////////// + // ADOBE PDF : CRÉATION DE LA CARTE D'ADHÉSION TEMPORAIRE EN PDF + + let OUTPUT = path.resolve(__dirname, "../pdf/adhesion/2526/attente/")+"/"+identifiant+"_adhesion_2526_attente_"+now_pdf+".pdf"; + let INPUT = path.resolve(__dirname, "../pdf/template/carte_adherent_temp.docx"); + + moment.locale('fr'); + var date_formattee = moment().format('L') + var today = date_formattee; + + if (profil2 == undefined) {profil2 = " "}; + if (profil3 == undefined) {profil3 = ""}; + + JSON_INPUT = + { + "date": today, + "identifiant": identifiant, + "profil1": profil1, + "profil2": profil2, + "profil3": profil3, + "montant": adherent_paiement_montant_adhesion + }; + + const documentMerge = PDFServicesSdk.DocumentMerge, + documentMergeOptions = documentMerge.options, + adobe_options = new documentMergeOptions.DocumentMergeOptions(JSON_INPUT, documentMergeOptions.OutputFormat.PDF); + + // Create a new operation instance using the options instance. + const documentMergeOperation = documentMerge.Operation.createNew(adobe_options); + + // Set operation input document template from a source file. + const input = PDFServicesSdk.FileRef.createFromLocalFile(INPUT); + documentMergeOperation.setInput(input); + + // Execute the operation and Save the result to the specified location. + await documentMergeOperation + .execute(executionContext) + .then(result => result.saveAsFile(OUTPUT).then( + ) + ) + .catch(err => { + if(err instanceof PDFServicesSdk.Error.ServiceApiError + || err instanceof PDFServicesSdk.Error.ServiceUsageError) { + console.log('Exception encountered while executing ADOBE PDF', err); + } else { + console.log('Exception encountered while executing ADOBE PDF', err); + } + }); + + ////////////////////////////////////////////////////////////////////////////// + // ENVOIE CARTE ADHERENT TEMPORAIRE PAR MAIL + + console.log("MAIL ENVOI AVANT"); + var transporter = nodemailer.createTransport({ + service: 'gmail', + auth: { + user: process.env.nodemailer_user, + pass: process.env.nodemailer_pass + } + }); + + var attachment_name = identifiant; + attachment_name += "_adhesion_2526_carteadherent.pdf"; + + + var mail_objet = "ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI - ADHÉSION 2025/2026 - "; + mail_objet += adherent_nom; + mail_html = "

Cher adhérent,

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

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

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

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


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

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

"; + + + var mailOptions = { + from: 'afps.inscription@gmail.com', + to: identifiant, + subject: mail_objet, + html: mail_html, + attachments: [{ + filename: attachment_name, + path: OUTPUT + }], + }; + + transporter.sendMail(mailOptions, function(error, info){ + if (error) { + logger.info("error : " + error, { numsession: req.session.id }); + } else { + console.log('Email sent: ' + info.response); + } + }); + console.log("MAIL ENVOI APRES"); + + ////////////////////////////////////////////////////////////////////////////// + // REDIRECTION VERS LA PAGE DE DE FIN + res.locals.adherent_paiement_montant_adhesion = adherent_paiement_montant_adhesion; + res.locals.adherent_paiement_montant_don = adherent_paiement_montant_don; + res.locals.today = date_formattee; + res.render('adhesion/page_templates/adhesion_paiement_annule.ejs'); +} + ///////////////////////////////////////////////// @@ -1676,7 +2542,7 @@ const post_req_bank = async function(req, res, next){ const post_cartemanuelle_verifmail_envoicarte = async function(req, res){ logger.info("======================================"); - logger.info("======== FUNCTION checkMail ENVOI MANUEL =========="); + logger.info("======== FUNCTION checkMail ENVOI MANUEL (adhesion) =========="); logger.info("======================================"); await doc.useServiceAccountAuth(creds); @@ -1758,11 +2624,11 @@ const post_cartemanuelle_verifmail_envoicarte = async function(req, res){ }, ]; - var pdfname = path.resolve(__dirname, "../pdf/adhesion/2223/payee/"); + var pdfname = path.resolve(__dirname, "../pdf/adhesion/2526/payee/"); pdfname += "/"; - //var pdfname = "/Users/julie/Documents/GitHub/aduzuki/pdf/adhesion/2223/payee/"; + pdfname += rows[rowToBeUpdate].identifiant; - pdfname += "_adhesion_2223_payee.pdf"; + pdfname += "_adhesion_2526_payee.pdf"; var document = { html: html, @@ -1814,11 +2680,11 @@ const post_cartemanuelle_verifmail_envoicarte = async function(req, res){ }, ]; - var pdfname_don = path.resolve(__dirname, "../pdf/adhesion/2223/don/"); - //var pdfname_don = "/Users/julie/Documents/GitHub/aduzuki/pdf/adhesion/2223/payee/"; + var pdfname_don = path.resolve(__dirname, "../pdf/adhesion/2526/don/"); + pdfname_don += "/"; pdfname_don += rows[rowToBeUpdate].identifiant; - pdfname_don += "_adhesion_2223_don.pdf"; + pdfname_don += "_adhesion_2526_don.pdf"; var document_don = { html: html_don, @@ -1857,13 +2723,13 @@ const post_cartemanuelle_verifmail_envoicarte = async function(req, res){ }); var attachment_name = rows[rowToBeUpdate].identifiant; - attachment_name += "_adhesion_2223_carteadherent.pdf"; + attachment_name += "_adhesion_2526_carteadherent.pdf"; var attachment_don_name = rows[rowToBeUpdate].identifiant; - attachment_don_name += "_adhesion_2223_don.pdf"; + attachment_don_name += "_adhesion_2526_don.pdf"; - var mail_objet = "ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI - ADHÉSION 2022/2023 - "; + var mail_objet = "ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI - ADHÉSION 2025/2026 - "; mail_objet += rows[rowToBeUpdate].adherent_nom; - mail_html = "

Cher adhérent,

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

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

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

Cher adhérent,

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

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

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

"; if (rows[rowToBeUpdate].adherent_paiement_montant_don > 0) { @@ -1916,7 +2782,7 @@ const post_cartemanuelle_verifmail_envoicarte = async function(req, res){ // AFFICHAGE DANS LA PAGE WEB QUE LA CARTE EST ENVOYÉE req.session.err_mail_form_adhesion_1 = "Carte adhérent envoyée"; } else { - req.session.err_mail_form_adhesion_1 = "Cette adresse Email n'est pas inscrite pour les adhésions 2022/2023."; + req.session.err_mail_form_adhesion_1 = "Cette adresse Email n'est pas inscrite pour les adhésions 2025/2026."; req.session.err_mail_form_adhesion_2 = "Vous ne pouvez pas lui envoyer la carte d'adhérent."; } @@ -1934,7 +2800,7 @@ const post_cartemanuelle_verifmail_envoicarte = async function(req, res){ const post_cartes_manuelles_envoi = async function(req, res){ logger.info("======================================"); - logger.info("======== FUNCTION ENVOI CARTES MANUELLES =========="); + logger.info("======== FUNCTION ENVOI CARTES MANUELLES (adhesion) =========="); logger.info("======================================"); // RÉCUPÉRATION DU CONTENU DE LA GOOGLE SHEET @@ -2015,10 +2881,10 @@ const post_cartes_manuelles_envoi = async function(req, res){ adherent_paiement_mode: mode_paiement }, ]; - var pdfname = path.resolve(__dirname, "../pdf/adhesion/2223/payee/"); + var pdfname = path.resolve(__dirname, "../pdf/adhesion/2526/payee/"); pdfname += "/"; pdfname += rows[i].identifiant; - pdfname += "_adhesion_2223_payee.pdf"; + pdfname += "_adhesion_2526_payee.pdf"; var document = { html: html, @@ -2069,10 +2935,10 @@ const post_cartes_manuelles_envoi = async function(req, res){ }, ]; - var pdfname_don = path.resolve(__dirname, "../pdf/adhesion/2223/don/"); + var pdfname_don = path.resolve(__dirname, "../pdf/adhesion/2526/don/"); pdfname_don += "/"; pdfname_don += rows[i].identifiant; - pdfname_don += "_adhesion_2223_don.pdf"; + pdfname_don += "_adhesion_2526_don.pdf"; var document_don = { html: html_don, @@ -2110,13 +2976,13 @@ const post_cartes_manuelles_envoi = async function(req, res){ }); var attachment_name = rows[i].identifiant; - attachment_name += "_adhesion_2223_carteadherent.pdf"; + attachment_name += "_adhesion_2526_carteadherent.pdf"; var attachment_don_name = rows[i].identifiant; - attachment_don_name += "_adhesion_2223_don.pdf"; + attachment_don_name += "_adhesion_2526_don.pdf"; - var mail_objet = "ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI - ADHÉSION 2022/2023 - "; + var mail_objet = "ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI - ADHÉSION 2025/2026 - "; mail_objet += rows[i].adherent_nom; - mail_html = "

Cher adhérent,

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

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

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

Cher adhérent,

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

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

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

"; if (rows[i].adherent_paiement_montant_don > 0) { @@ -2227,10 +3093,10 @@ const post_cartes_manuelles_envoi = async function(req, res){ adherent_paiement_mode: mode_paiement }, ]; - var pdfname = path.resolve(__dirname, "../pdf/adhesion/2223/payee/"); + var pdfname = path.resolve(__dirname, "../pdf/adhesion/2526/payee/"); pdfname += "/"; pdfname += rows_asslocales[i].identifiant; - pdfname += "_adhesion_2223_payee.pdf"; + pdfname += "_adhesion_2526_payee.pdf"; var document = { html: html, @@ -2281,10 +3147,10 @@ const post_cartes_manuelles_envoi = async function(req, res){ }, ]; - var pdfname_don = path.resolve(__dirname, "../pdf/adhesion/2223/don/"); + var pdfname_don = path.resolve(__dirname, "../pdf/adhesion/2526/don/"); pdfname_don += "/"; pdfname_don += rows_asslocales[i].identifiant; - pdfname_don += "_adhesion_2223_don.pdf"; + pdfname_don += "_adhesion_2526_don.pdf"; var document_don = { html: html_don, @@ -2322,13 +3188,13 @@ const post_cartes_manuelles_envoi = async function(req, res){ }); var attachment_name = rows_asslocales[i].identifiant; - attachment_name += "_adhesion_2223_carteadherent.pdf"; + attachment_name += "_adhesion_2526_carteadherent.pdf"; var attachment_don_name = rows_asslocales[i].identifiant; - attachment_don_name += "_adhesion_2223_don.pdf"; + attachment_don_name += "_adhesion_2526_don.pdf"; - var mail_objet = "ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI - ADHÉSION 2022/2023 - "; + var mail_objet = "ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI - ADHÉSION 2025/2026 - "; mail_objet += rows_asslocales[i].adherent_nom; - mail_html = "

Cher adhérent,

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

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

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

Cher adhérent,

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

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

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

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

Pour l'administrateur de l'application ADUZUKI,


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

"; + mail_html += "

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

"; + mail_html += "

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

"; + mail_html += "

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

"; + mail_html += "

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

"; + mail_html += "

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

"; + mail_html += "

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

"; + + mail_html += "

Julie Chaumard

Développeuse web de l'agence Parisweb.art

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

Cher adhérent,

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

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

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

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

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

"; + } + mail_html += "


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

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

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

Cher adhérent,

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

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

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

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

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

"; + } + mail_html += "


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

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

"; + + + var mailOptions = { + from: 'afps.inscription@gmail.com', + to: GS_asso_locales_rows[i].adherent_mail, + subject: mail_objet, + html: mail_html, + attachments: [{ + filename: attachment_name, + path: OUTPUT + } + ] + }; + + transporter.sendMail(mailOptions, function(error, info){ + if (error) { + logger.info("error : " + error, { numsession: req.session.id }); + } else { + console.log('Email sent: ' + info.response); + } + }); + console.log("MAIL ENVOI APRES"); + + + // METTRE À JOUR LE STATUS D'ENVOI DE LA CARTE + let sql10 = 'UPDATE '; + sql10 += 'adherent'; + sql10 += ' SET '; + sql10 += 'carte_envoi = "definitive"'; + sql10 += ' WHERE identifiant = "' + GS_asso_locales_rows[i].identifiant + '"'; + + const [results10, fields10] = await promisePool.query(sql10); // Execution SQL + logger.info("adherent carte envoi Row ID changed : " + results10.changedRows, { numsession: req.session.id, label: filename}); + + + + ///////////////////////////////////////////////// + // GS - Taguer l'adhérent comme importé dans le tableau Google Sheet + GS_asso_locales_rows[i].date_export = now; + await GS_asso_locales_rows[i].save(); + await sleep.wait(2000); + + nb_import++; + } + } + ///////////////////////////////////////////////// + // ON AFFICHE LE NOMBRE DE LIGNES IMPORTÉES + req.session.message4 = 'Adhérents associations locales importées : ' + nb_import; + res.redirect('/adhesion/maj_googlesheet'); + + } catch (error) { + // Echec de connection à la BD + logger.error("Il y a un problème avec la connection à la base de données : " + error, { numsession: req.session.id }); + req.session.message4 = "Il y a un problème système, veuillez recommencer. " + error; + //pool.end(); + res.redirect('/adhesion/maj_googlesheet'); + }; + +} + + ///////////////////////////////////////////////// // EXPORT DE MODULE POUR QU'IL SOIT LU DANS LES AUTRES FICHIERS JS ///////////////////////////////////////////////// @@ -2416,14 +4947,10 @@ module.exports = { get_res_bank, get_res_bank_annul, post_cartemanuelle_verifmail_envoicarte, - post_cartes_manuelles_envoi + post_cartes_manuelles_envoi, + maj_googlesheet, + maj_googlesheet_auto, + maj_statut_paiement_manuel, + suppr_adherent, + import_ass_loacles } - - - - - - - - - diff --git a/controllers/adhesion_envoi_carteController.js b/controllers/adhesion_envoi_carteController.js new file mode 100644 index 0000000..890fb49 --- /dev/null +++ b/controllers/adhesion_envoi_carteController.js @@ -0,0 +1,294 @@ +///////////////////////////////////////////////// +// LOGGING +///////////////////////////////////////////////// +const logger = require("../public/js/app/logger_adhesion"); + +///////////////////////////////////////////////// +// APPELS DES MODULES +///////////////////////////////////////////////// +const moment = require('moment'); +const ejs = require('ejs'); +const nodemailer = require('nodemailer'); +const path = require("path"); +const stripe = require('stripe')(process.env.STRIPE_PRIVATE_KEY); +const pdf = require("pdf-creator-node"); +const fs = require("fs"); +const mysql = require('mysql2'); +const mysql_promise = require('mysql2/promise'); +// ADOBE PDF +const PDFServicesSdk = require('@adobe/pdfservices-node-sdk'); + + +///////////////////////////////////////////////// +// APPELS DES FONCTIONS +///////////////////////////////////////////////// +// Déterminer les profils de l'adhésion +const carte_adherent = require("./../modules/adhesion/carte_adherent"); +// FAIRE UNE PAUSE +const sleep = require("./../modules/sleep"); + +//////////////////////////////////////////////////// +// FILE NAME +//////////////////////////////////////////////////// +const filename = path.parse(__filename).base; + +///////////////////////////////////////////////// +// GOOGLE SHEET PARAMETERS +///////////////////////////////////////////////// +const { GoogleSpreadsheet } = require('google-spreadsheet'); +const GS_creds = require('../inscriptionsafps-53b60452f63d.json'); +const { error } = require("console"); +// Initialize the sheet - doc ID is the long id in the sheets URL +const GS_adhesion = new GoogleSpreadsheet(process.env.gsheet_adhesion); + + +///////////////////////////////////////////////// +// VARIABLES GLOBALES +///////////////////////////////////////////////// +let adherent_type, profil1, profil2, profil3; + + + +///////////////////////////////////////////////// +// ASSOCIATIONS LOCACLES +// IMPORTS ADHÉRENTS DANS DB +// CLIC SUR LE BOUTON "Valider" de la page /maj_googlesheet +///////////////////////////////////////////////// +const adhesion_envoi_carte = async function(req, res) { + + logger.info("======================================", { label: filename }); + logger.info("======== FUNCTION adhesion_envoi_carte (adhesion maj_googlesheet) ==========", { label: filename }); + logger.info("======================================", { label: filename }); + + + ///////////////////////////////////////////////// + // DATE + let now = moment().format("YYYY-MM-DD HH:mm:ss"); + let now_pdf = moment().format("YYYY-MM-DDTHH-mm-ss"); + + ///////////////////////////////////////////////// + // VARIABLE + const identifiant_afps = req.params.identifiant_afps; + console.log('identifiant_afps reçu :', identifiant_afps); + + //////////////////////////////////////////////////// + // CONNECTION ADOBE API + //////////////////////////////////////////////////// + const credentials = PDFServicesSdk.Credentials + .servicePrincipalCredentialsBuilder() + .withClientId(process.env.PDF_SERVICES_CLIENT_ID) + .withClientSecret(process.env.PDF_SERVICES_CLIENT_SECRET) + .build(); + //timeout Default: 10000 + const clientConfig = PDFServicesSdk.ClientConfig + .clientConfigBuilder() + .withConnectTimeout(40000) + .withReadTimeout(80000) + .build(); + // Create an ExecutionContext using credentials + const executionContext = PDFServicesSdk.ExecutionContext.create(credentials); + + ///////////////////////////////////////////////// + // CONNECTION DB + try { + const pool = mysql.createPool({ + host: process.env.db_connection_host, + port: process.env.db_connection_port, + user: process.env.db_connection_user, + password: process.env.db_connection_password, + database: process.env.db_connection_database, + rowsAsArray: false + }); + const promisePool = pool.promise(); + + // Récupération des données nécessaires à la création du la carte adhérent, éventuellement au dispositif de don + // Récupération des données nécessaires à l'envoi par mail + + + const sql = ` + SELECT adherent_nom, adherent_prenom, adherent_mail, + adherent_type, adherent_adresse_rue, + adherent_adresse_codepostal, adherent_adresse_ville + FROM adherent + WHERE identifiant = ?`; + + const [results_adherent] = await promisePool.query(sql, [identifiant_afps]); + logger.info("SELECT ADHERENT adherent_nom : " + results_adherent[0].adherent_nom, { numsession: req.session.id, label: filename}); + + const sql2 = `SELECT montant_don, paiement_mode FROM adherent_finance WHERE identifiant = ?`; + const [results_adherent_finance] = await promisePool.query(sql2, [identifiant_afps]); + + if (results_adherent[0].adherent_nom) { + + ///////////////////////////////////////////////// + // ENVOIE CARTE ADHÉRENT + ////////////////////////////////////////////////////////////////////////////// + // ADOBE PDF : CRÉATION DE LA CARTE D'ADHÉSION EN PDF + // + JUSTIFICATIF DE DON + + ////////////////////////////////////////////////////////////////////////////// + // DÉFINIR LE PROFIL À AJOUTER DANS LA CARTE ADHÉRENT + // La fonction est dans le fichier /modules/adherent_type.js + profils = carte_adherent.profil(results_adherent[0].adherent_type); + profil1 = profils[0]; + profil2 = profils[1]; + profil3 = profils[2]; + + let OUTPUT; + let INPUT + + // S'il y a un don + if (results_adherent_finance[0].montant_don > 0) { + + OUTPUT = path.resolve(__dirname, "../pdf/adhesion/2526/paye/")+"/"+identifiant_afps+"_adhesion_2526_paye_don_"+now_pdf+".pdf"; + INPUT = path.resolve(__dirname, "../pdf/template/carte_adherent_don.docx"); + + } else { + + // S'il n'y a pas de don + OUTPUT = path.resolve(__dirname, "../pdf/adhesion/2526/paye/")+"/"+identifiant_afps+"_adhesion_2526_paye_"+now_pdf+".pdf"; + INPUT = path.resolve(__dirname, "../pdf/template/carte_adherent.docx"); + + } + + moment.locale('fr'); + var date_formattee = moment().format('L') + var today = date_formattee; + + var adresse = results_adherent[0].adherent_adresse_rue; + adresse += " "; + adresse += results_adherent[0].adherent_adresse_codepostal; + adresse += " "; + adresse += results_adherent[0].adherent_adresse_ville; + + if (profil2 == undefined) {profil2 = " "}; + if (profil3 == undefined) {profil3 = ""}; + + + JSON_INPUT = + { + "date": today, + "identifiant": identifiant_afps, + "profil1": profil1, + "profil2": profil2, + "profil3": profil3, + "mode_paiement": results_adherent_finance[0].paiement_mode, + "nom": results_adherent[0].adherent_nom, + "prenom": results_adherent[0].adherent_prenom, + "adresse": adresse, + "montant_don": results_adherent_finance[0].montant_don + }; + + const documentMerge = PDFServicesSdk.DocumentMerge, + documentMergeOptions = documentMerge.options, + adobe_options = new documentMergeOptions.DocumentMergeOptions(JSON_INPUT, documentMergeOptions.OutputFormat.PDF); + + // Create a new operation instance using the options instance. + const documentMergeOperation = documentMerge.Operation.createNew(adobe_options); + + // Set operation input document template from a source file. + const input = PDFServicesSdk.FileRef.createFromLocalFile(INPUT); + documentMergeOperation.setInput(input); + + // Execute the operation and Save the result to the specified location. + await documentMergeOperation + .execute(executionContext) + .then(result => result.saveAsFile(OUTPUT).then( + ) + ) + .catch(err => { + if(err instanceof PDFServicesSdk.Error.ServiceApiError + || err instanceof PDFServicesSdk.Error.ServiceUsageError) { + console.log('Exception encountered while executing ADOBE PDF', err); + } else { + console.log('Exception encountered while executing ADOBE PDF', err); + } + }); + + + ////////////////////////////////////////////////////////////////////////////// + // ENVOIE CARTE ADHERENT + JUSTIFICATIF DE DON PAR MAIL + + console.log("MAIL ENVOI AVANT"); + var transporter = nodemailer.createTransport({ + service: 'gmail', + auth: { + user: process.env.nodemailer_user, + pass: process.env.nodemailer_pass + } + }); + + var attachment_name = identifiant_afps; + attachment_name += "_adhesion_2526_carteadherent.pdf"; + var attachment_don_name = identifiant_afps; + attachment_don_name += "_don.pdf"; + + var mail_objet = "ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI - ADHÉSION 2025/2026 - "; + mail_objet += identifiant_afps; + mail_html = "

Cher adhérent,

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

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

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

"; + if (results_adherent_finance[0].montant_don > 0) { + mail_html += "

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

"; + } + mail_html += "


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

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

"; + + + var mailOptions = { + from: 'afps.inscription@gmail.com', + to: results_adherent[0].adherent_mail, + subject: mail_objet, + html: mail_html, + attachments: [{ + filename: attachment_name, + path: OUTPUT + } + ] + }; + + transporter.sendMail(mailOptions, function(error, info){ + if (error) { + logger.info("error : " + error, { numsession: req.session.id }); + } else { + console.log('Email sent: ' + info.response); + } + }); + console.log("MAIL ENVOI APRES"); + + + // METTRE À JOUR LE STATUS D'ENVOI DE LA CARTE + let sql10 = 'UPDATE '; + sql10 += 'adherent'; + sql10 += ' SET '; + sql10 += 'carte_envoi = "definitive"'; + sql10 += ' WHERE identifiant = "' + identifiant_afps + '"'; + + const [results10, fields10] = await promisePool.query(sql10); // Execution SQL + logger.info("adherent carte envoi Row ID changed : " + results10.changedRows, { numsession: req.session.id, label: filename}); + + res.json({ + success: true, + message: `Email avec carte adhésion envoyé à : ${identifiant_afps}`, + }); + } else { + res.status(404).json({ + success: false, + message: `Aucun adhérent trouvé pour l'identifiant ${identifiant_afps}`, + }); + } + + } catch (error) { + // Echec de connection à la BD + logger.error("Il y a un problème avec la connection à la base de données : " + error, { numsession: req.session.id }); + res.json({ error }); + }; + +} + + +///////////////////////////////////////////////// +// EXPORT DE MODULE POUR QU'IL SOIT LU DANS LES AUTRES FICHIERS JS +///////////////////////////////////////////////// +module.exports = { + adhesion_envoi_carte +} \ No newline at end of file diff --git a/controllers/adhesion_imp_ass_locController.js b/controllers/adhesion_imp_ass_locController.js new file mode 100644 index 0000000..76d5fd9 --- /dev/null +++ b/controllers/adhesion_imp_ass_locController.js @@ -0,0 +1,396 @@ +///////////////////////////////////////////////// +// LOGGING +///////////////////////////////////////////////// +const logger = require("../public/js/app/logger_adhesion"); + +///////////////////////////////////////////////// +// APPELS DES MODULES +///////////////////////////////////////////////// +const moment = require('moment'); +const ejs = require('ejs'); +const nodemailer = require('nodemailer'); +const path = require("path"); +const stripe = require('stripe')(process.env.STRIPE_PRIVATE_KEY); +const pdf = require("pdf-creator-node"); +const fs = require("fs"); +const mysql = require('mysql2'); +const mysql_promise = require('mysql2/promise'); +// ADOBE PDF +const PDFServicesSdk = require('@adobe/pdfservices-node-sdk'); + + +///////////////////////////////////////////////// +// APPELS DES FONCTIONS +///////////////////////////////////////////////// +// Déterminer les profils de l'adhésion +const carte_adherent = require("./../modules/adhesion/carte_adherent"); +// FAIRE UNE PAUSE +const sleep = require("./../modules/sleep"); + +//////////////////////////////////////////////////// +// FILE NAME +//////////////////////////////////////////////////// +const filename = path.parse(__filename).base; + +///////////////////////////////////////////////// +// GOOGLE SHEET PARAMETERS +///////////////////////////////////////////////// +const { GoogleSpreadsheet } = require('google-spreadsheet'); +const GS_creds = require('../inscriptionsafps-53b60452f63d.json'); +const { error } = require("console"); +// Initialize the sheet - doc ID is the long id in the sheets URL +const GS_adhesion = new GoogleSpreadsheet(process.env.gsheet_adhesion); + + +///////////////////////////////////////////////// +// VARIABLES GLOBALES +///////////////////////////////////////////////// +let adherent_type, profil1, profil2, profil3; + + + +///////////////////////////////////////////////// +// ASSOCIATIONS LOCACLES +// IMPORTS ADHÉRENTS DANS DB +// CLIC SUR LE BOUTON "Valider" de la page /maj_googlesheet +///////////////////////////////////////////////// +const import_ass_locales_v2 = async function(req, res) { + + logger.info("======================================", { label: filename }); + logger.info("======== FUNCTION import_ass_locales_v2 (adhesion maj_googlesheet) ==========", { label: filename }); + logger.info("======================================", { label: filename }); + + + ///////////////////////////////////////////////// + // DATE + let now = moment().format("YYYY-MM-DD HH:mm:ss"); + let now_pdf = moment().format("YYYY-MM-DDTHH-mm-ss"); + + ///////////////////////////////////////////////// + // VARIABLE + let nb_import = 0; + + ///////////////////////////////////////////////// + // CONNEXION GSHEET + try { + await GS_adhesion.useServiceAccountAuth(GS_creds); + } catch (error) { + // Echec de connection à GS + logger.error("Il y a un problème avec la connection à Google Sheet. : " + error, { numsession: req.session.id }); + req.session.message4 = "Il y a un problème système, veuillez recommencer."; + res.redirect('/adhesion/maj_googlesheet'); + }; + + await GS_adhesion.loadInfo(); + const GS_asso_locales = GS_adhesion.sheetsByTitle['adhesion_ass_locales']; + const GS_asso_locales_rows = await GS_asso_locales.getRows(); + console.log("GS_asso_locales.rowCount = ", GS_asso_locales.rowCount); + //console.log("GS_asso_locales_rows[0].identifiant = ", GS_asso_locales_rows[0].identifiant); + //console.log("GS_asso_locales_rows[1].identifiant = ", GS_asso_locales_rows[1].identifiant); + + // NOMBRE DE LIGNE DANS L'ONGLET adhesion_ass_locales + let compteur = GS_asso_locales.rowCount - 1; // POUR DÉCOMPTER LA LIGNE D'EN-TÊTE + console.log("compteur = ", compteur); + + //////////////////////////////////////////////////// + // CONNECTION ADOBE API + //////////////////////////////////////////////////// + const credentials = PDFServicesSdk.Credentials + .servicePrincipalCredentialsBuilder() + .withClientId(process.env.PDF_SERVICES_CLIENT_ID) + .withClientSecret(process.env.PDF_SERVICES_CLIENT_SECRET) + .build(); + //timeout Default: 10000 + const clientConfig = PDFServicesSdk.ClientConfig + .clientConfigBuilder() + .withConnectTimeout(40000) + .withReadTimeout(80000) + .build(); + // Create an ExecutionContext using credentials + const executionContext = PDFServicesSdk.ExecutionContext.create(credentials); + + ///////////////////////////////////////////////// + // CONNECTION DB + try { + const pool = mysql.createPool({ + host: process.env.db_connection_host, + port: process.env.db_connection_port, + user: process.env.db_connection_user, + password: process.env.db_connection_password, + database: process.env.db_connection_database, + rowsAsArray: true + }); + const promisePool = pool.promise(); + + ///////////////////////////////////////////////// + // ON LIT TOUTES LES LIGNES DU GOOGLE SHEET LES UNES APRÈS LES AUTRES + for (i=0; i 0) { + + OUTPUT = path.resolve(__dirname, "../pdf/adhesion/2526/paye/")+"/"+GS_asso_locales_rows[i].identifiant+"_adhesion_2526_paye_don_"+now_pdf+".pdf"; + INPUT = path.resolve(__dirname, "../pdf/template/carte_adherent_don.docx"); + + } else { + + // S'il n'y a pas de don + OUTPUT = path.resolve(__dirname, "../pdf/adhesion/2526/paye/")+"/"+GS_asso_locales_rows[i].identifiant+"_adhesion_2526_paye_"+now_pdf+".pdf"; + INPUT = path.resolve(__dirname, "../pdf/template/carte_adherent.docx"); + + } + + moment.locale('fr'); + var date_formattee = moment().format('L') + var today = date_formattee; + + var adresse = GS_asso_locales_rows[i].adherent_adresse_rue; + adresse += " "; + adresse += GS_asso_locales_rows[i].adherent_adresse_codepostal; + adresse += " "; + adresse += GS_asso_locales_rows[i].adherent_adresse_ville; + + if (profil2 == undefined) {profil2 = " "}; + if (profil3 == undefined) {profil3 = ""}; + + + JSON_INPUT = + { + "date": today, + "identifiant": GS_asso_locales_rows[i].identifiant, + "profil1": profil1, + "profil2": profil2, + "profil3": profil3, + "mode_paiement": GS_asso_locales_rows[i].adherent_paiement_mode, + "nom": GS_asso_locales_rows[i].adherent_nom, + "prenom": GS_asso_locales_rows[i].adherent_prenom, + "adresse": adresse, + "montant_don": GS_asso_locales_rows[i].adherent_paiement_montant_don + }; + + const documentMerge = PDFServicesSdk.DocumentMerge, + documentMergeOptions = documentMerge.options, + adobe_options = new documentMergeOptions.DocumentMergeOptions(JSON_INPUT, documentMergeOptions.OutputFormat.PDF); + + // Create a new operation instance using the options instance. + const documentMergeOperation = documentMerge.Operation.createNew(adobe_options); + + // Set operation input document template from a source file. + const input = PDFServicesSdk.FileRef.createFromLocalFile(INPUT); + documentMergeOperation.setInput(input); + + // Execute the operation and Save the result to the specified location. + await documentMergeOperation + .execute(executionContext) + .then(result => result.saveAsFile(OUTPUT).then( + ) + ) + .catch(err => { + if(err instanceof PDFServicesSdk.Error.ServiceApiError + || err instanceof PDFServicesSdk.Error.ServiceUsageError) { + console.log('Exception encountered while executing ADOBE PDF', err); + } else { + console.log('Exception encountered while executing ADOBE PDF', err); + } + }); + + + ////////////////////////////////////////////////////////////////////////////// + // ENVOIE CARTE ADHERENT + JUSTIFICATIF DE DON PAR MAIL + + console.log("MAIL ENVOI AVANT"); + var transporter = nodemailer.createTransport({ + service: 'gmail', + auth: { + user: process.env.nodemailer_user, + pass: process.env.nodemailer_pass + } + }); + + var attachment_name = GS_asso_locales_rows[i].identifiant; + attachment_name += "_adhesion_2526_carteadherent.pdf"; + var attachment_don_name = GS_asso_locales_rows[i].identifiant; + attachment_don_name += "_don.pdf"; + + var mail_objet = "ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI - ADHÉSION 2025/2026 - "; + mail_objet += GS_asso_locales_rows[i].identifiant; + mail_html = "

Cher adhérent,

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

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

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

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

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

"; + } + mail_html += "


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

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

"; + + + var mailOptions = { + from: 'afps.inscription@gmail.com', + to: GS_asso_locales_rows[i].adherent_mail, + subject: mail_objet, + html: mail_html, + attachments: [{ + filename: attachment_name, + path: OUTPUT + } + ] + }; + + transporter.sendMail(mailOptions, function(error, info){ + if (error) { + logger.info("error : " + error, { numsession: req.session.id }); + } else { + console.log('Email sent: ' + info.response); + } + }); + console.log("MAIL ENVOI APRES"); + + + // METTRE À JOUR LE STATUS D'ENVOI DE LA CARTE + let sql10 = 'UPDATE '; + sql10 += 'adherent'; + sql10 += ' SET '; + sql10 += 'carte_envoi = "definitive"'; + sql10 += ' WHERE identifiant = "' + GS_asso_locales_rows[i].identifiant + '"'; + + const [results10, fields10] = await promisePool.query(sql10); // Execution SQL + logger.info("adherent carte envoi Row ID changed : " + results10.changedRows, { numsession: req.session.id, label: filename}); + + + + ///////////////////////////////////////////////// + // GS - Taguer l'adhérent comme importé dans le tableau Google Sheet + GS_asso_locales_rows[i].date_export = now; + await GS_asso_locales_rows[i].save(); + await sleep.wait(2000); + + nb_import++; + } + } + + ///////////////////////////////////////////////// + // ON AFFICHE LE NOMBRE DE LIGNES IMPORTÉES + req.session.message4 = 'Adhérents associations locales importées : ' + nb_import; + res.redirect('/adhesion/maj_googlesheet'); + + } catch (error) { + // Echec de connection à la BD + logger.error("Il y a un problème avec la connection à la base de données : " + error, { numsession: req.session.id }); + req.session.message4 = "Il y a un problème système, veuillez recommencer. " + error; + //pool.end(); + res.redirect('/adhesion/maj_googlesheet'); + }; + +} + + +///////////////////////////////////////////////// +// EXPORT DE MODULE POUR QU'IL SOIT LU DANS LES AUTRES FICHIERS JS +///////////////////////////////////////////////// +module.exports = { + import_ass_locales_v2 +} \ No newline at end of file diff --git a/controllers/codesController.js b/controllers/codesController.js new file mode 100644 index 0000000..1ab03ab --- /dev/null +++ b/controllers/codesController.js @@ -0,0 +1,128 @@ +///////////////////////////////////////////////// +// APPELS DES MODULES +///////////////////////////////////////////////// +const path = require("path"); +// CALCUL DE DATE +const moment = require('moment'); +// uuid +const { v4: uuidv4 } = require('uuid'); + +///////////////////////////////////////////////// +// APPELS DES MODULES PERSOS +///////////////////////////////////////////////// +// loggings +const logger = require("../public/js/app/logger_adhesion"); +// DB +const { connect_DB_promise } = require('../modules/db/databaseconnect'); + +//////////////////////////////////////////////////// +// FILE NAME +//////////////////////////////////////////////////// +const filename = path.parse(__filename).base; + +// GOOGLE SHEET PARAMETERS +///////////////////////////////////////////////// +const { GoogleSpreadsheet } = require('google-spreadsheet'); +const GS_creds = require('../inscriptionsafps-53b60452f63d.json'); +const GS_codes_secrets = new GoogleSpreadsheet(process.env.gsheet_codes_secrets); +const { error } = require("console"); + + +///////////////////////////////////////////////// +// FONCTIONS +///////////////////////////////////////////////// + +const generer_codes = async function(req, res) { + + logger.info("======================================", { label: filename }); + logger.info("======== FUNCTION generer_codes ==========", { label: filename }); + logger.info("======================================", { label: filename }); + + moment.locale('fr'); + let now = moment().format("YYYY-MM-DD HH:mm:ss"); + + // Récupérer le nombre de code désiré + nb_codes_a_generer = req.body.nb_code; + + // Si il y a des codes à ajouter on fait le traitement + if (nb_codes_a_generer > 0) { + logger.info("Nombre de codes à générer = " + nb_codes_a_generer, { numsession: req.session.id }); + + // Initier un tableau pour mettre les codes générés + let tab_codes = []; + + // Boucle sur le nombre de codes à générer + for (i=0; i [item.code, item.statut]); + logger.info("sql = " + sql, { numsession: req.session.id }); + logger.info("values = " + values, { numsession: req.session.id }); + + // lancement de la requête + let db_connection_promise = await connect_DB_promise(); + + const [result_sql, fields] = await db_connection_promise.query(sql, [values]); + logger.info("#1 result_sql Row ID added : " + result_sql.insertId, { numsession: req.session.id, label: filename}); + console.log("result_sql = ",result_sql) + + // GOOGLE SHEET - COPIER LES CODES DANS LA GOOGLE SHEET + try { + await GS_codes_secrets.useServiceAccountAuth(GS_creds); + await GS_codes_secrets.loadInfo(); + let GS_codes_secrets_codes_secrets = GS_codes_secrets.sheetsByTitle['codes_secrets']; + + + let ajout_codes = []; + for (let i = 0; i < nb_codes_a_generer; i++) { + ajout_codes.push({ + code: tab_codes[i].code, + date_creation: now, + statut: tab_codes[i].statut + }); + } + await GS_codes_secrets_codes_secrets.addRows(ajout_codes); + + 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 7) : " + error, { numsession: req.session.id, label: filename}); + req.session.message5 = '"Il y a un problème système, "' + error; + res.redirect('/adhesion/maj_googlesheet'); + } + + // A LA FIN DU TRAITEMENT ON AFFICHE LA PAGE AVEC LE RÉSULTAT + if (result_sql.affectedRows > 0) { + req.session.message5 = 'Nombre de codes ajoutés = '+result_sql.affectedRows; + } else { + req.session.message5 = 'Aucun code ajouté'; + } + logger.info("req.session.message5 : " + req.session.message5, { numsession: req.session.id, label: filename}); + } else { + req.session.message5 = 'Veuillez renseigner le nombre de codes à générer'; + logger.info("req.session.message5 : " + req.session.message5, { numsession: req.session.id, label: filename}); + } + + res.redirect('/adhesion/maj_googlesheet'); +} + + +///////////////////////////////////////////////// +// EXPORT DE MODULE POUR QU'IL SOIT LU DANS LES AUTRES FICHIERS JS +///////////////////////////////////////////////// + +module.exports = { + generer_codes +} \ No newline at end of file diff --git a/controllers/concert_annuel/adminController.js b/controllers/concert_annuel/adminController.js new file mode 100644 index 0000000..ae003a1 --- /dev/null +++ b/controllers/concert_annuel/adminController.js @@ -0,0 +1,186 @@ +///////////////////////////////////////////////// +// 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'); + +//////////////////////////////////////////////////// +// FILE NAME +//////////////////////////////////////////////////// +const filename = path.parse(__filename).base; + +///////////////////////////////////////////////// +// APPELS DES FONCTIONS +///////////////////////////////////////////////// +const sleep = require("./../../modules/sleep"); + +//////////////////////////////////////////////////// +// 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 + }); +} + +///////////////////////////////////////////////// +// PAGE 1 +// DOMAIN/concert/identifier +// 2. SAISIE DU L'IDENTIFIANT +// VÉRIFICATION SI L'IDENTIFIANT EST ADHÉRENT +///////////////////////////////////////////////// + +const adminController = async function (req, res) { + + logger.info("======================================", { label: filename }); + logger.info("======== FUNCTION adminController ==========", { label: filename }); + logger.info("======================================", { label: filename }); + + function affiche_page_admin() { + //////////////////////////////////////////////////// + // 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/admin'); + }; + + 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; + } + + // CONNECTION DB PROMISE + try { + //Connexion + let db_connection_promise = await connect_DB_promise(); + + let sql_count_instruments = 'SELECT count(ca_concertiste.concertiste_intrument) AS concertistes_total FROM ca_concertiste LEFT JOIN ca_adherent ON ca_concertiste.identifiant = ca_adherent.identifiant WHERE ca_adherent.stripe_statut_paiement = "paye"'; + var [results_count_instruments, fields_count_instruments] = await db_connection_promise.execute(sql_count_instruments); + console.log("results_count_instruments = ",results_count_instruments); + + let sql_count_piano = 'SELECT count(ca_concertiste.concertiste_intrument) AS piano FROM ca_concertiste LEFT JOIN ca_adherent ON ca_concertiste.identifiant = ca_adherent.identifiant WHERE ca_concertiste.concertiste_intrument = "Piano" AND ca_adherent.stripe_statut_paiement = "paye"'; + var [results_count_piano, fields_count_piano] = await db_connection_promise.execute(sql_count_piano); + console.log("results_count_piano = ",results_count_piano); + + let sql_count_violon_1 = 'SELECT count(ca_concertiste.concertiste_intrument) AS violon_1 FROM ca_concertiste LEFT JOIN ca_adherent ON ca_concertiste.identifiant = ca_adherent.identifiant WHERE ca_concertiste.concertiste_intrument = "Violon" AND (ca_concertiste.concertiste_cahier = "Cahier 1" OR ca_concertiste.concertiste_cahier = "Cahier 2" OR ca_concertiste.concertiste_cahier = "Cahier 3" OR ca_concertiste.concertiste_cahier = "Cahier 4" OR ca_concertiste.concertiste_cahier = "Cahier 5") AND ca_adherent.stripe_statut_paiement = "paye"'; + var [results_count_violon_1, fields_count_violon_1] = await db_connection_promise.execute(sql_count_violon_1); + console.log("results_count_violon_1 = ",results_count_violon_1); + + let sql_count_violon_2 = 'SELECT count(ca_concertiste.concertiste_intrument) AS violon_2 FROM ca_concertiste LEFT JOIN ca_adherent ON ca_concertiste.identifiant = ca_adherent.identifiant WHERE ca_concertiste.concertiste_intrument = "Violon" AND (ca_concertiste.concertiste_cahier = "Cahier 6" OR ca_concertiste.concertiste_cahier = "Cahier 7" OR ca_concertiste.concertiste_cahier = "Cahier 8" OR ca_concertiste.concertiste_cahier = "Cahier 9" OR ca_concertiste.concertiste_cahier = "Cahier 10") AND ca_adherent.stripe_statut_paiement = "paye"'; + var [results_count_violon_2, fields_count_violon_2] = await db_connection_promise.execute(sql_count_violon_2); + console.log("results_count_violon_2 = ",results_count_violon_2); + + let sql_count_alto = 'SELECT count(ca_concertiste.concertiste_intrument) AS alto FROM ca_concertiste LEFT JOIN ca_adherent ON ca_concertiste.identifiant = ca_adherent.identifiant WHERE ca_concertiste.concertiste_intrument = "Alto" AND ca_adherent.stripe_statut_paiement = "paye"'; + var [results_count_alto, fields_count_alto] = await db_connection_promise.execute(sql_count_alto); + console.log("results_count_alto = ",results_count_alto); + + let sql_count_violoncelle_1 = 'SELECT count(ca_concertiste.concertiste_intrument) AS violoncelle_1 FROM ca_concertiste LEFT JOIN ca_adherent ON ca_concertiste.identifiant = ca_adherent.identifiant WHERE ca_concertiste.concertiste_intrument = "Violoncelle" AND (ca_concertiste.concertiste_cahier = "Cahier 1" OR ca_concertiste.concertiste_cahier = "Cahier 2" OR ca_concertiste.concertiste_cahier = "Cahier 3" OR ca_concertiste.concertiste_cahier = "Cahier 4") AND ca_adherent.stripe_statut_paiement = "paye"'; + var [results_count_violoncelle_1, fields_count_violoncelle_1] = await db_connection_promise.execute(sql_count_violoncelle_1); + console.log("results_count_violoncelle_1 = ",results_count_violoncelle_1); + + let sql_count_violoncelle_2 = 'SELECT count(ca_concertiste.concertiste_intrument) AS violoncelle_2 FROM ca_concertiste LEFT JOIN ca_adherent ON ca_concertiste.identifiant = ca_adherent.identifiant WHERE ca_concertiste.concertiste_intrument = "Violoncelle" AND (ca_concertiste.concertiste_cahier = "Cahier 5" OR ca_concertiste.concertiste_cahier = "Cahier 6" OR ca_concertiste.concertiste_cahier = "Cahier 7" OR ca_concertiste.concertiste_cahier = "Cahier 8" OR ca_concertiste.concertiste_cahier = "Cahier 9" OR ca_concertiste.concertiste_cahier = "Cahier 10") AND ca_adherent.stripe_statut_paiement = "paye"'; + var [results_count_violoncelle_2, fields_count_violoncelle_2] = await db_connection_promise.execute(sql_count_violoncelle_2); + console.log("results_count_violoncelle_2 = ",results_count_violoncelle_2); + + let sql_count_trompette = 'SELECT count(ca_concertiste.concertiste_intrument) AS trompette FROM ca_concertiste LEFT JOIN ca_adherent ON ca_concertiste.identifiant = ca_adherent.identifiant WHERE ca_concertiste.concertiste_intrument = "Trompette" AND ca_adherent.stripe_statut_paiement = "paye"'; + var [results_count_trompette, fields_count_trompette] = await db_connection_promise.execute(sql_count_trompette); + console.log("results_count_trompette = ",results_count_trompette); + + let sql_count_flute = 'SELECT count(ca_concertiste.concertiste_intrument) AS flute FROM ca_concertiste LEFT JOIN ca_adherent ON ca_concertiste.identifiant = ca_adherent.identifiant WHERE ca_concertiste.concertiste_intrument = "Flute" AND ca_adherent.stripe_statut_paiement = "paye"'; + var [results_count_flute, fields_count_flute] = await db_connection_promise.execute(sql_count_flute); + console.log("results_count_flute = ",results_count_flute); + + let sql_count_harpe = 'SELECT count(ca_concertiste.concertiste_intrument) AS harpe FROM ca_concertiste LEFT JOIN ca_adherent ON ca_concertiste.identifiant = ca_adherent.identifiant WHERE ca_concertiste.concertiste_intrument = "Harpe" AND ca_adherent.stripe_statut_paiement = "paye"'; + var [results_count_harpe, fields_count_harpe] = await db_connection_promise.execute(sql_count_harpe); + console.log("results_count_harpe = ",results_count_harpe); + + let sql_count_encadrant_prof = 'SELECT count(ca_encadrant.identifiant) AS encadrant_prof FROM ca_encadrant WHERE ca_encadrant.encadrant_type="Professeur"'; + var [results_count_encadrant_prof, fields_count_encadrant_prof] = await db_connection_promise.execute(sql_count_encadrant_prof); + console.log("results_count_encadrant_prof = ",results_count_encadrant_prof); + + let sql_count_encadrant_parent = 'SELECT count(ca_encadrant.identifiant) AS encadrant_parent FROM ca_encadrant WHERE ca_encadrant.encadrant_type="Parent"'; + var [results_count_encadrant_parent, fields_count_encadrant_parent] = await db_connection_promise.execute(sql_count_encadrant_parent); + console.log("results_count_encadrant_parent = ",results_count_encadrant_parent); + + let sql_count_spectateurs = 'SELECT sum(ca_adherent.commande_nb_spectateur) AS spectateurs FROM `ca_adherent`'; + var [results_count_spectateurs, fields_count_spectateurs] = await db_connection_promise.execute(sql_count_spectateurs); + console.log("results_count_spectateurs = ",results_count_spectateurs); + + + } catch (error) { + // Echec de connection à la BD + logger.error("Il y a un problème avec la connection à la base de données! : " + error, { numsession: req.session.id }); + req.session.err_mail_form_adhesion_1 = '"Il y a un problème système connexion base de données, veuillez recommencer, "' + error; + //await db_connection_promise.end(); + affiche_page_identifier(); + } + + + + + + // affichage du template ejs /views/page_templates/inscription_accueil.ejs + + // results_count_instruments = { name: 'John', age: 30, job: 'Developer' }; + res.render('concert/page_templates/admin', { + results_count_instruments: results_count_instruments[0], + results_count_piano: results_count_piano[0], + results_count_violon_1: results_count_violon_1[0], + results_count_violon_2: results_count_violon_2[0], + results_count_violoncelle_1: results_count_violoncelle_1[0], + results_count_violoncelle_2: results_count_violoncelle_2[0], + results_count_trompette: results_count_trompette[0], + results_count_alto: results_count_alto[0], + results_count_flute: results_count_flute[0], + results_count_harpe: results_count_harpe[0], + results_count_encadrant_prof: results_count_encadrant_prof[0], + results_count_encadrant_parent: results_count_encadrant_parent[0], + results_count_spectateurs: results_count_spectateurs[0] + }); + + + + +} + +///////////////////////////////////////////////// +// EXPORT DES MODULES POUR QU'ILS PUISSENT LUS PAR LES AUTRES FICHIERS JS +///////////////////////////////////////////////// + +module.exports = { + adminController +} diff --git a/controllers/concert_annuel/affiche_identiferController.js b/controllers/concert_annuel/affiche_identiferController.js new file mode 100644 index 0000000..691c053 --- /dev/null +++ b/controllers/concert_annuel/affiche_identiferController.js @@ -0,0 +1,143 @@ +///////////////////////////////////////////////// +// 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'); + + + +///////////////////////////////////////////////// +// APPELS DES FONCTIONS +///////////////////////////////////////////////// +const sleep = require("./../../modules/sleep"); + +//////////////////////////////////////////////////// +// 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 + }); +} + +///////////////////////////////////////////////// +// PAGE 1 +// DOMAIN/concert/identifier +// AFFICHAGE DE LA PAGE DE SAISIE DE L'IDENTIFIANT +// AFFICHAGE DU NOMBRE DE PLACES RESTANTES +///////////////////////////////////////////////// + +const openidentifiant = async function (req, res) { + logger.info("======================================", { label: filename }); + logger.info("======== FUNCTION openidentifiant ==========", { label: filename }); + logger.info("======================================", { label: filename }); + + 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/inscrip_formulaire_identifier'); + }; + + //////////////////////////////////////////////////// + // ON RÉCUPÈRE LE NOMBRE DE PLACES DÉJA COMMANDÉES DANS LA BASE DE DONNÉES + // !!! ATTENTION IL FAUT QUE LES NOMBRES SOIENT A ZÉRO AU DÉMMARAGE dans la table ca_decompte_place + //////////////////////////////////////////////////// + + async function recup_nb_places () { + logger.info("==================================================================", { label: filename }); + logger.info("======== ON RÉCUPÈRE LE NOMBRE DE PLACES DÉJA COMMANDÉES DANS LA BASE DE DONNÉES ==========", { label: filename }); + + // CONNECTION DB PROMISE + try { + //Connexion + let db_connection_promise = await connect_DB_promise(); + //Query + let sql = 'select spectateur_commandes,encadr_parent_commandes,piano_commandes,alto_commandes,flute_commandes,trompette_commandes,harpe_commandes,violon1_commandes,violon2_commandes,violoncelle1_commandes,violoncelle2_commandes from ca_decompte_place'; + const [results, fields] = await db_connection_promise.execute(sql); + + req.session.spectateur_nb_restantes = process.env.spectateur_nb_places - results[0].spectateur_commandes; + req.session.encadr_parent_nb_restantes = process.env.encadr_parent_nb_places - results[0].encadr_parent_commandes; + req.session.piano_nb_restantes = process.env.piano_nb_places - results[0].piano_commandes; + req.session.alto_nb_restantes = process.env.alto_nb_places - results[0].alto_commandes; + req.session.flute_nb_restantes = process.env.flute_nb_places - results[0].flute_commandes; + req.session.trompette_nb_restantes = process.env.trompette_nb_places - results[0].trompette_commandes; + req.session.harpe_nb_restantes = process.env.harpe_nb_places - results[0].harpe_commandes; + req.session.violon1_nb_restantes = process.env.violon1_nb_places - results[0].violon1_commandes; + req.session.violon2_nb_restantes = process.env.violon2_nb_places - results[0].violon2_commandes; + req.session.violoncelle1_nb_restantes = process.env.violoncelle1_nb_places - results[0].violoncelle1_commandes; + req.session.violoncelle2_nb_restantes = process.env.violoncelle2_nb_places - results[0].violoncelle2_commandes; + + res.locals.spectateur_nb_restantes = req.session.spectateur_nb_restantes; + res.locals.encadr_parent_nb_restantes = req.session.encadr_parent_nb_restantes; + logger.info("res.locals.encadr_parent_nb_restantes : " + res.locals.encadr_parent_nb_restantes, { numsession: req.session.id, label: filename }); + res.locals.piano_nb_restantes = req.session.piano_nb_restantes; + res.locals.alto_nb_restantes = req.session.alto_nb_restantes; + res.locals.flute_nb_restantes = req.session.flute_nb_restantes; + res.locals.trompette_nb_restantes = req.session.trompette_nb_restantes; + res.locals.harpe_nb_restantes = req.session.harpe_nb_restantes; + res.locals.violon1_nb_restantes = req.session.violon1_nb_restantes; + res.locals.violon2_nb_restantes = req.session.violon2_nb_restantes; + res.locals.violoncelle1_nb_restantes = req.session.violoncelle1_nb_restantes; + res.locals.violoncelle2_nb_restantes = req.session.violoncelle2_nb_restantes; + + affiche_page_identifier(); + + } catch (error) { + // Echec de connection à la BD + logger.error("Il y a un problème avec la connection à la base de données! : " + error, { numsession: req.session.id, label: filename }); + req.session.err_mail_form_adhesion_1 = "Il y a un problème système connexion base de données, veuillez recommencer."; + //await db_connection_promise.end(); + affiche_page_identifier(); + } + } + + recup_nb_places(); + + + +} + +///////////////////////////////////////////////// +// EXPORT DES MODULES POUR QU'ILS PUISSENT LUS PAR LES AUTRES FICHIERS JS +///////////////////////////////////////////////// + +module.exports = { + openidentifiant +} + diff --git a/controllers/concert_annuel/ajout_concertController.js b/controllers/concert_annuel/ajout_concertController.js new file mode 100644 index 0000000..8b14599 --- /dev/null +++ b/controllers/concert_annuel/ajout_concertController.js @@ -0,0 +1,285 @@ +///////////////////////////////////////////////// +// 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'); + + + +///////////////////////////////////////////////// +// APPELS DES FONCTIONS +///////////////////////////////////////////////// +const sleep = require("./../../modules/sleep"); + +//////////////////////////////////////////////////// +// 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 + }); +} + +///////////////////////////////////////////////// +// PAGE 1 +// DOMAINconcert/identifier +// 2. SAISIE DU L'IDENTIFIANT +// VÉRIFICATION SI L'IDENTIFIANT EST ADHÉRENT +///////////////////////////////////////////////// + +const checkidentifiant = async function (req, res) { + + logger.info("======================================", { label: filename }); + logger.info("======== FUNCTION checkidentifiant ==========", { label: filename }); + logger.info("======================================", { label: filename }); + + function affiche_page_admin() { + //////////////////////////////////////////////////// + // 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/admin'); + }; + + // VARIABLES + req.session.quota_spectateur = "nondepasse"; + req.session.quota_concertiste = "nondepasse"; + + + //////////////////////////////////////////////////// + // ON RÉCUPÈRE LE NOMBRE DE PLACES DÉJA COMMANDÉES DANS LA BASE DE DONNÉES + // !!! ATTENTION IL FAUT QUE LES NOMBRES SOIENT A ZÉRO AU DÉMMARAGE dans la table ca_decompte_place + //////////////////////////////////////////////////// + + async function recup_nb_places () { + logger.info("==================================================================", { label: filename }); + logger.info("======== ON RÉCUPÈRE LE NOMBRE DE PLACES DÉJA COMMANDÉES DANS LA BASE DE DONNÉES ==========", { label: filename }); + + // CONNECTION DB PROMISE + try { + //Connexion + let db_connection_promise = await connect_DB_promise(); + //Query + let sql = 'select spectateur_commandes,encadr_parent_commandes,piano_commandes,alto_commandes,flute_commandes,trompette_commandes,harpe_commandes,violon1_commandes,violon2_commandes,violoncelle1_commandes,violoncelle2_commandes from ca_decompte_place'; + const [results, fields] = await db_connection_promise.execute(sql); + + req.session.spectateur_nb_restantes = process.env.spectateur_nb_places - results[0].spectateur_commandes; + req.session.encadr_parent_nb_restantes = process.env.encadr_parent_nb_places - results[0].encadr_parent_commandes; + req.session.piano_nb_restantes = process.env.piano_nb_places - results[0].piano_commandes; + req.session.alto_nb_restantes = process.env.alto_nb_places - results[0].alto_commandes; + req.session.flute_nb_restantes = process.env.flute_nb_places - results[0].flute_commandes; + req.session.trompette_nb_restantes = process.env.trompette_nb_places - results[0].trompette_commandes; + req.session.harpe_nb_restantes = process.env.harpe_nb_places - results[0].harpe_commandes; + req.session.violon1_nb_restantes = process.env.violon1_nb_places - results[0].violon1_commandes; + req.session.violon2_nb_restantes = process.env.violon2_nb_places - results[0].violon2_commandes; + req.session.violoncelle1_nb_restantes = process.env.violoncelle1_nb_places - results[0].violoncelle1_commandes; + req.session.violoncelle2_nb_restantes = process.env.violoncelle2_nb_places - results[0].violoncelle2_commandes; + + res.locals.spectateur_nb_restantes = req.session.spectateur_nb_restantes; + res.locals.encadr_parent_nb_restantes = req.session.encadr_parent_nb_restantes; + res.locals.piano_nb_restantes = req.session.piano_nb_restantes; + res.locals.alto_nb_restantes = req.session.alto_nb_restantes; + res.locals.flute_nb_restantes = req.session.flute_nb_restantes; + res.locals.trompette_nb_restantes = req.session.trompette_nb_restantes; + res.locals.harpe_nb_restantes = req.session.harpe_nb_restantes; + res.locals.violon1_nb_restantes = req.session.violon1_nb_restantes; + res.locals.violon2_nb_restantes = req.session.violon2_nb_restantes; + res.locals.violoncelle1_nb_restantes = req.session.violoncelle1_nb_restantes; + res.locals.violoncelle2_nb_restantes = req.session.violoncelle2_nb_restantes; + + + } catch (error) { + // Echec de connection à la BD + logger.error("Il y a un problème avec la connection à la base de données! : " + error, { numsession: req.session.id }); + req.session.err_mail_form_adhesion_1 = "Il y a un problème système connexion base de données, veuillez recommencer."; + //await db_connection_promise.end(); + + } + } + + recup_nb_places(); + + + ///////////////////////////////////////////////// + // RECHERCHE DANS DB + // - SI IDENTIFIANT SAISIE EST DÉJÀ INSCRIT AU CONCERT + + + + ///////////////////////////////////////////////// + // ON RÉCUPÈRE L'IDENTIFIANT SAISIE DANS LE FORMULAIRE + // ON REGARDE S'il à bien rempli l'identifiant et s'il a coché la case "je ne suis pas adhérent" + logger.info("identifiant saisi : " + req.body.identifiant, { numsession: req.session.id, label: filename}); + + if (req.body.identifiant && req.body.check_nonadherent) { + req.session.err_mail_form_adhesion_1 = "Pour vous inscrire au concert, 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 = 'Pour adhérer Cliquez ici'; + req.session.err_mail_form_adhesion_3 = ''; + affiche_page_admin(); + } + if (!req.body.identifiant && req.body.check_nonadherent) { + req.session.err_mail_form_adhesion_1 = "Pour vous inscrire au concert, 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 = 'Pour adhérer Cliquez ici'; + req.session.err_mail_form_adhesion_3 = ''; + affiche_page_admin(); + } + 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)."; + 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'; + affiche_page_admin(); + } + if (req.body.identifiant && !req.body.check_nonadherent) { + // SAISIE OK + req.session.identifiant = req.body.identifiant; + + // EST-CE QUE L'IDENTIFIANT SAISI EST DÉJA INSCRIT AU CONCERT TABLE ca_adherent + + // CONNECTION DB PROMISE + try { + //Connexion + let db_connection_promise = await connect_DB_promise(); + + //Query + let sql = 'select identifiant, association_suzuki, adherent_mail, commande_nb_spectateur, commande_nb_concertiste from ca_adherent where identifiant = "' + req.session.identifiant + '"'; + const [results, fields] = await db_connection_promise.execute(sql); + logger.info("Row ca_adherent : " + results.length, { numsession: req.session.id, label: filename}); + + if (results.length) { + // DÉJA INSCRIT AU CONCERT + logger.info("Identifant déjà inscrit au concert.", { numsession: req.session.id, label: filename}); + + // TAG ADHÉRENT DÉJÀ INSCRIT + req.session.deja_inscrit_concert = "oui"; + + // QUOTA GÉNÉRAL DE PLACES TOTALES + let sql_ca_decompte_place = 'select spectateur_commandes from ca_decompte_place'; + const [results_ca_decompte_place, fields_ca_decompte_place] = await db_connection_promise.execute(sql_ca_decompte_place); + logger.info("SQL nombre de places spectateurs déjà commandées : " + results_ca_decompte_place[0].spectateur_commandes, { numsession: req.session.id, label: filename}); + // ON REGARDE LE NOMBRE DE SPECTATEURS DÉJÀ INSCRITS + + // QUOTA GÉNÉRAL ATTEINT + if (results_ca_decompte_place[0].spectateur_commandes >= process.env.spectateur_nb_places){ + // QUOTA DÉPASSÉ + logger.info("Quota spectateur TOTAL dépassé : " + results[0].commande_nb_spectateur, { numsession: req.session.id, label: filename}); + req.session.err_mail_form_adhesion_1 = "Le nombre total de spectateurs a été atteint."; + req.session.err_mail_form_adhesion_2 = "Vous ne pouvez plus commander de places"; + affiche_page_identifier(); + } + + // NOMBRE DE PLACES TOTALES RESTANTES + req.session.quota_total_spectateur = process.env.spectateur_nb_places - results_ca_decompte_place[0].spectateur_commandes; + logger.info("NOMBRE DE PLACES TOTALES RESTANTES : " + req.session.quota_total_spectateur, { numsession: req.session.id, label: filename}); + + // ON REGARDE LE NOMBRE DE PARTICIPANTS DÉJÀ INSCRITS + if (results[0].commande_nb_spectateur > 6){ + req.session.quota_spectateur = "depasse"; + } + + if (results[0].commande_nb_concertiste > 3){ + req.session.quota_concertiste = "depasse"; + } + logger.info("req.session.quota_spectateur = " + req.session.quota_spectateur , { numsession: req.session.id, label: filename}); + logger.info("req.session.quota_concertiste = " + req.session.quota_concertiste , { numsession: req.session.id, label: filename}); + + // On calcule le nombre de places concertistes restantes (tous instruments) + req.session.tout_instrument_nb_restantes = req.session.piano_nb_restantes + req.session.alto_nb_restantes + req.session.flute_nb_restantes + req.session.trompette_nb_restantes + req.session.harpe_nb_restantes + req.session.violon1_nb_restantes + req.session.violon2_nb_restantes + req.session.violoncelle1_nb_restantes + req.session.violoncelle2_nb_restantes; + logger.info("NOMBRE DE PLACES TOUT INSTRUMENTS (session) = " + req.session.tout_instrument_nb_restantes, { numsession: req.session.id, label: filename}); + + // On récupère le nom de l'association Suzuki et le mail de l'adhérent + req.session.adherent_mail = results[0].adherent_mail; + logger.info("req.session.adherent_mail = " + req.session.adherent_mail , { numsession: req.session.id, label: filename}); + req.session.association_suzuki = results[0].association_suzuki; + // ON AFFICHE LA PAGE DU FORMULAIRE DE SAISIE DES INFORMATIONS DE L'INSCRIPTION + res.redirect('/concert/admin/inscription_famille'); + + //req.session.err_mail_form_adhesion_1 = "Vous êtes déjà inscrit au Concert national Unesco."; + //affiche_page_admin(); + + + } else { + // NON INSCRIT AU CONCERT + logger.info("Identifant non inscrit au concert.", { numsession: req.session.id, label: filename}); + // TAG ADHÉRENT DÉJÀ INSCRIT + req.session.deja_inscrit_concert = "non"; + + ///////////////////////////////////////////////// + // RECHERCHE SI PERSONNE EST ADHÉRENTE À L'AFPS + // DANS BD ADHESION adherent + + sql = 'select identifiant,association_suzuki from adherent where identifiant = "' + req.session.identifiant + '"'; + //Query + const [results, fields] = await db_connection_promise.execute(sql); + logger.info("Row adherent : " + results.length, { numsession: req.session.id, label: filename}); + if (results.length === 1) { + // LA PERSONNE EST BIEN ADHÉRENTE + logger.info("identifiant BD adhérent : " + results[0].identifiant, { numsession: req.session.id, label: filename}); + req.session.association_suzuki = results[0].association_suzuki; + // On calcule le nombre de places concertistes restantes (tous instruments) + req.session.tout_instrument_nb_restantes = req.session.piano_nb_restantes + req.session.alto_nb_restantes + req.session.flute_nb_restantes + req.session.trompette_nb_restantes + req.session.harpe_nb_restantes + req.session.violon1_nb_restantes + req.session.violon2_nb_restantes + req.session.violoncelle1_nb_restantes + req.session.violoncelle2_nb_restantes; + logger.info("NOMBRE DE PLACES TOUT INSTRUMENTS (session) = " + req.session.tout_instrument_nb_restantes, { numsession: req.session.id, label: filename}); + // ON AFFICHE LA PAGE DU FORMULAIRE DE SAISIE DES INFORMATIONS DE L'INSCRIPTION + res.redirect('/concert/admin/inscription_famille'); + } else { + // LA PERSONNE N'EST PAS ADHÉRENTE + logger.info("Identifant NON adhérent.", { numsession: req.session.id, label: filename}); + req.session.err_mail_form_adhesion_1 = "Cet identifiant N'EST PAS 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 concert."; + req.session.err_mail_form_adhesion_3 = 'Pour adhérer à l\'Association Française pour la Pédagogie Suzuki Cliquez ici'; + affiche_page_admin(); + } + } + + } catch (error) { + // Echec de connection à la BD + logger.error("Il y a un problème avec la connection à la base de données! : " + error, { numsession: req.session.id }); + req.session.err_mail_form_adhesion_1 = "Il y a un problème système connexion base de données, veuillez recommencer."; + //await db_connection_promise.end(); + affiche_page_admin(); + } + + } + +} + +///////////////////////////////////////////////// +// EXPORT DES MODULES POUR QU'ILS PUISSENT LUS PAR LES AUTRES FICHIERS JS +///////////////////////////////////////////////// + +module.exports = { + checkidentifiant +} diff --git a/controllers/concert_annuel/ajout_familleController.js b/controllers/concert_annuel/ajout_familleController.js new file mode 100644 index 0000000..1b3c281 --- /dev/null +++ b/controllers/concert_annuel/ajout_familleController.js @@ -0,0 +1,204 @@ +///////////////////////////////////////////////// +// 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'); + + + +///////////////////////////////////////////////// +// APPELS DES FONCTIONS +///////////////////////////////////////////////// +const sleep = require("./../../modules/sleep"); + +//////////////////////////////////////////////////// +// 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 + }); +} + +///////////////////////////////////////////////// +// 3 - PAGE INSCRIPTION FAMILLE +///////////////////////////////////////////////// +const inscription_famille = async function (req, res) { + + logger.info("======================================", { label: filename }); + logger.info("======== FUNCTION inscription_famille ==========", { label: filename }); + logger.info("======================================", { label: filename }); + + // VARIABLES + let cout_concertiste = 0; + let cout_spectateur = 0; + let montant_total = 0; + let montant_commande = 0; + let don = 0; + let encadrant_compteur = 0; + let piano_compteur = 0; + let alto_compteur = 0; + let flute_compteur = 0; + let trompette_compteur = 0; + let harpe_compteur = 0; + let violon1_compteur = 0; + let violon2_compteur = 0; + let violoncelle1_compteur = 0; + let violoncelle2_compteur = 0; + + + + function affiche_page_admin() { + //////////////////////////////////////////////////// + // 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/admin'); + }; + + ///////////////////////////////////////////////// + // RÉCUPÉRER LES INFORMATIONS SAISIES DANS LE FORMULAIRE + ///////////////////////////////////////////////// + + + req.session.association_suzuki = req.body.association_suzuki; + req.session.adherent_nom = req.body.adherent_nom; + req.session.adherent_prenom = req.body.adherent_prenom; + req.session.adherent_telephone_mobile = req.body.adherent_telephone_mobile; + if (req.session.deja_inscrit_concert == "non") { + req.session.adherent_mail = req.body.adherent_mail; + } + + req.session.hebergement_ville = req.body.hebergement_ville; + + if (req.body.hebergement_nb > 0) { + req.session.hebergement_nb = req.body.hebergement_nb; + } else { + req.session.hebergement_nb = 0; + } + + if (req.body.spectateur_nb_place > 0) { + req.session.spectateur_nb_place = req.body.spectateur_nb_place; + cout_spectateur = 20 * req.session.spectateur_nb_place; + } else { + req.session.spectateur_nb_place = 0; + } + req.session.commentaire_adherent = req.body.commentaire_adherent; + + for (let toto = 1; toto < 5; toto++) { + if (req.body["eleve_"+toto+"_nom"]){ + req.session["eleve_"+toto+"_nom"] = req.body["eleve_"+toto+"_nom"]; + req.session["eleve_"+toto+"_prenom"] = req.body["eleve_"+toto+"_prenom"]; + req.session["eleve_"+toto+"_age"] = req.body["eleve_"+toto+"_age"]; + req.session["eleve_"+toto+"_instrument"] = req.body["eleve_"+toto+"_instrument"]; + req.session["eleve_"+toto+"_cahier"] = req.body["eleve_"+toto+"_cahier"]; + req.session["eleve_"+toto+"_piece"] = req.body["eleve_"+toto+"_piece"]; + req.session["eleve_"+toto+"_prof_nom"] = req.body["eleve_"+toto+"_prof_nom"]; + req.session["eleve_"+toto+"_prof_mail"] = req.body["eleve_"+toto+"_prof_mail"]; + cout_concertiste += 23; + if (req.session["eleve_"+toto+"_instrument"] == "Piano") {piano_compteur++} + if (req.session["eleve_"+toto+"_instrument"] == "Alto") {alto_compteur++} + if (req.session["eleve_"+toto+"_instrument"] == "Flute") {flute_compteur++} + if (req.session["eleve_"+toto+"_instrument"] == "Trompette") {trompette_compteur++} + if (req.session["eleve_"+toto+"_instrument"] == "Harpe") {harpe_compteur++} + if (req.session["eleve_"+toto+"_instrument"] == "Violon" && (req.session["eleve_"+toto+"_cahier"]=="Cahier 1" || req.session["eleve_"+toto+"_cahier"]=="Cahier 2" || req.session["eleve_"+toto+"_cahier"]=="Cahier 3" || req.session["eleve_"+toto+"_cahier"]=="Cahier 4" || req.session["eleve_"+toto+"_cahier"]=="Cahier 5")) {violon1_compteur++} + if (req.session["eleve_"+toto+"_instrument"] == "Violon" && (req.session["eleve_"+toto+"_cahier"]=="Cahier 6" || req.session["eleve_"+toto+"_cahier"]=="Cahier 7" || req.session["eleve_"+toto+"_cahier"]=="Cahier 8" || req.session["eleve_"+toto+"_cahier"]=="Cahier 9" || req.session["eleve_"+toto+"_cahier"]=="Cahier 10")) {violon2_compteur++} + if (req.session["eleve_"+toto+"_instrument"] == "Violoncelle" && (req.session["eleve_"+toto+"_cahier"]=="Cahier 1" || req.session["eleve_"+toto+"_cahier"]=="Cahier 2" || req.session["eleve_"+toto+"_cahier"]=="Cahier 3" || req.session["eleve_"+toto+"_cahier"]=="Cahier 4")) {violoncelle1_compteur++} + if (req.session["eleve_"+toto+"_instrument"] == "Violoncelle" && (req.session["eleve_"+toto+"_cahier"]=="Cahier 5" || req.session["eleve_"+toto+"_cahier"]=="Cahier 6" || req.session["eleve_"+toto+"_cahier"]=="Cahier 7" || req.session["eleve_"+toto+"_cahier"]=="Cahier 8" || req.session["eleve_"+toto+"_cahier"]=="Cahier 9" || req.session["eleve_"+toto+"_cahier"]=="Cahier 10")) {violoncelle2_compteur++} + + } else { + req.session["eleve_"+toto+"_nom"] = undefined; + req.session["eleve_"+toto+"_prenom"] = undefined; + req.session["eleve_"+toto+"_age"] = undefined; + req.session["eleve_"+toto+"_instrument"] = undefined; + req.session["eleve_"+toto+"_cahier"] = undefined; + req.session["eleve_"+toto+"_piece"] = undefined; + req.session["eleve_"+toto+"_prof_nom"] = undefined; + req.session["eleve_"+toto+"_prof_mail"] = undefined; + } + } + + for (let toto = 1; toto < 5; toto++) { + if (req.body["encadrant_"+toto+"_nom"]){ + req.session["encadrant_"+toto+"_type"] = req.body["encadrant_"+toto+"_type"]; + req.session["encadrant_"+toto+"_nom"] = req.body["encadrant_"+toto+"_nom"]; + req.session["encadrant_"+toto+"_prenom"] = req.body["encadrant_"+toto+"_prenom"]; + req.session["encadrant_"+toto+"_telephone_mobile"] = req.body["encadrant_"+toto+"_telephone_mobile"]; + req.session["encadrant_"+toto+"_mail"] = req.body["encadrant_"+toto+"_mail"]; + req.session["encadrant_"+toto+"_prof_instrument"] = req.body["encadrant_"+toto+"_prof_instrument"]; + encadrant_compteur++; + } else { + req.session["encadrant_"+toto+"_type"] = undefined; + req.session["encadrant_"+toto+"_nom"] = undefined; + req.session["encadrant_"+toto+"_prenom"] = undefined; + req.session["encadrant_"+toto+"_telephone_mobile"] = undefined; + req.session["encadrant_"+toto+"_mail"] = undefined; + req.session["encadrant_"+toto+"_prof_instrument"] = undefined; + } + } + + if (req.body.don && req.body.don > 0) {req.session.don = req.body.don;} else {req.session.don = 0;} + + + ///////////////////////////////////////////////// + // RÉCAP TARIF + ///////////////////////////////////////////////// + req.session.cout_concertiste = cout_concertiste; + req.session.cout_spectateur = cout_spectateur; + req.session.montant_commande = cout_concertiste + cout_spectateur; + req.session.montant_total = cout_concertiste + cout_spectateur + parseInt(req.session.don); + + ///////////////////////////////////////////////// + // ENVOIE VERS PAGE SUIVANTE + ///////////////////////////////////////////////// + + + + res.redirect('/concert/admin/inscription_recap'); + + + +} + + +///////////////////////////////////////////////// +// EXPORT DES MODULES POUR QU'ILS PUISSENT LUS PAR LES AUTRES FICHIERS JS +///////////////////////////////////////////////// + +module.exports = { + inscription_famille +} \ No newline at end of file diff --git a/controllers/concert_annuel/ajout_payerController.js b/controllers/concert_annuel/ajout_payerController.js new file mode 100644 index 0000000..9cac5dd --- /dev/null +++ b/controllers/concert_annuel/ajout_payerController.js @@ -0,0 +1,1130 @@ +///////////////////////////////////////////////// +// 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'); + +// ADOBE PDF +const PDFServicesSdk = require('@adobe/pdfservices-node-sdk'); +// 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"); +const pdf = require("./../../modules/pdf"); + +//////////////////////////////////////////////////// +// 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 + }); +} + +///////////////////////////////////////////////// +// 5 - CLIC SUR VALIDER +///////////////////////////////////////////////// + +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; + + + // FONCTION POUR AFFICHER LA PAGE EN CAS D'ERREUR + function affiche_page_admin() { + //////////////////////////////////////////////////// + // 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/admin'); + }; + + ///////////////////////////////////////////////// + // 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_admin(); + } 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}); + + + } + + + + + } catch (error) { + // Echec de connection à la BD + logger.error("Il y a un problème avec la connection à la base de données! : " + error, { numsession: req.session.id }); + req.session.err_mail_form_adhesion_1 = '"Il y a un problème système connexion base de données, veuillez recommencer, "' + error; + //await db_connection_promise.end(); + affiche_page_admin(); + } + + } + + + + + logger.info("======================================"); + logger.info("======== payer =========="); + logger.info("======================================"); + + + let sql11; + let sql12; + let sql13; + let sql14; + var mail_objet; + var mail_html; + moment.locale('fr'); + + var today = moment().format('L'); + var identifiant; + let compteur_piano = 0 + let compteur_harpe = 0 + let compteur_trompette = 0 + let compteur_flute = 0 + let compteur_alto = 0 + let compteur_violon1 = 0 + let compteur_violon2 = 0 + let compteur_violoncelle1 = 0 + let compteur_violoncelle2 = 0 + + // FONCTION POUR AFFICHER LA PAGE EN CAS D'ERREUR + function affiche_page_admin() { + //////////////////////////////////////////////////// + // 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/admin'); + }; + + + + + + var customer_email = req.session.adherent_mail; + var payment_status = "paye"; + var amount_total = req.session.montant_total; + + identifiant = req.session.identifiant; + + + try { + + //Connexion + let db_connection_promise = await connect_DB_promise(); + + console.log("req.session.deja_inscrit_concert = ",req.session.deja_inscrit_concert); + + // SI MODE INSCRIPTION INITIALE + if (req.session.deja_inscrit_concert == "non") { + + //Query + sql = 'UPDATE '; + sql += 'ca_adherent'; + sql += ' SET '; + sql += 'stripe_retour = "paiement manuel", '; + sql += 'stripe_date = "' + now + '", '; + + sql += 'stripe_statut_paiement = "paye"'; + sql += ' WHERE identifiant = "' + identifiant + '"'; + + console.log("SQL 123 = ", sql); + + const [results, fields] = await db_connection_promise.execute(sql); + logger.info("Row ca_adherent UPDATE STRIPE: " + results.changedRows, { numsession: req.session.id, label: filename}); + + //ca_concertiste + sql11 = 'SELECT saison, concertiste_nom, concertiste_prenom, concertiste_age, concertiste_intrument, concertiste_cahier, concertiste_piece, concertiste_prof_nom, concertiste_prof_mail, ajout FROM ca_concertiste where identifiant = "' + identifiant + '"'; + //ca_encadrant + sql12 = 'SELECT saison, encadrant_type, encadrant_nom, encadrant_prenom, encadrant_telephone_mobile, encadrant_mail, encadrant__prof_instrument, ajout FROM ca_encadrant where identifiant = "' + identifiant + '"'; + //Nombre de place commandées + sql13 = 'SELECT commande_nb_spectateur, commande_nb_concertiste, commande_nb_encadr_prof, commande_nb_encadr_par, commande_cout_concertiste, commande_cout_spectateur, don, montant_total, stripe_retour FROM ca_adherent where identifiant = "' + identifiant + '"'; + //ca_adherent + sql14 = 'SELECT saison, date_inscription, date_maj, association_suzuki, adherent_nom, adherent_prenom, adherent_telephone_mobile, adherent_mail, hebergement_ville, hebergement_places, comment FROM ca_adherent where identifiant = "' + identifiant + '"'; + + } + + // SI MODE INSCRIPTION AJOUT DE BILLET + // ON SÉLECTIONNE LES CONCERTISTES ET LES ENCADRANTS QUI ONT QUELQUE CHOSE DANS LA CHAMP "AJOUT" + if (req.session.deja_inscrit_concert == "oui") { + //Query + sql = 'UPDATE '; + sql += 'ca_ajout'; + sql += ' SET '; + sql += 'stripe_statut_paiement = "paye"'; + sql += ' WHERE identifiant = "' + identifiant + '"'; + + const [results, fields] = await db_connection_promise.execute(sql); + logger.info("Row ca_adherent UPDATE STRIPE: " + results.changedRows, { numsession: req.session.id, label: filename}); + + //ca_concertiste + sql11 = 'SELECT saison, concertiste_nom, concertiste_prenom, concertiste_age, concertiste_intrument, concertiste_cahier, concertiste_piece, concertiste_prof_nom, concertiste_prof_mail, ajout FROM ca_concertiste where identifiant = "' + identifiant + '" AND ajout IS NOT NULL'; + //ca_encadrant + sql12 = 'SELECT saison, encadrant_type, encadrant_nom, encadrant_prenom, encadrant_telephone_mobile, encadrant_mail, encadrant__prof_instrument, ajout FROM ca_encadrant where identifiant = "' + identifiant + '" AND ajout IS NOT NULL'; + //Nombre de place commandées + sql13 = 'SELECT commande_nb_spectateur, commande_nb_concertiste, commande_nb_encadr_prof, commande_nb_encadr_par, commande_cout_concertiste, commande_cout_spectateur, don, montant_total, stripe_retour FROM ca_ajout where identifiant = "' + identifiant + '"'; + //ca_adherent + sql14 = 'SELECT saison, date_inscription, date_maj, association_suzuki, adherent_nom, adherent_prenom, adherent_telephone_mobile, adherent_mail FROM ca_adherent where identifiant = "' + identifiant + '"'; + } + + //ca_concertiste + const [results_ca_concertiste, fields_ca_concertiste] = await db_connection_promise.execute(sql11); + logger.info("Row ca_concertiste RECUP INFOS : " + results_ca_concertiste.length, { numsession: req.session.id, label: filename}); + + //ca_encadrant + const [results_ca_encadrant, fields_ca_encadrant] = await db_connection_promise.execute(sql12); + logger.info("Row ca_encadrant RECUP INFOS : " + results_ca_encadrant.length, { numsession: req.session.id, label: filename}); + + //Nombre de place commandées + const [results_nb_commande, fields_nb_commande] = await db_connection_promise.execute(sql13); + logger.info("Row results_nb_commande RECUP INFOS : " + results_nb_commande.length, { numsession: req.session.id, label: filename}); + + // RÉCUPÉRATION DES INFORMATIONS PARTICIPANTS POUR ENVOIE MAIL AVEC RÉCAP + //ca_adherent + const [results_ca_adherent, fields_ca_adherent] = await db_connection_promise.execute(sql14); + logger.info("Row ca_adherent RECUP INFOS: " + results_ca_adherent.length, { numsession: req.session.id, label: filename}); + + // ADRESSE ADHÉRENT adherent + sql = 'SELECT adherent_adresse_rue, adherent_adresse_codepostal, adherent_adresse_ville FROM adherent where identifiant = "' + identifiant + '"'; + const [results_adherent, fields_adherent] = await db_connection_promise.execute(sql); + logger.info("Row adherent RECUP INFOS: " + results_adherent.length, { numsession: req.session.id, label: filename}); + + + + // AJOUT DÉCOMPTE DES PLACES + // SI PAIEMENT REUSSI + // !!! Au démarrage de la campagne les champs de la table doivent être à 0 (zéro) et non vide ou null + + + + sql = 'UPDATE '; + sql += 'ca_decompte_place'; + sql += ' SET '; + sql += 'date_maj = "' + now + '", '; + if (results_nb_commande[0].commande_nb_spectateur > 0) { sql += 'spectateur_commandes = spectateur_commandes + ' + results_nb_commande[0].commande_nb_spectateur + ', '; } + if (results_nb_commande[0].commande_nb_concertiste > 0) { sql += 'concertiste_commandes = concertiste_commandes + ' + results_nb_commande[0].commande_nb_concertiste + ', '; } + if (results_nb_commande[0].commande_nb_encadr_prof > 0) { sql += 'encadr_prof_commandes = encadr_prof_commandes + ' + results_nb_commande[0].commande_nb_encadr_prof + ', '; } + if (results_nb_commande[0].commande_nb_encadr_par > 0) { sql += 'encadr_parent_commandes = encadr_parent_commandes + ' + results_nb_commande[0].commande_nb_encadr_par + ', '; } + logger.info("A3 VANT LE IF results_ca_concertiste.length: ", { numsession: req.session.id, label: filename}); + logger.info("results_ca_concertiste.length: " + results_ca_concertiste.length, { numsession: req.session.id, label: filename}); + if (results_ca_concertiste.length > 0) { + for (let i = 0; i 0) { + mail_html += "

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

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

RÉCAPITULATIF

'; + mail_html += "

Identifiant Suzuki : " + identifiant; + if (results_ca_adherent[0].hebergement_places > 0) {mail_html += "


HÉBERGEMENT PROPOSÉ :
Ville : " + results_ca_adherent[0].hebergement_ville + ", nombre de personnes : " + results_ca_adherent[0].hebergement_places + "


";} + if (results_ca_concertiste.length > 0) { + mail_html += "

" + results_ca_concertiste.length + " CONCERTISTE(S) :

"; + mail_html += "

Les concertistes s'engagent à être présents les 2 journées du 20 et 21 avril 2024.

"; + for (let i = 0; i"; + mail_html += "instrument : " + results_ca_concertiste[i].concertiste_intrument + " - " + results_ca_concertiste[i].concertiste_cahier + " - " + results_ca_concertiste[i].concertiste_piece + "
"; + if (results_ca_concertiste[i].concertiste_intrument == "Piano") {mail_html += "Pour le piano l’inscription doit être validée par le comité.
"}; + mail_html += "professeur : " + results_ca_concertiste[i].concertiste_prof_nom + " - " + results_ca_concertiste[i].concertiste_prof_mail + "

"; + } + } + if (results_ca_encadrant.length > 0) { + mail_html += "

" + results_ca_encadrant.length + " ENCADRANT(S) :

"; + mail_html += "

Les encadrants s'engagent à être présents les 2 journées du 20 et 21 avril 2024.

"; + for (let i = 0; i"; + mail_html += "coordonnées : " + results_ca_encadrant[i].encadrant_telephone_mobile + " - " + results_ca_encadrant[i].encadrant_mail + "
"; + if (results_ca_encadrant[i].encadrant__prof_instrument) {mail_html += "instrument : " + results_ca_encadrant[i].encadrant__prof_instrument}; + mail_html += "

"; + } + } + if (results_nb_commande[0].commande_nb_spectateur > 0) { + mail_html += "

" + results_nb_commande[0].commande_nb_spectateur + " SPECTATEUR(S) RÉSERVÉ(S) :
" + mail_html += "Les billets spectateurs sont valables pour la date du 21 avril 2024.

"; + } + + mail_html += "

TARIFS :
"; + if (results_ca_concertiste.length > 0) {mail_html += "- concertiste(s) : " + results_nb_commande[0].commande_cout_concertiste + "€
"}; + if (results_nb_commande[0].commande_nb_spectateur > 0) {mail_html += "- spectateur(s) : " + results_nb_commande[0].commande_cout_spectateur + "€"}; + if (results_nb_commande[0].don > 0) {mail_html += "

- Votre don : " + results_nb_commande[0].don + "€"}; + mail_html += "

Montant total : " + results_nb_commande[0].montant_total + "€"; + + mail_html += '

Association Française pour la pédagogie Suzuki
Marie Rossot - Pôle organisation du Concert national Unesco 2024

Logo

'; + + // ajout du logo + let dossier_image = path.resolve(__dirname, "../../public/images/logos/")+"/logosuzukigris.png"; + + if (results_nb_commande[0].don > 0) { + + ////////////////////////////////////////////////////////////////////////////// + // ADOBE PDF : JUSTIFICATIF DE DON + + // VARIABLES POUR LE PDF + let OUTPUT; + let INPUT; + let now_pdf = moment().format("YYYY-MM-DDTHH-mm-ss"); + var adresse = results_adherent[0].adherent_adresse_rue; + adresse += " "; + adresse += results_adherent[0].adherent_adresse_codepostal; + adresse += " "; + adresse += results_adherent[0].adherent_adresse_ville; + OUTPUT = path.resolve(__dirname, "../../pdf/concert_annuel/don/2425/")+"/"+identifiant+"_don_"+now_pdf+".pdf"; + INPUT = path.resolve(__dirname, "../../pdf/template/don_justificatif.docx"); + JSON_INPUT = + { + "date": today, + "identifiant": identifiant, + "mode_paiement": "carte bancaire", + "adherent_nom": results_ca_adherent[0].adherent_nom, + "adherent_prenom": results_ca_adherent[0].adherent_prenom, + "adresse": adresse, + "adherent_paiement_montant_don": results_nb_commande[0].don + }; + + await pdf.pdfgo(OUTPUT, INPUT, JSON_INPUT); + + // VARIABLE POUR LE MAIL + var attachment_name = identifiant + "_don_" + now_pdf + ".pdf"; + var mailOptions = { + from: 'afps.inscription@gmail.com', + to: customer_email, + subject: mail_objet, + html: mail_html, + attachments: [ + { + filename: 'logosuzukigris.png', + path: dossier_image, + cid: 'logo' + }, + { + filename: attachment_name, + path: OUTPUT + }, + ] + }; + + + } else { + + // SANS JUSTIFICATIF DE DON + // VARIABLE POUR LE MAIL + var mailOptions = { + from: 'afps.inscription@gmail.com', + to: customer_email, + subject: mail_objet, + html: mail_html, + attachments: [{ + filename: 'logosuzukigris.png', + path: dossier_image, + cid: 'logo' + }] + }; + } + + envoie_mail.envoie_mail(mailOptions); + + ///////////////////////////////////// + // ENVOI MAIL AU PROF SI PAIEMENT REUSSI & SI CONCERTISTES + if(results_ca_concertiste.length > 0) { + logger.info("ENVOIE MAILS AU PROF", { numsession: req.session.id, label: filename}); + for (let i = 0; i'; + mail_html += 'Nom de l\'élève : ' + results_ca_concertiste[i].concertiste_nom + ' ' + results_ca_concertiste[i].concertiste_prenom + '
'; + mail_html += 'Âge de l\'élève : ' + results_ca_concertiste[i].concertiste_age + '
'; + mail_html += 'Instrument de l\'élève : ' + results_ca_concertiste[i].concertiste_intrument + '
'; + mail_html += 'Niveau (cahier) : ' + results_ca_concertiste[i].concertiste_cahier + '
'; + mail_html += 'Pièce : ' + results_ca_concertiste[i].concertiste_piece + '

'; + mail_html += "

Association Française pour la Pédagogie Suzuki
Marie Rossot - Pôle organisation du Concert national Unesco 2024

Logo"; + + var mailOptions = { + from: 'afps.inscription@gmail.com', + to: results_ca_concertiste[i].concertiste_prof_mail, + subject: mail_objet, + html: mail_html, + attachments: [{ + filename: 'logosuzukigris.png', + path: dossier_image, + cid: 'logo' + }] + }; + + + envoie_mail.envoie_mail(mailOptions); + } + } + + ///////////////////////////////////// + // ENVOI BILLETS VERS WEEZEVENT + ///////////////////////////////////// + + if((results_ca_concertiste.length > 0 || results_ca_encadrant.length > 0 || results_nb_commande[0].commande_nb_spectateur > 0)) { + + logger.info("ENVOIE BILLET WEEZEVENT", { numsession: req.session.id, label: filename}); + + // WEEZEVENT test compte de Julie + // EVENT + // id: 1012995, name: 'ADUZUKI UNESCO Concertistes Encadrants', + // id: 1013004, name: 'ADUZUKI UNESCO Spectateur', + // id: 1042983, name: 'ADUZUKI UNESCO Encadrants', + // id billet: '3742964', name: 'Spectateur', + // id billet : '3863469', name: 'Concertiste' + // id billet: '3863496', name: 'Encadrant professeur', + // id billet: '3863495', name: 'Encadrant parent', + + // WEEZEVENT Compte AFPS + // EVENT + // id: 1043198 ADUZUKI UNESCO Encadrants + // id: 1043199 ADUZUKI UNESCO Élèves musiciens + // id: 1043050 ADUZUKI UNESCO Spectateur + // id billet: '3874933', name: 'Spectateur', + // id billet : '3875316', name: 'Élève musicien' + // id billet: '3875315', name: 'Encadrant professeur', + // id billet: '3875313', name: 'Encadrant parent', + + let weez_id_evenement_concertiste = process.env.weezevent_id_event_concertiste; + let weez_id_evenement_encadrant = process.env.weezevent_id_event_encacrant; + let weez_id_evenement_spectateur = process.env.weezevent_id_event_spect; + + let weez_id_billet_concertiste = process.env.weez_id_billet_concertiste; + let weez_id_billet_spectateur = process.env.weez_id_billet_spectateur; + let weez_id_billet_encadrant_parent = process.env.weez_id_billet_encadrant_parent; + let weez_id_billet_encadrant_prof = process.env.weez_id_billet_encadrant_prof; + + //let weez_id_evenement_concertiste = "1043199"; + //let weez_id_evenement_encadrant = "1043198"; + //let weez_id_evenement_spectateur = "1043050"; + // + // + //let weez_id_billet_concertiste = "3875316"; + //let weez_id_billet_spectateur = "3874933"; + //let weez_id_billet_encadrant_parent = "3875313"; + //let weez_id_billet_encadrant_prof = "3875315"; + + let weez_id_billet; + let weez_email = customer_email; + //let weez_nom = results_ca_adherent[0].adherent_nom; + let participants = { + "participants": [], + "return_ticket_url": true + }; + + + let weez_prenom; + let TICKETING_API_BASE_URL = "https://api.weezevent.com/v3/participants?"; + let url = TICKETING_API_BASE_URL; + body = '&api_key=' + process.env.weezevent_API_KEY; + body += '&access_token=' + process.env.weezevent_TOKEN; + + + async function envoi_weez_api(url,body) { + logger.info("url = " + url , { numsession: req.session.id, label: filename}); + logger.info("body = " + body , { numsession: req.session.id, label: filename}); + let headers = {'content-type':'application/x-www-form-urlencoded;charset=utf-8'}; + let premise_post_token = await fetch(url, { + method: 'POST', + headers: headers, + body: body + }); + let response_post_token = await premise_post_token.json(); + console.log("response_post_token = ", response_post_token); + logger.info("response_post_token = " + response_post_token , { numsession: req.session.id, label: filename}); + } + + // LISTING DES PARTICIPANTS + + // BILLETS SPECTATEUR + if (results_nb_commande[0].commande_nb_spectateur > 0) { + logger.info("results_nb_commande[0].commande_nb_spectateur = " + results_nb_commande[0].commande_nb_spectateur , { numsession: req.session.id, label: filename}); + for (let i = 0; i 0) { + logger.info("results_ca_encadrant.length = " + results_ca_encadrant.length , { numsession: req.session.id, label: filename}); + for (let i = 0; i 0) { + logger.info("results_ca_concertiste.length = " + results_ca_concertiste.length , { numsession: req.session.id, label: filename}); + for (let i = 0; i 0){ + const ajout_gs_hebergements = await GS_concert_hebergements.addRows ( + [ + { + saison: results_ca_adherent[0].saison, + identifiant: identifiant, + hebergement_ville: results_ca_adherent[0].hebergement_ville, + hebergement_places: results_ca_adherent[0].hebergement_places, + date_maj_gsheet: now + } + ] + ); + } + + if (results_nb_commande[0].commande_nb_spectateur > 0){ + const ajout_gs_spectateurs = await GS_concert_spectateurs.addRows ( + [ + { + saison: results_ca_adherent[0].saison, + identifiant: identifiant, + commande_nb_spectateur: results_nb_commande[0].commande_nb_spectateur, + date_maj_gsheet: now + } + ] + ); + } + + if (results_ca_concertiste.length > 0) { + let ajout_gs_concertistes = []; + for (let i = 0; i < results_ca_concertiste.length; i++) { + ajout_gs_concertistes.push({ + saison: results_ca_concertiste[i].saison, + identifiant: identifiant, + concertiste_nom: results_ca_concertiste[i].concertiste_nom, + concertiste_prenom: results_ca_concertiste[i].concertiste_prenom, + adherent_telephone_mobile: "'" + results_ca_adherent[0].adherent_telephone_mobile, + adherent_mail: results_ca_adherent[0].adherent_mail, + concertiste_age: results_ca_concertiste[i].concertiste_age, + concertiste_intrument: results_ca_concertiste[i].concertiste_intrument, + concertiste_cahier: results_ca_concertiste[i].concertiste_cahier, + concertiste_piece: results_ca_concertiste[i].concertiste_piece, + concertiste_prof_nom: results_ca_concertiste[i].concertiste_prof_nom, + concertiste_prof_mail: results_ca_concertiste[i].concertiste_prof_mail, + date_maj_gsheet: now + }); + } + await GS_concert_concertistes.addRows (ajout_gs_concertistes); + } + + if (results_ca_encadrant.length > 0) { + let ajout_gs_encadrants = []; + for (let i = 0; i 2){ + req.session.quota_spectateur = "depasse"; + } + + if (results[0].commande_nb_concertiste > 3){ + req.session.quota_concertiste = "depasse"; + } + logger.info("req.session.quota_spectateur = " + req.session.quota_spectateur , { numsession: req.session.id, label: filename}); + logger.info("req.session.quota_concertiste = " + req.session.quota_concertiste , { numsession: req.session.id, label: filename}); + + // On calcule le nombre de places concertistes restantes (tous instruments) + req.session.tout_instrument_nb_restantes = req.session.piano_nb_restantes + req.session.alto_nb_restantes + req.session.flute_nb_restantes + req.session.trompette_nb_restantes + req.session.harpe_nb_restantes + req.session.violon1_nb_restantes + req.session.violon2_nb_restantes + req.session.violoncelle1_nb_restantes + req.session.violoncelle2_nb_restantes; + logger.info("NOMBRE DE PLACES TOUT INSTRUMENTS (session) = " + req.session.tout_instrument_nb_restantes, { numsession: req.session.id, label: filename}); + + // On récupère le nom de l'association Suzuki et le mail de l'adhérent + req.session.adherent_mail = results[0].adherent_mail; + logger.info("req.session.adherent_mail = " + req.session.adherent_mail , { numsession: req.session.id, label: filename}); + req.session.association_suzuki = results[0].association_suzuki; + // ON AFFICHE LA PAGE DU FORMULAIRE DE SAISIE DES INFORMATIONS DE L'INSCRIPTION + res.redirect('/concert/inscription_famille'); + + //req.session.err_mail_form_adhesion_1 = "Vous êtes déjà inscrit au Concert national Unesco 2024."; + //affiche_page_identifier(); + + + } else { + // NON INSCRIT AU CONCERT + logger.info("Identifant non inscrit au concert.", { numsession: req.session.id, label: filename}); + // TAG ADHÉRENT DÉJÀ INSCRIT + req.session.deja_inscrit_concert = "non"; + + ///////////////////////////////////////////////// + // RECHERCHE SI PERSONNE EST ADHÉRENTE À L'AFPS + // DANS BD ADHESION adherent + + sql = 'select identifiant,association_suzuki from adherent where identifiant = "' + req.session.identifiant + '"'; + //Query + const [results, fields] = await db_connection_promise.execute(sql); + logger.info("Row adherent : " + results.length, { numsession: req.session.id, label: filename}); + if (results.length === 1) { + // LA PERSONNE EST BIEN ADHÉRENTE + logger.info("identifiant BD adhérent : " + results[0].identifiant, { numsession: req.session.id, label: filename}); + req.session.association_suzuki = results[0].association_suzuki; + // On calcule le nombre de places concertistes restantes (tous instruments) + req.session.tout_instrument_nb_restantes = req.session.piano_nb_restantes + req.session.alto_nb_restantes + req.session.flute_nb_restantes + req.session.trompette_nb_restantes + req.session.harpe_nb_restantes + req.session.violon1_nb_restantes + req.session.violon2_nb_restantes + req.session.violoncelle1_nb_restantes + req.session.violoncelle2_nb_restantes; + logger.info("NOMBRE DE PLACES TOUT INSTRUMENTS (session) = " + req.session.tout_instrument_nb_restantes, { numsession: req.session.id, label: filename}); + // ON AFFICHE LA PAGE DU FORMULAIRE DE SAISIE DES INFORMATIONS DE L'INSCRIPTION + res.redirect('/concert/inscription_famille'); + } else { + // LA PERSONNE N'EST PAS ADHÉRENTE + logger.info("Identifant NON adhérent.", { numsession: req.session.id, label: filename}); + req.session.err_mail_form_adhesion_1 = "Cet identifiant N'EST PAS 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 concert."; + req.session.err_mail_form_adhesion_3 = 'Pour adhérer à l\'Association Française pour la Pédagogie Suzuki Cliquez ici'; + affiche_page_identifier(); + } + } + + } catch (error) { + // Echec de connection à la BD + logger.error("Il y a un problème avec la connection à la base de données! : " + error, { numsession: req.session.id }); + req.session.err_mail_form_adhesion_1 = "Il y a un problème système connexion base de données, veuillez recommencer."; + //await db_connection_promise.end(); + affiche_page_identifier(); + } + + } + +} + + +///////////////////////////////////////////////// +// +// !!!! ACHAT UNIQUEMENT DE SPECTATEUR +// +// PAGE 1 +// DOMAIN/concert/identifier +// 2. SAISIE DU L'IDENTIFIANT +// VÉRIFICATION SI L'IDENTIFIANT EST ADHÉRENT +///////////////////////////////////////////////// + +const checkidentifiant_spectateur = async function (req, res) { + + ///////////////////////////////////////////////// + // RECHERCHE DANS DB + // - SI IDENTIFIANT SAISIE EST DÉJÀ INSCRIT AU CONCERT + + logger.info("======================================", { label: filename }); + logger.info("======== FUNCTION checkidentifiant ==========", { label: filename }); + logger.info("======================================", { label: filename }); + + + 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/inscrip_formulaire_identifier'); + }; + + // VARIABLES + req.session.quota_spectateur = "nondepasse"; + + + ///////////////////////////////////////////////// + // ON RÉCUPÈRE L'IDENTIFIANT SAISIE DANS LE FORMULAIRE + // ON REGARDE S'il à bien rempli l'identifiant et/ou s'il a coché la case "je ne suis pas adhérent" + logger.info("identifiant saisi : " + req.body.identifiant, { numsession: req.session.id, label: filename}); + + if (req.body.identifiant && req.body.check_nonadherent) { + req.session.err_mail_form_adhesion_1 = "Pour vous inscrire au concert, 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 = 'Pour adhérer Cliquez ici'; + req.session.err_mail_form_adhesion_3 = ''; + affiche_page_identifier(); + } + if (!req.body.identifiant && req.body.check_nonadherent) { + req.session.err_mail_form_adhesion_1 = "Pour vous inscrire au concert, 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 = 'Pour adhérer Cliquez ici'; + req.session.err_mail_form_adhesion_3 = ''; + affiche_page_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)."; + 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'; + affiche_page_identifier(); + } + if (req.body.identifiant && !req.body.check_nonadherent) { + // SAISIE OK + req.session.identifiant = req.body.identifiant; + + // EST-CE QUE L'IDENTIFIANT SAISI EST DÉJA INSCRIT AU CONCERT TABLE ca_adherent + + // CONNECTION DB PROMISE + try { + //Connexion + let db_connection_promise = await connect_DB_promise(); + + //Query + let sql = 'select identifiant, association_suzuki, adherent_mail, commande_nb_spectateur, commande_nb_concertiste from ca_adherent where identifiant = "' + req.session.identifiant + '"'; + const [results, fields] = await db_connection_promise.execute(sql); + logger.info("Row ca_adherent : " + results.length, { numsession: req.session.id, label: filename}); + + if (results.length) { + // DÉJA INSCRIT AU CONCERT + logger.info("Identifant déjà inscrit au concert.", { numsession: req.session.id, label: filename}); + + // TAG ADHÉRENT DÉJÀ INSCRIT + req.session.deja_inscrit_concert = "oui"; + + // QUOTA GÉNÉRAL DE PLACES TOTALES + let sql_ca_decompte_place = 'select spectateur_commandes from ca_decompte_place'; + const [results_ca_decompte_place, fields_ca_decompte_place] = await db_connection_promise.execute(sql_ca_decompte_place); + logger.info("SQL nombre de places spectateurs déjà commandées : " + results_ca_decompte_place[0].spectateur_commandes, { numsession: req.session.id, label: filename}); + // ON REGARDE LE NOMBRE DE SPECTATEURS DÉJÀ INSCRITS + + // QUOTA GÉNÉRAL ATTEINT + if (results_ca_decompte_place[0].spectateur_commandes >= process.env.spectateur_nb_places){ + // QUOTA DÉPASSÉ + logger.info("Quota spectateur TOTAL dépassé : " + results[0].commande_nb_spectateur, { numsession: req.session.id, label: filename}); + req.session.err_mail_form_adhesion_1 = "Le nombre total de spectateurs a été atteint."; + req.session.err_mail_form_adhesion_2 = "Vous ne pouvez plus commander de places"; + affiche_page_identifier(); + } + + // NOMBRE DE PLACES TOTALES RESTANTES + req.session.quota_total_spectateur = process.env.spectateur_nb_places - results_ca_decompte_place[0].spectateur_commandes; + logger.info("NOMBRE DE PLACES TOTALES RESTANTES : " + req.session.quota_total_spectateur, { numsession: req.session.id, label: filename}); + + // QUOTA DE 12 PLACES PAR ADHÉRENT + // ON REGARDE LE NOMBRE DE SPECTATEURS DÉJÀ INSCRITS + if (results[0].commande_nb_spectateur > 12){ + req.session.quota_spectateur = "depasse"; + // QUOTA DÉPASSÉ + logger.info("Quota spectateur dépassé : " + results[0].commande_nb_spectateur, { numsession: req.session.id, label: filename}); + req.session.err_mail_form_adhesion_1 = "Cet identifiant "+req.session.identifiant+" a dépassé le quota du nombre de place spectateurs par adhérent"; + req.session.err_mail_form_adhesion_2 = "Vous avez déjà "+results[0].commande_nb_spectateur+" places spectateurs"; + affiche_page_identifier(); + } + + logger.info("Quota spectateur non dépassé : " + results[0].commande_nb_spectateur, { numsession: req.session.id, label: filename}); + logger.info("req.session.quota_spectateur = " + req.session.quota_spectateur , { numsession: req.session.id, label: filename}); + req.session.spectateur_nb_restantes = 12 - results[0].commande_nb_spectateur; + + // On récupère le mail de l'adhérent + req.session.adherent_mail = results[0].adherent_mail; + + // ON AFFICHE LA PAGE D'ACHAT DES PLACES SPECTATEURS + + res.redirect('/concert/inscription_spectateur'); + + //req.session.err_mail_form_adhesion_1 = "Vous êtes déjà inscrit au Concert national Unesco 2024."; + //affiche_page_identifier(); + + + } else { + // NON INSCRIT AU CONCERT + logger.info("Identifant non inscrit au concert.", { numsession: req.session.id, label: filename}); + req.session.deja_inscrit_concert = "non"; + req.session.err_mail_form_adhesion_1 = "Cet identifiant "+req.session.identifiant+" N'EST PAS inscrit au concert"; + req.session.err_mail_form_adhesion_2 = "Vous ne pouvez pas acheter de place spectateur."; + affiche_page_identifier(); + } + + } catch (error) { + // Echec de connection à la BD + logger.error("Il y a un problème avec la connection à la base de données! : " + error, { numsession: req.session.id, label: filename }); + req.session.err_mail_form_adhesion_1 = "Il y a un problème système connexion base de données, veuillez recommencer."; + //await db_connection_promise.end(); + affiche_page_identifier(); + } + + } + +} + +///////////////////////////////////////////////// +// EXPORT DES MODULES POUR QU'ILS PUISSENT LUS PAR LES AUTRES FICHIERS JS +///////////////////////////////////////////////// + +module.exports = { + checkidentifiant, + checkidentifiant_spectateur +} diff --git a/controllers/concert_annuel/inscrip_spectateur_tousController.js b/controllers/concert_annuel/inscrip_spectateur_tousController.js new file mode 100644 index 0000000..697fc6f --- /dev/null +++ b/controllers/concert_annuel/inscrip_spectateur_tousController.js @@ -0,0 +1,148 @@ +///////////////////////////////////////////////// +// 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'); + + +///////////////////////////////////////////////// +// APPELS DES FONCTIONS +///////////////////////////////////////////////// +const sleep = require("./../../modules/sleep"); + +//////////////////////////////////////////////////// +// 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 + }); +} + + + +///////////////////////////////////////////////// +// +// !!!! ACHAT UNIQUEMENT DE SPECTATEUR +// +// PAGE 1 +// DOMAIN/concert/identifier +// 2. SAISIE DU L'IDENTIFIANT +// VÉRIFICATION SI L'IDENTIFIANT EST ADHÉRENT +///////////////////////////////////////////////// + +const inscription_spectateur_tous = async function (req, res) { + + ///////////////////////////////////////////////// + // RECHERCHE DANS DB + // - SI IDENTIFIANT SAISIE EST DÉJÀ INSCRIT AU CONCERT + + logger.info("======================================", { label: filename }); + logger.info("======== FUNCTION inscription_spectateur_tous ==========", { label: filename }); + logger.info("======================================", { label: filename }); + + + 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/achat_spectateur_tous'); + }; + + // VARIABLES + req.session.quota_spectateur = "nondepasse"; + + + // CONNECTION DB PROMISE + try { + + //Connexion + let db_connection_promise = await connect_DB_promise(); + + // QUOTA GÉNÉRAL DE PLACES TOTALES + let sql_ca_decompte_place = 'select spectateur_commandes from ca_decompte_place'; + const [results_ca_decompte_place, fields_ca_decompte_place] = await db_connection_promise.execute(sql_ca_decompte_place); + logger.info("SQL nombre de places spectateurs déjà commandées : " + results_ca_decompte_place[0].spectateur_commandes, { numsession: req.session.id, label: filename}); + + // QUOTA GÉNÉRAL ATTEINT + if (results_ca_decompte_place[0].spectateur_commandes >= process.env.spectateur_nb_places){ + // QUOTA DÉPASSÉ + req.session.quota_spectateur = "depasse"; + logger.info("Quota spectateur TOTAL dépassé : " + results_ca_decompte_place[0].spectateur_commandes, { numsession: req.session.id, label: filename}); + req.session.err_mail_form_adhesion_1 = "Le nombre total de spectateurs a été atteint."; + req.session.err_mail_form_adhesion_2 = "Vous ne pouvez plus commander de places"; + affiche_page_identifier(); + } + + // NOMBRE DE PLACES TOTALES RESTANTES + req.session.quota_total_spectateur = process.env.spectateur_nb_places - results_ca_decompte_place[0].spectateur_commandes; + logger.info("NOMBRE DE PLACES TOTALES RESTANTES : " + req.session.quota_total_spectateur, { numsession: req.session.id, label: filename}); + + + + + + // ON AFFICHE LA PAGE D'ACHAT DES PLACES SPECTATEURS + + + res.locals.quota_spectateur = req.session.quota_spectateur; + res.locals.quota_total_spectateur = req.session.quota_total_spectateur; + res.render('concert/page_templates/achat_spectateur_tous'); + + + + + } catch (error) { + // Echec de connection à la BD + logger.error("Il y a un problème avec la connection à la base de données! : " + error, { numsession: req.session.id }); + req.session.err_mail_form_adhesion_1 = "Il y a un problème système connexion base de données, veuillez recommencer."; + //await db_connection_promise.end(); + affiche_page_identifier(); + } + + + +} + +///////////////////////////////////////////////// +// EXPORT DES MODULES POUR QU'ILS PUISSENT LUS PAR LES AUTRES FICHIERS JS +///////////////////////////////////////////////// + +module.exports = { + inscription_spectateur_tous +} diff --git a/controllers/concert_annuel/inscription_familleController.js b/controllers/concert_annuel/inscription_familleController.js new file mode 100644 index 0000000..5f8c63c --- /dev/null +++ b/controllers/concert_annuel/inscription_familleController.js @@ -0,0 +1,218 @@ +///////////////////////////////////////////////// +// 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'); + + + +///////////////////////////////////////////////// +// APPELS DES FONCTIONS +///////////////////////////////////////////////// +const sleep = require("./../../modules/sleep"); + +//////////////////////////////////////////////////// +// 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 + }); +} + +///////////////////////////////////////////////// +// 3 - PAGE INSCRIPTION FAMILLE +///////////////////////////////////////////////// +const inscription_famille = async function (req, res) { + + logger.info("======================================", { label: filename }); + logger.info("======== FUNCTION inscription_famille ==========", { label: filename }); + logger.info("======================================", { label: filename }); + + // VARIABLES + let cout_concertiste = 0; + let cout_spectateur = 0; + let montant_total = 0; + let montant_commande = 0; + let don = 0; + let encadrant_compteur = 0; + let piano_compteur = 0; + let alto_compteur = 0; + let flute_compteur = 0; + let trompette_compteur = 0; + let harpe_compteur = 0; + let violon1_compteur = 0; + let violon2_compteur = 0; + let violoncelle1_compteur = 0; + let violoncelle2_compteur = 0; + + + 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'); + }; + + ///////////////////////////////////////////////// + // RÉCUPÉRER LES INFORMATIONS SAISIES DANS LE FORMULAIRE + ///////////////////////////////////////////////// + + // EST_CE QUE LA PERSONNE VIENT DE AJOUT BILLET + //req.session.ajout_billet = req.body.ajout_billet; + //logger.info("////// AJOUT BILLET req.session.ajout_billet = " + req.session.ajout_billet, { numsession: req.session.id, label: filename}); + + req.session.association_suzuki = req.body.association_suzuki; + req.session.adherent_nom = req.body.adherent_nom; + req.session.adherent_prenom = req.body.adherent_prenom; + req.session.adherent_telephone_mobile = req.body.adherent_telephone_mobile; + if (req.session.deja_inscrit_concert == "non") { + req.session.adherent_mail = req.body.adherent_mail; + } + + req.session.hebergement_ville = req.body.hebergement_ville; + + if (req.body.hebergement_nb > 0) { + req.session.hebergement_nb = req.body.hebergement_nb; + } else { + req.session.hebergement_nb = 0; + } + + if (req.body.spectateur_nb_place > 0) { + req.session.spectateur_nb_place = req.body.spectateur_nb_place; + cout_spectateur = 20 * req.session.spectateur_nb_place; + } else { + req.session.spectateur_nb_place = 0; + } + req.session.commentaire_adherent = req.body.commentaire_adherent; + + for (let toto = 1; toto < 5; toto++) { + if (req.body["eleve_"+toto+"_nom"]){ + req.session["eleve_"+toto+"_nom"] = req.body["eleve_"+toto+"_nom"]; + req.session["eleve_"+toto+"_prenom"] = req.body["eleve_"+toto+"_prenom"]; + req.session["eleve_"+toto+"_age"] = req.body["eleve_"+toto+"_age"]; + req.session["eleve_"+toto+"_instrument"] = req.body["eleve_"+toto+"_instrument"]; + req.session["eleve_"+toto+"_cahier"] = req.body["eleve_"+toto+"_cahier"]; + req.session["eleve_"+toto+"_piece"] = req.body["eleve_"+toto+"_piece"]; + req.session["eleve_"+toto+"_prof_nom"] = req.body["eleve_"+toto+"_prof_nom"]; + req.session["eleve_"+toto+"_prof_mail"] = req.body["eleve_"+toto+"_prof_mail"]; + cout_concertiste += 23; + if (req.session["eleve_"+toto+"_instrument"] == "Piano") {piano_compteur++} + if (req.session["eleve_"+toto+"_instrument"] == "Alto") {alto_compteur++} + if (req.session["eleve_"+toto+"_instrument"] == "Flute") {flute_compteur++} + if (req.session["eleve_"+toto+"_instrument"] == "Trompette") {trompette_compteur++} + if (req.session["eleve_"+toto+"_instrument"] == "Harpe") {harpe_compteur++} + if (req.session["eleve_"+toto+"_instrument"] == "Violon" && (req.session["eleve_"+toto+"_cahier"]=="Cahier 1" || req.session["eleve_"+toto+"_cahier"]=="Cahier 2" || req.session["eleve_"+toto+"_cahier"]=="Cahier 3" || req.session["eleve_"+toto+"_cahier"]=="Cahier 4" || req.session["eleve_"+toto+"_cahier"]=="Cahier 5")) {violon1_compteur++} + if (req.session["eleve_"+toto+"_instrument"] == "Violon" && (req.session["eleve_"+toto+"_cahier"]=="Cahier 6" || req.session["eleve_"+toto+"_cahier"]=="Cahier 7" || req.session["eleve_"+toto+"_cahier"]=="Cahier 8" || req.session["eleve_"+toto+"_cahier"]=="Cahier 9" || req.session["eleve_"+toto+"_cahier"]=="Cahier 10")) {violon2_compteur++} + if (req.session["eleve_"+toto+"_instrument"] == "Violoncelle" && (req.session["eleve_"+toto+"_cahier"]=="Cahier 1" || req.session["eleve_"+toto+"_cahier"]=="Cahier 2" || req.session["eleve_"+toto+"_cahier"]=="Cahier 3" || req.session["eleve_"+toto+"_cahier"]=="Cahier 4")) {violoncelle1_compteur++} + if (req.session["eleve_"+toto+"_instrument"] == "Violoncelle" && (req.session["eleve_"+toto+"_cahier"]=="Cahier 5" || req.session["eleve_"+toto+"_cahier"]=="Cahier 6" || req.session["eleve_"+toto+"_cahier"]=="Cahier 7" || req.session["eleve_"+toto+"_cahier"]=="Cahier 8" || req.session["eleve_"+toto+"_cahier"]=="Cahier 9" || req.session["eleve_"+toto+"_cahier"]=="Cahier 10")) {violoncelle2_compteur++} + + } else { + req.session["eleve_"+toto+"_nom"] = undefined; + req.session["eleve_"+toto+"_prenom"] = undefined; + req.session["eleve_"+toto+"_age"] = undefined; + req.session["eleve_"+toto+"_instrument"] = undefined; + req.session["eleve_"+toto+"_cahier"] = undefined; + req.session["eleve_"+toto+"_piece"] = undefined; + req.session["eleve_"+toto+"_prof_nom"] = undefined; + req.session["eleve_"+toto+"_prof_mail"] = undefined; + } + } + + for (let toto = 1; toto < 5; toto++) { + if (req.body["encadrant_"+toto+"_nom"]){ + req.session["encadrant_"+toto+"_type"] = req.body["encadrant_"+toto+"_type"]; + req.session["encadrant_"+toto+"_nom"] = req.body["encadrant_"+toto+"_nom"]; + req.session["encadrant_"+toto+"_prenom"] = req.body["encadrant_"+toto+"_prenom"]; + req.session["encadrant_"+toto+"_telephone_mobile"] = req.body["encadrant_"+toto+"_telephone_mobile"]; + req.session["encadrant_"+toto+"_mail"] = req.body["encadrant_"+toto+"_mail"]; + req.session["encadrant_"+toto+"_prof_instrument"] = req.body["encadrant_"+toto+"_prof_instrument"]; + encadrant_compteur++; + } else { + req.session["encadrant_"+toto+"_type"] = undefined; + req.session["encadrant_"+toto+"_nom"] = undefined; + req.session["encadrant_"+toto+"_prenom"] = undefined; + req.session["encadrant_"+toto+"_telephone_mobile"] = undefined; + req.session["encadrant_"+toto+"_mail"] = undefined; + req.session["encadrant_"+toto+"_prof_instrument"] = undefined; + } + } + + if (req.body.don && req.body.don > 0) {req.session.don = req.body.don;} else {req.session.don = 0;} + + + ///////////////////////////////////////////////// + // RÉCAP TARIF + ///////////////////////////////////////////////// + req.session.cout_concertiste = cout_concertiste; + req.session.cout_spectateur = cout_spectateur; + req.session.montant_commande = cout_concertiste + cout_spectateur; + req.session.montant_total = cout_concertiste + cout_spectateur + parseInt(req.session.don); + + ///////////////////////////////////////////////// + // ENVOIE VERS PAGE SUIVANTE + // SI PAS DE CONCERTISTE OU PAS D'ENCADRANT ON NE PEUT PAS AVANCER + // Par ex si on n'inscrit que des spectateurs + ///////////////////////////////////////////////// + + + if (piano_compteur > req.session.piano_nb_restantes || alto_compteur > req.session.alto_nb_restantes || flute_compteur > req.session.flute_nb_restantes || trompette_compteur > req.session.trompette_nb_restantes || harpe_compteur > req.session.harpe_nb_restantes || violon1_compteur > req.session.violon1_nb_restantes || violon2_compteur > req.session.violon2_nb_restantes || violoncelle1_compteur > req.session.violoncelle1_nb_restantes || violoncelle2_compteur > req.session.violoncelle2_nb_restantes) { + logger.info("Plus de parent encadrant demandé que de restant", { numsession: req.session.id, label: filename}); + req.session.err_mail_form_adhesion_1 = 'Vous avez réservé plus de places élève concertiste que de places restantes. Veuillez recommencer.'; + affiche_page_identifier(); + } else { + if (encadrant_compteur < 1 && cout_concertiste < 1 && req.session.deja_inscrit_concert == "non") { + logger.info("pas d'encadrant ni de concertiste", { numsession: req.session.id, label: filename}); + req.session.err_mail_form_adhesion_1 = "Veuillez réserver au moins un élève concertiste ou une personne encadrante"; + affiche_page_identifier(); + } else { + res.redirect('/concert/inscription_recap'); + } + } + + +} + + +///////////////////////////////////////////////// +// EXPORT DES MODULES POUR QU'ILS PUISSENT LUS PAR LES AUTRES FICHIERS JS +///////////////////////////////////////////////// + +module.exports = { + inscription_famille +} \ No newline at end of file diff --git a/controllers/concert_annuel/inscription_listeattenteController.js b/controllers/concert_annuel/inscription_listeattenteController.js new file mode 100644 index 0000000..6797176 --- /dev/null +++ b/controllers/concert_annuel/inscription_listeattenteController.js @@ -0,0 +1,229 @@ +///////////////////////////////////////////////// +// 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'); + +///////////////////////////////////////////////// +// 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 + }); +} + +///////////////////////////////////////////////// +// PAGE 3 ter +// DOMAIN/concert/listeattente +// AFFICHAGE DE LA PAGE DE SAISIE POUR LA LISTE D'ATTENTE +// D'UN CONCERTISTE +///////////////////////////////////////////////// + +const inscription_listeattente = async function (req, res) { + + logger.info("======================================", { label: filename }); + logger.info("======== FUNCTION inscription_listeattente ==========", { label: filename }); + logger.info("======================================", { label: filename }); + + // VARIABLES + moment.locale('fr'); + let now = moment().format("YYYY-MM-DD HH:mm:ss"); + + function affiche_page_erreur() { + //////////////////////////////////////////////////// + // AFFIHER LA PAGE ERREUR + // AFFICHAGE DES ERREURS + //////////////////////////////////////////////////// + + 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 + 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_erreur(); + } else { + /////////////////////////////////////////////////// + // ON RÉCUPÈRE LES INFOS SAISIE DANS LE FORMULAIRE + req.session.association_suzuki = req.body.association_suzuki; + req.session.adherent_nom = req.body.adherent_nom; + req.session.adherent_prenom = req.body.adherent_prenom; + req.session.adherent_telephone_mobile = req.body.adherent_telephone_mobile; + req.session.adherent_mail = req.body.adherent_mail; + req.session.eleve_nom = req.body.eleve_nom; + req.session.eleve_prenom = req.body.eleve_prenom; + req.session.eleve_age = req.body.eleve_age; + req.session.eleve_instrument = req.body.eleve_instrument; + req.session.eleve_cahier = req.body.eleve_cahier; + req.session.eleve_piece = req.body.eleve_piece; + req.session.eleve_prof_nom = req.body.eleve_prof_nom; + req.session.eleve_prof_mail = req.body.eleve_prof_mail; + + logger.info("AJOUT DE L'ÉLÈVE IDENTIFIANT : " + req.session.identifiant, { numsession: req.session.id, label: filename}); + logger.info("AJOUT DE L'ÉLÈVE NOM PRENOM : " + req.session["eleve_nom"] + " " + req.session["eleve_prenom"], { numsession: req.session.id, label: filename}); + + // AJOUT CONCERTISTE DANS LA BASE DE DONNÉES + try { + //Connexion + let db_connection_promise = await connect_DB_promise(); + + // AJOUT CONCERTISTE + champs = "date_inscription, saison, identifiant, association_suzuki, adherent_nom, adherent_prenom, adherent_telephone_mobile, adherent_mail, concertiste_nom, concertiste_prenom, concertiste_age, concertiste_intrument, concertiste_cahier, concertiste_piece, concertiste_prof_nom, concertiste_prof_mail"; + values = '"'+ now + '","2025/2026"' + ',"' + req.session.identifiant + '","' + req.session.association_suzuki + '","' + req.session.adherent_nom + '","' + req.session.adherent_prenom + '","' + req.session.adherent_telephone_mobile + '","' + req.session.adherent_mail + '","' + req.session.eleve_nom + '","' + req.session.eleve_prenom + '","' + req.session.eleve_age + '","' + req.session.eleve_instrument + '","' + req.session.eleve_cahier + '","' + req.session.eleve_piece + '","' + req.session.eleve_prof_nom + '","' + req.session.eleve_prof_mail + '"'; + + sql = 'INSERT INTO ca_liste_attente (' + champs + ') VALUES (' + values + ')'; + logger.info("REQUETE SQL ca_liste_attente : " + sql , { numsession: req.session.id, label: filename}); + + const [results, fields] = await db_connection_promise.execute(sql); + logger.info("LISTE ATTENTE Row ID added : " + results.insertId, { numsession: req.session.id, label: filename}); + + } catch (error) { + // Echec de connection à la BD + logger.error("Il y a un problème avec la connection à la base de données! : " + error, { numsession: req.session.id }); + req.session.err_mail_form_adhesion_1 = '"Il y a un problème système connexion base de données, veuillez recommencer, "' + error; + affiche_page_erreur(); + } + + // AJOUT CONCERTISTE DANS LA GOOGLE SHEET + try { + await GS_concert.useServiceAccountAuth(GS_creds); + await GS_concert.loadInfo(); + //console.log("GS_concert = ", GS_concert); + const GS_concert_liste_attente = GS_concert.sheetsByTitle['liste_attente']; + + //console.log("GS_concert_liste_attente = ", GS_concert_liste_attente); + + + const ajout_gs_adherent = await GS_concert_liste_attente.addRows ( + [ + { + saison: "2025/2026", + identifiant: req.session.identifiant, + association_suzuki: req.session.association_suzuki, + date_inscription: now, + adherent_nom: req.session.adherent_nom, + adherent_prenom: req.session.adherent_prenom, + adherent_telephone_mobile: "'" + req.session.adherent_telephone_mobile, + adherent_mail: req.session.adherent_mail, + concertiste_nom: req.session.eleve_nom, + concertiste_prenom: req.session.eleve_prenom, + concertiste_age: req.session.eleve_age, + concertiste_intrument: req.session.eleve_instrument, + concertiste_cahier: req.session.eleve_cahier, + concertiste_piece: req.session.eleve_piece, + concertiste_prof_nom: req.session.eleve_prof_nom, + concertiste_prof_mail: req.session.eleve_prof_mail, + date_maj_gsheet: now + } + ] + ); + + + + + ////////////////////////// + // ENVOI MAIL À L'ADHÉRENT + + mail_objet = 'AFPS - CONCERT UNESCO 2024 - AJOUT LISTE ATTENTE - ' + req.session.identifiant; + + mail_html = "

Cher(e) adhérent(e),

L'élève est inscrit en liste d'attente pour le Concert national Unesco 2024 organisé par l'Association Française pour la Pédagogie Suzuki."; + mail_html += "
"; + mail_html += '

RÉCAPITULATIF

'; + mail_html += "

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

Les concertistes s'engagent à être présents les 2 journées du 20 et 21 avril 2024.

"; + mail_html += "

Nom : " + req.session.eleve_nom + " " + req.session.eleve_prenom + " - " + req.session.eleve_age + " ans,
"; + mail_html += "instrument : " + req.session.eleve_instrument + " - " + req.session.eleve_cahier + " - " + req.session.eleve_piece + "
"; + mail_html += "professeur : " + req.session.eleve_prof_nom + " - " + req.session.eleve_prof_mail + "

"; + mail_html += '

Association Française pour la pédagogie Suzuki
Marie Rossot - Pôle organisation du Concert national Unesco 2024

Logo

'; + + // ajout du logo + let dossier_image = path.resolve(__dirname, "../../public/images/logos/")+"/logosuzukigris.png"; + + // VARIABLE POUR LE MAIL + var mailOptions = { + from: 'afps.inscription@gmail.com', + to: req.session.adherent_mail, + subject: mail_objet, + html: mail_html, + attachments: [{ + filename: 'logosuzukigris.png', + path: dossier_image, + cid: 'logo' + }] + }; + + envoie_mail.envoie_mail(mailOptions); + + } catch (error) { + // Echec de connection à la GOOGLE SHEET + logger.error("Erreur système : " + error, { numsession: req.session.id }); + req.session.err_mail_form_adhesion_1 = '"Il y a un problème système, "' + error; + affiche_page_erreur(); + }; + + req.session.err_mail_form_adhesion_1 = "Inscription dans la liste d'attente réussie"; + affiche_page_erreur(); + + } + + +} + + + +///////////////////////////////////////////////// +// EXPORT DES MODULES POUR QU'ILS PUISSENT LUS PAR LES AUTRES FICHIERS JS +///////////////////////////////////////////////// + +module.exports = { + inscription_listeattente +} diff --git a/controllers/concert_annuel/inscription_spectateurController.js b/controllers/concert_annuel/inscription_spectateurController.js new file mode 100644 index 0000000..926c85d --- /dev/null +++ b/controllers/concert_annuel/inscription_spectateurController.js @@ -0,0 +1,218 @@ +///////////////////////////////////////////////// +// 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'); + + + +///////////////////////////////////////////////// +// APPELS DES FONCTIONS +///////////////////////////////////////////////// +const sleep = require("./../../modules/sleep"); + +//////////////////////////////////////////////////// +// 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 + }); +} + +///////////////////////////////////////////////// +// 3 - PAGE INSCRIPTION FAMILLE +///////////////////////////////////////////////// +const inscription_spectateur = async function (req, res) { + + logger.info("======================================", { label: filename }); + logger.info("======== FUNCTION inscription_spectateur ==========", { label: filename }); + logger.info("======================================", { label: filename }); + + // VARIABLES + let cout_concertiste = 0; + let cout_spectateur = 0; + let montant_total = 0; + let montant_commande = 0; + let don = 0; + let encadrant_compteur = 0; + let piano_compteur = 0; + let alto_compteur = 0; + let flute_compteur = 0; + let trompette_compteur = 0; + let harpe_compteur = 0; + let violon1_compteur = 0; + let violon2_compteur = 0; + let violoncelle1_compteur = 0; + let violoncelle2_compteur = 0; + + + 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'); + }; + + ///////////////////////////////////////////////// + // RÉCUPÉRER LES INFORMATIONS SAISIES DANS LE FORMULAIRE + ///////////////////////////////////////////////// + + // EST_CE QUE LA PERSONNE VIENT DE AJOUT BILLET + //req.session.ajout_billet = req.body.ajout_billet; + //logger.info("////// AJOUT BILLET req.session.ajout_billet = " + req.session.ajout_billet, { numsession: req.session.id, label: filename}); + + req.session.association_suzuki = req.body.association_suzuki; + req.session.adherent_nom = req.body.adherent_nom; + req.session.adherent_prenom = req.body.adherent_prenom; + req.session.adherent_telephone_mobile = req.body.adherent_telephone_mobile; + if (req.session.deja_inscrit_concert == "non") { + req.session.adherent_mail = req.body.adherent_mail; + } + + req.session.hebergement_ville = req.body.hebergement_ville; + + if (req.body.hebergement_nb > 0) { + req.session.hebergement_nb = req.body.hebergement_nb; + } else { + req.session.hebergement_nb = 0; + } + + if (req.body.spectateur_nb_place > 0) { + req.session.spectateur_nb_place = req.body.spectateur_nb_place; + cout_spectateur = 20 * req.session.spectateur_nb_place; + } else { + req.session.spectateur_nb_place = 0; + } + req.session.commentaire_adherent = req.body.commentaire_adherent; + + for (let toto = 1; toto < 5; toto++) { + if (req.body["eleve_"+toto+"_nom"]){ + req.session["eleve_"+toto+"_nom"] = req.body["eleve_"+toto+"_nom"]; + req.session["eleve_"+toto+"_prenom"] = req.body["eleve_"+toto+"_prenom"]; + req.session["eleve_"+toto+"_age"] = req.body["eleve_"+toto+"_age"]; + req.session["eleve_"+toto+"_instrument"] = req.body["eleve_"+toto+"_instrument"]; + req.session["eleve_"+toto+"_cahier"] = req.body["eleve_"+toto+"_cahier"]; + req.session["eleve_"+toto+"_piece"] = req.body["eleve_"+toto+"_piece"]; + req.session["eleve_"+toto+"_prof_nom"] = req.body["eleve_"+toto+"_prof_nom"]; + req.session["eleve_"+toto+"_prof_mail"] = req.body["eleve_"+toto+"_prof_mail"]; + cout_concertiste += 23; + if (req.session["eleve_"+toto+"_instrument"] == "Piano") {piano_compteur++} + if (req.session["eleve_"+toto+"_instrument"] == "Alto") {alto_compteur++} + if (req.session["eleve_"+toto+"_instrument"] == "Flute") {flute_compteur++} + if (req.session["eleve_"+toto+"_instrument"] == "Trompette") {trompette_compteur++} + if (req.session["eleve_"+toto+"_instrument"] == "Harpe") {harpe_compteur++} + if (req.session["eleve_"+toto+"_instrument"] == "Violon" && (req.session["eleve_"+toto+"_cahier"]=="Cahier 1" || req.session["eleve_"+toto+"_cahier"]=="Cahier 2" || req.session["eleve_"+toto+"_cahier"]=="Cahier 3" || req.session["eleve_"+toto+"_cahier"]=="Cahier 4" || req.session["eleve_"+toto+"_cahier"]=="Cahier 5")) {violon1_compteur++} + if (req.session["eleve_"+toto+"_instrument"] == "Violon" && (req.session["eleve_"+toto+"_cahier"]=="Cahier 6" || req.session["eleve_"+toto+"_cahier"]=="Cahier 7" || req.session["eleve_"+toto+"_cahier"]=="Cahier 8" || req.session["eleve_"+toto+"_cahier"]=="Cahier 9" || req.session["eleve_"+toto+"_cahier"]=="Cahier 10")) {violon2_compteur++} + if (req.session["eleve_"+toto+"_instrument"] == "Violoncelle" && (req.session["eleve_"+toto+"_cahier"]=="Cahier 1" || req.session["eleve_"+toto+"_cahier"]=="Cahier 2" || req.session["eleve_"+toto+"_cahier"]=="Cahier 3" || req.session["eleve_"+toto+"_cahier"]=="Cahier 4")) {violoncelle1_compteur++} + if (req.session["eleve_"+toto+"_instrument"] == "Violoncelle" && (req.session["eleve_"+toto+"_cahier"]=="Cahier 5" || req.session["eleve_"+toto+"_cahier"]=="Cahier 6" || req.session["eleve_"+toto+"_cahier"]=="Cahier 7" || req.session["eleve_"+toto+"_cahier"]=="Cahier 8" || req.session["eleve_"+toto+"_cahier"]=="Cahier 9" || req.session["eleve_"+toto+"_cahier"]=="Cahier 10")) {violoncelle2_compteur++} + + } else { + req.session["eleve_"+toto+"_nom"] = undefined; + req.session["eleve_"+toto+"_prenom"] = undefined; + req.session["eleve_"+toto+"_age"] = undefined; + req.session["eleve_"+toto+"_instrument"] = undefined; + req.session["eleve_"+toto+"_cahier"] = undefined; + req.session["eleve_"+toto+"_piece"] = undefined; + req.session["eleve_"+toto+"_prof_nom"] = undefined; + req.session["eleve_"+toto+"_prof_mail"] = undefined; + } + } + + for (let toto = 1; toto < 5; toto++) { + if (req.body["encadrant_"+toto+"_nom"]){ + req.session["encadrant_"+toto+"_type"] = req.body["encadrant_"+toto+"_type"]; + req.session["encadrant_"+toto+"_nom"] = req.body["encadrant_"+toto+"_nom"]; + req.session["encadrant_"+toto+"_prenom"] = req.body["encadrant_"+toto+"_prenom"]; + req.session["encadrant_"+toto+"_telephone_mobile"] = req.body["encadrant_"+toto+"_telephone_mobile"]; + req.session["encadrant_"+toto+"_mail"] = req.body["encadrant_"+toto+"_mail"]; + req.session["encadrant_"+toto+"_prof_instrument"] = req.body["encadrant_"+toto+"_prof_instrument"]; + encadrant_compteur++; + } else { + req.session["encadrant_"+toto+"_type"] = undefined; + req.session["encadrant_"+toto+"_nom"] = undefined; + req.session["encadrant_"+toto+"_prenom"] = undefined; + req.session["encadrant_"+toto+"_telephone_mobile"] = undefined; + req.session["encadrant_"+toto+"_mail"] = undefined; + req.session["encadrant_"+toto+"_prof_instrument"] = undefined; + } + } + + if (req.body.don && req.body.don > 0) {req.session.don = req.body.don;} else {req.session.don = 0;} + + + ///////////////////////////////////////////////// + // RÉCAP TARIF + ///////////////////////////////////////////////// + req.session.cout_concertiste = cout_concertiste; + req.session.cout_spectateur = cout_spectateur; + req.session.montant_commande = cout_concertiste + cout_spectateur; + req.session.montant_total = cout_concertiste + cout_spectateur + parseInt(req.session.don); + + ///////////////////////////////////////////////// + // ENVOIE VERS PAGE SUIVANTE + // SI PAS DE CONCERTISTE OU PAS D'ENCADRANT ON NE PEUT PAS AVANCER + // Par ex si on n'inscrit que des spectateurs + ///////////////////////////////////////////////// + + + if (piano_compteur > req.session.piano_nb_restantes || alto_compteur > req.session.alto_nb_restantes || flute_compteur > req.session.flute_nb_restantes || trompette_compteur > req.session.trompette_nb_restantes || harpe_compteur > req.session.harpe_nb_restantes || violon1_compteur > req.session.violon1_nb_restantes || violon2_compteur > req.session.violon2_nb_restantes || violoncelle1_compteur > req.session.violoncelle1_nb_restantes || violoncelle2_compteur > req.session.violoncelle2_nb_restantes) { + logger.info("Plus de parent encadrant demandé que de restant", { numsession: req.session.id, label: filename}); + req.session.err_mail_form_adhesion_1 = 'Vous avez réservé plus de places élève concertiste que de places restantes. Veuillez recommencer.'; + affiche_page_identifier(); + } else { + if (encadrant_compteur < 1 && cout_concertiste < 1 && req.session.deja_inscrit_concert == "non") { + logger.info("pas d'encadrant ni de concertiste", { numsession: req.session.id, label: filename}); + req.session.err_mail_form_adhesion_1 = "Veuillez réserver au moins un élève concertiste ou une personne encadrante"; + affiche_page_identifier(); + } else { + res.redirect('/concert/inscription_recap'); + } + } + + +} + + +///////////////////////////////////////////////// +// EXPORT DES MODULES POUR QU'ILS PUISSENT LUS PAR LES AUTRES FICHIERS JS +///////////////////////////////////////////////// + +module.exports = { + inscription_spectateur +} \ No newline at end of file diff --git a/controllers/concert_annuel/inscription_spectateur_tous_recapController.js b/controllers/concert_annuel/inscription_spectateur_tous_recapController.js new file mode 100644 index 0000000..ad86633 --- /dev/null +++ b/controllers/concert_annuel/inscription_spectateur_tous_recapController.js @@ -0,0 +1,162 @@ +///////////////////////////////////////////////// +// 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'); + + + +///////////////////////////////////////////////// +// APPELS DES FONCTIONS +///////////////////////////////////////////////// +const sleep = require("./../../modules/sleep"); + +//////////////////////////////////////////////////// +// 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 + }); +} + +///////////////////////////////////////////////// +// 3 - PAGE INSCRIPTION FAMILLE +///////////////////////////////////////////////// +const inscription_spectateur_tous_recap = async function (req, res) { + + logger.info("======================================", { label: filename }); + logger.info("======== FUNCTION inscription_spectateur_tous_recap ==========", { label: filename }); + logger.info("======================================", { label: filename }); + + // VARIABLES + let cout_concertiste = 0; + let cout_spectateur = 0; + let montant_total = 0; + let montant_commande = 0; + let don = 0; + let encadrant_compteur = 0; + let piano_compteur = 0; + let alto_compteur = 0; + let flute_compteur = 0; + let trompette_compteur = 0; + let harpe_compteur = 0; + let violon1_compteur = 0; + let violon2_compteur = 0; + let violoncelle1_compteur = 0; + let violoncelle2_compteur = 0; + + + 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'); + }; + + ///////////////////////////////////////////////// + // RÉCUPÉRER LES INFORMATIONS SAISIES DANS LE FORMULAIRE + ///////////////////////////////////////////////// + + req.session.identifiant = req.body.identifiant_adherent; + req.session.association_suzuki = req.body.association_suzuki; + req.session.adherent_nom = req.body.adherent_nom; + req.session.adherent_prenom = req.body.adherent_prenom; + req.session.adherent_telephone_mobile = req.body.adherent_telephone_mobile; + req.session.adherent_mail = req.body.adherent_mail; + + if (req.body.spectateur_nb_place > 0) { + req.session.spectateur_nb_place = req.body.spectateur_nb_place; + cout_spectateur = 20 * req.session.spectateur_nb_place; + } else { + req.session.spectateur_nb_place = 0; + } + + for (let toto = 1; toto < 5; toto++) { + if (req.body["encadrant_"+toto+"_nom"]){ + req.session["encadrant_"+toto+"_type"] = req.body["encadrant_"+toto+"_type"]; + req.session["encadrant_"+toto+"_nom"] = req.body["encadrant_"+toto+"_nom"]; + req.session["encadrant_"+toto+"_prenom"] = req.body["encadrant_"+toto+"_prenom"]; + req.session["encadrant_"+toto+"_telephone_mobile"] = req.body["encadrant_"+toto+"_telephone_mobile"]; + req.session["encadrant_"+toto+"_mail"] = req.body["encadrant_"+toto+"_mail"]; + req.session["encadrant_"+toto+"_prof_instrument"] = req.body["encadrant_"+toto+"_prof_instrument"]; + encadrant_compteur++; + } else { + req.session["encadrant_"+toto+"_type"] = undefined; + req.session["encadrant_"+toto+"_nom"] = undefined; + req.session["encadrant_"+toto+"_prenom"] = undefined; + req.session["encadrant_"+toto+"_telephone_mobile"] = undefined; + req.session["encadrant_"+toto+"_mail"] = undefined; + req.session["encadrant_"+toto+"_prof_instrument"] = undefined; + } + } + + if (req.body.don && req.body.don > 0) {req.session.don = req.body.don;} else {req.session.don = 0;} + + + ///////////////////////////////////////////////// + // RÉCAP TARIF + ///////////////////////////////////////////////// + req.session.montant_commande = cout_spectateur; + req.session.montant_total = cout_spectateur + parseInt(req.session.don); + + ///////////////////////////////////////////////// + // ENVOIE VERS PAGE SUIVANTE + // SI PAS DE CONCERTISTE OU PAS D'ENCADRANT ON NE PEUT PAS AVANCER + // Par ex si on n'inscrit que des spectateurs + ///////////////////////////////////////////////// + + if (req.session.montant_total > 0 || encadrant_compteur > 0) { + req.session.deja_inscrit_concert = "oui"; + res.redirect('/concert/inscription_recap'); + } else { + logger.info("montant de la commande inférieur à 0 OU 0 encadrant", { numsession: req.session.id, label: filename}); + req.session.err_mail_form_adhesion_1 = "Veuillez réserver au moins un élève concertiste ou une personne encadrante"; + affiche_page_identifier(); + } + +} + + +///////////////////////////////////////////////// +// EXPORT DES MODULES POUR QU'ILS PUISSENT LUS PAR LES AUTRES FICHIERS JS +///////////////////////////////////////////////// + +module.exports = { + inscription_spectateur_tous_recap +} \ No newline at end of file diff --git a/controllers/concert_annuel/maj_gs_concertController.js b/controllers/concert_annuel/maj_gs_concertController.js new file mode 100644 index 0000000..e2fe41d --- /dev/null +++ b/controllers/concert_annuel/maj_gs_concertController.js @@ -0,0 +1,97 @@ +///////////////////////////////////////////////// +// 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'); + +// ADOBE PDF +const PDFServicesSdk = require('@adobe/pdfservices-node-sdk'); + + + +///////////////////////////////////////////////// +// APPELS DES FONCTIONS +///////////////////////////////////////////////// +const sleep = require("./../../modules/sleep"); + +//////////////////////////////////////////////////// +// FILE NAME +//////////////////////////////////////////////////// +const filename = path.parse(__filename).base; + +//////////////////////////////////////////////////// +// CONNECTION DB +//////////////////////////////////////////////////// + +///////////////////////////////////////////////// +// 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); + +///////////////////////////////////////////////// +// ENVOIE DES INFOS DANS LA GOOGLESHEET +///////////////////////////////////////////////// +const recup_gs = async function(req, res) { + logger.info("======================================", { label: filename }); + logger.info("======== FUNCTION recup_gs ==========", { label: filename }); + logger.info("======================================", { label: filename }); + + ///////////////////////////////////////////////// + // CONNEXION GSHEET + + try { + await GS_concert.useServiceAccountAuth(GS_creds); + await GS_concert.loadInfo(); + const GS_concert_adherent = GS_concert.sheetsByTitle['adherents']; + + const ajout_gs_adherent = await GS_concert_adherent.addRows( + [ + { + saison: "tutu" + } + ] + ); + + await sleep.wait(5000); + + req.session.message = "fonction terminée"; + res.redirect('/concert/maj_googlesheet'); + + } catch (error) { + // Echec de connection à la GOOGLE SHEET + logger.error("Il y a un problème avec la connection à Google sheet : " + error, { numsession: req.session.id }); + req.session.message = "Il y a un problème système avec la Google Sheet, veuillez recommencer."; + + res.redirect('/concert/maj_googlesheet'); + }; + +} + + +///////////////////////////////////////////////// +// EXPORT DES MODULES POUR QU'ILS PUISSENT LUS PAR LES AUTRES FICHIERS JS +///////////////////////////////////////////////// + +module.exports = { + recup_gs +} + + + diff --git a/controllers/concert_annuel/payerController.js b/controllers/concert_annuel/payerController.js new file mode 100644 index 0000000..29a2cad --- /dev/null +++ b/controllers/concert_annuel/payerController.js @@ -0,0 +1,721 @@ +///////////////////////////////////////////////// +// 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.

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

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 + "


";} + + mail_html += "

" + 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 += "

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

Association Française pour la pédagogie Suzuki
Marie Rossot - Pôle organisation du Concert national Unesco 2024

Logo

'; + + // ajout du logo + let dossier_image = path.resolve(__dirname, "../../public/images/logos/")+"/logosuzukigris.png"; + + // VARIABLE POUR LE MAIL + var mailOptions = { + from: 'afps.inscription@gmail.com', + to: req.session.adherent_mail, + subject: mail_objet, + html: mail_html, + attachments: [{ + filename: 'logosuzukigris.png', + path: dossier_image, + cid: 'logo' + }] + }; + envoie_mail.envoie_mail(mailOptions); + + ///////////////////////////////////// + // ENVOI BILLETS VERS WEEZEVENT + ///////////////////////////////////// + + let weez_id_evenement_concertiste = process.env.weezevent_id_event_concertiste; + let weez_id_evenement_encadrant = process.env.weezevent_id_event_encacrant; + let weez_id_evenement_spectateur = process.env.weezevent_id_event_spect; + + let weez_id_billet_concertiste = process.env.weez_id_billet_concertiste; + let weez_id_billet_spectateur = process.env.weez_id_billet_spectateur; + let weez_id_billet_encadrant_parent = process.env.weez_id_billet_encadrant_parent; + let weez_id_billet_encadrant_prof = process.env.weez_id_billet_encadrant_prof; + + let weez_id_billet; + let weez_email = req.session.adherent_mail; + //let weez_nom = results_ca_adherent[0].adherent_nom; + let participants = { + "participants": [], + "return_ticket_url": true + }; + + let weez_prenom; + let TICKETING_API_BASE_URL = "https://api.weezevent.com/v3/participants?"; + let url = TICKETING_API_BASE_URL; + body = '&api_key=' + process.env.weezevent_API_KEY; + body += '&access_token=' + process.env.weezevent_TOKEN; + + + async function envoi_weez_api(url,body) { + logger.info("url = " + url , { numsession: req.session.id, label: filename}); + logger.info("body = " + body , { numsession: req.session.id, label: filename}); + let headers = {'content-type':'application/x-www-form-urlencoded;charset=utf-8'}; + let premise_post_token = await fetch(url, { + method: 'POST', + headers: headers, + body: body + }); + let response_post_token = await premise_post_token.json(); + console.log("response_post_token = ", response_post_token); + logger.info("response_post_token = " + response_post_token , { numsession: req.session.id, label: filename}); + } + + // LISTING DES PARTICIPANTS + // BILLETS ENCADRANT + for (let toto = 1; toto < 5; toto++) { + if (req.session["encadrant_"+toto+"_nom"]) { + if (req.session["encadrant_"+toto+"_type"]=="Parent") {weez_id_billet = weez_id_billet_encadrant_parent} + if (req.session["encadrant_"+toto+"_type"]=="Professeur") {weez_id_billet = weez_id_billet_encadrant_prof} + participants.participants.push({ "id_evenement": weez_id_evenement_encadrant, "id_billet": weez_id_billet, "email": weez_email, "nom": req.session["encadrant_"+toto+"_nom"], "prenom": req.session["encadrant_"+toto+"_prenom"], "form": {"adresse": req.session.identifiant}, "notify": true }); + + } + } + + + // ENVOIE DE TOUS LES BILLETS PAR 1 REQUÈTE API + body += '&data=' + JSON.stringify(participants); + envoi_weez_api(url,body); + + ///////////////////////////////////// + // COPIE VERS GOOGLE SHEET + ///////////////////////////////////// + + try { + await GS_concert.useServiceAccountAuth(GS_creds); + await GS_concert.loadInfo(); + const GS_concert_adherent = GS_concert.sheetsByTitle['adherents']; + const GS_concert_hebergements = GS_concert.sheetsByTitle['hebergements']; + const GS_concert_spectateurs = GS_concert.sheetsByTitle['spectateurs']; + const GS_concert_concertistes = GS_concert.sheetsByTitle['concertistes']; + const GS_concert_encadrants = GS_concert.sheetsByTitle['encadrants']; + const GS_concert_nombre_places = GS_concert.sheetsByTitle['nombre_places']; + const GS_concert_finance = GS_concert.sheetsByTitle['finance']; + const GS_concert_inscription_en_attente = GS_concert.sheetsByTitle['inscription_en_attente']; + + + const ajout_gs_adherent = await GS_concert_adherent.addRows ( + [ + { + saison: saison, + identifiant: req.session.identifiant, + association_suzuki: req.session.association_suzuki, + date_inscription: now, + date_inscription_maj: now, + paiement: "gratuit", + adherent_nom: req.session.adherent_nom, + adherent_prenom: req.session.adherent_prenom, + adherent_telephone_mobile: "'" + req.session.adherent_telephone_mobile, + adherent_mail: req.session.adherent_mail, + nb_encadr_prof: commande_nbr_places_encadrant_prof, + nb_encadr_par: commande_nbr_places_encadrant_parent, + commentaire: req.session.commentaire_adherent, + date_maj_gsheet: now + } + ] + ); + + if (req.session.hebergement_nb > 0){ + const ajout_gs_hebergements = await GS_concert_hebergements.addRows ( + [ + { + saison: saison, + identifiant: req.session.identifiant, + hebergement_ville: req.session.hebergement_ville, + hebergement_places: req.session.hebergement_nb, + date_maj_gsheet: now + } + ] + ); + } + + let ajout_gs_encadrants = []; + for (let toto = 1; toto < 5; toto++) { + if (req.session["encadrant_"+toto+"_nom"]) { + ajout_gs_encadrants.push({ + saison: saison, + identifiant: req.session.identifiant, + encadrant_type: req.session["encadrant_"+toto+"_type"], + encadrant_nom: req.session["encadrant_"+toto+"_nom"], + encadrant_prenom: req.session["encadrant_"+toto+"_prenom"], + encadrant_telephone_mobile: "'" + req.session["encadrant_"+toto+"_telephone_mobile"], + encadrant_mail: req.session["encadrant_"+toto+"_mail"], + encadrant_prof_instrument: req.session["encadrant_"+toto+"_prof_instrument"], + date_maj_gsheet: now + }) + } + } + await GS_concert_encadrants.addRows (ajout_gs_encadrants); + + // ONGLET nombre_places + + // récup nombre de places dans DBca_decompte_place + sql = 'SELECT spectateur_commandes, concertiste_commandes, encadr_prof_commandes, encadr_parent_commandes, piano_commandes, alto_commandes, flute_commandes, trompette_commandes, harpe_commandes, violon1_commandes, violon2_commandes, violoncelle1_commandes, violoncelle2_commandes FROM ca_decompte_place'; + const [results_ca_decompte_place, fields_ca_decompte_place] = await db_connection_promise.execute(sql); + + await GS_concert_nombre_places.loadCells('A1:O2'); + + GS_concert_nombre_places.getCellByA1('C2').value = results_ca_decompte_place[0].encadr_prof_commandes; + GS_concert_nombre_places.getCellByA1('D2').value = results_ca_decompte_place[0].encadr_parent_commandes; + GS_concert_nombre_places.getCellByA1('O2').value = now; + + await GS_concert_nombre_places.saveUpdatedCells(); + + + ///////////////////////////////////// + // AFFICHAGE DE LA PAGE + res.locals.identifiant = req.session.identifiant; + res.locals.today = today; + res.locals.amount_total = 0; + res.render('concert/page_templates/paiement_reussi'); + + + } catch (error) { + // Echec de connection à la GOOGLE SHEET + logger.error("Il y a un problème avec la connection à Google sheet : " + 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; + }; + + + + + } + + + } catch (error) { + // Echec de connection à la BD + logger.error("Il y a un problème avec la connection à la base de données! : " + error, { numsession: req.session.id }); + req.session.err_mail_form_adhesion_1 = '"Il y a un problème système connexion base de données, veuillez recommencer, "' + error; + //await db_connection_promise.end(); + affiche_page_identifier(); + } + + } + + + + +} + + +///////////////////////////////////////////////// +// EXPORT DES MODULES POUR QU'ILS PUISSENT LUS PAR LES AUTRES FICHIERS JS +///////////////////////////////////////////////// + +module.exports = { + payer +} \ No newline at end of file diff --git a/controllers/concert_annuel/retourStripeController.js b/controllers/concert_annuel/retourStripeController.js new file mode 100644 index 0000000..67d088b --- /dev/null +++ b/controllers/concert_annuel/retourStripeController.js @@ -0,0 +1,874 @@ +///////////////////////////////////////////////// +// 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); +// ADOBE PDF +const PDFServicesSdk = require('@adobe/pdfservices-node-sdk'); +// 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"); +const pdf = require("./../../modules/pdf"); + +//////////////////////////////////////////////////// +// 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 + }); +} + +///////////////////////////////////////////////// +// 5 - RETOUR STRIPE +///////////////////////////////////////////////// + +const retour_bank = async function (req, res) { + + logger.info("======================================"); + logger.info("======== retour_bank =========="); + logger.info("======================================"); + + let sql; + let sql11; + let sql12; + let sql13; + let sql14; + var mail_objet; + var mail_html; + moment.locale('fr'); + let now = moment().format("YYYY-MM-DD HH:mm:ss"); + var today = moment().format('L'); + var identifiant; + let compteur_piano = 0 + let compteur_harpe = 0 + let compteur_trompette = 0 + let compteur_flute = 0 + let compteur_alto = 0 + let compteur_violon1 = 0 + let compteur_violon2 = 0 + let compteur_violoncelle1 = 0 + let compteur_violoncelle2 = 0 + + // FONCTION POUR AFFICHER LA PAGE EN CAS D'ERREUR + 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 la personne rafraîchit la page + // On arrête + ///////////////////////////////////////////////// + if (req.session.idstripe) { + req.session.err_mail_form_adhesion_1 = "Votre session est terminée, veuiller redémarrer votre navigateur."; + affiche_page_identifier(); + + } else { + + ///////////////////////////////////////////////// + // REUSSI ou ANNULÉ ? + ///////////////////////////////////////////////// + let retour_stripe; + logger.info("req.url : " + req.url, { numsession: req.session.id, label: filename }); + if (req.url.indexOf('concert_paiement/annule') !== -1) { + retour_stripe= "annule"; + } else if (req.url.indexOf('concert_paiement/reussi') !== -1) { + retour_stripe= "reussi"; + } else { + logger.info("Il y a un problème avec l'URL : " + req.url, { numsession: req.session.id, label: filename }); + req.session.err_mail_form_adhesion_1 = "Il y a un problème système"; + affiche_page_identifier(); + } + logger.info("retour_stripe : " + retour_stripe, { numsession: req.session.id, label: filename }); + + var id = req.query.id; + logger.info("id : " + id, { numsession: req.session.id, label: filename }); + req.session.idstripe = id; + const session_stripe = await stripe.checkout.sessions.retrieve(id); + var customer_email = session_stripe.customer_email; + var payment_status = session_stripe.payment_status; + var amount_total = session_stripe.amount_total/100; + var stripe_customer = session_stripe.customer; + var stripe_payment_intent = session_stripe.payment_intent; + var payment_method_types = session_stripe.payment_method_types; + var stripe_status = session_stripe.status; + identifiant = session_stripe.metadata.identifiant; + logger.info("customer_email : " + customer_email, { numsession: req.session.id, label: filename }); + logger.info("identifiant : " + identifiant, { numsession: req.session.id, label: filename }); + logger.info("payment_status : " + payment_status, { numsession: req.session.id, label: filename }); + logger.info("amount_total : " + amount_total, { numsession: req.session.id, label: filename }); + logger.info("stripe_status : " + stripe_status, { numsession: req.session.id, label: filename }); + logger.info("session_stripe.metadata.ajoutbillet : " + session_stripe.metadata.ajoutbillet, { numsession: req.session.id, label: filename }); + let stripe_retour = session_stripe.id; + + + try { + // MAJ STATUS DU PAIEMENT SI MONTANT A PAYER + + //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 ca_adherent where stripe_retour = "' + stripe_retour + '"'; + const [results0, fields0] = await db_connection_promise.execute(sql0); + logger.info("Row ca_adherent stripe_retour : " + results0.length, { numsession: req.session.id, label: filename}); + + if (results0.length < 1) { + + // SI MODE INSCRIPTION INITIALE + if (session_stripe.metadata.ajoutbillet == "non") { + + //Query + sql = 'UPDATE '; + sql += 'ca_adherent'; + sql += ' SET '; + sql += 'stripe_retour = "' + stripe_retour + '", '; + sql += 'stripe_date = "' + now + '", '; + if(retour_stripe === "annule") {sql += 'stripe_statut_paiement = "impaye"';} + if(retour_stripe === "reussi") {sql += 'stripe_statut_paiement = "paye"';} + sql += ' WHERE identifiant = "' + identifiant + '"'; + + const [results, fields] = await db_connection_promise.execute(sql); + logger.info("Row ca_adherent UPDATE STRIPE: " + results.changedRows, { numsession: req.session.id, label: filename}); + + //ca_concertiste + sql11 = 'SELECT saison, concertiste_nom, concertiste_prenom, concertiste_age, concertiste_intrument, concertiste_cahier, concertiste_piece, concertiste_prof_nom, concertiste_prof_mail, ajout FROM ca_concertiste where identifiant = "' + identifiant + '"'; + //ca_encadrant + sql12 = 'SELECT saison, encadrant_type, encadrant_nom, encadrant_prenom, encadrant_telephone_mobile, encadrant_mail, encadrant__prof_instrument, ajout FROM ca_encadrant where identifiant = "' + identifiant + '"'; + //Nombre de place commandées + sql13 = 'SELECT commande_nb_spectateur, commande_nb_concertiste, commande_nb_encadr_prof, commande_nb_encadr_par, commande_cout_concertiste, commande_cout_spectateur, don, montant_total, stripe_retour FROM ca_adherent where identifiant = "' + identifiant + '"'; + //ca_adherent + sql14 = 'SELECT saison, date_inscription, date_maj, association_suzuki, adherent_nom, adherent_prenom, adherent_telephone_mobile, adherent_mail, hebergement_ville, hebergement_places, comment FROM ca_adherent where identifiant = "' + identifiant + '"'; + + } + + // SI MODE INSCRIPTION AJOUT DE BILLET + // ON SÉLECTIONNE LES CONCERTISTES ET LES ENCADRANTS QUI ONT QUELQUE CHOSE DANS LA CHAMP "AJOUT" + if (session_stripe.metadata.ajoutbillet == "oui") { + //Query + sql = 'UPDATE '; + sql += 'ca_ajout'; + sql += ' SET '; + sql += 'stripe_retour = "' + stripe_retour + '", '; + if(retour_stripe === "annule") {sql += 'stripe_statut_paiement = "impaye"';} + if(retour_stripe === "reussi") {sql += 'stripe_statut_paiement = "paye"';} + sql += ' WHERE identifiant = "' + identifiant + '"'; + + const [results, fields] = await db_connection_promise.execute(sql); + logger.info("Row ca_adherent UPDATE STRIPE: " + results.changedRows, { numsession: req.session.id, label: filename}); + + //ca_concertiste + sql11 = 'SELECT saison, concertiste_nom, concertiste_prenom, concertiste_age, concertiste_intrument, concertiste_cahier, concertiste_piece, concertiste_prof_nom, concertiste_prof_mail, ajout FROM ca_concertiste where identifiant = "' + identifiant + '" AND ajout IS NOT NULL'; + //ca_encadrant + sql12 = 'SELECT saison, encadrant_type, encadrant_nom, encadrant_prenom, encadrant_telephone_mobile, encadrant_mail, encadrant__prof_instrument, ajout FROM ca_encadrant where identifiant = "' + identifiant + '" AND ajout IS NOT NULL'; + //Nombre de place commandées + sql13 = 'SELECT commande_nb_spectateur, commande_nb_concertiste, commande_nb_encadr_prof, commande_nb_encadr_par, commande_cout_concertiste, commande_cout_spectateur, don, montant_total, stripe_retour FROM ca_ajout where identifiant = "' + identifiant + '"'; + //ca_adherent + sql14 = 'SELECT saison, date_inscription, date_maj, association_suzuki, adherent_nom, adherent_prenom, adherent_telephone_mobile, adherent_mail FROM ca_adherent where identifiant = "' + identifiant + '"'; + } + + //ca_concertiste + const [results_ca_concertiste, fields_ca_concertiste] = await db_connection_promise.execute(sql11); + logger.info("Row ca_concertiste RECUP INFOS : " + results_ca_concertiste.length, { numsession: req.session.id, label: filename}); + + //ca_encadrant + const [results_ca_encadrant, fields_ca_encadrant] = await db_connection_promise.execute(sql12); + logger.info("Row ca_encadrant RECUP INFOS : " + results_ca_encadrant.length, { numsession: req.session.id, label: filename}); + + //Nombre de place commandées + const [results_nb_commande, fields_nb_commande] = await db_connection_promise.execute(sql13); + logger.info("Row results_nb_commande RECUP INFOS : " + results_nb_commande.length, { numsession: req.session.id, label: filename}); + + // RÉCUPÉRATION DES INFORMATIONS PARTICIPANTS POUR ENVOIE MAIL AVEC RÉCAP + //ca_adherent + const [results_ca_adherent, fields_ca_adherent] = await db_connection_promise.execute(sql14); + logger.info("Row ca_adherent RECUP INFOS: " + results_ca_adherent.length, { numsession: req.session.id, label: filename}); + + // ADRESSE ADHÉRENT adherent + sql = 'SELECT adherent_adresse_rue, adherent_adresse_codepostal, adherent_adresse_ville FROM adherent where identifiant = "' + identifiant + '"'; + const [results_adherent, fields_adherent] = await db_connection_promise.execute(sql); + logger.info("Row adherent RECUP INFOS: " + results_adherent.length, { numsession: req.session.id, label: filename}); + + + + // AJOUT DÉCOMPTE DES PLACES + // SI PAIEMENT REUSSI + // !!! Au démarrage de la campagne les champs de la table doivent être à 0 (zéro) et non vide ou null + + if(retour_stripe === "reussi") { + + sql = 'UPDATE '; + sql += 'ca_decompte_place'; + sql += ' SET '; + sql += 'date_maj = "' + now + '", '; + if (results_nb_commande[0].commande_nb_spectateur > 0) { sql += 'spectateur_commandes = spectateur_commandes + ' + results_nb_commande[0].commande_nb_spectateur + ', '; } + if (results_nb_commande[0].commande_nb_concertiste > 0) { sql += 'concertiste_commandes = concertiste_commandes + ' + results_nb_commande[0].commande_nb_concertiste + ', '; } + if (results_nb_commande[0].commande_nb_encadr_prof > 0) { sql += 'encadr_prof_commandes = encadr_prof_commandes + ' + results_nb_commande[0].commande_nb_encadr_prof + ', '; } + if (results_nb_commande[0].commande_nb_encadr_par > 0) { sql += 'encadr_parent_commandes = encadr_parent_commandes + ' + results_nb_commande[0].commande_nb_encadr_par + ', '; } + logger.info("A3 VANT LE IF results_ca_concertiste.length: ", { numsession: req.session.id, label: filename}); + logger.info("results_ca_concertiste.length: " + results_ca_concertiste.length, { numsession: req.session.id, label: filename}); + if (results_ca_concertiste.length > 0) { + for (let i = 0; i 0) { + mail_html += "

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

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

RÉCAPITULATIF

'; + mail_html += "

Identifiant Suzuki : " + identifiant; + if (results_ca_adherent[0].hebergement_places > 0) {mail_html += "


HÉBERGEMENT PROPOSÉ :
Ville : " + results_ca_adherent[0].hebergement_ville + ", nombre de personnes : " + results_ca_adherent[0].hebergement_places + "


";} + if (results_ca_concertiste.length > 0) { + mail_html += "

" + results_ca_concertiste.length + " CONCERTISTE(S) :

"; + mail_html += "

Les concertistes s'engagent à être présents les 2 journées du 20 et 21 avril 2024.

"; + for (let i = 0; i"; + mail_html += "instrument : " + results_ca_concertiste[i].concertiste_intrument + " - " + results_ca_concertiste[i].concertiste_cahier + " - " + results_ca_concertiste[i].concertiste_piece + "
"; + if (results_ca_concertiste[i].concertiste_intrument == "Piano") {mail_html += "Pour le piano l’inscription doit être validée par le comité.
"}; + mail_html += "professeur : " + results_ca_concertiste[i].concertiste_prof_nom + " - " + results_ca_concertiste[i].concertiste_prof_mail + "

"; + } + } + if (results_ca_encadrant.length > 0) { + mail_html += "

" + results_ca_encadrant.length + " ENCADRANT(S) :

"; + mail_html += "

Les encadrants s'engagent à être présents les 2 journées du 20 et 21 avril 2024.

"; + for (let i = 0; i"; + mail_html += "coordonnées : " + results_ca_encadrant[i].encadrant_telephone_mobile + " - " + results_ca_encadrant[i].encadrant_mail + "
"; + if (results_ca_encadrant[i].encadrant__prof_instrument) {mail_html += "instrument : " + results_ca_encadrant[i].encadrant__prof_instrument}; + mail_html += "

"; + } + } + if (results_nb_commande[0].commande_nb_spectateur > 0) { + mail_html += "

" + results_nb_commande[0].commande_nb_spectateur + " SPECTATEUR(S) RÉSERVÉ(S) :
" + mail_html += "Les billets spectateurs sont valables pour la date du 21 avril 2024.

"; + } + + mail_html += "

TARIFS :
"; + if (results_ca_concertiste.length > 0) {mail_html += "- concertiste(s) : " + results_nb_commande[0].commande_cout_concertiste + "€
"}; + if (results_nb_commande[0].commande_nb_spectateur > 0) {mail_html += "- spectateur(s) : " + results_nb_commande[0].commande_cout_spectateur + "€"}; + if (results_nb_commande[0].don > 0) {mail_html += "

- Votre don : " + results_nb_commande[0].don + "€"}; + mail_html += "

Montant total : " + results_nb_commande[0].montant_total + "€"; + + mail_html += '

Association Française pour la pédagogie Suzuki
Marie Rossot - Pôle organisation du Concert national Unesco 2024

Logo

'; + + // ajout du logo + let dossier_image = path.resolve(__dirname, "../../public/images/logos/")+"/logosuzukigris.png"; + + if (results_nb_commande[0].don > 0 && retour_stripe === "reussi") { + + ////////////////////////////////////////////////////////////////////////////// + // ADOBE PDF : JUSTIFICATIF DE DON + + // VARIABLES POUR LE PDF + let OUTPUT; + let INPUT; + let now_pdf = moment().format("YYYY-MM-DDTHH-mm-ss"); + var adresse = results_adherent[0].adherent_adresse_rue; + adresse += " "; + adresse += results_adherent[0].adherent_adresse_codepostal; + adresse += " "; + adresse += results_adherent[0].adherent_adresse_ville; + OUTPUT = path.resolve(__dirname, "../../pdf/concert_annuel/don/2425/")+"/"+identifiant+"_don_"+now_pdf+".pdf"; + INPUT = path.resolve(__dirname, "../../pdf/template/don_justificatif.docx"); + JSON_INPUT = + { + "date": today, + "identifiant": identifiant, + "mode_paiement": "carte bancaire", + "adherent_nom": results_ca_adherent[0].adherent_nom, + "adherent_prenom": results_ca_adherent[0].adherent_prenom, + "adresse": adresse, + "adherent_paiement_montant_don": results_nb_commande[0].don + }; + + await pdf.pdfgo(OUTPUT, INPUT, JSON_INPUT); + + // VARIABLE POUR LE MAIL + var attachment_name = identifiant + "_don_" + now_pdf + ".pdf"; + var mailOptions = { + from: 'afps.inscription@gmail.com', + to: customer_email, + subject: mail_objet, + html: mail_html, + attachments: [ + { + filename: 'logosuzukigris.png', + path: dossier_image, + cid: 'logo' + }, + { + filename: attachment_name, + path: OUTPUT + }, + ] + }; + + + } else { + + // SANS JUSTIFICATIF DE DON + // VARIABLE POUR LE MAIL + var mailOptions = { + from: 'afps.inscription@gmail.com', + to: customer_email, + subject: mail_objet, + html: mail_html, + attachments: [{ + filename: 'logosuzukigris.png', + path: dossier_image, + cid: 'logo' + }] + }; + } + + envoie_mail.envoie_mail(mailOptions); + + ///////////////////////////////////// + // ENVOI MAIL AU PROF SI PAIEMENT REUSSI & SI CONCERTISTES + if(retour_stripe === "reussi" && results_ca_concertiste.length > 0) { + logger.info("ENVOIE MAILS AU PROF", { numsession: req.session.id, label: filename}); + for (let i = 0; i'; + mail_html += 'Nom de l\'élève : ' + results_ca_concertiste[i].concertiste_nom + ' ' + results_ca_concertiste[i].concertiste_prenom + '
'; + mail_html += 'Âge de l\'élève : ' + results_ca_concertiste[i].concertiste_age + '
'; + mail_html += 'Instrument de l\'élève : ' + results_ca_concertiste[i].concertiste_intrument + '
'; + mail_html += 'Niveau (cahier) : ' + results_ca_concertiste[i].concertiste_cahier + '
'; + mail_html += 'Pièce : ' + results_ca_concertiste[i].concertiste_piece + '

'; + mail_html += "

Association Française pour la Pédagogie Suzuki
Marie Rossot - Pôle organisation du Concert national Unesco 2024

Logo"; + + var mailOptions = { + from: 'afps.inscription@gmail.com', + to: results_ca_concertiste[i].concertiste_prof_mail, + subject: mail_objet, + html: mail_html, + attachments: [{ + filename: 'logosuzukigris.png', + path: dossier_image, + cid: 'logo' + }] + }; + + + envoie_mail.envoie_mail(mailOptions); + } + } + + ///////////////////////////////////// + // ENVOI BILLETS VERS WEEZEVENT + ///////////////////////////////////// + + if(retour_stripe === "reussi" && (results_ca_concertiste.length > 0 || results_ca_encadrant.length > 0 || results_nb_commande[0].commande_nb_spectateur > 0)) { + + logger.info("ENVOIE BILLET WEEZEVENT", { numsession: req.session.id, label: filename}); + + // WEEZEVENT test compte de Julie + // EVENT + // id: 1012995, name: 'ADUZUKI UNESCO Concertistes Encadrants', + // id: 1013004, name: 'ADUZUKI UNESCO Spectateur', + // id: 1042983, name: 'ADUZUKI UNESCO Encadrants', + // id billet: '3742964', name: 'Spectateur', + // id billet : '3863469', name: 'Concertiste' + // id billet: '3863496', name: 'Encadrant professeur', + // id billet: '3863495', name: 'Encadrant parent', + + // WEEZEVENT Compte AFPS + // EVENT + // id: 1043198 ADUZUKI UNESCO Encadrants + // id: 1043199 ADUZUKI UNESCO Élèves musiciens + // id: 1043050 ADUZUKI UNESCO Spectateur + // id billet: '3874933', name: 'Spectateur', + // id billet : '3875316', name: 'Élève musicien' + // id billet: '3875315', name: 'Encadrant professeur', + // id billet: '3875313', name: 'Encadrant parent', + + let weez_id_evenement_concertiste = process.env.weezevent_id_event_concertiste; + let weez_id_evenement_encadrant = process.env.weezevent_id_event_encacrant; + let weez_id_evenement_spectateur = process.env.weezevent_id_event_spect; + + let weez_id_billet_concertiste = process.env.weez_id_billet_concertiste; + let weez_id_billet_spectateur = process.env.weez_id_billet_spectateur; + let weez_id_billet_encadrant_parent = process.env.weez_id_billet_encadrant_parent; + let weez_id_billet_encadrant_prof = process.env.weez_id_billet_encadrant_prof; + + //let weez_id_evenement_concertiste = "1043199"; + //let weez_id_evenement_encadrant = "1043198"; + //let weez_id_evenement_spectateur = "1043050"; + // + // + //let weez_id_billet_concertiste = "3875316"; + //let weez_id_billet_spectateur = "3874933"; + //let weez_id_billet_encadrant_parent = "3875313"; + //let weez_id_billet_encadrant_prof = "3875315"; + + let weez_id_billet; + let weez_email = customer_email; + //let weez_nom = results_ca_adherent[0].adherent_nom; + let participants = { + "participants": [], + "return_ticket_url": true + }; + + + let weez_prenom; + let TICKETING_API_BASE_URL = "https://api.weezevent.com/v3/participants?"; + let url = TICKETING_API_BASE_URL; + body = '&api_key=' + process.env.weezevent_API_KEY; + body += '&access_token=' + process.env.weezevent_TOKEN; + + + async function envoi_weez_api(url,body) { + logger.info("url = " + url , { numsession: req.session.id, label: filename}); + logger.info("body = " + body , { numsession: req.session.id, label: filename}); + let headers = {'content-type':'application/x-www-form-urlencoded;charset=utf-8'}; + let premise_post_token = await fetch(url, { + method: 'POST', + headers: headers, + body: body + }); + let response_post_token = await premise_post_token.json(); + console.log("response_post_token = ", response_post_token); + logger.info("response_post_token = " + response_post_token , { numsession: req.session.id, label: filename}); + } + + // LISTING DES PARTICIPANTS + + // BILLETS SPECTATEUR + if (results_nb_commande[0].commande_nb_spectateur > 0) { + logger.info("results_nb_commande[0].commande_nb_spectateur = " + results_nb_commande[0].commande_nb_spectateur , { numsession: req.session.id, label: filename}); + for (let i = 0; i 0) { + logger.info("results_ca_encadrant.length = " + results_ca_encadrant.length , { numsession: req.session.id, label: filename}); + for (let i = 0; i 0) { + logger.info("results_ca_concertiste.length = " + results_ca_concertiste.length , { numsession: req.session.id, label: filename}); + for (let i = 0; i 0){ + const ajout_gs_hebergements = await GS_concert_hebergements.addRows ( + [ + { + saison: results_ca_adherent[0].saison, + identifiant: identifiant, + hebergement_ville: results_ca_adherent[0].hebergement_ville, + hebergement_places: results_ca_adherent[0].hebergement_places, + date_maj_gsheet: now + } + ] + ); + } + + if (results_nb_commande[0].commande_nb_spectateur > 0){ + const ajout_gs_spectateurs = await GS_concert_spectateurs.addRows ( + [ + { + saison: results_ca_adherent[0].saison, + identifiant: identifiant, + commande_nb_spectateur: results_nb_commande[0].commande_nb_spectateur, + date_maj_gsheet: now + } + ] + ); + } + + if (results_ca_concertiste.length > 0) { + let ajout_gs_concertistes = []; + for (let i = 0; i < results_ca_concertiste.length; i++) { + ajout_gs_concertistes.push({ + saison: results_ca_concertiste[i].saison, + identifiant: identifiant, + concertiste_nom: results_ca_concertiste[i].concertiste_nom, + concertiste_prenom: results_ca_concertiste[i].concertiste_prenom, + adherent_telephone_mobile: "'" + results_ca_adherent[0].adherent_telephone_mobile, + adherent_mail: results_ca_adherent[0].adherent_mail, + concertiste_age: results_ca_concertiste[i].concertiste_age, + concertiste_intrument: results_ca_concertiste[i].concertiste_intrument, + concertiste_cahier: results_ca_concertiste[i].concertiste_cahier, + concertiste_piece: results_ca_concertiste[i].concertiste_piece, + concertiste_prof_nom: results_ca_concertiste[i].concertiste_prof_nom, + concertiste_prof_mail: results_ca_concertiste[i].concertiste_prof_mail, + date_maj_gsheet: now + }); + } + await GS_concert_concertistes.addRows (ajout_gs_concertistes); + } + + if (results_ca_encadrant.length > 0) { + let ajout_gs_encadrants = []; + for (let i = 0; i { + req.session[field] = req.body[field]; + data.push({[field] : req.body[field]}); + logger.info("#0" + field + " = " + req.body[field], { numsession: req.session.id, label: filename}); + }); + console.log("data = ", data); + + + ///////////////////////////////////////////////// + // AJOUT DANS LA BASE DE DONNÉES + ///////////////////////////////////////////////// + + try { + //Connexion + let db_connection_promise = await connect_DB_promise(); + + // AJOUT DON + if (req.session.montant) { + let table = "don"; + + // Fusionner les objets du tableau "data" qui contient les infos saisis dans le formulaire en un seul objet pour pouvoir le traiter dans la fonction "generateInsertSQL" + const mergedData = Object.assign({}, ...data); + console.log("mergedData = ", mergedData); + + // Appel de la fonction qui génère la requête SQL + const sql = generateInsertSQL(table, mergedData); + console.log("sql = ", sql); + const values = extractValues(mergedData); + console.log("values = ", values); + + // lancement de la requête + const [result_sql, fields] = await db_connection_promise.execute(sql, values); + logger.info("#1 result_sql Row ID added : " + result_sql.insertId, { numsession: req.session.id, label: filename}); + + + ///////////////////////////////////////////////// + // ENVOIE VERS STRIPE + + logger.info("======== ENVOIE VERS STRIPE ==========", { label: filename }); + + // STRIPE - ETAPE 1 - CREER l'INTENTION DE PAIEMENT + const session_stripe = await stripe.checkout.sessions.create({ + + metadata: {app: "don", identifiant: result_sql.insertId, montant: req.session.montant, nom: req.session.nom +" "+ req.session.prenom}, + + customer_email: req.session.mail, + + mode: 'payment', + + success_url: process.env.STRIPE_DON_SUCCESSURL, + cancel_url: process.env.STRIPE_DON_CANCELURL, + + line_items: [{ + price_data: { + currency: 'eur', + unit_amount: req.session.montant * 100, + product_data: { + name: 'Don AFPS', + description: 'DON AFPS depuis site AFPS', + }, + }, + quantity: 1, + }], + success_url: process.env.STRIPE_DON_SUCCESSURL, + cancel_url: process.env.STRIPE_DON_CANCELURL, + }); + + res.redirect(session_stripe.url) + + } else { + // Les informations saisies sont vides + logger.info("Il y a un problème avec la saisie des informations du formulaire", { numsession: req.session.id }); + req.session.affiche_err_1 = 'Il y a un problème avec la saisie des informations du formulaire, veuillez recommencer.'; + res.redirect('/don'); + } + + } catch (error) { + // Echec de connection à la BD + logger.error("Il y a un problème avec la connection à la base de données ou Stripe post_form_don : " + error, { numsession: req.session.id }); + req.session.affiche_err_1 = '"Il y a un problème système connexion base de données, veuillez recommencer, "' + error; + res.redirect('/don'); + } + + + + +} + + +///////////////////////////////////////////////// +// RETOUR STRIPE +///////////////////////////////////////////////// +const don_accompte_reussi = async function(req, res) { + logger.info("======================================"); + logger.info("======== FUNCTION don_accompte_reussi =========="); + logger.info("======================================"); + ////////////////////////////////////////////////////////////////////////////// + // RETOUR STRIPE + let id = req.query.id; + const session_stripe = await stripe.checkout.sessions.retrieve(id); + let customer_email = session_stripe.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; + + console.log("payment_status = ", payment_status); + console.log("stripe_customer = ", stripe_customer); + console.log("stripe_payment_intent = ", stripe_payment_intent); + console.log("payment_method_types = ", payment_method_types); + console.log("stripe_status = ", stripe_status); + + ////////////////////////////////////////////////////////////////////////////// + // PRÉPARATION PAGE PAIEMENT RÉUSSI + moment.locale('fr'); + let now = moment().format("YYYY-MM-DD HH:mm:ss"); + res.locals.today = now; + res.locals.montant = amount_total; + res.locals.mail = customer_email; + + ////////////////////////////////////////////////////////////////////////////// + // AFFICHAGE PAGE PAIEMENT RÉUSSI + res.render('don/page_templates/don_paiement_reussi.ejs'); +} + +///////////////////////////////////////////////// +// RETOUR STRIPE +///////////////////////////////////////////////// +const don_accompte_annule = async function(req, res) { + logger.info("======================================"); + logger.info("======== FUNCTION don_accompte_annule =========="); + logger.info("======================================"); + ////////////////////////////////////////////////////////////////////////////// + // RETOUR STRIPE + let id = req.query.id; + const session_stripe = await stripe.checkout.sessions.retrieve(id); + let customer_email = session_stripe.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; + + console.log("payment_status = ", payment_status); + console.log("stripe_customer = ", stripe_customer); + console.log("stripe_payment_intent = ", stripe_payment_intent); + console.log("payment_method_types = ", payment_method_types); + console.log("stripe_status = ", stripe_status); + + ////////////////////////////////////////////////////////////////////////////// + // PRÉPARATION PAGE PAIEMENT RÉUSSI + moment.locale('fr'); + let now = moment().format("YYYY-MM-DD HH:mm:ss"); + res.locals.today = now; + res.locals.montant = amount_total; + res.locals.mail = customer_email; + + + + ////////////////////////////////////////////////////////////////////////////// + // AFFICHAGE PAGE PAIEMENT ANNULÉE + res.render('don/page_templates/don_paiement_annule.ejs'); +} + + +///////////////////////////////////////////////// +// WEBHOOK STRIPE +// BD STATUS PAIEMENT +// ENVOIE PDF JUSTIFICATIF PAR MAIL +// AJOUT DANS LA GOOGLE SHEET +///////////////////////////////////////////////// +async function wh_stripe_don(req, res, event) { + + logger.info("======================================"); + logger.info("======== FUNCTION wh_stripe_don =========="); + logger.info("======================================"); + + moment.locale('fr'); + let now = moment().format("DD/MM/YYYY"); + let dateheure = moment().format("YYYY-MM-DDTHH-mm"); + + + try { + ///////////////////////////////////////////////// + // MODIFICATION BD STATUS PAYMENT + + //Connexion DB + let db_connection_promise = await connect_DB_promise(); + + // AJOUT STATUS PAIEMENT + let table = "don"; + + let sql = 'UPDATE '; + sql += table; + sql += ' SET '; + sql += 'stripe_retour = "' + event.data.object.id + '", '; + sql += 'statut_paiement = "' + event.data.object.payment_status + '" '; + sql += ' WHERE id = ' + event.data.object.metadata.identifiant; + + logger.info("#2 sql : " + sql, { numsession: req.session.id, label: filename}); + + // lancement de la requête + const [result_sql, fields] = await db_connection_promise.execute(sql); + logger.info("#2 result_sql Row ID changed : " + result_sql.changedRows, { numsession: req.session.id, label: filename}); + + ///////////////////////////////////////////////// + // SI PAIEMENT RÉUSSI + if (event.data.object.payment_status === "paid") { + + ///////////////////////////////////////////////// + // RÉCUPÉRATION DES INFOS DE LA BASE DE DONNÉES + let sql_select = 'SELECT * FROM '; + sql_select += table; + sql_select += ' WHERE id = ' + event.data.object.metadata.identifiant; + + logger.info("#3 sql_select : " + sql_select, { numsession: req.session.id, label: filename}); + // lancement de la requête + const [result_sql_select, fields_select] = await db_connection_promise.execute(sql_select); + logger.info("REQUETE SQL - result_sql_select = " + result_sql_select.length, { numsession: req.session.id, label: filename}); + logger.info("#3 result_sql_select nom : " + result_sql_select[0].nom, { numsession: req.session.id, label: filename}); + + ///////////////////////////////////////////////// + // PDF JUSTIFICATIF DE DON + + const data = { + nom: result_sql_select[0].nom + ' ' + result_sql_select[0].prenom, + rue: result_sql_select[0].adresse_rue, + complement: result_sql_select[0].adresse_complement, + ville: result_sql_select[0].adresse_codepostal + ' ' + result_sql_select[0].adresse_ville, + pays: result_sql_select[0].adresse_pays, + montant: result_sql_select[0].montant, + date: now + }; + const htmlContent = await ejs.renderFile('./pdf/template/don_wp.html', data); + const buffer = await weasyprint(htmlContent); + const pdfOutputPath = path.join(__dirname, `../pdf/don/don_${result_sql_select[0].nom}_${dateheure}.pdf`); + fs.writeFileSync(pdfOutputPath, buffer); + logger.info("PDF CREATED", { numsession: req.session.id, label: filename}); + + ///////////////////////////////////////////////// + // ENVOIE MAIL CONFIRM + JUSTIF + var attachment_name = `${result_sql_select[0].nom}_justificatif_don_AFPS_${dateheure}.pdf`; + var mail_objet = `ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI - VOTRE DON - ${result_sql_select[0].nom}`; + var mail_html = `

Bonjour,


Nous vous remercions chaleureusement pour votre don de ${result_sql_select[0].montant}€ à l'Association Française pour le Pédagogie Suzuki.


Veuillez trouver le justificatif en pièce jointe.


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

`; + var mailOptions = { + from: 'afps.inscription@gmail.com', + to: result_sql_select[0].mail, + subject: mail_objet, + html: mail_html, + attachments: [{ + filename: attachment_name, + path: pdfOutputPath + }], + }; + envoie_mail.envoie_mail(mailOptions); + + ///////////////////////////////////////////////// + // AJOUT GOOGLE SHEET + await GS_don.useServiceAccountAuth(GS_creds); + await GS_don.loadInfo(); + let GS_sheet_don = GS_don.sheetsByTitle['dons']; + await GS_sheet_don.addRows ( + [ + { + id: result_sql_select[0].id, + date: result_sql_select[0].date_auto, + montant: result_sql_select[0].montant, + nom: result_sql_select[0].nom, + prenom: result_sql_select[0].prenom, + adresse_rue: result_sql_select[0].adresse_rue, + adresse_complement: result_sql_select[0].adresse_complement, + adresse_codepostal: result_sql_select[0].adresse_codepostal, + adresse_ville: result_sql_select[0].adresse_ville, + adresse_pays: result_sql_select[0].adresse_pays, + mail: result_sql_select[0].mail, + telephone_mobile: result_sql_select[0].telephone_mobile, + commentaire: result_sql_select[0].commentaire, + statut_paiement: result_sql_select[0].statut_paiement, + stripe_retour: result_sql_select[0].stripe_retour + } + ] + ); + logger.info("AJOUT GOOGLESHEET FIN", { numsession: req.session.id, label: filename}); + + } + + + } catch (error) { + // Echec de connection à la BD + logger.error("Il y a un problème avec wh_stripe_don : " + error, { numsession: req.session.id }); + return res.status(400).send(`Webhook Error: ${error.message}`); + } + + res.json({ received: true }); + +} + +///////////////////////////////////////////////// +// TEST WEASYPRINT +///////////////////////////////////////////////// +async function test_weasyprint(req, res, event) { + try { + const htmlFilePath = path.join(__dirname, '../pdf/template/don_wp.html'); + const htmlContent = fs.readFileSync(htmlFilePath, 'utf-8'); + const buffer = await weasyprint(htmlContent); + fs.writeFileSync("./pdf/don/output.pdf", buffer); + logger.info("PDF CREATED", { numsession: req.session.id, label: filename}); + } catch (error) { + logger.error("Il y a un problème avec WeasyPrint : " + error, { numsession: req.session.id }); + } +} + + +///////////////////////////////////////////////// +// EXPORT DE MODULE POUR QU'IL SOIT LU DANS LES AUTRES FICHIERS JS +///////////////////////////////////////////////// +module.exports = { + post_form_don, + don_accompte_reussi, + don_accompte_annule, + wh_stripe_don, + test_weasyprint +} + diff --git a/controllers/rassemblementController.js b/controllers/rassemblementController.js index b4efa35..ab01378 100644 --- a/controllers/rassemblementController.js +++ b/controllers/rassemblementController.js @@ -1,209 +1,145 @@ -///////////////////////////////////////////////// -// LOGGING -///////////////////////////////////////////////// -const logger = require("../public/js/app/logger"); -logger.info("NOUS SOMMES DANS LE FICHIER : " + __filename, { label: __filename }); - ///////////////////////////////////////////////// // APPELS DES MODULES ///////////////////////////////////////////////// - -const moment = require('moment'); -const ejs = require('ejs'); -var nodemailer = require('nodemailer'); const path = require("path"); -const stripe = require('stripe')(process.env.STRIPE_PRIVATE_KEY); -var pdf = require("pdf-creator-node"); -var fs = require("fs"); +// 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"); ///////////////////////////////////////////////// -// VARIABLES GLOBALES -///////////////////////////////////////////////// - - -///////////////////////////////////////////////// -// PAGE 1 -// http://localhost:8888/stagenational/identifier -// -// RECHERCHE SI PERSONNE DÉJA INSCRITE -// SI NON INSCRITE -// RECHERCHE SI ADHÉRENTE DANS BD AFPS -// +// 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"; + ///////////////////////////////////////////////// - // RECHERCHE SI PERSONNE DÉJA INSCRITE - // DANS BD DU STAGE ANNUEL - logger.info("======================================", { label: __filename }); - logger.info("======== FUNCTION RI_checkidentifiant ==========", { label: __filename }); - logger.info("======================================", { label: __filename }); - - await GS_rassemblementidf.useServiceAccountAuth(GS_creds_rassemblementidf); - await GS_rassemblementidf.loadInfo(); // loads document properties and worksheets - logger.info("NOM FICHIER SHEET: " + GS_rassemblementidf.title, { numsession: req.session.id, label: __filename }); - const GS_RI_sheet = GS_rassemblementidf.sheetsByTitle['inscription_web']; - logger.info("NOM DU TABLEAU (ONGLET): "+GS_RI_sheet.title, { label: __filename }); //NOM DU TABLEAU (ONGLET) - - const GS_SN_rows = await GS_RI_sheet.getRows(); - - // mettre les identifiants dans un array - let lesidentifiants = new Array; - let compteur = GS_RI_sheet.rowCount - 1; - console.log("compteur: ",compteur); - - for (let i=0; iCliquez ici'; - req.session.err_mail_form_adhesion_3 = 'Vous pouvez également adhérer à l\'association de votre pays. Vous trouverez ici les pays européens'; - res.redirect('/rassemblementidf/identifier'); - } - - // SI RIEN COCHÉ - if (typeof req.body.check_autrepays === 'undefined' && typeof req.body.check_nonadherent === 'undefined') { - - // ON VA VOIR S'IL EST DANS LA BD DES ADHÉRENTS - - // BASE DE DONNÉES DES ADHÉRENTS - // 2 SHEETS - - const GS_creds_adhe = require('../testapi336520-3105cc3caa46.json'); - const GS_adhe = new GoogleSpreadsheet('1BhpYj-KtsyC8inXIDVl-zldDYRuhEqPwBFvP45FtJkI'); - await GS_adhe.useServiceAccountAuth(GS_creds_adhe); - await GS_adhe.loadInfo(); // loads document properties and worksheets - console.log("NOM FICHIER SHEET: ",GS_adhe.title); //nom du fichier - const GS_adh_sheet = GS_adhe.sheetsByTitle['adhesion_annuelle_web']; - const GS_adh_sheet_asslocales = GS_adhe.sheetsByTitle['adhesion_ass_locales']; - const GS_adh_rows = await GS_adh_sheet.getRows(); - const GS_adh_rows_asslocales = await GS_adh_sheet_asslocales.getRows(); - - let lesidentifiants_adh = new Array; - let compteur_adh = GS_adh_sheet.rowCount - 1; - let compteur_adh_asslocales = GS_adh_sheet_asslocales.rowCount - 1; - - // RÉCUPÉRER LES IDENTIFIANTS DU TABLEAU adhesion_annuelle_web - for (let i=0; i adherent.identifiant === req.session.identifiant); - - if (adherent_resultat){ - logger.info("Identifiant trouvé dans la base des adhésions : " + adherent_resultat.identifiant, { numsession: req.session.id, label: __filename}); - logger.info("Adhésion payé : " + adherent_resultat.Adhesion_paye, { numsession: req.session.id, label: __filename}); - if (adherent_resultat.Adhesion_paye === "paye" || adherent_resultat.Adhesion_paye === "attente"){ - logger.info("Identifiant trouvé et payé dans la base des adhésions", { numsession: req.session.id, label: __filename}); - req.session.err_mail_form_adhesion_1 = "Cet identifiant est bien inscrit dans les adhésions 2022/2023."; - req.session.err_mail_form_adhesion_2 = "Nous pouvons donc procéder à l'inscription au Rassemblement IDF 2023."; - req.session.err_mail_form_adhesion_3 = "Vous allez être rediriger vers le formulaire."; - - req.session.association = adherent_resultat.association; - - console.log("NOM FICHIER SHEET: ",adherent_resultat); - console.log("adherent_resultat association : ",adherent_resultat.association); - console.log("adherent_resultat identifiant : ",adherent_resultat.identifiant); - - res.redirect('/rassemblementidf/formulaire'); - } else { - logger.info("Identifiant trouvé mais NON payé dans la base des adhésions", { numsession: req.session.id, label: __filename }); - req.session.err_mail_form_adhesion_1 = "Cet identifiant n'a pas payé l'adhésion 2022/2023."; - req.session.err_mail_form_adhesion_2 = "Vous devez adhérer avant de vous inscrire au Rassemblement IDF 2023"; - 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'); - - } - } else { - logger.info("Identifiant NON trouvé dans la base des adhésions", { numsession: req.session.id, label: __filename }); - req.session.err_mail_form_adhesion_1 = "Cet identifiant N'EST PAS inscrit dans les adhésions 2022/2023."; - req.session.err_mail_form_adhesion_2 = "Vous devez adhérer avant de vous inscrire au Rassemblement IDF 2023"; - 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'); - - } - } - - } - } else { - // IDENTIFIANT NON SAISI - req.session.err_mail_form_adhesion_1 = "Etre adhérent (et posséder un identifiant) à une association de la pédagogie Suzuki est obligatoire pour toute famille ou personne qui souhaite participer au Rassemblement IDF 2023"; - req.session.err_mail_form_adhesion_2 = 'Pour adhérer à l\'association Française pour la Pédagogie Suzuki Cliquez ici'; - req.session.err_mail_form_adhesion_3 = 'Vous pouvez également adhérer à l\'association de votre pays. Vous trouverez ici les pays européens'; + // 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'); + } + } + } - -///////////////////////////////////////////////// -// PAGE 2 -// http://localhost:8888/stagenational/formulaire -// -// RECUPERATION CHAMPS SAISIS -// CALCUL AGE -// CALCUL DU PRIX -// AFFICHER PAGE RECAP -// -///////////////////////////////////////////////// - const RI_checkinfos = async function(req, res) { logger.info("======================================"); @@ -211,602 +147,1101 @@ const RI_checkinfos = async function(req, res) { logger.info("======================================"); // RÉCUPÉRATION DES DONNÉES DU FORMULAIRE DANS LA SESSION EN COURS - req.session.association = req.body.association; - logger.info("req.session.association : " + req.session.association, { numsession: req.session.id, label: __filename }); - req.session.adherent_nom = req.body.adherent_nom; - logger.info("req.session.adherent_nom : " + req.session.adherent_nom, { numsession: req.session.id, label: __filename }); - req.session.adherent_prenom = req.body.adherent_prenom; - req.session.adherent_adresse_rue = req.body.adherent_adresse_rue; - req.session.adherent_adresse_complement = req.body.adherent_adresse_complement; - req.session.adherent_adresse_codepostal = req.body.adherent_adresse_codepostal; - req.session.adherent_adresse_ville = req.body.adherent_adresse_ville; - req.session.adherent_adresse_pays = req.body.adherent_adresse_pays; - req.session.adherent_telephone_mobile = req.body.adherent_telephone_mobile; - req.session.adherent_telephone_fixe = req.body.adherent_telephone_fixe; - req.session.adherent_mail = req.body.adherent_mail; - req.session.accompagnant_nom = req.body.accompagnant_nom; - logger.info("req.session.accompagnant_nom : " + req.session.accompagnant_nom, { numsession: req.session.id, label: __filename }); - req.session.accompagnant_prenom = req.body.accompagnant_prenom; - logger.info("req.session.accompagnant_prenom : " + req.session.accompagnant_prenom, { numsession: req.session.id, label: __filename }); - req.session.commentaire_adherent = req.body.commentaire_adherent; + 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; - logger.info("req.session.cout_rassemblement = " + req.session.cout_rassemblement, { 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 }); - var nbr_eleve = 0; + var nbr_repas = 0; for (let toto = 1; toto < 7; toto++) { - req.session["personne_"+toto+"_nom"] = req.body["personne_"+toto+"_nom"]; - logger.info('req.session["personne_"'+toto+'"_nom"] = ' + req.session["personne_"+toto+"_nom"], { numsession: req.session.id, label: __filename }); - req.session["personne_"+toto+"_prenom"] = req.body["personne_"+toto+"_prenom"]; - logger.info('req.session["personne_"'+toto+'"_prenom"] = ' + req.session["personne_"+toto+"_prenom"], { numsession: req.session.id, label: __filename }); - req.session["personne_"+toto+"_datenaissance"] = req.body["personne_"+toto+"_datenaissance"]; - logger.info('req.session["personne_"'+toto+'"_datenaissance"] = ' + req.session["personne_"+toto+"_datenaissance"], { numsession: req.session.id, label: __filename }); + 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"]; } - req.session["personne_"+toto+"_instrument"] = req.body["personne_"+toto+"_instrument"]; - logger.info('req.session["personne_"'+toto+'"_instrument"] = ' + req.session["personne_"+toto+"_instrument"], { numsession: req.session.id, label: __filename }); - req.session["personne_"+toto+"_cahier"] = req.body["personne_"+toto+"_cahier"]; - logger.info('req.session["personne_"'+toto+'"_cahier"] = ' + req.session["personne_"+toto+"_cahier"], { numsession: req.session.id, label: __filename }); - req.session["personne_"+toto+"_piece"] = req.body["personne_"+toto+"_piece"]; - logger.info('req.session["personne_"'+toto+'"_piece"] = ' + req.session["personne_"+toto+"_piece"], { numsession: req.session.id, label: __filename }); - req.session["personne_"+toto+"_prof"] = req.body["personne_"+toto+"_prof"]; - logger.info('req.session["personne_"'+toto+'"_prof"] = ' + req.session["personne_"+toto+"_prof"], { numsession: req.session.id, label: __filename }); + 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"]) { - logger.info('req.session["personne_"'+toto+'"_datenaissance"] : ' + req.session["personne_"+toto+"_datenaissance"], { numsession: req.session.id, label: __filename }); let datenaissance_concat = req.session["personne_"+toto+"_datenaissance"]; - logger.info("datenaissance_concat : " + datenaissance_concat, { numsession: req.session.id, label: __filename }); 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('2023-05-07'); - logger.info("birthDate : " + birthDate, { numsession: req.session.id, label: __filename }); - logger.info("debutrassemblement : " + debutrassemblement, { numsession: req.session.id, label: __filename }); - + var debutrassemblement = new Date('2026-04-19'); var age = debutrassemblement.getFullYear() - birthDate.getFullYear(); - logger.info("age : " + age, { numsession: req.session.id, label: __filename }); var m = debutrassemblement.getMonth() - birthDate.getMonth(); if (m < 0 || (m === 0 && debutrassemblement.getDate() < birthDate.getDate())) { - logger.info("debutrassemblement.getDate() = " + debutrassemblement.getDate(), { numsession: req.session.id, label: __filename }); - age--; + 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 }); - + logger.info('req.session["personne_"+toto+"_age"] = ' + req.session["personne_"+toto+"_age"], { numsession: req.session.id, label: filename }); //// +1 nombre d'élève - nbr_eleve++; - logger.info('nbr_eleve dans boucle date de naissance : ' + nbr_eleve, { numsession: req.session.id, label: __filename }); + 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 }); + logger.info('nbr_eleve TOTAL : ' + nbr_eleve, { numsession: req.session.id, label: filename }); if (nbr_eleve == 1){ req.session.cout_rassemblement = 31; - req.session.accompte_frais_bancaire = 1; - req.session.cout_total += req.session.cout_rassemblement + req.session.accompte_frais_bancaire; + req.session.cout_total += req.session.cout_rassemblement; }; if (nbr_eleve > 1){ req.session.cout_rassemblement = 51; - req.session.accompte_frais_bancaire = 1; - req.session.cout_total += req.session.cout_rassemblement + req.session.accompte_frais_bancaire; + req.session.cout_total += req.session.cout_rassemblement; } - if (nbr_eleve < 1){ - req.session.err_nbr_eleve = "Vous n'avez pas inscrit d'élève"; - logger.info('req.session.err_nbr_eleve : ' + req.session.err_nbr_eleve, { numsession: req.session.id, label: __filename }); + if (nbr_repas > 0) { + req.session.cout_repas = 8*nbr_repas; + req.session.cout_total += req.session.cout_repas; } - - if (req.session.err_nbr_eleve) { - logger.info("existing session_err_nbr_eleve : " + req.session.err_nbr_eleve, { numsession: req.session.id }); - res.redirect('/rassemblementidf/formulaire'); - } else { - logger.info('req.session.cout_rassemblement : ' + req.session.cout_rassemblement, { 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'); - } - + 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'); + + } -///////////////////////////////////////////////// -// PAGE 3 -// http://localhost:8888/stagenational/recap -// -// Bouton modifier -// -///////////////////////////////////////////////// - -// CLICK SUR BOUTON MODIFIER const post_recap_modifier = async function(req, res) { res.redirect('/rassemblementidf/identifier'); } - - -///////////////////////////////////////////////// -// PAYER ACCOMPTE -// -// Enregistrement des infos dans la Google Sheet avant le paiement -// (car le redirect après le paiement vers la page "réussi" ou "annulé" initialise une autre session qui fait perdre le cookie précédent et les infos saisies) -// Payer accompte par carte bancaire -// STIPE -// -///////////////////////////////////////////////// - -// CLICK SUR BOUTON PAYER ACCOMPTE PAGE RECAP -const post_payer_ri = async function(req, res, next) { - +const post_payer_ri = async function(req, res) { logger.info("======================================"); logger.info("======== FUNCTION post_payer_ri =========="); logger.info("======================================"); - - ////////////////////////////////// - // AJOUT INFO DANS LA GOOGLE SHEET - - - await GS_rassemblementidf.useServiceAccountAuth(GS_creds_rassemblementidf); - await GS_rassemblementidf.loadInfo(); // loads document properties and worksheets - logger.info("NOM FICHIER SHEET : " + GS_rassemblementidf.title, { numsession: req.session.id, label: __filename }); - const GS_RI_sheet = GS_rassemblementidf.sheetsByTitle['inscription_web']; - logger.info("NOM DU TABLEAU (ONGLET): " + GS_RI_sheet.title, { numsession: req.session.id, label: __filename }); - - // DATE DE L'INSCRIPTION - moment().format(); + // VARIABLES + ///////////////////////////////////////////////// + let saison = process.env.SAISON; moment.locale('fr'); - var date_formattee = moment().format('L') - console.log("date_formattee:", date_formattee); + let now = moment().format("YYYY-MM-DD HH:mm:ss"); + let sql; + let table; + let champs; + let values; - // AJOUTER UNE LIGNE DANS LA GOOGLE SHEET - logger.info("/ AJOUTER UNE LIGNE DANS LA GOOGLE SHEET", { numsession: req.session.id, label: __filename }); - logger.info("req.session.identifiant : " + req.session.identifiant, { numsession: req.session.id, label: __filename }); - logger.info("req.session.adherent_nom : " + req.session.adherent_nom, { numsession: req.session.id, label: __filename }); - const moreRows = await GS_RI_sheet.addRows([ - { - 'saison': "2022/2023", - 'identifiant': req.session.identifiant, - 'association_suzuki': req.session.association, - 'status_inscription': "clic_bouton_payer", - 'inscription_date': date_formattee, - 'adherent_nom': req.session.adherent_nom, - 'adherent_prenom': req.session.adherent_prenom, - 'cout_total': req.session.cout_total, - 'cout_rassemblement': req.session.cout_rassemblement, - 'frais_bancaire': req.session.accompte_frais_bancaire, - 'adherent_adresse_rue': req.session.adherent_adresse_rue, - 'adherent_adresse_complement': req.session.adherent_adresse_complement, - 'adherent_adresse_codepostal': req.session.adherent_adresse_codepostal, - 'adherent_adresse_ville': req.session.adherent_adresse_ville, - 'adherent_adresse_pays': req.session.adherent_adresse_pays, - 'adherent_telephone_fixe': req.session.adherent_telephone_fixe, - 'adherent_telephone_mobile': req.session.adherent_telephone_mobile, - 'adherent_mail': req.session.adherent_mail, - 'accompagnant_nom': req.session.accompagnant_nom, - 'accompagnant_prenom': req.session.accompagnant_prenom, - 'commentaire_adherent': req.session.commentaire_adherent, + ///////////////////////////////////////////////// + // 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 { - 'personne_1_nom': req.session.personne_1_nom, - 'personne_1_prenom': req.session.personne_1_prenom, - 'personne_1_datenaissance': req.session.personne_1_datenaissance, - 'personne_1_age': req.session.personne_1_age, - 'personne_1_instrument': req.session.personne_1_instrument, - 'personne_1_cahier': req.session.personne_1_cahier, - 'personne_1_piece': req.session.personne_1_piece, - 'personne_1_prof': req.session.personne_1_prof, + ///////////////////////////////////////////////// + // 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;}; - 'personne_2_nom': req.session.personne_2_nom, - 'personne_2_prenom': req.session.personne_2_prenom, - 'personne_2_datenaissance': req.session.personne_2_datenaissance, - 'personne_2_age': req.session.personne_2_age, - 'personne_2_instrument': req.session.personne_2_instrument, - 'personne_2_cahier': req.session.personne_2_cahier, - 'personne_2_piece': req.session.personne_2_piece, - 'personne_2_prof': req.session.personne_2_prof, + ///////////////////////////////////////////////// + // AJOUT DANS LA BASE DE DONNÉES - 'personne_3_nom': req.session.personne_3_nom, - 'personne_3_prenom': req.session.personne_3_prenom, - 'personne_3_datenaissance': req.session.personne_3_datenaissance, - 'personne_3_age': req.session.personne_3_age, - 'personne_3_instrument': req.session.personne_3_instrument, - 'personne_3_cahier': req.session.personne_3_cahier, - 'personne_3_piece': req.session.personne_3_piece, - 'personne_3_prof': req.session.personne_3_prof, + // TRY 3 + try { + //Connexion + let db_connection_promise = await connect_DB_promise(); - 'personne_4_nom': req.session.personne_4_nom, - 'personne_4_prenom': req.session.personne_4_prenom, - 'personne_4_datenaissance': req.session.personne_4_datenaissance, - 'personne_4_age': req.session.personne_4_age, - 'personne_4_instrument': req.session.personne_4_instrument, - 'personne_4_cahier': req.session.personne_4_cahier, - 'personne_4_piece': req.session.personne_4_piece, - 'personne_4_prof': req.session.personne_4_prof, + ///////////////////////////////////////////////// + // AJOUT PARTICIPANTS + for (let toto = 1; toto < 7; toto++) { + if (req.session["personne_"+toto+"_nom"]) { - 'personne_5_nom': req.session.personne_5_nom, - 'personne_5_prenom': req.session.personne_5_prenom, - 'personne_5_datenaissance': req.session.personne_5_datenaissance, - 'personne_5_age': req.session.personne_5_age, - 'personne_5_instrument': req.session.personne_5_instrument, - 'personne_5_cahier': req.session.personne_5_cahier, - 'personne_5_piece': req.session.personne_5_piece, - 'personne_5_prof': req.session.personne_5_prof, + // 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}); + } + } - 'personne_6_nom': req.session.personne_6_nom, - 'personne_6_prenom': req.session.personne_6_prenom, - 'personne_6_datenaissance': req.session.personne_6_datenaissance, - 'personne_6_age': req.session.personne_6_age, - 'personne_6_instrument': req.session.personne_6_instrument, - 'personne_6_cahier': req.session.personne_6_cahier, - 'personne_6_piece': req.session.personne_6_piece, - 'personne_6_prof': req.session.personne_6_prof, + ///////////////////////////////////////////////// + // 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) + } - ////////////////////////////////// - // PAIEMENT STRIPE + } 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'); + } + } - - // STRIPE - ETAPE 1 - CREER l'INTENTION DE PAIEMENT - logger.info("// STRIPE - ETAPE 1 - CREER l'INTENTION DE PAIEMENT", { numsession: req.session.id, label: __filename }); - logger.info("stripe.VERSION = " + stripe.VERSION, { numsession: req.session.id, label: __filename }); - logger.info("stripe._api = " + stripe._api, { numsession: req.session.id, label: __filename }); - //console.log(stripe); - logger.info("req.session.adherent_mail = " + req.session.adherent_mail, { numsession: req.session.id, label: __filename }); - logger.info("// STRIPE - AJOUT METADATA", { numsession: req.session.id, label: __filename }); - logger.info("req.session.identifiant = " + req.session.identifiant, { numsession: req.session.id, label: __filename }); - logger.info("req.session.cout_rassemblement = " + req.session.cout_rassemblement, { 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("STRIPE_RI_SUCCESSURL = " + process.env.STRIPE_RI_SUCCESSURL, { numsession: req.session.id, label: __filename }); - logger.info("STRIPE_RI_CANCELURL = " + process.env.STRIPE_RI_CANCELURL, { numsession: req.session.id, label: __filename }); - logger.info("req.session.cout_total = " + req.session.cout_total, { numsession: req.session.id, 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, - //There are four different submit types. - submit_type: 'pay', - //success_url: 'http://localhost:8888/inscription/adhesion_paiement/reussi?id={CHECKOUT_SESSION_ID}', - //cancel_url: 'http://localhost:8888/inscription/adhesion_paiement/annule?id={CHECKOUT_SESSION_ID}', - //success_url: 'https://www.adusuki.juliechaumard.paris/inscription/adhesion_paiement/reussi?id={CHECKOUT_SESSION_ID}', - //cancel_url: 'https://www.adusuki.juliechaumard.paris/inscription/adhesion_paiement/annule?id={CHECKOUT_SESSION_ID}', - //success_url: 'https://www.adhesion.afpedagogiesuzuki.fr/inscription/adhesion_paiement/reussi?id={CHECKOUT_SESSION_ID}', - //cancel_url: 'https://www.adhesion.afpedagogiesuzuki.fr/inscription/adhesion_paiement/annule?id={CHECKOUT_SESSION_ID}', - 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' - - }); - - logger.info("session: " + session, { numsession: req.session.id, label: __filename }); - logger.info("session.id: " + session.id, { numsession: req.session.id, label: __filename }); - logger.info("session.url: " + session.url, { numsession: req.session.id, label: __filename }); - let url_stripe = session.url - res.redirect(session.url) - } +const RI_accompte_reussi = async function(req, res) { -///////////////////////////////////////////////// -// RETOUR PAIEMENT REUSSI -const RI_accompte_reussi = async function(req, res){ + logger.info("======================================", { label: filename }); + logger.info("======== FUNCTION RI_accompte_reussi ==========", { label: filename }); + logger.info("======================================", { label: filename }); - logger.info("======================================"); - logger.info("======== FUNCTION RI_accompte_reussi =========="); - logger.info("======================================"); + // VARIABLES + let CB_retour; + let stripe_retour; + // DATE + moment().format(); + moment.locale('fr'); + + ////////////////////////////////////////////////////////////////////////////// // RETOUR STRIPE - var id = req.query.id; - - logger.info("id : " + id, { numsession: req.session.id, label: __filename }); - + let id = req.query.id; const session_stripe = await stripe.checkout.sessions.retrieve(id); - - var customer_email = session_stripe.customer_email; - var payment_status = session_stripe.payment_status; - var amount_total = session_stripe.amount_total/100; - var stripe_customer = session_stripe.customer; - var stripe_payment_intent = session_stripe.payment_intent; - var payment_method_types = session_stripe.payment_method_types; - var stripe_status = session_stripe.status; - var identifiant = session_stripe.metadata.identifiant; - var cout_rassemblement = session_stripe.metadata.cout_rassemblement; - var accompte_frais_bancaire = session_stripe.metadata.accompte_frais_bancaire; - var CB_retour = "identifiant_adherent:"+identifiant+",payment_status:"+payment_status+",stripe_customer:"+stripe_customer+",stripe_payment_intent:"+stripe_payment_intent+",sessionID:"+session_stripe.id+",payment_method_types:"+payment_method_types+",amount_total:"+amount_total+",stripe_status:"+stripe_status; - - - console.log("customer_email: ", customer_email); - logger.info("payment_status : " + payment_status, { numsession: req.session.id, label: __filename }); - logger.info("cout_rassemblement : " + cout_rassemblement, { numsession: req.session.id, label: __filename }); - logger.info("accompte_frais_bancaire : " + accompte_frais_bancaire, { numsession: req.session.id, label: __filename }); - console.log("stripe_customer: ", stripe_customer); - console.log("amount_total: ", amount_total); - console.log("stripe_payment_intent: ", stripe_payment_intent); - console.log("payment_method_types: ", payment_method_types); - console.log("payment_method_types: ", payment_method_types[0]); - console.log("stripe_status: ", stripe_status); - console.log("CB_retour: ", CB_retour); - - + 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}); ////////////////////////////////////////////////////////////////////////////// - // RÉCUPÉRATION DES INFOS STAGIAIRES DANS LA GOOGLE SHEET - // MISE À JOUR DES INFORMATIONS SUR LE PAIEMENT DANS LA BASE DE DONNÉES GSHEET + // MAJ infos paiements DB + ///////////////////////////////////////////////// - - await GS_rassemblementidf.useServiceAccountAuth(GS_creds_rassemblementidf); - await GS_rassemblementidf.loadInfo(); // loads document properties and worksheets - logger.info("NOM FICHIER SHEET: " + GS_rassemblementidf.title, { numsession: req.session.id, label: __filename }); - const GS_RI_sheet = GS_rassemblementidf.sheetsByTitle['inscription_web']; - logger.info("NOM DU TABLEAU (ONGLET): " + GS_RI_sheet.title, { numsession: req.session.id, label: __filename }); + // 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}); - // on récupère le contenu de la GSheet dans un array nommé "infos_adherents" - const infos_adherents = await GS_RI_sheet.getRows(); - // on récupère quelle ligne contient l'identifiant concerné pour mettre à jour cette ligne - let list_identifiants = new Array; - let compteur = GS_RI_sheet.rowCount - 1; - let rowToBeUpdate; - logger.info("identifiant TRANSMIS PAR STRIPE :" + identifiant, { numsession: req.session.id, label: __filename }); - for (let i=0; i 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);} - // MISE À JOUR DES INFORMATIONS SUR LE PAIEMENT DANS LA BASE DE DONNÉES GSHEET - logger.info("rowToBeUpdate :" + rowToBeUpdate, { numsession: req.session.id, label: __filename }); - infos_adherents[rowToBeUpdate].inscription_paye = 'paye'; - infos_adherents[rowToBeUpdate].status_inscription = 'CB_OK'; - infos_adherents[rowToBeUpdate].inscription_paiement_mode = payment_method_types[0]; - infos_adherents[rowToBeUpdate].inscription_paiement_CB_retour = CB_retour; - infos_adherents[rowToBeUpdate].inscription_paiement_date = date_formattee; + logger.info("AJOUT GOOGLESHEET FIN", { numsession: req.session.id, label: filename}); - await infos_adherents[rowToBeUpdate].save(); // save updates - + } 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'); + } - ////////////////////////////////////////////////////////////////////////////// - // CONFIRMATION PAR MAIL + ////////////////////////////////////////////////////////////////////////////// + // ENVOIE CONFIRMATION PAR MAIL - logger.info("MAIL ENVOI AVANT", { numsession: req.session.id, label: __filename }); - var transporter = nodemailer.createTransport({ - service: 'gmail', - auth: { - // TEST JULIE - //user: 'juliechaumard@gmail.com', - //pass: 'etfq umof iwbx ltxk' - // SUZUKI - user: 'afps.inscription@gmail.com', - pass: 'vljxrkhwgljjracs' - } - }); - var mail_objet = "ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI - RASSEMBLEMENT IDF 2023 - "; - mail_objet += infos_adherents[rowToBeUpdate].adherent_nom; - mail_html = "

Cher adhérent,

Félicitations ! Vous êtes désormais inscrit au rassemblement Ile de France du 7 mai 2023 organisé par l’association La clef du bonheur et l’école de musique de Chambourcy, en partenariat avec l'Association Française pour la Pédagogie Suzuki.

"; - mail_html += "
"; - mail_html += "

RÉCAPITULATIF :

"; - mail_html += "

Identifiant Suzuki : "; - mail_html += identifiant; - mail_html += "

Association Suzuki : "; - mail_html += infos_adherents[rowToBeUpdate].association_suzuki; - mail_html += "

Accompagnant : "; - mail_html += infos_adherents[rowToBeUpdate].accompagnant_prenom; - mail_html += " "; - mail_html += infos_adherents[rowToBeUpdate].accompagnant_nom; - mail_html += "


"; - for (let toto = 1; toto<7; toto++) { - if (infos_adherents[rowToBeUpdate]["personne_"+toto+"_nom"]) { - mail_html += "

Nom : "; - mail_html += infos_adherents[rowToBeUpdate]["personne_"+toto+"_nom"]; - mail_html += " "; - mail_html += infos_adherents[rowToBeUpdate]["personne_"+toto+"_prenom"]; - mail_html += "

Profile âge : "; - mail_html += infos_adherents[rowToBeUpdate]["personne_"+toto+"_datenaissance"]; - mail_html += "

"; - if (infos_adherents[rowToBeUpdate]["personne_"+toto+"_instrument"]) { - mail_html += "

Instrument : "; - mail_html += infos_adherents[rowToBeUpdate]["personne_"+toto+"_instrument"]; - mail_html += " "; - mail_html += infos_adherents[rowToBeUpdate]["personne_"+toto+"_cahier"]; - mail_html += " "; - mail_html += infos_adherents[rowToBeUpdate]["personne_"+toto+"_piece"]; - mail_html += " "; - mail_html += infos_adherents[rowToBeUpdate]["personne_"+toto+"_prof"]; + 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 (infos_adherents[rowToBeUpdate]["personne_"+toto+"_activite_1"]) { - mail_html += "

Activité : "; - mail_html += infos_adherents[rowToBeUpdate]["personne_"+toto+"_activite_1"]; - mail_html += " "; - mail_html += infos_adherents[rowToBeUpdate]["personne_"+toto+"_activite_2"]; + 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'); } - mail_html += "
"; - } + } - mail_html += "
"; - mail_html += "

Tarif rassemblement : "; - mail_html += infos_adherents[rowToBeUpdate].cout_rassemblement; - mail_html += "€

Frais bancaire : "; - mail_html += infos_adherents[rowToBeUpdate].frais_bancaire; - mail_html += "€

Montant total : "; - mail_html += infos_adherents[rowToBeUpdate].cout_total; - mail_html += "€

"; - - mail_html += "


Nous vous remercions pour votre intérêt et vous souhaitons une très bon rassemblement !

L’Association La clef du bonheur et l’école de musique de Chambourcy
Marie VELU
Pôle organisation du rassemblement

"; - var mailOptions = { - from: 'afps.inscription@gmail.com', - to: customer_email, - subject: mail_objet, - html: mail_html, - }; - transporter.sendMail(mailOptions, function(error, info){ - if (error) { - logger.info("error : " + error, { numsession: req.session.id}); - } else { - logger.info("Email sent: " + info.response, { numsession: req.session.id}); - } - }); - logger.info("MAIL ENVOI APRES", { numsession: req.session.id, label: __filename }); - - - // REDIRECTION VERS LA PAGE DE CONFIRMATION PAIEMENT CARTE BANCAIRE - res.locals.identifiant = infos_adherents[rowToBeUpdate].identifiant; - res.locals.association = infos_adherents[rowToBeUpdate].association_suzuki; - res.locals.adherent_nom = infos_adherents[rowToBeUpdate].adherent_nom; - res.locals.adherent_prenom = infos_adherents[rowToBeUpdate].adherent_prenom; - res.locals.adherent_adresse_rue = infos_adherents[rowToBeUpdate].adherent_adresse_rue; - res.locals.adherent_adresse_complement = infos_adherents[rowToBeUpdate].adherent_adresse_complement; - res.locals.adherent_adresse_codepostal = infos_adherents[rowToBeUpdate].adherent_adresse_codepostal; - res.locals.adherent_adresse_ville = infos_adherents[rowToBeUpdate].adherent_adresse_ville; - res.locals.adherent_adresse_pays = infos_adherents[rowToBeUpdate].adherent_adresse_pays; - res.locals.adherent_telephone_mobile = infos_adherents[rowToBeUpdate].adherent_telephone_mobile; - res.locals.adherent_telephone_fixe = infos_adherents[rowToBeUpdate].adherent_telephone_fixe; - res.locals.adherent_mail = infos_adherents[rowToBeUpdate].adherent_mail; - res.locals.accompagnant_prenom = infos_adherents[rowToBeUpdate].accompagnant_prenom; - res.locals.accompagnant_nom = infos_adherents[rowToBeUpdate].accompagnant_nom; - res.locals.commentaire_adherent = infos_adherents[rowToBeUpdate].commentaire_adherent; - - - for (let toto = 1; toto < 7; toto++) { - res.locals["personne_"+toto+"_numero"] = toto; - res.locals["personne_"+toto+"_nom"] = infos_adherents[rowToBeUpdate]["personne_"+toto+"_nom"]; - res.locals["personne_"+toto+"_prenom"] = infos_adherents[rowToBeUpdate]["personne_"+toto+"_prenom"]; - res.locals["personne_"+toto+"_datenaissance"] = infos_adherents[rowToBeUpdate]["personne_"+toto+"_datenaissance"]; - res.locals["personne_"+toto+"_instrument"] = infos_adherents[rowToBeUpdate]["personne_"+toto+"_instrument"]; - res.locals["personne_"+toto+"_cahier"] = infos_adherents[rowToBeUpdate]["personne_"+toto+"_cahier"]; - res.locals["personne_"+toto+"_option_coursindividuel"] = infos_adherents[rowToBeUpdate]["personne_"+toto+"_piece"]; - res.locals["personne_"+toto+"_option_concertsolo"] = infos_adherents[rowToBeUpdate]["personne_"+toto+"_prof"]; - } - res.locals.cout_rassemblement = infos_adherents[rowToBeUpdate].cout_rassemblement; - res.locals.frais_bancaire = infos_adherents[rowToBeUpdate].frais_bancaire; - res.locals.cout_total = infos_adherents[rowToBeUpdate].cout_total; - - if (!infos_adherents[rowToBeUpdate].identifiant) { - res.locals.error = "Il y a eu une erreur lors de l'ajout de votre inscription dans la base de données du stage, veuillez contacter l'association."; - } - - res.render('rassemblementidf/page_templates/paiement_reussi.ejs'); } - -///////////////////////////////////////////////// -// RETOUR PAIEMENT ECHOUE -// CLICK SUR BOUTON RECOMMENCER const RI_accompte_annule = async function(req, res) { - - logger.info("======================================"); logger.info("======== FUNCTION RI_accompte_annule =========="); logger.info("======================================"); - // RETOUR STRIPE - var id = req.query.id; + // VARIABLES + let CB_retour; + let stripe_retour; - logger.info("id : " + id, { numsession: req.session.id, label: __filename }); - - const session_stripe = await stripe.checkout.sessions.retrieve(id); - - var customer_email = session_stripe.customer_email; - var payment_status = session_stripe.payment_status; - var amount_total = session_stripe.amount_total/100; - var stripe_customer = session_stripe.customer; - var stripe_payment_intent = session_stripe.payment_intent; - var payment_method_types = session_stripe.payment_method_types; - var stripe_status = session_stripe.status; - var identifiant = session_stripe.metadata.identifiant; - var CB_retour = "identifiant_adherent:"+identifiant+",payment_status:"+payment_status+",stripe_customer:"+stripe_customer+",stripe_payment_intent:"+stripe_payment_intent+",sessionID:"+session_stripe.id+",payment_method_types:"+payment_method_types+",amount_total:"+amount_total+",stripe_status:"+stripe_status; - logger.info("cookiesessionid APRES Stripe :" + session_stripe.metadata.cookiesessionid, { numsession: req.session.id, label: __filename }); - var cookiesessionid = session_stripe.metadata.cookiesessionid; - - logger.info("payment_status : " + payment_status, { numsession: req.session.id, label: __filename }); - + // DATE + moment().format(); + moment.locale('fr'); ////////////////////////////////////////////////////////////////////////////// - // RÉCUPÉRATION DES INFOS STAGIAIRES DANS LA GOOGLE SHEET - // ANNULATION DE L'INSCRIT DANS LA BASE DE DONNÉES GSHEET - // GSHEET "identifiant" = ANNULE / "paye" = echec + // 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}); - - await GS_rassemblementidf.useServiceAccountAuth(GS_creds_rassemblementidf); - await GS_rassemblementidf.loadInfo(); // loads document properties and worksheets - logger.info("NOM FICHIER SHEET: " + GS_rassemblementidf.title, { numsession: req.session.id, label: __filename }); - const GS_RI_sheet = GS_rassemblementidf.sheetsByTitle['inscription_web']; - logger.info("NOM DU TABLEAU (ONGLET): " + GS_RI_sheet.title, { numsession: req.session.id, label: __filename }); + try { + //Connexion + let db_connection_promise = await connect_DB_promise(); - // on récupère le contenu de la GSheet dans un array nommé "infos_adherents" - const infos_adherents = await GS_RI_sheet.getRows(); - // on récupère quelle ligne contient l'identifiant concerné pour mettre à jour cette ligne - let list_identifiants = new Array; - let compteur = GS_RI_sheet.rowCount - 1; - let rowToBeUpdate; - logger.info("identifiant TRANSMIS PAR STRIPE :" + identifiant, { numsession: req.session.id, label: __filename }); - for (let i=0; i 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 @@ -818,5 +1253,6 @@ module.exports = { post_recap_modifier, post_payer_ri, RI_accompte_reussi, - RI_accompte_annule + RI_accompte_annule, + RI_post_valid_ss_paiement } \ No newline at end of file diff --git a/controllers/rassemblementController_OLD.js b/controllers/rassemblementController_OLD.js new file mode 100644 index 0000000..7a87d16 --- /dev/null +++ b/controllers/rassemblementController_OLD.js @@ -0,0 +1,847 @@ +///////////////////////////////////////////////// +// LOGGING +///////////////////////////////////////////////// +const logger = require("../public/js/app/logger"); + +///////////////////////////////////////////////// +// APPELS DES MODULES +///////////////////////////////////////////////// + +const moment = require('moment'); +const ejs = require('ejs'); +var nodemailer = require('nodemailer'); +const path = require("path"); +const stripe = require('stripe')(process.env.STRIPE_RI_PRIVATE_KEY); +var pdf = require("pdf-creator-node"); +var fs = require("fs"); + +//////////////////////////////////////////////////// +// 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'); + + +///////////////////////////////////////////////// +// VARIABLES GLOBALES +///////////////////////////////////////////////// + + +///////////////////////////////////////////////// +// PAGE 1 +// DOAMIN/stagenational/identifier +// +// RECHERCHE SI PERSONNE DÉJA INSCRITE +// SI NON INSCRITE +// RECHERCHE SI ADHÉRENTE DANS BD AFPS +// +///////////////////////////////////////////////// + +const RI_checkidentifiant = async function(req, res) { + + ///////////////////////////////////////////////// + // RECHERCHE SI PERSONNE DÉJA INSCRITE + // DANS BD DU STAGE ANNUEL + logger.info("======================================", { label: filename }); + logger.info("======== FUNCTION RI_checkidentifiant ==========", { label: filename }); + logger.info("======================================", { label: filename }); + + await GS_rassemblementidf.useServiceAccountAuth(GS_creds_rassemblementidf); + await GS_rassemblementidf.loadInfo(); // loads document properties and worksheets + logger.info("NOM FICHIER SHEET: " + GS_rassemblementidf.title, { numsession: req.session.id, label: filename }); + const GS_RI_sheet = GS_rassemblementidf.sheetsByTitle['inscription_web']; + logger.info("NOM DU TABLEAU (ONGLET): "+GS_RI_sheet.title, { label: filename }); //NOM DU TABLEAU (ONGLET) + + const GS_SN_rows = await GS_RI_sheet.getRows(); + + // mettre les identifiants dans un array + let lesidentifiants = new Array; + let compteur = GS_RI_sheet.rowCount - 1; + console.log("compteur: ",compteur); + + for (let i=0; iCliquez ici'; + req.session.err_mail_form_adhesion_3 = 'Vous pouvez également adhérer à l\'association de votre pays. Vous trouverez ici les pays européens'; + res.redirect('/rassemblementidf/identifier'); + } + + // SI RIEN COCHÉ + if (typeof req.body.check_autrepays === 'undefined' && typeof req.body.check_nonadherent === 'undefined') { + + // ON VA VOIR S'IL EST DANS LA BD DES ADHÉRENTS + + // BASE DE DONNÉES DES ADHÉRENTS + // 2 SHEETS + + const GS_creds_adhe = require('../testapi336520-3105cc3caa46.json'); + const GS_adhe = new GoogleSpreadsheet('1BhpYj-KtsyC8inXIDVl-zldDYRuhEqPwBFvP45FtJkI'); + await GS_adhe.useServiceAccountAuth(GS_creds_adhe); + await GS_adhe.loadInfo(); // loads document properties and worksheets + console.log("NOM FICHIER SHEET: ",GS_adhe.title); //nom du fichier + const GS_adh_sheet = GS_adhe.sheetsByTitle['adhesion_annuelle_web']; + const GS_adh_sheet_asslocales = GS_adhe.sheetsByTitle['adhesion_ass_locales']; + const GS_adh_rows = await GS_adh_sheet.getRows(); + const GS_adh_rows_asslocales = await GS_adh_sheet_asslocales.getRows(); + + let lesidentifiants_adh = new Array; + let compteur_adh = GS_adh_sheet.rowCount - 1; + let compteur_adh_asslocales = GS_adh_sheet_asslocales.rowCount - 1; + + // RÉCUPÉRER LES IDENTIFIANTS DU TABLEAU adhesion_annuelle_web + for (let i=0; i adherent.identifiant === req.session.identifiant); + + if (adherent_resultat){ + logger.info("Identifiant trouvé dans la base des adhésions : " + adherent_resultat.identifiant, { numsession: req.session.id, label: filename}); + logger.info("Adhésion payé : " + adherent_resultat.Adhesion_paye, { numsession: req.session.id, label: filename}); + if (adherent_resultat.Adhesion_paye === "paye" || adherent_resultat.Adhesion_paye === "attente"){ + logger.info("Identifiant trouvé et payé dans la base des adhésions", { numsession: req.session.id, label: filename}); + req.session.err_mail_form_adhesion_1 = "Cet identifiant est bien inscrit dans les adhésions 2023/2024."; + req.session.err_mail_form_adhesion_2 = "Nous pouvons donc procéder à l'inscription au Rassemblement IDF 2024."; + req.session.err_mail_form_adhesion_3 = "Vous allez être redirigé vers le formulaire."; + + req.session.association = adherent_resultat.association; + + console.log("NOM FICHIER SHEET: ",adherent_resultat); + console.log("adherent_resultat association : ",adherent_resultat.association); + console.log("adherent_resultat identifiant : ",adherent_resultat.identifiant); + + res.redirect('/rassemblementidf/formulaire'); + } else { + logger.info("Identifiant trouvé mais NON payé dans la base des adhésions", { numsession: req.session.id, label: filename }); + req.session.err_mail_form_adhesion_1 = "Cet identifiant n'a pas payé l'adhésion 2023/2024."; + req.session.err_mail_form_adhesion_2 = "Vous devez adhérer avant de vous inscrire au Rassemblement IDF 2024"; + 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'); + + } + } else { + logger.info("Identifiant NON trouvé dans la base des adhésions", { numsession: req.session.id, label: filename }); + req.session.err_mail_form_adhesion_1 = "Cet identifiant N'EST PAS inscrit dans les adhésions 2023/2024."; + req.session.err_mail_form_adhesion_2 = "Vous devez adhérer avant de vous inscrire au Rassemblement IDF 2024"; + 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'); + + } + } + + } + } else { + // IDENTIFIANT NON SAISI + req.session.err_mail_form_adhesion_1 = "Etre adhérent (et posséder un identifiant) à une association de la pédagogie Suzuki est obligatoire pour toute famille ou personne qui souhaite participer au Rassemblement IDF 2023"; + req.session.err_mail_form_adhesion_2 = 'Pour adhérer à l\'association Française pour la Pédagogie Suzuki Cliquez ici'; + req.session.err_mail_form_adhesion_3 = 'Vous pouvez également adhérer à l\'association de votre pays. Vous trouverez ici les pays européens'; + res.redirect('/rassemblementidf/identifier'); + } + +} + + +///////////////////////////////////////////////// +// PAGE 2 +// DOMAIN/stagenational/formulaire +// +// RECUPERATION CHAMPS SAISIS +// CALCUL AGE +// CALCUL DU PRIX +// AFFICHER PAGE RECAP +// +///////////////////////////////////////////////// + +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 + req.session.association = req.body.association; + logger.info("req.session.association : " + req.session.association, { numsession: req.session.id, label: filename }); + req.session.adherent_nom = req.body.adherent_nom; + logger.info("req.session.adherent_nom : " + req.session.adherent_nom, { numsession: req.session.id, label: filename }); + req.session.adherent_prenom = req.body.adherent_prenom; + req.session.adherent_adresse_rue = req.body.adherent_adresse_rue; + req.session.adherent_adresse_complement = req.body.adherent_adresse_complement; + req.session.adherent_adresse_codepostal = req.body.adherent_adresse_codepostal; + req.session.adherent_adresse_ville = req.body.adherent_adresse_ville; + req.session.adherent_adresse_pays = req.body.adherent_adresse_pays; + req.session.adherent_telephone_mobile = req.body.adherent_telephone_mobile; + req.session.adherent_telephone_fixe = req.body.adherent_telephone_fixe; + req.session.adherent_mail = req.body.adherent_mail; + req.session.bus_nb = req.body.bus_nb; + req.session.accompagnant_nom = req.body.accompagnant_nom; + logger.info("req.session.accompagnant_nom : " + req.session.accompagnant_nom, { numsession: req.session.id, label: filename }); + req.session.accompagnant_prenom = req.body.accompagnant_prenom; + logger.info("req.session.accompagnant_prenom : " + req.session.accompagnant_prenom, { numsession: req.session.id, label: filename }); + req.session.commentaire_adherent = req.body.commentaire_adherent; + + //// INITIALISATION DES MONTANTS PAR FAMILLE + req.session.cout_rassemblement = 0; + req.session.accompte_frais_bancaire = 0; + req.session.cout_total = 0; + logger.info("req.session.cout_rassemblement = " + req.session.cout_rassemblement, { 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 }); + + var nbr_eleve = 0; + + for (let toto = 1; toto < 7; toto++) { + req.session["personne_"+toto+"_nom"] = req.body["personne_"+toto+"_nom"]; + logger.info('req.session["personne_"'+toto+'"_nom"] = ' + req.session["personne_"+toto+"_nom"], { numsession: req.session.id, label: filename }); + req.session["personne_"+toto+"_prenom"] = req.body["personne_"+toto+"_prenom"]; + logger.info('req.session["personne_"'+toto+'"_prenom"] = ' + req.session["personne_"+toto+"_prenom"], { numsession: req.session.id, label: filename }); + req.session["personne_"+toto+"_datenaissance"] = req.body["personne_"+toto+"_datenaissance"]; + logger.info('req.session["personne_"'+toto+'"_datenaissance"] = ' + req.session["personne_"+toto+"_datenaissance"], { numsession: req.session.id, label: filename }); + + req.session["personne_"+toto+"_instrument"] = req.body["personne_"+toto+"_instrument"]; + logger.info('req.session["personne_"'+toto+'"_instrument"] = ' + req.session["personne_"+toto+"_instrument"], { numsession: req.session.id, label: filename }); + req.session["personne_"+toto+"_cahier"] = req.body["personne_"+toto+"_cahier"]; + logger.info('req.session["personne_"'+toto+'"_cahier"] = ' + req.session["personne_"+toto+"_cahier"], { numsession: req.session.id, label: filename }); + req.session["personne_"+toto+"_piece"] = req.body["personne_"+toto+"_piece"]; + logger.info('req.session["personne_"'+toto+'"_piece"] = ' + req.session["personne_"+toto+"_piece"], { numsession: req.session.id, label: filename }); + req.session["personne_"+toto+"_prof"] = req.body["personne_"+toto+"_prof"]; + 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"]) { + logger.info('req.session["personne_"'+toto+'"_datenaissance"] : ' + req.session["personne_"+toto+"_datenaissance"], { numsession: req.session.id, label: filename }); + let datenaissance_concat = req.session["personne_"+toto+"_datenaissance"]; + logger.info("datenaissance_concat : " + datenaissance_concat, { numsession: req.session.id, label: filename }); + + 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('2023-05-07'); + logger.info("birthDate : " + birthDate, { numsession: req.session.id, label: filename }); + logger.info("debutrassemblement : " + debutrassemblement, { numsession: req.session.id, label: filename }); + + var age = debutrassemblement.getFullYear() - birthDate.getFullYear(); + logger.info("age : " + age, { numsession: req.session.id, label: filename }); + var m = debutrassemblement.getMonth() - birthDate.getMonth(); + if (m < 0 || (m === 0 && debutrassemblement.getDate() < birthDate.getDate())) { + logger.info("debutrassemblement.getDate() = " + debutrassemblement.getDate(), { numsession: req.session.id, label: filename }); + 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 + nbr_eleve++; + logger.info('nbr_eleve dans boucle date de naissance : ' + nbr_eleve, { numsession: req.session.id, label: filename }); + + } + } + + ///// 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.accompte_frais_bancaire = 1; + req.session.cout_total += req.session.cout_rassemblement + req.session.accompte_frais_bancaire; + }; + if (nbr_eleve > 1){ + req.session.cout_rassemblement = 51; + req.session.accompte_frais_bancaire = 1; + req.session.cout_total += req.session.cout_rassemblement + req.session.accompte_frais_bancaire; + } + if (nbr_eleve < 1){ + req.session.err_nbr_eleve = "Vous n'avez pas inscrit d'élève"; + logger.info('req.session.err_nbr_eleve : ' + req.session.err_nbr_eleve, { numsession: req.session.id, label: filename }); + } + + if (req.session.err_nbr_eleve) { + logger.info("existing session_err_nbr_eleve : " + req.session.err_nbr_eleve, { numsession: req.session.id }); + res.redirect('/rassemblementidf/formulaire'); + } else { + logger.info('req.session.cout_rassemblement : ' + req.session.cout_rassemblement, { 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'); + } + + + +} + +///////////////////////////////////////////////// +// PAGE 3 +// DOMAIN/stagenational/recap +// +// Bouton modifier +// +///////////////////////////////////////////////// + +// CLICK SUR BOUTON MODIFIER +const post_recap_modifier = async function(req, res) { + res.redirect('/rassemblementidf/identifier'); +} + + + +///////////////////////////////////////////////// +// PAYER ACCOMPTE +// +// Enregistrement des infos dans la Google Sheet avant le paiement +// (car le redirect après le paiement vers la page "réussi" ou "annulé" initialise une autre session qui fait perdre le cookie précédent et les infos saisies) +// Payer accompte par carte bancaire +// STIPE +// +///////////////////////////////////////////////// + +// CLICK SUR BOUTON PAYER ACCOMPTE PAGE RECAP +const post_payer_ri = async function(req, res, next) { + + logger.info("======================================"); + logger.info("======== FUNCTION post_payer_ri =========="); + logger.info("======================================"); + + + ////////////////////////////////// + // AJOUT INFO DANS LA GOOGLE SHEET + + + await GS_rassemblementidf.useServiceAccountAuth(GS_creds_rassemblementidf); + await GS_rassemblementidf.loadInfo(); // loads document properties and worksheets + logger.info("NOM FICHIER SHEET : " + GS_rassemblementidf.title, { numsession: req.session.id, label: filename }); + const GS_RI_sheet = GS_rassemblementidf.sheetsByTitle['inscription_web']; + logger.info("NOM DU TABLEAU (ONGLET): " + GS_RI_sheet.title, { numsession: req.session.id, label: filename }); + + // DATE DE L'INSCRIPTION + moment().format(); + moment.locale('fr'); + var date_formattee = moment().format('L') + console.log("date_formattee:", date_formattee); + + // AJOUTER UNE LIGNE DANS LA GOOGLE SHEET + logger.info("/ AJOUTER UNE LIGNE DANS LA GOOGLE SHEET", { numsession: req.session.id, label: filename }); + logger.info("req.session.identifiant : " + req.session.identifiant, { numsession: req.session.id, label: filename }); + logger.info("req.session.adherent_nom : " + req.session.adherent_nom, { numsession: req.session.id, label: filename }); + const moreRows = await GS_RI_sheet.addRows([ + { + 'saison': "2022/2023", + 'identifiant': req.session.identifiant, + 'association_suzuki': req.session.association, + 'status_inscription': "clic_bouton_payer", + 'inscription_date': date_formattee, + 'adherent_nom': req.session.adherent_nom, + 'adherent_prenom': req.session.adherent_prenom, + 'cout_total': req.session.cout_total, + 'cout_rassemblement': req.session.cout_rassemblement, + 'frais_bancaire': req.session.accompte_frais_bancaire, + 'adherent_adresse_rue': req.session.adherent_adresse_rue, + 'adherent_adresse_complement': req.session.adherent_adresse_complement, + 'adherent_adresse_codepostal': req.session.adherent_adresse_codepostal, + 'adherent_adresse_ville': req.session.adherent_adresse_ville, + 'adherent_adresse_pays': req.session.adherent_adresse_pays, + 'adherent_telephone_fixe': req.session.adherent_telephone_fixe, + 'adherent_telephone_mobile': req.session.adherent_telephone_mobile, + 'adherent_mail': req.session.adherent_mail, + 'bus_nb': req.session.bus_nb, + 'accompagnant_nom': req.session.accompagnant_nom, + 'accompagnant_prenom': req.session.accompagnant_prenom, + 'commentaire_adherent': req.session.commentaire_adherent, + + 'personne_1_nom': req.session.personne_1_nom, + 'personne_1_prenom': req.session.personne_1_prenom, + 'personne_1_datenaissance': req.session.personne_1_datenaissance, + 'personne_1_age': req.session.personne_1_age, + 'personne_1_instrument': req.session.personne_1_instrument, + 'personne_1_cahier': req.session.personne_1_cahier, + 'personne_1_piece': req.session.personne_1_piece, + 'personne_1_prof': req.session.personne_1_prof, + + 'personne_2_nom': req.session.personne_2_nom, + 'personne_2_prenom': req.session.personne_2_prenom, + 'personne_2_datenaissance': req.session.personne_2_datenaissance, + 'personne_2_age': req.session.personne_2_age, + 'personne_2_instrument': req.session.personne_2_instrument, + 'personne_2_cahier': req.session.personne_2_cahier, + 'personne_2_piece': req.session.personne_2_piece, + 'personne_2_prof': req.session.personne_2_prof, + + 'personne_3_nom': req.session.personne_3_nom, + 'personne_3_prenom': req.session.personne_3_prenom, + 'personne_3_datenaissance': req.session.personne_3_datenaissance, + 'personne_3_age': req.session.personne_3_age, + 'personne_3_instrument': req.session.personne_3_instrument, + 'personne_3_cahier': req.session.personne_3_cahier, + 'personne_3_piece': req.session.personne_3_piece, + 'personne_3_prof': req.session.personne_3_prof, + + 'personne_4_nom': req.session.personne_4_nom, + 'personne_4_prenom': req.session.personne_4_prenom, + 'personne_4_datenaissance': req.session.personne_4_datenaissance, + 'personne_4_age': req.session.personne_4_age, + 'personne_4_instrument': req.session.personne_4_instrument, + 'personne_4_cahier': req.session.personne_4_cahier, + 'personne_4_piece': req.session.personne_4_piece, + 'personne_4_prof': req.session.personne_4_prof, + + 'personne_5_nom': req.session.personne_5_nom, + 'personne_5_prenom': req.session.personne_5_prenom, + 'personne_5_datenaissance': req.session.personne_5_datenaissance, + 'personne_5_age': req.session.personne_5_age, + 'personne_5_instrument': req.session.personne_5_instrument, + 'personne_5_cahier': req.session.personne_5_cahier, + 'personne_5_piece': req.session.personne_5_piece, + 'personne_5_prof': req.session.personne_5_prof, + + 'personne_6_nom': req.session.personne_6_nom, + 'personne_6_prenom': req.session.personne_6_prenom, + 'personne_6_datenaissance': req.session.personne_6_datenaissance, + 'personne_6_age': req.session.personne_6_age, + 'personne_6_instrument': req.session.personne_6_instrument, + 'personne_6_cahier': req.session.personne_6_cahier, + 'personne_6_piece': req.session.personne_6_piece, + 'personne_6_prof': req.session.personne_6_prof, + + + }, + ]); + + + ////////////////////////////////// + // PAIEMENT STRIPE + + + // STRIPE - ETAPE 1 - CREER l'INTENTION DE PAIEMENT + logger.info("// STRIPE - ETAPE 1 - CREER l'INTENTION DE PAIEMENT", { numsession: req.session.id, label: filename }); + logger.info("stripe.VERSION = " + stripe.VERSION, { numsession: req.session.id, label: filename }); + logger.info("stripe._api = " + stripe._api, { numsession: req.session.id, label: filename }); + //console.log(stripe); + logger.info("req.session.adherent_mail = " + req.session.adherent_mail, { numsession: req.session.id, label: filename }); + logger.info("// STRIPE - AJOUT METADATA", { numsession: req.session.id, label: filename }); + logger.info("req.session.identifiant = " + req.session.identifiant, { numsession: req.session.id, label: filename }); + logger.info("req.session.cout_rassemblement = " + req.session.cout_rassemblement, { 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("STRIPE_RI_SUCCESSURL = " + process.env.STRIPE_RI_SUCCESSURL, { numsession: req.session.id, label: filename }); + logger.info("STRIPE_RI_CANCELURL = " + process.env.STRIPE_RI_CANCELURL, { numsession: req.session.id, label: filename }); + logger.info("req.session.cout_total = " + req.session.cout_total, { numsession: req.session.id, 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, + //There are four different submit types. + 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' + + }); + + logger.info("session: " + session, { numsession: req.session.id, label: filename }); + logger.info("session.id: " + session.id, { numsession: req.session.id, label: filename }); + logger.info("session.url: " + session.url, { numsession: req.session.id, label: filename }); + let url_stripe = session.url + res.redirect(session.url) + +} + + +///////////////////////////////////////////////// +// RETOUR PAIEMENT REUSSI +const RI_accompte_reussi = async function(req, res){ + + logger.info("======================================"); + logger.info("======== FUNCTION RI_accompte_reussi =========="); + logger.info("======================================"); + + // RETOUR STRIPE + var id = req.query.id; + + logger.info("id : " + id, { numsession: req.session.id, label: filename }); + + const session_stripe = await stripe.checkout.sessions.retrieve(id); + + var customer_email = session_stripe.customer_email; + var payment_status = session_stripe.payment_status; + var amount_total = session_stripe.amount_total/100; + var stripe_customer = session_stripe.customer; + var stripe_payment_intent = session_stripe.payment_intent; + var payment_method_types = session_stripe.payment_method_types; + var stripe_status = session_stripe.status; + var identifiant = session_stripe.metadata.identifiant; + var cout_rassemblement = session_stripe.metadata.cout_rassemblement; + var accompte_frais_bancaire = session_stripe.metadata.accompte_frais_bancaire; + var CB_retour = "identifiant_adherent:"+identifiant+",payment_status:"+payment_status+",stripe_customer:"+stripe_customer+",stripe_payment_intent:"+stripe_payment_intent+",sessionID:"+session_stripe.id+",payment_method_types:"+payment_method_types+",amount_total:"+amount_total+",stripe_status:"+stripe_status; + + + console.log("customer_email: ", customer_email); + logger.info("payment_status : " + payment_status, { numsession: req.session.id, label: filename }); + logger.info("cout_rassemblement : " + cout_rassemblement, { numsession: req.session.id, label: filename }); + logger.info("accompte_frais_bancaire : " + accompte_frais_bancaire, { numsession: req.session.id, label: filename }); + console.log("stripe_customer: ", stripe_customer); + console.log("amount_total: ", amount_total); + console.log("stripe_payment_intent: ", stripe_payment_intent); + console.log("payment_method_types: ", payment_method_types); + console.log("payment_method_types: ", payment_method_types[0]); + console.log("stripe_status: ", stripe_status); + console.log("CB_retour: ", CB_retour); + + + + ////////////////////////////////////////////////////////////////////////////// + // RÉCUPÉRATION DES INFOS STAGIAIRES DANS LA GOOGLE SHEET + // MISE À JOUR DES INFORMATIONS SUR LE PAIEMENT DANS LA BASE DE DONNÉES GSHEET + + + await GS_rassemblementidf.useServiceAccountAuth(GS_creds_rassemblementidf); + await GS_rassemblementidf.loadInfo(); // loads document properties and worksheets + logger.info("NOM FICHIER SHEET: " + GS_rassemblementidf.title, { numsession: req.session.id, label: filename }); + const GS_RI_sheet = GS_rassemblementidf.sheetsByTitle['inscription_web']; + logger.info("NOM DU TABLEAU (ONGLET): " + GS_RI_sheet.title, { numsession: req.session.id, label: filename }); + + // on récupère le contenu de la GSheet dans un array nommé "infos_adherents" + const infos_adherents = await GS_RI_sheet.getRows(); + // on récupère quelle ligne contient l'identifiant concerné pour mettre à jour cette ligne + let list_identifiants = new Array; + let compteur = GS_RI_sheet.rowCount - 1; + let rowToBeUpdate; + logger.info("identifiant TRANSMIS PAR STRIPE :" + identifiant, { numsession: req.session.id, label: filename }); + for (let i=0; i est déjà inscrit au rassemblement."; + res.redirect('/rassemblementra/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('/rassemblementra/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 + '" AND saison = "' + process.env.SAISON + '"'; + logger.info("sql adherent : " + sql, { numsession: req.session.id, label: filename}); + 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('/rassemblementra/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('/rassemblementra/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('/rassemblementra/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('/rassemblementra/identifier'); + } + } + +} + +const RA_checkinfos = async function(req, res) { + + logger.info("======================================"); + logger.info("======== FUNCTION RA_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.commentaire_adherent) {req.session.commentaire_adherent = req.body.commentaire_adherent;}; + for (let toto = 1; toto < 5; 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"]; } + } + + + // INITIALISATION DES MONTANTS PAR FAMILLE + req.session.cout_rassemblement = 0; + var nbr_eleve = 0; + + // ON COMPTE LES PARTICIPANTS + // ON récupère L'ÂGE DU PARTICIPANTS à partir de la date de naissance + for (let toto = 1; toto < 5; toto++) { + + logger.info('======= Personne N° ' + toto, { numsession: req.session.id, label: filename }); + + logger.info('req.session_prenom = ' + req.session["personne_"+toto+"_prenom"], { numsession: req.session.id, label: filename }); + logger.info('req.body_cahier = ' + req.body["personne_"+toto+"_cahier"], { 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-03-29'); + 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_age = ' + req.session["personne_"+toto+"_age"], { numsession: req.session.id, label: filename }); + + //// +1 au nombre d'élèves instrumentistes + if (req.session["personne_"+toto+"_role"] === "instrumentiste") { + nbr_eleve++; + } + } + } + + ///// CALCUL COUT TOTAL + logger.info('nbr_eleve TOTAL : ' + nbr_eleve, { numsession: req.session.id, label: filename }); + if (nbr_eleve == 1){ + req.session.cout_rassemblement = 25; + }; + if (nbr_eleve > 1){ + req.session.cout_rassemblement = 40; + } + req.session.cout_total = req.session.cout_rassemblement; + logger.info('req.session.cout_rassemblement : ' + req.session.cout_rassemblement, { numsession: req.session.id, label: filename }); + logger.info('req.session.cout_total : ' + req.session.cout_total, { numsession: req.session.id, label: filename }); + + res.redirect('/rassemblementra/recap'); + +} + +const post_recap_modifier = async function(req, res) { + req.session.identifiant = ""; + req.session.association_suzuki = ""; + req.session.adherent_nom = ""; + req.session.adherent_prenom = ""; + 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.adherent_telephone_mobile = ""; + req.session.adherent_telephone_fixe = ""; + req.session.adherent_mail = ""; + req.session.commentaire_adherent = ""; + for (let toto = 1; toto < 5; toto++) { + req.session["personne_" + toto + "_nom"] = ""; + req.session["personne_" + toto + "_prenom"] = ""; + req.session["personne_" + toto + "_datenaissance"] = ""; + 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"] = ""; + } + req.session.cout_rassemblement = 0; + res.redirect('/rassemblementra/identifier'); +} + +const post_payer_ra = async function(req, res) { + logger.info("======================================"); + logger.info("======== FUNCTION post_payer_ra =========="); + logger.info("======================================"); + + // VARIABLES + ///////////////////////////////////////////////// + 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('/rassemblementra/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 < 5; toto++) { + if (req.session["personne_"+toto+"_nom"]) { + // QUERY ADD ras_participant + await db_ajout_participants(req, res, db_connection_promise, toto, now, sql, table, champs, values); + } + } + + ///////////////////////////////////////////////// + // AJOUT DB ADHÉRENTS + // QUERY ADD ras_adherent + await db_ajout_adherent(req, res, db_connection_promise, sql, table, champs, values); + + 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}, + customer_email: req.session.adherent_mail, + + submit_type: 'pay', + + success_url: process.env.STRIPE_RA_SUCCESSURL, + cancel_url: process.env.STRIPE_RA_CANCELURL, + + payment_method_types: ['card'], + line_items: [{ + price_data: { + currency: 'eur', + product_data: { + name: 'Rassemblement Rhône-Alpes', + }, + 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('/rassemblementra/identifier'); + } + } + +} + +const RA_accompte_reussi = async function(req, res) { + + logger.info("======================================", { label: filename }); + logger.info("======== FUNCTION RA_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('/rassemblementra/identifier'); + return; + } else { + + // Query MAJ infos paiements DB + // TRY 1 + try { + let db_connection_promise = await connect_DB_promise(); + let sql = ` + UPDATE ras_adherent + SET + stripe_retour = ?, + statut_paiement = ? + WHERE identifiant = ? + AND lieu = ? + AND saison = ? + AND statut_suppression = 0 + `; + let values = [ + CB_retour, // stripe_retour + "paye", // statut_paiement + identifiant, // identifiant pour la clause WHERE + "CHAPONNAY", // lieu + process.env.SAISON // saison + ]; + + + + logger.info("sql UPDATE ras_adherent : " + sql, { numsession: req.session.id, label: filename}); + logger.info("Valeurs : " + JSON.stringify(values)); + const [results, fields] = await db_connection_promise.execute(sql, values); + 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 = "CHAPONNAY" 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 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 = "CHAPONNAY" AND ras_participant.saison = "' + process.env.SAISON + '"'; + + const sql3 = ` + SELECT + a.identifiant, + a.association_suzuki, + a.saison, + a.date_maj, + a.adherent_nom, + a.adherent_prenom, + a.adherent_telephone, + a.adherent_mail, + p.ID_participant, + p.ras_part_nom, + p.ras_part_prenom, + p.ras_part_date_naiss, + p.ras_part_role, + p.ras_part_age, + p.instrument, + p.cahier, + p.piece, + p.prof_nom + FROM ras_participant p + JOIN ras_adherent a + ON a.identifiant = p.identifiant + AND a.saison = ? + WHERE p.identifiant = ? + AND p.statut_suppression = 0 + AND p.lieu = "CHAPONNAY" + AND p.saison = ? + `; + + const params = [ + process.env.SAISON, + req.session.identifiant, + process.env.SAISON + ]; + + + //const [results3, fields3] = await db_connection_promise.execute(sql3); + const [results3, fields3] = await db_connection_promise.execute(sql3, params); + 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.accompagnant_prenom = results2[0].accompagnant_prenom; + res.locals.accompagnant_nom = results2[0].accompagnant_nom; + + for (let toto = 0; toto < (results3.length); toto++) { + logger.info("==== Personne N° " + toto, { numsession: req.session.id, label: filename}); + 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; + logger.info("Prénom " + res.locals["personne_"+toto+"_prenom"], { numsession: req.session.id, label: filename}); + 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.tarif_rassemblement = results2[0].tarif_rassemblement; + + + ////////////////////////////////////////////////////////////////////////////// + // AJOUT INFOS DANS GOOGLE SHEET + // TRY 4 + try { + + await GS_rassemblementra.useServiceAccountAuth(GS_creds_rassemblementra); + await GS_rassemblementra.loadInfo(); + let GS_rassemblementra_Adherents = GS_rassemblementra.sheetsByTitle['Adherents']; + let GS_rassemblementra_Paiements = GS_rassemblementra.sheetsByTitle['Paiements']; + let GS_rassemblementra_Instrumentistes = GS_rassemblementra.sheetsByTitle['Instrumentistes']; + let GS_rassemblementra_Professeurs = GS_rassemblementra.sheetsByTitle['Professeurs']; + let GS_rassemblementra_VIOLON = GS_rassemblementra.sheetsByTitle['VIOLON']; + + + await GS_rassemblementra_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_rassemblementra_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_total: parseFloat(results2[0].tarif_rassemblement), + statut_paiement: results2[0].statut_paiement + } + ] + ); + + 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_rassemblementra_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 + }); + professeur_trouve = "oui"; + } + } + if (professeur_trouve === "oui") { await GS_rassemblementra_Professeurs.addRows(ajout_professeur);} + + 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_rassemblementra_VIOLON.addRows(ajout_violon);} + + 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('/rassemblementra/identifier'); + return; + } + + ////////////////////////////////////////////////////////////////////////////// + // ENVOIE CONFIRMATION PAR MAIL + + let mail_objet = "Ecole de Musique Suzuki de l'Est Lyonnais - Rassemblement RHÔNE-ALPES 2026 - "; + mail_objet += results2[0].adherent_nom; + + let mail_html = "

Cher adhérent,

Félicitations ! Vous êtes désormais inscrit au Rassemblement Rhône-Alpes du 29 mars 2026 organisé par l'Ecole de Musique Suzuki de l'Est Lyonnais, en partenariat avec l'Association Française pour la Pédagogie Suzuki.

"; + + mail_html += "

L’accueil se fera à partir de 9h30 et les premiers cours débuteront à 10h30. (Merci d’arriver en avance afin de faire votre enregistrement et que les cours puissent commencer à l’heure)
La journée se terminera aux environs de 16h30/17h

"; + mail_html += "

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

"; + mail_html += "

Lieu : Collège La Xavière, 1 Rue des Fontaines 69970 Chaponnay

"; + 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 += "

"; + } + 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].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 += "
Tarif rassemblement : "; + mail_html += results2[0].tarif_rassemblement + "€"; + mail_html += "

"; + mail_html += "


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

L'école de Musique Suzuki de l'Est Lyonnais
Marie Rossot
Pôle organisation du rassemblement

"; + + let mailOptions = { + from: 'afps.inscription@gmail.com', + to: req.session.adherent_mail, + subject: mail_objet, + html: mail_html + }; + 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('rassemblementra/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('/rassemblementra/identifier'); + } + + } + +} + +const RA_accompte_annule = async function(req, res) { + + logger.info("======================================"); + logger.info("======== FUNCTION RA_accompte_annule =========="); + logger.info("======================================"); + + // VARIABLES + let CB_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 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; + + 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 ras_adherent + SET + identifiant = CONCAT(identifiant, ID_adherent), + stripe_retour = ?, + statut_paiement = ?, + statut_suppression = ? + WHERE identifiant = ? + AND statut_suppression = 0 + AND lieu = ? + AND saison = ? + `; + let values = [ + CB_retour, // stripe_retour + "non paye", // statut_paiement + 1, // statut_suppression + identifiant, // identifiant pour la clause WHERE + "CHAPONNAY", // lieu + process.env.SAISON // saison + ]; + + logger.info("sql UPDATE ras_adherent : " + sql, { numsession: req.session.id, label: filename}); + + const [results, fields] = await db_connection_promise.execute(sql, values); + logger.info("Row stn_adherent UPDATE STRIPE: " + results.changedRows, { numsession: req.session.id, label: filename}); + + //Query MAJ stn_participant + let sql1 = ` + UPDATE ras_participant + SET + identifiant = CONCAT(identifiant, ID_participant), + statut_suppression = ? + WHERE identifiant = ? + AND statut_suppression = 0 + AND lieu = ? + AND saison = ? + `; + let values1 = [ + 1, // statut_suppression + identifiant, // identifiant pour la clause WHERE + "CHAPONNAY", // lieu + process.env.SAISON // saison + ]; + + + logger.info("sql UPDATE ras_participant : " + sql1, { numsession: req.session.id, label: filename}); + + const [results1, fields1] = await db_connection_promise.execute(sql1, values1); + 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('rassemblementra/page_templates/paiement_annule'); + return; + } + + } 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('/rassemblementra/identifier'); + return; + } + + +} + +const RA_post_valid_ss_paiement = async function (req, res) { + + logger.info("======================================"); + logger.info("======== FUNCTION RA_post_valid_ss_paiement =========="); + logger.info("======================================"); + + // VARIABLES + ///////////////////////////////////////////////// + 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('/rassemblementra/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('/rassemblementra/identifier'); + return; + } else { + ///////////////////////////////////////////////// + // AJOUT PARTICIPANTS + for (let toto = 1; toto < 5; toto++) { + if (req.session["personne_"+toto+"_nom"]) { + // QUERY ADD ras_participant + await db_ajout_participants(req, res, db_connection_promise, toto, now, sql, table, champs, values); + } + } + + ///////////////////////////////////////////////// + // AJOUT DB ADHÉRENTS + // QUERY ADD ras_adherent + await db_ajout_adherent_gratuit(req, res, db_connection_promise, sql, table, champs, values); + + ////////////////////////////////////////////////////////////////////////////// + // 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 = "CHAPONNAY" 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 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 = "CHAPONNAY" 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; + + for (let toto = 1; toto < 5; 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"]; + 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_rassemblementra.useServiceAccountAuth(GS_creds_rassemblementra); + await GS_rassemblementra.loadInfo(); + let GS_rassemblementra_Adherents = GS_rassemblementra.sheetsByTitle['Adherents']; + let GS_rassemblementra_Professeurs = GS_rassemblementra.sheetsByTitle['Professeurs']; + + await GS_rassemblementra_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 + } + ] + ); + + 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 + }); + professeur_trouve = "oui"; + } + } + if (professeur_trouve === "oui") { await GS_rassemblementra_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('/rassemblementra/identifier'); + } + + ////////////////////////////////////////////////////////////////////////////// + // ENVOIE CONFIRMATION PAR MAIL + + let mail_objet = "Ecole de Musique Suzuki de l'Est Lyonnais - Rassemblement RHÔNE-ALPES 2026 - "; + mail_objet += results2[0].adherent_nom; + + let mail_html = "

Cher adhérent,

Félicitations ! Vous êtes désormais inscrit au Rassemblement Rhône-Alpes du 29 mars 2026 organisé par l'Ecole de Musique Suzuki de l'Est Lyonnais, en partenariat avec l'Association Française pour la Pédagogie Suzuki.

"; + + mail_html += "

L’accueil se fera à partir de 9h30 et les premiers cours débuteront à 10h30. (Merci d’arriver en avance afin de faire votre enregistrement et que les cours puissent commencer à l’heure)
La journée se terminera aux environs de 16h30/17h

"; + mail_html += "

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

"; + mail_html += "

Lieu : Collège La Xavière, 1 Rue des Fontaines 69970 Chaponnay

"; + + 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 += "

"; + 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 += "


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

L'école de Musique Suzuki de l'Est Lyonnais
Marie Rossot
Pôle organisation du rassemblement

"; + + let mailOptions = { + from: 'afps.inscription@gmail.com', + to: req.session.adherent_mail, + subject: mail_objet, + html: mail_html + }; + 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('rassemblementra/page_templates/paiement_reussi.ejs'); + return; + + } + + } 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('/rassemblementra/identifier'); + return; + } + + } + + +} + +///////////////////////////////////////////////// +// FONCTIONS ANNEXES +///////////////////////////////////////////////// + +async function db_ajout_adherent(req, res, db_connection_promise, now, sql, table, champs, values) { + logger.info("======================================"); + logger.info("======== FUNCTION ANNEXES RASSEMBLEMENT RA db_ajout_adherent =========="); + logger.info("======================================"); + + ///////////////////////////////////////////////// + // AJOUT DB ADHÉRENTS + // QUERY ADD ras_adherent + table = "ras_adherent"; + + champs = ` + identifiant, association_suzuki, lieu, 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, tarif_rassemblement, + cout_total, statut_paiement, statut_suppression + `; + + values = [ + req.session.identifiant || null, + req.session.association_suzuki || null, + "CHAPONNAY", // valeur fixe + process.env.SAISON || null, + new Date(), // Date actuelle + req.session.adherent_nom || null, + req.session.adherent_prenom || null, + req.session.adherent_telephone_mobile || null, + req.session.adherent_mail || null, + req.session.adherent_adresse_rue || null, + req.session.adherent_adresse_complement || null, + req.session.adherent_adresse_codepostal || null, + req.session.adherent_adresse_ville || null, + req.session.adherent_adresse_pays || null, + req.session.commentaire_adherent || null, + req.session.accompagnant_nom || null, + req.session.accompagnant_prenom || null, + req.session.cout_rassemblement || 0, // valeur par défaut + req.session.cout_total || 0, // valeur par défaut + "attente", // valeur fixe + 0 // valeur fixe + ]; + + sql = `INSERT INTO ${table} (${champs}) VALUES (${Array(values.length).fill('?').join(', ')})`; + + 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, values); + logger.info("ras_adherent Row ID added : " + results_ras_adherent.insertId, { numsession: req.session.id, label: filename}); + + return results_ras_adherent; +} + +async function db_ajout_adherent_gratuit(req, res, db_connection_promise, now, sql, table, champs, values) { + logger.info("======================================"); + logger.info("======== FUNCTION ANNEXES RASSEMBLEMENT RA db_ajout_adherent =========="); + logger.info("======================================"); + + ///////////////////////////////////////////////// + // AJOUT DB ADHÉRENTS + // QUERY ADD ras_adherent + table = "ras_adherent"; + + champs = ` + identifiant, association_suzuki, lieu, 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, tarif_rassemblement, + cout_total, statut_paiement, statut_suppression + `; + + values = [ + req.session.identifiant || null, + req.session.association_suzuki || null, + "CHAPONNAY", // valeur fixe + process.env.SAISON || null, + new Date(), // Date actuelle + req.session.adherent_nom || null, + req.session.adherent_prenom || null, + req.session.adherent_telephone_mobile || null, + req.session.adherent_mail || null, + req.session.adherent_adresse_rue || null, + req.session.adherent_adresse_complement || null, + req.session.adherent_adresse_codepostal || null, + req.session.adherent_adresse_ville || null, + req.session.adherent_adresse_pays || null, + req.session.commentaire_adherent || null, + req.session.accompagnant_nom || null, + req.session.accompagnant_prenom || null, + req.session.cout_rassemblement || 0, // valeur par défaut + req.session.cout_total || 0, // valeur par défaut + "gratuit", // valeur fixe + 0 // valeur fixe + ]; + + sql = `INSERT INTO ${table} (${champs}) VALUES (${Array(values.length).fill('?').join(', ')})`; + + 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, values); + logger.info("ras_adherent Row ID added : " + results_ras_adherent.insertId, { numsession: req.session.id, label: filename}); + + return results_ras_adherent; +} + +async function db_ajout_participants(req, res, db_connection_promise, toto, now, sql, table, champs, values) { + logger.info("======================================"); + logger.info("======== FUNCTION ANNEXES RASSEMBLEMENT RA db_ajout_participants =========="); + logger.info("======================================"); + + table = "ras_participant"; + // On ajoute que le professeur car une inscription sans paiement est forcément sans instrumentiste + if (req.session["personne_"+toto+"_role"] === "professeur"){ + //champs = "identifiant, lieu, saison, date_maj, ras_part_nom, ras_part_prenom, ras_part_date_naiss, ras_part_age, ras_part_role, instrument, statut_suppression"; + //values = '"'+ req.session.identifiant + '", "CHAPONNAY", "' + process.env.SAISON + '", "' + 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"] + '", 0'; + + champs = ` + identifiant, lieu, saison, date_maj, ras_part_nom, ras_part_prenom, ras_part_date_naiss, + ras_part_age, ras_part_role, instrument, statut_suppression + `; + + values = [ + req.session.identifiant, + "CHAPONNAY", + process.env.SAISON, + 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`], + 0 + ]; + + } + + if (req.session["personne_"+toto+"_role"] === "instrumentiste"){ + //champs = "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 = '"'+ 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'; + + champs = ` + identifiant, lieu, saison, 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 = [ + req.session.identifiant, // identifiant + "CHAPONNAY", + process.env.SAISON, + now, // date_maj + req.session[`personne_${toto}_nom`], // ras_part_nom + req.session[`personne_${toto}_prenom`], // ras_part_prenom + req.session[`personne_${toto}_datenaissance`], // ras_part_date_naiss + req.session[`personne_${toto}_age`], // ras_part_age + req.session[`personne_${toto}_role`], // ras_part_role + req.session[`personne_${toto}_instrument`], // instrument + req.session[`personne_${toto}_cahier`], // cahier + req.session[`personne_${toto}_piece`], // piece + req.session[`personne_${toto}_prof`], // prof_nom + 0 // statut_suppression + ]; + + + } + + sql = `INSERT INTO ${table} (${champs}) VALUES (${Array(values.length).fill('?').join(', ')})`; + + //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, values); + logger.info("ras_participant Row ID added : " + results_ras_participant.insertId, { numsession: req.session.id, label: filename}); + + return results_ras_participant; +} +///////////////////////////////////////////////// +// EXPORT DE MODULE POUR QU'IL SOIT LU DANS LES AUTRES FICHIERS JS +///////////////////////////////////////////////// + +module.exports = { + checkidentifiant, + RA_checkinfos, + post_recap_modifier, + post_payer_ra, + RA_accompte_reussi, + RA_accompte_annule, + RA_post_valid_ss_paiement +} \ No newline at end of file diff --git a/controllers/stage_national/stn_formulaireController.js b/controllers/stage_national/stn_formulaireController.js new file mode 100644 index 0000000..b196e15 --- /dev/null +++ b/controllers/stage_national/stn_formulaireController.js @@ -0,0 +1,498 @@ +///////////////////////////////////////////////// +// APPELS DES MODULES +///////////////////////////////////////////////// +const path = require("path"); + +///////////////////////////////////////////////// +// APPELS DES MODULES PERSOS +///////////////////////////////////////////////// +// loggings +const logger = require("../../public/js/app/logger_stagenat"); +// DB +const { connect_DB_promise } = require('../../modules/db/databaseconnect'); +// VÉRIF CODE SECRET +const { verif_codesecret } = require('../../modules/verif_codesecret'); + + + +//////////////////////////////////////////////////// +// FILE NAME +//////////////////////////////////////////////////// +const filename = path.parse(__filename).base; + + +///////////////////////////////////////////////// +// PAGE 2 +// DOMAIN/stagenational/formulaire +// +// RECUPERATION CHAMPS SAISIS +// CALCUL AGE +// CALCUL DU PRIX +// AFFICHER PAGE RECAP +// +///////////////////////////////////////////////// + +const SN_checkinfos = async function(req, res) { + logger.info("======================================", { label: filename }); + logger.info("======== FUNCTION post_formulaire_stagenat (STAGE) ==========", { label: filename }); + logger.info("======================================", { label: filename }); + + //Connexion + let db_connection_promise = await connect_DB_promise(); + + //// INITIALISATION DES MONTANTS PAR FAMILLE + req.session.cout_total = 0; + req.session.frais_dossier = 0; + req.session.cout_total_hebergement = 0; + req.session.cout_total_transport = 0; + req.session.cout_total_dalcroze = 0; + req.session.cout_total_chant = 0; + req.session.cout_total_dalcroze_surplace = 0; + req.session.cout_total_observation = 0; + req.session.cout_total_cours = 0; + req.session.cout_total_coursparticulier = 0; + req.session.cout_total_eveil = 0; + req.session.cout_total_collectif = 0; + req.session.cout_total_ensemble = 0; + req.session.cout_total_particulier = 0; + + req.session.cout_total_option_decouvrealto = 0; + req.session.accompte_frais_bancaire = 0; + req.session.remise = ""; + req.session.remise_fn_montant = 0; + req.session.montant_accompte = 0; + + // Variables + let adulte_trouve = "non"; + let nb_instrumentiste = 0; + + // RÉCUPÉRATION DES DONNÉES DU FORMULAIRE DE LA SESSION EN COURS + req.session.association_suzuki = req.body.association_suzuki; + + req.session.adherent_nom = req.body.adherent_nom; + req.session.adherent_prenom = req.body.adherent_prenom; + req.session.adherent_adresse_rue = req.body.adherent_adresse_rue; + req.session.adherent_adresse_complement = req.body.adherent_adresse_complement; + req.session.adherent_adresse_codepostal = req.body.adherent_adresse_codepostal; + req.session.adherent_adresse_ville = req.body.adherent_adresse_ville; + req.session.adherent_adresse_pays = req.body.adherent_adresse_pays; + req.session.adherent_telephone = req.body.adherent_telephone; + req.session.adherent_mail = req.body.adherent_mail; + req.session.hebergement = req.body.hebergement; + req.session.commentaire_adherent = req.body.commentaire_adherent; + + var nb_prof_invite = 0; + var nb_observateur = 0; + var nb_accompagnant = 0; + var nb_instrumentiste_camp = 0; + var nb_personne_hebergement = 0; + req.session.cout_supplement_hebergement = 0; + + // SI DATE LIMITE D'INSCRIPTION DÉPASSÉE ON vérifie que le code secret est bien ok + await verif_codesecret(req, res); + logger.info("req.session.onpeutcontinuer : " + req.session.onpeutcontinuer , { numsession: req.session.id, label: filename}); + + if (req.session.onpeutcontinuer === "oui") { + // TRAITEMENT DES PARTICIPANTS + for (let toto = 1; toto < 7; toto++) { + // RÉCUPÉRATION DES INFORMATIONS SAISIES + if (req.body["personne_"+toto+"_nom"]) { + req.session[`personne_${toto}_nom`] = req.body[`personne_${toto}_nom`]; + req.session[`personne_${toto}_prenom`] = req.body[`personne_${toto}_prenom`]; + req.session[`personne_${toto}_datenaissance`] = req.body[`personne_${toto}_datenaissance`]; + req.session[`personne_${toto}_transport_mode`] = req.body[`personne_${toto}_transport_mode`]; + req.session[`personne_${toto}_transport_arret`] = req.body[`personne_${toto}_transport_arret`]; + req.session[`personne_${toto}_role`] = req.body[`personne_${toto}_role`]; + + // PROFIL pour observateur, prof ou non + req.session[`personne_${toto}_profil`] = req.body[`personne_${toto}_profil`]; + req.session[`personne_${toto}_prise_charge_nom`] = req.body[`personne_${toto}_prise_charge_nom`]; + if (req.session[`personne_${toto}_prise_charge_nom`]) {adulte_trouve = "oui"} + + req.session[`personne_${toto}_instrument`] = req.body[`personne_${toto}_instrument`]; + req.session[`personne_${toto}_instrument_ensemble`] = req.body[`personne_${toto}_instrument_ensemble`]; + req.session[`personne_${toto}_instrument_collectif`] = req.body[`personne_${toto}_instrument_collectif`]; + req.session[`personne_${toto}_cahier`] = req.body[`personne_${toto}_cahier`]; + req.session[`personne_${toto}_piece`] = req.body[`personne_${toto}_piece`]; + req.session[`personne_${toto}_prof`] = req.body[`personne_${toto}_prof`]; + req.session[`personne_${toto}_mail_prof`] = req.body[`personne_${toto}_mail_prof`]; + req.session[`personne_${toto}_option_coursindividuel`] = req.body[`personne_${toto}_option_coursindividuel`]; + req.session[`personne_${toto}_option_decouvrealto`] = req.body[`personne_${toto}_option_decouvrealto`]; + req.session[`personne_${toto}_option_concertsolo_cahier`] = req.body[`personne_${toto}_option_concertsolo_cahier`]; + req.session[`personne_${toto}_option_concertsolo_piece`] = req.body[`personne_${toto}_option_concertsolo_piece`]; + for (let i = 1; i <= 5; i++) { + req.session[`personne_${toto}_activite_${i}`] = req.body[`personne_${toto}_activite_${i}`]; + } + + // CALCUL ÂGE PERSONNE + // CALCUL PROFIL AGE DE LA PERSONNE + if (req.session["personne_"+toto+"_datenaissance"]) { + let datenaissance_concat = req.session["personne_"+toto+"_datenaissance"]; + + let an=datenaissance_concat.substr(6,4); // l'année (les quatre premiers caractères de la chaîne à partir de 6) + let mois=datenaissance_concat.substr(3,2);// On selectionne le mois de la date de naissance + let day= datenaissance_concat.substr(0,2); // On selectionne la jour de la date de naissance + let birthDate = new Date(an + "-" + mois + "-" + day); + let debutstage = new Date('2026-08-23'); + let age = debutstage.getFullYear() - birthDate.getFullYear(); + let m = debutstage.getMonth() - birthDate.getMonth(); + if (m < 0 || (m === 0 && debutstage.getDate() < birthDate.getDate())) { + age--; + } + req.session[`personne_${toto}_age`] = age; + //logger.info("Age de " + req.session[`personne_${toto}_prenom`] + " = " + age , { numsession: req.session.id, label: filename}); + + // CALCUL PROFIL_AGE DE LA PERSONNE + req.session[`personne_${toto}_profilage`] = + (age < 3) ? "moins_3ans" : + (age >= 3 && age <= 5) ? "3-5ans" : + (age >= 6 && age <= 11) ? "6-11ans" : + (age >= 12 && age <= 15) ? "12-15ans" : + (age >= 16 && age <= 17) ? "16-17ans" : + "adulte"; + + // Pour camp ado : on vérifie s'il y a un adulte ou non + if (req.session[`personne_${toto}_age`] > 17) { + adulte_trouve = "oui"; + logger.info("adulte_trouve : " + adulte_trouve, { numsession: req.session.id, label: filename}); + }; + + /////////////////////// + // TARIF PAR PERSONNE + + //// INITIALISATION DES MONTANTS PAR PERSONNE + req.session[`personne_${toto}_cout_hebergement`] = 0; + req.session[`personne_${toto}_cout_transport`] = 0; + req.session[`personne_${toto}_observation_cout`] = 0; + req.session[`personne_${toto}_cours_cout`] = 0; + req.session[`personne_${toto}_coursindividuel_cout`] = 0; + + req.session[`personne_${toto}_option_decouvrealto_cout`] = 0; + req.session[`personne_${toto}_eveil_cout`] = 0; + req.session[`personne_${toto}_dalcroze_cout`] = 0; + req.session[`personne_${toto}_chant_cout`] = 0; + req.session[`personne_${toto}_collectif_cout`] = 0; + req.session[`personne_${toto}_ensemble_cout`] = 0; + req.session[`personne_${toto}_particulier_cout`] = 0; + + // FLOCONS VERT COUT PAR PERSONNE + + // OBLIGER LES INSTRUMENTISTES CAMP ADO A CHOISIR Hébergement FLOCONS VERTS + if (req.session["personne_"+toto+"_role"] == "instrumentiste_camp") { + req.session.hebergement = "flocons verts partagé"; + nb_instrumentiste_camp ++; + } + + if ((req.session.hebergement === "flocons verts partagé" || req.session.hebergement === "flocons verts non partagé") + && req.session[`personne_${toto}_role`] !== "prof_invite") { + + logger.info(`HEBERGEMENT : ${req.session.hebergement}`, { numsession: req.session.id, label: filename }); + + // 11 ans - 17 ans & ADULTE tarif 300€/semaine + if (req.session[`personne_${toto}_age`] > 10) { + req.session[`personne_${toto}_cout_hebergement`] = 300; + req.session.cout_total += 300; + req.session.cout_total_hebergement += 300; + nb_personne_hebergement++; + } + + // 3 - 10 ans tarif 250€/semaine + if (req.session[`personne_${toto}_age`] >= 3 && req.session[`personne_${toto}_age`] <= 10) { + req.session[`personne_${toto}_cout_hebergement`] = 250; + req.session.cout_total += 250; + req.session.cout_total_hebergement += 250; + nb_personne_hebergement++; + } + } + + // CAR COUT PAR PERSONNE + if (req.session[`personne_${toto}_transport_mode`] === "car" && req.session[`personne_${toto}_role`] !== "prof_invite") { + logger.info(`ON AJOUTE LE COUT DU CAR : ${req.session[`personne_${toto}_role`]}`, { numsession: req.session.id, label: filename }); + + req.session[`personne_${toto}_cout_transport`] = 65; + req.session.cout_total_transport += 65; + req.session.cout_total += 65; + } + + // ACTIVITE COUT PAR PERSONNE + const activiteMapping = { + "dalcroze": { option: "opt_dalcroze", label: "rythmique Dalcroze", cout: 75, labelcout:"dalcroze_cout", totalKey: "cout_total_dalcroze" }, + "chant": { option: "opt_chantchoral", label: "chant choral", cout: 75, labelcout:"chant_cout", totalKey: "cout_total_chant", gratuit: 11 }, + "eveil": { option: "opt_eveil", label: "éveil musical", cout: 75, labelcout:"eveil_cout", totalKey: "cout_total_eveil" }, + "cours_collectif_suzuki_acc": { option: "opt_collectif", label: "Cours collectif Suzuki", cout: 75, labelcout:"collectif_cout", totalKey: "cout_total_collectif" }, + "atelier_mus_ens_acc": { option: "opt_ensemble", label: "Atelier musique d'ensemble", cout: 75, labelcout:"ensemble_cout", totalKey: "cout_total_ensemble" }, + "cours_particulier": { option: "opt_particulier", label: "Cours particulier", cout: 65, labelcout:"particulier_cout", totalKey: "cout_total_particulier" } + }; + + for (let i = 1; i <= 5; i++) { + let activiteKey = `personne_${toto}_activite_${i}`; + + if (req.session[activiteKey]) { + let activite = req.session[activiteKey]; + console.log(`activite = ${req.session[activiteKey]}`); + + if (activiteMapping[activite]) { + let { option, label, cout, labelcout, totalKey, gratuit } = activiteMapping[activite]; + + req.session[`personne_${toto}_${option}`] = label; + console.log(`activite label = ${req.session[`personne_${toto}_${option}`]}`); + + if (gratuit !== undefined && req.session[`personne_${toto}_age`] > gratuit) { + req.session[`personne_${toto}_${labelcout}`] = "offert"; // Gratuit pour adultes + } else { + req.session[`personne_${toto}_${labelcout}`] = cout; + req.session[totalKey] += cout; + req.session.cout_total += cout; + } + console.log(`activite cout = ${req.session[`personne_${toto}_${labelcout}`]}`); + } + } + } + + // observateur cout par personne + if (req.session["personne_"+toto+"_role"] == "observateur" && req.session["personne_"+toto+"_profil"] == "non_professeur") { + req.session["personne_"+toto+"_observation_cout"] = 30; + req.session.cout_total_observation += 30; + req.session.cout_total += 30; + nb_observateur ++; + } + + // INSTRUMENTISTE PAR PERSONNE + // TARIF DIFFÉRENT SI INSCRIPTION AVANT LE 30/04/2026 pour appliquer la réduction voir ligne // REMISE POUR INSCRIPTION AVANT lE 30 AVRIL + let date1 = new Date('2026-05-01'); + let date2 = new Date(); + if (req.session["personne_"+toto+"_role"] == "instrumentiste" || req.session["personne_"+toto+"_role"] == "instrumentiste_camp") { + if (req.session["personne_"+toto+"_instrument"]== "alto" || req.session["personne_"+toto+"_instrument"]== "violon" || req.session["personne_"+toto+"_instrument"] == "violoncelle" || req.session["personne_"+toto+"_instrument"] == "flute traversière" || req.session["personne_"+toto+"_instrument"] == "trompette" ) { + req.session["personne_"+toto+"_cours_cout"] = 280; + req.session.cout_total_cours += 280; + req.session.cout_total += 280; + if (req.session["personne_"+toto+"_option_coursindividuel"] == "cours individuel") { + if (req.session["personne_"+toto+"_cahier"]=="Cahier 1" || req.session["personne_"+toto+"_cahier"]=="Cahier 2" || req.session["personne_"+toto+"_cahier"]=="Cahier 3") { + req.session["personne_"+toto+"_coursindividuel_cout"] += 45; + req.session.cout_total_coursparticulier += 45; + req.session.cout_total += 45; + } else { + req.session["personne_"+toto+"_coursindividuel_cout"] += 65; + req.session.cout_total_coursparticulier += 65; + req.session.cout_total += 65; + } + } + if (req.session["personne_"+toto+"_option_decouvrealto"] == "decouvertealto") { + req.session["personne_"+toto+"_option_decouvrealto_cout"] += 35; + req.session.cout_total_option_decouvrealto += 35; + req.session.cout_total += 35; + } + // REMISE POUR FAMILLE NOMBREUSE + // ICI ON COMPTE LE NOMBRE D'INSTRUMENTISTE, APRÈS EN DEHORS DE LA BOUCLE PAR PERSONNE ON DÉDUIRA LA REMISE SUR LE TOTAL + nb_instrumentiste ++; + } + + if (req.session["personne_"+toto+"_instrument"]== "piano") { + + if (req.session["personne_"+toto+"_cahier"]=="Cahier 1") { + req.session["personne_"+toto+"_cours_cout"] = 300; + req.session.cout_total_cours += 300; + req.session.cout_total += 300; + } else if (req.session["personne_"+toto+"_cahier"]=="Cahier 2" || req.session["personne_"+toto+"_cahier"]=="Cahier 3" || req.session["personne_"+toto+"_cahier"]=="Cahier 4") { + req.session["personne_"+toto+"_cours_cout"] = 315; + req.session.cout_total_cours += 315; + req.session.cout_total += 315; + } else { + req.session["personne_"+toto+"_cours_cout"] = 340; + req.session.cout_total_cours += 340; + req.session.cout_total += 340; + } + // REMISE POUR FAMILLE NOMBREUSE + // ICI ON COMPTE LE NOMBRE D'INSTRUMENTISTE, APRÈS EN DEHORS DE LA BOUCLE PAR PERSONNE ON DÉDUIRA LA REMISE SUR LE TOTAL + nb_instrumentiste ++; + } + + // REMISE POUR INSCRIPTION AVANT lE 30 AVRIL + if (date2 < date1) { + req.session.cout_total_cours -= 40; + req.session["personne_"+toto+"_cours_cout"] -= 40; + req.session.cout_total -= 40; + req.session.remise = "Remise pour inscription avant le 30 avril"; + } + + // ACOMPTE + 150 PAR INSTRUMENTISTE + req.session.montant_accompte += 150; + } + + // Y-A-T-IL UN PROF INVITÉ + if (req.session["personne_"+toto+"_role"] == "prof_invite") { + nb_prof_invite ++; + } + + // COMBIEN D'ACCOMPAGNANT + if (req.session["personne_"+toto+"_role"] == "accompagnant" || req.session["personne_"+toto+"_role"] == "accompagnant_activite") { + nb_accompagnant ++; + } + } + } + } + + ///////////////////////////////// + // CAMP ADO + let compteur_ado = 0 + logger.info("compteur_ado au départ : " + compteur_ado, { numsession: req.session.id, label: filename}); + + if (adulte_trouve == "non" && req.session.hebergement == "flocons verts partagé") { + for (let toto = 1; toto < 7; toto++) { + if (req.session["personne_"+toto+"_age"] >= 14 && req.session["personne_"+toto+"_age"] < 18) { + req.session["personne_"+toto+"_profil"] = "Camp ado"; + compteur_ado ++; + logger.info("compteur_ado incrémenté : " + compteur_ado, { numsession: req.session.id, label: filename}); + } else if (req.session["personne_"+toto+"_age"] < 14) { + req.session.err_mineur = "oui"; + logger.info("err_mineur " + req.session.err_mineur, { numsession: req.session.id, label: filename}); + } + } + + ////////////////////////////////// + // VÉRIFICATION DU NOMBRE D'ADO ENCORE DISPO DANS DB + try { + + //Query + let sql = 'select campado_capacite, campado_nb_reservation from stn_stage'; + + logger.info("sql stn_stage : " + sql, { numsession: req.session.id, label: filename}); + const [results, fields] = await db_connection_promise.execute(sql); + await db_connection_promise.end(); + logger.info("TABLE stn_stage nombre de campado_capacite : " + results[0].campado_capacite, { numsession: req.session.id, label: filename}); + logger.info("TABLE stn_stage nombre de campado_nb_reservation : " + results[0].campado_nb_reservation, { numsession: req.session.id, label: filename}); + + logger.info("results[0].campado_capacite - results[0].campado_nb_reservation = " + (results[0].campado_capacite - results[0].campado_nb_reservation), { numsession: req.session.id, label: filename}); + if ((results[0].campado_capacite - results[0].campado_nb_reservation) < compteur_ado) { + req.session.err_campado_capa = "oui"; + logger.info("Il n'y a plus de place disponible pour inscrire une personne en Camp Ado", { numsession: req.session.id, label: filename}); + } + + } catch (error) { + // Echec de connection à la BD + logger.error("Il y a un problème avec la connection à la base de données! : " + error, { numsession: req.session.id, label: filename}); + req.session.err_mail_form_adhesion_1 = "Il y a un problème système connexion base de données, veuillez recommencer."; + req.session.err_mail_form_adhesion_ = error; + res.redirect('/stagenational/identifier'); + } + + } + req.session.compteur_ado = compteur_ado; + + ///////////////////////////////// + // CALCUL DU TARIF + if (req.session.err_mineur == "oui" || req.session.err_campado_capa == "oui") { + logger.info("existing session_err_mineur OR req.session.err_campado_capa : " + req.session.err_mineur + " | " + req.session.err_campado_capa, { numsession: req.session.id, label: filename}); + res.redirect('/stagenational/formulaire'); + } else { + + ////////////////////////////////// + // SUPPLÉMENT TARIF SI HÉBERGEMENT NON PARTAGÉ + if (req.session.hebergement == "flocons verts non partagé") { + logger.info("nb_personne_hebergement : " + nb_personne_hebergement, { numsession: req.session.id, label: filename}); + // Pour 1 personne (par exemple observateur) + if (nb_personne_hebergement == 1) { + req.session.cout_total += (143); + req.session.cout_total_hebergement += (143); + req.session.cout_supplement_hebergement = (143); + } + // Famille de 2 personnes + if (nb_personne_hebergement == 2) { + req.session.cout_total += (60*2); + req.session.cout_total_hebergement += (60*2); + req.session.cout_supplement_hebergement = (60*2); + } + // Famille de 3 personnes + if (nb_personne_hebergement == 3) { + req.session.cout_total += (50*3); + req.session.cout_total_hebergement += (50*3); + req.session.cout_supplement_hebergement = (50*3); + } + // Famille de 4 personnes + if (nb_personne_hebergement == 4) { + req.session.cout_total += (20*4); + req.session.cout_total_hebergement += (20*4); + req.session.cout_supplement_hebergement = (20*4); + } + logger.info("cout_supplement_hebergement : " + req.session.cout_supplement_hebergement, { numsession: req.session.id, label: filename}); + } + + ////////////////////////////////// + // REMISE POUR FAMILLE NOMBREUSE + console.log("nb_instrumentiste = ",nb_instrumentiste) + if (nb_instrumentiste == 2) { + logger.info("//REMISE POUR FAMILLE NOMBREUSE"); + req.session.cout_total -= 50; + req.session.remise += " - Remise de 50€ pour famille nombreuse (2 enfants)"; + req.session.remise_fn_montant = 50; + }; + if (nb_instrumentiste > 2) { + logger.info("//REMISE POUR FAMILLE NOMBREUSE"); + req.session.cout_total -= 100; + req.session.remise += " - Remise de 100€ pour famille nombreuse (plus de 3 enfants)"; + req.session.remise_fn_montant = 100; + }; + ////////////////////////////////// + // FRAIS DE DOSIER + + // pas de frais pour les profs invités + console.log("nb_prof_invite = ",nb_prof_invite) + if (nb_prof_invite > 0) { + req.session.frais_dossier = 0; + } else { + req.session.frais_dossier = 30; + } + req.session.cout_total += req.session.frais_dossier; + req.session.montant_accompte += req.session.frais_dossier; + + ////////////////////////////////// + // ACOMPTE + // Si acompte est de 0 on lui met 150 (par ex si c'est un observateur) + console.log("req.session.montant_accompte = ",req.session.montant_accompte) + if (req.session.montant_accompte < 150 && req.session.cout_total > 150 ) { + req.session.montant_accompte = 150; + logger.info("req.session.montant_accompte = " + req.session.montant_accompte, { numsession: req.session.id, label: filename}); + } + + ////////////////////////////////// + // FRAIS bancaire + // 1,5 % (carte standard ou 1,9% carte premium du coup moyenne des 2 : 1,7%) + 0,25 € pour l'Espace économique européen (hors UK) + console.log("req.session.montant_accompte = ",req.session.montant_accompte) + console.log("req.session.datelimitedepass = ",req.session.datelimitedepass) + if (req.session.montant_accompte > 149 && req.session.datelimitedepass === "non") { + req.session.accompte_frais_bancaire = 0.25; + req.session.accompte_frais_bancaire += req.session.montant_accompte * 0.015; + //req.session.accompte_frais_bancaire = Math.round(req.session.accompte_frais_bancaire * 100) / 100; + //req.session.accompte_frais_bancaire = Number(req.session.accompte_frais_bancaire.toFixed(2)); + req.session.accompte_frais_bancaire = Math.round(req.session.accompte_frais_bancaire); + + req.session.cout_total += req.session.accompte_frais_bancaire; + req.session.montant_accompte += req.session.accompte_frais_bancaire; + } + + // RECAP SANS ACOMPTE À PAYER + if (req.session.montant_accompte < 150 || req.session.datelimitedepass === "oui") { + logger.info("REDIRECTION VERS RÉCAP SANS ACOMPTE (montant_accompte) = " + req.session.montant_accompte, { numsession: req.session.id, label: filename}); + req.session.montant_accompte = 0; + res.redirect('/stagenational/recap'); + } + // RECAP AVEC ACOMPTE À PAYER + if (req.session.montant_accompte > 149 && req.session.datelimitedepass === "non") { + logger.info("REDIRECTION VERS RÉCAP AVEC ACOMPTE (montant_accompte) = " + req.session.montant_accompte, { numsession: req.session.id, label: filename}); + res.redirect('/stagenational/recap'); + } + } + } else { + logger.info("Votre session est terminé 'onpeutcontinuer' : " + req.session.onpeutcontinuer, { numsession: req.session.id }); + req.session.err_mail_form_adhesion_1 = 'Votre session est terminée ("onpeutcontinuer" = non), veuillez recommencer.'; + res.redirect('/stagenational/identifier'); + } +} + +///////////////////////////////////////////////// +// EXPORT DE MODULE POUR QU'IL SOIT LU DANS LES AUTRES FICHIERS JS +///////////////////////////////////////////////// + +module.exports = { + SN_checkinfos +} \ No newline at end of file diff --git a/controllers/stage_national/stn_identifierController.js b/controllers/stage_national/stn_identifierController.js new file mode 100644 index 0000000..cdb6c60 --- /dev/null +++ b/controllers/stage_national/stn_identifierController.js @@ -0,0 +1,169 @@ +///////////////////////////////////////////////// +// APPELS DES MODULES +///////////////////////////////////////////////// +const path = require("path"); + +///////////////////////////////////////////////// +// APPELS DES MODULES PERSOS +///////////////////////////////////////////////// +// loggings +const logger = require("../../public/js/app/logger_stagenat"); +// DB +const { connect_DB_promise } = require('../../modules/db/databaseconnect'); +// VÉRIF CODE SECRET +const { verif_codesecret } = require('../../modules/verif_codesecret'); + + +// recherche si identifiant saisie est bien dans la base de données des adhérents +const { checkAdherent } = require('./../../modules/db/checkAdherent'); + + +//////////////////////////////////////////////////// +// FILE NAME +//////////////////////////////////////////////////// +const filename = path.parse(__filename).base; + + +///////////////////////////////////////////////// +// PAGE 1 +// DOMAIN/stagenational/identifier +// +// SAISIE DE L'IDENTIFIANT : ON LE VÉRIFIE : +// - RECHERCHE SI PERSONNE DÉJA INSCRITE +// - SI NON INSCRITE +// -RECHERCHE SI ADHÉRENTE DANS BD AFPS +// +///////////////////////////////////////////////// + +async function SN_checkidentifiant(req, res) { + + logger.info("======================================", { label: filename }); + logger.info("======== FUNCTION SN_checkidentifiant (STAGE) ==========", { 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}); + req.session.code_secret = req.body.code_secret; + + // 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 stage, 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('/stagenational/identifier'); + } + if (!req.body.identifiant && req.body.check_nonadherent) { + req.session.err_mail_form_adhesion_1 = "Pour vous inscrire au stage, 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('/stagenational/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('/stagenational/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 STAGE TABLE stn_adherent + // CONNECTION DB PROMISE + try { + //Connexion + const db_connection_promise = await connect_DB_promise(); + + // DATE LIMITE DEPASSÉE + // on regarde d'abord s'il a le bon code secret + // et ensuite s'il est déjà inscrit au stage ou pas + + await verif_codesecret(req, res); + logger.info("req.session.onpeutcontinuer : " + req.session.onpeutcontinuer , { numsession: req.session.id, label: filename}); + + + if (req.session.onpeutcontinuer === "oui") { + // VÉRIFICATION DÉJA INSCRIT AU STAGE OU PAS + let sql = 'select identifiant, association_suzuki, adherent_mail from stn_adherent where identifiant = "' + req.session.identifiant + '" AND statut_suppression = 0'; + + logger.info("sql stn_adherent : " + sql, { numsession: req.session.id, label: filename}); + const [results_checkStagiaire, fields] = await db_connection_promise.execute(sql); + await db_connection_promise.end(); + + if (results_checkStagiaire.length) { + // DÉJA INSCRIT AU stage + // 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 stage national."; + res.redirect('/stagenational/identifier'); + + } else { + // NON INSCRIT AU stage + logger.info("Identifant non inscrit au stage : "+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('/stagenational/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_3 = "Il y a un problème système connexion base de données, veuillez recommencer." + retour_checkAdherent.error; + res.redirect('/stagenational/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('/stagenational/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 stage. 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('/stagenational/identifier'); + } + } + + + } + } else { + logger.info("Votre session est terminé 'onpeutcontinuer' : " + req.session.onpeutcontinuer, { numsession: req.session.id }); + //req.session.err_mail_form_adhesion_3 = 'Votre session est terminée ("onpeutcontinuer" = non), veuillez recommencer.'; + res.redirect('/stagenational/identifier'); + } + + } catch (error) { + // Echec de connection à la BD + logger.error("Il y a un problème avec la connection à la base de données stn_adherent ! : " + error, { numsession: req.session.id }); + req.session.err_mail_form_adhesion_3 = "Il y a un problème système connexion base de données, veuillez recommencer."; + res.redirect('/stagenational/identifier'); + } + + } + + + + +} + +///////////////////////////////////////////////// +// EXPORT DE MODULE POUR QU'IL SOIT LU DANS LES AUTRES FICHIERS JS +///////////////////////////////////////////////// + +module.exports = { + SN_checkidentifiant +} \ No newline at end of file diff --git a/controllers/stage_national/stn_payeracompteController.js b/controllers/stage_national/stn_payeracompteController.js new file mode 100644 index 0000000..12287bf --- /dev/null +++ b/controllers/stage_national/stn_payeracompteController.js @@ -0,0 +1,223 @@ +///////////////////////////////////////////////// +// APPELS DES MODULES +///////////////////////////////////////////////// +const path = require("path"); +// CALCUL DE DATE +const moment = require('moment'); +// STRIPE +const stripe = require('stripe')(process.env.STRIPE_STN_PRIVATE_KEY); + +///////////////////////////////////////////////// +// APPELS DES MODULES PERSOS +///////////////////////////////////////////////// +// loggings +const logger = require("../../public/js/app/logger_stagenat"); +// DB +const { connect_DB_promise } = require('../../modules/db/databaseconnect'); +// VÉRIF CODE SECRET +const { verif_codesecret } = require('../../modules/verif_codesecret'); + +//////////////////////////////////////////////////// +// FILE NAME +//////////////////////////////////////////////////// +const filename = path.parse(__filename).base; + +///////////////////////////////////////////////// +// PAGE 3 - clic sur payer acompte +// DOMAIN/stagenational/recap +// +// Ajout informations base de données +// +///////////////////////////////////////////////// + +const post_payer_accompte = async function(req, res, next) { + + logger.info("======================================"); + logger.info("======== FUNCTION post_payer_acompte (STAGE) =========="); + logger.info("======================================"); + + ///////////////////////////////////////////////// + // VARIABLES + ///////////////////////////////////////////////// + let saison = "2025/2026"; + moment.locale('fr'); + let now = moment().format("YYYY-MM-DD HH:mm:ss"); + let sql; + let table; + let champs; + let values; + + // SI DATE LIMITE D'INSCRIPTION DÉPASSÉE ON vérifie que le code secret est bien ok + await verif_codesecret(req, res); + logger.info("req.session.onpeutcontinuer : " + req.session.onpeutcontinuer , { numsession: req.session.id, label: filename}); + + if (req.session.onpeutcontinuer === "oui") { + ///////////////////////////////////////////////// + // 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('/stagenational/identifier'); + } else { + + ///////////////////////////////////////////////// + // AJOUT DANS LA BASE DE DONNÉES + ///////////////////////////////////////////////// + + 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 stn_participant + table = "stn_participant"; + champs = ` + identifiant, date_maj, stn_part_nom, stn_part_prenom, prise_charge_famille, + stn_part_date_naiss, stn_part_age, stn_part_profilage, stn_role, stn_profil, + stn_transport, stn_arret, instrument, instrument_ensemble, instrument_collectif, cahier, piece, + prof_nom, prof_mail, concert_solo_piece, concert_solo_cahier, cours_individuel, + decouverte_alto, option_choral, option_rythmique, option_eveil, option_collectif, + option_ensemble, option_particulier, cout_hebergement, cout_transport, eveil_cout, + dalcroze_cout, collectif_cout, ensemble_cout, particulier_cout, observation_cout, + cours_cout, coursindividuel_cout, decouvrealto_cout, chant_cout, statut_suppression + `; + values = ` + "${req.session.identifiant}", "${now}", "${req.session[`personne_${toto}_nom`]}", + "${req.session[`personne_${toto}_prenom`]}", "${req.session[`personne_${toto}_prise_charge_nom`]}", + "${req.session[`personne_${toto}_datenaissance`]}", "${req.session[`personne_${toto}_age`]}", + "${req.session[`personne_${toto}_profilage`]}", "${req.session[`personne_${toto}_role`]}", + "${req.session[`personne_${toto}_profil`]}", "${req.session[`personne_${toto}_transport_mode`]}", + "${req.session[`personne_${toto}_transport_arret`]}", "${req.session[`personne_${toto}_instrument`]}", + "${req.session[`personne_${toto}_instrument_ensemble`]}", "${req.session[`personne_${toto}_instrument_collectif`]}", "${req.session[`personne_${toto}_cahier`]}", + "${req.session[`personne_${toto}_piece`]}", "${req.session[`personne_${toto}_prof`]}", + "${req.session[`personne_${toto}_mail_prof`]}", "${req.session[`personne_${toto}_option_concertsolo_piece`]}", + "${req.session[`personne_${toto}_option_concertsolo_cahier`]}", "${req.session[`personne_${toto}_option_coursindividuel`]}", + "${req.session[`personne_${toto}_option_decouvrealto`]}", "${req.session[`personne_${toto}_opt_chantchoral`]}", + "${req.session[`personne_${toto}_opt_dalcroze`]}", "${req.session[`personne_${toto}_opt_eveil`]}", + "${req.session[`personne_${toto}_opt_collectif`]}", "${req.session[`personne_${toto}_opt_ensemble`]}", + "${req.session[`personne_${toto}_opt_particulier`]}", "${req.session[`personne_${toto}_cout_hebergement`]}", + "${req.session[`personne_${toto}_cout_transport`]}", "${req.session[`personne_${toto}_eveil_cout`]}", + "${req.session[`personne_${toto}_dalcroze_cout`]}", "${req.session[`personne_${toto}_collectif_cout`]}", + "${req.session[`personne_${toto}_ensemble_cout`]}", "${req.session[`personne_${toto}_particulier_cout`]}", + "${req.session[`personne_${toto}_observation_cout`]}", "${req.session[`personne_${toto}_cours_cout`]}", + "${req.session[`personne_${toto}_coursindividuel_cout`]}", "${req.session[`personne_${toto}_option_decouvrealto_cout`]}", + "${req.session[`personne_${toto}_chant_cout`]}", 0 + `; + sql = 'INSERT INTO ' + table + ' (' + champs + ') VALUES (' + values + ')'; + + const [results_stn_participant, fields] = await db_connection_promise.execute(sql); + logger.info("stn_participant Row ID added : " + results_stn_participant.insertId, { numsession: req.session.id, label: filename}); + } + } + + ///////////////////////////////////////////////// + // AJOUT DB INFORMATIONS ADHÉRENTS + + // QUERY ADD stn_adherent + + table = "stn_adherent"; + + champs = ` + 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, + stn_hebergement, stn_commentaire, acompte_initial, cout_hebergement, cout_transport, + cout_cours, cout_coursparticulier, cout_decouvertealto, cout_option_surplace, + cout_chantchoral, cout_dalcroze, cout_total_collectif, cout_total_ensemble, + cout_total_particulier, cout_eveil, cout_observation, frais_dossier, frais_bancaire, + remise_famille_nombreuse, cout_total, statut_reservation, statut_suppression + `; + + values = ` + "${req.session.identifiant}", "${req.session.association_suzuki}", "${saison}", "${now}", + "${req.session.adherent_nom}", "${req.session.adherent_prenom}", "${req.session.adherent_telephone}", + "${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.hebergement}", "${req.session.commentaire_adherent}", ${req.session.montant_accompte}, + ${req.session.cout_total_hebergement}, ${req.session.cout_total_transport}, ${req.session.cout_total_cours}, + ${req.session.cout_total_coursparticulier}, ${req.session.cout_total_option_decouvrealto}, + ${req.session.cout_total_dalcroze_surplace}, ${req.session.cout_total_chant}, ${req.session.cout_total_dalcroze}, + ${req.session.cout_total_collectif}, ${req.session.cout_total_ensemble}, ${req.session.cout_total_particulier}, + ${req.session.cout_total_eveil}, ${req.session.cout_total_observation}, ${req.session.frais_dossier}, + ${req.session.accompte_frais_bancaire}, ${req.session.remise_fn_montant}, ${req.session.cout_total}, "attente", 0 + `; + + sql = `INSERT INTO ${table} (${champs}) VALUES (${values})`; + + const [results_stn_adherent, fields] = await db_connection_promise.execute(sql); + + logger.info("stn_adherent Row ID added : " + results_stn_adherent.insertId, { numsession: req.session.id, label: filename}); + + await db_connection_promise.end(); + + if (req.session.montant_accompte > 100) { + ///////////////////////////////////////////////// + // 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, compteur_ado: req.session.compteur_ado, code_secret: req.session.code_secret}, + customer_email: req.session.adherent_mail, + + submit_type: 'pay', + + success_url: process.env.STRIPE_SN_SUCCESSURL, + cancel_url: process.env.STRIPE_SN_CANCELURL, + + payment_method_types: ['card'], + line_items: [{ + price_data: { + currency: 'eur', + product_data: { + name: 'Stage national AFPS acompte', + }, + unit_amount: req.session.montant_accompte * 100, + }, + quantity: 1, + },], + //Checkout has three modes: payment, subscription, or setup. + mode: 'payment' + + }); + res.redirect(session.url) + } + + if (req.session.montant_accompte < 100) { + res.redirect('/stagenational/paiement_reussi'); + } + + + + } catch (error) { + // Echec de connection à la BD + logger.error("Il y a un problème avec la connection à la base de données! : " + error, { numsession: req.session.id, label: filename}); + 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('/stagenational/identifier'); + } + + } + + } else { + req.session.err_mail_form_adhesion_1 = 'Votre session est terminée ("onpeutcontinuer" = non), veuillez recommencer.'; + res.redirect('/stagenational/identifier'); + } +} + + +///////////////////////////////////////////////// +// EXPORT DE MODULE POUR QU'IL SOIT LU DANS LES AUTRES FICHIERS JS +///////////////////////////////////////////////// + +module.exports = { + post_payer_accompte +} \ No newline at end of file diff --git a/controllers/stage_national/stn_retourstripeController.js b/controllers/stage_national/stn_retourstripeController.js new file mode 100644 index 0000000..4a60cd2 --- /dev/null +++ b/controllers/stage_national/stn_retourstripeController.js @@ -0,0 +1,910 @@ +///////////////////////////////////////////////// +// APPELS DES MODULES +///////////////////////////////////////////////// +const path = require("path"); +// CALCUL DE DATE +const moment = require('moment'); +// CONNECTION BASE DE DONNÉES +const mysql_promise = require('mysql2/promise'); +// STRIPE +const stripe = require('stripe')(process.env.STRIPE_STN_PRIVATE_KEY); + +///////////////////////////////////////////////// +// APPELS DES MODULES PERSOS +///////////////////////////////////////////////// +// loggings +const logger = require("../../public/js/app/logger_stagenat"); +// DB +const { connect_DB_promise } = require('../../modules/db/databaseconnect'); + +//////////////////////////////////////////////////// +// FILE NAME +//////////////////////////////////////////////////// +const filename = path.parse(__filename).base; + +///////////////////////////////////////////////// +// APPELS DES FONCTIONS +///////////////////////////////////////////////// +const envoie_mail = require("./../../modules/envoie_mail"); + +///////////////////////////////////////////////// +// GOOGLE SHEET PARAMETERS +///////////////////////////////////////////////// +const { GoogleSpreadsheet } = require('google-spreadsheet'); +const GS_creds_stagean = require('../../inscriptionsafps-53b60452f63d.json'); +const { error, log } = require("console"); +const GS_stagean = new GoogleSpreadsheet(process.env.gsheet_stagenat); + + +///////////////////////////////////////////////// +// PAGE 4 - RETOUR PAIEMENT REUSSI +// DOMAIN/stagenational/paiement_reussi?id={CHECKOUT_SESSION_ID} +// +// +///////////////////////////////////////////////// + +const SN_accompte_reussi = async function(req, res){ + + logger.info("======================================", { label: filename }); + logger.info("======== FUNCTION SN_accompte_reussi (STAGE) ==========", { label: filename }); + logger.info("======================================", { label: filename }); + + // VARIABLES + let compteur_ado; + let CB_retour; + let stripe_retour; + let pasdecodesecret; + + // DATE + moment().format(); + moment.locale('fr'); + let now = moment().format("YYYY-MM-DD HH:mm:ss"); + + + if (req.session.montant_accompte < 100) { + logger.info("req.session.montant_accompte : " + req.session.montant_accompte, { numsession: req.session.id, label: filename}); + } else { + ////////////////////////////////////////////////////////////////////////////// + // 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; + if (session_stripe.metadata.code_secret) { + req.session.code_secret = session_stripe.metadata.code_secret; + pasdecodesecret = "non"; + } else { + pasdecodesecret = "oui"; + } + logger.info("pasdecodesecret : " + pasdecodesecret, { numsession: req.session.id, label: filename}); + req.session.identifiant = identifiant; + compteur_ado = session_stripe.metadata.compteur_ado; + CB_retour = "identifiant_adherent:"+identifiant+",payment_status:"+payment_status+",stripe_customer:"+stripe_customer+",stripe_payment_intent:"+stripe_payment_intent+",sessionID:"+session_stripe.id+",payment_method_types:"+payment_method_types+",amount_total:"+amount_total+",stripe_status:"+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}); + } + + logger.info("req.session.code_secret : " + req.session.code_secret, { numsession: req.session.id, label: filename}); + + ////////////////////////////////////////////////////////////////////////////// + // MAJ infos paiements DB + // CODE_SECRET MAJ utilisé + ///////////////////////////////////////////////// + + // 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, veuiller redémarrer votre navigateur."; + res.redirect('/stagenational/identifier'); + } else { + + //Query MAJ infos paiements DB + + try { + let db_connection_promise = await connect_DB_promise(); + + // Query MAJ stn_adherent + let sql = 'UPDATE '; + sql += 'stn_adherent'; + sql += ' SET '; + if (req.session.montant_accompte < 100) { + sql += 'statut_paiement_acompte = "sans_acompte", '; + } else { + sql += 'stripe_retour = "' + CB_retour + '", '; + sql += 'statut_paiement_acompte = "paye", '; + } + sql += 'statut_reservation = "confirme"'; + sql += ' WHERE identifiant = "' + req.session.identifiant + '" AND statut_suppression = 0'; + + //logger.info("sql UPDATE stn_adherent : " + sql, { numsession: req.session.id, label: filename}); + + const [results, fields] = await db_connection_promise.execute(sql); + logger.info("Row stn_adherent UPDATE payé: " + results.changedRows, { numsession: req.session.id, label: filename}); + + // Query MAJ Compteur ado stn_stage + + let sql1 = 'UPDATE '; + sql1 += 'stn_stage'; + sql1 += ' SET '; + if (req.session.montant_accompte < 100) { + sql1 += 'campado_nb_reservation = campado_nb_reservation + ' + req.session.compteur_ado + ''; + } else { + sql1 += 'campado_nb_reservation = campado_nb_reservation + ' + compteur_ado + ''; + } + + const [results1, fields1] = await db_connection_promise.execute(sql1); + logger.info("Row stn_stage UPDATE compteur ado: " + results1.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 += 'stn_adherent'; + sql2 += ' WHERE identifiant = "' + req.session.identifiant + '" AND statut_suppression = 0'; + const [results2, fields2] = await db_connection_promise.execute(sql2); + logger.info("Row stn_adherent SELECT : " + results2.length, { numsession: req.session.id, label: filename}); + + // participants + let sql3 = 'SELECT stn_adherent.identifiant, stn_adherent.association_suzuki, stn_adherent.saison, stn_adherent.date_maj, stn_adherent.adherent_nom, stn_adherent.adherent_prenom, stn_adherent.adherent_telephone, stn_adherent.adherent_mail, stn_adherent.stn_hebergement, stn_adherent.cout_hebergement, stn_participant.ID_participant, stn_participant.stn_part_nom, stn_participant.stn_part_prenom, stn_participant.prise_charge_famille, stn_participant.stn_part_date_naiss, stn_participant.stn_part_age, stn_participant.stn_part_profilage, stn_participant.stn_role, stn_participant.stn_profil, stn_participant.stn_transport, stn_participant.stn_arret, stn_participant.instrument, stn_participant.instrument_ensemble, stn_participant.instrument_collectif, stn_participant.cahier, stn_participant.piece, stn_participant.prof_nom, stn_participant.prof_mail, stn_participant.concert_solo_piece, stn_participant.concert_solo_cahier, stn_participant.cours_individuel, stn_participant.decouverte_alto, stn_participant.option_choral, stn_participant.option_rythmique, stn_participant.option_eveil, stn_participant.option_collectif, stn_participant.option_ensemble, stn_participant.option_particulier, stn_participant.cout_hebergement, stn_participant.cout_transport, stn_participant.cours_cout, stn_participant.eveil_cout, stn_participant.dalcroze_cout, stn_participant.collectif_cout, stn_participant.ensemble_cout, stn_participant.particulier_cout, stn_participant.observation_cout, stn_participant.coursindividuel_cout, stn_participant.decouvrealto_cout, stn_participant.chant_cout FROM stn_participant JOIN stn_adherent ON stn_participant.identifiant = stn_adherent.identifiant WHERE stn_participant.identifiant = "' + req.session.identifiant + '" AND stn_participant.statut_suppression = 0'; + const [results3, fields3] = await db_connection_promise.execute(sql3); + logger.info("Row stn_participant SELECT nombre de participants : " + results3.length, { numsession: req.session.id, label: filename}); + + + // QUERY MAJ CODE SECRET = "utilise" + if (pasdecodesecret === "oui") { + logger.info("PAS DE CODE SECRET", { numsession: req.session.id, label: filename}); + } else { + let sql_codesecret = 'UPDATE '; + sql_codesecret += 'code'; + sql_codesecret += ' SET '; + sql_codesecret += 'date_suppression = "' + now +'", '; + sql_codesecret += 'statut = "utilise"'; + sql_codesecret += ' WHERE code = "' + req.session.code_secret + '"'; + logger.info("sql_codesecret : " + sql_codesecret, { numsession: req.session.id, label: filename}); + const [resultscodesecret, fieldscodesecret] = await db_connection_promise.execute(sql_codesecret); + await db_connection_promise.end(); + logger.info("Row code secret update : " + resultscodesecret.changedRows, { 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; + + if (results2[0].stn_hebergement == 'flocons verts partagé') { + res.locals.hebergement = "Centre les Flocons Verts - hébergement partagé"; + } + if (results2[0].stn_hebergement == 'flocons verts non partagé') { + res.locals.hebergement = "Centre les Flocons Verts - hébergement non partagé"; + res.locals.cout_total_hebergement = results2[0].cout_hebergement; + } + if (results2[0].stn_hebergement == 'independant') { + res.locals.hebergement = "indépendant"; + } + + for (let toto = 0; toto<(results3.length); toto++) { + + if (results3[toto].prise_charge_famille === "undefined") {results3[toto].prise_charge_famille = ""}; + if (results3[toto].instrument_ensemble === "undefined") {results3[toto].instrument_ensemble = ""}; + if (results3[toto].instrument_collectif === "undefined") {results3[toto].instrument_collectif = ""}; + + + res.locals[`personne_${toto}_numero`] = toto + 1; + res.locals[`personne_${toto}_nom`] = results3[toto].stn_part_nom; + + if (results3[toto].prise_charge_famille) { + res.locals[`personne_${toto}_prise_charge_nom`] = results3[toto].prise_charge_famille; + } + + res.locals[`personne_${toto}_prenom`] = results3[toto].stn_part_prenom; + + logger.info(`Participant prénom : ${results3[toto].stn_part_prenom}`, { + numsession: req.session.id, + label: filename + }); + + res.locals[`personne_${toto}_profilage`] = results3[toto].stn_part_profilage; + + // AFFICHER ACTIVITÉ + if (results3[toto].stn_role === 'accompagnant_activite_enfant') { + res.locals[`personne_${toto}_role`] = "Accompagnant enfant avec activité"; + } else if (results3[toto].stn_role === 'accompagnant') { + res.locals[`personne_${toto}_role`] = "accompagnant sans activité"; + } else if (results3[toto].stn_role === 'accompagnant_activite_adulte') { + res.locals[`personne_${toto}_role`] = "accompagnant adulte avec activité"; + } else if (results3[toto].stn_role === 'instrumentiste_camp') { + res.locals[`personne_${toto}_role`] = "instrumentiste"; + } else if (results3[toto].stn_role === 'prof_invite') { + res.locals[`personne_${toto}_role`] = "professeur invité"; + } else { + res.locals[`personne_${toto}_role`] = results3[toto].stn_role; + } + + if (results3[toto].stn_profil === 'professeur') { + res.locals[`personne_${toto}_profil`] = "professeur"; + } else if (results3[toto].stn_profil === 'non_professeur') { + res.locals[`personne_${toto}_profil`] = "accompagnant"; + } else if (results3[toto].stn_profil === 'Camp ado') { + res.locals[`personne_${toto}_profil`] = "Camp ado"; + } + + // AFFICHER MODE DE TRANSPORT + if (results3[toto].stn_transport === 'independant') { + res.locals[`personne_${toto}_transport_mode`] = "indépendant"; + } else { + res.locals[`personne_${toto}_transport_mode`] = "car"; + } + + if (results3[toto].stn_arret === 'arret_7_quai_lassagne_lyon') { + res.locals[`personne_${toto}_transport_arret`] = "7 quai Lassagne Lyon"; + } else if (results3[toto].stn_arret === 'arret_partdieu_lyon') { + res.locals[`personne_${toto}_transport_arret`] = "Gare Part Dieu Lyon"; + } + + // AFFICHER INSTRUMENT + res.locals[`personne_${toto}_instrument`] = results3[toto].instrument; + res.locals[`personne_${toto}_instrument_ensemble`] = results3[toto].instrument_ensemble; + res.locals[`personne_${toto}_instrument_collectif`] = results3[toto].instrument_collectif; + res.locals[`personne_${toto}_cahier`] = results3[toto].cahier; + res.locals[`personne_${toto}_option_concertsolo_cahier`] = results3[toto].concert_solo_cahier; + res.locals[`personne_${toto}_option_concertsolo_piece`] = results3[toto].concert_solo_piece; + res.locals[`personne_${toto}_option_decouvrealto`] = results3[toto].decouverte_alto; + + // OPTIONS + res.locals[`personne_${toto}_dalcroze`] = results3[toto].option_rythmique; + res.locals[`personne_${toto}_choral`] = results3[toto].option_choral; + res.locals[`personne_${toto}_eveil`] = results3[toto].option_eveil; + res.locals[`personne_${toto}_collectif`] = results3[toto].option_collectif; + res.locals[`personne_${toto}_ensemble`] = results3[toto].option_ensemble; + res.locals[`personne_${toto}_particulier`] = results3[toto].option_particulier; + + // AFFICHER COUT + res.locals[`personne_${toto}_cout_hebergement`] = results3[toto].cout_hebergement; + res.locals[`personne_${toto}_cout_transport`] = results3[toto].cout_transport; + res.locals[`personne_${toto}_eveil_cout`] = results3[toto].eveil_cout; + res.locals[`personne_${toto}_collectif_cout`] = results3[toto].collectif_cout; + res.locals[`personne_${toto}_ensemble_cout`] = results3[toto].ensemble_cout; + res.locals[`personne_${toto}_particulier_cout`] = results3[toto].particulier_cout; + res.locals[`personne_${toto}_dalcroze_cout`] = results3[toto].dalcroze_cout; + res.locals[`personne_${toto}_chant_cout`] = results3[toto].chant_cout; + res.locals[`personne_${toto}_observation_cout`] = results3[toto].observation_cout; + res.locals[`personne_${toto}_cours_cout`] = results3[toto].cours_cout; + res.locals[`personne_${toto}_coursindividuel_cout`] = results3[toto].coursindividuel_cout; + res.locals[`personne_${toto}_option_decouvrealto_cout`] = results3[toto].decouvrealto_cout; + + + } + res.locals.cout_total = results2[0].cout_total; + res.locals.frais_dossier = results2[0].frais_dossier; + res.locals.remise = results2[0].remise_famille_nombreuse; + res.locals.accompte_frais_bancaire = results2[0].frais_bancaire; + res.locals.montant_accompte = results2[0].acompte_initial; + + + + ////////////////////////////////////////////////////////////////////////////// + // AJOUT INFOS DANS GOOGLE SHEET + + try { + await GS_stagean.useServiceAccountAuth(GS_creds_stagean); + await GS_stagean.loadInfo(); + let GS_stagean_Adherents = GS_stagean.sheetsByTitle['Adherents']; + let GS_stagean_Paiements = GS_stagean.sheetsByTitle['Paiements']; + let GS_stagean_Car = GS_stagean.sheetsByTitle['Car']; + let GS_stagean_Flocons_verts = GS_stagean.sheetsByTitle['Flocons_verts']; + let GS_stagean_CampAdo = GS_stagean.sheetsByTitle['CampAdo']; + let GS_stagean_professeurs = GS_stagean.sheetsByTitle['Professeurs']; + let GS_stagean_Inscription_cours = GS_stagean.sheetsByTitle['Inscription_cours']; + + logger.info("identifiant stocké from stripe avant insert GS : " + req.session.identifiant, { numsession: req.session.id, label: filename}); + + await GS_stagean_Adherents.addRows ( + [ + { + ID_adherent: results2[0].ID_adherent, + saison: results2[0].saison, + date: moment(results2[0].date_maj).format("YYYY-MM-DD HH:mm:ss"), + identifiant: req.session.identifiant, + association_suzuki: results2[0].association_suzuki, + 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].stn_commentaire + } + ] + ); + + if (results2[0].cout_total > 0) { + await GS_stagean_Paiements.addRows ( + [ + { + ID_adherent: results2[0].ID_adherent, + date: moment(results2[0].date_maj).format("YYYY-MM-DD HH:mm:ss"), + identifiant: req.session.identifiant, + adherent_nom: results2[0].adherent_nom.toUpperCase(), + adherent_prenom: results2[0].adherent_prenom, + adherent_mail: results2[0].adherent_mail, + cout_hebergement: results2[0].cout_hebergement, + cout_transport: results2[0].cout_transport, + cout_cours: results2[0].cout_cours, + cout_coursparticulier: results2[0].cout_coursparticulier, + cout_decouvertealto: results2[0].cout_decouvertealto, + cout_chantchoral: results2[0].cout_chantchoral, + cout_dalcroze: results2[0].cout_dalcroze, + cout_eveil: results2[0].cout_eveil, + cout_cours_collectif: results2[0].cout_total_collectif, + cout_atelier_ensemble: results2[0].cout_total_ensemble, + cout_cour_part_acc: results2[0].cout_total_particulier, + cout_option_surplace: results2[0].cout_option_surplace, + cout_observation: results2[0].cout_observation, + remise_famille_nombreuse: results2[0].remise_famille_nombreuse, + frais_dossier: results2[0].frais_dossier, + frais_bancaire: parseFloat(results2[0].frais_bancaire), + acompte_initial: parseFloat(results2[0].acompte_initial), + statut_paiement_acompte: results2[0].statut_paiement_acompte, + cout_total: parseFloat(results2[0].cout_total) + } + ] + ); + } + + let ajout_gs_Car = []; + let car_trouve = ""; + for (let i = 0; i < results3.length; i++) { + if (results3[i].stn_transport === "car") { + ajout_gs_Car.push({ + ID_participant: results3[i].ID_participant, + date: moment(results2[0].date_maj).format("YYYY-MM-DD HH:mm:ss"), + identifiant: req.session.identifiant, + participant_nom: results3[i].stn_part_nom.toUpperCase(), + participant_prenom: results3[i].stn_part_prenom, + participant_profilage: results3[i].stn_part_profilage, + adherent_mail: results3[i].adherent_mail, + adherent_telephone: "'" + results3[i].adherent_telephone, + arret: results3[i].stn_arret + }); + car_trouve = "oui"; + } + + } + if (car_trouve === "oui") { await GS_stagean_Car.addRows(ajout_gs_Car);} + + let ajout_gs_Flocons_verts = []; + let fv_trouve = ""; + for (let i = 0; i < results3.length; i++) { + if (results3[i].stn_hebergement === "flocons verts partagé" || results3[i].stn_hebergement === "flocons verts non partagé") { + if (results3[i].stn_profil === "undefined") {results3[i].stn_profil = ""}; + //calcul tranche âge correspondantes aux pré-requis des Flocons verts + let fv_tranche_age = ""; + let fv_type_hebergement = ""; + if (results3[i].stn_hebergement === "flocons verts partagé") {fv_type_hebergement = "partagé"}; + if (results3[i].stn_hebergement === "flocons verts non partagé") {fv_type_hebergement = "non partagé"}; + if (results3[i].stn_part_age < 11) {fv_tranche_age = "- 11 ans"}; + if (results3[i].stn_part_age > 10) {fv_tranche_age = "+ 11 ans"}; + ajout_gs_Flocons_verts.push({ + ID_participant: results3[i].ID_participant, + date: moment(results2[0].date_maj).format("YYYY-MM-DD HH:mm:ss"), + identifiant: req.session.identifiant, + participant_nom: results3[i].stn_part_nom.toUpperCase(), + participant_prenom: results3[i].stn_part_prenom, + participant_age: results3[i].stn_part_age, + participant_tranche_age: "'" + fv_tranche_age, + adherent_mail: results3[i].adherent_mail, + adherent_telephone: "'" + results3[i].adherent_telephone, + role: results3[i].stn_role, + profil: results3[i].stn_profil, + type_hebergement: fv_type_hebergement + }); + fv_trouve = "oui"; + } + } + if (fv_trouve === "oui") { await GS_stagean_Flocons_verts.addRows(ajout_gs_Flocons_verts);} + + let ajout_gs_CampAdo = []; + let campado_trouve; + for (let i = 0; i < results3.length; i++) { + if (results3[i].stn_profil === "Camp ado") { + ajout_gs_CampAdo.push({ + ID_participant: results3[i].ID_participant, + date: moment(results2[0].date_maj).format("YYYY-MM-DD HH:mm:ss"), + identifiant: req.session.identifiant, + participant_nom: results3[i].stn_part_nom.toUpperCase(), + participant_prenom: results3[i].stn_part_prenom, + participant_age: results3[i].stn_part_age, + adherent_mail: results3[i].adherent_mail, + adherent_telephone: "'" + results3[i].adherent_telephone + }); + campado_trouve = "oui"; + } + } + if (campado_trouve === "oui") { await GS_stagean_CampAdo.addRows(ajout_gs_CampAdo);} + + let ajout_gs_professeurs = []; + let professeurs_trouve = ""; + for (let i = 0; i < results3.length; i++) { + if (results3[i].stn_role === "observateur" || results3[i].stn_role === "prof_invite") { + if (results3[i].stn_profil === "undefined") {results3[i].stn_profil = ""}; + ajout_gs_professeurs.push({ + ID_participant: results3[i].ID_participant, + date: moment(results2[0].date_maj).format("YYYY-MM-DD HH:mm:ss"), + identifiant: req.session.identifiant, + participant_nom: results3[i].stn_part_nom.toUpperCase(), + participant_prenom: results3[i].stn_part_prenom, + participant_profilage: results3[i].stn_part_profilage, + adherent_mail: results3[i].adherent_mail, + adherent_telephone: "'" + results3[i].adherent_telephone, + role: results3[i].stn_role, + profil: results3[i].stn_profil + }); + professeurs_trouve = "oui"; + } + + } + if (professeurs_trouve === "oui") { await GS_stagean_professeurs.addRows(ajout_gs_professeurs);} + + + let ajout_gs_Inscription_cours = []; + let cours_trouve = ""; + for (let i = 0; i < results3.length; i++) { + if (results3[i].stn_role !== "accompagnant" && results3[i].stn_role !== "observateur" && results3[i].stn_role !== "prof_invite") { + if (results3[i].stn_profil === "undefined") {results3[i].stn_profil = ""}; + if (results3[i].instrument === "undefined") {results3[i].instrument = ""}; + if (results3[i].instrument_ensemble === "undefined") {results3[i].instrument_ensemble = ""}; + if (results3[i].instrument_collectif === "undefined") {results3[i].instrument_collectif = ""}; + if (results3[i].cahier === "undefined") {results3[i].cahier = ""}; + if (results3[i].piece === "undefined") {results3[i].piece = ""}; + if (results3[i].prof_nom === "undefined") {results3[i].prof_nom = ""}; + if (results3[i].prof_mail === "undefined") {results3[i].prof_mail = ""}; + if (results3[i].concert_solo_piece === "undefined") {results3[i].concert_solo_piece = ""}; + if (results3[i].concert_solo_cahier === "undefined") {results3[i].concert_solo_cahier = ""}; + if (results3[i].cours_individuel === "undefined") {results3[i].cours_individuel = ""}; + if (results3[i].cours_individuel === "non") {results3[i].cours_individuel = ""}; + if (results3[i].decouverte_alto === "undefined") {results3[i].decouverte_alto = ""}; + if (results3[i].decouverte_alto === "non") {results3[i].decouverte_alto = ""}; + if (results3[i].option_choral === "undefined") {results3[i].option_choral = ""}; + if (results3[i].option_rythmique === "undefined") {results3[i].option_rythmique = ""}; + if (results3[i].option_eveil === "undefined") {results3[i].option_eveil = ""}; + if (results3[i].option_collectif === "undefined") {results3[i].option_collectif = ""}; + if (results3[i].option_ensemble === "undefined") {results3[i].option_ensemble = ""}; + if (results3[i].option_particulier === "undefined") {results3[i].option_particulier = ""}; + if (results3[i].prise_charge_famille === "undefined") {results3[i].prise_charge_famille = ""}; + logger.info(`option ensemble pour participant ${i} : ${results3[i].option_ensemble}`); + + ajout_gs_Inscription_cours.push({ + ID_participant: results3[i].ID_participant, + date: moment(results2[0].date_maj).format("YYYY-MM-DD HH:mm:ss"), + identifiant: req.session.identifiant, + participant_nom: results3[i].stn_part_nom.toUpperCase(), + participant_prenom: results3[i].stn_part_prenom, + participant_age: results3[i].stn_part_age, + adherent_mail: results3[i].adherent_mail, + adherent_telephone: "'" + results3[i].adherent_telephone, + prise_charge_famille: results3[i].prise_charge_famille, + role: results3[i].stn_role, + profil: results3[i].stn_profil, + instrument: results3[i].instrument, + instrument_ensemble: results3[i].instrument_ensemble, + instrument_collectif: results3[i].instrument_collectif, + cahier: results3[i].cahier, + piece: results3[i].piece, + prof_nom: results3[i].prof_nom, + prof_mail: results3[i].prof_mail, + concert_solo_piece: results3[i].concert_solo_piece, + concert_solo_cahier: results3[i].concert_solo_cahier, + cours_individuel: results3[i].cours_individuel, + decouverte_alto: results3[i].decouverte_alto, + option_choral: results3[i].option_choral, + option_rythmique: results3[i].option_rythmique, + option_eveil: results3[i].option_eveil, + option_cours_collectif: results3[i].option_collectif, + option_musique_ensemble: results3[i].option_ensemble, + option_cours_particulier: results3[i].option_particulier + }); + cours_trouve = "oui"; + } + } + if (cours_trouve === "oui") { await GS_stagean_Inscription_cours.addRows(ajout_gs_Inscription_cours);} + + + 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 : " + 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('/stagenational/identifier'); + } + + + ////////////////////////////////////////////////////////////////////////////// + // ENVOIE CONFIRMATION PAR MAIL + + let mail_objet = "ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI - FACTURE STAGE ANNUEL 2026 - "; + mail_objet += results2[0].adherent_nom; + + let mail_html = "

Cher adhérent,

Félicitations ! Vous êtes désormais inscrit au stage national de l’Association Française pour la Pédagogie Suzuki (http://www.afpedagogiesuzuki.fr) qui se tiendra du 23 au 28 août 2026.

En validant l'inscription, vous êtes engagé à payer la totalité du stage avant le 30 juin 2026 selon les modes de paiement décrits ci-dessous.

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

FACTURE

'; + mail_html += "

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

Montant de l'acompte versé : "; + mail_html += results2[0].acompte_initial + "€"; + mail_html += "

"; + mail_html += "

RESTE À PAYER : "; + mail_html += (Math.round((results2[0].cout_total - results2[0].acompte_initial) * 100) / 100) + "€"; + mail_html += "

"; + mail_html += ` +
    +
  • + Modes de paiement : +
      +
    • Virement bancaire : en 1 fois uniquement. +
        +
      • + Références bancaires de l'AFPS : CRÉDIT AGRICOLE DE SAVOIE, IBAN : FR76 1810 6000 4496 7630 3576 718, BIC: AGRIFRPP881 +
      • +
      +
    • +
    • Chèque : en 1 à 3 chèques à l’ordre de l’AFPS. A envoyer en 1 seule fois. (encaissement au plus tard: juin, juillet, août) +
        +
      • + Adresse pour envoyer les chèques : Anne PAGES / AFPS, 30, rue des Tattes, 74 500 PUBLIER +
      • +
      +
    • +
    • Chèques vacances ANCV (papier) : à l’ordre de “Ternélia, les flocons verts”. Les ANCV dématérialisés ne sont pas acceptés. Veuillez indiquer le montant qui sera payé en ANCV. (Attention : pour que les chèques soient utilisables, il faut aussi joindre la partie détachable du chèque.) +
    • +
    +
  • +
`; + + mail_html += `

DÉTAILS :`; + + mail_html += "

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

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

Mode d'hébergement : "; + mail_html += res.locals.hebergement; + mail_html += "


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

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

"; + mail_html += "

Nom : "; + mail_html += results3[toto].stn_part_nom; + mail_html += " "; + mail_html += results3[toto].stn_part_prenom; + if (results3[toto].prise_charge_famille) { + mail_html += "

Prise en charge par une autre famille : "; + mail_html += results3[toto].prise_charge_famille; + } + mail_html += "

Profile âge : "; + mail_html += results3[toto].stn_part_profilage; + mail_html += "

Catégorie : "; + + if (results3[toto].stn_role == 'accompagnant_activite_adulte') { + mail_html += "accompagnant adulte avec activité"; + } else if (results3[toto].stn_role == 'accompagnant') { + mail_html += "accompagnant sans activité"; + } else if (results3[toto].stn_role == 'accompagnant_activite_enfant') { + mail_html += "Accompagnant enfant avec activité"; + } else if (results3[toto].stn_role == 'instrumentiste_camp') { + mail_html += "instrumentiste"; + } else if (results3[toto].stn_role == 'prof_invite') { + mail_html += "professeur invité"; + } else { + mail_html += results3[toto].stn_role; + } + + if (results3[toto].stn_profil == 'professeur') { + mail_html += " - professeur"; + } + if (results3[toto].stn_profil == 'non_professeur') { + mail_html += " - accompagnant"; + } + if (results3[toto].stn_profil == 'Camp ado') { + mail_html += " - Camp ado"; + } + + + mail_html += "

Mode de transport : "; + mail_html += res.locals["personne_"+toto+"_transport_mode"]; + + if (results3[toto].stn_arret == 'arret_7_quai_lassagne_lyon') { + mail_html += " - 7 quai Lassagne Lyon"; + } + if (results3[toto].stn_arret == 'arret_partdieu_lyon') { + mail_html += " - Gare Part Dieu Lyon"; + } + + mail_html += "

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

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

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

Instrument option atelier musique d'ensemble: "; + mail_html += results3[toto].instrument_ensemble; + mail_html += "

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

Instrument option atelier cours collectif: "; + mail_html += results3[toto].instrument_collectif; + mail_html += "

"; + } + if (results3[toto].cours_individuel === "cours individuel") { + mail_html += "

Option cours particulier : oui

"; + } + if (results3[toto].decouverte_alto === "decouvertealto") { + mail_html += "

Option découverte alto : oui

"; + } + if (results3[toto].concert_solo_cahier && (results3[toto].concert_solo_cahier.startsWith("Cahier") || results3[toto].concert_solo_cahier.startsWith("Hors"))) { + mail_html += "

Option concert solo : "; + mail_html += results3[toto].concert_solo_piece; + mail_html += " - "; + mail_html += results3[toto].concert_solo_cahier; + mail_html += "

"; + } + if (results3[toto].option_choral === "chant choral") { + //mail_html += `

Option chant choral : ${results3[toto].chant_cout}

`; + if (results3[toto].chant_cout > 0) { + mail_html += "

Coût option chant choral : "; + mail_html += results3[toto].chant_cout; + mail_html += "€

"; + } else { + mail_html += "

Coût option chant choral : Offert

"; + } + } + + if (results3[toto].option_rythmique === "rythmique Dalcroze") { + mail_html += `

Option rythmique Dalcroze : ${results3[toto].dalcroze_cout}

`; + } + if (results3[toto].option_eveil === "éveil musical") { + mail_html += `

Option éveil musical : ${results3[toto].eveil_cout}

`; + } + if (results3[toto].option_collectif === "Cours collectif Suzuki") { + mail_html += `

Option Cours collectif Suzuki : ${results3[toto].collectif_cout}

`; + } + if (results3[toto].option_ensemble === "Atelier musique d'ensemble") { + mail_html += `

Option Atelier musique d'ensemble : ${results3[toto].ensemble_cout}

`; + } + if (results3[toto].option_particulier === "Cours particulier") { + mail_html += `

Cours particuliers : ${results3[toto].particulier_cout}

`; + } + + + if (results3[toto].cout_hebergement > 0 && res.locals.hebergement == "Centre les Flocons Verts - hébergement partagé") { + mail_html += "

Coût hébergement : "; + mail_html += results3[toto].cout_hebergement; + mail_html += "€

"; + } + if (results3[toto].cout_transport > 0) { + mail_html += "

Coût transport : "; + mail_html += results3[toto].cout_transport; + mail_html += "€

"; + } + if (results3[toto].cours_cout > 0) { + mail_html += "

Coût cours : "; + mail_html += results3[toto].cours_cout; + mail_html += "€

"; + } + if (results3[toto].coursindividuel_cout > 0) { + mail_html += "

Option cours particulier : "; + mail_html += results3[toto].coursindividuel_cout; + mail_html += "€

"; + } + if (results3[toto].decouvrealto_cout > 0) { + mail_html += "

Coût option découverte de l'alto : "; + mail_html += results3[toto].decouvrealto_cout; + mail_html += "€

"; + } + + if (results3[toto].observation_cout > 0) { + mail_html += "

Coût observation : "; + mail_html += results3[toto].observation_cout; + mail_html += "€

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

Le coût total comprend : les frais de dossier, les Frais bancaires de l'acompte, l’hébergement, le transport et les cours :

"; + if (res.locals.hebergement == "Centre les Flocons Verts - hébergement non partagé") { + mail_html += `

Coût hébergement avec supplément "non partagé" : ${results2[0].cout_hebergement}€

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

Frais de dossier : "; + mail_html += results2[0].frais_dossier + "€"; + } + mail_html += "

Frais bancaire de l'acompte : "; + mail_html += results2[0].frais_bancaire + "€"; + + if (results2[0].remise_famille_nombreuse > 0) { + mail_html += "

Remise famille nombreuse : "; + mail_html += results2[0].remise_famille_nombreuse + "€"; + } + + mail_html += `

Coût total : ${results2[0].cout_total}€

`; + + mail_html += "

Montant de l'acompte versé : "; + mail_html += results2[0].acompte_initial + "€"; + mail_html += "

"; + mail_html += "

RESTE À PAYER : "; + mail_html += (Math.round((results2[0].cout_total - results2[0].acompte_initial) * 100) / 100) + "€"; + mail_html += "

"; + mail_html += "

En pièce jointe vous trouverez la brochure détaillée du stage."; + + if (results2[0].cout_option_surplace > 0) { + mail_html += "

Coût activité Dalcroze adulte à payer sur place : "; + mail_html += results2[0].cout_option_surplace; + mail_html += "€

"; + } + + mail_html += "


Nous vous remercions pour votre intérêt et vous souhaitons un très bon stage !


Association Française pour la Pédagogie Suzuki
Anne-Laure SAUVEGRAIN
Pôle organisation du stage
Siret association : 507 569 952 00033

"; + + + let OUTPUT = path.resolve(__dirname, "../../pdf/stage_national/documents/")+"/stage_national_tarifs_2026.pdf"; + let attachment_name = "stage_national_tarifs_2026.pdf" + + let mailOptions = { + from: 'afps.inscription@gmail.com', + to: req.session.adherent_mail, + subject: mail_objet, + html: mail_html, + attachments: [{ + filename: attachment_name, + path: OUTPUT + }], + }; + 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('stagenat/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 : " + 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('/stagenational/identifier'); + } + } + +} + +///////////////////////////////////////////////// +// RETOUR PAIEMENT ECHOUE +// CLICK SUR BOUTON RECOMMENCER +const SN_accompte_annule = async function(req, res) { + + + + logger.info("======================================"); + logger.info("======== FUNCTION SN_acompte_echoue (STAGE) =========="); + logger.info("======================================"); + + ////////////////////////////////////////////////////////////////////////////// + // RETOUR STRIPE + let id = req.query.id; + console.log(`STRIP ID = ${id}`); + + const session_stripe = await stripe.checkout.sessions.retrieve(id); + let customer_email = session_stripe.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; + let CB_retour = "identifiant_adherent:"+identifiant+",payment_status:"+payment_status+",stripe_customer:"+stripe_customer+",stripe_payment_intent:"+stripe_payment_intent+",sessionID:"+session_stripe.id+",payment_method_types:"+payment_method_types+",amount_total:"+amount_total+",stripe_status:"+stripe_status; + let stripe_retour = session_stripe.id; + logger.info("payment_status : " + payment_status, { numsession: req.session.id }); + + + ////////////////////////////////////////////////////////////////////////////// + // MAJ annulé DB + + 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 ca_adherent where stripe_retour = "' + stripe_retour + '"'; + const [results0, fields0] = await db_connection_promise.execute(sql0); + logger.info("Row ca_adherent stripe_retour : " + results0.length, { numsession: req.session.id, label: filename}); + + if (results0.length < 1) { + //Query MAJ stn_adherent + let sql = 'UPDATE '; + sql += 'stn_adherent'; + sql += ' SET '; + + sql += 'identifiant = concat(identifiant, ID_adherent), '; + sql += 'stripe_retour = "' + CB_retour + '", '; + sql += 'statut_paiement_acompte = "non paye", '; + + sql += 'statut_reservation = "annule", '; + sql += 'statut_suppression = 1'; + sql += ' WHERE identifiant = "' + identifiant + '" AND statut_suppression = 0'; + + logger.info("sql UPDATE stn_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 += 'stn_participant'; + sql1 += ' SET '; + sql1 += 'identifiant = concat(identifiant, ID_participant), '; + sql1 += 'statut_suppression = 1'; + sql1 += ' WHERE identifiant = "' + identifiant + '" AND statut_suppression = 0'; + + logger.info("sql UPDATE stn_participant : " + sql1, { numsession: req.session.id, label: filename}); + + const [results1, fields1] = await db_connection_promise.execute(sql1); + logger.info("Row stn_participant UPDATE suppression: " + results1.changedRows, { numsession: req.session.id, label: filename}); + + + ////////////////////////////////////////////////////////////////////////////// + // AFFICHAGE DE LA PAGE ANNULÉ + res.locals.identifiant = identifiant; + res.render('stagenat/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('/stagenational/identifier'); + } + + + +} + + + +///////////////////////////////////////////////// +// EXPORT DE MODULE POUR QU'IL SOIT LU DANS LES AUTRES FICHIERS JS +///////////////////////////////////////////////// + +module.exports = { + SN_accompte_reussi, + SN_accompte_annule +} \ No newline at end of file diff --git a/controllers/stagenatController.js b/controllers/stagenatController.js deleted file mode 100644 index 9b4c6c7..0000000 --- a/controllers/stagenatController.js +++ /dev/null @@ -1,1633 +0,0 @@ -///////////////////////////////////////////////// -// LOGGING -///////////////////////////////////////////////// -const logger = require("../public/js/app/logger"); -logger.info("NOUS SOMMES DANS LE FICHIER : " + __filename); - -///////////////////////////////////////////////// -// APPELS DES MODULES -///////////////////////////////////////////////// - -const moment = require('moment'); -const ejs = require('ejs'); -var nodemailer = require('nodemailer'); -const path = require("path"); -const stripe = require('stripe')(process.env.STRIPE_PRIVATE_KEY); -var pdf = require("pdf-creator-node"); -var fs = require("fs"); - -///////////////////////////////////////////////// -// GOOGLE SHEET PARAMETERS -///////////////////////////////////////////////// -const { GoogleSpreadsheet } = require('google-spreadsheet'); -const GS_creds_stagean = require('../inscriptionsafps-53b60452f63d.json'); -const GS_stagean = new GoogleSpreadsheet('1STdRD5lXP316hgtdQfNqcqSQavzaoOXDMOqmfqPc3_0'); - - -///////////////////////////////////////////////// -// VARIABLES GLOBALES -///////////////////////////////////////////////// - - -///////////////////////////////////////////////// -// PAGE 1 -// http://localhost:8888/stagenational/identifier -// -// RECHERCHE SI PERSONNE DÉJA INSCRITE -// SI NON INSCRITE -// RECHERCHE SI ADHÉRENTE DANS BD AFPS -// -///////////////////////////////////////////////// - -const SN_checkidentifiant = async function(req, res) { - - ///////////////////////////////////////////////// - // RECHERCHE SI PERSONNE DÉJA INSCRITE - // DANS BD DU STAGE ANNUEL - logger.info("======================================"); - logger.info("======== FUNCTION SN_checkidentifiant =========="); - logger.info("======================================"); - - await GS_stagean.useServiceAccountAuth(GS_creds_stagean); - await GS_stagean.loadInfo(); // loads document properties and worksheets - logger.info("NOM FICHIER SHEET: " + GS_stagean.title, { numsession: req.session.id }); - const GS_SN_sheet = GS_stagean.sheetsByTitle['inscription_web']; - logger.info("NOM DU TABLEAU (ONGLET): "+GS_SN_sheet.title); //NOM DU TABLEAU (ONGLET) - - const GS_SN_rows = await GS_SN_sheet.getRows(); - - // mettre les identifiants dans un array - let lesidentifiants = new Array; - let compteur = GS_SN_sheet.rowCount - 1; - console.log("compteur: ",compteur); - - for (let i=0; iCliquez ici'; - req.session.err_mail_form_adhesion_3 = 'Vous pouvez également adhérer à l\'association de votre pays. Vous trouverez ici les pays européens'; - res.redirect('/stagenational/identifier'); - } - - // SI RIEN COCHÉ - if (typeof req.body.check_autrepays === 'undefined' && typeof req.body.check_nonadherent === 'undefined') { - - // ON VA VOIR S'IL EST DANS LA BD DES ADHÉRENTS - - // BASE DE DONNÉES DES ADHÉRENTS - // 2 SHEETS - - const GS_creds_adhe = require('../testapi336520-3105cc3caa46.json'); - const GS_adhe = new GoogleSpreadsheet('1BhpYj-KtsyC8inXIDVl-zldDYRuhEqPwBFvP45FtJkI'); - await GS_adhe.useServiceAccountAuth(GS_creds_adhe); - await GS_adhe.loadInfo(); // loads document properties and worksheets - console.log("NOM FICHIER SHEET: ",GS_adhe.title); //nom du fichier - const GS_adh_sheet = GS_adhe.sheetsByTitle['adhesion_annuelle_web']; - const GS_adh_sheet_asslocales = GS_adhe.sheetsByTitle['adhesion_ass_locales']; - const GS_adh_rows = await GS_adh_sheet.getRows(); - const GS_adh_rows_asslocales = await GS_adh_sheet_asslocales.getRows(); - - let lesidentifiants_adh = new Array; - let compteur_adh = GS_adh_sheet.rowCount - 1; - let compteur_adh_asslocales = GS_adh_sheet_asslocales.rowCount - 1; - - // RÉCUPÉRER LES IDENTIFIANTS DU TABLEAU adhesion_annuelle_web - for (let i=0; i adherent.identifiant === req.session.identifiant); - - if (adherent_resultat){ - logger.info("Identifiant trouvé dans la base des adhésions : " + adherent_resultat.identifiant, { numsession: req.session.id }); - logger.info("Adhésion payé : " + adherent_resultat.Adhesion_paye, { numsession: req.session.id }); - if (adherent_resultat.Adhesion_paye === "paye" || adherent_resultat.Adhesion_paye === "attente"){ - logger.info("Identifiant trouvé et payé dans la base des adhésions", { numsession: req.session.id }); - req.session.err_mail_form_adhesion_1 = "Cet identifiant est bien inscrit dans les adhésions 2022/2023."; - req.session.err_mail_form_adhesion_2 = "Nous pouvons donc procéder à l'inscription au stage."; - req.session.err_mail_form_adhesion_3 = "Vous allez être rediriger vers le formulaire."; - - req.session.association = adherent_resultat.association; - - console.log("NOM FICHIER SHEET: ",adherent_resultat); - console.log("adherent_resultat association : ",adherent_resultat.association); - console.log("adherent_resultat identifiant : ",adherent_resultat.identifiant); - - res.redirect('/stagenational/formulaire'); - } else { - logger.info("Identifiant trouvé mais NON payé dans la base des adhésions", { numsession: req.session.id }); - req.session.err_mail_form_adhesion_1 = "Cet identifiant n'a pas payé l'adhésion 2022/2023."; - req.session.err_mail_form_adhesion_2 = "Vous devez adhérer avant de vous inscrire au stage"; - req.session.err_mail_form_adhesion_3 = 'Pour adhérer à l\'association Française pour la Pédagogie Suzuki Cliquez ici'; - res.redirect('/stagenational/identifier'); - - } - } else { - logger.info("Identifiant NON trouvé dans la base des adhésions", { numsession: req.session.id }); - req.session.err_mail_form_adhesion_1 = "Cet identifiant N'EST PAS inscrit dans les adhésions 2022/2023."; - req.session.err_mail_form_adhesion_2 = "Vous devez adhérer avant de vous inscrire au stage"; - req.session.err_mail_form_adhesion_3 = 'Pour adhérer à l\'association Française pour la Pédagogie Suzuki Cliquez ici'; - res.redirect('/stagenational/identifier'); - - } - } - - } - } else { - // IDENTIFIANT NON SAISI - req.session.err_mail_form_adhesion_1 = "Etre adhérent (et posséder un identifiant) à une association de la pédagogie Suzuki est obligatoire pour toute famille ou personne qui souhaite participer au stage"; - req.session.err_mail_form_adhesion_2 = 'Pour adhérer à l\'association Française pour la Pédagogie Suzuki Cliquez ici'; - req.session.err_mail_form_adhesion_3 = 'Vous pouvez également adhérer à l\'association de votre pays. Vous trouverez ici les pays européens'; - res.redirect('/stagenational/identifier'); - } - -} - - -///////////////////////////////////////////////// -// PAGE 2 -// http://localhost:8888/stagenational/formulaire -// -// RECUPERATION CHAMPS SAISIS -// CALCUL AGE -// CALCUL DU PRIX -// AFFICHER PAGE RECAP -// -///////////////////////////////////////////////// - -const SN_checkinfos = async function(req, res) { - - logger.info("======================================"); - logger.info("======== FUNCTION post_form_stagenat =========="); - logger.info("======================================"); - - // RÉCUPÉRATION DES DONNÉES DU FORMULAIRE DANS LA SESSION EN COURS - req.session.association = req.body.association; - logger.info("req.session.association : " + req.session.association, { numsession: req.session.id }); - logger.info("req.session.montant_accompte = " + req.session.montant_accompte, { numsession: req.session.id }); - req.session.adherent_nom = req.body.adherent_nom; - req.session.adherent_prenom = req.body.adherent_prenom; - req.session.adherent_adresse_rue = req.body.adherent_adresse_rue; - req.session.adherent_adresse_complement = req.body.adherent_adresse_complement; - req.session.adherent_adresse_codepostal = req.body.adherent_adresse_codepostal; - req.session.adherent_adresse_ville = req.body.adherent_adresse_ville; - req.session.adherent_adresse_pays = req.body.adherent_adresse_pays; - req.session.adherent_telephone_mobile = req.body.adherent_telephone_mobile; - req.session.adherent_telephone_fixe = req.body.adherent_telephone_fixe; - req.session.adherent_mail = req.body.adherent_mail; - req.session.hebergement = req.body.hebergement; - req.session.commentaire_adherent = req.body.commentaire_adherent; - - //// INITIALISATION DES MONTANTS PAR FAMILLE - req.session["cout_total"] = 0; - req.session.frais_dossier = 0; - req.session["cout_total_hebergement"] = 0; - req.session["cout_total_transport"] = 0; - req.session.cout_total_dalcroze = 0; - req.session.cout_total_percussion = 0; - req.session.cout_total_chant = 0; - req.session.cout_total_dalcroze_surplace = 0; - req.session.cout_total_percussion_surplace = 0; - req.session.cout_total_observation = 0; - req.session.cout_total_cours = 0; - req.session.cout_total_campado = 0; - req.session.accompte_frais_bancaire = 0; - req.session.remise = ""; - req.session.montant_accompte = 0; - logger.info("req.session.montant_accompte = " + req.session.montant_accompte, { numsession: req.session.id }); - logger.info("req.session.cout_total_dalcroze_surplace = " + req.session.cout_total_dalcroze_surplace, { numsession: req.session.id }); - - var adulte_trouve = "non"; - - for (let toto = 1; toto < 7; toto++) { - req.session["personne_"+toto+"_nom"] = req.body["personne_"+toto+"_nom"]; - logger.info('req.session["personne_"'+toto+'"_nom"]' + req.session["personne_"+toto+"_nom"], { numsession: req.session.id }); - req.session["personne_"+toto+"_prenom"] = req.body["personne_"+toto+"_prenom"]; - console.log('req.session["personne_"'+toto+'"_prenom"] =',req.session["personne_"+toto+"_prenom"]); - req.session["personne_"+toto+"_datenaissance"] = req.body["personne_"+toto+"_datenaissance"]; - console.log('req.session["personne_"'+toto+'"_datenaissance"]', req.session["personne_"+toto+"_datenaissance"]); - - req.session["personne_"+toto+"_transport_mode"] = req.body["personne_"+toto+"_transport_mode"]; - console.log('req.session["personne_"'+toto+'"_transport_mode"]',req.session["personne_"+toto+"_transport_mode"]); - req.session["personne_"+toto+"_transport_arret"] = req.body["personne_"+toto+"_transport_arret"]; - console.log('req.session["personne_"'+toto+'"_transport_arret"]',req.session["personne_"+toto+"_transport_arret"]); - req.session["personne_"+toto+"_categorie"] = req.body["personne_"+toto+"_categorie"]; - console.log('req.session["personne_"'+toto+'"_categorie"]',req.session["personne_"+toto+"_categorie"]); - req.session["personne_"+toto+"_profil"] = req.body["personne_"+toto+"_profil"]; - console.log('req.session["personne_"'+toto+'"_profil"]',req.session["personne_"+toto+"_profil"]); - req.session["personne_"+toto+"_instrument"] = req.body["personne_"+toto+"_instrument"]; - console.log('req.session["personne_"'+toto+'"_instrument"]',req.session["personne_"+toto+"_instrument"]); - req.session["personne_"+toto+"_cahier"] = req.body["personne_"+toto+"_cahier"]; - console.log('req.session["personne_"'+toto+'"_cahier"]',req.session["personne_"+toto+"_cahier"]); - req.session["personne_"+toto+"_piece"] = req.body["personne_"+toto+"_piece"]; - console.log('req.session["personne_"'+toto+'"_piece"]',req.session["personne_"+toto+"_piece"]); - req.session["personne_"+toto+"_prof"] = req.body["personne_"+toto+"_prof"]; - console.log('req.session["personne_"'+toto+'"_prof"]',req.session["personne_"+toto+"_prof"]); - req.session["personne_"+toto+"_mail_prof"] = req.body["personne_"+toto+"_mail_prof"]; - console.log('req.session["personne_"'+toto+'"_mail_prof"]',req.session["personne_"+toto+"_mail_prof"]); - req.session["personne_"+toto+"_option_coursindividuel"] = req.body["personne_"+toto+"_option_coursindividuel"]; - console.log('req.session["personne_"'+toto+'"_option_coursindividuel"]',req.session["personne_"+toto+"_option_coursindividuel"]); - req.session["personne_"+toto+"_option_concertsolo"] = req.body["personne_"+toto+"_option_concertsolo"]; - console.log('req.session["personne_"'+toto+'"_option_concertsolo"]',req.session["personne_"+toto+"_option_concertsolo"]); - req.session["personne_"+toto+"_option_concertsolo_cahier"] = req.body["personne_"+toto+"_option_concertsolo_cahier"]; - console.log('req.session["personne_"'+toto+'"_option_concertsolo_cahier"]',req.session["personne_"+toto+"_option_concertsolo_cahier"]); - req.session["personne_"+toto+"_option_concertsolo_piece"] = req.body["personne_"+toto+"_option_concertsolo_piece"]; - console.log('req.session["personne_"'+toto+'"_option_concertsolo_piece"]',req.session["personne_"+toto+"_option_concertsolo_piece"]); - req.session["personne_"+toto+"_activite_1"] = req.body["personne_"+toto+"_activite_1"]; - console.log('req.session["personne_"'+toto+'"_activite_1"]',req.session["personne_"+toto+"_activite_1"]); - req.session["personne_"+toto+"_activite_2"] = req.body["personne_"+toto+"_activite_2"]; - console.log('req.session["personne_"'+toto+'"_activite_2"]',req.session["personne_"+toto+"_activite_2"]); - - // CALCUL ÂGE PERSONNE AU 20 aout 2023 - // CALCUL PROFIL AGE DE LA PERSONNE AU 20 aout 2023 - console.log('req.session["personne_"'+toto+'"_datenaissance"]', req.session["personne_"+toto+"_datenaissance"]); - if (req.session["personne_"+toto+"_datenaissance"]) { - logger.info('req.session["personne_"'+toto+'"_datenaissance"] : ' + req.session["personne_"+toto+"_datenaissance"], { numsession: req.session.id }); - let datenaissance_concat = req.session["personne_"+toto+"_datenaissance"]; - logger.info("datenaissance_concat : " + datenaissance_concat, { numsession: req.session.id }); - - 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 debutstage = new Date('2023-08-20'); - logger.info("birthDate : " + birthDate, { numsession: req.session.id }); - logger.info("debutstage : " + debutstage, { numsession: req.session.id }); - - var age = debutstage.getFullYear() - birthDate.getFullYear(); - logger.info("age : " + age, { numsession: req.session.id }); - var m = debutstage.getMonth() - birthDate.getMonth(); - console.log("m = ",m); - if (m < 0 || (m === 0 && debutstage.getDate() < birthDate.getDate())) { - logger.info("debutstage.getDate() = " + debutstage.getDate(), { numsession: req.session.id }); - age--; - } - - req.session["personne_"+toto+"_age"] = age; - logger.info('age : ' + age, { numsession: req.session.id }); - - // CALCUL PROFIL_AGE DE LA PERSONNE AU 20 aout 2023 - req.session["personne_"+toto+"_profilage"] = (age < 3) ? "moins_3ans": (age >= 3 && age <= 5) ? "3-5ans": (age >= 6 && age <= 11) ? "6-11ans": (age >= 12 && age <= 15) ? "12-15ans" : (age >= 16 && age <= 17) ? "16-17ans" : "adulte"; - logger.info('req.session["personne_"'+toto+'"_profilage"]' + req.session["personne_"+toto+"_profilage"], { numsession: req.session.id }); - - // Pour camp ado : on vérifie s'il y a un adulte ou non - - if (req.session["personne_"+toto+"_age"] > 17) { - adulte_trouve = "oui"; - logger.info("adulte_trouve : " + adulte_trouve, { numsession: req.session.id }); - }; - - /////////////////////// - // TARIF PAR PERSONNE - - //// INITIALISATION DES MONTANTS PAR PERSONNE - req.session["personne_"+toto+"_cout_hebergement"] = 0; - req.session["personne_"+toto+"_cout_transport"] = 0; - req.session["personne_"+toto+"_activite_cout"] = 0; - req.session["personne_"+toto+"_observation_cout"] = 0; - req.session["personne_"+toto+"_cours_cout"] = 0; - req.session["personne_"+toto+"_campado_cout"] = 0; - - - // FLOCONS VERT COUT PAR PERSONNE - - if (req.session.hebergement == "flocons verts") { - logger.info("CALCUL HEBERGEMENT : " + req.session.hebergement, { numsession: req.session.id }); - console.log('req.session["personne_"+toto+"_age"] =',req.session["personne_"+toto+"_age"]); - // ADULTE - if (req.session["personne_"+toto+"_age"] > 15) { - console.log("AGE > 17"); - req.session["personne_"+toto+"_cout_hebergement"] = 290; - req.session["cout_total"] += 290; - console.log(typeof req.session["cout_total"]); - req.session["cout_total_hebergement"] += 290; - console.log ("cout_total = ", req.session["cout_total"]); - } - if (req.session["personne_"+toto+"_age"] >= 12 && req.session["personne_"+toto+"_age"] <= 15) { - console.log("12 < AGE > 15"); - req.session["personne_"+toto+"_cout_hebergement"] = 261; - req.session["cout_total"] += 261; - req.session["cout_total_hebergement"] += 261; - console.log ("cout_total = ", req.session["cout_total"]); - } - if (req.session["personne_"+toto+"_age"] >= 6 && req.session["personne_"+toto+"_age"] <= 11) { - console.log("6 < AGE > 11"); - req.session["personne_"+toto+"_cout_hebergement"] = 232; - req.session["cout_total"] += 232; - req.session["cout_total_hebergement"] += 232; - console.log ("cout_total = ", req.session["cout_total"]); - } - if (req.session["personne_"+toto+"_age"] >= 3 && req.session["personne_"+toto+"_age"] <= 5) { - console.log("3 < AGE > 5"); - req.session["personne_"+toto+"_cout_hebergement"] = 174; - req.session["cout_total_hebergement"] += 174; - req.session["cout_total"] += 174; - console.log ("cout_total = ", req.session["cout_total"]); - } - } - console.log ('req.session["personne_"+toto+"_cout_hebergement"] = ', req.session["personne_"+toto+"_cout_hebergement"]); - console.log ("cout_total_hebergement = ", req.session["cout_total_hebergement"]); - console.log ("cout_total = ", req.session["cout_total"]); - - // CAR COUT PAR PERSONNE - if (req.session["personne_"+toto+"_transport_mode"] == "car") { - req.session["personne_"+toto+"_cout_transport"] = 55; - req.session["cout_total_transport"] += 55; - req.session["cout_total"] += 55; - } - console.log ("cout_total_transport = ", req.session["cout_total_transport"]); - console.log ("cout_total = ", req.session["cout_total"]); - - // ACTIVITE COUT PAR PERSONNE - if (req.session["personne_"+toto+"_activite_1"]) { - if (req.session["personne_"+toto+"_activite_1"] == "dalcroze" && req.session["personne_"+toto+"_age"] < 18) { - req.session.cout_total_dalcroze += 75; - req.session["personne_"+toto+"_activite_cout"] += 75; - req.session["cout_total"] += 75; - } - if (req.session["personne_"+toto+"_activite_1"] == "dalcroze" && req.session["personne_"+toto+"_age"] > 17) { - req.session.cout_total_dalcroze_surplace += 75; - logger.info("req.session.cout_total_dalcroze_surplace ACTIVITE 1 = " + req.session.cout_total_dalcroze_surplace, { numsession: req.session.id }); - } - - if (req.session["personne_"+toto+"_activite_1"] == "percussions" && req.session["personne_"+toto+"_age"] < 18) { - req.session.cout_total_percussion += 75; - req.session["personne_"+toto+"_activite_cout"] += 75; - req.session["cout_total"] += 75; - } - if (req.session["personne_"+toto+"_activite_1"] == "percussions" && req.session["personne_"+toto+"_age"] > 17) { - req.session.cout_total_percussion_surplace += 75; - } - - if (req.session["personne_"+toto+"_activite_1"] == "chant" && req.session["personne_"+toto+"_age"] < 12 ) { - req.session.cout_total_chant += 75; - req.session["personne_"+toto+"_activite_cout"] += 75; - req.session["cout_total"] += 75; - } - - - - } - if (req.session["personne_"+toto+"_activite_2"]) { - if (req.session["personne_"+toto+"_activite_2"] == "dalcroze" && req.session["personne_"+toto+"_age"] < 18) { - req.session.cout_total_dalcroze += 75; - req.session["personne_"+toto+"_activite_cout"] += 75; - req.session["cout_total"] += 75; - } - if (req.session["personne_"+toto+"_activite_2"] == "dalcroze" && req.session["personne_"+toto+"_age"] > 17) { - req.session.cout_total_dalcroze_surplace += 75; - logger.info("req.session.cout_total_dalcroze_surplace ACTIVITE 2 = " + req.session.cout_total_dalcroze_surplace, { numsession: req.session.id }); - } - - if (req.session["personne_"+toto+"_activite_2"] == "percussions" && req.session["personne_"+toto+"_age"] < 18) { - req.session.cout_total_percussion += 75; - req.session["personne_"+toto+"_activite_cout"] += 75; - req.session["cout_total"] += 75; - } - if (req.session["personne_"+toto+"_activite_2"] == "percussions" && req.session["personne_"+toto+"_age"] > 17) { - req.session.cout_total_percussion_surplace += 75; - } - - if (req.session["personne_"+toto+"_activite_2"] == "chant" && req.session["personne_"+toto+"_age"] < 12 ) { - req.session.cout_total_chant += 75; - req.session["personne_"+toto+"_activite_cout"] += 75; - req.session["cout_total"] += 75; - } - - } - console.log ("cout_total = ", req.session["cout_total"]); - console.log ("cout_total_percussion = ", req.session.cout_total_percussion); - console.log ("cout_total_dalcroze = ", req.session.cout_total_dalcroze); - console.log ("cout_total_chant = ", req.session.cout_total_chant); - - - // observateur cout par personne - if (req.session["personne_"+toto+"_categorie"] == "observateur" && req.session["personne_"+toto+"_profil"] == "non_professeur") { - req.session["personne_"+toto+"_observation_cout"] = 30; - req.session.cout_total_observation += 30; - req.session["cout_total"] += 30; - } - console.log ("cout_total = ", req.session["cout_total"]); - console.log ("cout_total_observation = ", req.session.cout_total_observation); - - // INSTRUMENTISTE PAR PERSONNE - let date1 = new Date('2023-04-30'); - let date2 = new Date(); - console.log('date1 =',date1); - console.log('date2 =',date2); - console.log('date2 - date1 =',date2 - date1); - if (req.session["personne_"+toto+"_categorie"] == "instrumentiste") { - console.log("IF INSTRUMENTISTE"); - if (req.session["personne_"+toto+"_instrument"]== "alto" || req.session["personne_"+toto+"_instrument"]== "violon" || req.session["personne_"+toto+"_instrument"] == "violoncelle" ) { - console.log("IF INSTRUMENTISTE ALTO V V"); - console.log("date supérieur au 01/05/2023"); - req.session["personne_"+toto+"_cours_cout"] = 300; - req.session.cout_total_cours += 300; - req.session["cout_total"] += 300; - if (req.session["personne_"+toto+"_option_coursindividuel"] == "cours individuel") { - if (req.session["personne_"+toto+"_cahier"]=="Cahier 1" || req.session["personne_"+toto+"_cahier"]=="Cahier 2" || req.session["personne_"+toto+"_cahier"]=="Cahier 3") { - req.session["personne_"+toto+"_cours_cout"] += 45; - req.session.cout_total_cours += 45; - req.session["cout_total"] += 45; - } else { - req.session["personne_"+toto+"_cours_cout"] += 65; - req.session.cout_total_cours += 65; - req.session["cout_total"] += 65; - } - } - } - - if (req.session["personne_"+toto+"_instrument"]== "piano") { - if (req.session["personne_"+toto+"_cahier"]=="Cahier 1") { - req.session["personne_"+toto+"_cours_cout"] = 320; - req.session.cout_total_cours += 320; - req.session["cout_total"] += 320; - } else if (req.session["personne_"+toto+"_cahier"]=="Cahier 2" || req.session["personne_"+toto+"_cahier"]=="Cahier 3" || req.session["personne_"+toto+"_cahier"]=="Cahier 4") { - req.session["personne_"+toto+"_cours_cout"] = 340; - req.session.cout_total_cours += 340; - req.session["cout_total"] += 340; - } else { - req.session["personne_"+toto+"_cours_cout"] = 370; - req.session.cout_total_cours += 370; - req.session["cout_total"] += 370; - } - } - console.log ("cout_total = ", req.session["cout_total"]); - console.log ("cout_total_cours = ", req.session.cout_total_cours); - console.log('req.session["personne_"'+toto+'"_cours_cout"]',req.session["personne_"+toto+"_cours_cout"]); - - if (date2 < date1) { - console.log("date inférieur au 01/05/2023 on enlève 20 euros"); - req.session.cout_total_cours -= 20; - req.session["personne_"+toto+"_cours_cout"] -= 20; - req.session["cout_total"] -= 20; - req.session.remise = "Remise pour inscription avant le 30 avril 23h59."; - console.log ("req.session.remise = ", req.session.remise); - } - logger.info("cout_total = " + req.session["cout_total"], { numsession: req.session.id }); - console.log ("cout_total_cours = ", req.session.cout_total_cours); - console.log('req.session["personne_"'+toto+'"_cours_cout"]',req.session["personne_"+toto+"_cours_cout"]); - - // ACCOMPTE + 100 PAR INSTRUMENTISTE - req.session.montant_accompte += 100; - logger.info("req.session.montant_accompte = " + req.session.montant_accompte, { numsession: req.session.id }); - } - logger.info("req.session.montant_accompte = " + req.session.montant_accompte, { numsession: req.session.id }); - } - } - - ///////////////////////////////// - // CAMP ADO - console.log("/////////////////////////////////"); - logger.info("// CAMP ADO"); - console.log("adulte_trouve : ", adulte_trouve); - let compteur_ado = 0 - logger.info("compteur_ado au départ : " + compteur_ado, { numsession: req.session.id }); - - if (adulte_trouve == "non" && req.session.hebergement == "flocons verts") { - for (let toto = 1; toto < 7; toto++) { - if (req.session["personne_"+toto+"_age"] >= 14 && req.session["personne_"+toto+"_age"] < 18) { - req.session["personne_"+toto+"_profil"] = "Camp ado"; - req.session["personne_"+toto+"_campado_cout"] = 100; - req.session.cout_total_campado += 100; - req.session["cout_total"] += 100; - compteur_ado ++; - logger.info("compteur_ado incrémenté : " + compteur_ado, { numsession: req.session.id }); - - } else if (req.session["personne_"+toto+"_age"] < 14) { - req.session.err_mineur = 'Vous ne pouvez inscrire un enfant de moins de 14 ans (âge au premier jour du stage) sans adulte pour l\'accompagner. Age de la personne saisi : '+req.session["personne_"+toto+"_age"]+' ans ('+req.session["personne_"+toto+"_datenaissance"]+')'; - console.log("adding session_err_mineur : ",req.session.err_mineur); - } - console.log('req.session["personne_"'+toto+'"_profil"]',req.session["personne_"+toto+"_profil"]); - } - - ////////////////////////////////// - // VÉRIFICATION DU NOMBRE D'ADO DISPO DANS GOOGLE SHEET - await GS_stagean.useServiceAccountAuth(GS_creds_stagean); - await GS_stagean.loadInfo(); // loads document properties and worksheets - console.log("NOM FICHIER SHEET: ",GS_stagean.title); //nom du fichier - const GS_SN_sheet_campado = GS_stagean.sheetsByTitle['campado']; - logger.info("NOM DU TABLEAU (ONGLET): " + GS_SN_sheet_campado.title, { numsession: req.session.id }); - await GS_SN_sheet_campado.loadCells('B1:B2'); - const GS_SN_sheet_campado_b2 = GS_SN_sheet_campado.getCellByA1('B2'); - - logger.info("CONTENU DE LA CELLULE B2 : " + GS_SN_sheet_campado_b2.value, { numsession: req.session.id }); - if (GS_SN_sheet_campado_b2.value < compteur_ado) { - req.session.err_mineur = "Il n'y a plus de place disponible pour inscrire une personne en Camp Ado"; - logger.info("Il n'y a plus de place disponible pour inscrire une personne en Camp Ado", { numsession: req.session.id }); - } - } - req.session.compteur_ado = compteur_ado; - logger.info("req.session.compteur_ado : " + req.session.compteur_ado, { numsession: req.session.id }); - - if (req.session.err_mineur) { - logger.info("existing session_err_mineur : " + req.session.err_mineur, { numsession: req.session.id }); - res.redirect('/stagenational/formulaire'); - } else { - ////////////////////////////////// - // FRAIS DE DOSIER - req.session.frais_dossier = 30; - req.session["cout_total"] += 30; - - ////////////////////////////////// - // ACOMPTE - // Si acompte est de 0 on lui met 100 (par ex si c'est un observateur) - logger.info("req.session.montant_accompte = " + req.session.montant_accompte, { numsession: req.session.id }); - if (req.session.montant_accompte < 100 && req.session["cout_total"] > 100 ) { - req.session.montant_accompte = 100; - logger.info("req.session.montant_accompte = " + req.session.montant_accompte, { numsession: req.session.id }); - } - - ////////////////////////////////// - // FRAIS bancaire - // 1,4 % + 0,25 € pour l'Espace économique européen (hors UK) - if (req.session.montant_accompte > 99) { - req.session.accompte_frais_bancaire = 0.25; - req.session.accompte_frais_bancaire += req.session.montant_accompte * 0.014; - req.session.accompte_frais_bancaire = Math.round(req.session.accompte_frais_bancaire * 100) / 100; - req.session["cout_total"] += req.session.accompte_frais_bancaire; - } - - - logger.info("cout_total_campado = " + req.session.cout_total_campado, { numsession: req.session.id }); - console.log ("cout_total = ", req.session["cout_total"]); - console.log ("montant_accompte = ", req.session.montant_accompte); - - // RECAP SANS ACOMPTE À PAYER - if (req.session.montant_accompte < 100) { - logger.info("REDIRECTION VERS RÉCAP SANS ACOMMPTE (montant_accompte) = " + req.session.montant_accompte, { numsession: req.session.id }); - res.redirect('/stagenational/recapssacompte'); - } - // RECAP AVEC ACOMPTE À PAYER - if (req.session.montant_accompte > 99) { - logger.info("REDIRECTION VERS RÉCAP AVEC ACOMMPTE (montant_accompte) = " + req.session.montant_accompte, { numsession: req.session.id }); - res.redirect('/stagenational/recap'); - } - } -} - -///////////////////////////////////////////////// -// PAGE 3 -// http://localhost:8888/stagenational/recap -// -// Bouton modifier -// -///////////////////////////////////////////////// - -// CLICK SUR BOUTON MODIFIER -const post_recap_modifier = async function(req, res) { - res.redirect('/stagenational/identifier'); -} - - - -///////////////////////////////////////////////// -// PAYER ACCOMPTE -// -// Enregistrement des infos dans la Google Sheet avant le paiement -// (car le redirect après le paiement vers la page "réussi" ou "annulé" initialise une autre session qui fait perdre le cookie précédent et les infos saisies) -// Payer accompte par carte bancaire -// STIPE -// -///////////////////////////////////////////////// - -// CLICK SUR BOUTON PAYER ACCOMPTE PAGE RECAP -const post_payer_accompte = async function(req, res, next) { - - logger.info("======================================"); - logger.info("======== FUNCTION post_payer_accompte =========="); - logger.info("======================================"); - - - ////////////////////////////////// - // AJOUT INFO DANS LA GOOGLE SHEET - - - await GS_stagean.useServiceAccountAuth(GS_creds_stagean); - await GS_stagean.loadInfo(); // loads document properties and worksheets - logger.info("NOM FICHIER SHEET : " + GS_stagean.title, { numsession: req.session.id }); - const GS_SN_sheet = GS_stagean.sheetsByTitle['inscription_web']; - logger.info("NOM DU TABLEAU (ONGLET): " + GS_SN_sheet.title, { numsession: req.session.id }); - - // DATE DE L'INSCRIPTION - moment().format(); - moment.locale('fr'); - var date_formattee = moment().format('L') - console.log("date_formattee:", date_formattee); - - // AJOUTER UNE LIGNE DANS LA GOOGLE SHEET - logger.info("/ AJOUTER UNE LIGNE DANS LA GOOGLE SHEET", { numsession: req.session.id }); - logger.info("req.session.identifiant : " + req.session.identifiant, { numsession: req.session.id }); - logger.info("req.session.adherent_nom : " + req.session.adherent_nom, { numsession: req.session.id }); - const moreRows = await GS_SN_sheet.addRows([ - { - 'saison': "2022/2023", - 'identifiant': req.session.identifiant, - 'association_suzuki': req.session.association, - 'inscription_date': date_formattee, - 'adherent_nom': req.session.adherent_nom, - 'adherent_prenom': req.session.adherent_prenom, - 'inscription_accompte_paiement_montant': req.session.montant_accompte, - 'cout_total': req.session.cout_total, - 'remise': req.session.remise, - 'frais_dossier': req.session.frais_dossier, - 'cout_total_hebergement': req.session.cout_total_hebergement, - 'cout_total_transport': req.session.cout_total_transport, - 'cout_total_dalcroze': req.session.cout_total_dalcroze, - 'cout_total_dalcroze_surplace': req.session.cout_total_dalcroze_surplace, - 'cout_total_percussion': req.session.cout_total_percussion, - 'cout_total_percussion_surplace': req.session.cout_total_percussion_surplace, - 'cout_total_chant': req.session.cout_total_chant, - 'cout_total_observation': req.session.cout_total_observation, - 'cout_total_cours': req.session.cout_total_cours, - 'cout_total_campado': req.session.cout_total_campado, - 'accompte_frais_bancaire': req.session.accompte_frais_bancaire, - 'adherent_adresse_rue': req.session.adherent_adresse_rue, - 'adherent_adresse_complement': req.session.adherent_adresse_complement, - 'adherent_adresse_codepostal': req.session.adherent_adresse_codepostal, - 'adherent_adresse_ville': req.session.adherent_adresse_ville, - 'adherent_adresse_pays': req.session.adherent_adresse_pays, - 'adherent_telephone_fixe': req.session.adherent_telephone_fixe, - 'adherent_telephone_mobile': req.session.adherent_telephone_mobile, - 'adherent_mail': req.session.adherent_mail, - 'hebergement': req.session.hebergement, - 'commentaire_adherent': req.session.commentaire_adherent, - 'personne_1_nom': req.session.personne_1_nom, - 'personne_1_prenom': req.session.personne_1_prenom, - 'personne_1_datenaissance': req.session.personne_1_datenaissance, - 'personne_1_age': req.session.personne_1_profilage, - 'personne_1_transport_mode': req.session.personne_1_transport_mode, - 'personne_1_transport_arret': req.session.personne_1_transport_arret, - 'personne_1_categorie': req.session.personne_1_categorie, - 'personne_1_profil': req.session.personne_1_profil, - 'personne_1_instrument': req.session.personne_1_instrument, - 'personne_1_cahier': req.session.personne_1_cahier, - 'personne_1_piece': req.session.personne_1_piece, - 'personne_1_prof': req.session.personne_1_prof, - 'personne_1_mail_prof': req.session.personne_1_mail_prof, - 'personne_1_option_coursindividuel': req.session.personne_1_option_coursindividuel, - 'personne_1_option_concertsolo': req.session.personne_1_option_concertsolo, - 'personne_1_option_concertsolo_cahier': req.session.personne_1_option_concertsolo_cahier, - 'personne_1_option_concertsolo_piece': req.session.personne_1_option_concertsolo_piece, - 'personne_1_activite_1': req.session.personne_1_activite_1, - 'personne_1_activite_2': req.session.personne_1_activite_2, - 'personne_2_nom': req.session.personne_2_nom, - 'personne_2_prenom': req.session.personne_2_prenom, - 'personne_2_datenaissance': req.session.personne_2_datenaissance, - 'personne_2_age': req.session.personne_2_profilage, - 'personne_2_transport_mode': req.session.personne_2_transport_mode, - 'personne_2_transport_arret': req.session.personne_2_transport_arret, - 'personne_2_categorie': req.session.personne_2_categorie, - 'personne_2_profil': req.session.personne_2_profil, - 'personne_2_instrument': req.session.personne_2_instrument, - 'personne_2_cahier': req.session.personne_2_cahier, - 'personne_2_piece': req.session.personne_2_piece, - 'personne_2_prof': req.session.personne_2_prof, - 'personne_2_mail_prof': req.session.personne_2_mail_prof, - 'personne_2_option_coursindividuel': req.session.personne_2_option_coursindividuel, - 'personne_2_option_concertsolo': req.session.personne_2_option_concertsolo, - 'personne_2_option_concertsolo_cahier': req.session.personne_2_option_concertsolo_cahier, - 'personne_2_option_concertsolo_piece': req.session.personne_2_option_concertsolo_piece, - 'personne_2_activite_1': req.session.personne_2_activite_1, - 'personne_2_activite_2': req.session.personne_2_activite_2, - 'personne_3_nom': req.session.personne_3_nom, - 'personne_3_prenom': req.session.personne_3_prenom, - 'personne_3_datenaissance': req.session.personne_3_datenaissance, - 'personne_3_age': req.session.personne_3_profilage, - 'personne_3_transport_mode': req.session.personne_3_transport_mode, - 'personne_3_transport_arret': req.session.personne_3_transport_arret, - 'personne_3_categorie': req.session.personne_3_categorie, - 'personne_3_profil': req.session.personne_3_profil, - 'personne_3_instrument': req.session.personne_3_instrument, - 'personne_3_cahier': req.session.personne_3_cahier, - 'personne_3_piece': req.session.personne_3_piece, - 'personne_3_prof': req.session.personne_3_prof, - 'personne_3_mail_prof': req.session.personne_3_mail_prof, - 'personne_3_option_coursindividuel': req.session.personne_3_option_coursindividuel, - 'personne_3_option_concertsolo': req.session.personne_3_option_concertsolo, - 'personne_3_option_concertsolo_cahier': req.session.personne_3_option_concertsolo_cahier, - 'personne_3_option_concertsolo_piece': req.session.personne_3_option_concertsolo_piece, - 'personne_3_activite_1': req.session.personne_3_activite_1, - 'personne_3_activite_2': req.session.personne_3_activite_2, - 'personne_4_nom': req.session.personne_4_nom, - 'personne_4_prenom': req.session.personne_4_prenom, - 'personne_4_datenaissance': req.session.personne_4_datenaissance, - 'personne_4_age': req.session.personne_4_profilage, - 'personne_4_transport_mode': req.session.personne_4_transport_mode, - 'personne_4_transport_arret': req.session.personne_4_transport_arret, - 'personne_4_categorie': req.session.personne_4_categorie, - 'personne_4_profil': req.session.personne_4_profil, - 'personne_4_instrument': req.session.personne_4_instrument, - 'personne_4_cahier': req.session.personne_4_cahier, - 'personne_4_piece': req.session.personne_4_piece, - 'personne_4_prof': req.session.personne_4_prof, - 'personne_4_mail_prof': req.session.personne_4_mail_prof, - 'personne_4_option_coursindividuel': req.session.personne_4_option_coursindividuel, - 'personne_4_option_concertsolo': req.session.personne_4_option_concertsolo, - 'personne_4_option_concertsolo_cahier': req.session.personne_4_option_concertsolo_cahier, - 'personne_4_option_concertsolo_piece': req.session.personne_4_option_concertsolo_piece, - 'personne_4_activite_1': req.session.personne_4_activite_1, - 'personne_4_activite_2': req.session.personne_4_activite_2, - 'personne_5_nom': req.session.personne_5_nom, - 'personne_5_prenom': req.session.personne_5_prenom, - 'personne_5_datenaissance': req.session.personne_5_datenaissance, - 'personne_5_age': req.session.personne_5_profilage, - 'personne_5_transport_mode': req.session.personne_5_transport_mode, - 'personne_5_transport_arret': req.session.personne_5_transport_arret, - 'personne_5_categorie': req.session.personne_5_categorie, - 'personne_5_profil': req.session.personne_5_profil, - 'personne_5_instrument': req.session.personne_5_instrument, - 'personne_5_cahier': req.session.personne_5_cahier, - 'personne_5_piece': req.session.personne_5_piece, - 'personne_5_prof': req.session.personne_5_prof, - 'personne_5_mail_prof': req.session.personne_5_mail_prof, - 'personne_5_option_coursindividuel': req.session.personne_5_option_coursindividuel, - 'personne_5_option_concertsolo': req.session.personne_5_option_concertsolo, - 'personne_5_option_concertsolo_cahier': req.session.personne_5_option_concertsolo_cahier, - 'personne_5_option_concertsolo_piece': req.session.personne_5_option_concertsolo_piece, - 'personne_5_activite_1': req.session.personne_5_activite_1, - 'personne_5_activite_2': req.session.personne_5_activite_2, - 'personne_6_nom': req.session.personne_6_nom, - 'personne_6_prenom': req.session.personne_6_prenom, - 'personne_6_datenaissance': req.session.personne_6_datenaissance, - 'personne_6_age': req.session.personne_6_profilage, - 'personne_6_transport_mode': req.session.personne_6_transport_mode, - 'personne_6_transport_arret': req.session.personne_6_transport_arret, - 'personne_6_categorie': req.session.personne_6_categorie, - 'personne_6_profil': req.session.personne_6_profil, - 'personne_6_instrument': req.session.personne_6_instrument, - 'personne_6_cahier': req.session.personne_6_cahier, - 'personne_6_piece': req.session.personne_6_piece, - 'personne_6_prof': req.session.personne_6_prof, - 'personne_6_mail_prof': req.session.personne_6_mail_prof, - 'personne_6_option_coursindividuel': req.session.personne_6_option_coursindividuel, - 'personne_6_option_concertsolo': req.session.personne_6_option_concertsolo, - 'personne_6_option_concertsolo_cahier': req.session.personne_6_option_concertsolo_cahier, - 'personne_6_option_concertsolo_piece': req.session.personne_6_option_concertsolo_piece, - 'personne_6_activite_1': req.session.personne_6_activite_1, - 'personne_6_activite_2': req.session.personne_6_activite_2, - - }, - ]); - - - ////////////////////////////////// - // PAIEMENT STRIPE - - - logger.info("req.session.montant_accompte: " + req.session.montant_accompte, { numsession: req.session.id }); - console.log ("req.session.identifiant: ",req.session.identifiant); - console.log ("process.env.STRIPE_PRIVATE_KEY : ", process.env.STRIPE_PRIVATE_KEY); - - - // STRIPE - ETAPE 1 - CREER l'INTENTION DE PAIEMENT - logger.info("cookiesessionid AVANT Stripe :" + req.session.id, { numsession: req.session.id }); - const session = await stripe.checkout.sessions.create({ - metadata: {cookiesessionid: req.session.id, identifiant: req.session.identifiant}, - customer_email: req.session.adherent_mail, - //There are four different submit types. - submit_type: 'pay', - //success_url: 'http://localhost:8888/inscription/adhesion_paiement/reussi?id={CHECKOUT_SESSION_ID}', - //cancel_url: 'http://localhost:8888/inscription/adhesion_paiement/annule?id={CHECKOUT_SESSION_ID}', - //success_url: 'https://www.adusuki.juliechaumard.paris/inscription/adhesion_paiement/reussi?id={CHECKOUT_SESSION_ID}', - //cancel_url: 'https://www.adusuki.juliechaumard.paris/inscription/adhesion_paiement/annule?id={CHECKOUT_SESSION_ID}', - //success_url: 'https://www.adhesion.afpedagogiesuzuki.fr/inscription/adhesion_paiement/reussi?id={CHECKOUT_SESSION_ID}', - //cancel_url: 'https://www.adhesion.afpedagogiesuzuki.fr/inscription/adhesion_paiement/annule?id={CHECKOUT_SESSION_ID}', - success_url: process.env.STRIPE_SN_SUCCESSURL, - cancel_url: process.env.STRIPE_SN_CANCELURL, - - payment_method_types: ['card'], - line_items: [{ - price_data: { - currency: 'eur', - product_data: { - name: 'Stage annuel accompte', - }, - unit_amount: req.session.montant_accompte * 100, - }, - quantity: 1, - },], - //Checkout has three modes: payment, subscription, or setup. - mode: 'payment' - - }); - - console.log("session: ",session) - console.log("session.id: ",session.id); - logger.info("session.url: " + session.url, { numsession: req.session.id }); - let url_stripe = session.url - res.redirect(session.url) - -} - - -///////////////////////////////////////////////// -// CLICK SUR LE BOUTON ENREGISTRER PAGE RECAP SANS ACOMPTE -const post_enregistrer_inscrip_ssacompte = async function(req, res){ - - logger.info("======================================"); - logger.info("======== FUNCTION post_enregistrer_inscrip_ssacompte =========="); - logger.info("======================================"); - - ////////////////////////////////// - // AJOUT INFO DANS LA GOOGLE SHEET - - - await GS_stagean.useServiceAccountAuth(GS_creds_stagean); - await GS_stagean.loadInfo(); // loads document properties and worksheets - logger.info("NOM FICHIER SHEET : " + GS_stagean.title, { numsession: req.session.id }); - const GS_SN_sheet = GS_stagean.sheetsByTitle['inscription_web']; - logger.info("NOM DU TABLEAU (ONGLET): " + GS_SN_sheet.title, { numsession: req.session.id }); - - // DATE DE L'INSCRIPTION - moment().format(); - moment.locale('fr'); - var date_formattee = moment().format('L') - console.log("date_formattee:", date_formattee); - - // AJOUTER UNE LIGNE DANS LA GOOGLE SHEET - logger.info("/ AJOUTER UNE LIGNE DANS LA GOOGLE SHEET", { numsession: req.session.id }); - logger.info("req.session.identifiant : " + req.session.identifiant, { numsession: req.session.id }); - logger.info("req.session.adherent_nom : " + req.session.adherent_nom, { numsession: req.session.id }); - const moreRows = await GS_SN_sheet.addRows([ - { - 'saison': "2022/2023", - 'identifiant': req.session.identifiant, - 'association_suzuki': req.session.association, - 'inscription_date': date_formattee, - 'adherent_nom': req.session.adherent_nom, - 'adherent_prenom': req.session.adherent_prenom, - 'inscription_accompte_paye': "pas d'acompte", - 'inscription_accompte_paiement_montant': req.session.montant_accompte, - 'cout_total': req.session.cout_total, - 'remise': req.session.remise, - 'cout_total_hebergement': req.session.cout_total_hebergement, - 'cout_total_transport': req.session.cout_total_transport, - 'cout_total_dalcroze': req.session.cout_total_dalcroze, - 'cout_total_dalcroze_surplace': req.session.cout_total_dalcroze_surplace, - 'cout_total_percussion': req.session.cout_total_percussion, - 'cout_total_percussion_surplace': req.session.cout_total_percussion_surplace, - 'cout_total_chant': req.session.cout_total_chant, - 'cout_total_observation': req.session.cout_total_observation, - 'cout_total_cours': req.session.cout_total_cours, - 'cout_total_campado': req.session.cout_total_campado, - 'accompte_frais_bancaire': req.session.accompte_frais_bancaire, - 'adherent_adresse_rue': req.session.adherent_adresse_rue, - 'adherent_adresse_complement': req.session.adherent_adresse_complement, - 'adherent_adresse_codepostal': req.session.adherent_adresse_codepostal, - 'adherent_adresse_ville': req.session.adherent_adresse_ville, - 'adherent_adresse_pays': req.session.adherent_adresse_pays, - 'adherent_telephone_fixe': req.session.adherent_telephone_fixe, - 'adherent_telephone_mobile': req.session.adherent_telephone_mobile, - 'adherent_mail': req.session.adherent_mail, - 'hebergement': req.session.hebergement, - 'commentaire_adherent': req.session.commentaire_adherent, - 'personne_1_nom': req.session.personne_1_nom, - 'personne_1_prenom': req.session.personne_1_prenom, - 'personne_1_datenaissance': req.session.personne_1_datenaissance, - 'personne_1_age': req.session.personne_1_profilage, - 'personne_1_transport_mode': req.session.personne_1_transport_mode, - 'personne_1_transport_arret': req.session.personne_1_transport_arret, - 'personne_1_categorie': req.session.personne_1_categorie, - 'personne_1_profil': req.session.personne_1_profil, - 'personne_1_instrument': req.session.personne_1_instrument, - 'personne_1_cahier': req.session.personne_1_cahier, - 'personne_1_piece': req.session.personne_1_piece, - 'personne_1_prof': req.session.personne_1_prof, - 'personne_1_mail_prof': req.session.personne_1_mail_prof, - 'personne_1_option_coursindividuel': req.session.personne_1_option_coursindividuel, - 'personne_1_option_concertsolo': req.session.personne_1_option_concertsolo, - 'personne_1_option_concertsolo_cahier': req.session.personne_1_option_concertsolo_cahier, - 'personne_1_option_concertsolo_piece': req.session.personne_1_option_concertsolo_piece, - 'personne_1_activite_1': req.session.personne_1_activite_1, - 'personne_1_activite_2': req.session.personne_1_activite_2, - 'personne_2_nom': req.session.personne_2_nom, - 'personne_2_prenom': req.session.personne_2_prenom, - 'personne_2_datenaissance': req.session.personne_2_datenaissance, - 'personne_2_age': req.session.personne_2_profilage, - 'personne_2_transport_mode': req.session.personne_2_transport_mode, - 'personne_2_transport_arret': req.session.personne_2_transport_arret, - 'personne_2_categorie': req.session.personne_2_categorie, - 'personne_2_profil': req.session.personne_2_profil, - 'personne_2_instrument': req.session.personne_2_instrument, - 'personne_2_cahier': req.session.personne_2_cahier, - 'personne_2_piece': req.session.personne_2_piece, - 'personne_2_prof': req.session.personne_2_prof, - 'personne_2_mail_prof': req.session.personne_2_mail_prof, - 'personne_2_option_coursindividuel': req.session.personne_2_option_coursindividuel, - 'personne_2_option_concertsolo': req.session.personne_2_option_concertsolo, - 'personne_2_option_concertsolo_cahier': req.session.personne_2_option_concertsolo_cahier, - 'personne_2_option_concertsolo_piece': req.session.personne_2_option_concertsolo_piece, - 'personne_2_activite_1': req.session.personne_2_activite_1, - 'personne_2_activite_2': req.session.personne_2_activite_2, - 'personne_3_nom': req.session.personne_3_nom, - 'personne_3_prenom': req.session.personne_3_prenom, - 'personne_3_datenaissance': req.session.personne_3_datenaissance, - 'personne_3_age': req.session.personne_3_profilage, - 'personne_3_transport_mode': req.session.personne_3_transport_mode, - 'personne_3_transport_arret': req.session.personne_3_transport_arret, - 'personne_3_categorie': req.session.personne_3_categorie, - 'personne_3_profil': req.session.personne_3_profil, - 'personne_3_instrument': req.session.personne_3_instrument, - 'personne_3_cahier': req.session.personne_3_cahier, - 'personne_3_piece': req.session.personne_3_piece, - 'personne_3_prof': req.session.personne_3_prof, - 'personne_3_mail_prof': req.session.personne_3_mail_prof, - 'personne_3_option_coursindividuel': req.session.personne_3_option_coursindividuel, - 'personne_3_option_concertsolo': req.session.personne_3_option_concertsolo, - 'personne_3_option_concertsolo_cahier': req.session.personne_3_option_concertsolo_cahier, - 'personne_3_option_concertsolo_piece': req.session.personne_3_option_concertsolo_piece, - 'personne_3_activite_1': req.session.personne_3_activite_1, - 'personne_3_activite_2': req.session.personne_3_activite_2, - 'personne_4_nom': req.session.personne_4_nom, - 'personne_4_prenom': req.session.personne_4_prenom, - 'personne_4_datenaissance': req.session.personne_4_datenaissance, - 'personne_4_age': req.session.personne_4_profilage, - 'personne_4_transport_mode': req.session.personne_4_transport_mode, - 'personne_4_transport_arret': req.session.personne_4_transport_arret, - 'personne_4_categorie': req.session.personne_4_categorie, - 'personne_4_profil': req.session.personne_4_profil, - 'personne_4_instrument': req.session.personne_4_instrument, - 'personne_4_cahier': req.session.personne_4_cahier, - 'personne_4_piece': req.session.personne_4_piece, - 'personne_4_prof': req.session.personne_4_prof, - 'personne_4_mail_prof': req.session.personne_4_mail_prof, - 'personne_4_option_coursindividuel': req.session.personne_4_option_coursindividuel, - 'personne_4_option_concertsolo': req.session.personne_4_option_concertsolo, - 'personne_4_option_concertsolo_cahier': req.session.personne_4_option_concertsolo_cahier, - 'personne_4_option_concertsolo_piece': req.session.personne_4_option_concertsolo_piece, - 'personne_4_activite_1': req.session.personne_4_activite_1, - 'personne_4_activite_2': req.session.personne_4_activite_2, - 'personne_5_nom': req.session.personne_5_nom, - 'personne_5_prenom': req.session.personne_5_prenom, - 'personne_5_datenaissance': req.session.personne_5_datenaissance, - 'personne_5_age': req.session.personne_5_profilage, - 'personne_5_transport_mode': req.session.personne_5_transport_mode, - 'personne_5_transport_arret': req.session.personne_5_transport_arret, - 'personne_5_categorie': req.session.personne_5_categorie, - 'personne_5_profil': req.session.personne_5_profil, - 'personne_5_instrument': req.session.personne_5_instrument, - 'personne_5_cahier': req.session.personne_5_cahier, - 'personne_5_piece': req.session.personne_5_piece, - 'personne_5_prof': req.session.personne_5_prof, - 'personne_5_mail_prof': req.session.personne_5_mail_prof, - 'personne_5_option_coursindividuel': req.session.personne_5_option_coursindividuel, - 'personne_5_option_concertsolo': req.session.personne_5_option_concertsolo, - 'personne_5_option_concertsolo_cahier': req.session.personne_5_option_concertsolo_cahier, - 'personne_5_option_concertsolo_piece': req.session.personne_5_option_concertsolo_piece, - 'personne_5_activite_1': req.session.personne_5_activite_1, - 'personne_5_activite_2': req.session.personne_5_activite_2, - 'personne_6_nom': req.session.personne_6_nom, - 'personne_6_prenom': req.session.personne_6_prenom, - 'personne_6_datenaissance': req.session.personne_6_datenaissance, - 'personne_6_age': req.session.personne_6_profilage, - 'personne_6_transport_mode': req.session.personne_6_transport_mode, - 'personne_6_transport_arret': req.session.personne_6_transport_arret, - 'personne_6_categorie': req.session.personne_6_categorie, - 'personne_6_profil': req.session.personne_6_profil, - 'personne_6_instrument': req.session.personne_6_instrument, - 'personne_6_cahier': req.session.personne_6_cahier, - 'personne_6_piece': req.session.personne_6_piece, - 'personne_6_prof': req.session.personne_6_prof, - 'personne_6_mail_prof': req.session.personne_6_mail_prof, - 'personne_6_option_coursindividuel': req.session.personne_6_option_coursindividuel, - 'personne_6_option_concertsolo': req.session.personne_6_option_concertsolo, - 'personne_6_option_concertsolo_cahier': req.session.personne_6_option_concertsolo_cahier, - 'personne_6_option_concertsolo_piece': req.session.personne_6_option_concertsolo_piece, - 'personne_6_activite_1': req.session.personne_6_activite_1, - 'personne_6_activite_2': req.session.personne_6_activite_2, - - }, - ]); - - - ////////////////////////////////////////////////////////////////////////////// - // CONFIRMATION PAR MAIL - - console.log("MAIL ENVOI AVANT"); - var transporter = nodemailer.createTransport({ - service: 'gmail', - auth: { - // TEST JULIE - //user: 'juliechaumard@gmail.com', - //pass: 'etfq umof iwbx ltxk' - // SUZUKI - user: 'afps.inscription@gmail.com', - pass: 'vljxrkhwgljjracs' - } - }); - var mail_objet = "ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI - STAGE ANNUEL 2022/2023 - "; - mail_objet += req.session.adherent_nom; - mail_html = "

Cher adhérent,

Félicitations ! Vous êtes désormais inscrit au stage annuel de l’Association Française pour la Pédagogie Suzuki (http://www.afpedagogiesuzuki.fr) qui se tiendra du 20 au 25 août 2023.

"; - - mail_html += "
"; - mail_html += "

RÉCAPITULATIF :

"; - mail_html += "

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

Association Suzuki : "; - mail_html += req.session.association; - mail_html += "

Mode d'hébergement : "; - mail_html += req.session.hebergement; - mail_html += "


"; - for (let toto = 1; toto<7; toto++) { - if (req.session["personne_"+toto+"_nom"]) { - mail_html += "

Nom : "; - mail_html += req.session["personne_"+toto+"_nom"]; - mail_html += " "; - mail_html += req.session["personne_"+toto+"_prenom"]; - mail_html += "

Profile âge : "; - mail_html += req.session["personne_"+toto+"_age"]; - mail_html += "

Catégorie : "; - mail_html += req.session["personne_"+toto+"_categorie"]; - if (req.session["personne_"+toto+"_profil"]) { - mail_html += " "; - mail_html += req.session["personne_"+toto+"_profil"]; - } - mail_html += "

Mode de transport : "; - mail_html += req.session["personne_"+toto+"_transport_mode"]; - mail_html += " "; - mail_html += req.session["personne_"+toto+"_transport_arret"]; - mail_html += "

"; - if (req.session["personne_"+toto+"_instrument"]) { - mail_html += "

Instrument : "; - mail_html += req.session["personne_"+toto+"_instrument"]; - mail_html += " "; - mail_html += req.session["personne_"+toto+"_cahier"]; - mail_html += " "; - mail_html += req.session["personne_"+toto+"_option_coursindividuel"]; - mail_html += "

"; - } - if (req.session["personne_"+toto+"_activite_1"]) { - mail_html += "

Activité : "; - mail_html += req.session["personne_"+toto+"_activite_1"]; - mail_html += " "; - mail_html += req.session["personne_"+toto+"_activite_2"]; - mail_html += "

"; - } - if (req.session["personne_"+toto+"_cout_hebergement"]) { - mail_html += "

Coût hébergement : "; - mail_html += req.session["personne_"+toto+"_cout_hebergement"]; - mail_html += "

"; - } - if (req.session["personne_"+toto+"_cout_transport"]) { - mail_html += "

Coût transport : "; - mail_html += req.session["personne_"+toto+"_cout_transport"]; - mail_html += "

"; - } - if (req.session["personne_"+toto+"_campado_cout"]) { - mail_html += "

Coût camp ado : "; - mail_html += req.session["personne_"+toto+"_campado_cout"]; - mail_html += "

"; - } - if (req.session["personne_"+toto+"_cours_cout"]) { - mail_html += "

Coût cours : "; - mail_html += req.session["personne_"+toto+"_cours_cout"]; - mail_html += "

"; - } - if (req.session["personne_"+toto+"_activite_cout"]) { - mail_html += "

Coût activité : "; - mail_html += req.session["personne_"+toto+"_activite_cout"]; - mail_html += "

"; - } - if (req.session["personne_"+toto+"_observation_cout"]) { - mail_html += "

Coût observation : "; - mail_html += req.session["personne_"+toto+"_observation_cout"]; - mail_html += "

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

Coût total : "; - mail_html += req.session.cout_total; - mail_html += "

Remise : "; - mail_html += req.session.remise; - mail_html += "

Frais bancaire de l'acompte : "; - mail_html += req.session.accompte_frais_bancaire; - mail_html += "

Montant de l'acompte versé : "; - mail_html += req.session.inscription_accompte_paiement_montant; - mail_html += "

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

Coût activité Dalcroze adulte à payer sur place : "; - mail_html += req.session.cout_total_dalcroze_surplace; - mail_html += "€

"; - } - if (req.session.cout_total_percussion_surplace > 0) { - mail_html += "

Coût activité percussions adulte à payer sur place : "; - mail_html += req.session.cout_total_percussion_surplace; - mail_html += "€

"; - } - - mail_html += "


Nous vous remercions pour votre intérêt et vous souhaitons une très bon stage !

Association Française pour la pédagogie Suzuki
Anne-Laure SAUVEGRAIN
Pôle organisation du stage

"; - var mailOptions = { - from: 'afps.inscription@gmail.com', - to: req.session.adherent_mail, - subject: mail_objet, - html: mail_html, - }; - transporter.sendMail(mailOptions, function(error, info){ - if (error) { - logger.info("error : " + error, { numsession: req.session.id}); - } else { - console.log('Email sent: ' + info.response); - } - }); - console.log("MAIL ENVOI APRES"); - - - // REDIRECTION VERS LA PAGE DE CONFIRMATION PAIEMENT CARTE BANCAIRE - res.locals.identifiant = req.session.identifiant; - res.locals.association = req.session.association; - res.locals.adherent_nom = req.session.adherent_nom; - res.locals.adherent_prenom = req.session.adherent_prenom; - res.locals.adherent_adresse_rue = req.session.adherent_adresse_rue; - res.locals.adherent_adresse_complement = req.session.adherent_adresse_complement; - res.locals.adherent_adresse_codepostal = req.session.adherent_adresse_codepostal; - res.locals.adherent_adresse_ville = req.session.adherent_adresse_ville; - res.locals.adherent_adresse_pays = req.session.adherent_adresse_pays; - res.locals.adherent_telephone_mobile = req.session.adherent_telephone_mobile; - res.locals.adherent_telephone_fixe = req.session.adherent_telephone_fixe; - res.locals.adherent_mail = req.session.adherent_mail; - res.locals.hebergement = req.session.hebergement; - res.locals.commentaire_adherent = req.session.commentaire_adherent; - - - for (let toto = 1; toto < 7; 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+"_profilage"] = req.session["personne_"+toto+"_profilage"]; - res.locals["personne_"+toto+"_categorie"] = req.session["personne_"+toto+"_categorie"]; - res.locals["personne_"+toto+"_profil"] = req.session["personne_"+toto+"_profil"]; - res.locals["personne_"+toto+"_transport_mode"] = req.session["personne_"+toto+"_transport_mode"]; - res.locals["personne_"+toto+"_transport_arret"] = req.session["personne_"+toto+"_transport_arret"] - res.locals["personne_"+toto+"_instrument"] = req.session["personne_"+toto+"_instrument"]; - res.locals["personne_"+toto+"_cahier"] = req.session["personne_"+toto+"_cahier"]; - res.locals["personne_"+toto+"_option_coursindividuel"] = req.session["personne_"+toto+"_option_coursindividuel"]; - res.locals["personne_"+toto+"_option_concertsolo"] = req.session["personne_"+toto+"_option_concertsolo"]; - res.locals["personne_"+toto+"_activite_1"] = req.session["personne_"+toto+"_activite_1"]; - res.locals["personne_"+toto+"_activite_2"] = req.session["personne_"+toto+"_activite_2"]; - res.locals["personne_"+toto+"_cout_hebergement"] = req.session["personne_"+toto+"_cout_hebergement"]; - res.locals["personne_"+toto+"_cout_transport"] = req.session["personne_"+toto+"_cout_transport"]; - res.locals["personne_"+toto+"_activite_cout"] = req.session["personne_"+toto+"_activite_cout"]; - res.locals["personne_"+toto+"_observation_cout"] = req.session["personne_"+toto+"_observation_cout"]; - res.locals["personne_"+toto+"_cours_cout"] = req.session["personne_"+toto+"_cours_cout"]; - res.locals["personne_"+toto+"_campado_cout"] = req.session["personne_"+toto+"_campado_cout"]; - } - res.locals.cout_total = req.session.cout_total; - res.locals.remise = req.session.remise; - res.locals.accompte_frais_bancaire = req.session.accompte_frais_bancaire; - res.locals.montant_accompte = req.session.inscription_accompte_paiement_montant; - - if (!req.session.identifiant) { - res.locals.error = "Il y a eu une erreur lors de l'ajout de votre inscription dans la base de données du stage, veuillez contacter l'association Suzuki par mail pour le signaler à l'adresse StgNational@gmail.com"; - } - - res.render('stagenat/page_templates/inscription_reussi.ejs'); -} - - - -///////////////////////////////////////////////// -// RETOUR PAIEMENT REUSSI -const SN_accompte_reussi = async function(req, res){ - - logger.info("======================================"); - logger.info("======== FUNCTION SN_accompte_reussi =========="); - logger.info("======================================"); - - // RETOUR STRIPE - var id = req.query.id; - - logger.info("id : " + id, { numsession: req.session.id }); - - const session_stripe = await stripe.checkout.sessions.retrieve(id); - - var customer_email = session_stripe.customer_email; - var payment_status = session_stripe.payment_status; - var amount_total = session_stripe.amount_total/100; - var stripe_customer = session_stripe.customer; - var stripe_payment_intent = session_stripe.payment_intent; - var payment_method_types = session_stripe.payment_method_types; - var stripe_status = session_stripe.status; - var identifiant = session_stripe.metadata.identifiant; - var CB_retour = "identifiant_adherent:"+identifiant+",payment_status:"+payment_status+",stripe_customer:"+stripe_customer+",stripe_payment_intent:"+stripe_payment_intent+",sessionID:"+session_stripe.id+",payment_method_types:"+payment_method_types+",amount_total:"+amount_total+",stripe_status:"+stripe_status; - logger.info("cookiesessionid APRES Stripe :" + session_stripe.metadata.cookiesessionid, { numsession: req.session.id }); - var cookiesessionid = session_stripe.metadata.cookiesessionid; - console.log("customer_email: ", customer_email); - logger.info("payment_status : " + payment_status, { numsession: req.session.id }); - console.log("stripe_customer: ", stripe_customer); - console.log("amount_total: ", amount_total); - console.log("stripe_payment_intent: ", stripe_payment_intent); - console.log("payment_method_types: ", payment_method_types); - console.log("payment_method_types: ", payment_method_types[0]); - console.log("stripe_status: ", stripe_status); - console.log("CB_retour: ", CB_retour); - - - - ////////////////////////////////////////////////////////////////////////////// - // RÉCUPÉRATION DES INFOS STAGIAIRES DANS LA GOOGLE SHEET - // MISE À JOUR DES INFORMATIONS SUR LE PAIEMENT DANS LA BASE DE DONNÉES GSHEET - - - await GS_stagean.useServiceAccountAuth(GS_creds_stagean); - await GS_stagean.loadInfo(); // loads document properties and worksheets - console.log("NOM FICHIER SHEET: ",GS_stagean.title); //nom du fichier - const GS_SN_sheet = GS_stagean.sheetsByTitle['inscription_web']; - logger.info("NOM DU TABLEAU (ONGLET): " + GS_SN_sheet.title, { numsession: req.session.id }); - - // on récupère le contenu de la GSheet dans un array nommé "infos_adherents" - const infos_adherents = await GS_SN_sheet.getRows(); - // on récupère quelle ligne contient l'identifiant concerné pour mettre à jour cette ligne - let list_identifiants = new Array; - let compteur = GS_SN_sheet.rowCount - 1; - let rowToBeUpdate; - logger.info("identifiant TRANSMIS PAR STRIPE :" + identifiant, { numsession: req.session.id }); - for (let i=0; i 0) { - //await GS_stagean.useServiceAccountAuth(GS_creds_stagean); - //await GS_stagean.loadInfo(); // loads document properties and worksheets - logger.info("NOM FICHIER SHEET : " + GS_stagean.title, { numsession: req.session.id }); - const GS_SN_sheet_campado = GS_stagean.sheetsByTitle['campado']; - logger.info("NOM DU TABLEAU (ONGLET): " + GS_SN_sheet_campado.title, { numsession: req.session.id }); - await GS_SN_sheet_campado.loadCells('B1:B2'); - const GS_SN_sheet_campado_b2 = GS_SN_sheet_campado.getCellByA1('B2'); - logger.info("CONTENU DE LA CELLULE B2 : " + GS_SN_sheet_campado_b2.value, { numsession: req.session.id }); - GS_SN_sheet_campado_b2.value -= compteur_ado_a_ajouter; - logger.info("CONTENU DE LA CELLULE B2 APRES SOUSTRACTION DU COMPTEUR ADO : " + GS_SN_sheet_campado_b2, { numsession: req.session.id }); - await GS_SN_sheet_campado.saveUpdatedCells(); - } - - - ////////////////////////////////////////////////////////////////////////////// - // CONFIRMATION PAR MAIL - - console.log("MAIL ENVOI AVANT"); - var transporter = nodemailer.createTransport({ - service: 'gmail', - auth: { - // TEST JULIE - //user: 'juliechaumard@gmail.com', - //pass: 'etfq umof iwbx ltxk' - // SUZUKI - user: 'afps.inscription@gmail.com', - pass: 'vljxrkhwgljjracs' - } - }); - var mail_objet = "ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI - STAGE ANNUEL 2022/2023 - "; - mail_objet += infos_adherents[rowToBeUpdate].adherent_nom; - mail_html = "

Cher adhérent,

Félicitations ! Vous êtes désormais inscrit au stage annuel de l’Association Française pour la Pédagogie Suzuki (http://www.afpedagogiesuzuki.fr) qui se tiendra du 20 au 25 août 2023.

"; - - mail_html += "
"; - mail_html += "

RÉCAPITULATIF :

"; - mail_html += "

Identifiant Suzuki : "; - mail_html += identifiant; - mail_html += "

Association Suzuki : "; - mail_html += infos_adherents[rowToBeUpdate].association_suzuki; - mail_html += "

Mode d'hébergement : "; - mail_html += infos_adherents[rowToBeUpdate].hebergement; - mail_html += "


"; - for (let toto = 1; toto<7; toto++) { - if (infos_adherents[rowToBeUpdate]["personne_"+toto+"_nom"]) { - mail_html += "

Nom : "; - mail_html += infos_adherents[rowToBeUpdate]["personne_"+toto+"_nom"]; - mail_html += " "; - mail_html += infos_adherents[rowToBeUpdate]["personne_"+toto+"_prenom"]; - mail_html += "

Profile âge : "; - mail_html += infos_adherents[rowToBeUpdate]["personne_"+toto+"_age"]; - mail_html += "

Catégorie : "; - mail_html += infos_adherents[rowToBeUpdate]["personne_"+toto+"_categorie"]; - if (infos_adherents[rowToBeUpdate]["personne_"+toto+"_profil"]) { - mail_html += " "; - mail_html += infos_adherents[rowToBeUpdate]["personne_"+toto+"_profil"]; - } - mail_html += "

Mode de transport : "; - mail_html += infos_adherents[rowToBeUpdate]["personne_"+toto+"_transport_mode"]; - mail_html += " "; - mail_html += infos_adherents[rowToBeUpdate]["personne_"+toto+"_transport_arret"]; - mail_html += "

"; - if (infos_adherents[rowToBeUpdate]["personne_"+toto+"_instrument"]) { - mail_html += "

Instrument : "; - mail_html += infos_adherents[rowToBeUpdate]["personne_"+toto+"_instrument"]; - mail_html += " "; - mail_html += infos_adherents[rowToBeUpdate]["personne_"+toto+"_cahier"]; - mail_html += " "; - mail_html += infos_adherents[rowToBeUpdate]["personne_"+toto+"_option_coursindividuel"]; - mail_html += "

"; - } - if (infos_adherents[rowToBeUpdate]["personne_"+toto+"_activite_1"]) { - mail_html += "

Activité : "; - mail_html += infos_adherents[rowToBeUpdate]["personne_"+toto+"_activite_1"]; - mail_html += " "; - mail_html += infos_adherents[rowToBeUpdate]["personne_"+toto+"_activite_2"]; - mail_html += "

"; - } - if (infos_adherents[rowToBeUpdate]["personne_"+toto+"_cout_hebergement"]) { - mail_html += "

Coût hébergement : "; - mail_html += infos_adherents[rowToBeUpdate]["personne_"+toto+"_cout_hebergement"]; - mail_html += "

"; - } - if (infos_adherents[rowToBeUpdate]["personne_"+toto+"_cout_transport"]) { - mail_html += "

Coût transport : "; - mail_html += infos_adherents[rowToBeUpdate]["personne_"+toto+"_cout_transport"]; - mail_html += "

"; - } - if (infos_adherents[rowToBeUpdate]["personne_"+toto+"_campado_cout"]) { - mail_html += "

Coût camp ado : "; - mail_html += infos_adherents[rowToBeUpdate]["personne_"+toto+"_campado_cout"]; - mail_html += "

"; - } - if (infos_adherents[rowToBeUpdate]["personne_"+toto+"_cours_cout"]) { - mail_html += "

Coût cours : "; - mail_html += infos_adherents[rowToBeUpdate]["personne_"+toto+"_cours_cout"]; - mail_html += "

"; - } - if (infos_adherents[rowToBeUpdate]["personne_"+toto+"_activite_cout"]) { - mail_html += "

Coût activité : "; - mail_html += infos_adherents[rowToBeUpdate]["personne_"+toto+"_activite_cout"]; - mail_html += "

"; - } - if (infos_adherents[rowToBeUpdate]["personne_"+toto+"_observation_cout"]) { - mail_html += "

Coût observation : "; - mail_html += infos_adherents[rowToBeUpdate]["personne_"+toto+"_observation_cout"]; - mail_html += "

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

Coût total : "; - mail_html += infos_adherents[rowToBeUpdate].cout_total; - mail_html += "

Remise : "; - mail_html += infos_adherents[rowToBeUpdate].remise; - mail_html += "

Frais bancaire de l'acompte : "; - mail_html += infos_adherents[rowToBeUpdate].accompte_frais_bancaire; - mail_html += "

Montant de l'acompte versé : "; - mail_html += infos_adherents[rowToBeUpdate].inscription_accompte_paiement_montant; - mail_html += "

"; - - if (infos_adherents[rowToBeUpdate].cout_total_dalcroze_surplace > 0) { - mail_html += "

Coût activité Dalcroze adulte à payer sur place : "; - mail_html += infos_adherents[rowToBeUpdate].cout_total_dalcroze_surplace; - mail_html += "€

"; - } - if (infos_adherents[rowToBeUpdate].cout_total_percussion_surplace > 0) { - mail_html += "

Coût activité percussions adulte à payer sur place : "; - mail_html += infos_adherents[rowToBeUpdate].cout_total_percussion_surplace; - mail_html += "€

"; - } - - mail_html += "


Nous vous remercions pour votre intérêt et vous souhaitons une très bon stage !

Association Française pour la pédagogie Suzuki
Anne-Laure SAUVEGRAIN
Pôle organisation du stage

"; - var mailOptions = { - from: 'afps.inscription@gmail.com', - to: customer_email, - subject: mail_objet, - html: mail_html, - }; - transporter.sendMail(mailOptions, function(error, info){ - if (error) { - logger.info("error : " + error, { numsession: req.session.id}); - } else { - console.log('Email sent: ' + info.response); - } - }); - console.log("MAIL ENVOI APRES"); - - - // REDIRECTION VERS LA PAGE DE CONFIRMATION PAIEMENT CARTE BANCAIRE - res.locals.identifiant = infos_adherents[rowToBeUpdate].identifiant; - res.locals.association = infos_adherents[rowToBeUpdate].association_suzuki; - res.locals.adherent_nom = infos_adherents[rowToBeUpdate].adherent_nom; - res.locals.adherent_prenom = infos_adherents[rowToBeUpdate].adherent_prenom; - res.locals.adherent_adresse_rue = infos_adherents[rowToBeUpdate].adherent_adresse_rue; - res.locals.adherent_adresse_complement = infos_adherents[rowToBeUpdate].adherent_adresse_complement; - res.locals.adherent_adresse_codepostal = infos_adherents[rowToBeUpdate].adherent_adresse_codepostal; - res.locals.adherent_adresse_ville = infos_adherents[rowToBeUpdate].adherent_adresse_ville; - res.locals.adherent_adresse_pays = infos_adherents[rowToBeUpdate].adherent_adresse_pays; - res.locals.adherent_telephone_mobile = infos_adherents[rowToBeUpdate].adherent_telephone_mobile; - res.locals.adherent_telephone_fixe = infos_adherents[rowToBeUpdate].adherent_telephone_fixe; - res.locals.adherent_mail = infos_adherents[rowToBeUpdate].adherent_mail; - res.locals.hebergement = infos_adherents[rowToBeUpdate].hebergement; - res.locals.commentaire_adherent = infos_adherents[rowToBeUpdate].commentaire_adherent; - - - for (let toto = 1; toto < 7; toto++) { - res.locals["personne_"+toto+"_numero"] = toto; - res.locals["personne_"+toto+"_nom"] = infos_adherents[rowToBeUpdate]["personne_"+toto+"_nom"]; - res.locals["personne_"+toto+"_prenom"] = infos_adherents[rowToBeUpdate]["personne_"+toto+"_prenom"]; - res.locals["personne_"+toto+"_profilage"] = infos_adherents[rowToBeUpdate]["personne_"+toto+"_profilage"]; - res.locals["personne_"+toto+"_categorie"] = infos_adherents[rowToBeUpdate]["personne_"+toto+"_categorie"]; - res.locals["personne_"+toto+"_profil"] = infos_adherents[rowToBeUpdate]["personne_"+toto+"_profil"]; - res.locals["personne_"+toto+"_transport_mode"] = infos_adherents[rowToBeUpdate]["personne_"+toto+"_transport_mode"]; - res.locals["personne_"+toto+"_transport_arret"] = infos_adherents[rowToBeUpdate]["personne_"+toto+"_transport_arret"] - res.locals["personne_"+toto+"_instrument"] = infos_adherents[rowToBeUpdate]["personne_"+toto+"_instrument"]; - res.locals["personne_"+toto+"_cahier"] = infos_adherents[rowToBeUpdate]["personne_"+toto+"_cahier"]; - res.locals["personne_"+toto+"_option_coursindividuel"] = infos_adherents[rowToBeUpdate]["personne_"+toto+"_option_coursindividuel"]; - res.locals["personne_"+toto+"_option_concertsolo"] = infos_adherents[rowToBeUpdate]["personne_"+toto+"_option_concertsolo"]; - res.locals["personne_"+toto+"_activite_1"] = infos_adherents[rowToBeUpdate]["personne_"+toto+"_activite_1"]; - res.locals["personne_"+toto+"_activite_2"] = infos_adherents[rowToBeUpdate]["personne_"+toto+"_activite_2"]; - res.locals["personne_"+toto+"_cout_hebergement"] = infos_adherents[rowToBeUpdate]["personne_"+toto+"_cout_hebergement"]; - res.locals["personne_"+toto+"_cout_transport"] = infos_adherents[rowToBeUpdate]["personne_"+toto+"_cout_transport"]; - res.locals["personne_"+toto+"_activite_cout"] = infos_adherents[rowToBeUpdate]["personne_"+toto+"_activite_cout"]; - res.locals["personne_"+toto+"_observation_cout"] = infos_adherents[rowToBeUpdate]["personne_"+toto+"_observation_cout"]; - res.locals["personne_"+toto+"_cours_cout"] = infos_adherents[rowToBeUpdate]["personne_"+toto+"_cours_cout"]; - res.locals["personne_"+toto+"_campado_cout"] = infos_adherents[rowToBeUpdate]["personne_"+toto+"_campado_cout"]; - } - res.locals.cout_total = infos_adherents[rowToBeUpdate].cout_total; - res.locals.remise = infos_adherents[rowToBeUpdate].remise; - res.locals.accompte_frais_bancaire = infos_adherents[rowToBeUpdate].accompte_frais_bancaire; - res.locals.montant_accompte = infos_adherents[rowToBeUpdate].inscription_accompte_paiement_montant; - - if (!infos_adherents[rowToBeUpdate].identifiant) { - res.locals.error = "Il y a eu une erreur lors de l'ajout de votre inscription dans la base de données du stage, veuillez contacter l'association Suzuki par mail pour le signaler à l'adresse StgNational@gmail.com"; - } - - res.render('stagenat/page_templates/paiement_reussi.ejs'); -} - - -///////////////////////////////////////////////// -// RETOUR PAIEMENT ECHOUE -// CLICK SUR BOUTON RECOMMENCER -const SN_accompte_annule = async function(req, res) { - - - - logger.info("======================================"); - logger.info("======== FUNCTION SN_accompte_echoue =========="); - logger.info("======================================"); - - // RETOUR STRIPE - var id = req.query.id; - - logger.info("id : " + id, { numsession: req.session.id }); - - const session_stripe = await stripe.checkout.sessions.retrieve(id); - - var customer_email = session_stripe.customer_email; - var payment_status = session_stripe.payment_status; - var amount_total = session_stripe.amount_total/100; - var stripe_customer = session_stripe.customer; - var stripe_payment_intent = session_stripe.payment_intent; - var payment_method_types = session_stripe.payment_method_types; - var stripe_status = session_stripe.status; - var identifiant = session_stripe.metadata.identifiant; - var CB_retour = "identifiant_adherent:"+identifiant+",payment_status:"+payment_status+",stripe_customer:"+stripe_customer+",stripe_payment_intent:"+stripe_payment_intent+",sessionID:"+session_stripe.id+",payment_method_types:"+payment_method_types+",amount_total:"+amount_total+",stripe_status:"+stripe_status; - logger.info("cookiesessionid APRES Stripe :" + session_stripe.metadata.cookiesessionid, { numsession: req.session.id }); - var cookiesessionid = session_stripe.metadata.cookiesessionid; - - logger.info("payment_status : " + payment_status, { numsession: req.session.id }); - - - ////////////////////////////////////////////////////////////////////////////// - // RÉCUPÉRATION DES INFOS STAGIAIRES DANS LA GOOGLE SHEET - // ANNULATION DE L'INSCRIT DANS LA BASE DE DONNÉES GSHEET - // GSHEET "identifiant" = ANNULE / "paye" = echec - - - await GS_stagean.useServiceAccountAuth(GS_creds_stagean); - await GS_stagean.loadInfo(); // loads document properties and worksheets - console.log("NOM FICHIER SHEET: ",GS_stagean.title); //nom du fichier - const GS_SN_sheet = GS_stagean.sheetsByTitle['inscription_web']; - logger.info("NOM DU TABLEAU (ONGLET): " + GS_SN_sheet.title, { numsession: req.session.id }); - - // on récupère le contenu de la GSheet dans un array nommé "infos_adherents" - const infos_adherents = await GS_SN_sheet.getRows(); - // on récupère quelle ligne contient l'identifiant concerné pour mettre à jour cette ligne - let list_identifiants = new Array; - let compteur = GS_SN_sheet.rowCount - 1; - let rowToBeUpdate; - logger.info("identifiant TRANSMIS PAR STRIPE :" + identifiant, { numsession: req.session.id }); - for (let i=0; i { + // 1) chercher par legacy_id + const q = new URLSearchParams({ "filters[adherent_mail][$eq]": payload.data.adherent_mail || "" }); + const getUrl = `${DOMAIN_STRAPI}/api/adherent-professeurs?${q.toString()}`; + const r0 = await fetch(getUrl, { headers: { Authorization: `Bearer ${strapi_token}` }}); + const j0 = await r0.json(); + const found = j0?.data?.[0]; + + if (found?.id) { + // déjà présent → on NE LÈVE PAS d’erreur, on signale juste un skip + return { action: "skip_existing", id: found.id }; + } else { + const postUrl = `${DOMAIN_STRAPI}/api/adherent-professeurs`; + const r = await fetch(postUrl, { + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${strapi_token}` + }, + body: JSON.stringify(payload) + }); + if (!r.ok) { + const txt = await r.text(); + throw new Error(`POST ${postUrl} -> ${r.status} ${txt}`); + } + const j = await r.json(); + return { action: "create", id: j?.data?.id }; + } + }; + + // ==== RÉCUPÉRATION DES DONNÉES SUR LES PROFS DANS LA DB ==== + const [rows] = await db_connection_promise.query(` + SELECT + ID, + association_suzuki, + adherent_nom, + adherent_prenom, + adherent_mail, + adherent_telephone_mobile, + adherent_prof_instrument1, + adherent_prof_instrument1_esa, + adherent_prof_instrument2, + adherent_prof_instrument2_esa, + adherent_prof_sece, + adherent_prof_ecole1, + adherent_prof_ecole1_mail, + adherent_prof_ecole1_web, + adherent_prof_ecole1_cp, + adherent_prof_ecole1_ville, + adherent_prof_ecole2, + adherent_prof_ecole2_mail, + adherent_prof_ecole2_web, + adherent_prof_ecole2_cp, + adherent_prof_ecole2_ville, + adherent_prof_ecole3, + adherent_prof_ecole3_mail, + adherent_prof_ecole3_web, + adherent_prof_ecole3_adresse, + adherent_prof_ecole3_cp, + adherent_prof_ecole3_ville + FROM adherent_professeur + `); + + console.log('rows = ', rows); + + + // ==== GEO helpers ==== + // pour l'ajout de la lat, long et region dans les données de strapi pour le prof + let CP_MAP = null; + + async function loadCpMap(filePath = "src/data/cp_region_lat_long.json") { + if (CP_MAP) return CP_MAP; + const buf = await fs.readFile(filePath, "utf8"); + CP_MAP = JSON.parse(buf); + return CP_MAP; + } + function normalizeCp(cp) { + if (!cp) return null; + const s = String(cp).trim().replace(/\s+/g, ""); + return /^\d{5}$/.test(s) ? s : null; + } + + function pickProfPostalCode(cp) { + return ( + normalizeCp(cp) || null + ); + } + + // helper pour convertir en number sûr (gère "48,85" et strings) + const toNum = (v) => { + if (v == null) return null; + const n = (typeof v === "number") ? v : parseFloat(String(v).replace(",", ".")); + return Number.isFinite(n) ? n : null; + }; + + const cpMap = await loadCpMap("src/data/cp_region_lat_long.json"); + + // ==== AJOUT DES PROFS DANS STRAPI ==== + let creates = 0, errors = 0; + let attempted = 0, skipped_existing = 0; + + for (const r of rows) { + // 3.1 choisir le CP prioritaire + const cp_1 = pickProfPostalCode(r.adherent_prof_ecole1_cp); + const cp_2 = pickProfPostalCode(r.adherent_prof_ecole2_cp); + const cp_3 = pickProfPostalCode(r.adherent_prof_ecole3_cp); + let geo_lat_1 = null, geo_lng_1 = null, geo_region_1 = null; + let geo_lat_2 = null, geo_lng_2 = null, geo_region_2 = null; + let geo_lat_3 = null, geo_lng_3 = null, geo_region_3 = null; + + if (cp_1 && cpMap[cp_1]) { + const meta = cpMap[cp_1]; + // tolérance: on ne renseigne que si lat/lng sont présents + geo_lat_1 = toNum(meta.lat); + geo_lng_1 = toNum(meta.lng); + geo_region_1 = meta.region ? String(meta.region) : null; + } + if (cp_2 && cpMap[cp_2]) { + const meta = cpMap[cp_2]; + // tolérance: on ne renseigne que si lat/lng sont présents + geo_lat_2 = toNum(meta.lat); + geo_lng_2 = toNum(meta.lng); + geo_region_2 = meta.region ? String(meta.region) : null; + } + if (cp_3 && cpMap[cp_2]) { + const meta = cpMap[cp_3]; + // tolérance: on ne renseigne que si lat/lng sont présents + geo_lat_3 = toNum(meta.lat); + geo_lng_3 = toNum(meta.lng); + geo_region_3 = meta.region ? String(meta.region) : null; + } + // 3.2 payload de base + const data = { + legacy_id: r.ID.toString().trim(), + association_suzuki: r.association_suzuki?.trim() || null, + adherent_nom: r.adherent_nom?.trim() || null, + adherent_prenom: r.adherent_prenom?.trim() || null, + adherent_mail: r.adherent_mail?.toString().trim().toLowerCase() || null, + adherent_telephone_mobile: r.adherent_telephone_mobile?.trim() || null, + adherent_prof_instrument1: r.adherent_prof_instrument1?.trim() || null, + adherent_prof_instrument1_niveau: r.adherent_prof_instrument1_esa?.trim() || null, + adherent_prof_instrument2: r.adherent_prof_instrument2?.trim() || null, + adherent_prof_instrument2_niveau: r.adherent_prof_instrument2_esa?.trim() || null, + adherent_prof_sece: r.adherent_prof_sece?.trim() || null, + adherent_prof_ecole1: r.adherent_prof_ecole1?.trim() || null, + adherent_prof_ecole1_mail: r.adherent_prof_ecole1_mail?.trim() || null, + adherent_prof_ecole1_web: r.adherent_prof_ecole1_web?.trim() || null, + adherent_prof_ecole1_cp: r.adherent_prof_ecole1_cp?.trim() || null, + adherent_prof_ecole1_ville: r.adherent_prof_ecole1_ville?.trim() || null, + adherent_prof_ecole2: r.adherent_prof_ecole2?.trim() || null, + adherent_prof_ecole2_mail: r.adherent_prof_ecole2_mail?.trim() || null, + adherent_prof_ecole2_web: r.adherent_prof_ecole2_web?.trim() || null, + adherent_prof_ecole2_cp: r.adherent_prof_ecole2_cp?.trim() || null, + adherent_prof_ecole2_ville: r.adherent_prof_ecole2_ville?.trim() || null, + adherent_prof_ecole3: r.adherent_prof_ecole3?.trim() || null, + adherent_prof_ecole3_mail: r.adherent_prof_ecole3_mail?.trim() || null, + adherent_prof_ecole3_web: r.adherent_prof_ecole3_web?.trim() || null, + adherent_prof_ecole3_adresse: r.adherent_prof_ecole3_adresse?.trim() || null, + adherent_prof_ecole3_cp: r.adherent_prof_ecole3_cp?.trim() || null, + adherent_prof_ecole3_ville: r.adherent_prof_ecole3_ville?.trim() || null, + // >>> Injecte UNIQUEMENT des scalaires, si valides + ...(geo_region_1 ? { adherent_prof_ecole1_region: geo_region_1 } : {}), + ...(geo_lat_1 != null ? { adherent_prof_ecole1_lat: geo_lat_1 } : {}), + ...(geo_lng_1 != null ? { adherent_prof_ecole1_long: geo_lng_1 } : {}), + ...(geo_region_2 ? { adherent_prof_ecole1_region: geo_region_2 } : {}), + ...(geo_lat_2 != null ? { adherent_prof_ecole1_lat: geo_lat_2 } : {}), + ...(geo_lng_2 != null ? { adherent_prof_ecole1_long: geo_lng_2 } : {}), + ...(geo_region_3 ? { adherent_prof_ecole1_region: geo_region_3 } : {}), + ...(geo_lat_3 != null ? { adherent_prof_ecole1_lat: geo_lat_3 } : {}), + ...(geo_lng_3 != null ? { adherent_prof_ecole1_long: geo_lng_3 } : {}) + }; + + // champs obligatoires minimum + if (!data.adherent_mail || !data.adherent_nom || !data.adherent_prenom) { + console.warn(`skip: mail/nom/prenom manquants`); + continue; + } + + try { + attempted++; + const res = await upsert({ data }); + if (res.action === "create") creates++; + else if (res.action === "skip_existing") skipped_existing++; + } catch (e) { + errors++; + console.error(`ETL error ->`, e.message); + } + } + + await db_connection_promise.end(); + + console.log(`Done. attempted=${attempted} skipped_existing=${skipped_existing} created=${creates} errors=${errors}`); + + + /////////////////////////////////////////////////////////////////////// + // ENVOIE MAIL APRES EXECUTION + logger.info("MAIL MAJ ANNUAIRE PROF ENVOI AVANT", { numsession: sid }); + var transporter = nodemailer.createTransport({ + service: 'gmail', + auth: { + user: process.env.nodemailer_user, + pass: process.env.nodemailer_pass + } + }); + var mail_objet = "ADUZUKI - CRON MAJ ANNUAIRE PROF"; + mail_html = "

Pour l'administrateur de l'application ADUZUKI,


Ceci est le mail d'envoi pour confirmer l'exécution du Webhook de mise à jour de l'annuaire des profs qui se fait la nuit à 4h.

"; + mail_html += "

- nombre de professeurs à ajouter : "; + mail_html += attempted; + mail_html += "

"; + mail_html += "

- nombre de professeurs créés : "; + mail_html += creates; + mail_html += "

"; + mail_html += "

- nombre de professeurs non ajoutés pour cause probable de doublon : "; + mail_html += skipped_existing; + mail_html += "

"; + mail_html += "

- nombre d'erreurs : "; + mail_html += errors; + mail_html += "

"; + + mail_html += "

Julie Chaumard

Développeuse web de l'agence Parisweb.art

"; + + var mailOptions = { + from: 'afps.inscription@gmail.com', + to: "projet@parisweb.art", + subject: mail_objet, + html: mail_html + }; + + transporter.sendMail(mailOptions, function(error, info){ + if (error) { + logger.info("error" + error, { numsession: sid }); + } else { + logger.info("Email envoyé: " + info.response, { numsession: sid }); + } + }); + logger.info("MAIL MAJ ANNUAIRE PROF ENVOI APRES", { numsession: sid }); + + + + // --- Réponse HTTP IMMÉDIATE + const retour = { + ok: true, + attempted, + creates, + skipped_existing, + errors + }; + + logger.info("sync_prof_strapi terminé", { label: filename, numsession: sid }); + res.status(200).json(retour); + + } catch (e) { + logger.error("sync_prof_strapi FAILED", { + label: filename, + numsession: sid, + message: e.message, + stack: e.stack + }); + // Réponse d’erreur JSON claire + return res.status(500).json({ ok: false, error: e.message }); + } + //return { attempted, creates, skipped_existing, errors }; + +} + +///////////////////////////////////////////////// +// EXPORT DE MODULE POUR QU'IL SOIT LU DANS LES AUTRES FICHIERS JS +///////////////////////////////////////////////// + +module.exports = { + runSync_prof_strapi +} \ No newline at end of file diff --git a/controllers/sync_prof_strapiController update.js b/controllers/sync_prof_strapiController update.js new file mode 100644 index 0000000..215a557 --- /dev/null +++ b/controllers/sync_prof_strapiController update.js @@ -0,0 +1,361 @@ +///////////////////////////////////////////////// +// APPELS DES MODULES +///////////////////////////////////////////////// +const path = require("path"); +// CALCUL DE DATE +const moment = require('moment'); +// uuid +const { v4: uuidv4 } = require('uuid'); +const mysql = require('mysql2'); +const mysql_promise = require('mysql2/promise'); +const fetch = require('node-fetch'); +const fs = require('fs/promises'); +const nodemailer = require('nodemailer'); + +///////////////////////////////////////////////// +// APPELS DES MODULES PERSOS +///////////////////////////////////////////////// +// loggings +const logger = require("../public/js/app/logger_adhesion"); +// DB +const { connect_DB_promise } = require('../modules/db/databaseconnect'); + +//////////////////////////////////////////////////// +// FILE NAME +//////////////////////////////////////////////////// +const filename = path.parse(__filename).base; + + + +const runSync_prof_strapi = async function(req, res) { + + // LOG - Récupération du numéro de session web + // en mode CRON il n'y a pas de session web, donc pas de req.session, donc on met "cron" à la place + const sid = req?.session?.id || "cron"; + logger.info(`sid=${sid}`, { numsession: sid, label: filename }); + + logger.info("======================================", { numsession: sid, label: filename }); + logger.info("======== FUNCTION sync_prof_strapi ==========", { numsession: sid, label: filename }); + logger.info("======================================", { numsession: sid, label: filename }); + + //////////////////////////////////////////////////// + // VARIABLES + //////////////////////////////////////////////////// + + + + // On récupère les variables de ENV + const { + DOMAIN_STRAPI, + strapi_token, + db_connection_host, + db_connection_port, + db_connection_user, + db_connection_password, + db_connection_database + } = process.env; + logger.info(`DOMAIN_STRAPI=${DOMAIN_STRAPI}, db_connection_host=${db_connection_host}`, { numsession: sid, label: filename }); + + //////////////////////////////////////////////////// + // CONNEXION DATABASE + //////////////////////////////////////////////////// + // Initialisation de la connexion avec la BD + const db_connection_promise = await mysql_promise.createConnection({ + host: db_connection_host, + port: db_connection_port, + user: db_connection_user, + password: db_connection_password, + database: db_connection_database + }); + //console.log("db_connection_promise = ", db_connection_promise); + + //////////////////////////////////////////////////// + // FONCTIONS + //////////////////////////////////////////////////// + + // Récupération de la lat, long et région, de toutes les villes de France et Dom-TOM, depuis le json + // pour l'ajout de la lat, long et region dans les données de strapi pour le prof + let CP_MAP = null; + async function loadCpMap(filePath = "src/data/cp_region_lat_long.json") { + if (CP_MAP) return CP_MAP; + const buf = await fs.readFile(filePath, "utf8"); + CP_MAP = JSON.parse(buf); + return CP_MAP; + } + + // ==== GEO helpers ==== + // Fonctions pour normaliser le code postal saisie dans le formulaire par l’adhérent + function normalizeCp(cp) { + if (!cp) return null; + const s = String(cp).trim().replace(/\s+/g, ""); + return /^\d{5}$/.test(s) ? s : null; + } + function pickProfPostalCode(row) { + return ( + normalizeCp(row.adherent_prof_ecole1_cp) || null + ); + } + + // helper pour convertir en nombre sûr (gère "48,85" et strings) + const toNum = (v) => { + if (v == null) return null; + const n = (typeof v === "number") ? v : parseFloat(String(v).replace(",", ".")); + return Number.isFinite(n) ? n : null; + }; + + // ==== FONCTION D'AJOUT DES PROFS DANS STRAPI ==== + const upsert = async (payload) => { + logger.info("======== FUNCTION upsert ==========", { numsession: sid, label: filename }); + + // on cherche les professeurs dont adherent_mail est égal à payload.data.adherent_mail. Si pas d’email, on met "". + // URLSearchParams classe native de JavaScript (dans Node.js et dans les navigateurs) qui sert à construire et manipuler des chaînes de requête (?clé=valeur&clé2=valeur2) + // ex de sortie q = filters%5Badherent_mail%5D%5B%24eq%5D=julie%40test.com + logger.info(`search = ${payload.data.adherent_mail}`, { numsession: sid, label: filename }); + const q = new URLSearchParams({ "filters[adherent_mail][$eq]": payload.data.adherent_mail || "" }); + // URL d'interogration strapi + const getUrl = `${DOMAIN_STRAPI}/api/adherent-professeurs?${q.toString()}`; + // Recherche dans Strapi + const r0 = await fetch(getUrl, { headers: { Authorization: `Bearer ${strapi_token}` }}); + // lis le corps de la réponse HTTP et convertis-le depuis du JSON en objet JavaScript utilisable + const j0 = await r0.json(); + const found = j0?.data?.[0]; + logger.info(`found = ${found?.attributes?.adherent_mail}`, { numsession: sid, label: filename }); + console.log("found = ", found); + + if (found?.id) { + // déjà présent → on met à jour avec les nouvelles données + const putUrl = `${DOMAIN_STRAPI}/api/adherent-professeurs/${found.id}`; + logger.info(`putUrl = ${putUrl}`, { numsession: sid, label: filename }); + console.log("payload = ", payload); + const r = await fetch(putUrl, { + method: "PUT", + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${strapi_token}` + }, + body: JSON.stringify(payload) + }); + + //console.log("r du fetch : ", r); + + if (!r.ok) { + const txt = await r.text(); + throw new Error(`PUT ${putUrl} -> ${r.status} ${txt}`); + } + const j = await r.json(); + return { action: "update", id: j?.data?.id ?? found.id }; + } else { + const postUrl = `${DOMAIN_STRAPI}/api/adherent-professeurs`; + logger.info(`postUrl = ${postUrl}`, { numsession: sid, label: filename }); + const r = await fetch(postUrl, { + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${strapi_token}` + }, + body: JSON.stringify(payload) + }); + if (!r.ok) { + const txt = await r.text(); + throw new Error(`POST ${postUrl} -> ${r.status} ${txt}`); + } + const j = await r.json(); + return { action: "create", id: j?.data?.id }; + } + }; + + //////////////////////////////////////////////////// + // LANCEMENT DES FONCTIONS + //////////////////////////////////////////////////// + try { + + // ==== AJOUT DES PROFS DANS STRAPI ==== + let creates = 0, errors = 0, attempted = 0, updates = 0; + + // ==== RÉCUPÉRATION DES DONNÉES SUR LES PROFS DANS LA DB ADUZUKI (SQL) ==== + const [rows] = await db_connection_promise.query(` + SELECT + ID, + association_suzuki, + adherent_nom, + adherent_prenom, + adherent_mail, + adherent_telephone_mobile, + adherent_prof_instrument1, + adherent_prof_instrument1_esa, + adherent_prof_instrument2, + adherent_prof_instrument2_esa, + adherent_prof_sece, + adherent_prof_ecole1, + adherent_prof_ecole1_mail, + adherent_prof_ecole1_web, + adherent_prof_ecole1_cp, + adherent_prof_ecole1_ville, + adherent_prof_ecole2, + adherent_prof_ecole2_mail, + adherent_prof_ecole2_web, + adherent_prof_ecole2_cp, + adherent_prof_ecole2_ville, + adherent_prof_ecole3, + adherent_prof_ecole3_mail, + adherent_prof_ecole3_web, + adherent_prof_ecole3_adresse, + adherent_prof_ecole3_cp, + adherent_prof_ecole3_ville + FROM adherent_professeur + `); + //console.log('rows = ', rows); + + // Lancement de la récupération des lat, long et régions depuis le json + const cpMap = await loadCpMap("src/data/cp_region_lat_long.json"); + //console.log("CP_MAP = ", CP_MAP); + + // TRAITEMENT DE CHAQUE PROF DE LA BD POUR L'AJOUTER DANS STRAPI + for (const r of rows) { + // 3.1 choisir le CP prioritaire + const cp = pickProfPostalCode(r); + let geo_lat = null, geo_lng = null, geo_region = null; + + if (cp && cpMap[cp]) { + const meta = cpMap[cp]; + // tolérance: on ne renseigne que si lat/lng sont présents + geo_lat = toNum(meta.lat); + geo_lng = toNum(meta.lng); + geo_region = meta.region ? String(meta.region) : null; + } + + // 3.2 payload de base + const data = { + association_suzuki: r.association_suzuki?.trim() || null, + adherent_nom: r.adherent_nom?.trim() || null, + adherent_prenom: r.adherent_prenom?.trim() || null, + adherent_mail: r.adherent_mail?.toString().trim().toLowerCase() || null, + adherent_telephone_mobile: r.adherent_telephone_mobile?.trim() || null, + adherent_prof_instrument1: r.adherent_prof_instrument1?.trim() || null, + adherent_prof_instrument1_niveau: r.adherent_prof_instrument1_esa?.trim() || null, + adherent_prof_instrument2: r.adherent_prof_instrument2?.trim() || null, + adherent_prof_instrument2_niveau: r.adherent_prof_instrument2_esa?.trim() || null, + adherent_prof_sece: r.adherent_prof_sece?.trim() || null, + adherent_prof_ecole1: r.adherent_prof_ecole1?.trim() || null, + adherent_prof_ecole1_mail: r.adherent_prof_ecole1_mail?.trim() || null, + adherent_prof_ecole1_web: r.adherent_prof_ecole1_web?.trim() || null, + adherent_prof_ecole1_cp: r.adherent_prof_ecole1_cp?.trim() || null, + adherent_prof_ecole1_ville: r.adherent_prof_ecole1_ville?.trim() || null, + adherent_prof_ecole2: r.adherent_prof_ecole2?.trim() || null, + adherent_prof_ecole2_mail: r.adherent_prof_ecole2_mail?.trim() || null, + adherent_prof_ecole2_web: r.adherent_prof_ecole2_web?.trim() || null, + adherent_prof_ecole2_cp: r.adherent_prof_ecole2_cp?.trim() || null, + adherent_prof_ecole2_ville: r.adherent_prof_ecole2_ville?.trim() || null, + adherent_prof_ecole3: r.adherent_prof_ecole3?.trim() || null, + adherent_prof_ecole3_mail: r.adherent_prof_ecole3_mail?.trim() || null, + adherent_prof_ecole3_web: r.adherent_prof_ecole3_web?.trim() || null, + adherent_prof_ecole3_adresse: r.adherent_prof_ecole3_adresse?.trim() || null, + adherent_prof_ecole3_cp: r.adherent_prof_ecole3_cp?.trim() || null, + adherent_prof_ecole3_ville: r.adherent_prof_ecole3_ville?.trim() || null, + adherent_prof_ecole3_ville: r.adherent_prof_ecole3_ville?.trim() || null, + Saison: "2025/2026", + // >>> Injecte UNIQUEMENT des scalaires, si valides + ...(geo_region ? { adherent_prof_ecole1_region: geo_region } : {}), + ...(geo_lat != null ? { adherent_prof_ecole1_lat: geo_lat } : {}), + ...(geo_lng != null ? { adherent_prof_ecole1_long: geo_lng } : {}) + }; + + // champs obligatoires minimum + if (!data.adherent_mail || !data.adherent_nom || !data.adherent_prenom) { + console.warn(`skip: mail/nom/prenom manquants`); + continue; + } + + try { + attempted++; + const res = await upsert({ data }); + if (res.action === "create") creates++; + else if (res.action === "update") updates++; + } catch (e) { + errors++; + console.error(`ETL error ->`, e.message); + } + } + + await db_connection_promise.end(); + + logger.info(`Done. attempted=${attempted} updates=${updates} created=${creates} errors=${errors}`, { numsession: sid, label: filename }); + + + /////////////////////////////////////////////////////////////////////// + // ENVOIE MAIL APRES EXECUTION + logger.info("MAIL MAJ ANNUAIRE PROF ENVOI AVANT", { numsession: sid }); + var transporter = nodemailer.createTransport({ + service: 'gmail', + auth: { + user: process.env.nodemailer_user, + pass: process.env.nodemailer_pass + } + }); + var mail_objet = "ADUZUKI - CRON MAJ ANNUAIRE PROF"; + mail_html = "

Pour l'administrateur de l'application ADUZUKI,


Ceci est le mail d'envoi pour confirmer l'exécution du Webhook de mise à jour de l'annuaire des profs qui se fait la nuit à 4h.

"; + mail_html += "

- nombre de professeurs à ajouter : "; + mail_html += attempted; + mail_html += "

"; + mail_html += "

- nombre de professeurs créés : "; + mail_html += creates; + mail_html += "

"; + mail_html += "

- nombre de professeurs non ajoutés pour cause probable de doublon : "; + mail_html += updates; + mail_html += "

"; + mail_html += "

- nombre d'erreurs : "; + mail_html += errors; + mail_html += "

"; + + mail_html += "

Julie Chaumard

Développeuse web de l'agence Parisweb.art

"; + + var mailOptions = { + from: 'afps.inscription@gmail.com', + to: "projet@parisweb.art", + subject: mail_objet, + html: mail_html + }; + + transporter.sendMail(mailOptions, function(error, info){ + if (error) { + logger.info("error" + error, { numsession: sid }); + } else { + logger.info("Email envoyé: " + info.response, { numsession: sid }); + } + }); + logger.info("MAIL MAJ ANNUAIRE PROF ENVOI APRES", { numsession: sid }); + + + + // --- Réponse HTTP IMMÉDIATE + const retour = { + ok: true, + attempted, + creates, + updates, + errors + }; + + logger.info("sync_prof_strapi terminé", { label: filename, numsession: sid }); + res.status(200).json(retour); + + } catch (e) { + logger.error("sync_prof_strapi FAILED", { + label: filename, + numsession: sid, + message: e.message, + stack: e.stack + }); + // Réponse d’erreur JSON claire + return res.status(500).json({ ok: false, error: e.message }); + } + +} + +///////////////////////////////////////////////// +// EXPORT DE MODULE POUR QU'IL SOIT LU DANS LES AUTRES FICHIERS JS +///////////////////////////////////////////////// + +module.exports = { + runSync_prof_strapi +} \ No newline at end of file diff --git a/controllers/sync_prof_strapiController.js b/controllers/sync_prof_strapiController.js new file mode 100644 index 0000000..9275e6f --- /dev/null +++ b/controllers/sync_prof_strapiController.js @@ -0,0 +1,374 @@ +///////////////////////////////////////////////// +// APPELS DES MODULES +///////////////////////////////////////////////// +const path = require("path"); +// CALCUL DE DATE +const moment = require('moment'); +// uuid +const { v4: uuidv4 } = require('uuid'); +const mysql = require('mysql2'); +const mysql_promise = require('mysql2/promise'); +const fetch = require('node-fetch'); +const fs = require('fs/promises'); +const nodemailer = require('nodemailer'); + +///////////////////////////////////////////////// +// APPELS DES MODULES PERSOS +///////////////////////////////////////////////// +// loggings +const logger = require("../public/js/app/logger_adhesion"); +// DB +const { connect_DB_promise } = require('../modules/db/databaseconnect'); + +//////////////////////////////////////////////////// +// FILE NAME +//////////////////////////////////////////////////// +const filename = path.parse(__filename).base; + + + +const runSync_prof_strapi = async function(req, res) { + + // LOG - Récupération du numéro de session web + // en mode CRON il n'y a pas de session web, donc pas de req.session, donc on met "cron" à la place + const sid = req?.session?.id || "cron"; + logger.info(`sid=${sid}`, { numsession: sid, label: filename }); + + logger.info("======================================", { numsession: sid, label: filename }); + logger.info("======== FUNCTION sync_prof_strapi ==========", { numsession: sid, label: filename }); + logger.info("======================================", { numsession: sid, label: filename }); + + //////////////////////////////////////////////////// + // VARIABLES + //////////////////////////////////////////////////// + + + + // On récupère les variables de ENV + const { + DOMAIN_STRAPI, + strapi_token, + db_connection_host, + db_connection_port, + db_connection_user, + db_connection_password, + db_connection_database + } = process.env; + logger.info(`DOMAIN_STRAPI=${DOMAIN_STRAPI}, db_connection_host=${db_connection_host}`, { numsession: sid, label: filename }); + + //////////////////////////////////////////////////// + // CONNEXION DATABASE + //////////////////////////////////////////////////// + // Initialisation de la connexion avec la BD + const db_connection_promise = await mysql_promise.createConnection({ + host: db_connection_host, + port: db_connection_port, + user: db_connection_user, + password: db_connection_password, + database: db_connection_database + }); + //console.log("db_connection_promise = ", db_connection_promise); + + //////////////////////////////////////////////////// + // FONCTIONS + //////////////////////////////////////////////////// + + // Récupération de la lat, long et région, de toutes les villes de France et Dom-TOM, depuis le json + // pour l'ajout de la lat, long et region dans les données de strapi pour le prof + let CP_MAP = null; + async function loadCpMap(filePath = "src/data/cp_region_lat_long.json") { + if (CP_MAP) return CP_MAP; + const buf = await fs.readFile(filePath, "utf8"); + CP_MAP = JSON.parse(buf); + return CP_MAP; + } + + // ==== GEO helpers ==== + // Fonctions pour normaliser le code postal saisie dans le formulaire par l’adhérent + function normalizeCp(cp) { + if (!cp) return null; + const s = String(cp).trim().replace(/\s+/g, ""); + return /^\d{5}$/.test(s) ? s : null; + } + function pickProfPostalCode(cp) { + return ( + normalizeCp(cp) || null + ); + } + + // helper pour convertir en nombre sûr (gère "48,85" et strings) + const toNum = (v) => { + if (v == null) return null; + const n = (typeof v === "number") ? v : parseFloat(String(v).replace(",", ".")); + return Number.isFinite(n) ? n : null; + }; + + // ==== FONCTION D'AJOUT DES PROFS DANS STRAPI ==== + const upsert = async (payload) => { + logger.info("======== FUNCTION upsert ==========", { numsession: sid, label: filename }); + + // on cherche les professeurs dont adherent_mail est égal à payload.data.adherent_mail. Si pas d’email, on met "". + // URLSearchParams classe native de JavaScript (dans Node.js et dans les navigateurs) qui sert à construire et manipuler des chaînes de requête (?clé=valeur&clé2=valeur2) + // ex de sortie q = filters%5Badherent_mail%5D%5B%24eq%5D=julie%40test.com + logger.info(`search = ${payload.data.adherent_mail}`, { numsession: sid, label: filename }); + const q = new URLSearchParams({ "filters[adherent_mail][$eq]": payload.data.adherent_mail || "" }); + // URL d'interogration strapi + const getUrl = `${DOMAIN_STRAPI}/api/adherent-professeurs?${q.toString()}`; + // Recherche dans Strapi + const r0 = await fetch(getUrl, { headers: { Authorization: `Bearer ${strapi_token}` }}); + // lis le corps de la réponse HTTP et convertis-le depuis du JSON en objet JavaScript utilisable + const j0 = await r0.json(); + const found = j0?.data?.[0]; + logger.info(`found = ${found?.attributes?.adherent_mail}`, { numsession: sid, label: filename }); + //console.log("found = ", found); + + if (found?.id) { + // déjà présent → on NE LÈVE PAS d’erreur, on signale juste un skip + return { action: "skip_existing", id: found.id }; + } else { + const postUrl = `${DOMAIN_STRAPI}/api/adherent-professeurs`; + logger.info(`postUrl = ${postUrl}`, { numsession: sid, label: filename }); + const r = await fetch(postUrl, { + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${strapi_token}` + }, + body: JSON.stringify(payload) + }); + if (!r.ok) { + const txt = await r.text(); + throw new Error(`POST ${postUrl} -> ${r.status} ${txt}`); + } + const j = await r.json(); + return { action: "create", id: j?.data?.id }; + } + }; + + //////////////////////////////////////////////////// + // LANCEMENT DES FONCTIONS + //////////////////////////////////////////////////// + try { + + // ==== AJOUT DES PROFS DANS STRAPI ==== + let creates = 0, errors = 0, attempted = 0, skipped_existing = 0; + + // ==== RÉCUPÉRATION DES DONNÉES SUR LES PROFS DANS LA DB ADUZUKI (SQL) ==== + const [rows] = await db_connection_promise.query(` + SELECT + ID, + association_suzuki, + adherent_nom, + adherent_prenom, + adherent_mail, + adherent_telephone_mobile, + adherent_prof_instrument1, + adherent_prof_instrument1_esa, + adherent_prof_instrument2, + adherent_prof_instrument2_esa, + adherent_prof_sece, + adherent_prof_ecole1, + adherent_prof_ecole1_mail, + adherent_prof_ecole1_web, + adherent_prof_ecole1_cp, + adherent_prof_ecole1_ville, + adherent_prof_ecole2, + adherent_prof_ecole2_mail, + adherent_prof_ecole2_web, + adherent_prof_ecole2_cp, + adherent_prof_ecole2_ville, + adherent_prof_ecole3, + adherent_prof_ecole3_mail, + adherent_prof_ecole3_web, + adherent_prof_ecole3_adresse, + adherent_prof_ecole3_cp, + adherent_prof_ecole3_ville + FROM adherent_professeur + `); + //console.log('rows = ', rows); + + // Lancement de la récupération des lat, long et régions depuis le json + const cpMap = await loadCpMap("src/data/cp_region_lat_long.json"); + //console.log("CP_MAP = ", CP_MAP); + + // TRAITEMENT DE CHAQUE PROF DE LA BD POUR L'AJOUTER DANS STRAPI + for (const r of rows) { + // 3.1 choisir le CP prioritaire + console.log(`r.adherent_prof_ecole1_cp = ${r.adherent_prof_ecole1_cp}`); + const cp_1 = pickProfPostalCode(r.adherent_prof_ecole1_cp); + + const cp_2 = pickProfPostalCode(r.adherent_prof_ecole2_cp); + const cp_3 = pickProfPostalCode(r.adherent_prof_ecole3_cp); + console.log(`cp_1 = ${cp_1}, cp_2 = ${cp_2} `); + let geo_lat_1 = null, geo_lng_1 = null, geo_region_1 = null; + let geo_lat_2 = null, geo_lng_2 = null, geo_region_2 = null; + let geo_lat_3 = null, geo_lng_3 = null, geo_region_3 = null; + console.log("cpMap[cp_1] =", cpMap[cp_1]); + if (cp_1 && cpMap[cp_1]) { + console.log("cpMap[cp_1] =", cpMap[cp_1]); + const meta = cpMap[cp_1]; + // tolérance: on ne renseigne que si lat/lng sont présents + geo_lat_1 = toNum(meta.lat); + geo_lng_1 = toNum(meta.lng); + geo_region_1 = meta.region ? String(meta.region) : null; + } + console.log("cpMap[cp_2] =", cpMap[cp_2]); + if (cp_2 && cpMap[cp_2]) { + console.log("cpMap[cp_2] =", cpMap[cp_2]); + const meta = cpMap[cp_2]; + // tolérance: on ne renseigne que si lat/lng sont présents + geo_lat_2 = toNum(meta.lat); + geo_lng_2 = toNum(meta.lng); + geo_region_2 = meta.region ? String(meta.region) : null; + } + if (cp_3 && cpMap[cp_2]) { + const meta = cpMap[cp_3]; + // tolérance: on ne renseigne que si lat/lng sont présents + geo_lat_3 = toNum(meta.lat); + geo_lng_3 = toNum(meta.lng); + geo_region_3 = meta.region ? String(meta.region) : null; + } + + // 3.2 payload de base + console.log("geo_lat_2 =", geo_lat_2); + const data = { + association_suzuki: r.association_suzuki?.trim() || null, + adherent_nom: r.adherent_nom?.trim() || null, + adherent_prenom: r.adherent_prenom?.trim() || null, + adherent_mail: r.adherent_mail?.toString().trim().toLowerCase() || null, + adherent_telephone_mobile: r.adherent_telephone_mobile?.trim() || null, + adherent_prof_instrument1: r.adherent_prof_instrument1?.trim() || null, + adherent_prof_instrument1_niveau: r.adherent_prof_instrument1_esa?.trim() || null, + adherent_prof_instrument2: r.adherent_prof_instrument2?.trim() || null, + adherent_prof_instrument2_niveau: r.adherent_prof_instrument2_esa?.trim() || null, + adherent_prof_sece: r.adherent_prof_sece?.trim() || null, + adherent_prof_ecole1: r.adherent_prof_ecole1?.trim() || null, + adherent_prof_ecole1_mail: r.adherent_prof_ecole1_mail?.trim() || null, + adherent_prof_ecole1_web: r.adherent_prof_ecole1_web?.trim() || null, + adherent_prof_ecole1_cp: r.adherent_prof_ecole1_cp?.trim() || null, + adherent_prof_ecole1_ville: r.adherent_prof_ecole1_ville?.trim() || null, + adherent_prof_ecole2: r.adherent_prof_ecole2?.trim() || null, + adherent_prof_ecole2_mail: r.adherent_prof_ecole2_mail?.trim() || null, + adherent_prof_ecole2_web: r.adherent_prof_ecole2_web?.trim() || null, + adherent_prof_ecole2_cp: r.adherent_prof_ecole2_cp?.trim() || null, + adherent_prof_ecole2_ville: r.adherent_prof_ecole2_ville?.trim() || null, + adherent_prof_ecole3: r.adherent_prof_ecole3?.trim() || null, + adherent_prof_ecole3_mail: r.adherent_prof_ecole3_mail?.trim() || null, + adherent_prof_ecole3_web: r.adherent_prof_ecole3_web?.trim() || null, + adherent_prof_ecole3_adresse: r.adherent_prof_ecole3_adresse?.trim() || null, + adherent_prof_ecole3_cp: r.adherent_prof_ecole3_cp?.trim() || null, + adherent_prof_ecole3_ville: r.adherent_prof_ecole3_ville?.trim() || null, + adherent_prof_ecole3_ville: r.adherent_prof_ecole3_ville?.trim() || null, + Saison: "2025/2026", + // >>> Injecte UNIQUEMENT des scalaires, si valides + ...(geo_region_1 ? { adherent_prof_ecole1_region: geo_region_1 } : {}), + ...(geo_lat_1 != null ? { adherent_prof_ecole1_lat: geo_lat_1 } : {}), + ...(geo_lng_1 != null ? { adherent_prof_ecole1_long: geo_lng_1 } : {}), + ...(geo_region_2 ? { adherent_prof_ecole2_region: geo_region_2 } : {}), + ...(geo_lat_2 != null ? { adherent_prof_ecole2_lat: geo_lat_2 } : {}), + ...(geo_lng_2 != null ? { adherent_prof_ecole2_long: geo_lng_2 } : {}), + ...(geo_region_3 ? { adherent_prof_ecole3_region: geo_region_3 } : {}), + ...(geo_lat_3 != null ? { adherent_prof_ecole3_lat: geo_lat_3 } : {}), + ...(geo_lng_3 != null ? { adherent_prof_ecole3_long: geo_lng_3 } : {}) + }; + console.log("data", data); + + // champs obligatoires minimum + if (!data.adherent_mail || !data.adherent_nom || !data.adherent_prenom) { + console.warn(`skip: mail/nom/prenom manquants`); + continue; + } + + try { + attempted++; + const res = await upsert({ data }); + if (res.action === "create") creates++; + else if (res.action === "skip_existing") skipped_existing++; + } catch (e) { + errors++; + console.error(`ETL error ->`, e.message); + } + } + + await db_connection_promise.end(); + + logger.info(`Done. attempted=${attempted} skipped_existing=${skipped_existing} created=${creates} errors=${errors}`, { numsession: sid, label: filename }); + + + /////////////////////////////////////////////////////////////////////// + // ENVOIE MAIL APRES EXECUTION + logger.info("MAIL MAJ ANNUAIRE PROF ENVOI AVANT", { numsession: sid }); + var transporter = nodemailer.createTransport({ + service: 'gmail', + auth: { + user: process.env.nodemailer_user, + pass: process.env.nodemailer_pass + } + }); + var mail_objet = "ADUZUKI - CRON MAJ ANNUAIRE PROF"; + mail_html = "

Pour l'administrateur de l'application ADUZUKI,


Ceci est le mail d'envoi pour confirmer l'exécution du Webhook de mise à jour de l'annuaire des profs qui se fait la nuit à 4h.

"; + mail_html += "

- nombre de professeurs à ajouter : "; + mail_html += attempted; + mail_html += "

"; + mail_html += "

- nombre de professeurs créés : "; + mail_html += creates; + mail_html += "

"; + mail_html += "

- nombre de professeurs non ajoutés pour cause probable de doublon : "; + mail_html += skipped_existing; + mail_html += "

"; + mail_html += "

- nombre d'erreurs : "; + mail_html += errors; + mail_html += "

"; + + mail_html += "

Julie Chaumard

Développeuse web de l'agence Parisweb.art

"; + + var mailOptions = { + from: 'afps.inscription@gmail.com', + to: "projet@parisweb.art", + subject: mail_objet, + html: mail_html + }; + + transporter.sendMail(mailOptions, function(error, info){ + if (error) { + logger.info("error" + error, { numsession: sid }); + } else { + logger.info("Email envoyé: " + info.response, { numsession: sid }); + } + }); + logger.info("MAIL MAJ ANNUAIRE PROF ENVOI APRES", { numsession: sid }); + + + + // --- Réponse HTTP IMMÉDIATE + const retour = { + ok: true, + attempted, + creates, + skipped_existing, + errors + }; + + logger.info("sync_prof_strapi terminé", { label: filename, numsession: sid }); + res.status(200).json(retour); + + } catch (e) { + logger.error("sync_prof_strapi FAILED", { + label: filename, + numsession: sid, + message: e.message, + stack: e.stack + }); + // Réponse d’erreur JSON claire + return res.status(500).json({ ok: false, error: e.message }); + } + +} + +///////////////////////////////////////////////// +// EXPORT DE MODULE POUR QU'IL SOIT LU DANS LES AUTRES FICHIERS JS +///////////////////////////////////////////////// + +module.exports = { + runSync_prof_strapi +} \ No newline at end of file diff --git a/controllers/test.js b/controllers/test.js new file mode 100644 index 0000000..f48ef66 --- /dev/null +++ b/controllers/test.js @@ -0,0 +1,158 @@ +///////////////////////////////////////////////// +// APPELS DES MODULES +///////////////////////////////////////////////// +const moment = require('moment'); +const nodemailer = require('nodemailer'); +const path = require("path"); +const axios = require('axios'); + +///////////////////////////////////////////////// +// APPELS DES MODULES PERSOS +///////////////////////////////////////////////// +// loggings +const logger = require("../public/js/app/logger_wuzuki"); +// Envoie mail +const envoie_mail = require("../modules/envoie_mail"); +// DB +const { connect_DB_promise } = require('../modules/db/databaseconnect'); + +///////////////////////////////////////////////// +// APPELS DES FONCTIONS +///////////////////////////////////////////////// +// FAIRE UNE PAUSE +const sleep = require("./../modules/sleep"); + +//////////////////////////////////////////////////// +// FILE NAME +//////////////////////////////////////////////////// +const filename = path.parse(__filename).base; + +///////////////////////////////////////////////// +// GOOGLE SHEET PARAMETERS +///////////////////////////////////////////////// +const { GoogleSpreadsheet } = require('google-spreadsheet'); +const GS_creds = require('../inscriptionsafps-53b60452f63d.json'); +const { error } = require("console"); +// Initialize the sheet - doc ID is the long id in the sheets URL +const GS_contact = new GoogleSpreadsheet(process.env.gsheet_contact); + +///////////////////////////////////////////////// +// ENREGISTREMENT DES INFORMATIONS SAISIES +// ENVOIE MAIL VERS AFPS +// AJOUT DANS GOOGLE SHEET CONTACTS AFPS +///////////////////////////////////////////////// +const post_form_envoie_message = async function(req, res){ + logger.info("======================================"); + logger.info("======== FUNCTION post_form_envoie_message =========="); + logger.info("======================================"); + + moment.locale('fr'); + let now = moment().format("DD/MM/YYYY"); + + ///////////////////////////////////////////////// + // RÉCUPÉRATION DES DONNÉES DU FORMULAIRE DANS LA SESSION EN COURS et dans la tableau DATA + ///////////////////////////////////////////////// + + // VÉRIFIER SI CAPTCHA A BIEN ÉTÉ REMPLI + const token_captcha = req.body['g-recaptcha-response']; + if (!token_captcha) { + logger.info("Captcha non rempli", { numsession: req.session.id }); + req.session.affiche_err_1 = 'Captcha non rempli.'; + return res.redirect('/wuzuki/envoie_message'); + } + + // un tableau : pour récupérer en même temps les informations saisies dans un tableau + let data = []; + + // Boucle sur les noms des champs + // ajout des infos dans le tableau + ['nom', 'prenom', 'mail', 'commentaire'].forEach(field => { + req.session[field] = req.body[field]; + data.push({[field] : req.body[field]}); + logger.info("#0 " + field + " = " + req.body[field], { numsession: req.session.id, label: filename}); + }); + console.log("data = ", data); + + ///////////////////////////////////////////////// + // ENVOIE MAIL AFPS + // AJOUT DANS GOOGLE SHEET CONTACTS AFPS + ///////////////////////////////////////////////// + + try { + + // CAPTCHA V3 + const response_captcha = await axios.post(`https://www.google.com/recaptcha/api/siteverify`, null, { + params: { + secret: process.env.g_captcha, + response: token_captcha + } + }); + const response_captcha_data = response_captcha.data; + console.log("response_captcha_data = ", response_captcha_data.success); + logger.info("#0 response_captcha_data : SUCCESS = " + response_captcha_data.success + " / score = " + response_captcha_data.score, { numsession: req.session.id, label: filename}); + + // CAPTCHA V3 + if (response_captcha_data.success && response_captcha_data.score >= 0.8) { + ///////////////////////////////////////////////// + // ENVOIE MAIL À L'AFPS + const mail_objet = `[WUZUKI] DEMANDE DE CONTACT DEPUIS LE SITE INTERNET - ${req.session.nom}`; + const mail_html = ` +

Bonjour,

+

Une personne a rempli le formulaire de contact du site Internet de l'AFPS.
+ Voici ses coordonnées et son message :


+

NOM : ${req.session.nom}

+

PRÉNOM : ${req.session.prenom}

+

MAIL : ${req.session.mail}

+

MESSAGE :
${req.session.commentaire}


+

WUZUKI, programme du site Internet de l'AFPS

`; + const mailOptions = { + from: 'juliechaumard@gmail.com', + to: 'juliechaumard@gmail.com', + subject: mail_objet, + html: mail_html + }; + await envoie_mail.envoie_mail(mailOptions); + + ///////////////////////////////////////////////// + // AJOUT DE LA DEMANDE DE CONTACT DANS GOOGLE SHEET CONTACTS AFPS + await GS_contact.useServiceAccountAuth(GS_creds); + await GS_contact.loadInfo(); + const GS_sheet_contact = GS_contact.sheetsByTitle['demande_contact']; + await GS_sheet_contact.addRows([ + { + provenance: "site internet afps", + cta: 'bouton "Nous Contacter"', + date: now, + nom: req.session.nom, + prenom: req.session.prenom, + mail: req.session.mail, + message: req.session.commentaire, + mail_envoye: 'A afpedagogiesuzuki@gmail.com' + } + ]); + logger.info("AJOUT GOOGLESHEET FIN", { numsession: req.session.id, label: filename}); + + req.session.affiche_err_1 = "Votre message à bien été envoyé à l'Association Française pour la Pédagogie Suzuki."; + return res.redirect('/wuzuki/envoie_message'); + + } else { + // Les informations saisies sont vides + logger.info("Il y a un problème avec la saisie des informations du formulaire", { numsession: req.session.id }); + req.session.affiche_err_1 = 'Il y a un problème avec la saisie des informations du formulaire, veuillez recommencer.'; + return res.redirect('/wuzuki/envoie_message'); + } + + } catch (error) { + // Echec de connection à la BD + logger.error("Il y a un problème système post_form_envoie_message : " + error, { numsession: req.session.id }); + req.session.affiche_err_1 = '"Il y a un problème système, veuillez recommencer, "' + error; + return res.redirect('/wuzuki/envoie_message'); + } +} + +///////////////////////////////////////////////// +// EXPORT DE MODULE POUR QU'IL SOIT LU DANS LES AUTRES FICHIERS JS +///////////////////////////////////////////////// +module.exports = { + post_form_envoie_message +} diff --git a/controllers/vente_video/files/film_suzuki_unesco_2024.mp4 b/controllers/vente_video/files/film_suzuki_unesco_2024.mp4 new file mode 100644 index 0000000..1637b7a Binary files /dev/null and b/controllers/vente_video/files/film_suzuki_unesco_2024.mp4 differ diff --git a/controllers/vente_video/files/film_suzuki_unesco_2024_test.mp4 b/controllers/vente_video/files/film_suzuki_unesco_2024_test.mp4 new file mode 100644 index 0000000..1637b7a Binary files /dev/null and b/controllers/vente_video/files/film_suzuki_unesco_2024_test.mp4 differ diff --git a/controllers/vente_video/files/yourfile.txt b/controllers/vente_video/files/yourfile.txt new file mode 100644 index 0000000..46cbca2 --- /dev/null +++ b/controllers/vente_video/files/yourfile.txt @@ -0,0 +1 @@ +test jujue \ No newline at end of file diff --git a/controllers/vente_video/generate_linkController copie.js b/controllers/vente_video/generate_linkController copie.js new file mode 100644 index 0000000..fda2743 --- /dev/null +++ b/controllers/vente_video/generate_linkController copie.js @@ -0,0 +1,127 @@ +///////////////////////////////////////////////// +// LOGGING +///////////////////////////////////////////////// +const logger = require("../../public/js/app/logger_lienventetemp"); +///////////////////////////////////////////////// +// APPELS DES MODULES +///////////////////////////////////////////////// +const moment = require('moment'); +const ejs = require('ejs'); +const nodemailer = require('nodemailer'); +const path = require("path"); +const fs = require("fs"); +const mysql = require('mysql2'); +const mysql_promise = require('mysql2/promise'); +//////////////////////////////////////////////////// +// FILE NAME +//////////////////////////////////////////////////// +const filename = path.parse(__filename).base; + +// Configuration de la connexion à la base de données +const dbConfig = { + 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 +}; + + +// Stockage des fichiers avec une date d'expiration +const fileLinks = {}; + +// DATE +moment.locale('fr'); + var date_formattee = moment().format('L') + var today = date_formattee; + +const generate_link = async function(req, res) { + + try { + // CONNEXION A LA BD + const db_connection_promise = await mysql_promise.createConnection(dbConfig); + + const linkId = Date.now(); + const filePath = path.join(__dirname, 'files', 'film_suzuki_unesco_2024.mp4'); // Chemin du fichier + let expiresAt = new Date(Date.now() + 24 * 60 * 60 * 1000); // 24 heures à partir de maintenant + // Format de la date pour MySQL + expiresAt = expiresAt.toISOString().slice(0, 19).replace('T', ' '); // 'YYYY-MM-DD HH:MM:SS' + const link = `${process.env.DOMAIN_EXTERNE}boutique/unesco/download/${linkId}`; + //const linkId = Date.now(); // Un identifiant unique basé sur le timestamp + //fileLinks[linkId] = { + // filePath: filePath, + // expiresAt: Date.now() + 24 * 60 * 60 * 1000 // 24 heures + //}; + + sql = 'INSERT INTO TemporaryLinks (id, link, filePath, expiresAt) VALUES ('+ linkId +', "'+ link +'", "'+ filePath +'", "'+ expiresAt +'")'; + console.log("sql : ", sql); + const [results, fields] = await db_connection_promise.execute(sql); + + // L'ID généré par MySQL est accessible ici + console.log("results.affectedRows : ", results.affectedRows); + + + console.log("link : ", link); + return link; + } catch (error) { + // Echec de connection à la BD + logger.error("Il y a un problème avec la connection à la base de données! : " + error, { numsession: req.session.id }); + await db_connection_promise.end(); + return error; + //return res.status(403).send('Il y a un problème avec la connection à la base de données!'); + } +} + +const download_file = async function(req, res) { + const linkId = req.params.id; + //const fileData = fileLinks[linkId]; + console.log("linkId : ",linkId); + + + try { + // CONNEXION A LA BD + const db_connection_promise = await mysql_promise.createConnection(dbConfig); + const [rows] = await db_connection_promise.execute( + 'SELECT filePath, expiresAt FROM TemporaryLinks WHERE id = ?', + [linkId] + ); + console.log("rows.length : ",rows.length); + + if (rows.length > 0) { + console.log("rows.expiresAt : ",rows[0].expiresAt); + console.log("today : ",today); + console.log("Date.now() : ",Date.now()); + const expiresAt = new Date(rows[0].expiresAt); + console.log("expiresAt : ",expiresAt); + console.log("expiresAt.getTime() : ",expiresAt.getTime()); + if (Date.now() < expiresAt.getTime()) { + req.session.filePath = rows[0].filePath; + req.session.expiresAt = rows[0].expiresAt; + res.download(rows[0].filePath, (err) => { + if (err) { + res.status(404).send('File not found'); + } + }); + } else { + res.status(403).send('Link has expired'); + } + + } else { + res.status(403).send('Link does not exist'); + } + } catch (error) { + // Echec de connection à la BD + logger.error("Il y a un problème avec la connection à la base de données! : " + error, { numsession: req.session.id }); + await db_connection_promise.end(); + return error; + } +} + +///////////////////////////////////////////////// +// EXPORT DE MODULE POUR QU'IL SOIT LU DANS LES AUTRES FICHIERS JS +///////////////////////////////////////////////// +module.exports = { + generate_link, + download_file +} + diff --git a/controllers/vente_video/generate_linkController.js b/controllers/vente_video/generate_linkController.js new file mode 100644 index 0000000..6fbad67 --- /dev/null +++ b/controllers/vente_video/generate_linkController.js @@ -0,0 +1,255 @@ +///////////////////////////////////////////////// +// LOGGING +///////////////////////////////////////////////// +const logger = require("../../public/js/app/logger_lienventetemp"); +///////////////////////////////////////////////// +// APPELS DES MODULES +///////////////////////////////////////////////// +const moment = require('moment'); +const ejs = require('ejs'); +const nodemailer = require('nodemailer'); +const path = require("path"); +const fs = require("fs"); +const mysql = require('mysql2'); +const mysql_promise = require('mysql2/promise'); +//////////////////////////////////////////////////// +// FILE NAME +//////////////////////////////////////////////////// +const filename = path.parse(__filename).base; +// Envoie mail +const envoie_mail = require("../../modules/envoie_mail"); + +///////////////////////////////////////////////// +// GOOGLE SHEET PARAMETERS +///////////////////////////////////////////////// +const { GoogleSpreadsheet } = require('google-spreadsheet'); +const GS_creds = require('../../inscriptionsafps-53b60452f63d.json'); +const { error } = require("console"); +// Initialize the sheet - doc ID is the long id in the sheets URL +const GS_boutique = new GoogleSpreadsheet(process.env.gsheet_boutique); + +//////////////////////////////////////////////////// +// Configuration de la connexion à la base de données +//////////////////////////////////////////////////// +const dbConfig = { + 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 +}; +// OU +const { connect_DB_promise } = require('../../modules/db/databaseconnect'); + +//////////////////////////////////////////////////// +// VARIABLES +//////////////////////////////////////////////////// +// Stockage des fichiers avec une date d'expiration +const fileLinks = {}; + +// DATE +moment.locale('fr'); + var date_formattee = moment().format('L') + var today = date_formattee; + +//////////////////////////////////////////////////// +// Générer le lien temporaire +//////////////////////////////////////////////////// +const generate_link = async function(req, res) { + logger.info("======================================", { label: filename }); + logger.info("generate_link", { label: filename }); + logger.info("======================================", { label: filename }); + + + try { + // CONNEXION A LA BD + const db_connection_promise = await mysql_promise.createConnection(dbConfig); + + const linkId = Date.now(); + const filePath = path.join(__dirname, 'files', 'film_suzuki_unesco_2024.mp4'); // Chemin du fichier + let expiresAt = new Date(Date.now() + 24 * 60 * 60 * 1000); // 24 heures à partir de maintenant + // Format de la date pour MySQL + expiresAt = expiresAt.toISOString().slice(0, 19).replace('T', ' '); // 'YYYY-MM-DD HH:MM:SS' + const link = `${process.env.DOMAIN_EXTERNE}boutique/unesco/download/${linkId}`; + //const linkId = Date.now(); // Un identifiant unique basé sur le timestamp + //fileLinks[linkId] = { + // filePath: filePath, + // expiresAt: Date.now() + 24 * 60 * 60 * 1000 // 24 heures + //}; + + let sql = 'INSERT INTO TemporaryLinks (id, link, filePath, expiresAt) VALUES ('+ linkId +', "'+ link +'", "'+ filePath +'", "'+ expiresAt +'")'; + console.log("sql : ", sql); + const [results, fields] = await db_connection_promise.execute(sql); + + // L'ID généré par MySQL est accessible ici + console.log("results.affectedRows : ", results.affectedRows); + + + console.log("link : ", link); + return link; + } catch (error) { + // Echec de connection à la BD + logger.error("Il y a un problème avec la connection à la base de données! : " + error, { numsession: req.session.id }); + await db_connection_promise.end(); + return error; + //return res.status(403).send('Il y a un problème avec la connection à la base de données!'); + } +} + + +///////////////////////////////////////////////// +// WEBHOOK STRIPE +// APRÈS PAIEMENT PAIEMENT +// ENVOIE Lien temporaire par mail +///////////////////////////////////////////////// +async function wh_stripe_vente_video(req, res, event) { + + logger.info("======================================"); + logger.info("======== FUNCTION wh_stripe_vente_video =========="); + logger.info("======================================"); + + moment.locale('fr'); + var now = moment().format("DD/MM/YYYY"); + var dateheure = moment().format("YYYY-MM-DD HH-mm-ss"); + //console.log("event.data.object = ", event.data.object); + //console.log("event.data.object.customer_details.email = ", event.data.object.customer_details.email); + //console.log("event.data.object.customer_details.name = ", event.data.object.customer_details.name); + + try { + ///////////////////////////////////////////////// + // SI PAIEMENT RÉUSSI + if (event.data.object.payment_status === "paid") { + + + + // GÉNÉRATION DU LIEN DE TÉLÉCHARGEMENT TEMPORAIRE + + const linkId = Date.now(); + const filePath = path.join(__dirname, 'files', 'film_suzuki_unesco_2024.mp4'); // Chemin du fichier + let expiresAt = new Date(Date.now() + 24 * 60 * 60 * 1000); // 2 heures à partir de maintenant + console.log("Date.now() =", Date.now()); + console.log("expiresAt brut =", expiresAt); + // Format de la date pour MySQL + expiresAt = expiresAt.toISOString().slice(0, 19).replace('T', ' '); // 'YYYY-MM-DD HH:MM:SS' + console.log("expiresAt formatée =", expiresAt); + const link = `${process.env.DOMAIN_EXTERNE}boutique/unesco/download/${linkId}`; + + + //Connexion DB + let db_connection_promise = await connect_DB_promise(); + + // AJOUT DE LA VENTE DANS LA TABLE " VENTE VIDEOS" DE LA BASE DE DONNÉES ADUZUKI + + let sql = `INSERT INTO boutique (date, name, email, produit, originPath, link, expiresAt, montant, status_paiement, stripe) VALUES ('${dateheure}', '${event.data.object.customer_details.name}', '${event.data.object.customer_details.email}', 'Film UNESCO 2024', '${filePath}', '${link}', '${expiresAt}', ${event.data.object.amount_total}/100, '${event.data.object.payment_status}', '${event.data.object.id}')`; + logger.info("#2 sql : " + sql, { numsession: req.session.id, label: filename}); + + // lancement de la requête + const [result_sql, fields] = await db_connection_promise.execute(sql); + logger.info("#2 result_sql Row ID added : " + result_sql.affectedRows, { numsession: req.session.id, label: filename}); + + ///////////////////////////////////////////////// + // ENVOIE MAIL CONFIRM + JUSTIF + + var mail_objet = `ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI - ACHAT FILM - ${event.data.object.customer_details.name}`; + var mail_html = `

Bonjour,


Suite à l'achat du film du Concert National Suzuki du 21 avril 2024 au Palais de l'UNESCO Paris, voici le lien de téléchargement du fichier vidéo. Ce lien est valable jusqu'au ${expiresAt} :
Cliquez sur ce lien pour accéder à la page de téléchargement du film : ${link}


Association Française pour la pédagogie Suzuki

`; + var mailOptions = { + from: 'afps.inscription@gmail.com', + to: event.data.object.customer_details.email, + subject: mail_objet, + html: mail_html, + }; + envoie_mail.envoie_mail(mailOptions); + + ///////////////////////////////////////////////// + // AJOUT GOOGLE SHEET + await GS_boutique.useServiceAccountAuth(GS_creds); + await GS_boutique.loadInfo(); + let GS_sheet_boutique = GS_boutique.sheetsByTitle['achats']; + await GS_sheet_boutique.addRows ( + [ + { + date: dateheure, + nom: event.data.object.customer_details.name, + email: event.data.object.customer_details.email, + produit: 'Film UNESCO 2024', + lien: link, + lien_expire_le: expiresAt, + montant: event.data.object.amount_total/100, + statut_paiement: event.data.object.payment_status, + stripe: event.data.object.id + } + ] + ); + logger.info("AJOUT GOOGLESHEET FIN", { numsession: req.session.id, label: filename}); + + } + + + } catch (error) { + // Echec de connection à la BD + logger.error("Il y a un problème avec wh_stripe_vente_video : " + error, { numsession: req.session.id }); + return res.status(400).send(`Webhook Error: ${error.message}`); + } + + res.json({ received: true }); + +} + +//////////////////////////////////////////////////// +// Download le fichier +//////////////////////////////////////////////////// +const download_file = async function(req, res) { + + logger.info("======================================"); + logger.info("======== FUNCTION download_file =========="); + logger.info("======================================"); + + const link = process.env.DOMAIN_EXTERNE_SS_SLASH+req.originalUrl; + logger.info("link : " + link, { numsession: req.session.id }); + + try { + // CONNEXION A LA BD pour vérifier l'expiration du lien temporaire et récupérer le lien original pour downloader le fichier + const db_connection_promise = await mysql_promise.createConnection(dbConfig); + + // Requête pour récupérer les infos d'après le code contenu dans le lien temporaire + let sql = 'SELECT originPath, expiresAt FROM boutique WHERE link = "'+ link+'"'; + logger.info("sql FROM boutique : " + sql, { numsession: req.session.id }); + const [rows] = await db_connection_promise.execute(sql); + logger.info("rows.length : " + rows.length, { numsession: req.session.id }); + req.session.originPath = rows[0].originPath; + // Si le lien temporaire à été trouvé (grâce au code contenu dans le lien qui est l'id) + if (rows.length > 0) { + logger.info("rows.expiresAt : " + rows[0].expiresAt, { numsession: req.session.id }); + logger.info("Date.now() : " + Date.now(), { numsession: req.session.id }); + const expiresAt = new Date(rows[0].expiresAt); + req.session.expiresAt = rows[0].expiresAt; + logger.info("expiresAt : " + expiresAt, { numsession: req.session.id }); + + // SI le lien n'a pas expiré on peut télécharger le fichier + if (Date.now() < expiresAt.getTime()) { + + + return rows[0].originPath; + } else { + return "Lien expiré" + } + } else { + return "Lien non trouvé" + } + } catch (error) { + // Echec de connection à la BD + logger.error("Il y a un problème avec la connection à la base de données! : " + error, { numsession: req.session.id }); + await db_connection_promise.end(); + return error; + } +} + +///////////////////////////////////////////////// +// EXPORT DE MODULE POUR QU'IL SOIT LU DANS LES AUTRES FICHIERS JS +///////////////////////////////////////////////// +module.exports = { + generate_link, + download_file, + wh_stripe_vente_video +} + diff --git a/controllers/vente_video/vente_videoController.js b/controllers/vente_video/vente_videoController.js new file mode 100644 index 0000000..13ee102 --- /dev/null +++ b/controllers/vente_video/vente_videoController.js @@ -0,0 +1,170 @@ +///////////////////////////////////////////////// +// LOGGING +///////////////////////////////////////////////// +const logger = require("../../public/js/app/logger_lienventetemp"); +///////////////////////////////////////////////// +// APPELS DES MODULES +///////////////////////////////////////////////// +const moment = require('moment'); +const ejs = require('ejs'); +const nodemailer = require('nodemailer'); +const path = require("path"); +const fs = require("fs"); +const mysql = require('mysql2'); +const mysql_promise = require('mysql2/promise'); +const stripe = require('stripe')(process.env.STRIPE_PRIVATE_KEY); + +//////////////////////////////////////////////////// +// FILE NAME +//////////////////////////////////////////////////// +const filename = path.parse(__filename).base; + +//////////////////////////////////////////////////// +// Configuration de la connexion à la base de données +//////////////////////////////////////////////////// +const dbConfig = { + 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 +}; + +//////////////////////////////////////////////////// +// ÉCRAN 2 - PAIEMENT AVEC STRIPE +//////////////////////////////////////////////////// +const post_req_stripe = async function(req, res) { + + logger.info("======================================"); + logger.info("======== FUNCTION post_req_stripe (vente vidéo) =========="); + logger.info("======================================"); + + logger.info("======== ENVOIE VERS STRIPE ==========", { label: filename }); + + try { + // STRIPE - ETAPE 1 - CREER l'INTENTION DE PAIEMENT + const session_stripe = await stripe.checkout.sessions.create({ + + metadata: {app: "vente_video"}, + mode: 'payment', + success_url: process.env.STRIPE_VENTEVIDEO_SUCCESSURL, + cancel_url: process.env.STRIPE_VENTEVIDEO_CANCELURL, + + line_items: [{ + price_data: { + currency: 'eur', + unit_amount: 800, + product_data: { + name: 'Film du Concert National Suzuki', + description: "Concert au Palais de l'UNESCO Paris du 21 avril 2024 (fichier vidéo H264/mp4)", + }, + }, + quantity: 1, + }] + }); + + res.redirect(session_stripe.url) + + } catch (error) { + // Echec de connection à la BD + logger.error("Il y a un problème avec la connection Stripe post_req_stripe : " + error, { numsession: req.session.id }); + req.session.affiche_err_1 = '"Il y a un problème système, veuillez recommencer, "' + error; + res.redirect('/boutique/videos'); + } + +} + + +///////////////////////////////////////////////// +// ÉCRAN 3 - RETOUR STRIPE RÉUSSI +///////////////////////////////////////////////// +const ventevideo_accompte_reussi = async function(req, res) { + logger.info("======================================"); + logger.info("======== FUNCTION ventevideo_accompte_reussi =========="); + logger.info("======================================"); + ////////////////////////////////////////////////////////////////////////////// + // RETOUR STRIPE + let id = req.query.id; + console.log("id = ", id); + const session_stripe = await stripe.checkout.sessions.retrieve(id); + + let customer_email = session_stripe.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; + + + + console.log("payment_status = ", payment_status); + console.log("stripe_customer = ", stripe_customer); + console.log("stripe_payment_intent = ", stripe_payment_intent); + console.log("payment_method_types = ", payment_method_types); + console.log("stripe_status = ", stripe_status); + console.log("customer_email = ", customer_email); + + ////////////////////////////////////////////////////////////////////////////// + // PRÉPARATION PAGE PAIEMENT RÉUSSI + moment.locale('fr'); + let now = moment().format("YYYY-MM-DD HH:mm:ss"); + res.locals.today = now; + res.locals.montant = amount_total; + res.locals.mail = customer_email; + + ////////////////////////////////////////////////////////////////////////////// + // AFFICHAGE PAGE PAIEMENT RÉUSSI + //res.render('don/page_templates/don_paiement_reussi.ejs'); + //res.status(200).json({ + // success: true, + // message: "Retour de STRIPE réussi", + // data: payment_status + //}); + res.render('ventevideo/page_templates/ventelien_paiement_reussi'); +} + +///////////////////////////////////////////////// +// ÉCRAN 3 - RETOUR STRIPE ECHEC +///////////////////////////////////////////////// +const ventevideo_accompte_annule = async function(req, res) { + logger.info("======================================"); + logger.info("======== FUNCTION ventevideo_accompte_annule =========="); + logger.info("======================================"); + ////////////////////////////////////////////////////////////////////////////// + // RETOUR STRIPE + let id = req.query.id; + const session_stripe = await stripe.checkout.sessions.retrieve(id); + let customer_email = session_stripe.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; + + console.log("payment_status = ", payment_status); + console.log("stripe_customer = ", stripe_customer); + console.log("stripe_payment_intent = ", stripe_payment_intent); + console.log("payment_method_types = ", payment_method_types); + console.log("stripe_status = ", stripe_status); + console.log("customer_email = ", customer_email); + + ////////////////////////////////////////////////////////////////////////////// + // AFFICHAGE PAGE PAIEMENT ANNULÉE + // res.render('don/page_templates/don_paiement_annule.ejs'); + //res.status(200).json({ + // success: true, + // message: "Retour de STRIPE échec", + // data: payment_status + //); + res.render('ventevideo/page_templates/ventelien_paiement_echec'); + } + +module.exports = { + post_req_stripe, + ventevideo_accompte_reussi, + ventevideo_accompte_annule +} \ No newline at end of file diff --git a/controllers/webhook_stripe_exemple.js b/controllers/webhook_stripe_exemple.js new file mode 100644 index 0000000..31ad2c1 --- /dev/null +++ b/controllers/webhook_stripe_exemple.js @@ -0,0 +1,63 @@ +// server.js +// +// Use this sample code to handle webhook events in your integration. +// +// 1) Paste this code into a new file (server.js) +// +// 2) Install dependencies +// npm install stripe +// npm install express +// +// 3) Run the server on http://localhost:4242 +// node server.js + +// The library needs to be configured with your account's secret key. +// Ensure the key is kept out of any version control system you might be using. +const stripe = require('stripe')('sk_test_...'); +const express = require('express'); +const app = express(); + + +// This is your Stripe CLI webhook secret for testing your endpoint locally. +const endpointSecret = "whsec_fed56735156a81c3ae36f3bb5dbd4dece5412ba299f55702c5cf077c69ce3a11"; + +app.post('/webhook', express.raw({type: 'application/json'}), (request, response) => { + const sig = request.headers['stripe-signature']; + + let event; + + try { + event = stripe.webhooks.constructEvent(request.body, sig, endpointSecret); + } catch (err) { + response.status(400).send(`Webhook Error: ${err.message}`); + return; + } + + // Handle the event + switch (event.type) { + case 'checkout.session.async_payment_failed': + const checkoutSessionAsyncPaymentFailed = event.data.object; + // Then define and call a function to handle the event checkout.session.async_payment_failed + break; + case 'checkout.session.async_payment_succeeded': + const checkoutSessionAsyncPaymentSucceeded = event.data.object; + // Then define and call a function to handle the event checkout.session.async_payment_succeeded + break; + case 'checkout.session.completed': + const checkoutSessionCompleted = event.data.object; + // Then define and call a function to handle the event checkout.session.completed + break; + case 'checkout.session.expired': + const checkoutSessionExpired = event.data.object; + // Then define and call a function to handle the event checkout.session.expired + break; + // ... handle other event types + default: + console.log(`Unhandled event type ${event.type}`); + } + + // Return a 200 response to acknowledge receipt of the event + response.send(); +}); + +app.listen(4242, () => console.log('Running on port 4242')); \ No newline at end of file diff --git a/controllers/whstripeController.js b/controllers/whstripeController.js new file mode 100644 index 0000000..8c3d969 --- /dev/null +++ b/controllers/whstripeController.js @@ -0,0 +1,98 @@ +///////////////////////////////////////////////// +// APPELS DES MODULES +///////////////////////////////////////////////// +const path = require("path"); +const stripe = require('stripe')(process.env.STRIPE_PRIVATE_KEY); + + +///////////////////////////////////////////////// +// APPELS DES MODULES PERSOS +///////////////////////////////////////////////// +// loggings +const logger = require("../public/js/app/logger_whstripe"); +// DB +const { connect_DB_promise } = require('../modules/db/databaseconnect'); +const { generateInsertSQL, extractValues } = require('../modules/db/sqlqueries'); + +///////////////////////////////////////////////// +// APPELS DES FONCTIONS +///////////////////////////////////////////////// +// FAIRE UNE PAUSE +const sleep = require("./../modules/sleep"); + +// Controllers +const { wh_stripe_don } = require("./donController"); +const { wh_stripe_vente_video } = require("./vente_video/generate_linkController"); + + + +//////////////////////////////////////////////////// +// FILE NAME +//////////////////////////////////////////////////// +const filename = path.parse(__filename).base; + + +///////////////////////////////////////////////// +// RECEPTION DU WEBHOOK STRIPE wh_stripe +///////////////////////////////////////////////// +const wh_stripe = async function(req, res) { + + logger.info("======================================"); + logger.info("======== FUNCTION wh_stripe =========="); + logger.info("======================================"); + + const sig = req.headers['stripe-signature']; + logger.info("sig = " + sig, { numsession: req.session.id, label: filename}); + + let event; + const endpointSecret = process.env.STRIPE_WEBHOOK_CLE_SIGNATURE_SECRETE; + + try { + event = stripe.webhooks.constructEvent(req.body, sig, endpointSecret); + } catch (err) { + logger.error("Webhook Error: " + err.message, { numsession: req.session.id, label: filename}); + return res.status(400).send(`Webhook Error: ${err.message}`); + } + + // Gérer les événements webhook + + logger.info("event.type = " + event.type, { numsession: req.session.id, label: filename}); + logger.info("event.data.object.id = " + event.data.object.id, { numsession: req.session.id, label: filename}); + logger.info("event.data.object.app = " + event.data.object.metadata.app, { numsession: req.session.id, label: filename}); + logger.info("event.data.object.customer_email = " + event.data.object.customer_email, { numsession: req.session.id, label: filename}); + logger.info("event.data.object.payment_status = " + event.data.object.payment_status, { numsession: req.session.id, label: filename}); + logger.info("event.data.object.metadata.identifiant = " + event.data.object.metadata.identifiant, { numsession: req.session.id, label: filename}); + logger.info("event.data.object.metadata.nom = " + event.data.object.metadata.nom, { numsession: req.session.id, label: filename}); + logger.info("event.data.object.metadata.montant = " + event.data.object.metadata.montant, { numsession: req.session.id, label: filename}); + + logger.info("event.data.object.status = " + event.data.object.status, { numsession: req.session.id, label: filename}); + + + ///////////////////////////////////////////////// + // DON + ///////////////////////////////////////////////// + + switch (event.data.object.metadata.app) { + case "don": + logger.info("WEBHOOK wh_stripe => redirection vers DON wh_stripe_don", { numsession: req.session.id, label: filename}); + return wh_stripe_don(req, res, event); + + case "vente_video": + logger.info("WEBHOOK wh_stripe => redirection vers VENTE VIDEO wh_stripe_vente_video", { numsession: req.session.id, label: filename}); + return wh_stripe_vente_video(req, res, event); + + default: + // cas undefined, null, ou autre valeur non prévue + return res.json({ received: true }); + } + +} + + + +///////////////////////////////////////////////// +// EXPORT DE MODULE POUR QU'IL SOIT LU DANS LES AUTRES FICHIERS JS +///////////////////////////////////////////////// +module.exports = { + wh_stripe +} \ No newline at end of file diff --git a/controllers/wuzukiController copie.js b/controllers/wuzukiController copie.js new file mode 100644 index 0000000..2b1d710 --- /dev/null +++ b/controllers/wuzukiController copie.js @@ -0,0 +1,167 @@ +///////////////////////////////////////////////// +// APPELS DES MODULES +///////////////////////////////////////////////// +const moment = require('moment'); +const ejs = require('ejs'); +const nodemailer = require('nodemailer'); +const path = require("path"); +const stripe = require('stripe')(process.env.STRIPE_PRIVATE_KEY); +const pdf = require("pdf-creator-node"); +const fs = require("fs"); +const mysql = require('mysql2'); +const mysql_promise = require('mysql2/promise'); +const axios = require('axios'); + +// Weasyprint +const weasyprint = require("htmltopdf-weasyprint"); + +///////////////////////////////////////////////// +// APPELS DES MODULES PERSOS +///////////////////////////////////////////////// +// loggings +const logger = require("../public/js/app/logger_wuzuki"); +// Envoie mail +const envoie_mail = require("../modules/envoie_mail"); +// DB +const { connect_DB_promise } = require('../modules/db/databaseconnect'); +const { generateInsertSQL, extractValues } = require('../modules/db/sqlqueries'); + + +///////////////////////////////////////////////// +// APPELS DES FONCTIONS +///////////////////////////////////////////////// +// FAIRE UNE PAUSE +const sleep = require("./../modules/sleep"); + +//////////////////////////////////////////////////// +// FILE NAME +//////////////////////////////////////////////////// +const filename = path.parse(__filename).base; + +///////////////////////////////////////////////// +// GOOGLE SHEET PARAMETERS +///////////////////////////////////////////////// +const { GoogleSpreadsheet } = require('google-spreadsheet'); +const GS_creds = require('../inscriptionsafps-53b60452f63d.json'); +const { error } = require("console"); +// Initialize the sheet - doc ID is the long id in the sheets URL +const GS_contact = new GoogleSpreadsheet(process.env.gsheet_contact); + + + +///////////////////////////////////////////////// +// ENREGISTREMENT DES INFORMATIONS SAISIES +// ENVOIE MAIL VERS AFPS +// AJOUT DANS GOOGLE SHEET CONTACTS AFPS +///////////////////////////////////////////////// +const post_form_envoie_message = async function(req, res){ + logger.info("======================================"); + logger.info("======== FUNCTION post_form_envoie_message =========="); + logger.info("======================================"); + + moment.locale('fr'); + let now = moment().format("DD/MM/YYYY"); + + ///////////////////////////////////////////////// + // RÉCUPÉRATION DES DONNÉES DU FORMULAIRE DANS LA SESSION EN COURS et dans la tableau DATA + ///////////////////////////////////////////////// + + // VÉRIFIER SI CAPTCHA A BIEN ÉTÉ REMPLI + const token_captcha = req.body['g-recaptcha-response']; + if (!token_captcha) { + logger.info("Captcha non rempli", { numsession: req.session.id }); + req.session.affiche_err_1 = 'Captcha non rempli.'; + res.redirect('/wuzuki/envoie_message'); + } + + // un tableau : pour récupérer en même temps les informations saisies dans un tableau + let data = []; + + // Boucle sur les noms des champs + // ajout des infos dans le tablea + ['nom', 'prenom', 'mail', 'commentaire'].forEach(field => { + req.session[field] = req.body[field]; + data.push({[field] : req.body[field]}); + logger.info("#0 " + field + " = " + req.body[field], { numsession: req.session.id, label: filename}); + }); + console.log("data = ", data); + + + ///////////////////////////////////////////////// + // ENVOIE MAIL AFPS + // AJOUT DANS GOOGLE SHEET CONTACTS AFPS + ///////////////////////////////////////////////// + + try { + + // CAPTCHA V3 + const response_captcha = await axios.post(`https://www.google.com/recaptcha/api/siteverify`, null, { + params: { + secret: process.env.g_captcha, + response: token_captcha + } + }); + const response_captcha_data = response_captcha.data; + console.log("response_captcha_data = ", response_captcha_data.success); + logger.info("#0 response_captcha_data : SUCCESS = " + response_captcha_data.success + " / score = " + response_captcha_data.score, { numsession: req.session.id, label: filename}); + + // CAPTCHA V3 + //if (response_captcha_data.success) { + if (response_captcha_data.success && response_captcha_data.score >= 0.8) { + ///////////////////////////////////////////////// + // ENVOIE MAIL À L'AFPS + var mail_objet = `[WUZUKI] DEMANDE DE CONTACT DEPUIS LE SITE INTERNET - ${req.session.nom}`; + var mail_html = `

Bonjour,

Une personne a rempli le formulaire de contact du site Internet de l'AFPS.
Voici ses coordonnées et son message :


NOM : ${req.session.nom}

PRÉNOM : ${req.session.prenom}

MAIL : ${req.session.mail}

MESSAGE :
${req.session.commentaire}


WUZUKI, programme du site Internet de l'AFPS

`; + var mailOptions = { + from: 'juliechaumard@gmail.com', + to: 'juliechaumard@gmail.com', + subject: mail_objet, + html: mail_html + }; + envoie_mail.envoie_mail(mailOptions); + + ///////////////////////////////////////////////// + // AJOUT DE LA DEMANDE DE CONTACT DANS GOOGLE SHEET CONTACTS AFPS + await GS_contact.useServiceAccountAuth(GS_creds); + await GS_contact.loadInfo(); + let GS_sheet_contact = GS_contact.sheetsByTitle['demande_contact']; + await GS_sheet_contact.addRows ( + [ + { + provenance: "site internet afps", + cta: 'bouton "Nous Contacter"', + date: now, + nom: req.session.nom, + prenom: req.session.prenom, + mail: req.session.mail, + message: req.session.commentaire, + mail_envoye: 'A afpedagogiesuzuki@gmail.com' + } + ] + ); + logger.info("AJOUT GOOGLESHEET FIN", { numsession: req.session.id, label: filename}); + + req.session.affiche_err_1 = "Votre message à bien été envoyé à l'Association Française pour la Pédagogie Suzuki."; + res.redirect('/wuzuki/envoie_message'); + + } else { + // Les informations saisies sont vides + logger.info("Il y a un problème avec la saisie des informations du formulaire", { numsession: req.session.id }); + req.session.affiche_err_1 = 'Il y a un problème avec la saisie des informations du formulaire, veuillez recommencer.'; + res.redirect('/wuzuki/envoie_message'); + } + + } catch (error) { + // Echec de connection à la BD + logger.error("Il y a un problème système post_form_envoie_message : " + error, { numsession: req.session.id }); + req.session.affiche_err_1 = '"Il y a un problème système, veuillez recommencer, "' + error; + res.redirect('/wuzuki/envoie_message'); + } +} + +///////////////////////////////////////////////// +// EXPORT DE MODULE POUR QU'IL SOIT LU DANS LES AUTRES FICHIERS JS +///////////////////////////////////////////////// +module.exports = { + post_form_envoie_message + } \ No newline at end of file diff --git a/controllers/wuzukiController.js b/controllers/wuzukiController.js new file mode 100644 index 0000000..8fe55b5 --- /dev/null +++ b/controllers/wuzukiController.js @@ -0,0 +1,151 @@ +///////////////////////////////////////////////// +// APPELS DES MODULES +///////////////////////////////////////////////// +const moment = require('moment'); +const path = require("path"); +const axios = require('axios'); + + +///////////////////////////////////////////////// +// APPELS DES MODULES PERSOS +///////////////////////////////////////////////// +// loggings +const logger = require("../public/js/app/logger_wuzuki"); +// Envoie mail +const envoie_mail = require("../modules/envoie_mail"); +// DB +const { connect_DB_promise } = require('../modules/db/databaseconnect'); + +//////////////////////////////////////////////////// +// FILE NAME +//////////////////////////////////////////////////// +const filename = path.parse(__filename).base; + +///////////////////////////////////////////////// +// GOOGLE SHEET PARAMETERS +///////////////////////////////////////////////// +const { GoogleSpreadsheet } = require('google-spreadsheet'); +const GS_creds = require('../inscriptionsafps-53b60452f63d.json'); +const { error } = require("console"); +// Initialize the sheet - doc ID is the long id in the sheets URL +const GS_contact = new GoogleSpreadsheet(process.env.gsheet_contact); + + + +///////////////////////////////////////////////// +// ENREGISTREMENT DES INFORMATIONS SAISIES +// ENVOIE MAIL VERS AFPS +// AJOUT DANS GOOGLE SHEET CONTACTS AFPS +///////////////////////////////////////////////// +const post_form_envoie_message = async function(req, res){ + logger.info("======================================"); + logger.info("======== FUNCTION post_form_envoie_message =========="); + logger.info("======================================"); + + moment.locale('fr'); + let now = moment().format("DD/MM/YYYY"); + + ///////////////////////////////////////////////// + // RÉCUPÉRATION DES DONNÉES DU FORMULAIRE DANS LA SESSION EN COURS et dans la tableau DATA + ///////////////////////////////////////////////// + + // VÉRIFIER SI CAPTCHA A BIEN ÉTÉ REMPLI + const token_captcha = req.body['g-recaptcha-response']; + if (!token_captcha) { + logger.info("Captcha non rempli", { numsession: req.session.id }); + req.session.affiche_err_1 = 'Captcha non rempli.'; + return res.redirect('/wuzuki/envoie_message'); + } + + // un tableau : pour récupérer en même temps les informations saisies dans un tableau + let data = []; + + // Boucle sur les noms des champs + // ajout des infos dans le tableau + ['nom', 'prenom', 'mail', 'commentaire'].forEach(field => { + req.session[field] = req.body[field]; + data.push({[field] : req.body[field]}); + logger.info("#0 " + field + " = " + req.body[field], { numsession: req.session.id, label: filename}); + }); + console.log("data = ", data); + + + ///////////////////////////////////////////////// + // ENVOIE MAIL AFPS + // AJOUT DANS GOOGLE SHEET CONTACTS AFPS + ///////////////////////////////////////////////// + + try { + + // CAPTCHA V3 + const response_captcha = await axios.post(`https://www.google.com/recaptcha/api/siteverify`, null, { + params: { + secret: process.env.g_captcha, + response: token_captcha + } + }); + const response_captcha_data = response_captcha.data; + console.log("response_captcha_data = ", response_captcha_data.success); + logger.info("#0 response_captcha_data : SUCCESS = " + response_captcha_data.success + " / score = " + response_captcha_data.score, { numsession: req.session.id, label: filename}); + + // CAPTCHA V3 + + if (response_captcha_data.success && response_captcha_data.score >= 0.8) { + ///////////////////////////////////////////////// + // ENVOIE MAIL À L'AFPS + var mail_objet = `[WUZUKI] DEMANDE DE CONTACT DEPUIS LE SITE INTERNET - ${req.session.nom}`; + var mail_html = `

Bonjour,

Une personne a rempli le formulaire de contact du site Internet de l'AFPS.
Voici ses coordonnées et son message :


NOM : ${req.session.nom}

PRÉNOM : ${req.session.prenom}

MAIL : ${req.session.mail}

MESSAGE :
${req.session.commentaire}


WUZUKI, programme du site Internet de l'AFPS

`; + var mailOptions = { + from: 'afps.inscription@gmail.com', + to: 'afpedagogiesuzuki@gmail.com', + cc: 'supplies@juliechaumard.paris', + subject: mail_objet, + html: mail_html + }; + await envoie_mail.envoie_mail(mailOptions); + + ///////////////////////////////////////////////// + // AJOUT DE LA DEMANDE DE CONTACT DANS GOOGLE SHEET CONTACTS AFPS + await GS_contact.useServiceAccountAuth(GS_creds); + await GS_contact.loadInfo(); + let GS_sheet_contact = GS_contact.sheetsByTitle['demande_contact']; + await GS_sheet_contact.addRows ( + [ + { + provenance: "site internet afps", + cta: 'bouton "Nous Contacter"', + date: now, + nom: req.session.nom, + prenom: req.session.prenom, + mail: req.session.mail, + message: req.session.commentaire, + mail_envoye: 'A afpedagogiesuzuki@gmail.com' + } + ] + ); + logger.info("AJOUT GOOGLESHEET FIN", { numsession: req.session.id, label: filename}); + + req.session.affiche_err_1 = "Votre message à bien été envoyé à l'Association Française pour la Pédagogie Suzuki."; + return res.redirect('/wuzuki/envoie_message'); + + } else { + // Les informations saisies sont vides + logger.info("Il y a un problème avec la saisie des informations du formulaire", { numsession: req.session.id }); + req.session.affiche_err_1 = 'Il y a un problème avec la saisie des informations du formulaire, veuillez recommencer.'; + return res.redirect('/wuzuki/envoie_message'); + } + + } catch (error) { + // Echec de connection à la BD + logger.error("Il y a un problème système post_form_envoie_message : " + error, { numsession: req.session.id }); + req.session.affiche_err_1 = '"Il y a un problème système, veuillez recommencer, "' + error; + return res.redirect('/wuzuki/envoie_message'); + } +} + +///////////////////////////////////////////////// +// EXPORT DE MODULE POUR QU'IL SOIT LU DANS LES AUTRES FICHIERS JS +///////////////////////////////////////////////// +module.exports = { + post_form_envoie_message + } \ No newline at end of file diff --git a/documentation/ROUTAGES.png b/documentation/ROUTAGES.png new file mode 100644 index 0000000..052a291 Binary files /dev/null and b/documentation/ROUTAGES.png differ diff --git a/generatedReceipt.pdf b/generatedReceipt.pdf new file mode 100644 index 0000000..9e45a2d Binary files /dev/null and b/generatedReceipt.pdf differ diff --git a/import_ass_locales.md b/import_ass_locales.md new file mode 100644 index 0000000..999682b --- /dev/null +++ b/import_ass_locales.md @@ -0,0 +1,41 @@ +# DOC IMPORT ASSOCATIONS LOCALES + +1. Connexion Google Sheet +2. On copie toutes les lignes dans le tableau GS_asso_locales_rows +3. On compte le nombre de lignes récupérées (Une ligne = une adhésion) +4. Connexion à Adobe API pour pouvoir générer des PDF +5. Connexion à la DB Aduzuki +6. Pour chaque ligne du tableau GS_asso_locales_rows (c'est à dire pour chaque adhésion) + 1. Si la ligne n'est pas taguée comme déjà importée (date_export est vide) + 2. Insertion en DB de l'adhésion + 1. table adherent + 2. table adherent_finance + 1. si adherent_paiement_montant_don est vide, on met 0 + 3. table adherent_professeur (si adherent_prof_instrument1 est rempli) + 4. table adherent_formation_prof (si adherent_prof_stagiaire_instrument1 est rempli) + 5. table adherent_eleve / pour élève 1 (si adherent_eleve1_nom est rempli) + 6. table adherent_eleve / pour élève 2 (si adherent_eleve2_nom est rempli) + 7. table adherent_eleve / pour élève 3 (si adherent_eleve3_nom est rempli) + 8. table adherent_eleve / pour élève 4 (si adherent_eleve4_nom est rempli) + 9. table adherent_eleve / pour élève 5 (si adherent_eleve5_nom est rempli) + 3. Préparation du PDF pour la carte adhésion et le justificatif de don + 1. Définition des profils à ajouter à la carte adhérent pour les rendre plus lisibles + 2. Choix du template PDF + 1. Si don + 1. template PDF carte_adherent_don.docx + 2. Si pas de don + 1. template PDF carte_adherent.docx + 3. Netoyage des champs adresse + 4. préparation de la date du jour + 5. récupération des données de l'adhérent (du tableau GS_asso_locales_rows) nécessaires à la construction du PDF + 6. Création du PDF avec la biblio Adobe PDF + 1. enregistrement du PDF dans le dossier ../pdf/adhesion/2526/paye/ + 4. Envoie du PDF par mail à l'adhérent + 1. préparation de nodemailer + 2. préparation du nom du fichier à joindre + 3. préparation des infos du mail : expéditeur, destinataire, objet, corps + 4. envoie du mail + 5. Mise à jour du tag "carte adhérent envoyé" dans le DB (table adherent, champ carte_envoi = "definitive") + 6. Taguer l'adhérent comme importé dans le tableau Google Sheet + 1. préparation de la date d'import + 2. écriture dans le Google Sheet, colonne date_export \ No newline at end of file diff --git a/juju.pdf b/juju.pdf new file mode 100644 index 0000000..002dd2e Binary files /dev/null and b/juju.pdf differ diff --git a/modules/adhesion/carte_adherent.js b/modules/adhesion/carte_adherent.js index 87e946c..40689dd 100644 --- a/modules/adhesion/carte_adherent.js +++ b/modules/adhesion/carte_adherent.js @@ -1,7 +1,8 @@ function profil(adherent_type) { let profil1, profil2, profil3 ; - console.log ("function profil.adherent_type: ", adherent_type) + console.log ("function profil.adherent_type: ", adherent_type); + adherent_type = (adherent_type || "").trim().toLowerCase(); if (adherent_type === "famille") { profil1 = "Famille"; console.log("profil1 : ", profil1); @@ -22,29 +23,30 @@ function profil(adherent_type) { } if (adherent_type === "prof_stagiaire") { profil1 = "Professeur"; - profil2 = "Professeur stagiaire"; + profil2 = "Stagiaire ESA"; console.log("profil1 : ", profil1); console.log("profil2 : ", profil2); } if (adherent_type === "prof_stagiaire_famille") { profil1 = "Professeur"; - profil2 = "Professeur stagiaire"; + profil2 = "Stagiaire ESA"; profil3 = "Élève"; console.log("profil1 : ", profil1); console.log("profil2 : ", profil2); console.log("profil3 : ", profil3); } if (adherent_type === "prof_stagiaire1") { - profil1 = "Professeur stagiaire"; + profil1 = "Stagiaire ESA"; console.log("profil1 : ", profil1); } if (adherent_type === "prof_stagiaire1_famille") { - profil1 = "Professeur stagiaire"; + profil1 = "Stagiaire ESA"; profil2 = "Élève"; console.log("profil1 : ", profil1); console.log("profil2 : ", profil2); } console.log("RETURN profil1 : ", profil1); + //return profil1; return [profil1, profil2, profil3]; diff --git a/modules/adhesion/maj_annuaire_prof_site_auto.js b/modules/adhesion/maj_annuaire_prof_site_auto.js new file mode 100644 index 0000000..3be6470 --- /dev/null +++ b/modules/adhesion/maj_annuaire_prof_site_auto.js @@ -0,0 +1,35 @@ +///////////////////////////////////////////////// +// LOGGING +///////////////////////////////////////////////// +const logger = require("../../public/js/app/logger_adhesion"); + +const cron = require('node-cron'); +const axios = require('axios'); + +//////////////////////////////////////////////////// +// FILE NAME +//////////////////////////////////////////////////// +const path = require("path"); +const filename = path.parse(__filename).base; + +// URL de la page à lancer pour faire la mise à jour +const URL = "https://inscription.afpedagogiesuzuki.fr/adhesion/sync_prof_strapi"; + +// Fonction pour envoyer la requête POST +const maj_annuaire = async () => { + try { + const response = await axios.get(URL); + logger.info("annuaire maj avec succès: " + response.status, { numsession:"maj_annuaire", label: filename}); + } catch (error) { + logger.error("Erreur lors de la maj de l'annuaire: " + error, { numsession:"maj_annuaire", label: filename}); + } +}; + +// Définir la tâche cron : ici, elle s'exécute toutes les 2 minutes +// cron.schedule('*/2 * * * *', () => { +// Définir la tâche cron : ici, elle s'exécute à 4h du matin +// cron.schedule('0 4 * * *', () => { +cron.schedule('0 4 * * *', () => { + logger.info("MAJ annuaire cron lancée (modules/adhesion/maj_annuaire_prof_site_auto.js)", { numsession:"maj_annuaire", label: filename}); + maj_annuaire(); +}); \ No newline at end of file diff --git a/modules/adhesion/majgs_webhook.js b/modules/adhesion/majgs_webhook.js new file mode 100644 index 0000000..a294d43 --- /dev/null +++ b/modules/adhesion/majgs_webhook.js @@ -0,0 +1,36 @@ +///////////////////////////////////////////////// +// LOGGING +///////////////////////////////////////////////// +const logger = require("../../public/js/app/logger_adhesion"); +const path = require("path"); +const cron = require('node-cron'); +const axios = require('axios'); + +//////////////////////////////////////////////////// +// FILE NAME +//////////////////////////////////////////////////// +const filename = path.parse(__filename).base; + +// URL du webhook +//const WEBHOOK_URL = "http://localhost:8890/adhesion/maj_googlesheet_auto"; +const WEBHOOK_URL = "https://inscription.afpedagogiesuzuki.fr/adhesion/maj_googlesheet_auto"; +//const WEBHOOK_URL = process.env.adhesion_maj_gs_webhook_url; //cela ne fonctionne pas + +// Fonction pour envoyer la requête POST +const envoyerWebhook = async () => { + try { + const response = await axios.get(WEBHOOK_URL, {}); + logger.info("Webhook envoyé avec succès: " + response.status, { numsession:"webhook", label: filename}); + } catch (error) { + logger.error("Erreur lors de l'envoi du webhook: " + error.message, { numsession:"webhook", label: filename}); + } +}; + +// Définir la tâche cron : ici, elle s'exécute toutes les 2 minutes +// cron.schedule('*/2 * * * *', () => { +// Définir la tâche cron : ici, elle s'exécute à 3h du matin +// cron.schedule('0 3 * * *', () => { +cron.schedule('0 3 * * *', () => { + logger.info("Envoi du webhook (modules/adhesion/majgs_webhook.js) à l'heure prévue", { numsession:"webhook", label: filename}); + envoyerWebhook(); +}); \ No newline at end of file diff --git a/modules/db/checkAdherent.js b/modules/db/checkAdherent.js new file mode 100644 index 0000000..85941cc --- /dev/null +++ b/modules/db/checkAdherent.js @@ -0,0 +1,47 @@ +// recherche si identifiant saisie est bien dans la base de données des adhérents + +///////////////////////////////////////////////// +// APPELS DES MODULES +///////////////////////////////////////////////// +const path = require("path"); + +///////////////////////////////////////////////// +// APPELS DES MODULES PERSOS +///////////////////////////////////////////////// +// loggings +const logger = require("../../public/js/app/logger"); +// DB +const { connect_DB_promise } = require('../db/databaseconnect'); + +//////////////////////////////////////////////////// +// FILE NAME +//////////////////////////////////////////////////// +const filename = path.parse(__filename).base; + +async function checkAdherent(sql) { + try { + const connection = await connect_DB_promise(); + const [results_checkAdherent] = await connection.execute(sql); + await connection.end(); + + logger.info("checkAdherent results_checkAdherent.length = " + results_checkAdherent.length, {label: filename}); + + if (results_checkAdherent.length > 0) { + logger.info("Est adhérent", {label: filename}); + return { + found: true, + results_checkAdherent: results_checkAdherent[0], + error: false + }; + } else { + logger.info("N'est pas adhérent", {label: filename}); + return { found: false, error: false }; + } + } catch (error) { + // Echec de connection à la BD + logger.error("Il y a un problème avec la connection à la base de données! : " + error, {label: filename}); + return { found: false, error: true }; + } +} + +module.exports = { checkAdherent }; \ No newline at end of file diff --git a/modules/db/databaseconnect.js b/modules/db/databaseconnect.js new file mode 100644 index 0000000..ad5d1e9 --- /dev/null +++ b/modules/db/databaseconnect.js @@ -0,0 +1,19 @@ +///////////////////////////////////////////////// +// APPELS DES MODULES +///////////////////////////////////////////////// +const mysql_promise = require('mysql2/promise'); + +//////////////////////////////////////////////////// +// CONNECTION DB +//////////////////////////////////////////////////// +async function connect_DB_promise() { + return 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 + }); +} + +module.exports = { connect_DB_promise }; \ No newline at end of file diff --git a/modules/db/sqlqueries.js b/modules/db/sqlqueries.js new file mode 100644 index 0000000..2ce5048 --- /dev/null +++ b/modules/db/sqlqueries.js @@ -0,0 +1,33 @@ +///////////////////////////////////////////////// +// APPELS DES MODULES +///////////////////////////////////////////////// +const path = require("path"); + +///////////////////////////////////////////////// +// APPELS DES MODULES PERSOS +///////////////////////////////////////////////// +// loggings +const logger = require("../../public/js/app/logger"); + +//////////////////////////////////////////////////// +// FILE NAME +//////////////////////////////////////////////////// +const filename = path.parse(__filename).base; + +// Fonction qui construit de la requête SQL +function generateInsertSQL(tableName, data) { + // On récupère les noms des champs + const columns = Object.keys(data).join(', '); + // on ajoute autant de "?" que de champs + const placeholders = Object.keys(data).map(() => '?').join(', '); + + return `INSERT INTO ${tableName} (${columns}) VALUES (${placeholders})`; +} + +// Fonction qui récupère la liste des valeurs des champs +function extractValues (data) { + return Object.values(data); +} + +module.exports = { generateInsertSQL, extractValues }; + diff --git a/modules/envoie_mail.js b/modules/envoie_mail.js new file mode 100644 index 0000000..a167623 --- /dev/null +++ b/modules/envoie_mail.js @@ -0,0 +1,31 @@ +///////////////////////////////////////////////// +// LOGGING +///////////////////////////////////////////////// +const logger = require("../public/js/app/logger"); +// ENVOIE MAIL GOOGLE MAIL +const nodemailer = require('nodemailer'); + + +function envoie_mail(mailOptions) { + logger.info("MAIL ENVOI AVANT"); + var transporter = nodemailer.createTransport({ + service: 'gmail', + auth: { + user: process.env.nodemailer_user, + pass: process.env.nodemailer_pass + } + }); + + transporter.sendMail(mailOptions, function(error, info){ + if (error) { + logger.info("error" + error); + } else { + logger.info("Email envoyé: " + info.response); + } + }); + logger.info("MAIL ENVOI APRES"); +} + +module.exports = { + envoie_mail +} \ No newline at end of file diff --git a/modules/pdf.js b/modules/pdf.js new file mode 100644 index 0000000..aae1700 --- /dev/null +++ b/modules/pdf.js @@ -0,0 +1,62 @@ +///////////////////////////////////////////////// +// LOGGING +///////////////////////////////////////////////// +const logger = require("../public/js/app/logger_concert"); + +// ADOBE PDF +const PDFServicesSdk = require('@adobe/pdfservices-node-sdk'); + +//////////////////////////////////////////////////// +// CONNECTION ADOBE API +//////////////////////////////////////////////////// + +async function pdfgo(OUTPUT, INPUT, JSON_INPUT) { + logger.info("AVANT CREATION DU PDF"); + + const credentials = PDFServicesSdk.Credentials + .servicePrincipalCredentialsBuilder() + .withClientId(process.env.PDF_SERVICES_CLIENT_ID) + .withClientSecret(process.env.PDF_SERVICES_CLIENT_SECRET) + .build(); + + const clientConfig = PDFServicesSdk.ClientConfig + .clientConfigBuilder() + .withConnectTimeout(20000) + .withReadTimeout(40000) + .build(); + + const executionContext = PDFServicesSdk.ExecutionContext.create(credentials); + + const documentMerge = PDFServicesSdk.DocumentMerge, + documentMergeOptions = documentMerge.options, + adobe_options = new documentMergeOptions.DocumentMergeOptions(JSON_INPUT, documentMergeOptions.OutputFormat.PDF); + + // Create a new operation instance using the options instance. + const documentMergeOperation = documentMerge.Operation.createNew(adobe_options); + + // Set operation input document template from a source file. + const input = PDFServicesSdk.FileRef.createFromLocalFile(INPUT); + documentMergeOperation.setInput(input); + + // Execute the operation and Save the result to the specified location. + await documentMergeOperation + .execute(executionContext) + .then(result => result.saveAsFile(OUTPUT).then( + ) + ) + .catch(err => { + if(err instanceof PDFServicesSdk.Error.ServiceApiError + || err instanceof PDFServicesSdk.Error.ServiceUsageError) { + console.log('Exception encountered while executing ADOBE PDF', err); + } else { + console.log('Exception encountered while executing ADOBE PDF', err); + } + }); + + logger.info("APRES CREATION DU PDF"); + +} + +module.exports = { + pdfgo +} \ No newline at end of file diff --git a/modules/sleep.js b/modules/sleep.js new file mode 100644 index 0000000..7444a82 --- /dev/null +++ b/modules/sleep.js @@ -0,0 +1,12 @@ +// POUR EVITER DE DÉPASSER LE QUOTA DE GOOGLE API REQUEST PER MINUTE +// ON ATTENDS QUELQUES SECONDES +const wait = function wait(milliseconds){ + return new Promise(resolve => { + setTimeout(resolve, milliseconds); + console.log('Dans le sleep'); + }); +}; + +module.exports = { + wait +} \ No newline at end of file diff --git a/modules/stripe.js b/modules/stripe.js new file mode 100644 index 0000000..e69de29 diff --git a/modules/verif_codesecret.js b/modules/verif_codesecret.js new file mode 100644 index 0000000..bffd5ce --- /dev/null +++ b/modules/verif_codesecret.js @@ -0,0 +1,54 @@ +// SI DATE LIMITE D'INSCRIPTION DÉPASSÉE ON vérifie que le code secret est bien ok + +///////////////////////////////////////////////// +// APPELS DES MODULES +///////////////////////////////////////////////// +const path = require("path"); + +///////////////////////////////////////////////// +// APPELS DES MODULES PERSOS +///////////////////////////////////////////////// +// loggings +const logger = require("../public/js/app/logger_stagenat"); +// DB +const { connect_DB_promise } = require('../modules/db/databaseconnect'); + +//////////////////////////////////////////////////// +// FILE NAME +//////////////////////////////////////////////////// +const filename = path.parse(__filename).base; + +async function verif_codesecret(req, res) { + logger.info("/// DÉBUT FONCTION verif_codesecret", { numsession: req.session.id, label: filename}); + //Connexion + let db_connection_promise = await connect_DB_promise(); + if (req.session.datelimitedepass === "oui") { + logger.info("DATE LIMITE DEPASSÉE", { numsession: req.session.id, label: filename}); + // Query + let sql_codesecret = 'select code, statut from code where code = "' + req.session.code_secret + '" AND statut = "actif"'; + logger.info("sql_codesecret : " + sql_codesecret, { numsession: req.session.id, label: filename}); + const [results_codesecret, fields] = await db_connection_promise.execute(sql_codesecret); + await db_connection_promise.end(); + logger.info("results_codesecret.length : " + results_codesecret.length, { numsession: req.session.id, label: filename}); + if (results_codesecret.length) { + // on peut continuer + req.session.onpeutcontinuer = "oui" + + } else { + // CODE SECRET ERRONÉ + req.session.onpeutcontinuer = "non" + logger.info("Code secret erroné : "+req.session.code_secret, { 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 = "Le code inscription " + req.session.code_secret + " est erroné."; + //res.redirect('/stagenational/identifier'); + } + } else { + // on peut continuer + req.session.onpeutcontinuer = "oui" + } + logger.info("/// FIN FONCTION verif_codesecret", { numsession: req.session.id, label: filename}); +} + +module.exports = { + verif_codesecret +} \ No newline at end of file diff --git a/package.json b/package.json index 52d33ac..7d2cbe1 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "main": "app.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", - "app": "nodemon app.js", + "app": "nodemon app_aduzuki.js", "scss": "sass --watch src/scss/app.scss public/css/app.css", "start": "npm run app & npm run scss" }, @@ -18,6 +18,7 @@ "author": "juliechaumard.paris", "license": "CC-BY-NC-SA-2.0-FR", "dependencies": { + "@adobe/pdfservices-node-sdk": "^3.4.2", "axios": "^1.2.4", "body-parser": "^1.20.1", "dotenv": "^16.0.3", @@ -28,15 +29,20 @@ "fs": "^0.0.1-security", "google-spreadsheet": "^3.3.0", "googleapis": "^110.0.0", + "htmltopdf-weasyprint": "^1.0.8", "lodash": "^4.17.21", "luxon": "^3.2.1", "moment": "^2.29.4", + "mysql2": "^3.6.0", + "node-cron": "^3.0.3", + "node-fetch": "2.7.0", "nodemailer": "^6.9.0", "path": "^0.12.7", "pdf-creator-node": "^2.3.5", "printf": "^0.6.1", "puppeteer": "^19.6.0", "stripe": "^11.7.0", + "uuid": "^10.0.0", "winston": "^3.8.2", "winston-daily-rotate-file": "^4.7.1" }, diff --git a/pdf/adhesion/2223/attente/julie@juliechaumard.paris_adhesion_2223_attente.pdf b/pdf/adhesion/2223/attente/julie@juliechaumard.paris_adhesion_2223_attente.pdf deleted file mode 100644 index c8f305b..0000000 Binary files a/pdf/adhesion/2223/attente/julie@juliechaumard.paris_adhesion_2223_attente.pdf and /dev/null differ diff --git a/pdf/adhesion/2223/attente/lullishop@icloud.com_adhesion_2223_attente.pdf b/pdf/adhesion/2223/attente/lullishop@icloud.com_adhesion_2223_attente.pdf deleted file mode 100644 index 632fa78..0000000 Binary files a/pdf/adhesion/2223/attente/lullishop@icloud.com_adhesion_2223_attente.pdf and /dev/null differ diff --git a/pdf/adhesion/2223/don/lulliabo@icloud.com_adhesion_2223_don.pdf b/pdf/adhesion/2223/don/lulliabo@icloud.com_adhesion_2223_don.pdf deleted file mode 100644 index f0c4639..0000000 Binary files a/pdf/adhesion/2223/don/lulliabo@icloud.com_adhesion_2223_don.pdf and /dev/null differ diff --git a/pdf/adhesion/2223/don/lullishop@icloud.com_adhesion_2223_don.pdf b/pdf/adhesion/2223/don/lullishop@icloud.com_adhesion_2223_don.pdf deleted file mode 100644 index 3c4cbd2..0000000 Binary files a/pdf/adhesion/2223/don/lullishop@icloud.com_adhesion_2223_don.pdf and /dev/null differ diff --git a/pdf/adhesion/2223/payee/lulliabo@icloud.com_adhesion_2223_payee.pdf b/pdf/adhesion/2223/payee/lulliabo@icloud.com_adhesion_2223_payee.pdf deleted file mode 100644 index 9de619f..0000000 Binary files a/pdf/adhesion/2223/payee/lulliabo@icloud.com_adhesion_2223_payee.pdf and /dev/null differ diff --git a/pdf/adhesion/2223/payee/lullishop@icloud.com_adhesion_2223_payee.pdf b/pdf/adhesion/2223/payee/lullishop@icloud.com_adhesion_2223_payee.pdf deleted file mode 100644 index c816990..0000000 Binary files a/pdf/adhesion/2223/payee/lullishop@icloud.com_adhesion_2223_payee.pdf and /dev/null differ diff --git a/pdf/adhesion/2324/attente/lulliabo@icloud.com_adhesion_2324_attente_2024-09-02T22-42-04.pdf b/pdf/adhesion/2324/attente/lulliabo@icloud.com_adhesion_2324_attente_2024-09-02T22-42-04.pdf new file mode 100644 index 0000000..0197760 Binary files /dev/null and b/pdf/adhesion/2324/attente/lulliabo@icloud.com_adhesion_2324_attente_2024-09-02T22-42-04.pdf differ diff --git a/pdf/adhesion/2324/attente/lullishop@icloud.com_adhesion_2324_attente_2024-09-03T12-46-38.pdf b/pdf/adhesion/2324/attente/lullishop@icloud.com_adhesion_2324_attente_2024-09-03T12-46-38.pdf new file mode 100644 index 0000000..35b2b0f Binary files /dev/null and b/pdf/adhesion/2324/attente/lullishop@icloud.com_adhesion_2324_attente_2024-09-03T12-46-38.pdf differ diff --git a/pdf/adhesion/2324/paye/lulliabo@icloud.com_adhesion_2324_paye_don_2024-09-02T23-11-35.pdf b/pdf/adhesion/2324/paye/lulliabo@icloud.com_adhesion_2324_paye_don_2024-09-02T23-11-35.pdf new file mode 100644 index 0000000..c0e2ea6 Binary files /dev/null and b/pdf/adhesion/2324/paye/lulliabo@icloud.com_adhesion_2324_paye_don_2024-09-02T23-11-35.pdf differ diff --git a/pdf/adhesion/2324/paye/lullishop@icloud.com_adhesion_2324_paye_don_2024-09-03T12-49-23.pdf b/pdf/adhesion/2324/paye/lullishop@icloud.com_adhesion_2324_paye_don_2024-09-03T12-49-23.pdf new file mode 100644 index 0000000..6f7daca Binary files /dev/null and b/pdf/adhesion/2324/paye/lullishop@icloud.com_adhesion_2324_paye_don_2024-09-03T12-49-23.pdf differ diff --git a/pdf/adhesion/2425/attente/juliechaumard@icloud.com_adhesion_2425_attente_2024-10-27T14-08-25.pdf b/pdf/adhesion/2425/attente/juliechaumard@icloud.com_adhesion_2425_attente_2024-10-27T14-08-25.pdf new file mode 100644 index 0000000..0cfb520 Binary files /dev/null and b/pdf/adhesion/2425/attente/juliechaumard@icloud.com_adhesion_2425_attente_2024-10-27T14-08-25.pdf differ diff --git a/pdf/adhesion/2425/attente/juliechaumard@icloud.com_adhesion_2425_attente_2024-10-27T14-34-04.pdf b/pdf/adhesion/2425/attente/juliechaumard@icloud.com_adhesion_2425_attente_2024-10-27T14-34-04.pdf new file mode 100644 index 0000000..c85c98b Binary files /dev/null and b/pdf/adhesion/2425/attente/juliechaumard@icloud.com_adhesion_2425_attente_2024-10-27T14-34-04.pdf differ diff --git a/pdf/adhesion/2425/attente/lulliabo@icloud.com_adhesion_2425_attente_2024-10-27T14-57-45.pdf b/pdf/adhesion/2425/attente/lulliabo@icloud.com_adhesion_2425_attente_2024-10-27T14-57-45.pdf new file mode 100644 index 0000000..7f1dd74 Binary files /dev/null and b/pdf/adhesion/2425/attente/lulliabo@icloud.com_adhesion_2425_attente_2024-10-27T14-57-45.pdf differ diff --git a/pdf/adhesion/2425/paye/juliechaumard@icloud.com_adhesion_2425_paye_don_2024-10-27T14-13-11.pdf b/pdf/adhesion/2425/paye/juliechaumard@icloud.com_adhesion_2425_paye_don_2024-10-27T14-13-11.pdf new file mode 100644 index 0000000..1f6dd5f Binary files /dev/null and b/pdf/adhesion/2425/paye/juliechaumard@icloud.com_adhesion_2425_paye_don_2024-10-27T14-13-11.pdf differ diff --git a/pdf/adhesion/2425/paye/juliechaumard@icloud.com_adhesion_2425_paye_don_2024-10-27T14-41-31.pdf b/pdf/adhesion/2425/paye/juliechaumard@icloud.com_adhesion_2425_paye_don_2024-10-27T14-41-31.pdf new file mode 100644 index 0000000..a588d4b Binary files /dev/null and b/pdf/adhesion/2425/paye/juliechaumard@icloud.com_adhesion_2425_paye_don_2024-10-27T14-41-31.pdf differ diff --git a/pdf/adhesion/2425/paye/lulliabo@icloud.com_adhesion_2425_paye_2024-10-27T15-04-18.pdf b/pdf/adhesion/2425/paye/lulliabo@icloud.com_adhesion_2425_paye_2024-10-27T15-04-18.pdf new file mode 100644 index 0000000..ef50ec1 Binary files /dev/null and b/pdf/adhesion/2425/paye/lulliabo@icloud.com_adhesion_2425_paye_2024-10-27T15-04-18.pdf differ diff --git a/pdf/adhesion/2425/paye/lulliabo@icloud.com_adhesion_2425_paye_2024-10-27T15-04-19.pdf b/pdf/adhesion/2425/paye/lulliabo@icloud.com_adhesion_2425_paye_2024-10-27T15-04-19.pdf new file mode 100644 index 0000000..aa7cdd2 Binary files /dev/null and b/pdf/adhesion/2425/paye/lulliabo@icloud.com_adhesion_2425_paye_2024-10-27T15-04-19.pdf differ diff --git a/pdf/adhesion/2425/paye/lulliabo@icloud.com_adhesion_2425_paye_don_2024-10-27T14-00-24.pdf b/pdf/adhesion/2425/paye/lulliabo@icloud.com_adhesion_2425_paye_don_2024-10-27T14-00-24.pdf new file mode 100644 index 0000000..7599ba4 Binary files /dev/null and b/pdf/adhesion/2425/paye/lulliabo@icloud.com_adhesion_2425_paye_don_2024-10-27T14-00-24.pdf differ diff --git a/pdf/adhesion/2425/paye/lullishop@icloud.com_adhesion_2425_paye_2024-10-27T14-57-04.pdf b/pdf/adhesion/2425/paye/lullishop@icloud.com_adhesion_2425_paye_2024-10-27T14-57-04.pdf new file mode 100644 index 0000000..8af2141 Binary files /dev/null and b/pdf/adhesion/2425/paye/lullishop@icloud.com_adhesion_2425_paye_2024-10-27T14-57-04.pdf differ diff --git a/pdf/adhesion/2425/paye/lullishop@icloud.com_adhesion_2425_paye_don_2024-10-27T13-54-18.pdf b/pdf/adhesion/2425/paye/lullishop@icloud.com_adhesion_2425_paye_don_2024-10-27T13-54-18.pdf new file mode 100644 index 0000000..81fbd5b Binary files /dev/null and b/pdf/adhesion/2425/paye/lullishop@icloud.com_adhesion_2425_paye_don_2024-10-27T13-54-18.pdf differ diff --git a/pdf/adhesion/2526/attente/juliechaumard@gmail.com_adhesion_2526_attente_2026-05-31T19-31-08.pdf b/pdf/adhesion/2526/attente/juliechaumard@gmail.com_adhesion_2526_attente_2026-05-31T19-31-08.pdf new file mode 100644 index 0000000..0a656ab Binary files /dev/null and b/pdf/adhesion/2526/attente/juliechaumard@gmail.com_adhesion_2526_attente_2026-05-31T19-31-08.pdf differ diff --git a/pdf/adhesion/2526/paye/guwantt@gmail.comZZ_adhesion_2526_paye_2025-11-02T18-42-58.pdf b/pdf/adhesion/2526/paye/guwantt@gmail.comZZ_adhesion_2526_paye_2025-11-02T18-42-58.pdf new file mode 100644 index 0000000..7c759b8 Binary files /dev/null and b/pdf/adhesion/2526/paye/guwantt@gmail.comZZ_adhesion_2526_paye_2025-11-02T18-42-58.pdf differ diff --git a/pdf/adhesion/2526/paye/guwantt@gmail.comZZ_adhesion_2526_paye_2025-11-02T18-44-54.pdf b/pdf/adhesion/2526/paye/guwantt@gmail.comZZ_adhesion_2526_paye_2025-11-02T18-44-54.pdf new file mode 100644 index 0000000..823d6c1 Binary files /dev/null and b/pdf/adhesion/2526/paye/guwantt@gmail.comZZ_adhesion_2526_paye_2025-11-02T18-44-54.pdf differ diff --git a/pdf/adhesion/2526/paye/guwantt@gmail.comZZ_adhesion_2526_paye_2025-11-02T23-29-47.pdf b/pdf/adhesion/2526/paye/guwantt@gmail.comZZ_adhesion_2526_paye_2025-11-02T23-29-47.pdf new file mode 100644 index 0000000..9fda473 Binary files /dev/null and b/pdf/adhesion/2526/paye/guwantt@gmail.comZZ_adhesion_2526_paye_2025-11-02T23-29-47.pdf differ diff --git a/pdf/adhesion/2526/paye/guwantt@gmail.comZZ_adhesion_2526_paye_don_2025-11-02T23-32-45.pdf b/pdf/adhesion/2526/paye/guwantt@gmail.comZZ_adhesion_2526_paye_don_2025-11-02T23-32-45.pdf new file mode 100644 index 0000000..db1e04b Binary files /dev/null and b/pdf/adhesion/2526/paye/guwantt@gmail.comZZ_adhesion_2526_paye_don_2025-11-02T23-32-45.pdf differ diff --git a/pdf/adhesion/2526/paye/guwantt@gmail.com_adhesion_2526_paye_2025-11-02T18-25-16.pdf b/pdf/adhesion/2526/paye/guwantt@gmail.com_adhesion_2526_paye_2025-11-02T18-25-16.pdf new file mode 100644 index 0000000..f97fa1c Binary files /dev/null and b/pdf/adhesion/2526/paye/guwantt@gmail.com_adhesion_2526_paye_2025-11-02T18-25-16.pdf differ diff --git a/pdf/adhesion/2526/paye/lulliabo@icloud.com_adhesion_2526_paye_don_2025-08-31T12-40-57.pdf b/pdf/adhesion/2526/paye/lulliabo@icloud.com_adhesion_2526_paye_don_2025-08-31T12-40-57.pdf new file mode 100644 index 0000000..784f9e5 Binary files /dev/null and b/pdf/adhesion/2526/paye/lulliabo@icloud.com_adhesion_2526_paye_don_2025-08-31T12-40-57.pdf differ diff --git a/pdf/adhesion/2526/paye/lullishop@icloud.com_adhesion_2526_paye_don_2025-08-31T13-31-05.pdf b/pdf/adhesion/2526/paye/lullishop@icloud.com_adhesion_2526_paye_don_2025-08-31T13-31-05.pdf new file mode 100644 index 0000000..9637bf5 Binary files /dev/null and b/pdf/adhesion/2526/paye/lullishop@icloud.com_adhesion_2526_paye_don_2025-08-31T13-31-05.pdf differ diff --git a/pdf/don/don_Chaumard_2024-07-19T22-55.pdf b/pdf/don/don_Chaumard_2024-07-19T22-55.pdf new file mode 100644 index 0000000..1b77099 Binary files /dev/null and b/pdf/don/don_Chaumard_2024-07-19T22-55.pdf differ diff --git a/pdf/don/don_Chaumard_2024-07-20T10-50.pdf b/pdf/don/don_Chaumard_2024-07-20T10-50.pdf new file mode 100644 index 0000000..8f58b77 Binary files /dev/null and b/pdf/don/don_Chaumard_2024-07-20T10-50.pdf differ diff --git a/pdf/don/don_Chaumard_2024-07-20T10-52.pdf b/pdf/don/don_Chaumard_2024-07-20T10-52.pdf new file mode 100644 index 0000000..cc6b378 Binary files /dev/null and b/pdf/don/don_Chaumard_2024-07-20T10-52.pdf differ diff --git a/pdf/don/don_Chaumard_2024-07-20T10-55.pdf b/pdf/don/don_Chaumard_2024-07-20T10-55.pdf new file mode 100644 index 0000000..0ac374d Binary files /dev/null and b/pdf/don/don_Chaumard_2024-07-20T10-55.pdf differ diff --git a/pdf/don/don_Chaumard_2024-07-21T00-38.pdf b/pdf/don/don_Chaumard_2024-07-21T00-38.pdf new file mode 100644 index 0000000..cf72def Binary files /dev/null and b/pdf/don/don_Chaumard_2024-07-21T00-38.pdf differ diff --git a/pdf/don/don_Chaumard_2024-07-21T00-39.pdf b/pdf/don/don_Chaumard_2024-07-21T00-39.pdf new file mode 100644 index 0000000..3f99bbb Binary files /dev/null and b/pdf/don/don_Chaumard_2024-07-21T00-39.pdf differ diff --git a/pdf/don/don_Chaumard_2024-07-21T13-24.pdf b/pdf/don/don_Chaumard_2024-07-21T13-24.pdf new file mode 100644 index 0000000..dff7412 Binary files /dev/null and b/pdf/don/don_Chaumard_2024-07-21T13-24.pdf differ diff --git a/pdf/don/output.pdf b/pdf/don/output.pdf new file mode 100644 index 0000000..757d39f Binary files /dev/null and b/pdf/don/output.pdf differ diff --git a/pdf/rassemblement/documents/rassemblementidf_plan_lieu.pdf b/pdf/rassemblement/documents/rassemblementidf_plan_lieu.pdf new file mode 100644 index 0000000..4141f08 Binary files /dev/null and b/pdf/rassemblement/documents/rassemblementidf_plan_lieu.pdf differ diff --git a/pdf/rassemblement/documents/rassemblementidf_programme.pdf b/pdf/rassemblement/documents/rassemblementidf_programme.pdf new file mode 100644 index 0000000..af94b1d Binary files /dev/null and b/pdf/rassemblement/documents/rassemblementidf_programme.pdf differ diff --git a/pdf/rassemblement/documents/rassemblementidf_programme_2023.pdf b/pdf/rassemblement/documents/rassemblementidf_programme_2023.pdf new file mode 100644 index 0000000..5357a65 Binary files /dev/null and b/pdf/rassemblement/documents/rassemblementidf_programme_2023.pdf differ diff --git a/pdf/stage_national/documents/stage_national_tarifs_2024.pdf b/pdf/stage_national/documents/stage_national_tarifs_2024.pdf new file mode 100644 index 0000000..d0fe4f3 Binary files /dev/null and b/pdf/stage_national/documents/stage_national_tarifs_2024.pdf differ diff --git a/pdf/stage_national/documents/stage_national_tarifs_2025.pdf b/pdf/stage_national/documents/stage_national_tarifs_2025.pdf new file mode 100644 index 0000000..8460f7c Binary files /dev/null and b/pdf/stage_national/documents/stage_national_tarifs_2025.pdf differ diff --git a/pdf/stage_national/documents/stage_national_tarifs_2025_old.pdf b/pdf/stage_national/documents/stage_national_tarifs_2025_old.pdf new file mode 100644 index 0000000..2a1bde2 Binary files /dev/null and b/pdf/stage_national/documents/stage_national_tarifs_2025_old.pdf differ diff --git a/pdf/stage_national/documents/stage_national_tarifs_2026.pdf b/pdf/stage_national/documents/stage_national_tarifs_2026.pdf new file mode 100644 index 0000000..d2cdde1 Binary files /dev/null and b/pdf/stage_national/documents/stage_national_tarifs_2026.pdf differ diff --git a/pdf/template/carte_adherent.docx b/pdf/template/carte_adherent.docx new file mode 100644 index 0000000..23625ec Binary files /dev/null and b/pdf/template/carte_adherent.docx differ diff --git a/pdf/template/carte_adherent.html b/pdf/template/carte_adherent.html index 7ab0fef..8c3df84 100644 --- a/pdf/template/carte_adherent.html +++ b/pdf/template/carte_adherent.html @@ -254,7 +254,7 @@

Adhésion annuelle à l’Association Française pour la Pédagogie Suzuki

-

Année 2022/2023 du 1er septembre au 31 août

+

Année 2025/2026 du 1er septembre au 31 août

@@ -274,7 +274,7 @@

Chez Anne PAGES
30 rue des Tattes
74500 PUBLIER
afpedagogiesuzuki@gmail.com

-

SIRET : 507 569 952 00033

+

SIRET de l'Association AFPS : 507 569 952 00033

Le {{this.today}}

@@ -294,7 +294,7 @@
@@ -305,7 +305,7 @@

Association Française pour la pédagogie Suzuki

-

ANNÉE 2022/2023

+

ANNÉE 2025/2026

diff --git a/pdf/template/carte_adherent.pages b/pdf/template/carte_adherent.pages new file mode 100755 index 0000000..325595b Binary files /dev/null and b/pdf/template/carte_adherent.pages differ diff --git a/pdf/template/carte_adherent1.docx b/pdf/template/carte_adherent1.docx new file mode 100644 index 0000000..ecedec9 Binary files /dev/null and b/pdf/template/carte_adherent1.docx differ diff --git a/pdf/template/carte_adherent_don.docx b/pdf/template/carte_adherent_don.docx new file mode 100644 index 0000000..d3d8388 Binary files /dev/null and b/pdf/template/carte_adherent_don.docx differ diff --git a/pdf/template/carte_adherent_don.pages b/pdf/template/carte_adherent_don.pages new file mode 100755 index 0000000..35cbf92 Binary files /dev/null and b/pdf/template/carte_adherent_don.pages differ diff --git a/pdf/template/carte_adherent_temp.docx b/pdf/template/carte_adherent_temp.docx new file mode 100644 index 0000000..3f72f48 Binary files /dev/null and b/pdf/template/carte_adherent_temp.docx differ diff --git a/pdf/template/carte_adherent_temp.pages b/pdf/template/carte_adherent_temp.pages new file mode 100644 index 0000000..822ac9f Binary files /dev/null and b/pdf/template/carte_adherent_temp.pages differ diff --git a/pdf/template/carte_adherent_temp_20240902.docx b/pdf/template/carte_adherent_temp_20240902.docx new file mode 100644 index 0000000..cea4e62 Binary files /dev/null and b/pdf/template/carte_adherent_temp_20240902.docx differ diff --git a/pdf/template/carte_adherentold.docx b/pdf/template/carte_adherentold.docx new file mode 100644 index 0000000..7698cab Binary files /dev/null and b/pdf/template/carte_adherentold.docx differ diff --git a/pdf/template/don_justificatif.docx b/pdf/template/don_justificatif.docx new file mode 100644 index 0000000..1f220c0 Binary files /dev/null and b/pdf/template/don_justificatif.docx differ diff --git a/pdf/template/don_justificatif.html b/pdf/template/don_justificatif.html index ab92567..8e016e5 100644 --- a/pdf/template/don_justificatif.html +++ b/pdf/template/don_justificatif.html @@ -272,7 +272,7 @@

Siège social : Chez Anne PAGES
30 rue des Tattes
74500 PUBLIER
afpedagogiesuzuki@gmail.com
Site web : www.afpedagogiesuzuki.fr

-

Numéro SIRET : 507 569 952 00033

+

Numéro SIRET de l'Association AFPS : 507 569 952 00033

Le {{this.today}}

diff --git a/pdf/template/don_justificatif.pages b/pdf/template/don_justificatif.pages new file mode 100644 index 0000000..dc77c9b Binary files /dev/null and b/pdf/template/don_justificatif.pages differ diff --git a/pdf/template/don_wp.html b/pdf/template/don_wp.html new file mode 100644 index 0000000..4646add --- /dev/null +++ b/pdf/template/don_wp.html @@ -0,0 +1,62 @@ + + + + + AFPS Justificat de don + + + + + +
+ + +
+
+
+
+ Le <%= date %> +
+
+
+
+

Association Française pour la Pédagogie Suzuki

+
+

Chez Anne PAGES

+

30 rue des Tattes
74500 Publier

+
+

afps.inscription@gmail.com

+
+

Numéro SIRET 507 569 952 00033

+
+
+
+
+
+
+

Justificatif de don

+
+
+ Nous accusons réception de votre don à l’Association Française pour la Pédagogie Suzuki. L’Association vous remercie chaleureusement. +
+
+
+

Nom : <%= nom %>

+

Rue : <%= rue %>

+

Complément : <%= complement %>

+

Ville : <%= ville %>

+

Pays : <%= pays %>

+
+

montant du don : <%= montant %> €

+

Don unique le : <%= date %>

+
+
+
+ + + + + + \ No newline at end of file diff --git a/pdf/template/receiptTemplate.docx b/pdf/template/receiptTemplate.docx new file mode 100644 index 0000000..7698cab Binary files /dev/null and b/pdf/template/receiptTemplate.docx differ diff --git a/pdfservices-api-credentials.json b/pdfservices-api-credentials.json new file mode 100644 index 0000000..12ebad3 --- /dev/null +++ b/pdfservices-api-credentials.json @@ -0,0 +1,9 @@ +{ + "client_credentials": { + "client_id": "7596ed8f2a634c84a631d17e9d841844", + "client_secret": "p8e-Rf13NOjxHR1EUvlhhsn8aTwc2fHROSw0" + }, + "service_principal_credentials": { + "organization_id": "C1341EB064ECA3540A495EE0@AdobeOrg" + } +} \ No newline at end of file diff --git a/public/css/app.css b/public/css/app.css index bf76bb3..6fb7102 100644 --- a/public/css/app.css +++ b/public/css/app.css @@ -1,4 +1,6 @@ +@charset "UTF-8"; /* CSS de base */ +@import url("https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"); body, div, h1, h2, h3, h4, h5, h6, p, ul, ol, li, dl, dt, dd, img, form, fieldset, blockquote, main, article, aside, section { margin: 0px 0px 0px 0px; padding: 0px 0px 0px 0px; @@ -24,10 +26,38 @@ body { color: #E73058 !important; } +.turquoise { + color: #16BFB1 !important; +} + +.color_gris_fonce { + color: #707070 !important; +} + +.color_green { + color: #11a63d !important; +} + +.bg_green_clair { + background-color: #11a63d !important; +} + .bg_green { background-color: green !important; } +.bg_rouge_tres_clair { + background-color: rgba(231, 48, 88, 0.1294117647); +} + +.border_green { + border: 0.15em solid #11a63d !important; +} + +mark { + background: rgba(231, 48, 88, 0.1294117647) !important; +} + /* CSS */ /* fonts */ @font-face { @@ -155,7 +185,7 @@ body { src: url("../fonts/montserrat_black.ttf") format("truetype"); } @font-face { - font-family: "montsermontserrat_extraboldrat_regular"; + font-family: "montserrat_extrabold"; src: url("../fonts/montserrat_extrabold.ttf") format("truetype"); } @font-face { @@ -235,7 +265,27 @@ body { src: url("../fonts/ubuntu-moyen_italique.ttf") format("truetype"); } .gras { - font-family: cabin_bold; + font-family: cabin_bold !important; +} + +.underline { + text-decoration: underline !important; +} + +.montserrat_light { + font-family: montserrat_light; +} + +.montserrat_regular { + font-family: montserrat_regular; +} + +.montserrat_semibold { + font-family: montserrat_semibold; +} + +.font-17 { + font-size: 17px !important; } /* ***************************************** */ @@ -243,10 +293,62 @@ body { /* ESPACE ENTRE LES BLOCS */ /* ***************************************** */ /* ***************************************** */ +.float_right { + float: right; +} + +.space20 { + height: 20px; +} + .space30 { height: 30px; } +.space40 { + height: 40px; +} + +.space60 { + height: 60px; +} + +.space80 { + height: 80px; +} + +.margintop_-20px { + margin-top: -20px !important; +} + +.marginbottom_-20px { + margin-bottom: -20px !important; +} + +.margintop_40px { + margin-top: 40px; +} + +.marginbottom_40px { + margin-bottom: 40px; +} + +.margintop_60px { + margin-top: 60px; +} + +.marginleft_27px { + margin-left: 27px; +} + +.paddingbottom_5px { + padding-bottom: 5px; +} + +.just_it_c { + justify-items: center; +} + main { max-width: 1800px; margin-left: auto; @@ -349,7 +451,7 @@ header .logo img { .savoirplus_accueil { width: 80%; - margin-top: 150px; + margin-top: 90px; margin-right: auto; margin-left: auto; } @@ -366,8 +468,27 @@ header .logo img { cursor: pointer; } +.savoirplus_stage_accueil { + max-width: 550px; + margin-top: 150px; + margin-right: auto; + margin-left: auto; +} +@media (max-width: 600px) { + .savoirplus_stage_accueil { + width: 95%; + } +} +.savoirplus_stage_accueil .savoirplus_button { + text-align: center; + text-decoration: underline; +} +.savoirplus_stage_accueil .savoirplus_button:hover { + cursor: pointer; +} + .savoirplus_stage { - width: 80%; + max-width: 550px; margin-top: 15px; margin-bottom: 48px; margin-right: auto; @@ -378,9 +499,12 @@ header .logo img { width: 95%; } } +.savoirplus_stage p { + font-size: 14px; +} .titre { - margin-bottom: 100px; + margin-bottom: 60px; } @media (max-width: 600px) { .titre { @@ -411,6 +535,38 @@ header .logo img { color: #707070; } +.sous_titre { + display: flex; + column-gap: 25px; + align-items: center; + justify-content: flex-start; + margin-bottom: 20px; +} +.sous_titre img { + max-height: 90px; + min-height: 45px; +} +.sous_titre p { + font-size: 18px; +} + +.sous_titre_centre { + justify-content: center !important; +} + +.textcenter { + text-align: center; +} + +.note { + font-family: montserrat_light; + font-size: 15px !important; + color: #E73058; +} +.note li:before { + content: "- "; +} + /* ***************************************** */ /* ***************************************** */ /* LE FOOTER */ @@ -453,8 +609,6 @@ footer .version { top: -28px; } .input_box input[type=email] { - padding-top: 19px; - padding-bottom: 16px; padding-left: 16px; padding-right: 13px; background-color: white; @@ -553,6 +707,20 @@ footer .version { border: 1.8px solid #1B299A; } +.input_box_rouge label { + color: #E73058; +} +.input_box_rouge input, .input_box_rouge input[type=text], .input_box_rouge input[type=tel], .input_box_rouge input[type=date], .input_box_rouge select, .input_box_rouge textarea { + border: 1.8px solid #E73058; +} + +.input_box_green label { + color: #11a63d; +} +.input_box_green input, .input_box_green input[type=text], .input_box_green input[type=tel], .input_box_green input[type=date], .input_box_green select, .input_box_green textarea { + border: 1.8px solid #11a63d; +} + /* FORMAT DU CONTENUE DU CHAMP DE SAISIE */ /* ***************************************** */ .input_email { @@ -654,6 +822,14 @@ footer .version { color: #A2A0A0; } +.uppercase { + text-transform: uppercase; +} + +.capitalize { + text-transform: capitalize; +} + /* ***************************************** */ /* ***************************************** */ /* CHECKBOX */ @@ -683,6 +859,20 @@ footer .version { background-color: #E73058; } +.input_checkbox_bleu input[type=checkbox] { + border: 0.15em solid #3644AC !important; +} +.input_checkbox_bleu input[type=checkbox]:checked { + background-color: #3644AC !important; +} + +.input_checkbox_green input[type=checkbox] { + border: 0.15em solid #11a63d !important; +} +.input_checkbox_green input[type=checkbox]:checked { + background-color: #11a63d !important; +} + /* ***************************************** */ /* ***************************************** */ /* BUTTONS */ @@ -730,6 +920,11 @@ footer .version { padding-left: 0px; } +.text_listeatt { + font-size: 12px; + text-decoration: underline; +} + .erreur { max-width: 500px; display: flex; @@ -737,6 +932,7 @@ footer .version { margin-left: auto; margin-right: auto; margin-bottom: 70px; + color: #E73058; text-align: center; } @media (max-width: 600px) { @@ -762,8 +958,8 @@ footer .version { .form_check_mail { display: grid; grid-template-columns: 2fr 1fr 2fr; - grid-template-rows: auto auto auto; - grid-template-areas: ". input ." ". checkbox checkbox" ". button ."; + grid-template-rows: auto auto auto auto; + grid-template-areas: ". input ." ". checkbox checkbox" ". input_code ." ". button ."; } .form_check_mail .input_email { grid-area: input; @@ -778,6 +974,10 @@ footer .version { font-family: cabin_semibold; color: #343434; } +.form_check_mail .input_code { + grid-area: input_code; + margin-bottom: 40px; +} .form_check_mail button { grid-area: button; justify-self: center; @@ -858,6 +1058,60 @@ footer .version { text-decoration: none; } +.flex_centre { + align-items: center !important; + justify-content: center; +} + +@page { + font-family: montserrat_regular; + margin: 1cm; +} +.weasyprint { + color: #14213d; + font-family: montserrat_regular; + font-size: 10pt; +} +.weasyprint .logo { + max-width: 300px; + height: 100%; + object-fit: cover; +} +.weasyprint article { + margin-left: 30px; + margin-right: 30px; +} +.weasyprint article .header_wp { + display: flex; + justify-content: flex-end; +} +.weasyprint article .header_wp .header { + width: 50%; +} +.weasyprint article .header_wp .header .date { + display: flex; + justify-content: flex-start; +} +.weasyprint article .header_wp .header .afps { + display: flex; + justify-content: flex-start; +} +.weasyprint article .content { + margin-left: 30px; +} +.weasyprint article .content h1 { + color: #E73058; + font-family: montserrat_bold; + font-size: 20px; + text-transform: uppercase; +} +.weasyprint article .content p { + margin-bottom: 5px; +} +.weasyprint article .content p .label { + color: #707070; +} + /* ***************************************** */ /* ***************************************** */ /* ADHESION */ @@ -867,6 +1121,12 @@ footer .version { /* **************************************************************** */ /* ** OUVRIR EN SAVOIR PLUS ** */ /* **************************************************************** */ +.message_fin { + display: flex; + flex-direction: column; + align-items: center; +} + .form_adhesion { display: grid; justify-content: center; @@ -891,6 +1151,10 @@ footer .version { margin-bottom: 35px; color: #101D77; } +.form_adhesion .explication_pleine_page { + margin-bottom: 38px; + color: #101D77; +} .form_adhesion .ajout_ecole_button { margin-top: -35px; margin-bottom: 30px; @@ -901,6 +1165,10 @@ footer .version { .form_adhesion .ajout_ecole_button:hover { cursor: pointer; } +.form_adhesion h2 { + margin-bottom: 40px; + font-size: 16px; +} .grid_3inputs { display: grid; @@ -936,6 +1204,19 @@ footer .version { } } +.grid_1inputs { + display: grid; + grid-template-columns: minmax(auto, 550px); + grid-template-rows: auto; + row-gap: 30px; + margin-bottom: 35px; +} +@media (max-width: 600px) { + .grid_1inputs { + grid-template-columns: minmax(auto, 350px); + } +} + .paiement_explication { max-width: 500px; margin-top: 20px; @@ -1333,14 +1614,21 @@ footer .version { font-family: montserrat_thin; font-size: 13px; } +.adhesion_fin_container .adhesion_fin .adhesion_fin_resultat { + margin-top: 100px; + font-family: montserrat_regular; +} +.adhesion_fin_container .adhesion_fin .adhesion_fin_resultat li:before { + content: "- "; +} .stage_formulaire_cont .stage_formulaire { display: flex; flex-direction: column; - align-items: center; } .stage_formulaire_cont h1 { margin-bottom: 35px; + font-size: 18px; } .stage_formulaire_cont h1 .icone_titre { width: 45px; @@ -1349,14 +1637,26 @@ footer .version { } @media (max-width: 600px) { .stage_formulaire_cont h1 { - font-size: 16px; + font-size: 14px; } } -.stage_formulaire_cont .titre_personne { - margin-top: 50px; +@media (min-width: 1200px) { + .stage_formulaire_cont .titre_personne { + margin-top: 30px; + } +} +@media (min-width: 600px) and (max-width: 1200px) { + .stage_formulaire_cont .titre_personne { + margin-top: 50px; + } +} +@media (max-width: 600px) { + .stage_formulaire_cont .titre_personne { + margin-top: 10px; + } } .stage_formulaire_cont h2 { - margin-bottom: 47px; + margin-bottom: 30px; font-size: 16px; } .stage_formulaire_cont h2 .icone_titre { @@ -1398,6 +1698,18 @@ footer .version { width: 45px; margin-right: 15px; } +.stage_formulaire_cont .icone_bus { + display: flex; + align-items: end; + flex-wrap: wrap; + column-gap: 2px; + row-gap: 20px; + margin-top: 30px; +} +.stage_formulaire_cont .icone_bus .icone { + width: 45px; + margin-right: 15px; +} .stage_formulaire_cont .personne { margin-bottom: 45px; } @@ -1413,18 +1725,33 @@ footer .version { .stage_formulaire_cont .recap_personne { margin-top: 40px; } -.stage_formulaire_cont .recap_personne p, .stage_formulaire_cont .tarifs p { +.stage_formulaire_cont .recap_personne p { margin-left: 27px; margin-bottom: 5px; font-size: 14px; } +.stage_formulaire_cont .tarifs p { + margin-left: 27px; + margin-bottom: 5px; + font-size: 14px; +} +.stage_formulaire_cont .tarifs_ss_margel { + margin-bottom: 20px; +} +.stage_formulaire_cont .tarifs_ss_margel p { + margin-bottom: 5px; + font-size: 14px; +} +.stage_formulaire_cont .tarif_unitaire p { + font-family: sourceserifpro_light; +} .stage_formulaire_cont .buttons { display: flex; + flex-direction: column; flex-wrap: wrap; column-gap: 20px; row-gap: 20px; - justify-content: center; - margin-top: 30px; + align-items: center; } .stage_formulaire_cont .buttons .button_icone_recap { width: 206px !important; @@ -1439,7 +1766,6 @@ footer .version { } .stage_formulaire_cont .description { margin-top: 30px; - margin-bottom: 60px; background-color: #fefefe; padding: 20px; border: 5px solid #E73058; @@ -1447,4 +1773,202 @@ footer .version { font-family: montserrat_light; } +.maj_manuelle { + display: grid; + justify-content: center; + padding-top: 40px; + padding-bottom: 30px; +} +@media (min-width: 600px) { + .maj_manuelle { + margin-left: 30px; + margin-right: 30px; + } +} +@media (max-width: 600px) { + .maj_manuelle { + margin-left: 11px; + margin-right: 10px; + } +} +.maj_manuelle .buttons { + display: flex; + align-items: center; + margin-top: 30px; +} +.maj_manuelle .resultat_list { + display: flex; + flex-direction: column; + align-items: center; + margin-bottom: 20px; + justify-content: center; + margin-top: 38px; +} +.maj_manuelle .resultat_list .resultat { + margin-bottom: 10px; + font-family: montserrat_extralight; +} +.maj_manuelle .resultat_list .resultat .plugras { + font-family: montserrat_regular; +} +.maj_manuelle .resultat_list .resultat .resultat_text { + padding-left: 5px; + font-family: montserrat_regular; +} + +.place_categorie { + background-color: rgba(231, 48, 88, 0.1294117647); + padding-top: 20px; + padding-bottom: 1px; + padding-left: 20px; + border-radius: 10px; + margin-bottom: 29px; +} +@media (min-width: 600px) { + .place_categorie { + margin-left: -20px; + margin-right: -20px; + } +} + +.grid { + display: grid; + justify-content: center; +} + +.alignself_center { + align-self: center; +} + +.maxwidth_600 { + max-width: 600px; +} + +table { + table-layout: auto; + width: max-content; +} +table td { + padding-right: 10px; + padding-bottom: 5px; +} +table .align_right { + text-align: right; +} + +aside { + margin-top: 30px; + margin-bottom: 30px; + display: flex; + flex-direction: column; + align-items: center; +} +aside h1 { + margin-bottom: 10px; +} +aside li { + margin-bottom: 3px; +} + +.form_don { + display: grid; + grid-template-columns: 2fr 1fr 2fr; + grid-template-rows: auto auto auto; + grid-template-areas: ". h2 ." ". formulaire ." ". checkbox checkbox" ". button ."; +} +.form_don h2 { + grid-area: h2; + margin-bottom: 40px; + font-family: cabin_regular; + color: #707070; + font-size: 18px; +} +.form_don .formulaire { + grid-area: formulaire; +} +.form_don .input_checkbox { + grid-area: checkbox; + margin-top: 5px; + margin-left: 5px; + margin-bottom: 35px; +} +.form_don .input_checkbox .gras { + font-family: cabin_semibold; + color: #343434; +} +.form_don button { + grid-area: button; + justify-self: center; +} +.form_don .form_sous_titre { + margin-top: 40px; + margin-bottom: 35px; +} +.form_don .input_box { + margin-bottom: 30px; +} +.form_don .commentaire { + margin-top: 80px; +} +.form_don .currency { + position: absolute; + top: 14px; + right: 25px; + padding-right: 5px; +} + +.ventevideo .page_header { + display: flex; + flex-direction: column; +} +.ventevideo .page_header .illustration { + margin-left: auto; + margin-right: auto; + max-width: 1000px; +} +.ventevideo .page_header .illustration img { + width: 100%; /* Remplit la largeur du conteneur */ + height: auto; /* Ajuste automatiquement la hauteur */ + object-fit: contain; /* Assure que l'image reste visible en entier, sans être rognée */ +} +.ventevideo .page_header .titre { + margin-bottom: 20px !important; +} +.ventevideo .page_header .titre h1 { + font-family: montserrat_semibold !important; +} +.ventevideo .page_header mark { + padding-left: 3px; + padding-right: 3px; +} +.ventevideo .explication_wp { + margin-left: 10vh; + margin-right: 10vh; + display: flex; + justify-content: center; /* Centrer le contenu horizontalement */ + box-sizing: border-box; +} +.ventevideo .explication { + display: grid; /* Utilisation de la grille */ + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); /* Colonnes dynamiques */ + gap: 20px; /* Espacement entre les éléments */ + max-width: 1200px; /* Largeur maximale de la grille */ + width: 100%; /* Prendre toute la largeur disponible */ + justify-content: center; /* Centrer les items dans la grille */ +} +.ventevideo .explication_item { + min-width: 300px; /* Largeur minimale */ + max-width: 400px; /* Largeur maximale */ + background-color: #f8f8f8; /* Couleur de fond (optionnel) */ + padding: 20px; /* Espacement interne */ + border-radius: 5px; /* Coins arrondis */ + box-shadow: 0 3px 3px rgba(0, 0, 0, 0.1); /* Ombre (optionnel) */ + box-sizing: border-box; /* Inclure le padding dans la largeur totale */ +} +.ventevideo .explication_item h2 { + padding-bottom: 5px; + font-family: montserrat_semibold !important; + font-size: 16px !important; +} + /*# sourceMappingURL=app.css.map */ diff --git a/public/css/app.css.map b/public/css/app.css.map index 3cf0c3f..eb8bf9e 100644 --- a/public/css/app.css.map +++ b/public/css/app.css.map @@ -1 +1 @@ -{"version":3,"sourceRoot":"","sources":["../../src/scss/base/_reset.scss","../../src/scss/base/_colors.scss","../../src/scss/base/_fonts.scss","../../src/scss/base/_space.scss","../../src/scss/global/_main.scss","../../src/scss/global/_mediaqueries.scss","../../src/scss/components/_header_tunnel.scss","../../src/scss/components/_header_inscription.scss","../../src/scss/components/_savoirplus.scss","../../src/scss/components/_titrepage.scss","../../src/scss/components/_footer.scss","../../src/scss/components/_inputs.scss","../../src/scss/components/_check_mail.scss","../../src/scss/templates/_adhesion_mail.scss","../../src/scss/templates/_adhesion.scss","../../src/scss/templates/_paiement.scss","../../src/scss/templates/_adhesion_end.scss","../../src/scss/templates/_stageformulaire.scss"],"names":[],"mappings":"AAAA;AAEA;EACC;EACA;;;AAGD;EACI;;;AAKJ;EACC;EACA;;;AAGD;EACC;;;ACnBD;AACA;AACA;AA0BA;EACI;;;AAGJ;EACI;;;ACjCJ;AACA;AAEA;EACI;EAAoC;;AAExC;EACI;EAAkC;;AAEtC;EACI;EAAgC;;AAEpC;EACI;EAA8B;;AAElC;EACI;EAA6B;;AAEjC;EACI;EAA4B;;AAEhC;EACI;EAA4B;;AAEhC;EACI;EAA0B;;AAG9B;EACI;EAA6C;;AAEjD;EACI;EAA+C;;AAEnD;EACI;EAAsC;;AAE1C;EACI;EAA0C;;AAE9C;EACI;EAAmC;;AAEvC;EACI;EAA0C;;AAE9C;EACI;EAAqC;;AAEzC;EACI;EAAoC;;AAExC;EACI;EAAoC;;AAExC;EACI;EAAuC;;AAE3C;EACI;EAAyC;;AAE7C;EACI;EAAyC;;AAG7C;EACI;EAA2C;;AAE/C;EACI;EAA0C;;AAE9C;EACI;EAAuC;;AAE3C;EACI;EAAsC;;AAE1C;EACI;EAAqC;;AAEzC;EACI;EAAoC;;AAIxC;EACI;EAA0C;;AAE9C;EACA;EAAyC;;AAEzC;EACI;EAAiC;;AAErC;EACI;EAAkC;;AAEtC;EACI;EAAgC;;AAEpC;EACI;EAAsD;;AAE1D;EACI;EAA2C;;AAE/C;EACI;EAAmC;;AAEvC;EACI;EAAsC;;AAE1C;EACI;EAAuC;;AAE3C;EACI;EAA+B;;AAEnC;EACI;EAA+B;;AAEnC;EACI;EAAqC;;AAEzC;EACI;EAAqC;;AAEzC;EACI;EAAgC;;AAEpC;EACI;EAAqC;;AAEzC;EACI;EAAiC;;AAErC;EACI;EAAsC;;AAI1C;EACI;EAA2B;;AAG7B;EACE;EAA8B;;AAGhC;EACE;EAA0B;;AAE5B;EACE;EAAiC;;AAGnC;EACE;EAA4B;;AAG9B;EACE;EAA4B;;AAG9B;EACE;EAAqC;;AAGzC;EACI;;;ACzKJ;AACA;AACA;AACA;AACA;AAGA;EACI;;;ACRJ;EACI;EACA;EACA;EACA;;ACGA;EACI;IDDA;;;ACMJ;EACI;IDJA;;;ACGJ;EACI;IDDA;;;;AEbR;EACI;EACA;EACA;;AAEA;EACI;EACA;;AACA;EACI;;;ACTZ;EACI;EACA;EACA;;AAEA;EACI;EACA;;AACA;EACI;;;ACTZ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EAEA;EAIA;EACA;;AHdA;EACI;IGUA;;;AAKJ;EACI;;AACA;EACI;;AAGR;EACI;;AACA;EACI;;AAGR;EACI;;AAEJ;EACI;;AAEJ;EACI,OPlCM;;;AOqCd;EAEI;EAIA;EACA;EACA;;AH9CA;EACI;IGyCA;;;AAMJ;EACI;EACA;;AACA;EACI;;;AAKZ;EACI;EAIA;EACA;EACA;EACA;;AHjEA;EACI;IG2DA;;;;ACzER;EAUI;;AJGA;EACI;IIZA;IACA;;;AJgBJ;EACI;IIdA;IACA;;;AAKJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA,ORXW;;AQYX;EACI;EACA;;;ACzBZ;AACA;AACA;AACA;AACA;AAEA;EACI;EACA;EACA;EAEA;EAEA;;AAGA;EACI;EACA;EACA;EACA;;;ACnBR;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;EACI;;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA,kBVFM;;AUIV;EACI;;AAGJ;EACI;EACA;EACA;EACA;EACA,kBVbM;EUcN;EACA;EAUA;EACA,OVhCW;;AUsBP;EACI;EACA;EACA;;AAEJ;EACI;;AAMZ;EAUI;EACA;EACA;EACA;EACA;EACA,kBV3CM;EU4CN;EACA;;ANhDJ;EACI;IMgCI;;;AN3BR;EACI;IM6BI;;;AN1CR;EACI;IM4CI;;;AAUA;EACI;EACA;EACA;;AAEJ;EACI;;AAIZ;EAWI;EAEA;EACA;EACA;EACA;EACA,kBVzEM;EU0EN;EACA;;AN9EJ;EACI;IM4DI;IACA;;;ANxDR;EACI;IM0DI;;;ANvER;EACI;IMyEI;;;AAWA;EACI;EACA;EACA;;AAEJ;EACI;;;AAOZ;EACI,OV9FW;;AUgGf;EACI;;;AAIJ;EACI,OV/FW;;AUiGf;EACI;;;AAKR;AACA;AAEA;EAEI;;AAEA;EAQI;EACA;EACA;;AN9HJ;EACI;IMsHI;;;AN7HR;EACI;IM+HI;;;AN1HR;EACI;IM+HI;;;AAGJ;EACI;EACA;EACA,OVtIO;;;AU2InB;EAEI;;AAEA;EAQI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EASA,OV1KW;;AIGf;EACI;IMiJI;;;ANxJR;EACI;IM0JI;;;AAUA;EACI;EACA;EACA;;AAEJ;EACI;;ANrKZ;EACI;IMwKI;;;AAGJ;EACI;EACA;EACA,OV/KO;;;AUqLf;EACI;;ANtLJ;EACI;IMuLI;;;AAGR;EACI;EACA;EAIA,OVnMW;;AIEf;EACI;IM8LI;;;AAGJ;EACI,yBVrMO;;AUuMX;EACI;EACA;EACA,OVxMO;;;AU8MnB;AACA;AACA;AACA;AACA;AAKI;EACI;EACA;EAIA,OV9NW;;AICf;EACI;IM0NI;;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACI,kBVxOE;;;AU6Od;AACA;AACA;AACA;AACA;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,kBV5PU;EU6PV,OV3PU;;AU4PV;EACI;EACA;;AAEJ;EACI;EACA;EACA;EACA;;;AAKR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,kBVpRU;EUqRV,OVnRU;EUoRV;;;AAIA;EACI;EACA;;;AC1SR;EACI;EACA;EACA;EACA;EACA;EACA;EASA;;APFA;EACI;IONA;IACA;;;APUJ;EACI;IORA;IACA;;;AAGJ;EACI;EACA,OXJM;;AWMV;EACI;;;AAKR;EACI;EACA;EACA;EACA,qBACA;;AAIA;EACI;;AAGJ;EACI;EACA;EACA;EACA;;AACA;EACI;EACA,OXrCC;;AWwCT;EACI;EACA;;;AAQR;EACI;EACA;EACA;EACA;;AAEI;EACI;;;AAKZ;AACI;AACA;AACA;AAEA;AACA;AACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACA;EAMA;EACA;;AAEA;AACI;AAEA;AACA;AACA;EACA;EACA;EACA;EACA;EACA;EACA;AACA;;AAGJ;EACI;;AACA;EACI;;AAGR;EACI;;AACA;EACI;;AAGR;EACI;;;AAGR;EACI;EACA;EACA;EACA,OXxHU;;;AW2Hd;AAAA;EAEI;EACA,OX9HU;EW+HV;;;AC5IJ;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;ACXA;EACI;EACA;;ATKA;EACI;ISHA;IACA;;;ATOJ;EACI;ISLA;IACA;;;AAGJ;EACI;;AAEJ;EACI;EACA;EACA,ObGa;;AaAjB;EACI;EACA;EACA;EACA;EACA;;AACA;EACI;;;AAKZ;EACI;EACA;EAOA;EACA;EACA;EACA;EACA;;ATlCA;EACI;ISwBA;;;ATnBJ;EACI;ISqBA;;;;AAQR;EACI;EACA;EAIA;EACA;EACA;EAEA;;AT9CA;EACI;ISuCA;;;;AASR;EACQ;EAIA;EACA;EACA;EACA,kBbvDiB;EawDjB;EACA,Ob5DW;;AICf;EACI;ISmDI;;;;AAUZ;EACI;;;AAGJ;EACI;EAKA;EACA,Ob1Ee;;AICf;EACI;ISoEA;IACA;;;;AClFR;EAEI;EACA;EAIA;EAOA;;AVFA;EACI;IURA;;;AVOJ;EACI;IUJA;;;AVSJ;EACI;IUPA;;;AAIJ;EACI;EACA;EACA;EACA;EACA;EAIA;EAOA;EACA,qBACI;;AVtBR;EACI;IUUI;;;AVXR;EACI;IUcI;;;AVTR;EACI;IUWI;;;AVlBR;EACI;IUgCI,qBACI;;;AV5BZ;EACI;IUsCI,qBACI;;;AAWR;EACI;EACA;EACA;EACA;EACA,kBd7DE;Ec8DF,Od5DE;Ec6DF;;AAEJ;EACI;EACA;EACA,OdrEO;;AIAf;EACI;IUsEQ;;;AVjEZ;EACI;IUmEQ;;;AAGR;EACI;;AAGA;EACI;;AVlFZ;EACI;IUmFY;;;AV9EhB;EACI;IUgFY;;;AAGR;EACI;EACA;EAUA,OdxGG;;AIEf;EACI;IU6FY;;;AVxFhB;EACI;IU0FY;;;AVjGhB;EACI;IUmGY;;;AAGJ;EACI,yBd1GD;;Ac4GH;EACI;EACA;EACA,Od7GD;;AckHX;EACI;EACA;EACA;;AAEJ;EACI;EACA;EACA,Od1HO;;Ac4HX;EACI;;AAEJ;EACI;EACA;;AAEJ;EACI;;AAEJ;EACI;EACA;;AAEJ;EACI;;AAEJ;EACI;;AAEJ;EACI;;AAEJ;EACI;;AAEJ;EACI;;AAEJ;EACI;;AAGJ;EACI;EACA;EACA;EACA;EACA;;AAEI;EACI;;AAKZ;EACI;EACA;EACA;EACA;EACA;;AV/KR;EACI;IUgLQ;;;AV3KZ;EACI;IU6KQ;;;AAIR;EACI,OdxLE;;Ac0LN;EACI;EACA;EACA;EACA;EACA;EACA,OdhME;;AcmMN;EACI;EACA;EACA;;AACA;EACI;EACA;;AAGR;EACI;EACA;EACA;;AACA;EACI;;AAGR;EACI;EACA,OdvNO;;;AebnB;EAEI;EACA;EACA;EAOA;;AXEA;EACI;IWRA;;;AXaJ;EACI;IWXA;;;AAIJ;EACI;EAEA;EACA;EACA;EACA,qBACA;;AAKA;EACI;EACA;;AACA;EACI;;AAEJ;EACI;EACA;;AAEJ;EACI;EACA;;AACgB;EACZ;;AAIR;EACI;EACA;;AAIR;EACI;EACA;EACA;;AACA;EACI;EACA;EACA;;AAIR;EACI;EACA;EACA;EAIA;EAIA;EACA,qBACI;EAYJ;EAIA;EAIA,kBf9Ea;Ee+Eb;;AXjFR;EACI;IWmDQ;;;AXpDZ;EACI;IWuDQ;;;AXxDZ;EACI;IWgEQ,qBACA;;;AXlEZ;EACI;IWyEQ;;;AX1EZ;EACI;IW6EQ;;;AAKJ;EACI;;AACA;EACI;;AAGR;EACI;EACA;EAIA;;AX/FZ;EACI;IW4FY;;;AAGJ;EACI;EACA;EACA;;AAEJ;EACI;EACA;EACA;;AAGR;EACI;EACA;EACA;;AACA;EACI;EACA;EACA,OfjHN;;AeoHF;EACI;EACA;;AAGQ;EACI;;AAKhB;EACI;EACA;EACA;;;AC3IZ;EACI;EACA;EACA;;AAGJ;EACI;;AACA;EACI;EACA;EACA;;AZHR;EACI;IYKI;;;AAGR;EACI;;AAEJ;EACI;EACA;;AACA;EACI;EACA;EACA;;AAEJ;EACI;EACA;;AAEJ;EACI;;AACA;EAFJ;IAGQ;IACA;IACA;;;AAKR;EACI;EACA;;AAEJ;EACI;EACA;EACA,OhB1CO;;AgB8Cf;EACI;EACA;EACA;EACA;EACA;;AACA;EACI;EACA;;AAIR;EACI;;AAGJ;EAEI;;AACA;EACI;;AAIR;EACI;;AAGJ;EACI;;AAIA;EACI;EACA;EACA;;AAKR;EACI;EACA;EACA;EACA;EACA;EACA;;AACA;EACI;;AAIR;EACI;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA","file":"app.css"} \ No newline at end of file +{"version":3,"sourceRoot":"","sources":["../../src/scss/base/_reset.scss","../../src/scss/base/_fontawesome.scss","../../src/scss/base/_colors.scss","../../src/scss/base/_fonts.scss","../../src/scss/base/_space.scss","../../src/scss/base/_grille.scss","../../src/scss/global/_main.scss","../../src/scss/global/_mediaqueries.scss","../../src/scss/components/_header_tunnel.scss","../../src/scss/components/_header_inscription.scss","../../src/scss/components/_savoirplus.scss","../../src/scss/components/_titres.scss","../../src/scss/components/_footer.scss","../../src/scss/components/_inputs.scss","../../src/scss/components/_check_mail.scss","../../src/scss/components/_fin_inscription.scss","../../src/scss/components/_weasyprint.scss","../../src/scss/templates/_adhesion_mail.scss","../../src/scss/templates/_adhesion.scss","../../src/scss/templates/_paiement.scss","../../src/scss/templates/_adhesion_end.scss","../../src/scss/templates/_stageformulaire.scss","../../src/scss/templates/_maj_manuelle.scss","../../src/scss/templates/_concert_annuel.scss","../../src/scss/templates/_admin.scss","../../src/scss/templates/_don_form.scss","../../src/scss/templates/_ventevideo.scss"],"names":[],"mappings":";AAAA;ACAQ;ADER;EACC;EACA;;;AAGD;EACI;;;AAKJ;EACC;EACA;;;AAGD;EACC;;;AEnBD;AACA;AACA;AA8BA;EACI;;;AAEJ;EACI;;;AAEJ;EACI;;;AAEJ;EACI;;;AAEJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI,kBAtCqB;;;AAyCzB;EACI;;;AAGJ;EACI;;;AC7DJ;AACA;AAEA;EACI;EAAoC;;AAExC;EACI;EAAkC;;AAEtC;EACI;EAAgC;;AAEpC;EACI;EAA8B;;AAElC;EACI;EAA6B;;AAEjC;EACI;EAA4B;;AAEhC;EACI;EAA4B;;AAEhC;EACI;EAA0B;;AAG9B;EACI;EAA6C;;AAEjD;EACI;EAA+C;;AAEnD;EACI;EAAsC;;AAE1C;EACI;EAA0C;;AAE9C;EACI;EAAmC;;AAEvC;EACI;EAA0C;;AAE9C;EACI;EAAqC;;AAEzC;EACI;EAAoC;;AAExC;EACI;EAAoC;;AAExC;EACI;EAAuC;;AAE3C;EACI;EAAyC;;AAE7C;EACI;EAAyC;;AAG7C;EACI;EAA2C;;AAE/C;EACI;EAA0C;;AAE9C;EACI;EAAuC;;AAE3C;EACI;EAAsC;;AAE1C;EACI;EAAqC;;AAEzC;EACI;EAAoC;;AAIxC;EACI;EAA0C;;AAE9C;EACA;EAAyC;;AAEzC;EACI;EAAiC;;AAErC;EACI;EAAkC;;AAEtC;EACI;EAAgC;;AAEpC;EACI;EAAoC;;AAExC;EACI;EAA2C;;AAE/C;EACI;EAAmC;;AAEvC;EACI;EAAsC;;AAE1C;EACI;EAAuC;;AAE3C;EACI;EAA+B;;AAEnC;EACI;EAA+B;;AAEnC;EACI;EAAqC;;AAEzC;EACI;EAAqC;;AAEzC;EACI;EAAgC;;AAEpC;EACI;EAAqC;;AAEzC;EACI;EAAiC;;AAErC;EACI;EAAsC;;AAI1C;EACI;EAA2B;;AAG/B;EACI;EAA8B;;AAGlC;EACI;EAA0B;;AAE9B;EACI;EAAiC;;AAGrC;EACI;EAA4B;;AAGhC;EACI;EAA4B;;AAGhC;EACI;EAAqC;;AAGzC;EACI;;;AAEJ;EACI;;;AAGJ;EACI;;;AAEJ;EACI;;;AAEJ;EACI;;;AAEJ;EACI;;;ACzLJ;AACA;AACA;AACA;AACA;AAEA;EACI;;;AAEJ;EACI;;;AAEJ;EACI;;;AAEJ;EACI;;;AAEJ;EACI;;;AAEJ;EACI;;;AAGJ;EACI;;;AAEJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;ACjDJ;EACI;;;ACDJ;EACI;EACA;EACA;EACA;;ACIA;EACI;IDFA;;;ACQJ;EACI;IDNA;;;ACKJ;EACI;IDHA;;;;AEbR;EACI;EACA;EACA;;AAEA;EACI;EACA;;AACA;EACI;;;ACTZ;EACI;EACA;EACA;;AAEA;EACI;EACA;;AACA;EACI;;;ACTZ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EAEA;EAIA;EACA;;AHZA;EACI;IGQA;;;AAKJ;EACI;;AACA;EACI;;AAGR;EACI;;AACA;EACI;;AAGR;EACI;;AAEJ;EACI;;AAEJ;EACI,ORlCM;;;AQqCd;EAEI;EAIA;EACA;EACA;;AH5CA;EACI;IGuCA;;;AAMJ;EACI;EACA;;AACA;EACI;;;AAKZ;EAEI;EAIA;EACA;EACA;;AH/DA;EACI;IG0DA;;;AAMJ;EACI;EACA;;AACA;EACI;;;AAKZ;EACI;EAIA;EACA;EACA;EACA;;AHlFA;EACI;IG4EA;;;AAMJ;EACI;;;ACnGR;EAUI;;AJKA;EACI;IIdA;IACA;;;AJoBJ;EACI;IIlBA;IACA;;;AAKJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA,OTXW;;ASYX;EACI;EACA;;;AAKZ;EACI;EACA;EACA;EACA;EAEA;;AAEA;EACI;EACA;;AAEJ;EACI;;;AAIR;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA,OT5CU;;AS8CN;EACI;;;AC7DZ;AACA;AACA;AACA;AACA;AAEA;EACI;EACA;EACA;EAEA;EAEA;;AAGA;EACI;EACA;EACA;EACA;;;ACnBR;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;EACI;;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA,kBXFM;;AWIV;EACI;;AAGJ;EAGI;EACA;EACA,kBXbM;EWcN;EACA;EAUA;EACA,OXhCW;;AWsBP;EACI;EACA;EACA;;AAEJ;EACI;;AAMZ;EAUI;EACA;EACA;EACA;EACA;EACA,kBX3CM;EW4CN;EACA;;AN9CJ;EACI;IM8BI;;;ANvBR;EACI;IMyBI;;;ANzCR;EACI;IM2CI;;;AAUA;EACI;EACA;EACA;;AAEJ;EACI;;AAIZ;EAWI;EAEA;EACA;EACA;EACA;EACA,kBXzEM;EW0EN;EACA;;AN5EJ;EACI;IM0DI;IACA;;;ANpDR;EACI;IMsDI;;;ANtER;EACI;IMwEI;;;AAWA;EACI;EACA;EACA;;AAEJ;EACI;;;AAOZ;EACI,OX9FW;;AWgGf;EACI;;;AAIJ;EACI,OX/FW;;AWiGf;EACI;;;AAIJ;EACI,OX5GM;;AW8GV;EACI;;;AAKJ;EACI,OXzGM;;AW2GV;EACI;;;AAKR;AACA;AAEA;EAEI;;AAEA;EAQI;EACA;EACA;;AN7IJ;EACI;IMqII;;;AN7IR;EACI;IM+II;;;ANzIR;EACI;IM8II;;;AAGJ;EACI;EACA;EACA,OXvJO;;;AW4JnB;EAEI;;AAEA;EAQI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EASA,OX3LW;;AKKf;EACI;IMgKI;;;ANxKR;EACI;IM0KI;;;AAUA;EACI;EACA;EACA;;AAEJ;EACI;;ANpLZ;EACI;IMuLI;;;AAGJ;EACI;EACA;EACA,OXhMO;;;AWsMf;EACI;;ANrMJ;EACI;IMsMI;;;AAGR;EAEI;EACA;EAIA,OXrNW;;AKIf;EACI;IM8MI;;;AAGJ;EACI,yBXvNO;;AWyNX;EACI;EACA;EACA,OX1NO;;;AW+NnB;EACI;;;AAEJ;EACI;;;AAGJ;AACA;AACA;AACA;AACA;AAMI;EACI;EACA;EAIA,OXvPW;;AKGf;EACI;IMiPI;;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACI,kBXjQE;;;AWyQV;EAEI;;AACA;EACI;;;AAQR;EAEI;;AACA;EACI;;;AAOZ;AACA;AACA;AACA;AACA;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,kBX/SU;EWgTV,OX9SU;;AW+SV;EACI;EACA;;AAEJ;EACI;EACA;EACA;EACA;;;AAKR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,kBXvUU;EWwUV,OXtUU;EWuUV;;;AAIA;EACI;EACA;;;AAMR;EACI;EACA;;;ACrWJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA,OZOU;EYEV;;APDA;EACI;IOPA;IACA;;;APaJ;EACI;IOXA;IACA;;;AAGJ;EACI;EACA,OZLM;;AYOV;EACI;;;AAKR;EACI;EACA;EACA;EACA,qBACA;;AAKA;EACI;;AAGJ;EACI;EACA;EACA;EACA;;AACA;EACI;EACA,OZvCC;;AY0CT;EACI;EACA;;AAEJ;EACI;EACA;;;AAQR;EACI;EACA;EACA;EACA;;AAEI;EACI;;;AAKZ;AACI;AACA;AACA;AAEA;AACA;AACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACA;EAMA;EACA;;AAEA;AACI;AAEA;AACA;AACA;EACA;EACA;EACA;EACA;EACA;EACA;AACA;;AAGJ;EACI;;AACA;EACI;;AAGR;EACI;;AACA;EACI;;AAGR;EACI;;;AAGR;EACI;EACA;EACA;EACA,OZ9HU;;;AYiId;AAAA;EAEI;EACA,OZpIU;EYqIV;;;ACnJJ;EACI;EACA;;;ACFJ;EACI;EACA;;AAGJ;EAEI;EACA;EACA;;AAEA;EACI;EACA;EACA;;AAGJ;EAEI;EACA;;AAGA;EACI;EACA;;AACA;EACI;;AACA;EAEI;EACA;;AAGJ;EAEI;EACA;;AAMZ;EAEI;;AACA;EACI,OdjCF;EckCE;EACA;EACA;;AAEJ;EACI;;AACA;EACI,Od3CD;;;AeXnB;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AAEA;EACI;EACA;EACA;;;AChBJ;EACI;EACA;;AXMA;EACI;IWJA;IACA;;;AXSJ;EACI;IWPA;IACA;;;AAGJ;EACI;;AAEJ;EACI;EACA;EACA,OhBGa;;AgBAjB;EACI;EACA,OhBFa;;AgBKjB;EACI;EACA;EACA;EACA;EACA;;AACA;EACI;;AAIR;EACI;EACA;;;AAIR;EACI;EACA;EAOA;EACA;EACA;EACA;EACA;;AX1CA;EACI;IWgCA;;;AXzBJ;EACI;IW2BA;;;;AAQR;EACI;EACA;EAIA;EACA;EACA;EAEA;;AXtDA;EACI;IW+CA;;;;AAQR;EACI;EACA;EAIA;EACA;EAEA;;AXjEA;EACI;IW2DA;;;;AAQR;EACQ;EAIA;EACA;EACA;EACA,kBhB5EiB;EgB6EjB;EACA,OhBjFW;;AKGf;EACI;IWsEI;;;;AAUZ;EACI;;;AAGJ;EACI;EAKA;EACA,OhB/Fe;;AKGf;EACI;IWuFA;IACA;;;;ACvGR;EAEI;EACA;EAIA;EAOA;;AZAA;EACI;IYVA;;;AZSJ;EACI;IYNA;;;AZaJ;EACI;IYXA;;;AAIJ;EACI;EACA;EACA;EACA;EACA;EAIA;EAOA;EACA,qBACI;;AZpBR;EACI;IYQI;;;AZTR;EACI;IYYI;;;AZLR;EACI;IYOI;;;AZhBR;EACI;IY8BI,qBACI;;;AZxBZ;EACI;IYkCI,qBACI;;;AAWR;EACI;EACA;EACA;EACA;EACA,kBjB7DE;EiB8DF,OjB5DE;EiB6DF;;AAEJ;EACI;EACA;EACA,OjBrEO;;AKEf;EACI;IYoEQ;;;AZ7DZ;EACI;IY+DQ;;;AAGR;EACI;;AAGA;EACI;;AZhFZ;EACI;IYiFY;;;AZ1EhB;EACI;IY4EY;;;AAGR;EACI;EACA;EAUA,OjBxGG;;AKIf;EACI;IY2FY;;;AZpFhB;EACI;IYsFY;;;AZ/FhB;EACI;IYiGY;;;AAGJ;EACI,yBjB1GD;;AiB4GH;EACI;EACA;EACA,OjB7GD;;AiBkHX;EACI;EACA;EACA;;AAEJ;EACI;EACA;EACA,OjB1HO;;AiB4HX;EACI;;AAEJ;EACI;EACA;;AAEJ;EACI;;AAEJ;EACI;EACA;;AAEJ;EACI;;AAEJ;EACI;;AAEJ;EACI;;AAEJ;EACI;;AAEJ;EACI;;AAEJ;EACI;;AAGJ;EACI;EACA;EACA;EACA;EACA;;AAEI;EACI;;AAKZ;EACI;EACA;EACA;EACA;EACA;;AZ7KR;EACI;IY8KQ;;;AZvKZ;EACI;IYyKQ;;;AAIR;EACI,OjBxLE;;AiB0LN;EACI;EACA;EACA;EACA;EACA;EACA,OjBhME;;AiBmMN;EACI;EACA;EACA;;AACA;EACI;EACA;;AAGR;EACI;EACA;EACA;;AACA;EACI;;AAGR;EACI;EACA,OjBvNO;;;AkBbnB;EAEI;EACA;EACA;EAOA;;AbIA;EACI;IaVA;;;AbiBJ;EACI;IafA;;;AAIJ;EACI;EAEA;EACA;EACA;EACA,qBACA;;AAKA;EACI;EACA;;AACA;EACI;;AAEJ;EACI;EACA;;AAEJ;EACI;EACA;;AACgB;EACZ;;AAIR;EACI;EACA;;AAIR;EACI;EACA;EACA;;AACA;EACI;EACA;EACA;;AAIR;EACI;EACA;EACA;EAIA;EAIA;EACA,qBACI;EAYJ;EAIA;EAIA,kBlB9Ea;EkB+Eb;;Ab/ER;EACI;IaiDQ;;;AblDZ;EACI;IaqDQ;;;AbtDZ;EACI;Ia8DQ,qBACA;;;AbhEZ;EACI;IauEQ;;;AbxEZ;EACI;Ia2EQ;;;AAKJ;EACI;;AACA;EACI;;AAGR;EACI;EACA;EAIA;;Ab7FZ;EACI;Ia0FY;;;AAGJ;EACI;EACA;EACA;;AAEJ;EACI;EACA;EACA;;AAGR;EACI;EACA;EACA;;AACA;EACI;EACA;EACA,OlBjHN;;AkBoHF;EACI;EACA;;AAGQ;EACI;;AAKhB;EACI;EACA;EACA;;AAIR;EACI;EACA;;AAEI;EACI;;;ACtJhB;EACI;EACA;;AAGJ;EACI;EAMA;;AALA;EACI;EACA;EACA;;AdER;EACI;IcCI;;;AdTR;EACI;IccI;;;AdAR;EACI;IcGI;;;AdZR;EACI;IceI;;;AAGR;EACI;EACA;;AACA;EACI;EACA;EACA;;AAEJ;EACI;EACA;;AAEJ;EACI;;AACA;EAFJ;IAGQ;IACA;IACA;;;AAKR;EACI;EACA;;AAEJ;EACI;EACA;EACA,OnBnDO;;AmBuDf;EACI;EACA;EACA;EACA;EACA;;AACA;EACI;EACA;;AAGR;EACI;EACA;EACA;EACA;EACA;EAKA;;AAJA;EACI;EACA;;AAKR;EACI;;AAGJ;EACI;;AACA;EACI;;AAIR;EACI;;AAGJ;EACI;;AACA;EACI;EACA;EACA;;AAKJ;EACI;EACA;EACA;;AAGR;EACI;;AACA;EACI;EACA;;AAIJ;EACI;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAIR;EACI;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;EAEA;EACA;EACA;EACA;EACA;;;AC/JR;EACI;EACA;EAIA;EACA;;AfLA;EACI;IeOA;IACA;;;AfFJ;EACI;IeIA;IACA;;;AAEJ;EACI;EACA;EACA;;AAIJ;EACI;EACA;EACA;EACA;EACA;EAEA;;AAEA;EACI;EACA;;AACA;EACI;;AAEJ;EACI;EACA;;;AC1ChB;EACI;EACA;EACA;EACA;EACA;EACA;;AhBHA;EACI;IgBKA;IACA;;;;AAKR;EACI;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;;AACA;EACI;EACA;;AAEJ;EACI;;;ACzCR;EACI;EACA;EACA;EACA;EACA;;AACA;EACI;;AAEJ;EACI;;;ACVR;EACI;EACA;EACA;EACA,qBACA;;AAKA;EACI;EAEA;EAEA;EACA,OvBJW;EuBKX;;AAEJ;EACI;;AAEJ;EACI;EACA;EACA;EACA;;AACA;EACI;EACA,OvBpBC;;AuBuBT;EACI;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;EACA;EACA;EACA;;;ACrDJ;EACI;EACA;;AACA;EACI;EACA;EACA;;AACA;EACI;EACA;EACA;;AAGR;EACI;;AACA;EACI;;AAIR;EACI;EACA;;AAGR;EACI;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;EAMI;EACA;EACA;EACA;EACA;EACA;EACA;;AAXA;EACI;EACA;EACA","file":"app.css"} \ No newline at end of file diff --git a/public/images/icones/encadrant.webp b/public/images/icones/encadrant.webp new file mode 100644 index 0000000..f548225 Binary files /dev/null and b/public/images/icones/encadrant.webp differ diff --git a/public/images/icones/favicon.ico b/public/images/icones/favicon.ico new file mode 100644 index 0000000..5a1fa07 Binary files /dev/null and b/public/images/icones/favicon.ico differ diff --git a/public/images/icones/icone_bus.png b/public/images/icones/icone_bus.png new file mode 100644 index 0000000..dcdc601 Binary files /dev/null and b/public/images/icones/icone_bus.png differ diff --git a/public/images/icones/musican.webp b/public/images/icones/musican.webp new file mode 100644 index 0000000..b4d9a9d Binary files /dev/null and b/public/images/icones/musican.webp differ diff --git a/public/images/icones/pause.webp b/public/images/icones/pause.webp new file mode 100644 index 0000000..704e82e Binary files /dev/null and b/public/images/icones/pause.webp differ diff --git a/public/images/icones/spectator.webp b/public/images/icones/spectator.webp new file mode 100644 index 0000000..8d5d594 Binary files /dev/null and b/public/images/icones/spectator.webp differ diff --git a/public/images/logos/LogoSuzukiGris.png b/public/images/logos/LogoSuzukiGris.png index 0bf6fc5..800991b 100644 Binary files a/public/images/logos/LogoSuzukiGris.png and b/public/images/logos/LogoSuzukiGris.png differ diff --git a/public/images/rassemblementidf_2023_programme.pdf b/public/images/rassemblementidf_2023_programme.pdf new file mode 100644 index 0000000..5357a65 Binary files /dev/null and b/public/images/rassemblementidf_2023_programme.pdf differ diff --git a/public/images/rassemblementidf_plan_lieu.pdf b/public/images/rassemblementidf_plan_lieu.pdf new file mode 100644 index 0000000..4141f08 Binary files /dev/null and b/public/images/rassemblementidf_plan_lieu.pdf differ diff --git a/public/images/ventevideo/concert_unesco_illustration.jpeg b/public/images/ventevideo/concert_unesco_illustration.jpeg new file mode 100644 index 0000000..2acd227 Binary files /dev/null and b/public/images/ventevideo/concert_unesco_illustration.jpeg differ diff --git a/public/images/ventevideo/concert_unesco_illustration1.jpeg b/public/images/ventevideo/concert_unesco_illustration1.jpeg new file mode 100644 index 0000000..dd51d4d Binary files /dev/null and b/public/images/ventevideo/concert_unesco_illustration1.jpeg differ diff --git a/public/js/adhesion/accueil_modal.js b/public/js/adhesion/accueil_modal.js index 310ba4e..b1bfe15 100644 --- a/public/js/adhesion/accueil_modal.js +++ b/public/js/adhesion/accueil_modal.js @@ -1,6 +1,3 @@ -//// AFFICHER DANS LA CONSOLE LE FICHIER APPELÉ -//console.log("NOUS SOMMES DANS LE FICHIER :",__filename); - // Get the modal var modal = document.getElementById("prelude"); diff --git a/public/js/adhesion/adhesion_prof copie.js b/public/js/adhesion/adhesion_prof copie.js new file mode 100644 index 0000000..1241ba1 --- /dev/null +++ b/public/js/adhesion/adhesion_prof copie.js @@ -0,0 +1,148 @@ +console.log("On est dans le fichier adhesion_prof.js (de PUBLIC)"); + + +function prof_diplome() { + + console.log("On est dans function prof_diplome"); + console.log("check_prof_diplome"); + // Get the checkbox + var check_prof_diplome = document.getElementById("check_prof_diplome"); + // Get the output text + var prof_diplome = document.getElementById("prof_diplome"); + + console.log("check_prof_diplome", check_prof_diplome); + + for (let cssClass of prof_diplome.classList) { + console.log("cssClass: ",cssClass); + }; + + + // If the checkbox is checked, display the output text + if (check_prof_diplome.checked == true){ + console.log("if (check_prof_diplome.checked == true)"); + console.log("prof_diplome", prof_diplome); + prof_diplome.style.display = "block"; + } else { + console.log("ELSE if (check_prof_diplome.checked == true)"); + prof_diplome.style.display = "none"; + } +} + + +function prof_formation() { + + console.log("On est dans function prof_formation"); + + // Get the checkbox + var check_prof_formation = document.getElementById("check_prof_formation"); + // Get the output text + var prof_formation = document.getElementById("prof_formation"); + + console.log("check_prof_formation", check_prof_formation); + + for (let cssClass of prof_formation.classList) { + console.log("cssClass: ",cssClass); + }; + + + // If the checkbox is checked, display the output text + if (check_prof_formation.checked == true){ + console.log("if (check_prof_formation.checked == true)"); + console.log("prof_formation", prof_formation); + + prof_formation.style.display = "block"; + } else { + console.log("ELSE if (check_prof_diplome.checked == true)"); + + prof_formation.style.display = "none"; + } +} + +function prof_eleve() { + + console.log("On est dans function prof_eleve"); + + // Get the checkbox + var check_prof_eleve = document.getElementById("check_prof_eleve"); + // Get the output text + var eleve = document.getElementById("eleve"); + + console.log("check_prof_eleve", check_prof_eleve); + + for (let cssClass of eleve.classList) { + console.log("cssClass: ",cssClass); + }; + + + // If the checkbox is checked, display the output text + if (check_prof_eleve.checked == true){ + console.log("if (check_prof_eleve.checked == true)"); + console.log("eleve", eleve); + + eleve.style.display = "block"; + } else { + console.log("ELSE if (check_prof_eleve.checked == true)"); + + eleve.style.display = "none"; + } +} + +function ajout_eleve2() { + console.log("On est dans function ajout_eleve2"); + // Get the checkbox + var check_eleve2 = document.getElementById("check_eleve2"); + // Get the output text + var eleve2 = document.getElementById("eleve2"); + + // If the checkbox is checked, display the output text + if (check_eleve2.checked == true){ + eleve2.style.display = "block"; + } else { + eleve2.style.display = "none"; + } +} + +function ajout_eleve3() { + console.log("On est dans function ajout_eleve3"); + // Get the checkbox + var check_eleve3 = document.getElementById("check_eleve3"); + // Get the output text + var eleve3 = document.getElementById("eleve3"); + + // If the checkbox is checked, display the output text + if (check_eleve3.checked == true){ + eleve3.style.display = "block"; + } else { + eleve3.style.display = "none"; + } +} + +function ajout_eleve4() { + + // Get the checkbox + var check_eleve4 = document.getElementById("check_eleve4"); + // Get the output text + var eleve4 = document.getElementById("eleve4"); + + // If the checkbox is checked, display the output text + if (check_eleve4.checked == true){ + eleve4.style.display = "block"; + } else { + eleve4.style.display = "none"; + } +} + +function ajout_eleve5() { + + // Get the checkbox + var check_eleve5 = document.getElementById("check_eleve5"); + // Get the output text + var eleve5 = document.getElementById("eleve5"); + + // If the checkbox is checked, display the output text + if (check_eleve5.checked == true){ + eleve5.style.display = "block"; + } else { + eleve5.style.display = "none"; + } +} \ No newline at end of file diff --git a/public/js/adhesion/adhesion_prof.js b/public/js/adhesion/adhesion_prof.js index 1241ba1..b291d32 100644 --- a/public/js/adhesion/adhesion_prof.js +++ b/public/js/adhesion/adhesion_prof.js @@ -1,148 +1,446 @@ +// ADHESION AFPS +// REMPLIR LE FORMULAIRE POUR LES PROF (diplome ou formation) + console.log("On est dans le fichier adhesion_prof.js (de PUBLIC)"); +///////////////////////////////////////// +// VARIABLE -function prof_diplome() { - - console.log("On est dans function prof_diplome"); - console.log("check_prof_diplome"); - // Get the checkbox - var check_prof_diplome = document.getElementById("check_prof_diplome"); - // Get the output text - var prof_diplome = document.getElementById("prof_diplome"); - - console.log("check_prof_diplome", check_prof_diplome); - - for (let cssClass of prof_diplome.classList) { - console.log("cssClass: ",cssClass); - }; +const regionsEcolesProfOptions = ` + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; - // If the checkbox is checked, display the output text - if (check_prof_diplome.checked == true){ - console.log("if (check_prof_diplome.checked == true)"); - console.log("prof_diplome", prof_diplome); - prof_diplome.style.display = "block"; +///////////////////////////////////////// +// SAISIE DES INFORMATIONS POUR UN DIPLOME +///////////////////////////////////////// +// quand le visiteur clique sur "ajouter un diplôme" + +function ajout_prof_diplome(checkboxElem) { + // si box diplome checked on affiche + if (checkboxElem.checked) { + affiche_prof_diplome(); } else { - console.log("ELSE if (check_prof_diplome.checked == true)"); - prof_diplome.style.display = "none"; + // si box diplome unchecked on supprime + remove_prof_diplome(); } } +// AFFICHER LA SAISIE DES INFORMATIONS POUR LE DIPLOME +function affiche_prof_diplome() { + console.log("On est dans function affiche_prof_diplome"); -function prof_formation() { + contenuhtml_diplome = ` +
+
+
+ + +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+
+
+ icone information à cliquer +

SECE = Suzuki Early Childhood Education

+
+

Etes-vous diplômé de SECE ?

+
+

Sélectionner "oui" si vous avez le diplôme SECE.

+

+
+
+
+ + +
+

Renseigner jusqu'à 3 écoles de musique, classes ou lieux dans lesquelles vous enseignez la pédagogie Suzuki

+

Le premier lieu servira de référence pour l'affichage sur la carte de géolocalisation des professeurs du site de l'AFPS. La saisie de la ville et du code postal est importante.

+
+ +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+ + +
+

Vous souhaitez ajouter une autre école

+
+ + + +
+ + `; + + + + // AFFICHER LE FORMULAIRE DE SAISIE DU DIPLOME + document.querySelector('#diplome0').innerHTML = contenuhtml_diplome; + +} + +// LORS DE SAISIE DU DIPLOME AJOUT JUSQU'À 3 ÉCOLES +function ajout_ecole(e) { + console.log("on est dans toto"); + ajout_ecole_content = document.getElementById("ajout_ecole"+ e +"_content"); + ajout_ecole_content.classList.remove('hidden'); +} + +// SUPPRIMER LA SAISIE DES INFORMATIONS POUR LE DIPLOME +function remove_prof_diplome() { + document.querySelector('#diplome1').remove(); +} + +///////////////////////////////////////// +// SAISIE DES INFORMATIONS POUR UN LA FORMATION DE PROF +///////////////////////////////////////// +// quand le visiteur clique sur "obtenir un diplome" + +function ajout_prof_formation(checkboxElem) { + // si box diplome checked on affiche + if (checkboxElem.checked) { + affiche_prof_formation(); + } else { + // si box diplome unchecked on supprime + remove_prof_formation(); + } +} + +// AFFICHER LA SAISIE DES INFORMATIONS POUR LA FORMATION +function affiche_prof_formation() { console.log("On est dans function prof_formation"); - // Get the checkbox - var check_prof_formation = document.getElementById("check_prof_formation"); - // Get the output text - var prof_formation = document.getElementById("prof_formation"); + contenuhtml_formation = ` +
+
+
+ + +
- console.log("check_prof_formation", check_prof_formation); +
+ + +
- for (let cssClass of prof_formation.classList) { - console.log("cssClass: ",cssClass); - }; +
+ + +
+
+ +
+
+ + +
+ +
+ + +
+ +
+ + +
+
+
+ `; - // If the checkbox is checked, display the output text - if (check_prof_formation.checked == true){ - console.log("if (check_prof_formation.checked == true)"); - console.log("prof_formation", prof_formation); - prof_formation.style.display = "block"; - } else { - console.log("ELSE if (check_prof_diplome.checked == true)"); + // AFFICHER LE FORMULAIRE DE SAISIE DU DIPLOME + document.querySelector('#formation0').innerHTML = contenuhtml_formation; - prof_formation.style.display = "none"; - } } -function prof_eleve() { - - console.log("On est dans function prof_eleve"); - - // Get the checkbox - var check_prof_eleve = document.getElementById("check_prof_eleve"); - // Get the output text - var eleve = document.getElementById("eleve"); - - console.log("check_prof_eleve", check_prof_eleve); - - for (let cssClass of eleve.classList) { - console.log("cssClass: ",cssClass); - }; +// QUEL PROF POUR QUEL INSTRUMENT +function select_prof_stagiaire_instrument(e) { + console.log("instrument = " + e); + let instrument_saisie = document.getElementById("adherent_prof_stagiaire_instrument"+ e +"").value; + console.log("instrument_saisie = ", instrument_saisie); + if (instrument_saisie == "Alto"){ + contenuhtml_prof = ` + `; + document.getElementById("adherent_prof_stagiaire_instrument"+ e +"_prof").innerHTML = contenuhtml_prof; + contenuhtml_prof =''; + }; + if (instrument_saisie == "Piano"){ + contenuhtml_prof = ` + + `; + document.getElementById("adherent_prof_stagiaire_instrument"+ e +"_prof").innerHTML = contenuhtml_prof; + contenuhtml_prof =''; + }; + if (instrument_saisie == "Violon"){ + contenuhtml_prof = ` + + + + `; + document.getElementById("adherent_prof_stagiaire_instrument"+ e +"_prof").innerHTML = contenuhtml_prof; + contenuhtml_prof =''; + }; + if (instrument_saisie == "Violoncelle"){ + contenuhtml_prof = ` + + + `; + document.getElementById("adherent_prof_stagiaire_instrument"+ e +"_prof").innerHTML = contenuhtml_prof; + contenuhtml_prof =''; + }; - // If the checkbox is checked, display the output text - if (check_prof_eleve.checked == true){ - console.log("if (check_prof_eleve.checked == true)"); - console.log("eleve", eleve); - eleve.style.display = "block"; - } else { - console.log("ELSE if (check_prof_eleve.checked == true)"); - - eleve.style.display = "none"; - } } -function ajout_eleve2() { - console.log("On est dans function ajout_eleve2"); - // Get the checkbox - var check_eleve2 = document.getElementById("check_eleve2"); - // Get the output text - var eleve2 = document.getElementById("eleve2"); - - // If the checkbox is checked, display the output text - if (check_eleve2.checked == true){ - eleve2.style.display = "block"; - } else { - eleve2.style.display = "none"; - } +// SUPPRIMER LA SAISIE DES INFORMATIONS POUR LA FORMATION +function remove_prof_formation() { + document.querySelector('#formation1').remove(); } - -function ajout_eleve3() { - console.log("On est dans function ajout_eleve3"); - // Get the checkbox - var check_eleve3 = document.getElementById("check_eleve3"); - // Get the output text - var eleve3 = document.getElementById("eleve3"); - - // If the checkbox is checked, display the output text - if (check_eleve3.checked == true){ - eleve3.style.display = "block"; - } else { - eleve3.style.display = "none"; - } -} - -function ajout_eleve4() { - - // Get the checkbox - var check_eleve4 = document.getElementById("check_eleve4"); - // Get the output text - var eleve4 = document.getElementById("eleve4"); - - // If the checkbox is checked, display the output text - if (check_eleve4.checked == true){ - eleve4.style.display = "block"; - } else { - eleve4.style.display = "none"; - } -} - -function ajout_eleve5() { - - // Get the checkbox - var check_eleve5 = document.getElementById("check_eleve5"); - // Get the output text - var eleve5 = document.getElementById("eleve5"); - - // If the checkbox is checked, display the output text - if (check_eleve5.checked == true){ - eleve5.style.display = "block"; - } else { - eleve5.style.display = "none"; - } -} \ No newline at end of file diff --git a/public/js/adhesion/eleve.js b/public/js/adhesion/eleve.js new file mode 100644 index 0000000..558a600 --- /dev/null +++ b/public/js/adhesion/eleve.js @@ -0,0 +1,459 @@ +// ADHESION AFPS +// REMPLIR LE FORMULAIRE POUR LES ÉLÈVES + + +///////////////////////////////////////// +///////////////////////////////////////// +// ÉLÈVE +// 5 MAX +///////////////////////////////////////// +///////////////////////////////////////// + +///////////////////////////////////////// +// VARIABLE +var eleve = "0"; +var instrumentAB; +let contenuhtml_eleve; + +///////////////////////////////////////// +// AU CHARGEMENT DE LA PAGE UNIQUEMENT POUR LES FAMILLES, PAS POUR LES PROFS +// ON AFFICHE LE PREMIER ELEVE +if (window.location.pathname === "/adhesion/adhesion_famille") { + window.onload = ajout_eleve(0); +}; + + +// quand le visiteur clique sur "ajouter un élève" +function ajout_eleve(eleve) { + afficheeleve(eleve); +} + +function ajout_prof_eleve(checkboxElem,eleve) { + // si box diplome checked on affiche + if (checkboxElem.checked) { + + // On vérifie que la prof ou le statgiaire s'inscrit également + if (check_prof_diplome.checked || check_prof_formation.checked) { + afficheeleve(eleve); + + } else { + alert("Vous devez ajouter un diplôme ou une formation pour le professeur avant d'ajouter son enfant"); + } + + } else { + // si box diplome unchecked on supprime + supprimer_eleve_all(); + } +} + +///////////////////////////////////////// +// SAISIE DES INFORMATIONS POUR UN ÉLÈVE +///////////////////////////////////////// +function afficheeleve(eleve) { + eleve++; + + // Le nombre d'élève est atteint + if (eleve > 5 ) { + console.log("5 élèves maximum atteint"); + return; + } + + // on rempli la variable "contenuhtml_eleve" du contenu html à afficher + // Ce if sert pour ne pas répéter plusieurs fois le même numéro de eleve si l'internaute clique plusieurs fois sur le même "ajouter une eleve" + if (!document.querySelector('#eleve'+ eleve +'')) { + + contenuhtml_eleve = `
+

icone informationÉLÈVE `+ eleve +``; + + // Permettre de supprimer les élèves ajoutés + if (eleve > 1) { + contenuhtml_eleve += ` `; + }; + + contenuhtml_eleve += `

+
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + +
+ +
+ + +
+ +
+ + +
+
+ `; + + if (eleve < 5) { + contenuhtml_eleve += ""+ + ``+ + ``+ + `
`+ + ``+ + ``+ + `
` + }; + + contenuhtml_eleve += `
`; + + + eleve--; + + // AFFICHER LE FORMULAIRE DE SAISIE D'UN ELEVE APRÈS LE DERNIER + + document.querySelector('#eleve'+ eleve +'').insertAdjacentHTML("afterend",contenuhtml_eleve); + + eleve++; + return eleve; + + } +} + +function select_prof(eleve,instrumentAB) { + console.log("instrumentAB = " + instrumentAB); + console.log("ID content = " + document.getElementById("eleve_"+ eleve +"_instrument"+ instrumentAB +"")); + let instrument_saisie = document.getElementById("eleve_"+ eleve +"_instrument"+ instrumentAB +"").value; + console.log("instrument_saisie = ", instrument_saisie); + + if (instrument_saisie == "Alto"){ + contenuhtml_prof = ` + + + `; + document.getElementById("eleve_"+ eleve +"_instrument"+ instrumentAB +"_prof").innerHTML = contenuhtml_prof; + contenuhtml_prof =''; + }; + if (instrument_saisie == "Contrebasse"){ + contenuhtml_prof = ` + `; + document.getElementById("eleve_"+ eleve +"_instrument"+ instrumentAB +"_prof").innerHTML = contenuhtml_prof; + contenuhtml_prof =''; + }; + if (instrument_saisie == "Flûte traversière"){ + contenuhtml_prof = ` + + + + + + `; + document.getElementById("eleve_"+ eleve +"_instrument"+ instrumentAB +"_prof").innerHTML = contenuhtml_prof; + contenuhtml_prof =''; + }; + if (instrument_saisie == "Guitare"){ + contenuhtml_prof = ` + + + `; + document.getElementById("eleve_"+ eleve +"_instrument"+ instrumentAB +"_prof").innerHTML = contenuhtml_prof; + contenuhtml_prof =''; + }; + if (instrument_saisie == "Harpe"){ + contenuhtml_prof = ` + + + + + `; + document.getElementById("eleve_"+ eleve +"_instrument"+ instrumentAB +"_prof").innerHTML = contenuhtml_prof; + contenuhtml_prof =''; + }; + if (instrument_saisie == "Orgue"){ + contenuhtml_prof = ` + + `; + document.getElementById("eleve_"+ eleve +"_instrument"+ instrumentAB +"_prof").innerHTML = contenuhtml_prof; + contenuhtml_prof =''; + }; + if (instrument_saisie == "Piano"){ + contenuhtml_prof = ` + + + + + + + + + + + + + + + + `; + document.getElementById("eleve_"+ eleve +"_instrument"+ instrumentAB +"_prof").innerHTML = contenuhtml_prof; + contenuhtml_prof =''; + }; + if (instrument_saisie == "Trompette"){ + contenuhtml_prof = ` + + `; + document.getElementById("eleve_"+ eleve +"_instrument"+ instrumentAB +"_prof").innerHTML = contenuhtml_prof; + contenuhtml_prof =''; + }; + if (instrument_saisie == "Violon"){ + contenuhtml_prof = ` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `; + document.getElementById("eleve_"+ eleve +"_instrument"+ instrumentAB +"_prof").innerHTML = contenuhtml_prof; + contenuhtml_prof =''; + }; + if (instrument_saisie == "Violoncelle"){ + contenuhtml_prof = ` + + + + + + + + + + + + + + + + + + + + + + + + + + + + `; + document.getElementById("eleve_"+ eleve +"_instrument"+ instrumentAB +"_prof").innerHTML = contenuhtml_prof; + contenuhtml_prof =''; + }; + if (instrument_saisie == "SECE"){ + contenuhtml_prof = ` + + `; + document.getElementById("eleve_"+ eleve +"_instrument"+ instrumentAB +"_prof").innerHTML = contenuhtml_prof; + contenuhtml_prof =''; + }; + if (!instrument_saisie){ + contenuhtml_prof = ``; + document.getElementById("eleve_"+ eleve +"_instrument"+ instrumentAB +"_prof").innerHTML = contenuhtml_prof; + contenuhtml_prof =''; + }; + +} + +function supprimer_eleve(eleve) { + document.querySelector('#eleve'+ eleve +'').remove(); +} + +function supprimer_eleve_all() { + if (document.querySelector('#eleve1')) {document.querySelector('#eleve1').remove()}; + if (document.querySelector('#eleve2')) {document.querySelector('#eleve2').remove()}; + if (document.querySelector('#eleve3')) {document.querySelector('#eleve3').remove()}; + if (document.querySelector('#eleve4')) {document.querySelector('#eleve4').remove()}; + if (document.querySelector('#eleve5')) {document.querySelector('#eleve5').remove()}; + if (document.querySelector('#eleve6')) {document.querySelector('#eleve6').remove()}; +} \ No newline at end of file diff --git a/public/js/adhesion/professeurs.js b/public/js/adhesion/professeurs.js index c112e2b..17e8e30 100644 --- a/public/js/adhesion/professeurs.js +++ b/public/js/adhesion/professeurs.js @@ -137,6 +137,13 @@ const select_eleve1_InstrumentA = (select) => { document.getElementById("adherent_eleve1_InstrumentA_prof").innerHTML = adherent_eleve1_InstrumentA_prof; adherent_eleve1_InstrumentA_prof =''; }; + if (select.value == "Orgue"){ + console.log("on est dans le Orgue"); + adherent_eleve1_InstrumentA_prof = ''; + adherent_eleve1_InstrumentA_prof += ''; + document.getElementById("adherent_eleve1_InstrumentA_prof").innerHTML = adherent_eleve1_InstrumentA_prof; + adherent_eleve1_InstrumentA_prof =''; + }; if (select.value == "Piano"){ console.log("on est dans le Piano"); document.getElementById("adherent_eleve1_InstrumentA_prof").innerHTML = ''; @@ -346,6 +353,13 @@ const select_eleve1_InstrumentB = (select) => { document.getElementById("adherent_eleve1_InstrumentB_prof").innerHTML = adherent_eleve1_InstrumentB_prof; adherent_eleve1_InstrumentB_prof =''; }; + if (select.value == "Orgue"){ + console.log("on est dans le Orgue"); + adherent_eleve1_InstrumentB_prof = ''; + adherent_eleve1_InstrumentB_prof += ''; + document.getElementById("adherent_eleve1_InstrumentB_prof").innerHTML = adherent_eleve1_InstrumentB_prof; + adherent_eleve1_InstrumentB_prof =''; + }; if (select.value == "Piano"){ console.log("on est dans le Piano"); document.getElementById("adherent_eleve1_InstrumentB_prof").innerHTML = ''; @@ -555,6 +569,13 @@ const select_eleve2_InstrumentA = (select) => { document.getElementById("adherent_eleve2_InstrumentA_prof").innerHTML = adherent_eleve2_InstrumentA_prof; adherent_eleve2_InstrumentA_prof =''; }; + if (select.value == "Orgue"){ + console.log("on est dans le Orgue"); + adherent_eleve2_InstrumentA_prof = ''; + adherent_eleve2_InstrumentA_prof += ''; + document.getElementById("adherent_eleve2_InstrumentA_prof").innerHTML = adherent_eleve2_InstrumentA_prof; + adherent_eleve2_InstrumentA_prof =''; + }; if (select.value == "Piano"){ console.log("on est dans le Piano"); document.getElementById("adherent_eleve2_InstrumentA_prof").innerHTML = ''; @@ -764,6 +785,13 @@ const select_eleve2_InstrumentB = (select) => { document.getElementById("adherent_eleve2_InstrumentB_prof").innerHTML = adherent_eleve2_InstrumentB_prof; adherent_eleve2_InstrumentB_prof =''; }; + if (select.value == "Orgue"){ + console.log("on est dans le Orgue"); + adherent_eleve2_InstrumentB_prof = ''; + adherent_eleve2_InstrumentB_prof += ''; + document.getElementById("adherent_eleve2_InstrumentB_prof").innerHTML = adherent_eleve2_InstrumentB_prof; + adherent_eleve2_InstrumentB_prof =''; + }; if (select.value == "Piano"){ console.log("on est dans le Piano"); document.getElementById("adherent_eleve2_InstrumentB_prof").innerHTML = ''; @@ -973,6 +1001,13 @@ const select_eleve3_InstrumentA = (select) => { document.getElementById("adherent_eleve3_InstrumentA_prof").innerHTML = adherent_eleve3_InstrumentA_prof; adherent_eleve3_InstrumentA_prof =''; }; + if (select.value == "Orgue"){ + console.log("on est dans le Orgue"); + adherent_eleve3_InstrumentA_prof = ''; + adherent_eleve3_InstrumentA_prof += ''; + document.getElementById("adherent_eleve3_InstrumentA_prof").innerHTML = adherent_eleve3_InstrumentA_prof; + adherent_eleve3_InstrumentA_prof =''; + }; if (select.value == "Piano"){ console.log("on est dans le Piano"); document.getElementById("adherent_eleve3_InstrumentA_prof").innerHTML = ''; @@ -1182,6 +1217,13 @@ const select_eleve3_InstrumentB = (select) => { document.getElementById("adherent_eleve3_InstrumentB_prof").innerHTML = adherent_eleve3_InstrumentB_prof; adherent_eleve3_InstrumentB_prof =''; }; + if (select.value == "Orgue"){ + console.log("on est dans le Orgue"); + adherent_eleve3_InstrumentB_prof = ''; + adherent_eleve3_InstrumentB_prof += ''; + document.getElementById("adherent_eleve3_InstrumentB_prof").innerHTML = adherent_eleve3_InstrumentB_prof; + adherent_eleve3_InstrumentB_prof =''; + }; if (select.value == "Piano"){ console.log("on est dans le Piano"); document.getElementById("adherent_eleve3_InstrumentB_prof").innerHTML = ''; @@ -1391,6 +1433,13 @@ const select_eleve4_InstrumentA = (select) => { document.getElementById("adherent_eleve4_InstrumentA_prof").innerHTML = adherent_eleve4_InstrumentA_prof; adherent_eleve4_InstrumentA_prof =''; }; + if (select.value == "Orgue"){ + console.log("on est dans le Orgue"); + adherent_eleve4_InstrumentA_prof = ''; + adherent_eleve4_InstrumentA_prof += ''; + document.getElementById("adherent_eleve4_InstrumentA_prof").innerHTML = adherent_eleve4_InstrumentA_prof; + adherent_eleve4_InstrumentA_prof =''; + }; if (select.value == "Piano"){ console.log("on est dans le Piano"); document.getElementById("adherent_eleve4_InstrumentA_prof").innerHTML = ''; @@ -1600,6 +1649,13 @@ const select_eleve4_InstrumentB = (select) => { document.getElementById("adherent_eleve4_InstrumentB_prof").innerHTML = adherent_eleve4_InstrumentB_prof; adherent_eleve4_InstrumentB_prof =''; }; + if (select.value == "Orgue"){ + console.log("on est dans le Orgue"); + adherent_eleve4_InstrumentB_prof = ''; + adherent_eleve4_InstrumentB_prof += ''; + document.getElementById("adherent_eleve4_InstrumentB_prof").innerHTML = adherent_eleve4_InstrumentB_prof; + adherent_eleve4_InstrumentB_prof =''; + }; if (select.value == "Piano"){ console.log("on est dans le Piano"); document.getElementById("adherent_eleve4_InstrumentB_prof").innerHTML = ''; @@ -1809,6 +1865,13 @@ const select_eleve5_InstrumentA = (select) => { document.getElementById("adherent_eleve5_InstrumentA_prof").innerHTML = adherent_eleve5_InstrumentA_prof; adherent_eleve5_InstrumentA_prof =''; }; + if (select.value == "Orgue"){ + console.log("on est dans le Orgue"); + adherent_eleve5_InstrumentA_prof = ''; + adherent_eleve5_InstrumentA_prof += ''; + document.getElementById("adherent_eleve5_InstrumentA_prof").innerHTML = adherent_eleve5_InstrumentA_prof; + adherent_eleve5_InstrumentA_prof =''; + }; if (select.value == "Piano"){ console.log("on est dans le Piano"); document.getElementById("adherent_eleve5_InstrumentA_prof").innerHTML = ''; @@ -2018,6 +2081,13 @@ const select_eleve5_InstrumentB = (select) => { document.getElementById("adherent_eleve5_InstrumentB_prof").innerHTML = adherent_eleve5_InstrumentB_prof; adherent_eleve5_InstrumentB_prof =''; }; + if (select.value == "Orgue"){ + console.log("on est dans le Orgue"); + adherent_eleve5_InstrumentB_prof = ''; + adherent_eleve5_InstrumentB_prof += ''; + document.getElementById("adherent_eleve5_InstrumentB_prof").innerHTML = adherent_eleve5_InstrumentB_prof; + adherent_eleve5_InstrumentB_prof =''; + }; if (select.value == "Piano"){ console.log("on est dans le Piano"); document.getElementById("adherent_eleve5_InstrumentB_prof").innerHTML = ''; diff --git a/public/js/app/logger.js b/public/js/app/logger.js index 513c130..c7748d9 100644 --- a/public/js/app/logger.js +++ b/public/js/app/logger.js @@ -24,21 +24,21 @@ const logger = winston.createLogger({ ), defaultMeta: { service: 'user-service' }, transports: [ - new DailyRotateFile({ filename: 'logs/combined.log' }), + new DailyRotateFile({ filename: 'logs/log_global.log' }), ], exceptionHandlers: [ - new DailyRotateFile({ filename: 'logs/combined.log' }), + new DailyRotateFile({ filename: 'logs/log_global.log' }), new winston.transports.Console() ], rejectionHandlers: [ - new DailyRotateFile({ filename: 'logs/combined.log' }), + new DailyRotateFile({ filename: 'logs/log_global.log' }), new winston.transports.Console() ] }); - +//pour afficher également les exceptions dans la console if (process.env.ENV !== 'production' ) { logger.add(new winston.transports.Console( { @@ -47,7 +47,7 @@ if (process.env.ENV !== 'production' ) { timestamp({format: 'YYYY-MM-DD HH:mm:ss'}), myFormatConsole ), - handleExceptions: true //pour afficher également les exceptions dans la console + handleExceptions: true }) ); } diff --git a/public/js/app/logger_adhesion.js b/public/js/app/logger_adhesion.js new file mode 100644 index 0000000..99ce68e --- /dev/null +++ b/public/js/app/logger_adhesion.js @@ -0,0 +1,58 @@ +const winston = require('winston'); + +const { createLogger, format, transports } = require('winston'); +const { combine, timestamp, label, printf, numsession } = format; + +const myFormatFile = printf(({ level, message, label, timestamp, numsession }) => { + return `${timestamp} ${level} [${label}] SID[${numsession}] ${message}`; +}); + +const myFormatConsole = printf(({ level, message, label, timestamp, numsession }) => { + return `${timestamp} ${level} [${label}] SID[${numsession}] ${message}`; +}); + + +const DailyRotateFile = require('winston-daily-rotate-file'); + + +const logger = winston.createLogger({ + //level: 'info', + format: combine( + //label({ label: '' }), + timestamp({format: 'YYYY-MM-DD HH:mm:ss'}), + myFormatFile + ), + defaultMeta: { service: 'user-service' }, + transports: [ + new DailyRotateFile({ filename: 'logs/adhesion/log_adhesion.log' }), + ], + exceptionHandlers: [ + new DailyRotateFile({ filename: 'logs/adhesion/log_adhesion.log' }), + new winston.transports.Console() + ], + rejectionHandlers: [ + new DailyRotateFile({ filename: 'logs/adhesion/log_adhesion.log' }), + new winston.transports.Console() + ] +}); + + + +//pour afficher également les exceptions dans la console +if (process.env.ENV !== 'production' ) { + logger.add(new winston.transports.Console( + { + format: combine( + //label({ label: '' }), + timestamp({format: 'YYYY-MM-DD HH:mm:ss'}), + myFormatConsole + ), + handleExceptions: true + }) + ); +} + +///////////////////////////////////////////////// +// EXPORT DE MODULE POUR QU'IL SOIT LU DANS LES AUTRES FICHIERS JS +///////////////////////////////////////////////// +module.exports = logger; \ No newline at end of file diff --git a/public/js/app/logger_concert.js b/public/js/app/logger_concert.js new file mode 100644 index 0000000..61f5bdb --- /dev/null +++ b/public/js/app/logger_concert.js @@ -0,0 +1,58 @@ +const winston = require('winston'); + +const { createLogger, format, transports } = require('winston'); +const { combine, timestamp, label, printf, numsession } = format; + +const myFormatFile = printf(({ level, message, label, timestamp, numsession }) => { + return `${timestamp} ${level} [${label}] SID[${numsession}] ${message}`; +}); + +const myFormatConsole = printf(({ level, message, label, timestamp, numsession }) => { + return `${timestamp} ${level} [${label}] SID[${numsession}] ${message}`; +}); + + +const DailyRotateFile = require('winston-daily-rotate-file'); + + +const logger = winston.createLogger({ + //level: 'info', + format: combine( + //label({ label: '' }), + timestamp({format: 'YYYY-MM-DD HH:mm:ss'}), + myFormatFile + ), + defaultMeta: { service: 'user-service' }, + transports: [ + new DailyRotateFile({ filename: 'logs/concert/log_concert.log' }), + ], + exceptionHandlers: [ + new DailyRotateFile({ filename: 'logs/concert/log_concert.log' }), + new winston.transports.Console() + ], + rejectionHandlers: [ + new DailyRotateFile({ filename: 'logs/concert/log_concert.log' }), + new winston.transports.Console() + ] +}); + + + + +if (process.env.ENV !== 'production' ) { + logger.add(new winston.transports.Console( + { + format: combine( + //label({ label: '' }), + timestamp({format: 'YYYY-MM-DD HH:mm:ss'}), + myFormatConsole + ), + handleExceptions: true //pour afficher également les exceptions dans la console + }) + ); +} + +///////////////////////////////////////////////// +// EXPORT DE MODULE POUR QU'IL SOIT LU DANS LES AUTRES FICHIERS JS +///////////////////////////////////////////////// +module.exports = logger; \ No newline at end of file diff --git a/public/js/app/logger_lienventetemp.js b/public/js/app/logger_lienventetemp.js new file mode 100644 index 0000000..b017219 --- /dev/null +++ b/public/js/app/logger_lienventetemp.js @@ -0,0 +1,58 @@ +const winston = require('winston'); + +const { createLogger, format, transports } = require('winston'); +const { combine, timestamp, label, printf, numsession } = format; + +const myFormatFile = printf(({ level, message, label, timestamp, numsession }) => { + return `${timestamp} ${level} [${label}] SID[${numsession}] ${message}`; +}); + +const myFormatConsole = printf(({ level, message, label, timestamp, numsession }) => { + return `${timestamp} ${level} [${label}] SID[${numsession}] ${message}`; +}); + + +const DailyRotateFile = require('winston-daily-rotate-file'); + + +const logger = winston.createLogger({ + //level: 'info', + format: combine( + //label({ label: '' }), + timestamp({format: 'YYYY-MM-DD HH:mm:ss'}), + myFormatFile + ), + defaultMeta: { service: 'user-service' }, + transports: [ + new DailyRotateFile({ filename: 'logs/lienventetemp/log_lienventetemp.log' }), + ], + exceptionHandlers: [ + new DailyRotateFile({ filename: 'logs/lienventetemp/log_lienventetemp.log' }), + new winston.transports.Console() + ], + rejectionHandlers: [ + new DailyRotateFile({ filename: 'logs/lienventetemp/log_lienventetemp.log' }), + new winston.transports.Console() + ] +}); + + + +//pour afficher également les exceptions dans la console +if (process.env.ENV !== 'production' ) { + logger.add(new winston.transports.Console( + { + format: combine( + //label({ label: '' }), + timestamp({format: 'YYYY-MM-DD HH:mm:ss'}), + myFormatConsole + ), + handleExceptions: true + }) + ); +} + +///////////////////////////////////////////////// +// EXPORT DE MODULE POUR QU'IL SOIT LU DANS LES AUTRES FICHIERS JS +///////////////////////////////////////////////// +module.exports = logger; \ No newline at end of file diff --git a/public/js/app/logger_rassemblement.js b/public/js/app/logger_rassemblement.js new file mode 100644 index 0000000..ae8da1a --- /dev/null +++ b/public/js/app/logger_rassemblement.js @@ -0,0 +1,58 @@ +const winston = require('winston'); + +const { createLogger, format, transports } = require('winston'); +const { combine, timestamp, label, printf, numsession } = format; + +const myFormatFile = printf(({ level, message, label, timestamp, numsession }) => { + return `${timestamp} ${level} [${label}] SID[${numsession}] ${message}`; +}); + +const myFormatConsole = printf(({ level, message, label, timestamp, numsession }) => { + return `${timestamp} ${level} [${label}] SID[${numsession}] ${message}`; +}); + + +const DailyRotateFile = require('winston-daily-rotate-file'); + + +const logger = winston.createLogger({ + //level: 'info', + format: combine( + //label({ label: '' }), + timestamp({format: 'YYYY-MM-DD HH:mm:ss'}), + myFormatFile + ), + defaultMeta: { service: 'user-service' }, + transports: [ + new DailyRotateFile({ filename: 'logs/rassemblement/log_rassemblement.log' }), + ], + exceptionHandlers: [ + new DailyRotateFile({ filename: 'logs/rassemblement/log_rassemblement.log' }), + new winston.transports.Console() + ], + rejectionHandlers: [ + new DailyRotateFile({ filename: 'logs/rassemblement/log_rassemblement.log' }), + new winston.transports.Console() + ] +}); + + + + +if (process.env.ENV !== 'production' ) { + logger.add(new winston.transports.Console( + { + format: combine( + //label({ label: '' }), + timestamp({format: 'YYYY-MM-DD HH:mm:ss'}), + myFormatConsole + ), + handleExceptions: true //pour afficher également les exceptions dans la console + }) + ); +} + +///////////////////////////////////////////////// +// EXPORT DE MODULE POUR QU'IL SOIT LU DANS LES AUTRES FICHIERS JS +///////////////////////////////////////////////// +module.exports = logger; \ No newline at end of file diff --git a/public/js/app/logger_stagenat.js b/public/js/app/logger_stagenat.js new file mode 100644 index 0000000..a4efe2c --- /dev/null +++ b/public/js/app/logger_stagenat.js @@ -0,0 +1,58 @@ +const winston = require('winston'); + +const { createLogger, format, transports } = require('winston'); +const { combine, timestamp, label, printf, numsession } = format; + +const myFormatFile = printf(({ level, message, label, timestamp, numsession }) => { + return `${timestamp} ${level} [${label}] SID[${numsession}] ${message}`; +}); + +const myFormatConsole = printf(({ level, message, label, timestamp, numsession }) => { + return `${timestamp} ${level} [${label}] SID[${numsession}] ${message}`; +}); + + +const DailyRotateFile = require('winston-daily-rotate-file'); + + +const logger = winston.createLogger({ + //level: 'info', + format: combine( + //label({ label: '' }), + timestamp({format: 'YYYY-MM-DD HH:mm:ss'}), + myFormatFile + ), + defaultMeta: { service: 'user-service' }, + transports: [ + new DailyRotateFile({ filename: 'logs/stagenat/log_stagenat.log' }), + ], + exceptionHandlers: [ + new DailyRotateFile({ filename: 'logs/stagenat/log_stagenat.log' }), + new winston.transports.Console() + ], + rejectionHandlers: [ + new DailyRotateFile({ filename: 'logs/stagenat/log_stagenat.log' }), + new winston.transports.Console() + ] +}); + + + + +if (process.env.ENV !== 'production' ) { + logger.add(new winston.transports.Console( + { + format: combine( + //label({ label: '' }), + timestamp({format: 'YYYY-MM-DD HH:mm:ss'}), + myFormatConsole + ), + handleExceptions: true //pour afficher également les exceptions dans la console + }) + ); +} + +///////////////////////////////////////////////// +// EXPORT DE MODULE POUR QU'IL SOIT LU DANS LES AUTRES FICHIERS JS +///////////////////////////////////////////////// +module.exports = logger; \ No newline at end of file diff --git a/public/js/app/logger_whstripe.js b/public/js/app/logger_whstripe.js new file mode 100644 index 0000000..938da47 --- /dev/null +++ b/public/js/app/logger_whstripe.js @@ -0,0 +1,58 @@ +const winston = require('winston'); + +const { createLogger, format, transports } = require('winston'); +const { combine, timestamp, label, printf, numsession } = format; + +const myFormatFile = printf(({ level, message, label, timestamp, numsession }) => { + return `${timestamp} ${level} [${label}] SID[${numsession}] ${message}`; +}); + +const myFormatConsole = printf(({ level, message, label, timestamp, numsession }) => { + return `${timestamp} ${level} [${label}] SID[${numsession}] ${message}`; +}); + + +const DailyRotateFile = require('winston-daily-rotate-file'); + + +const logger = winston.createLogger({ + //level: 'info', + format: combine( + //label({ label: '' }), + timestamp({format: 'YYYY-MM-DD HH:mm:ss'}), + myFormatFile + ), + defaultMeta: { service: 'user-service' }, + transports: [ + new DailyRotateFile({ filename: 'logs/whstripe/log_whstripe.log' }), + ], + exceptionHandlers: [ + new DailyRotateFile({ filename: 'logs/whstripe/log_whstripe.log' }), + new winston.transports.Console() + ], + rejectionHandlers: [ + new DailyRotateFile({ filename: 'logs/whstripe/log_whstripe.log' }), + new winston.transports.Console() + ] +}); + + + +//pour afficher également les exceptions dans la console +if (process.env.ENV !== 'production' ) { + logger.add(new winston.transports.Console( + { + format: combine( + //label({ label: '' }), + timestamp({format: 'YYYY-MM-DD HH:mm:ss'}), + myFormatConsole + ), + handleExceptions: true + }) + ); +} + +///////////////////////////////////////////////// +// EXPORT DE MODULE POUR QU'IL SOIT LU DANS LES AUTRES FICHIERS JS +///////////////////////////////////////////////// +module.exports = logger; \ No newline at end of file diff --git a/public/js/app/logger_wuzuki.js b/public/js/app/logger_wuzuki.js new file mode 100644 index 0000000..65fb332 --- /dev/null +++ b/public/js/app/logger_wuzuki.js @@ -0,0 +1,56 @@ +const winston = require('winston'); + +const { createLogger, format, transports } = require('winston'); +const { combine, timestamp, label, printf, numsession } = format; + +const myFormatFile = printf(({ level, message, label, timestamp, numsession }) => { + return `${timestamp} ${level} [${label}] SID[${numsession}] ${message}`; +}); + +const myFormatConsole = printf(({ level, message, label, timestamp, numsession }) => { + return `${timestamp} ${level} [${label}] SID[${numsession}] ${message}`; +}); + + +const DailyRotateFile = require('winston-daily-rotate-file'); + + +const logger = winston.createLogger({ + //level: 'info', + format: combine( + //label({ label: '' }), + timestamp({format: 'YYYY-MM-DD HH:mm:ss'}), + myFormatFile + ), + defaultMeta: { service: 'user-service' }, + transports: [ + new DailyRotateFile({ filename: 'logs/wuzuki/log_wuzuki.log' }), + ], + exceptionHandlers: [ + new DailyRotateFile({ filename: 'logs/wuzuki/log_wuzuki.log' }), + new winston.transports.Console() + ], + rejectionHandlers: [ + new DailyRotateFile({ filename: 'logs/wuzuki/log_wuzuki.log' }), + new winston.transports.Console() + ] +}); + +//pour afficher également les exceptions dans la console +if (process.env.ENV !== 'production' ) { + logger.add(new winston.transports.Console( + { + format: combine( + //label({ label: '' }), + timestamp({format: 'YYYY-MM-DD HH:mm:ss'}), + myFormatConsole + ), + handleExceptions: true + }) + ); +} + +///////////////////////////////////////////////// +// EXPORT DE MODULE POUR QU'IL SOIT LU DANS LES AUTRES FICHIERS JS +///////////////////////////////////////////////// +module.exports = logger; \ No newline at end of file diff --git a/public/js/concert/concert_formulaire_famille.js b/public/js/concert/concert_formulaire_famille.js new file mode 100644 index 0000000..e728a38 --- /dev/null +++ b/public/js/concert/concert_formulaire_famille.js @@ -0,0 +1,686 @@ +// CONCERT ANNUEL +// REMPLIR LE FORMULAIRE + + +///////////////////////////////////////// +// AFFICHAGE DU CHAMP DE SAISIE DU NOMBRE DE SPECTATEURS +///////////////////////////////////////// +let saisie_spectateur_nb_place = document.querySelector("#spectateur0"); +let spectateur_nb_restantes = saisie_spectateur_nb_place.dataset.spectateur_nb_restantes; +let quota_total_spectateur = saisie_spectateur_nb_place.dataset.quota_total_spectateur; +let contenuhtml_spectateur; +console.log("spectateur_nb_restantes = ", spectateur_nb_restantes); +console.log("quota_total_spectateur = ", quota_total_spectateur); + +// AFFICHER LE CHAMP DE SAISIE DU NOMBRE DE SPECTATEURS +console.log("saisie_spectateur_nb_place.dataset.spectateur_remisenvente = ",saisie_spectateur_nb_place.dataset.spectateur_remisenvente); +console.log("saisie_spectateur_nb_place.dataset.quota_total_spectateur = ",saisie_spectateur_nb_place.dataset.quota_total_spectateur); +var storedData = localStorage.getItem('userData'); +var userData = JSON.parse(storedData); + +if (saisie_spectateur_nb_place.dataset.spectateur_remisenvente == "oui") { + if (spectateur_nb_restantes >= 12 || quota_total_spectateur >=12){ + contenuhtml_spectateur = `
+
+ + +
+
+ `; + }; + if (spectateur_nb_restantes == 11 || quota_total_spectateur ==11){ + contenuhtml_spectateur = `
+
+ + +
+
+ `; + }; + if (spectateur_nb_restantes == 10 || quota_total_spectateur ==10){ + contenuhtml_spectateur = `
+
+ + +
+
+ `; + }; + if (spectateur_nb_restantes == 9 || quota_total_spectateur ==9){ + contenuhtml_spectateur = `
+
+ + +
+
+ `; + }; + if (spectateur_nb_restantes == 8 || quota_total_spectateur ==8){ + contenuhtml_spectateur = `
+
+ + +
+
+ `; + }; + if (spectateur_nb_restantes == 7 || quota_total_spectateur ==7){ + contenuhtml_spectateur = `
+
+ + +
+
+ `; + }; + if (spectateur_nb_restantes == 6 || quota_total_spectateur ==6){ + contenuhtml_spectateur = `
+
+ + +
+
+ `; + }; + if (spectateur_nb_restantes == 5 || quota_total_spectateur ==5){ + contenuhtml_spectateur = `
+
+ + +
+
+ `; + }; + if (spectateur_nb_restantes == 4 || quota_total_spectateur ==4){ + contenuhtml_spectateur = `
+
+ + +
+
+ `; + }; + if (spectateur_nb_restantes == 3 || quota_total_spectateur ==3){ + contenuhtml_spectateur = `
+
+ + +
+
+ `; + }; + if (spectateur_nb_restantes == 2 || quota_total_spectateur ==2){ + contenuhtml_spectateur = `
+
+ + +
+
+ `; + }; + if (spectateur_nb_restantes == 1 || quota_total_spectateur ==1){ + contenuhtml_spectateur = `
+
+ + +
+
+ `; + }; + if (spectateur_nb_restantes < 1){ + contenuhtml_spectateur = `
+

Il n'y a plus de place spectateur pour le concert. Revenez à partir du 5 avril, nous remettrons les places qui se seraient libérées.

+
+ `; + }; +} else { + contenuhtml_spectateur = `
+

La vente des places spectateurs est terminée.

+
+ `; +} + +document.querySelector('#spectateur0').insertAdjacentHTML("afterend",contenuhtml_spectateur); + +///////////////////////////////////////// +///////////////////////////////////////// +// CONCERTISTE +// 4 MAX +///////////////////////////////////////// +///////////////////////////////////////// +var eleve = "0"; +let contenuhtml_eleve; +console.log("eleve A : ",eleve); + +// quand le visiteur clique sur "ajouter un élève" +function ajout_eleve(eleve) { + console.log("eleve B : ",eleve); + afficheeleve(eleve); +} + +///////////////////////////////////////// +// SAISIE DES INFORMATIONS POUR UN CONCERTISTE +///////////////////////////////////////// +function afficheeleve(eleve) { + eleve++; + console.log("eleve C : ",eleve); + + + if (eleve > 4 ) { + console.log("4 élèves maximum"); + return; + } + + // Ce if sert pour ne pas répéter plusieurs fois le même numéro de eleve si l'internaute clique plusieurs fois sur le même "ajouter une eleve" + if (!document.querySelector('#eleve'+ eleve +'')) { + + contenuhtml_eleve = `
+ +

icone informationÉLÈVE `+ eleve +``; + + // Permettre de supprimer les élèves ajoutés + if (eleve > 0) { + contenuhtml_eleve += ` `; + }; + + contenuhtml_eleve += `

+ +
+
+ + +
+
+ +
+
+ + +
+ +
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + +
+ +
+ + +
+
+ `; + + + + if (eleve < 4) { + contenuhtml_eleve += ""+ + ``+ + ``+ + `
`+ + ``+ + ``+ + `
` + }; + + contenuhtml_eleve += `
`; + + + eleve--; + console.log("eleve D : ",eleve); + + // AFFICHER LE FORMULAIRE DE SAISIE D'UN CONCERTISTE APRÈS LE DERNIER + + document.querySelector('#eleve'+ eleve +'').insertAdjacentHTML("afterend",contenuhtml_eleve); + + + + eleve++; + console.log("eleve à la fin de la fonction : ",eleve); + + return eleve; + } +} + +function select_instrument(eleve) { + console.log(document.getElementById("eleve_"+ eleve +"_instrument")); + let instrument_saisie = document.getElementById("eleve_"+ eleve +"_instrument").value; + console.log("instrument_saisie = ", instrument_saisie); + + if (instrument_saisie == "Piano" || instrument_saisie == "Alto" || instrument_saisie == "Flute" || instrument_saisie == "Trompette" || instrument_saisie == "Harpe"){ + contenuhtml_eleve = ` + + + + + + + + + + `; + document.getElementById("eleve_"+ eleve +"_cahier").innerHTML = contenuhtml_eleve; + contenuhtml_eleve =''; + } + if (instrument_saisie == "Violon") { + if (document.querySelector("#eleve0").dataset.violon1_nb_restantes > 0 && document.querySelector("#eleve0").dataset.violon2_nb_restantes > 0) { + contenuhtml_eleve = ` + + + + + + + + + + `; + document.getElementById("eleve_"+ eleve +"_cahier").innerHTML = contenuhtml_eleve; + contenuhtml_eleve =''; + } + if (document.querySelector("#eleve0").dataset.violon1_nb_restantes > 0 && document.querySelector("#eleve0").dataset.violon2_nb_restantes < 1) { + contenuhtml_eleve = ` + + + + + `; + document.getElementById("eleve_"+ eleve +"_cahier").innerHTML = contenuhtml_eleve; + contenuhtml_eleve =''; + } + if (document.querySelector("#eleve0").dataset.violon1_nb_restantes < 1 && document.querySelector("#eleve0").dataset.violon2_nb_restantes > 0) { + contenuhtml_eleve = ` + + + + + `; + document.getElementById("eleve_"+ eleve +"_cahier").innerHTML = contenuhtml_eleve; + contenuhtml_eleve =''; + } + if (document.querySelector("#eleve0").dataset.violon1_nb_restantes < 1 && document.querySelector("#eleve0").dataset.violon2_nb_restantes < 1) { + contenuhtml_eleve = ``; + document.getElementById("eleve_"+ eleve +"_cahier").innerHTML = contenuhtml_eleve; + contenuhtml_eleve =''; + } + + } + + if (instrument_saisie == "Violoncelle") { + if (document.querySelector("#eleve0").dataset.violoncelle1_nb_restantes > 0 && document.querySelector("#eleve0").dataset.violoncelle2_nb_restantes > 0) { + contenuhtml_eleve = ` + + + + + + + + + + `; + document.getElementById("eleve_"+ eleve +"_cahier").innerHTML = contenuhtml_eleve; + contenuhtml_eleve =''; + } + if (document.querySelector("#eleve0").dataset.violoncelle1_nb_restantes > 0 && document.querySelector("#eleve0").dataset.violoncelle2_nb_restantes < 1) { + contenuhtml_eleve = ` + + + + `; + document.getElementById("eleve_"+ eleve +"_cahier").innerHTML = contenuhtml_eleve; + contenuhtml_eleve =''; + } + if (document.querySelector("#eleve0").dataset.violoncelle1_nb_restantes < 1 && document.querySelector("#eleve0").dataset.violoncelle2_nb_restantes > 0) { + contenuhtml_eleve = ` + + + + + + `; + document.getElementById("eleve_"+ eleve +"_cahier").innerHTML = contenuhtml_eleve; + contenuhtml_eleve =''; + } + if (document.querySelector("#eleve0").dataset.violoncelle1_nb_restantes < 1 && document.querySelector("#eleve0").dataset.violoncelle2_nb_restantes < 1) { + contenuhtml_eleve = ``; + document.getElementById("eleve_"+ eleve +"_cahier").innerHTML = contenuhtml_eleve; + contenuhtml_eleve =''; + } + + } +} + +function supprimer_eleve(eleve) { + document.querySelector('#eleve'+ eleve +'').remove(); +} + + +///////////////////////////////////////// +///////////////////////////////////////// +// ENCADRANT +///////////////////////////////////////// +///////////////////////////////////////// +var encadrant = "0"; +let saisie_encadr_parent_nb_place = document.querySelector("#encadrant0"); +//var encadr_parent_nb_place_restantes = 0; +var encadr_parent_nb_place_restantes; +console.log("dataset encadr_parent_nb_place_restantes = ",encadr_parent_nb_place_restantes) +let contenuhtml_encadrant; +console.log("encadrant A : ",encadrant); + +// quand le visiteur clique sur "ajouter un encadrant" +function ajout_encadrant(encadrant,encadr_parent_nb_place_restantes) { + console.log("encadrant B : ",encadrant); + console.log("encadr_parent_nb_place_restantes B : ",encadr_parent_nb_place_restantes); + afficheencadrant(encadrant,encadr_parent_nb_place_restantes); +} + +///////////////////////////////////////// +// SAISIE DES INFORMATIONS POUR UN ENCADRANT +///////////////////////////////////////// +function afficheencadrant(encadrant,encadr_parent_nb_place_restantes) { + encadrant++; + //encadr_parent_nb_place_restantes--; + console.log("encadrant C : ",encadrant); + console.log("FUNCTION afficheencadrant, encadr_parent_nb_place_restantes : ",encadr_parent_nb_place_restantes); + + if (encadrant > 4 ) { + console.log("4 encadrants maximum"); + return; + } + + // Ce if sert pour ne pas répéter plusieurs fois le même numéro de encadrant si l'internaute clique plusieurs fois sur le même "ajouter une encadrant" + if (!document.querySelector('#encadrant'+ encadrant +'')) { + let saisie_encadr_parent_nb_place = document.querySelector("#encadrant0"); + console.log("dataset encadr_parent_nb_place_restantes = ",encadr_parent_nb_place_restantes) + + contenuhtml_encadrant = `
+ +

icone informationENCADRANT `+ encadrant +``; + + // Permettre de supprimer les encadrants ajoutés (à partir du deuxième encadrant) + if (encadrant > 0) { + contenuhtml_encadrant += ` `; + }; + + contenuhtml_encadrant += `

+ +
+
+ + +
+
`; + if (encadr_parent_nb_place_restantes < 1){ + contenuhtml_encadrant += `

Le nombre nécessaire de parents encadrants a été atteint. Les professeurs peuvent encore s'inscrire comme professeur encadrant.


`; + }; + + + contenuhtml_encadrant += `
+
+ + +
+
+ +
+
+ + +
+ +
+ + +
+
+ +
+
+ + +
+ +
+ + +
+
+ + +
+ `; + + + encadr_parent_nb_place_restantes--; + + if (encadrant < 4) { + contenuhtml_encadrant += ""+ + ``+ + ``+ + `
`+ + ``+ + ``+ + `
` + }; + + contenuhtml_encadrant += `
`; + + + encadrant--; + console.log("encadrant D : ",encadrant); + + // AFFICHER LE FORMULAIRE DE SAISIE D'UN NOUVEL encadrant + document.querySelector('#encadrant'+ encadrant +'').insertAdjacentHTML("afterend",contenuhtml_encadrant); + encadrant++; + + + console.log("encadrant à la fin de la fonction : ",encadrant); + console.log("encadr_parent_nb_place_restantes à la fin de la fonction : ",encadr_parent_nb_place_restantes); + + return encadrant,encadr_parent_nb_place_restantes; + } + + +} +console.log("encadrant en dessous de la fonction : ",encadrant); + +function supprimer_encadrant(encadrant) { + document.querySelector('#encadrant'+ encadrant +'').remove(); +} + +function si_encadrant_prof(encadrant) { + //encadrant++; + console.log("function si_encadrant_prof, encadrant = ",encadrant) + + if (document.getElementById("encadrant_"+ encadrant +"_type").value == "Professeur") { + contenuhtml_encadrant = `
+
+ + +
+
`; + document.querySelector('#encadrant_ajout_prof_instrument'+ encadrant +'').insertAdjacentHTML("afterend",contenuhtml_encadrant); + } else { + if (document.querySelector('#affiche_encadrant_'+ encadrant +'_prof_instrument')) { + document.querySelector('#affiche_encadrant_'+ encadrant +'_prof_instrument').remove(); + } + } +} + + +function store_nb_spectateurs() { + let key_spectateur_nb_place = document.getElementById("spectateur_nb_place").value; + console.log("key_spectateur_nb_place = ",key_spectateur_nb_place); + var userData = { + key_spectateur_nb_place: key_spectateur_nb_place + }; + localStorage.setItem('userData', JSON.stringify(userData)); +} \ No newline at end of file diff --git a/public/js/localstore.js b/public/js/localstore.js new file mode 100644 index 0000000..03e1fd1 --- /dev/null +++ b/public/js/localstore.js @@ -0,0 +1,13 @@ +document.getElementById('form_identifier').addEventListener('submit', function(e) { + //e.preventDefault(); // Empêche le formulaire de s'envoyer normalement + + // Récupérer les valeurs du formulaire + var key_identifiant = document.getElementById('identifiant').value; + var lstorage_identifiant = { + key_identifiant: key_identifiant + }; + + + // Stocker les données dans localStorage + localStorage.setItem('lstorage_identifiant', JSON.stringify(lstorage_identifiant)); +}); \ No newline at end of file diff --git a/public/js/rassemblementidf/rassemblementidf_formulaire_personne.js b/public/js/rassemblementidf/rassemblementidf_formulaire_personne.js index 5af3778..5f85393 100644 --- a/public/js/rassemblementidf/rassemblementidf_formulaire_personne.js +++ b/public/js/rassemblementidf/rassemblementidf_formulaire_personne.js @@ -3,140 +3,203 @@ // PARAGRAPHE PERSONNE // POUR 6 Personnes -var personne = "0"; -console.log("personne : ",personne); -window.onload = affichepersonne(personne); -function ajout_personne(personne) { - - console.log("personne : ",personne); - affichepersonne(personne); +// STAGE NATIONAL +// REMPLIR LE FORMULAIRE +// PARAGRAPHE PERSONNE +// POUR 6 Personnes + +let personne = 0; + +window.onload = () => { + affichePersonne(personne); +}; + +function ajoutPersonne() { + affichePersonne(personne); } -function affichepersonne(personne) { - console.log("affichepersonne personne : ",personne); - personne++; - console.log("affiche personne personne incrémenté : ",personne); +function affichePersonne(personneCount) { + personneCount++; + console.log("Affiche personne :", personneCount); - - if (personne > 6 ) { + if (personneCount > 6) { console.log("6 personnes maximum"); return; } + // Vérifie si l'élément existe déjà + if (!document.querySelector(`#personne${personneCount}`)) { + let contenuHtmlPersonne = ` +
+

+ icone information à cliquer + PERSONNE ${personneCount}`; + if (personneCount > 1) { + contenuHtmlPersonne += ` + + + + `; + } - // Ce if sert pour ne pas répéter plusieurs fois le même numéro de personne si l'internaute clique plusieurs fois sur le même "ajouter une personne" - if (!document.querySelector('#personne'+ personne +'')) { - - let contenuhtml_personne = `
- -

icone information à cliquerPERSONNE `+ personne +``; - - if (personne > 1) { - contenuhtml_personne += ` `; - }; - - contenuhtml_personne += `

- + contenuHtmlPersonne += ` +

- - + +
-
- - + +
-
- - + +
- - -
-
- - +
+
+ +
-
+
`; + if (personneCount < 6) { + contenuHtmlPersonne += ` +
+ + +
`; + } + + contenuHtmlPersonne += `
`; + + // Insère le nouveau contenu après la dernière personne + const lastPersonne = document.querySelector(`#personne${personneCount - 1}`); + if (lastPersonne) { + lastPersonne.insertAdjacentHTML("afterend", contenuHtmlPersonne); + } else { + document.body.insertAdjacentHTML("beforeend", contenuHtmlPersonne); + } + + personne = personneCount; + } +} + +function selectPersonneProfil(select, personneCount) { + console.log("Valeur sélectionnée :", select.value); + + const instrumentDisplayId = `#personne_${personneCount}_instrument_display`; + const instrumentActiviteCall = document.querySelector(`#personne_${personneCount}_instrument_activite_call`); + + // Supprime l'affichage précédent + if (document.querySelector(instrumentDisplayId)) { + document.querySelector(instrumentDisplayId).remove(); + } + + if (select.value === "professeur") { + instrumentActiviteCall.insertAdjacentHTML("afterend", ` +
-
- - -
- - + + +
- - +
`); + } else if (select.value === "instrumentiste") { + instrumentActiviteCall.insertAdjacentHTML("afterend", ` +
+
+ + +
- - + +
- - `; - - - - if (personne < 6) { - contenuhtml_personne += ""+ - ``+ - ``+ - `
`+ - ``+ - ``+ - `
` - }; - - contenuhtml_personne += ``; - - - personne--; - document.querySelector('#personne'+ personne +'').insertAdjacentHTML("afterend",contenuhtml_personne); - - console.log("personne à la fin de la fonction : ",personne); - personne++; - - return personne; +
+
+ + +
+
+ + +
+
+
`); } - } +function handleInstrumentChange(personneCount) { + const instrumentSelect = document.querySelector(`#personne_${personneCount}_instrument`); + const professeurField = document.querySelector(`#professeur_field_${personneCount}`); -function supprimer_personne(personne) { - document.querySelector('#personne'+ personne +'').remove(); + if (instrumentSelect && professeurField) { + // Si l'instrument sélectionné est le piano, affiche une liste déroulante pour le professeur + if (instrumentSelect.value === "piano") { + professeurField.innerHTML = ` + + +

Seuls les élèves de Isabelle Gaston et Koyuki Kawahara peuvent s'inscrire pour le piano.

`; + } else { + // Pour les autres instruments, affiche un champ de saisie libre + professeurField.innerHTML = ` + + + `; + } + } } - - - - - +function supprimerPersonne(personneCount) { + const personneElement = document.querySelector(`#personne${personneCount}`); + if (personneElement) { + personneElement.remove(); + } +} diff --git a/public/js/rassemblementidf/rassemblementidf_formulaire_personne_20250127.js b/public/js/rassemblementidf/rassemblementidf_formulaire_personne_20250127.js new file mode 100644 index 0000000..0075f1a --- /dev/null +++ b/public/js/rassemblementidf/rassemblementidf_formulaire_personne_20250127.js @@ -0,0 +1,192 @@ +// STAGE NATIONAL +// REMPLIR LE FORMULAIRE +// PARAGRAPHE PERSONNE +// POUR 6 Personnes + +var personne = "0"; +window.onload = affichepersonne(personne); + +function ajout_personne(personne) { + affichepersonne(personne); +} + +function affichepersonne(personne) { + personne++; + console.log("Affiche personne personne : ",personne); + + if (personne > 6 ) { + console.log("6 personnes maximum"); + return; + } + + // Ce if sert pour ne pas répéter plusieurs fois le même numéro de personne si l'internaute clique plusieurs fois sur le même "ajouter une personne" + if (!document.querySelector('#personne'+ personne +'')) { + + let contenuhtml_personne = `
+ +

icone information à cliquerPERSONNE `+ personne +``; + + if (personne > 1) { + contenuhtml_personne += ` `; + }; + + contenuhtml_personne += `

+ +
+
+ + +
+ +
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+ `; + + + + if (personne < 6) { + contenuhtml_personne += ""+ + ``+ + ``+ + `
`+ + ``+ + ``+ + `
` + }; + + contenuhtml_personne += `
`; + + + personne--; + document.querySelector('#personne'+ personne +'').insertAdjacentHTML("afterend",contenuhtml_personne); + personne++; + + return personne; + } + +} + + +function select_personne_profil(select, personne) { + + console.log("select.value : ",select.value); + + if (select.value == "professeur") { + console.log("on est dans professeur"); + + if (document.querySelector("#personne_"+ personne +"_instrument_display")){ + document.querySelector("#personne_"+ personne +"_instrument_display").remove(); + } + + document.querySelector('#personne_'+ personne +'_instrument_activite_call').insertAdjacentHTML("afterend", + `
+
+
+ + +
+
+ + +
+
+
` + ); + } + + if (select.value == "instrumentiste") { + console.log("on est dans élève"); + + if (document.querySelector("#personne_"+ personne +"_instrument_display")){ + document.querySelector("#personne_"+ personne +"_instrument_display").remove(); + } + + document.querySelector('#personne_'+ personne +'_instrument_activite_call').insertAdjacentHTML("afterend", + `
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
` + ); + } + +} + + + +function supprimer_personne(personne) { + document.querySelector('#personne'+ personne +'').remove(); +} + + + + + + diff --git a/public/js/rassemblementra/rassemblementra_formulaire_personne.js b/public/js/rassemblementra/rassemblementra_formulaire_personne.js new file mode 100644 index 0000000..1c93a4d --- /dev/null +++ b/public/js/rassemblementra/rassemblementra_formulaire_personne.js @@ -0,0 +1,172 @@ +// RASSEMBLEMENT NATIONAL Rhone Alpes +// REMPLIR LE FORMULAIRE +// PARAGRAPHE PERSONNE +// POUR 3 Personnes + +var personne = "0"; +window.onload = affichepersonne(personne); + +function ajout_personne(personne) { + affichepersonne(personne); +} + +function affichepersonne(personne) { + personne++; + console.log("Affiche personne personne : ",personne); + + if (personne > 4 ) { + console.log("4 personnes maximum"); + return; + } + + // Ce if sert pour ne pas répéter plusieurs fois le même numéro de personne si l'internaute clique plusieurs fois sur le même "ajouter une personne" + if (!document.querySelector('#personne'+ personne +'')) { + + let contenuhtml_personne = `
+ +

icone information à cliquerPERSONNE `+ personne +``; + + if (personne > 1) { + contenuhtml_personne += ` `; + }; + + contenuhtml_personne += `

+ +
+
+ + +
+ +
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+ `; + + + + if (personne < 4) { + contenuhtml_personne += ""+ + ``+ + ``+ + `
`+ + ``+ + ``+ + `
` + }; + + contenuhtml_personne += `
`; + + + personne--; + document.querySelector('#personne'+ personne +'').insertAdjacentHTML("afterend",contenuhtml_personne); + personne++; + + return personne; + } + +} + + +function select_personne_profil(select, personne) { + + console.log("select.value : ",select.value); + + if (select.value == "professeur") { + console.log("on est dans professeur"); + + if (document.querySelector("#personne_"+ personne +"_instrument_display")){ + document.querySelector("#personne_"+ personne +"_instrument_display").remove(); + } + + document.querySelector('#personne_'+ personne +'_instrument_activite_call').insertAdjacentHTML("afterend", + `
+
+
+ + +
+
+
` + ); + } + + if (select.value == "instrumentiste") { + console.log("on est dans élève"); + + if (document.querySelector("#personne_"+ personne +"_instrument_display")){ + document.querySelector("#personne_"+ personne +"_instrument_display").remove(); + } + + document.querySelector('#personne_'+ personne +'_instrument_activite_call').insertAdjacentHTML("afterend", + `
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
` + ); + } + +} + + + +function supprimer_personne(personne) { + document.querySelector('#personne'+ personne +'').remove(); +} + + + + + + diff --git a/public/js/stagenat/stagenational_formulaire_personne.js b/public/js/stagenat/stagenational_formulaire_personne.js index f92077b..4d95dba 100644 --- a/public/js/stagenat/stagenational_formulaire_personne.js +++ b/public/js/stagenat/stagenational_formulaire_personne.js @@ -4,27 +4,16 @@ // POUR 6 Personnes var personne = "0"; -console.log("personne : ",personne); window.onload = affichepersonne(personne); function ajout_personne(personne) { - - console.log("personne : ",personne); affichepersonne(personne); } function affichepersonne(personne) { - console.log("affichepersonne personne : ",personne); personne++; - console.log("affiche personne personne incrémenté : ",personne); - - if (personne > 6 ) { - console.log("6 personnes maximum"); return; } - - - // Ce if sert pour ne pas répéter plusieurs fois le même numéro de personne si l'internaute clique plusieurs fois sur le même "ajouter une personne" if (!document.querySelector('#personne'+ personne +'')) { @@ -53,7 +42,7 @@ function affichepersonne(personne) {
- +
@@ -75,26 +64,29 @@ function affichepersonne(personne) {

Aller/Retour Lyon ⇔ Carroz d’Arâches


-

DÉPART 20 août, 11h pour l'arrêt du 7 quai Lassagne, Lyon 1er

-

ou 11h30 pour l'arrêt Gare de la Part Dieu, sortie Porte des Alpes

+

DÉPART 17 août, xxh pour l'arrêt du 7 quai Lassagne, Lyon 1er

+

ou xx pour l'arrêt Gare de la Part Dieu, sortie Porte des Alpes


-

PRÉVOIR UN PIQUE-NIQUE POUR LE 20 AOÛT

+

PRÉVOIR UN PIQUE-NIQUE POUR LE 17 AOÛT


-

RETOUR 25 août, 14h - Arrivée à Gare de la Part Dieu vers 17h

-

Il est possible de prévoir un train en partance de Lyon à partir de 18h.

+

RETOUR 28 août, xxh - Arrivée à Gare de la Part Dieu vers xxh

+

Il est possible de prévoir un train en partance de Lyon à partir de xxh.

- - - - - + + + + + +
@@ -106,19 +98,20 @@ function affichepersonne(personne) {

Informations sur le PROFIL


-

INSTRUMENTISTE : tous les enfants qui suivent le programme du stage en violon, alto, violoncelle ou piano.

+

INSTRUMENTISTE : tous les enfants qui suivent le programme du stage en violon, alto, violoncelle, piano, flûte traversière, trompette.

+
+

INSTRUMENTISTE Camp Ado : tous les enfants de 14 à 17 ans, non accompagnés, admis au camp ado au centre des Flocons Verts, qui suivent le programme du stage en violon, alto, violoncelle, piano, flûte traversière, trompette.

+
+

ACCOMPAGNANT SANS ACTIVITÉ : personne qui accompagne les enfants et qui logent au Flocons Verts

+
+

ACCOMPAGNANT AVEC ACTIVITÉ : personne qui accompagne les enfants, qui logent au Flocons Verts ou non, et qui fait une activité.


OBSERVATEUR : Toute personne extérieure à la pédagogie Suzuki peut observer les leçons et assister aux concerts des élèves. Ce stage constitue une source d’informations importantes pour toute personne qui désire mieux connaître la pédagogie Suzuki.
L’observation des cours est gratuite pour tous les professeurs Suzuki, et stagiaires en formation Suzuki adhérents à l’AFPS.

-
-

ACCOMPAGNANT SANS ACTIVITÉ : personne qui accompagne les enfants et qui logent au Flocons Verts

-
-

ACCOMPAGNANT AVEC ACTIVITÉ : personne qui accompagne les enfants qui logent au Flocons Verts ou non et qui font une activité. -
- L'activité sera payée sur place, le coût n'est pas compté dans le total du stage.

+

PROFESSEUR INVITÉ : Pour les professeurs qui vont être enseignant au stage

@@ -144,7 +137,6 @@ function affichepersonne(personne) { personne--; document.querySelector('#personne'+ personne +'').insertAdjacentHTML("afterend",contenuhtml_personne); - console.log("personne à la fin de la fonction : ",personne); personne++; return personne; @@ -152,12 +144,8 @@ function affichepersonne(personne) { } - function select_personne_transport_mode(select, personne) { - console.log("personne dans select_personne_transport_mode : ",personne); - console.log("select.value : ",select.value); if (select.value == "car"){ - console.log("on est dans Car"); let transport_arret_call = '#personne_'+ personne +'_transport_arret_call'; document.querySelector(transport_arret_call).insertAdjacentHTML("afterend", `
@@ -171,9 +159,7 @@ function select_personne_transport_mode(select, personne) { ); }; if (select.value == "independant"){ - console.log("on est dans independant"); if (document.querySelector("#personne_"+ personne +"_transport_arret_display")){ - console.log("on est dans independant arret exist"); document.querySelector("#personne_"+ personne +"_transport_arret_display").remove(); } }; @@ -181,18 +167,16 @@ function select_personne_transport_mode(select, personne) { }; - function select_personne_profil(select, personne) { - console.log("select.value : ",select.value); if (select.value == "observateur"){ - console.log("on est dans observateur"); if (document.querySelector("#personne_"+ personne +"_instrument_display")){ - console.log("on est dans instrumentiste instrument exist"); document.querySelector("#personne_"+ personne +"_instrument_display").remove(); } + if (document.querySelector(`#personne_${personne}_prise_charge_display`)) { + document.querySelector(`#personne_${personne}_prise_charge_display`).remove(); + } if (document.querySelector("#personne_"+ personne +"_activite_display")){ - console.log("on est dans instrumentiste activite exist"); document.querySelector("#personne_"+ personne +"_activite_display").remove(); } if (document.querySelector("#personne_"+ personne +"_piece_display")){ @@ -226,20 +210,70 @@ function select_personne_profil(select, personne) {
` ); }; - + if (select.value == "prof_invite"){ + if (document.querySelector("#personne_"+ personne +"_instrument_display")){ + document.querySelector("#personne_"+ personne +"_instrument_display").remove(); + } + if (document.querySelector(`#personne_${personne}_prise_charge_display`)) { + document.querySelector(`#personne_${personne}_prise_charge_display`).remove(); + } + if (document.querySelector("#personne_"+ personne +"_activite_display")){ + document.querySelector("#personne_"+ personne +"_activite_display").remove(); + } + if (document.querySelector("#personne_"+ personne +"_profil_display")){ + document.querySelector("#personne_"+ personne +"_profil_display").remove(); + } + if (document.querySelector("#personne_"+ personne +"_piece_display")){ + document.querySelector("#personne_"+ personne +"_piece_display").remove(); + } + if (document.querySelector("#personne_"+ personne +"_prof_display")){ + document.querySelector("#personne_"+ personne +"_prof_display").remove(); + } + if (document.querySelector("#personne_"+ personne +"_option_concertsolo_piece_call")){ + document.querySelector("#personne_"+ personne +"_option_concertsolo_piece_call").remove(); + } + if (document.querySelector("#personne_"+ personne +"_option_concertsolo_piece_display")){ + document.querySelector("#personne_"+ personne +"_option_concertsolo_piece_display").remove(); + } + if (document.querySelector("#personne_"+ personne +"_coursindividuel_display")){ + document.querySelector("#personne_"+ personne +"_coursindividuel_display").remove(); + } + if (document.querySelector("#personne_"+ personne +"_decouvrealto_display")){ + document.querySelector("#personne_"+ personne +"_decouvrealto_display").remove(); + } + }; if (select.value == "instrumentiste"){ - console.log("on est dans instrumentiste"); if (document.querySelector("#personne_"+ personne +"_profil_display")){ - console.log("on est dans observateur profil exist"); document.querySelector("#personne_"+ personne +"_profil_display").remove(); } if (document.querySelector("#personne_"+ personne +"_activite_display")){ - console.log("on est dans instrumentiste activite exist"); document.querySelector("#personne_"+ personne +"_activite_display").remove(); } + if (document.querySelector("#personne_"+ personne +"_instrument_display")){ + document.querySelector("#personne_"+ personne +"_instrument_display").remove(); + } + if (document.querySelector("#personne_"+ personne +"_piece_display")){ + document.querySelector("#personne_"+ personne +"_piece_display").remove(); + } + if (document.querySelector("#personne_"+ personne +"_prof_display")){ + document.querySelector("#personne_"+ personne +"_prof_display").remove(); + } + if (document.querySelector("#personne_"+ personne +"_option_concertsolo_piece_display")){ + document.querySelector("#personne_"+ personne +"_option_concertsolo_piece_display").remove(); + } + if (document.querySelector("#personne_"+ personne +"_coursindividuel_display")){ + document.querySelector("#personne_"+ personne +"_coursindividuel_display").remove(); + } + if (document.querySelector("#personne_"+ personne +"_decouvrealto_display")){ + document.querySelector("#personne_"+ personne +"_decouvrealto_display").remove(); + } + if (document.querySelector("#personne_"+ personne +"_option_concertsolo_piece_call")){ + document.querySelector("#personne_"+ personne +"_option_concertsolo_piece_call").remove(); + } + document.querySelector('#personne_'+ personne +'_instrument_activite_call').insertAdjacentHTML("afterend", `
@@ -255,8 +289,109 @@ function select_personne_profil(select, personne) {
` ); + document.querySelector('#personne_'+ personne +'_instrument_display').insertAdjacentHTML("afterend", + `
+
+ + +
+
+
+
+
+ + +
+
+ + +
+
+ + + +
+
+ + +
+
+ + ` + ); + + document.querySelector('#personne_'+ personne +'_instrument_display').insertAdjacentHTML("beforebegin", + ` +
+ + +
+ + + `); + }; + + if (select.value == "instrumentiste_camp"){ + + if (document.querySelector("#personne_"+ personne +"_instrument_display")){ + document.querySelector("#personne_"+ personne +"_instrument_display").remove(); + } + if (document.querySelector(`#personne_${personne}_prise_charge_display`)) { + document.querySelector(`#personne_${personne}_prise_charge_display`).remove(); + } + if (document.querySelector("#personne_"+ personne +"_piece_display")){ + document.querySelector("#personne_"+ personne +"_piece_display").remove(); + } + if (document.querySelector("#personne_"+ personne +"_prof_display")){ + document.querySelector("#personne_"+ personne +"_prof_display").remove(); + } + if (document.querySelector("#personne_"+ personne +"_option_concertsolo_piece_display")){ + document.querySelector("#personne_"+ personne +"_option_concertsolo_piece_display").remove(); + } + if (document.querySelector("#personne_"+ personne +"_coursindividuel_display")){ + document.querySelector("#personne_"+ personne +"_coursindividuel_display").remove(); + } + if (document.querySelector("#personne_"+ personne +"_decouvrealto_display")){ + document.querySelector("#personne_"+ personne +"_decouvrealto_display").remove(); + } + if (document.querySelector("#personne_"+ personne +"_option_concertsolo_piece_call")){ + document.querySelector("#personne_"+ personne +"_option_concertsolo_piece_call").remove(); + } + if (document.querySelector("#personne_"+ personne +"_activite_display")){ + document.querySelector("#personne_"+ personne +"_activite_display").remove(); + } + if (document.querySelector("#personne_"+ personne +"_profil_display")){ + document.querySelector("#personne_"+ personne +"_profil_display").remove(); + } + + document.querySelector('#personne_'+ personne +'_instrument_activite_call').insertAdjacentHTML("afterend", + `
+
+
+ + +
` + ); + document.querySelector('#personne_'+ personne +'_instrument_display').insertAdjacentHTML("afterend", `
@@ -294,18 +429,78 @@ function select_personne_profil(select, personne) { ); }; - if (select.value == "accompagnant_activite"){ - console.log("on est dans accompagnant_activite"); + if (select.value == "accompagnant_activite_adulte"){ + + if (document.querySelector(`#personne_${personne}_instrument_display`)) { + document.querySelector(`#personne_${personne}_instrument_display`).remove(); + } + if (document.querySelector(`#personne_${personne}_prise_charge_display`)) { + document.querySelector(`#personne_${personne}_prise_charge_display`).remove(); + } + if (document.querySelector(`#personne_${personne}_piece_display`)) { + document.querySelector(`#personne_${personne}_piece_display`).remove(); + } + if (document.querySelector(`#personne_${personne}_prof_display`)) { + document.querySelector(`#personne_${personne}_prof_display`).remove(); + } + if (document.querySelector(`#personne_${personne}_option_concertsolo_piece_display`)) { + document.querySelector(`#personne_${personne}_option_concertsolo_piece_display`).remove(); + } + if (document.querySelector(`#personne_${personne}_coursindividuel_display`)) { + document.querySelector(`#personne_${personne}_coursindividuel_display`).remove(); + } + if (document.querySelector(`#personne_${personne}_decouvrealto_display`)) { + document.querySelector(`#personne_${personne}_decouvrealto_display`).remove(); + } + if (document.querySelector(`#personne_${personne}_option_concertsolo_piece_call`)) { + document.querySelector(`#personne_${personne}_option_concertsolo_piece_call`).remove(); + } + if (document.querySelector(`#personne_${personne}_activite_display`)) { + document.querySelector(`#personne_${personne}_activite_display`).remove(); + } + if (document.querySelector(`#personne_${personne}_profil_display`)) { + document.querySelector(`#personne_${personne}_profil_display`).remove(); + } + + let selectHTML = `
`; + for (let i = 1; i <= 4; i++) { + selectHTML += ` +
+
+ + +
+
+ `; + } + selectHTML += `
`; + document.querySelector('#personne_'+ personne +'_instrument_activite_call').insertAdjacentHTML("afterend", + selectHTML + ); + }; + + + + + + if (select.value == "accompagnant_activite_enfant"){ if (document.querySelector("#personne_"+ personne +"_instrument_display")){ - console.log("on est dans accompagnant_activite instrument exist"); document.querySelector("#personne_"+ personne +"_instrument_display").remove(); } + if (document.querySelector(`#personne_${personne}_prise_charge_display`)) { + document.querySelector(`#personne_${personne}_prise_charge_display`).remove(); + } if (document.querySelector("#personne_"+ personne +"_piece_display")){ document.querySelector("#personne_"+ personne +"_piece_display").remove(); } if (document.querySelector("#personne_"+ personne +"_prof_display")){ - console.log("on est dans accompagnant_activite prof exist"); document.querySelector("#personne_"+ personne +"_prof_display").remove(); } if (document.querySelector("#personne_"+ personne +"_option_concertsolo_piece_display")){ @@ -314,56 +509,55 @@ function select_personne_profil(select, personne) { if (document.querySelector("#personne_"+ personne +"_coursindividuel_display")){ document.querySelector("#personne_"+ personne +"_coursindividuel_display").remove(); } + if (document.querySelector("#personne_"+ personne +"_decouvrealto_display")){ + document.querySelector("#personne_"+ personne +"_decouvrealto_display").remove(); + } if (document.querySelector("#personne_"+ personne +"_option_concertsolo_piece_call")){ document.querySelector("#personne_"+ personne +"_option_concertsolo_piece_call").remove(); } if (document.querySelector("#personne_"+ personne +"_activite_display")){ - console.log("on est dans accompagnant_activite activite exist"); document.querySelector("#personne_"+ personne +"_activite_display").remove(); } if (document.querySelector("#personne_"+ personne +"_profil_display")){ - console.log("on est dans accompagnant_activite profil exist"); document.querySelector("#personne_"+ personne +"_profil_display").remove(); } - document.querySelector('#personne_'+ personne +'_instrument_activite_call').insertAdjacentHTML("afterend", - `
+ let selectHTML = `
`; + for (let i = 1; i <= 5; i++) { + selectHTML += `
-
- - - - - - -
-
- -
-
` + `; + } + selectHTML += `
`; + + document.querySelector('#personne_'+ personne +'_instrument_activite_call').insertAdjacentHTML("afterend", + selectHTML ); }; if (select.value == "accompagnant"){ - console.log("accompagnant"); if (document.querySelector("#personne_"+ personne +"_instrument_display")){ - console.log("on est dans instrumentiste instrument exist"); document.querySelector("#personne_"+ personne +"_instrument_display").remove(); } + if (document.querySelector(`#personne_${personne}_prise_charge_display`)) { + document.querySelector(`#personne_${personne}_prise_charge_display`).remove(); + } if (document.querySelector("#personne_"+ personne +"_activite_display")){ - console.log("on est dans instrumentiste activite exist"); document.querySelector("#personne_"+ personne +"_activite_display").remove(); } if (document.querySelector("#personne_"+ personne +"_profil_display")){ - console.log("on est dans observateur profil exist"); document.querySelector("#personne_"+ personne +"_profil_display").remove(); } if (document.querySelector("#personne_"+ personne +"_piece_display")){ @@ -381,20 +575,22 @@ function select_personne_profil(select, personne) { if (document.querySelector("#personne_"+ personne +"_coursindividuel_display")){ document.querySelector("#personne_"+ personne +"_coursindividuel_display").remove(); } + if (document.querySelector("#personne_"+ personne +"_decouvrealto_display")){ + document.querySelector("#personne_"+ personne +"_decouvrealto_display").remove(); + } }; if (!select.value){ - console.log("rien sélectionné"); if (document.querySelector("#personne_"+ personne +"_instrument_display")){ - console.log("on est dans instrumentiste instrument exist"); document.querySelector("#personne_"+ personne +"_instrument_display").remove(); } + if (document.querySelector(`#personne_${personne}_prise_charge_display`)) { + document.querySelector(`#personne_${personne}_prise_charge_display`).remove(); + } if (document.querySelector("#personne_"+ personne +"_activite_display")){ - console.log("on est dans instrumentiste activite exist"); document.querySelector("#personne_"+ personne +"_activite_display").remove(); } if (document.querySelector("#personne_"+ personne +"_profil_display")){ - console.log("on est dans observateur profil exist"); document.querySelector("#personne_"+ personne +"_profil_display").remove(); } if (document.querySelector("#personne_"+ personne +"_piece_display")){ @@ -412,16 +608,80 @@ function select_personne_profil(select, personne) { if (document.querySelector("#personne_"+ personne +"_coursindividuel_display")){ document.querySelector("#personne_"+ personne +"_coursindividuel_display").remove(); } + if (document.querySelector("#personne_"+ personne +"_decouvrealto_display")){ + document.querySelector("#personne_"+ personne +"_decouvrealto_display").remove(); + } }; + }; +function handleActivitySelection(select, personne, activiteIndex) { + let activiteValue = select.value; + + // Sélectionne le conteneur où ajouter les informations complémentaires + let activiteContainer = document.querySelector(`#personne_${personne}_activite_${activiteIndex}_display`); + + + // Supprime l'ancien complément d'information pour cette activité (évite doublons) + let existingInfo = document.querySelector("#personne_" + personne + "_complement_" + activiteIndex); + if (existingInfo) { + existingInfo.remove(); + } + + // Vérifie si on doit afficher un complément d'information + if (activiteValue === "cours_particulier") { + activiteContainer.insertAdjacentHTML("afterend", ` +
+ + +
+ `); + } else if (activiteValue === "atelier_mus_ens_acc") { + activiteContainer.insertAdjacentHTML("afterend", ` +
+ + +
+ `); + } else if (activiteValue === "cours_collectif_suzuki_acc") { + activiteContainer.insertAdjacentHTML("afterend", ` +
+ + +
+ `); + } +} + +function togglePriseEnCharge(personne) { + let checkbox = document.querySelector("#personne_" + personne + "_prise_charge"); + let nomFamilleDiv = document.querySelector("#personne_" + personne + "_nom_famille_display"); + + if (checkbox.checked) { + nomFamilleDiv.style.display = "block"; // Affiche le champ si la checkbox est cochée + } else { + nomFamilleDiv.style.display = "none"; // Cache le champ si la checkbox est décochée + document.querySelector("#personne_" + personne + "_prise_charge_nom").value = ""; // Réinitialise le champ + } +} + function select_cahier(select, personne) { if (select.value == "alto") { - console.log("on est dans cahier pour alto"); if (document.querySelector("#select_personne_"+ personne +"cahier_display")){ document.querySelector("#select_personne_"+ personne +"cahier_display").remove(); } + if (document.querySelector("#personne_"+ personne +"_decouvrealto_display")){ + document.querySelector("#personne_"+ personne +"_decouvrealto_display").remove(); + } document.querySelector('#personne_'+ personne +'_cahier_display').insertAdjacentHTML("afterend", `
@@ -431,17 +691,20 @@ function select_cahier(select, personne) { +
` ); } else { - console.log("on est dans cahier autre que alto"); if (document.querySelector("#select_personne_"+ personne +"cahier_display")){ document.querySelector("#select_personne_"+ personne +"cahier_display").remove(); } if (document.querySelector("#personne_"+ personne +"_coursindividuel_display")){ document.querySelector("#personne_"+ personne +"_coursindividuel_display").remove(); } + if (document.querySelector("#personne_"+ personne +"_decouvrealto_display")){ + document.querySelector("#personne_"+ personne +"_decouvrealto_display").remove(); + } document.querySelector('#personne_'+ personne +'_cahier_display').insertAdjacentHTML("afterend", `
@@ -462,16 +725,15 @@ function select_cahier(select, personne) { ); } - // OPTION COURS INDIVIDUEL POUR ALTO, VIOLON, VILONCELLE - if (select.value == "alto" || select.value == "violon" ||select.value == "violoncelle" ) { - console.log("on est dans cours indivi pour alto V V"); + // OPTION COURS INDIVIDUEL POUR ALTO, VIOLON, VILONCELLE, Trompette et flûte traversière + if (select.value == "alto" || select.value == "violon" ||select.value == "violoncelle" ||select.value == "flute traversière" ||select.value == "trompette" ) { if (document.querySelector("#personne_"+ personne +"_coursindividuel_display")){ document.querySelector("#personne_"+ personne +"_coursindividuel_display").remove(); } document.querySelector('#personne_'+ personne +'_option_concertsolo_piece_call').insertAdjacentHTML("beforebegin", `
- + +
+ +
+ + +
+ + + + + + + + @@ -76,6 +98,7 @@

PAIEMENT DE VOTRE ADHÉSION :

    +
  • Tarifs : 22€ pour les familles, 42€ pour les professeurs (inclus leurs enfants)
  • nous vous recommandons le paiement par carte bancaire pour obtenir votre carte d'adhérent immédiatement,
  • vous pouvez choisir le paiement par chèque ou virement, dans ce cas votre carte d'adhérent définitive sera envoyée après réception de votre paiement.
diff --git a/views/adhesion/page_templates/formulaire_adhesion_prof.ejs b/views/adhesion/page_templates/formulaire_adhesion_prof.ejs index 20541a9..5a36437 100644 --- a/views/adhesion/page_templates/formulaire_adhesion_prof.ejs +++ b/views/adhesion/page_templates/formulaire_adhesion_prof.ejs @@ -30,11 +30,12 @@
- +
- <%- include('../template_parts/prof_diplome')%> + +
@@ -48,11 +49,12 @@
- +
- <%- include('../template_parts/prof_formation')%> +
+ @@ -61,12 +63,16 @@
- +
+ + + + - <%- include('../template_parts/eleves')%> +
@@ -90,5 +96,6 @@ + <%- include('../../template_parts/footer')%> \ No newline at end of file diff --git a/views/adhesion/page_templates/inscription_terminee.ejs b/views/adhesion/page_templates/inscription_terminee.ejs new file mode 100644 index 0000000..7ced98b --- /dev/null +++ b/views/adhesion/page_templates/inscription_terminee.ejs @@ -0,0 +1,122 @@ +<%- include('../../template_parts/head')%> + + + + + + + <%- include('../../template_parts/header_tunnel')%> + + + + + +
+ +
+ + + <%- include('../template_parts/adhesion_titrepage')%> + + + + <% if (locals.err_mail_form_adhesion_1) { %> +
+

<%= err_mail_form_adhesion_1 %>

+

<%= err_mail_form_adhesion_2 %>

+

<%= err_mail_form_adhesion_3 %>

+

<%= err_mail_form_adhesion_4 %>

+
+ <% }; %> + + + + + +
+

Les inscriptions de l'année 2025/2026 sont terminées.

+
+

Rendez-vous le 01/09/2025 pour les inscriptions 2025/2026

+
+ + + + + + +
+ +
+

En savoir plus sur ce formulaire

+
+ + + + + +
+ + + +
+ +
+ + + + + + + <%- include('../../template_parts/footer')%> + + + + + + \ No newline at end of file diff --git a/views/adhesion/page_templates/maj_googlesheet.ejs b/views/adhesion/page_templates/maj_googlesheet.ejs new file mode 100644 index 0000000..0867478 --- /dev/null +++ b/views/adhesion/page_templates/maj_googlesheet.ejs @@ -0,0 +1,221 @@ +<%- include('../../template_parts/head')%> + + + + + + + <%- include('../../template_parts/header_tunnel')%> + +
+ + + + + <%- include('../template_parts/adhesion_titrepage')%> + + + + + +
+ +

LES TABLEAUX GOOGLE SHEET

+ +

La mise à jour du fichier Google Sheet avec les nouvelles adhésions se fait automatiquement toutes les nuits à 3h.

Ceci est également valable pour l'import des adhésions depuis les associations locales.

+ + +
+ +
+ + + + +
+

METTRE À JOUR LE STATUT DE PAIEMENT D'UN ADHÉRENT

+ + <% if (locals.message2) { %> +
+

<%= locals.message2 %>

+ <% }; %> + +
+ +
+ +
+
+ + +
+
+ +
+
+ + +
+ +
+ + +
+
+ +
+
+ + +
+
+ + +
+ +
+ + + + + + + + +
+ + + +
+ +
+ + + + +
+

SUPPRIMER UN ADHÉRENT

+ + <% if (locals.message3) { %> +
+

<%= locals.message3 %>

+ <% }; %> + +
+ +
+ +
+
+ + +
+
+ + + + + + + +
+ + + +
+ + +
+ + + + + +
+ +

AJOUTER LES ADHÉRENTS
DES ASSOCIATIONS LOCALES
ET ENVOIE PAR MAIL DES CARTES ADHÉRENT

+ +

Veuillez patienter quelques minutes selon le nombre à importer.
Lorsque le traitement sera fini la page affichera les résultats.

+ +
+
+ +
+
+
+ <% if (locals.message4) { %> +

<%= locals.message4 %>

+ <% }; %> +
+
+ +
+ + + + +
+

GESTION DES CODES SECRETS

+ + + +
+ + <% if (locals.message5) { %> +
+

<%= locals.message5 %>

+ <% }; %> + + + +
+ +
+ +

Rajouter des codes secrets :

+
+ +
+
+ + +
+
+ + + + + + + +
+ +
+ +
+ + + + + + + <%- include('../../template_parts/footer')%> + + + + + + + \ No newline at end of file diff --git a/views/adhesion/template_parts/adhesion_titrepage.ejs b/views/adhesion/template_parts/adhesion_titrepage.ejs index 58d5509..97855be 100644 --- a/views/adhesion/template_parts/adhesion_titrepage.ejs +++ b/views/adhesion/template_parts/adhesion_titrepage.ejs @@ -3,5 +3,5 @@

Adhésion annuelle à l’Association Française pour la Pédagogie Suzuki

-

Année 2022/2023 du 1er septembre au 31 août

+

Année 2025/2026 du 1er septembre au 31 août

\ No newline at end of file diff --git a/views/adhesion/template_parts/check_mail.ejs b/views/adhesion/template_parts/check_mail.ejs deleted file mode 100644 index 365002f..0000000 --- a/views/adhesion/template_parts/check_mail.ejs +++ /dev/null @@ -1,28 +0,0 @@ - - - - -
- -
- - -
- -
- - -
- - - - - - - -
- - - \ No newline at end of file diff --git a/views/adhesion/template_parts/eleves.ejs b/views/adhesion/template_parts/eleves.ejs index 4d96c05..242f1dd 100644 --- a/views/adhesion/template_parts/eleves.ejs +++ b/views/adhesion/template_parts/eleves.ejs @@ -38,6 +38,7 @@ + @@ -83,6 +84,7 @@ + @@ -190,6 +192,7 @@ + @@ -236,6 +239,7 @@ + @@ -346,6 +350,7 @@ + @@ -392,6 +397,7 @@ + @@ -500,6 +506,7 @@ + @@ -546,6 +553,7 @@ + @@ -653,6 +661,7 @@ + @@ -699,6 +708,7 @@ + diff --git a/views/adhesion/template_parts/eleves_famille.ejs b/views/adhesion/template_parts/eleves_famille.ejs index cf251e9..a0c9ca8 100644 --- a/views/adhesion/template_parts/eleves_famille.ejs +++ b/views/adhesion/template_parts/eleves_famille.ejs @@ -3,167 +3,12 @@ + +
+
- - - -
- -
-

-

Ajouter un enfant :

-
- -
-
- - -
- -
- - -
- -
- - -
-
- - -
-
- - -
- -
- - -
- -
- - -
-
- -
- -
- - -
- -
- - -
- -
- - -
- - - -
- -
- -
- - -
- -
- -
-
- - -
- -
- - -
- -
- - -
-
- - - - -
- - -
-
@@ -198,6 +43,7 @@ + @@ -244,6 +90,7 @@ + @@ -320,302 +167,7 @@
- - - - - - - - - - -
+ - - - - diff --git a/views/adhesion/template_parts/prof_diplome.ejs b/views/adhesion/template_parts/prof_diplome.ejs index 1195ed8..4bca6c2 100644 --- a/views/adhesion/template_parts/prof_diplome.ejs +++ b/views/adhesion/template_parts/prof_diplome.ejs @@ -8,17 +8,50 @@ + <% + const regionsEcolesProf = [ + 'Auvergne-Rhône-Alpes', + 'Bourgogne-Franche-Comté', + 'Bretagne', + 'Centre-Val de Loire', + 'Corse', + 'Espagne', + 'Grand Est', + 'Hauts-de-France', + 'Île-de-France', + 'Normandie', + 'Nouvelle-Aquitaine', + 'Occitanie', + 'Pays de la Loire', + "Provence-Alpes-Côte d'Azur", + 'Guadeloupe', + 'Martinique', + 'Guyane', + 'La Réunion', + 'Luxembourg', + 'Mayotte', + 'Polynésie française', + 'Nouvelle-Calédonie', + 'Saint-Pierre-et-Miquelon', + 'Wallis-et-Futuna', + 'Saint-Martin', + 'Saint-Barthélemy', + 'Suisse' + ]; + %> + -
- <% for (let toto = 1; toto < 7; toto++) { %> + <% for (let toto = 0; toto < 7; toto++) { %> <% if (locals["personne_"+toto+"_nom"]) { %>

icone information à cliquerPERSONNE <%= locals["personne_"+toto+"_numero"] %>

Nom : <%= locals["personne_"+toto+"_nom"] %> <%= locals["personne_"+toto+"_prenom"] %>

-

Date de naissance : <%= locals["personne_"+toto+"_datenaissance"] %>

- - <% if (locals["personne_"+toto+"_instrument"]) { %> -

Instrument : <%= locals["personne_"+toto+"_instrument"] %> - <%= locals["personne_"+toto+"_cahier"] %>

- <% } %> +

Catégorie : <%= locals["personne_"+toto+"_role"] %>

- <% if (locals["personne_"+toto+"_piece"]) { %> -

Pièce : <%= locals["personne_"+toto+"_piece"] %>

+ <% if (locals.tag_ss_paiement === "oui") { %> + <% if (locals["personne_"+toto+"_role"] === "professeur") { + if (locals["personne_"+toto+"_instrument"]) { %> +

Instrument : <%= locals["personne_"+toto+"_instrument"] %> - <%= locals["personne_"+toto+"_cahier"] %>

+ <% } %> + <% } %> + <% } else {%> + <% if (locals["personne_"+toto+"_role"] === "professeur") { + if (locals["personne_"+toto+"_instrument"]) { %> +

Instrument : <%= locals["personne_"+toto+"_instrument"] %> - <%= locals["personne_"+toto+"_cahier"] %>

+ <% } %> + <% if (locals["personne_"+toto+"_repas"] === "repas") { %> +

Repas du midi : oui (8€)

+ <% } %> + <% } %> + <% if (locals["personne_"+toto+"_role"] === "instrumentiste") { + if (locals["personne_"+toto+"_instrument"]) { %> +

Instrument : <%= locals["personne_"+toto+"_instrument"] %> - <%= locals["personne_"+toto+"_cahier"] %>

+ <% } %> + + <% if (locals["personne_"+toto+"_piece"]) { %> +

Pièce : <%= locals["personne_"+toto+"_piece"] %>

+ <% } %> + + <% if (locals["personne_"+toto+"_prof"]) { %> +

Professeur : <%= locals["personne_"+toto+"_prof"] %>

+ <% } %> + <% } %> <% } %> - - <% if (locals["personne_"+toto+"_prof"]) { %> -

Professeur : <%= locals["personne_"+toto+"_prof"] %>

- <% } %> -
<% } %> - <% } %>
-
-
-

Tarif rassemblement : <%= cout_rassemblement %>

-

Frais bancaire : <%= frais_bancaire %>€

-

Montant total : <%= cout_total %>€

-
-
+ <% if (locals.tag_ss_paiement === "oui") { %> + <% } else {%> +
+
+

Tarif rassemblement : <%= tarif_rassemblement %>

+

Coût repas professeur(s) : <%= cout_repas %>

+

Frais bancaire : <%= frais_bancaire %>€

+

Montant total : <%= cout_total %>€

+
+
+ <% } %> + diff --git a/views/rassemblementidf/page_templates/panne.ejs b/views/rassemblementidf/page_templates/panne.ejs new file mode 100644 index 0000000..0b7d3e3 --- /dev/null +++ b/views/rassemblementidf/page_templates/panne.ejs @@ -0,0 +1,94 @@ +<%- include('../../template_parts/head')%> + + + + + + + <%- include('../../template_parts/header_tunnel')%> + + + + + +
+ +
+ + + <%- include('../template_parts/rassemblementidf_titrepage')%> + + + + <% if (locals.err_mail_form_adhesion_1) { %> +
+

<%- err_mail_form_adhesion_1 %>

+

<%- err_mail_form_adhesion_2 %>

+

<%- err_mail_form_adhesion_3 %>

+
+ <% }; %> + + + +

Nous vous prions de nous excuser. Le formulaire d'inscription pour le Rassemblement est temporairement indisponible et sera rétabli dans quelques heures.

+ + + + + +
+ +
+

En savoir plus sur ce formulaire

+
+ + + + + +
+ + + +
+ +
+ + + + + + + <%- include('../../template_parts/footer')%> + + + + + + \ No newline at end of file diff --git a/views/rassemblementidf/page_templates/recap.ejs b/views/rassemblementidf/page_templates/recap.ejs index 29c0e32..693a47f 100644 --- a/views/rassemblementidf/page_templates/recap.ejs +++ b/views/rassemblementidf/page_templates/recap.ejs @@ -14,11 +14,8 @@
- -
-

icone information à cliquerVOTRE COMPTE ADHÉRENT

@@ -27,19 +24,20 @@

Identifiant : <%= identifiant %>

-

Association Suzuki : <%= association %>

+

Association Suzuki : <%= association_suzuki %>

-
-
icone information à cliquer
-

Accompagnant : <%= accompagnant_prenom %> <%= accompagnant_nom %>

-
- +
+
+
icone information à cliquer
+

Nombre de personnes pour la navette depuis Maule : <%= bus_nb %>

+
+
@@ -49,18 +47,33 @@

icone information à cliquerPERSONNE <%= locals["personne_"+toto+"_numero"] %>

Nom : <%= locals["personne_"+toto+"_nom"] %> <%= locals["personne_"+toto+"_prenom"] %>

-

Date de naissance : <%= locals["personne_"+toto+"_datenaissance"] %>

- - <% if (locals["personne_"+toto+"_instrument"]) { %> -

Instrument : <%= locals["personne_"+toto+"_instrument"] %> - <%= locals["personne_"+toto+"_cahier"] %>

+

Catégorie : <%= locals["personne_"+toto+"_role"] %>

+ <% if (locals["personne_"+toto+"_role"] === "professeur") { + if (locals["personne_"+toto+"_instrument"]) { %> +

Instrument : <%= locals["personne_"+toto+"_instrument"] %> - <%= locals["personne_"+toto+"_cahier"] %>

+ <% } %> + <% if (locals["personne_"+toto+"_repas"] === "repas") { %> +

Repas du midi : oui (8€)

+ <% } %> <% } %> + + <% if (locals["personne_"+toto+"_role"] === "instrumentiste") {%> - <% if (locals["personne_"+toto+"_piece"]) { %> -

Pièce : <%= locals["personne_"+toto+"_piece"] %>

- <% } %> + <% if (locals["personne_"+toto+"_age"]) { %> +

Age : <%= locals["personne_"+toto+"_age"] %>

+ <% } %> - <% if (locals["personne_"+toto+"_prof"]) { %> -

Professeur : <%= locals["personne_"+toto+"_prof"] %>

+ <% if (locals["personne_"+toto+"_instrument"]) { %> +

Instrument : <%= locals["personne_"+toto+"_instrument"] %> - <%= locals["personne_"+toto+"_cahier"] %>

+ <% } %> + + <% if (locals["personne_"+toto+"_piece"]) { %> +

Pièce : <%= locals["personne_"+toto+"_piece"] %>

+ <% } %> + + <% if (locals["personne_"+toto+"_prof"]) { %> +

Professeur : <%= locals["personne_"+toto+"_prof"] %>

+ <% } %> <% } %>
@@ -71,30 +84,75 @@

-
-

Tarif rassemblement : <%= cout_rassemblement %>

-

Frais bancaire : <%= accompte_frais_bancaire %>€

-

Montant total : <%= cout_total %>€

-
+ + + +
+ <% if (locals["cout_total"] > 0) { %> +
+
+

Tarif rassemblement : <%= cout_rassemblement %>€

+ <% if (locals["cout_repas"] > 0) { %> +

Coût repas professeur(s) : <%= cout_repas %>€

+ <% } %> +

Frais bancaire : <%= accompte_frais_bancaire %>€

+

Montant total : <%= cout_total %>€

+ + + <% if (locals["infoaccompagnant"] === "oui") { %> + +
+
+
+
icone information à cliquer
+

Nom de la personne acompagnatrice du, ou des élèves, durant la journée du rassemblement :

+ +
+ + +
-
-

Le mode de paiement est lacarte bancaire
En cliquant sur le bouton "PAYER" vous allez être redirigé vers le système de paiement bancaire.
Après le paiement, vous recevrez un mail de confirmation d'inscription.

- - -
- -
+
+ + +
+ +
+
+ + + +
+
+ + +
+
+ <% } %> + +
+ +
+

Le mode de paiement est lacarte bancaire
En cliquant sur le bouton "PAYER" vous allez être redirigé vers le système de paiement bancaire.
Après le paiement, vous recevrez un mail de confirmation d'inscription.

+ + + + + <% } %> + <% if (locals["cout_total"] < 1) { %> +
+ +
+ <% } %>
- -
- -
@@ -103,34 +161,6 @@
-
-

En savoir plus sur le paiement du stage

-
- - -
diff --git a/views/rassemblementidf/template_parts/rassemblementidf_titrepage.ejs b/views/rassemblementidf/template_parts/rassemblementidf_titrepage.ejs index d8f1056..8819f37 100644 --- a/views/rassemblementidf/template_parts/rassemblementidf_titrepage.ejs +++ b/views/rassemblementidf/template_parts/rassemblementidf_titrepage.ejs @@ -2,6 +2,6 @@
-

RASSEMBLEMENT IDF DU 7 MAI 2023

+

RASSEMBLEMENT IDF DU 19 AVRIL 2026

INSCRIPTION

\ No newline at end of file diff --git a/views/rassemblementra/page_templates/fermeture.ejs b/views/rassemblementra/page_templates/fermeture.ejs new file mode 100644 index 0000000..e6df4e9 --- /dev/null +++ b/views/rassemblementra/page_templates/fermeture.ejs @@ -0,0 +1,50 @@ +<%- include('../../template_parts/head')%> + + + + + + + <%- include('../../template_parts/header_tunnel')%> + + + + + +
+ +
+ + + <%- include('../template_parts/rassemblementidf_titrepage')%> + + + + + + + +
+

INSCRIPTION AU RASSEMBLEMENT TERMINÉE

+
+ + + + + +
+ +
+ + + + + + + <%- include('../../template_parts/footer')%> + + + + + + \ No newline at end of file diff --git a/views/rassemblementra/page_templates/inscrip_formulaire.ejs b/views/rassemblementra/page_templates/inscrip_formulaire.ejs new file mode 100644 index 0000000..ea898a8 --- /dev/null +++ b/views/rassemblementra/page_templates/inscrip_formulaire.ejs @@ -0,0 +1,136 @@ +<%- include('../../template_parts/head')%> + + + + + + + <%- include('../../template_parts/header_tunnel')%> + +
+ + + <%- include('../template_parts/rassemblementidf_titrepage')%> + +
+ +
+ +
+ +

icone information à cliquerVOTRE COMPTE ADHÉRENT

+ +
+
+

Identifiant : <%= identifiant %>

+
+
+
+
+ + +
+
+ +
+
+ + +
+ +
+ + +
+
+ +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+
+
+ + +
+ +
+ + +
+
+
+ + +
+ +

INSCRIPTION DES PERSONNES PRÉSENTES AU RASSEMBLEMENT

+
+

- Les élèves instrumentistes 🎈 Spécial premières années !

+

- Les professeurs

+
+
+ +
+ +
+
+ + + + +
+
+ + +
+
+ + + + + + + + +
+
+ +
+ + + + + + + <%- include('../../template_parts/footer')%> + + + + + + \ No newline at end of file diff --git a/views/rassemblementra/page_templates/inscrip_formulaire_identifier.ejs b/views/rassemblementra/page_templates/inscrip_formulaire_identifier.ejs new file mode 100644 index 0000000..9ce3b6f --- /dev/null +++ b/views/rassemblementra/page_templates/inscrip_formulaire_identifier.ejs @@ -0,0 +1,94 @@ +<%- include('../../template_parts/head')%> + + + + + + + <%- include('../../template_parts/header_tunnel')%> + + + + + +
+ +
+ + + <%- include('../template_parts/rassemblementidf_titrepage')%> + + + + <% if (locals.err_mail_form_adhesion_1) { %> +
+

<%- err_mail_form_adhesion_1 %>

+

<%- err_mail_form_adhesion_2 %>

+

<%- err_mail_form_adhesion_3 %>

+
+ <% }; %> + + + + <%- include('../../stagenat/template_parts/check_identifiant')%> + + + + + +
+ +
+

En savoir plus sur ce formulaire

+
+ + + + + +
+ + + +
+ +
+ + + + + + + <%- include('../../template_parts/footer')%> + + + + + + \ No newline at end of file diff --git a/views/rassemblementra/page_templates/paiement_annule.ejs b/views/rassemblementra/page_templates/paiement_annule.ejs new file mode 100644 index 0000000..8cc8d17 --- /dev/null +++ b/views/rassemblementra/page_templates/paiement_annule.ejs @@ -0,0 +1,49 @@ +<%- include('../../template_parts/head')%> + + + + + + + <%- include('../../template_parts/header_tunnel')%> + +
+ + + <%- include('../template_parts/rassemblementidf_titrepage')%> + + +
+ +
+ +

Echec du paiement

+ +
+
+

La paiement avec la carte bancaire a échoué.

+

Vous pouvez recommencer une nouvelle inscription.

+
+
+ +
+ +
+ +
+
+
+ + + + + <%- include('../../template_parts/footer')%> + + + + + + + \ No newline at end of file diff --git a/views/rassemblementra/page_templates/paiement_reussi.ejs b/views/rassemblementra/page_templates/paiement_reussi.ejs new file mode 100644 index 0000000..8f7a1a1 --- /dev/null +++ b/views/rassemblementra/page_templates/paiement_reussi.ejs @@ -0,0 +1,135 @@ +<%- include('../../template_parts/head')%> + + + + + + + <%- include('../../template_parts/header_tunnel')%> + +
+ + + <%- include('../template_parts/rassemblementidf_titrepage')%> + + +
+ + + +
+ +

Inscription réussie

+ +
+
+ <% if (locals.tag_ss_paiement === "oui") { %> +

Vous aller recevoir un mail de confirmation de votre inscription au Rassemblement Rhône-Alpes.

+ <% } else {%> +

La paiement par carte bancaire a réussi

+

Vous aller recevoir un mail de confirmation de votre inscription au Rassemblement Rhône-Alpes.

+ <% } %> +
+
+

+ <% if (locals.error) { %> +

<%= error %>

+ <% } %> +

+
+ +
+ +

icone information à cliquerVOTRE COMPTE ADHÉRENT

+ +
+
+

Identifiant : <%= identifiant %>

+
+
+

Association Suzuki : <%= association_suzuki %>

+
+
+ + <% if (locals.tag_ss_paiement === "oui") { %> + <% } else {%> +
+
icone information à cliquer
+

Accompagnant : <%= accompagnant_prenom %> <%= accompagnant_nom %>

+
+ <% } %> + + +
+ +
+ + <% for (let toto = 0; toto < 4; toto++) { %> + <% if (locals["personne_"+toto+"_nom"]) { %> +
+

icone information à cliquerPERSONNE <%= locals["personne_"+toto+"_numero"] + 1 %>

+
+

Nom : <%= locals["personne_"+toto+"_nom"] %> <%= locals["personne_"+toto+"_prenom"] %>

+

Catégorie : <%= locals["personne_"+toto+"_role"] %>

+ + <% if (locals.tag_ss_paiement === "oui") { %> + <% if (locals["personne_"+toto+"_role"] === "professeur") { + if (locals["personne_"+toto+"_instrument"]) { %> +

Instrument : <%= locals["personne_"+toto+"_instrument"] %> - <%= locals["personne_"+toto+"_cahier"] %>

+ <% } %> + <% } %> + <% } else {%> + <% if (locals["personne_"+toto+"_role"] === "professeur") { + if (locals["personne_"+toto+"_instrument"]) { %> +

Instrument : <%= locals["personne_"+toto+"_instrument"] %> - <%= locals["personne_"+toto+"_cahier"] %>

+ <% } %> + <% } %> + <% if (locals["personne_"+toto+"_role"] === "instrumentiste") { + if (locals["personne_"+toto+"_instrument"]) { %> +

Instrument : <%= locals["personne_"+toto+"_instrument"] %> - <%= locals["personne_"+toto+"_cahier"] %>

+ <% } %> + + <% if (locals["personne_"+toto+"_piece"]) { %> +

Pièce : <%= locals["personne_"+toto+"_piece"] %>

+ <% } %> + + <% if (locals["personne_"+toto+"_prof"]) { %> +

Professeur : <%= locals["personne_"+toto+"_prof"] %>

+ <% } %> + <% } %> + <% } %> +
+
+ <% } %> + <% } %> + +
+ <% if (locals.tag_ss_paiement === "oui") { %> + <% } else {%> +
+
+

Tarif rassemblement : <%= tarif_rassemblement %>

+

Montant total : <%= tarif_rassemblement %>€

+
+
+ <% } %> + + + +
+ +
+ + + + + + + <%- include('../../template_parts/footer')%> + + + + + + + \ No newline at end of file diff --git a/views/rassemblementra/page_templates/panne.ejs b/views/rassemblementra/page_templates/panne.ejs new file mode 100644 index 0000000..4ae4c2a --- /dev/null +++ b/views/rassemblementra/page_templates/panne.ejs @@ -0,0 +1,94 @@ +<%- include('../../template_parts/head')%> + + + + + + + <%- include('../../template_parts/header_tunnel')%> + + + + + +
+ +
+ + + <%- include('../template_parts/rassemblementidf_titrepage')%> + + + + <% if (locals.err_mail_form_adhesion_1) { %> +
+

<%- err_mail_form_adhesion_1 %>

+

<%- err_mail_form_adhesion_2 %>

+

<%- err_mail_form_adhesion_3 %>

+
+ <% }; %> + + + +

Nous vous prions de nous excuser. Le formulaire d'inscription pour le Rassemblement est temporairement indisponible et sera rétabli dans quelques heures.

+ + + + + +
+ +
+

En savoir plus sur ce formulaire

+
+ + + + + +
+ + + +
+ +
+ + + + + + + <%- include('../../template_parts/footer')%> + + + + + + \ No newline at end of file diff --git a/views/rassemblementra/page_templates/recap.ejs b/views/rassemblementra/page_templates/recap.ejs new file mode 100644 index 0000000..98a891b --- /dev/null +++ b/views/rassemblementra/page_templates/recap.ejs @@ -0,0 +1,177 @@ +<%- include('../../template_parts/head')%> + + + + + + + <%- include('../../template_parts/header_tunnel')%> + +
+ + + <%- include('../template_parts/rassemblementidf_titrepage')%> + + +
+ +
+ +

icone information à cliquerVOTRE COMPTE ADHÉRENT

+ +
+
+

Identifiant : <%= identifiant %>

+
+
+

Association Suzuki : <%= association_suzuki %>

+
+
+ + + +
+ +
+ + <% for (let toto = 1; toto < 5; toto++) { %> + <% if (locals["personne_"+toto+"_nom"]) { %> +
+

icone information à cliquerPERSONNE <%= locals["personne_"+toto+"_numero"] %>

+
+

Nom : <%= locals["personne_"+toto+"_nom"] %> <%= locals["personne_"+toto+"_prenom"] %>

+

Catégorie : <%= locals["personne_"+toto+"_role"] %>

+ <% if (locals["personne_"+toto+"_role"] === "professeur") { + if (locals["personne_"+toto+"_instrument"]) { %> +

Instrument : <%= locals["personne_"+toto+"_instrument"] %>

+ <% } %> + <% if (locals["personne_"+toto+"_repas"] === "repas") { %> +

Repas du midi : oui (8€)

+ <% } %> + <% } %> + + <% if (locals["personne_"+toto+"_role"] === "instrumentiste") {%> + + <% if (locals["personne_"+toto+"_age"]) { %> +

Âge au jour du rassemblement : <%= locals["personne_"+toto+"_age"] %>

+ <% } %> + + <% if (locals["personne_"+toto+"_instrument"]) { %> +

Instrument : <%= locals["personne_"+toto+"_instrument"] %> - <%= locals["personne_"+toto+"_cahier"] %>

+ <% } %> + + <% if (locals["personne_"+toto+"_piece"]) { %> +

Pièce : <%= locals["personne_"+toto+"_piece"] %>

+ <% } %> + + <% if (locals["personne_"+toto+"_prof"]) { %> +

Professeur : <%= locals["personne_"+toto+"_prof"] %>

+ <% } %> + <% } %> + +
+
+ <% } %> + + <% } %> + +
+
+ + + +
+ <% if (locals["cout_total"] > 0) { %> +
+
+

Tarif rassemblement : <%= cout_rassemblement %>€

+ <% if (locals["cout_repas"] > 0) { %> +

Coût repas professeur(s) : <%= cout_repas %>€

+ <% } %> +

Montant total : <%= cout_total %>€

+ + + <% if (locals["infoaccompagnant"] === "oui") { %> + +
+
+
+
icone information à cliquer
+

Nom de la personne acompagnatrice du, ou des élèves, durant la journée du rassemblement :

+ +
+ + +
+ +
+ + +
+ +
+
+ + + +
+
+ + +
+
+ <% } %> + +
+ +
+

Le mode de paiement est lacarte bancaire
En cliquant sur le bouton "PAYER" vous allez être redirigé vers le système de paiement bancaire.
Après le paiement, vous recevrez un mail de confirmation d'inscription.

+ +
+ +
+ <% } %> + <% if (locals["cout_total"] < 1) { %> +
+ +
+ <% } %> +
+ +
+
+ + + + + +
+ + + +
+ +
+ +
+ + + + + + + <%- include('../../template_parts/footer')%> + + + + + + + + \ No newline at end of file diff --git a/views/rassemblementra/template_parts/rassemblementidf_titrepage.ejs b/views/rassemblementra/template_parts/rassemblementidf_titrepage.ejs new file mode 100644 index 0000000..108b6eb --- /dev/null +++ b/views/rassemblementra/template_parts/rassemblementidf_titrepage.ejs @@ -0,0 +1,7 @@ + + + +
+

RASSEMBLEMENT RHÔNE-ALPES DU 29 MARS 2026

+

INSCRIPTION

+
\ No newline at end of file diff --git a/views/stagenat/page_templates/inscrip_formulaire.ejs b/views/stagenat/page_templates/inscrip_formulaire.ejs index 47f2503..5b79457 100644 --- a/views/stagenat/page_templates/inscrip_formulaire.ejs +++ b/views/stagenat/page_templates/inscrip_formulaire.ejs @@ -13,9 +13,12 @@ <%- include('../template_parts/stagenational_titrepage')%> - <% if (err_mineur) { %> + <% if (locals.err_mineur) { %>
ERREUR :

<%= err_mineur %>

<% } %> + <% if (locals.err_campado_capa) { %> +
ERREUR :

<%= err_campado_capa %>

+ <% } %>
@@ -32,11 +35,13 @@
- - + +
+

Informations sur l'adhérent à l'association Suzuki, française, ou d'un autre pays :

+
@@ -77,13 +82,8 @@
- - -
- -
- - + +
@@ -100,19 +100,21 @@

- Tous les élèves instrumentistes

- Toutes les personnes qui ont une activité au sein du stage

-

- Toutes les personnes qui n'ont pas d'activité et qui logent au centre Les Flocons Verts.

+

- Toutes les personnes qui logent au centre Les Flocons Verts.

- +
icone information à cliquer
+
- +
@@ -128,16 +130,12 @@ icone information à cliquer

INFORMATIONS SUR L'HEBERGEMENT


-

Les flocons verts - 123 route des servages - 74300 Carroz d’Arâches.

+

Les Flocons Verts - 123 route des servages - 74300 Carroz d’Arâches.


-

L'hébergement, est prévu en pension complète : 5 nuits avec repas (dimanche soir 20 août, au petit déjeuner du 25 août), hors goûter.

-

Il sera possible de commander sur place un pique-nique pour le repas du vendredi midi.

+

L'hébergement, est prévu en pension complète : 6 nuits avec repas (dimanche soir 18 août, au petit déjeuner du 28 août), hors goûter.


-

Le centre "Les Flocons Verts” offre d’agréables chambres et duplex de 3 à 8 personnes, équipés de sanitaires. Deux familles seront regroupées dans un même duplex. Elles logeront chacune à un étage différent, et auront des sanitaires séparés.

+

Le centre "Les Flocons Verts” offre d’agréables chambres et duplex de 3 à 8 personnes, équipés de sanitaires.


-

Les quelques logements non partagés seront attribués en priorité aux personnes handicapées, et aux familles avec un enfant de moins de 3 ans dans la limite des places disponibles.

-
-

Il est bien sûr possible de partager un duplex avec une famille de son choix. Veuillez l’indiquer lors de l’inscription. Une zone de saisie sous la forme d'un commentaire est disponible à la fin du formulaire d'inscription.


Draps, couettes, oreillers et linge de toilette sont fournis par les Flocons verts.


diff --git a/views/stagenat/page_templates/inscrip_formulaire_identifier.ejs b/views/stagenat/page_templates/inscrip_formulaire_identifier.ejs index 3886151..5d07769 100644 --- a/views/stagenat/page_templates/inscrip_formulaire_identifier.ejs +++ b/views/stagenat/page_templates/inscrip_formulaire_identifier.ejs @@ -46,58 +46,52 @@ diff --git a/views/stagenat/page_templates/inscription_reussi.ejs b/views/stagenat/page_templates/inscription_reussi.ejs index 0108aff..6ee5368 100644 --- a/views/stagenat/page_templates/inscription_reussi.ejs +++ b/views/stagenat/page_templates/inscription_reussi.ejs @@ -23,7 +23,7 @@
-

Vous aller recevoir un mail de confirmation d'inscription au stage.

+

Vous allez recevoir un mail de confirmation d'inscription au stage avec votre facture.



@@ -43,7 +43,7 @@

Identifiant : <%= identifiant %>

-

Association Suzuki : <%= association %>

+

Association Suzuki : <%= association_suzuki %>

@@ -68,7 +68,7 @@

Âge : <%= locals["personne_"+toto+"_profilage"] %>

Transport : <%= locals["personne_"+toto+"_transport_mode"] %> <%= locals["personne_"+toto+"_transport_arret"] %>

-

Activité : <%= locals["personne_"+toto+"_categorie"] %>

+

Activité : <%= locals["personne_"+toto+"_role"] %>

Profil : <%= locals["personne_"+toto+"_profil"] %>

@@ -97,9 +97,6 @@ <% if (locals["personne_"+toto+"_cout_hebergement"]) { %>

Hébergement : <%= locals["personne_"+toto+"_cout_hebergement"] %>€

<% } %> - <% if (locals["personne_"+toto+"_campado_cout"]) { %> -

Camp ado : <%= locals["personne_"+toto+"_campado_cout"] %>€

- <% } %> <% if (locals["personne_"+toto+"_cout_transport"]) { %>

Transport : <%= locals["personne_"+toto+"_cout_transport"] %>€

<% } %> diff --git a/views/stagenat/page_templates/paiement_annule.ejs b/views/stagenat/page_templates/paiement_annule.ejs index 6b9ba4b..4f8edfe 100644 --- a/views/stagenat/page_templates/paiement_annule.ejs +++ b/views/stagenat/page_templates/paiement_annule.ejs @@ -23,8 +23,14 @@
-

La paiement de l'accompte avec la carte bancaire a échoué

-

Veuillez contacter l'association Française pour la pédagogie Suzuki pour payer par un autre moyen

+

Identifiant : <%= identifiant %>

+
+
+ +
+
+

La paiement de l'acompte avec la carte bancaire a échoué.

+

Vous pouvez recommencer une nouvelle inscription.

diff --git a/views/stagenat/page_templates/paiement_reussi.ejs b/views/stagenat/page_templates/paiement_reussi.ejs index 1ad46e2..92998b7 100644 --- a/views/stagenat/page_templates/paiement_reussi.ejs +++ b/views/stagenat/page_templates/paiement_reussi.ejs @@ -19,11 +19,19 @@
-

Paiement réussi

+ + <% if (locals["montant_accompte"] > 100) { %> +

Paiement et inscription réussis

+ <% } %> + <% if (locals["montant_accompte"] < 100) { %> +

Inscription réussie

+ <% } %>
-

La paiement de l'accompte avec la carte bancaire a réussi

+ <% if (locals["montant_accompte"] > 100) { %> +

La paiement de l'acompte avec la carte bancaire a réussi.

+ <% } %>

Vous aller recevoir un mail de confirmation d'inscription au stage.

@@ -44,7 +52,7 @@

Identifiant : <%= identifiant %>

-

Association Suzuki : <%= association %>

+

Association Suzuki : <%= association_suzuki %>

@@ -60,57 +68,102 @@
- <% for (let toto = 1; toto < 7; toto++) { %> + <% for (let toto = 0; toto < 7; toto++) { %> <% if (locals["personne_"+toto+"_nom"]) { %>
-

icone information à cliquerPERSONNE <%= locals["personne_"+toto+"_numero"] %>

+

icone information à cliquerPARTICIPANT <%= locals["personne_"+toto+"_numero"] %>

Nom : <%= locals["personne_"+toto+"_nom"] %> <%= locals["personne_"+toto+"_prenom"] %>

+ <% if (locals[`personne_${toto}_prise_charge_nom`]) { %> +

Prise en charge par une autre famille : <%= locals[`personne_${toto}_prise_charge_nom`] %>

+ <% } %>

Âge : <%= locals["personne_"+toto+"_profilage"] %>

-

Transport : <%= locals["personne_"+toto+"_transport_mode"] %> <%= locals["personne_"+toto+"_transport_arret"] %>

+

Transport : <%= locals["personne_"+toto+"_transport_mode"] %> - <%= locals["personne_"+toto+"_transport_arret"] %>

-

Activité : <%= locals["personne_"+toto+"_categorie"] %>

+

Activité : <%= locals["personne_"+toto+"_role"] %>

-

Profil : <%= locals["personne_"+toto+"_profil"] %>

+ <% if (locals["personne_"+toto+"_profil"] === "professeur" || locals["personne_"+toto+"_profil"] === "accompagnant" || locals["personne_"+toto+"_profil"] === "Camp ado") { %> +

Profil : <%= locals["personne_"+toto+"_profil"] %>

+ <% } %> - <% if (locals["personne_"+toto+"_instrument"]) { %> + <% if (locals["personne_"+toto+"_instrument"] !== "undefined") { %>

Instrument : <%= locals["personne_"+toto+"_instrument"] %> - <%= locals["personne_"+toto+"_cahier"] %>

<% } %> - - <% if (locals["personne_"+toto+"_option_concertsolo"]) { %> -

Option Concert Solo: <%= locals["personne_"+toto+"_option_concertsolo"] %>

+ <% if (locals[`personne_${toto}_instrument_ensemble`]) { %> +

Instrument option "Atelier musique d'ensemble" : <%= locals[`personne_${toto}_instrument_ensemble`] %>

+ <% } %> + <% if (locals[`personne_${toto}_instrument_collectif`]) { %> +

Instrument option "Cours collectif" : <%= locals[`personne_${toto}_instrument_collectif`] %>

<% } %> - <% if (locals["personne_"+toto+"_option_coursindividuel"]) { %> -

Option Cours individuel: <%= locals["personne_"+toto+"_option_coursindividuel"] %>

+ <% if (locals["personne_"+toto+"_option_concertsolo_piece"] !== "undefined") { %> +

Option Concert Solo : <%= locals["personne_"+toto+"_option_concertsolo_piece"] %> - <%= locals["personne_"+toto+"_option_concertsolo_cahier"] %>

<% } %> - <% if (locals["personne_"+toto+"_activite_1"]) { %> -

Activité 1 : <%= locals["personne_"+toto+"_activite_1"] %>

+ <% if (locals["personne_"+toto+"_option_coursindividuel"] === "cours individuel") { %> +

Option Cours individuel : oui

<% } %> - - <% if (locals["personne_"+toto+"_activite_2"]) { %> -

Activité 2 : <%= locals["personne_"+toto+"_activite_2"] %>

+ <% if (locals["personne_"+toto+"_option_decouvrealto"] === "decouvertealto") { %> +

Option découverte de l'alto : oui

+ <% } %> + <% if (locals["personne_"+toto+"_choral"] === "chant choral") { %> +

Option chant choral : oui

+ <% } %> + <% if (locals["personne_"+toto+"_dalcroze"] === "rythmique Dalcroze") { %> +

Option rythmique Dalcroze : oui

+ <% } %> + <% if (locals["personne_"+toto+"_eveil"] === "éveil musical") { %> +

Option éveil musical : oui

<% } %>
- <% if (locals["personne_"+toto+"_cout_hebergement"]) { %> + <% if (hebergement == "Centre les Flocons Verts - hébergement partagé") { %>

Hébergement : <%= locals["personne_"+toto+"_cout_hebergement"] %>€

<% } %> - <% if (locals["personne_"+toto+"_campado_cout"]) { %> -

Camp ado : <%= locals["personne_"+toto+"_campado_cout"] %>€

- <% } %> <% if (locals["personne_"+toto+"_cout_transport"]) { %>

Transport : <%= locals["personne_"+toto+"_cout_transport"] %>€

<% } %> <% if (locals["personne_"+toto+"_cours_cout"]) { %>

Cours intrument : <%= locals["personne_"+toto+"_cours_cout"] %>€

<% } %> - <% if (locals["personne_"+toto+"_activite_cout"]) { %> -

Activités : <%= locals["personne_"+toto+"_activite_cout"] %>€

+ <% if (locals["personne_"+toto+"_coursindividuel_cout"]) { %> +

Option cours particulier : <%= locals["personne_"+toto+"_coursindividuel_cout"] %>€

<% } %> - <% if (locals["personne_"+toto+"_observation_cout"]) { %> + <% if (locals["personne_"+toto+"_option_decouvrealto_cout"]) { %> +

Option découverte de l'alto : <%= locals["personne_"+toto+"_option_decouvrealto_cout"] %>€

+ <% } %> + <% if (locals["personne_"+toto+"_eveil_cout"]) { %> +

Option éveil musical : <%= locals["personne_"+toto+"_eveil_cout"] %>€

+ <% } %> + + <% if (locals["personne_"+toto+"_collectif"] == "Cours collectif Suzuki") { %> +

Option Cours collectif Suzuki : <%= locals["personne_"+toto+"_collectif_cout"] %>€

+ <% } %> + <% if (locals["personne_"+toto+"_ensemble"] == "Atelier musique d'ensemble") { %> +

Option Cours Atelier musique d'ensemble : <%= locals["personne_"+toto+"_ensemble_cout"] %>€

+ <% } %> + + <% if (locals["personne_"+toto+"_particulier"] == "Cours particulier") { %> +

Option Cours Cours particuliers: <%= locals["personne_"+toto+"_particulier_cout"] %>€

+ <% } %> + + <% if (locals["personne_"+toto+"_choral"] === "chant choral") { + if (locals["personne_"+toto+"_chant_cout"] > 0) {%> +

Option Chant choral : <%= locals["personne_"+toto+"_chant_cout"] %>€

+ <% } else { %> +

Option Chant choral : offert !

+ <% } %> + <% } %> + <% if (locals["personne_"+toto+"_dalcroze"] === "rythmique Dalcroze") { + if (locals["personne_"+toto+"_dalcroze_cout"] > 0) {%> +

Option Rythmique Dalcroze : <%= locals["personne_"+toto+"_dalcroze_cout"] %>€

+ <% } else { %> +

Option Rythmique Dalcroze à payer sur place (non inclus dans le total général) : 75€

+ <% } %> + <% } %> + + <% if (locals["personne_"+toto+"_observation_cout"] > 0) { %>

Observation : <%= locals["personne_"+toto+"_observation_cout"] %>€

<% } %>
@@ -122,13 +175,22 @@

-

Remise : <%= remise %>

-

Frais de dossier : 30€

+ <% if (locals["remise"] > 0) { %> +

Remise famille nombreuse : <%= remise %>

+ <% } %> + <% if (locals["hebergement"] == "Centre les Flocons Verts - hébergement non partagé") { %> +

Coût total hébergement avec supplément hébergement non partagé : <%= cout_total_hebergement %>

+ <% } %> +

Frais de dossier : <%= frais_dossier %>€

Frais bancaire de l'acompte : <%= accompte_frais_bancaire %>€

Montant total : <%= cout_total %>€


-

Montant acompte versé : <%= montant_accompte %>€

-
+

Montant acompte payé à l'inscription : <%= montant_accompte %>€

+
+ <% if (locals["cout_total_dalcroze_surplace"]) { %> +

Coût activité Dalcroze adulte à payer sur place : <%= cout_total_dalcroze_surplace %>€

+ <% } %> +
diff --git a/views/stagenat/page_templates/recap.ejs b/views/stagenat/page_templates/recap.ejs index ffdf618..2f56d45 100644 --- a/views/stagenat/page_templates/recap.ejs +++ b/views/stagenat/page_templates/recap.ejs @@ -27,7 +27,7 @@

Identifiant : <%= identifiant %>

-

Association Suzuki : <%= association %>

+

Association Suzuki : <%= association_suzuki %>

@@ -44,105 +44,173 @@
<% for (let toto = 1; toto < 7; toto++) { %> - <% if (locals["personne_"+toto+"_nom"]) { %> + <% if (locals[`personne_${toto}_nom`]) { %>
-

icone information à cliquerPERSONNE <%= locals["personne_"+toto+"_numero"] %>

+

+ icone information à cliquer + PARTICIPANT <%= locals[`personne_${toto}_numero`] %> +

-

Nom : <%= locals["personne_"+toto+"_nom"] %> <%= locals["personne_"+toto+"_prenom"] %>

-

Âge : <%= locals["personne_"+toto+"_profilage"] %>

-

Transport : <%= locals["personne_"+toto+"_transport_mode"] %> <%= locals["personne_"+toto+"_transport_arret"] %>

+

Nom : <%= locals[`personne_${toto}_nom`] %> <%= locals[`personne_${toto}_prenom`] %>

+ <% if (locals[`personne_${toto}_prise_charge_nom`]) { %> +

Prise en charge par une autre famille : <%= locals[`personne_${toto}_prise_charge_nom`] %>

+ <% } %> -

Activité : <%= locals["personne_"+toto+"_categorie"] %>

+

Âge : <%= locals[`personne_${toto}_profilage`] %>

+

Transport : <%= locals[`personne_${toto}_transport_mode`] %> - <%= locals[`personne_${toto}_transport_arret`] %>

-

Profil : <%= locals["personne_"+toto+"_profil"] %>

+

Activité : <%= locals[`personne_${toto}_role`] %>

- - <% if (locals["personne_"+toto+"_instrument"]) { %> -

Instrument : <%= locals["personne_"+toto+"_instrument"] %> - <%= locals["personne_"+toto+"_cahier"] %>

+ <% if (locals[`personne_${toto}_profil`]) { %> +

Profil : <%= locals[`personne_${toto}_profil`] %>

+ <% } %> + + <% if (locals[`personne_${toto}_instrument`]) { %> +

Instrument : <%= locals[`personne_${toto}_instrument`] %> - <%= locals[`personne_${toto}_cahier`] %>

+ <% } %> + + <% if (locals[`personne_${toto}_instrument_ensemble`]) { %> +

Instrument option "Atelier musique d'ensemble" : <%= locals[`personne_${toto}_instrument_ensemble`] %>

+ <% } %> + <% if (locals[`personne_${toto}_instrument_collectif`]) { %> +

Instrument option "Cour collectif" : <%= locals[`personne_${toto}_instrument_collectif`] %>

+ <% } %> + + <% if (locals[`personne_${toto}_option_concertsolo_cahier`]) { %> +

Concert Solo : <%= locals[`personne_${toto}_option_concertsolo_piece`] %> - <%= locals[`personne_${toto}_option_concertsolo_cahier`] %>

+ <% } %> + + <% if (locals[`personne_${toto}_option_decouvrealto`] === "decouvertealto") { %> +

Option découverte de l'alto : oui

<% } %> - <% if (locals["personne_"+toto+"_option_concertsolo"]) { %> -

Option Concert Solo : <%= locals["personne_"+toto+"_option_concertsolo"] %>

- <% } %> - <% if (locals["personne_"+toto+"_option_coursindividuel"]) { %> -

Option Cours individuel + : <%= locals["personne_"+toto+"_option_coursindividuel"] %>

- <% } %> - - <% if (locals["personne_"+toto+"_activite_1"]) { %> -

Activité 1 : <%= locals["personne_"+toto+"_activite_1"] %>

- <% } %> - - <% if (locals["personne_"+toto+"_activite_2"]) { %> -

Activité 2 : <%= locals["personne_"+toto+"_activite_2"] %>

- <% } %>
- <% if (locals["personne_"+toto+"_cout_hebergement"]) { %> -

Hébergement : <%= locals["personne_"+toto+"_cout_hebergement"] %>€

+ <% if (locals[`personne_${toto}_cout_hebergement`]) { %> +

Hébergement : <%= locals[`personne_${toto}_cout_hebergement`] %>€

<% } %> - <% if (locals["personne_"+toto+"_campado_cout"]) { %> -

Camp ado : <%= locals["personne_"+toto+"_campado_cout"] %>€

+ + <% if (locals[`personne_${toto}_cout_transport`]) { %> +

Transport : <%= locals[`personne_${toto}_cout_transport`] %>€

<% } %> - <% if (locals["personne_"+toto+"_cout_transport"]) { %> -

Transport : <%= locals["personne_"+toto+"_cout_transport"] %>€

+ + <% if (locals[`personne_${toto}_cours_cout`]) { %> +

Cours instrument : <%= locals[`personne_${toto}_cours_cout`] %>€

<% } %> - <% if (locals["personne_"+toto+"_cours_cout"]) { %> -

Cours intrument : <%= locals["personne_"+toto+"_cours_cout"] %>€

+ + <% if (locals[`personne_${toto}_coursindividuel_cout`]) { %> +

Option cours particuliers : <%= locals[`personne_${toto}_coursindividuel_cout`] %>€

<% } %> - <% if (locals["personne_"+toto+"_activite_cout"]) { %> -

Activités : <%= locals["personne_"+toto+"_activite_cout"] %>€

+ + <% if (locals[`personne_${toto}_option_decouvrealto_cout`]) { %> +

Option découverte de l'alto : <%= locals[`personne_${toto}_option_decouvrealto_cout`] %>€

<% } %> - <% if (locals["personne_"+toto+"_observation_cout"]) { %> -

Observation : <%= locals["personne_"+toto+"_observation_cout"] %>€

+ + <% if (locals[`personne_${toto}_eveil_cout`]) { %> +

Option éveil musical : <%= locals[`personne_${toto}_eveil_cout`] %>€

+ <% } %> + + <% if (locals[`personne_${toto}_dalcroze_cout`]) { %> +

Option Rythmique Dalcroze : <%= locals[`personne_${toto}_dalcroze_cout`] %>€

+ <% } %> + + <% if (locals[`personne_${toto}_collectif_cout`]) { %> +

Option Cours collectif Suzuki : <%= locals[`personne_${toto}_collectif_cout`] %>€

+ <% } %> + + <% if (locals[`personne_${toto}_ensemble_cout`]) { %> +

Option Atelier musique d'ensemble : <%= locals[`personne_${toto}_ensemble_cout`] %>€

+ <% } %> + + <% if (locals[`personne_${toto}_particulier_cout`]) { %> +

Option Cours particulier : <%= locals[`personne_${toto}_particulier_cout`] %>€

+ <% } %> + + <% if (locals[`personne_${toto}_chant_cout`] == "offert") { %> +

Option Chant choral : offert

+ <% } %> + + <% if (locals[`personne_${toto}_chant_cout`] > 0) { %> +

Option Chant choral : <%= locals[`personne_${toto}_chant_cout`] %>€

+ <% } %> + + <% if (locals[`personne_${toto}_observation_cout`]) { %> +

Observation : <%= locals[`personne_${toto}_observation_cout`] %>€

<% } %>
<% } %> - <% } %> -
+
+

Remise : <%= remise %>

-

Frais de dossier : 30€

-

Frais bancaire de l'acompte : <%= accompte_frais_bancaire %>€

+ <% if (locals["cout_supplement_hebergement"] > 0) { %> +

Supplément pour hébergement non partagé : <%= cout_supplement_hebergement %>€

+ <% } %> +

Frais de dossier : <%= frais_dossier %>€

+ + <% if (locals["accompte_frais_bancaire"] > 0) { %> +

Frais bancaire de l'acompte : <%= accompte_frais_bancaire %>€

+ <% } %>

Montant total : <%= cout_total %>€


-

Montant acompte à payer à l'inscription : <%= montant_accompte %>€

-
- <% if (locals["cout_total_dalcroze_surplace"]) { %> -

Coût activité Dalcroze adulte à payer sur place : <%= cout_total_dalcroze_surplace %>€

- <% } %> - <% if (locals["cout_total_percussion_surplace"]) { %> -

Coût activité percussions adulte à payer sur place : <%= cout_total_percussion_surplace %>€

+ <% if (locals["montant_accompte"] > 100) { %> +

Montant acompte à payer à l'inscription : <%= montant_accompte %>€

<% } %>
-

Le mode de paiement de l'acompte est la carte bancaire
En cliquant sur le bouton "PAYER ACOMPTE" vous allez être redirigé vers le système de paiement bancaire.
Après le paiement, vous recevrez un mail de confirmation d'inscription.

- - + <% if (locals["montant_accompte"] > 100) { %> +

Le mode de paiement de l'acompte est la carte bancaire
En cliquant sur le bouton "PAYER ACOMPTE" vous allez être redirigé vers le système de paiement bancaire.
Après le paiement, attendre la page de confirmation et vous recevrez un mail de confirmation d'inscription.

+ <% } %> +
+
+ +
+ <% if (locals["montant_accompte"] > 100) { %> +
+
+
+
+ + +
+
+ + +
+
+ +
+ <% } %> + + <% if (locals["montant_accompte"] < 100) { %> +
+ +
+ <% } %> +
- -
- -
-
+

En savoir plus sur le paiement du stage

@@ -150,25 +218,25 @@ @@ -190,7 +258,5 @@ - - \ No newline at end of file diff --git a/views/stagenat/page_templates/recapssacompte.ejs b/views/stagenat/page_templates/recapssacompte.ejs index b1292c2..771ebf0 100644 --- a/views/stagenat/page_templates/recapssacompte.ejs +++ b/views/stagenat/page_templates/recapssacompte.ejs @@ -27,7 +27,7 @@

Identifiant : <%= identifiant %>

-

Association Suzuki : <%= association %>

+

Association Suzuki : <%= association_suzuki %>

@@ -61,6 +61,13 @@

Instrument : <%= locals["personne_"+toto+"_instrument"] %> - <%= locals["personne_"+toto+"_cahier"] %>

<% } %> + <% if (locals["personne_"+toto+"_instrument_ensemble"]) { %> +

Instrument option "Atelier musique d'ensemble" : <%= locals["personne_"+toto+"_instrument_ensemble"] %>

+ <% } %> + <% if (locals["personne_"+toto+"_instrument_collectif"]) { %> +

Instrument option "Cours collectif" : <%= locals["personne_"+toto+"_instrument_collectif"] %>

+ <% } %> + <% if (locals["personne_"+toto+"_option_concertsolo"]) { %>

Option Concert Solo : <%= locals["personne_"+toto+"_option_concertsolo"] %>

<% } %> @@ -106,11 +113,13 @@

Remise : <%= remise %>

-

Frais de dossier : 30€

+

Frais de dossier : <%= frais_dossier %>€

Frais bancaire de l'acompte : <%= accompte_frais_bancaire %>€

Montant total : <%= cout_total %>€


-

Montant acompte à payer à l'inscription : <%= montant_accompte %>€

+ <% if (locals["montant_accompte"] > 0) { %> +

Montant acompte à payer à l'inscription : <%= montant_accompte %>€

+ <% } %>
<% if (locals["cout_total_dalcroze_surplace"]) { %>

Coût activité Dalcroze adulte à payer sur place : <%= cout_total_dalcroze_surplace %>€

@@ -125,17 +134,17 @@
-
- -
-
+ +
+ +
@@ -159,7 +168,7 @@

modes de paiement :


    -
  1. Par virement bancaire en 1 à 3 fois (juin, juillet, août au plus tard)
  2. +
  3. Par virement bancaire, en une fois uniquement
  4. En 1 à 3 chèques à l’ordre de l’AFPS (encaissement au plus tard: juin,juillet, août)
  5. En chèques vacances ANCV : à l’ordre de Ternélia, les flocons verts
diff --git a/views/stagenat/template_parts/check_identifiant.ejs b/views/stagenat/template_parts/check_identifiant.ejs index 36d12a5..447ff8f 100644 --- a/views/stagenat/template_parts/check_identifiant.ejs +++ b/views/stagenat/template_parts/check_identifiant.ejs @@ -6,7 +6,7 @@
- +
@@ -15,8 +15,6 @@
- -
@@ -24,12 +22,11 @@
- icone information à cliquer + icone information à cliquer -

AUTRE PAYS

+

AUTRE PAYS


-

Si vous n'avez pas d'identifiant :

-

saisissez votre mail.

+

Si vous n'avez pas d'identifiant : saisissez votre mail.


@@ -37,6 +34,15 @@
+ + <% if (locals.datelimitedepass === "oui") { %> +
+ + +
+ <% }; %> + +
icone information à cliquer diff --git a/views/stagenat/template_parts/stagenational_titrepage.ejs b/views/stagenat/template_parts/stagenational_titrepage.ejs index 2896816..ad833dc 100644 --- a/views/stagenat/template_parts/stagenational_titrepage.ejs +++ b/views/stagenat/template_parts/stagenational_titrepage.ejs @@ -2,6 +2,6 @@
-

STAGE NATIONAL DU 20 AU 25 AOÛT 2023

+

STAGE NATIONAL DU 23 AU 28 AOÛT 2026

INSCRIPTION

\ No newline at end of file diff --git a/views/template_parts/footer.ejs b/views/template_parts/footer.ejs index 0338113..b8746b7 100644 --- a/views/template_parts/footer.ejs +++ b/views/template_parts/footer.ejs @@ -1,7 +1,7 @@